diff --git a/love/src/jni/Android.mk b/love/src/jni/Android.mk index 487f48d2..8b649b22 100644 --- a/love/src/jni/Android.mk +++ b/love/src/jni/Android.mk @@ -1,2 +1,3 @@ NDK_R17 := $(shell python $(call my-dir)/detect_ndkrel.py $(NDK_ROOT)/source.properties 17) +ANDROID_21_OR_LATER := $(shell python $(call my-dir)/detect_androidapi.py $(NDK_ROOT)/source.properties 17) include $(call all-subdir-makefiles) diff --git a/love/src/jni/detect_androidapi.py b/love/src/jni/detect_androidapi.py new file mode 100644 index 00000000..dfd18cfb --- /dev/null +++ b/love/src/jni/detect_androidapi.py @@ -0,0 +1,17 @@ +import sys +import re + +def main(argv): + if len(argv) > 1: + # argv[0] = android-%d + # argv[1] = %d + matches = re.findall("android-(\d+)", argv[0]) + if len(matches) >= 1 and int(matches[0]) >= int(argv[1]): + print("yes") + else: + print("no") + else: + print("unknown") + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/love/src/jni/love/Android.mk b/love/src/jni/love/Android.mk index 9424e86f..13422620 100644 --- a/love/src/jni/love/Android.mk +++ b/love/src/jni/love/Android.mk @@ -31,8 +31,7 @@ LOCAL_C_INCLUDES := \ ${LOCAL_PATH}/../libmng-1.0.10/ \ ${LOCAL_PATH}/../lcms2-2.5/include \ ${LOCAL_PATH}/../tiff-3.9.5/libtiff \ - ${LOCAL_PATH}/../openal-soft-1.18.2/include \ - ${LOCAL_PATH}/../openal-soft-1.18.2/OpenAL32/Include \ + ${LOCAL_PATH}/../openal-soft-1.19.1/include \ ${LOCAL_PATH}/../freetype2-android/include \ ${LOCAL_PATH}/../freetype2-android/src \ ${LOCAL_PATH}/../mpg123-1.17.0/src/libmpg123 \ diff --git a/love/src/jni/openal-soft-1.18.2/.gitignore b/love/src/jni/openal-soft-1.18.2/.gitignore deleted file mode 100644 index 9aa081c6..00000000 --- a/love/src/jni/openal-soft-1.18.2/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -build -winbuild -win64build -include/SLES -include/sndio.h -include/sys -openal-soft.kdev4 diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/sndio.c b/love/src/jni/openal-soft-1.18.2/Alc/backends/sndio.c deleted file mode 100644 index 47e05353..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/sndio.c +++ /dev/null @@ -1,346 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "threads.h" - -#include "backends/base.h" - -#include - - - - -typedef struct ALCsndioBackend { - DERIVE_FROM_TYPE(ALCbackend); - - struct sio_hdl *sndHandle; - - ALvoid *mix_data; - ALsizei data_size; - - volatile int killNow; - althrd_t thread; -} ALCsndioBackend; - -static int ALCsndioBackend_mixerProc(void *ptr); - -static void ALCsndioBackend_Construct(ALCsndioBackend *self, ALCdevice *device); -static void ALCsndioBackend_Destruct(ALCsndioBackend *self); -static ALCenum ALCsndioBackend_open(ALCsndioBackend *self, const ALCchar *name); -static void ALCsndioBackend_close(ALCsndioBackend *self); -static ALCboolean ALCsndioBackend_reset(ALCsndioBackend *self); -static ALCboolean ALCsndioBackend_start(ALCsndioBackend *self); -static void ALCsndioBackend_stop(ALCsndioBackend *self); -static DECLARE_FORWARD2(ALCsndioBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, ALCuint, availableSamples) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCsndioBackend, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCsndioBackend) - -DEFINE_ALCBACKEND_VTABLE(ALCsndioBackend); - - -static const ALCchar sndio_device[] = "SndIO Default"; - - -static void ALCsndioBackend_Construct(ALCsndioBackend *self, ALCdevice *device) -{ - ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - SET_VTABLE2(ALCsndioBackend, ALCbackend, self); -} - -static void ALCsndioBackend_Destruct(ALCsndioBackend *self) -{ - if(self->sndHandle) - sio_close(self->sndHandle); - self->sndHandle = NULL; - - al_free(self->mix_data); - self->mix_data = NULL; - - ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); -} - - -static int ALCsndioBackend_mixerProc(void *ptr) -{ - ALCsndioBackend *self = (ALCsndioBackend*)ptr; - ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; - ALsizei frameSize; - size_t wrote; - - SetRTPriority(); - althrd_setname(althrd_current(), MIXER_THREAD_NAME); - - frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - - while(!self->killNow && device->Connected) - { - ALsizei len = self->data_size; - ALubyte *WritePtr = self->mix_data; - - ALCsndioBackend_lock(self); - aluMixData(device, WritePtr, len/frameSize); - ALCsndioBackend_unlock(self); - while(len > 0 && !self->killNow) - { - wrote = sio_write(self->sndHandle, WritePtr, len); - if(wrote == 0) - { - ERR("sio_write failed\n"); - ALCdevice_Lock(device); - aluHandleDisconnect(device); - ALCdevice_Unlock(device); - break; - } - - len -= wrote; - WritePtr += wrote; - } - } - - return 0; -} - - -static ALCenum ALCsndioBackend_open(ALCsndioBackend *self, const ALCchar *name) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - if(!name) - name = sndio_device; - else if(strcmp(name, sndio_device) != 0) - return ALC_INVALID_VALUE; - - self->sndHandle = sio_open(NULL, SIO_PLAY, 0); - if(self->sndHandle == NULL) - { - ERR("Could not open device\n"); - return ALC_INVALID_VALUE; - } - - alstr_copy_cstr(&device->DeviceName, name); - - return ALC_NO_ERROR; -} - -static void ALCsndioBackend_close(ALCsndioBackend *self) -{ - sio_close(self->sndHandle); - self->sndHandle = NULL; -} - -static ALCboolean ALCsndioBackend_reset(ALCsndioBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - struct sio_par par; - - sio_initpar(&par); - - par.rate = device->Frequency; - par.pchan = ((device->FmtChans != DevFmtMono) ? 2 : 1); - - switch(device->FmtType) - { - case DevFmtByte: - par.bits = 8; - par.sig = 1; - break; - case DevFmtUByte: - par.bits = 8; - par.sig = 0; - break; - case DevFmtFloat: - case DevFmtShort: - par.bits = 16; - par.sig = 1; - break; - case DevFmtUShort: - par.bits = 16; - par.sig = 0; - break; - case DevFmtInt: - par.bits = 32; - par.sig = 1; - break; - case DevFmtUInt: - par.bits = 32; - par.sig = 0; - break; - } - par.le = SIO_LE_NATIVE; - - par.round = device->UpdateSize; - par.appbufsz = device->UpdateSize * (device->NumUpdates-1); - if(!par.appbufsz) par.appbufsz = device->UpdateSize; - - if(!sio_setpar(self->sndHandle, &par) || !sio_getpar(self->sndHandle, &par)) - { - ERR("Failed to set device parameters\n"); - return ALC_FALSE; - } - - if(par.bits != par.bps*8) - { - ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8); - return ALC_FALSE; - } - - device->Frequency = par.rate; - device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo); - - if(par.bits == 8 && par.sig == 1) - device->FmtType = DevFmtByte; - else if(par.bits == 8 && par.sig == 0) - device->FmtType = DevFmtUByte; - else if(par.bits == 16 && par.sig == 1) - device->FmtType = DevFmtShort; - else if(par.bits == 16 && par.sig == 0) - device->FmtType = DevFmtUShort; - else if(par.bits == 32 && par.sig == 1) - device->FmtType = DevFmtInt; - else if(par.bits == 32 && par.sig == 0) - device->FmtType = DevFmtUInt; - else - { - ERR("Unhandled sample format: %s %u-bit\n", (par.sig?"signed":"unsigned"), par.bits); - return ALC_FALSE; - } - - device->UpdateSize = par.round; - device->NumUpdates = (par.bufsz/par.round) + 1; - - SetDefaultChannelOrder(device); - - return ALC_TRUE; -} - -static ALCboolean ALCsndioBackend_start(ALCsndioBackend *self) -{ - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - - self->data_size = device->UpdateSize * FrameSizeFromDevFmt( - device->FmtChans, device->FmtType, device->AmbiOrder - ); - al_free(self->mix_data); - self->mix_data = al_calloc(16, self->data_size); - - if(!sio_start(self->sndHandle)) - { - ERR("Error starting playback\n"); - return ALC_FALSE; - } - - self->killNow = 0; - if(althrd_create(&self->thread, ALCsndioBackend_mixerProc, self) != althrd_success) - { - sio_stop(self->sndHandle); - return ALC_FALSE; - } - - return ALC_TRUE; -} - -static void ALCsndioBackend_stop(ALCsndioBackend *self) -{ - int res; - - if(self->killNow) - return; - - self->killNow = 1; - althrd_join(self->thread, &res); - - if(!sio_stop(self->sndHandle)) - ERR("Error stopping device\n"); - - al_free(self->mix_data); - self->mix_data = NULL; -} - - -typedef struct ALCsndioBackendFactory { - DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCsndioBackendFactory; -#define ALCSNDIOBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCsndioBackendFactory, ALCbackendFactory) } } - -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void); - -static ALCboolean ALCsndioBackendFactory_init(ALCsndioBackendFactory *self); -static DECLARE_FORWARD(ALCsndioBackendFactory, ALCbackendFactory, void, deinit) -static ALCboolean ALCsndioBackendFactory_querySupport(ALCsndioBackendFactory *self, ALCbackend_Type type); -static void ALCsndioBackendFactory_probe(ALCsndioBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCsndioBackendFactory_createBackend(ALCsndioBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsndioBackendFactory); - - -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void) -{ - static ALCsndioBackendFactory factory = ALCSNDIOBACKENDFACTORY_INITIALIZER; - return STATIC_CAST(ALCbackendFactory, &factory); -} - - -static ALCboolean ALCsndioBackendFactory_init(ALCsndioBackendFactory* UNUSED(self)) -{ - /* No dynamic loading */ - return ALC_TRUE; -} - -static ALCboolean ALCsndioBackendFactory_querySupport(ALCsndioBackendFactory* UNUSED(self), ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - return ALC_TRUE; - return ALC_FALSE; -} - -static void ALCsndioBackendFactory_probe(ALCsndioBackendFactory* UNUSED(self), enum DevProbe type) -{ - switch(type) - { - case ALL_DEVICE_PROBE: - AppendAllDevicesList(sndio_device); - break; - case CAPTURE_DEVICE_PROBE: - break; - } -} - -static ALCbackend* ALCsndioBackendFactory_createBackend(ALCsndioBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) -{ - if(type == ALCbackend_Playback) - { - ALCsndioBackend *backend; - NEW_OBJ(backend, ALCsndioBackend)(device); - if(!backend) return NULL; - return STATIC_CAST(ALCbackend, backend); - } - - return NULL; -} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/bsinc.c b/love/src/jni/openal-soft-1.18.2/Alc/bsinc.c deleted file mode 100644 index ad83c42b..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/bsinc.c +++ /dev/null @@ -1,5081 +0,0 @@ - -#include "config.h" - -#include "AL/al.h" -#include "align.h" - -/* Table of windowed sinc coefficients and deltas. This 11th order filter - * has a rejection of -60 dB, yielding a transition width of ~0.302 - * (normalized frequency). Order increases when downsampling to a limit of - * one octave, after which the quality of the filter (transition width) - * suffers to reduce the CPU cost. The bandlimiting will cut all sound after - * downsampling by ~2.73 octaves. - */ -alignas(16) const ALfloat bsincTab[18840] = -{ - /* 24, 0 */ +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, - - /* 24, 0 */ +1.501390780e-03f, +3.431804419e-03f, +6.512803185e-03f, +1.091425387e-02f, +1.664594540e-02f, +2.351091132e-02f, +3.109255671e-02f, +3.878419288e-02f, +4.586050701e-02f, +5.158058002e-02f, +5.530384985e-02f, +5.659614054e-02f, +5.530384985e-02f, +5.158058002e-02f, +4.586050701e-02f, +3.878419288e-02f, +3.109255671e-02f, +2.351091132e-02f, +1.664594540e-02f, +1.091425387e-02f, +6.512803185e-03f, +3.431804419e-03f, +1.501390780e-03f, +4.573885647e-04f, - /* 24, 1 */ +1.413186400e-03f, +3.279858311e-03f, +6.282638036e-03f, +1.059932179e-02f, +1.625135142e-02f, +2.305547031e-02f, +3.060840342e-02f, +3.831365198e-02f, +4.545054680e-02f, +5.127577001e-02f, +5.513916011e-02f, +5.659104154e-02f, +5.545895049e-02f, +5.187752167e-02f, +4.626513642e-02f, +3.925233583e-02f, +3.157717954e-02f, +2.396921539e-02f, +1.704503934e-02f, +1.123445076e-02f, +6.748179094e-03f, +3.588275667e-03f, +1.593065611e-03f, +5.022154476e-04f, - /* 24, 2 */ +1.328380648e-03f, +3.132379333e-03f, +6.057656813e-03f, +1.028967374e-02f, +1.586133102e-02f, +2.260301890e-02f, +3.012488684e-02f, +3.784089895e-02f, +4.503543229e-02f, +5.096323022e-02f, +5.496495842e-02f, +5.657574693e-02f, +5.560438923e-02f, +5.216645963e-02f, +4.666426010e-02f, +3.971789474e-02f, +3.206210284e-02f, +2.443025293e-02f, +1.744855617e-02f, +1.155988996e-02f, +6.988790100e-03f, +3.749328623e-03f, +1.688282347e-03f, +5.494305796e-04f, - /* 24, 3 */ +1.246901403e-03f, +2.989308098e-03f, +5.837830254e-03f, +9.985325752e-03f, +1.547595434e-02f, +2.215368059e-02f, +2.964217216e-02f, +3.736611920e-02f, +4.461534144e-02f, +5.064310236e-02f, +5.478132634e-02f, +5.655026396e-02f, +5.574009777e-02f, +5.244726189e-02f, +4.705770477e-02f, +4.018068337e-02f, +3.254715574e-02f, +2.489389144e-02f, +1.785641537e-02f, +1.189054572e-02f, +7.234657995e-03f, +3.915018340e-03f, +1.787112015e-03f, +5.991047395e-04f, - /* 24, 4 */ +1.168676301e-03f, +2.850583915e-03f, +5.623126723e-03f, +9.686290690e-03f, +1.509528803e-02f, +2.170757578e-02f, +2.916042250e-02f, +3.688949768e-02f, +4.419045351e-02f, +5.031553118e-02f, +5.458834968e-02f, +5.651460469e-02f, +5.586601230e-02f, +5.271979985e-02f, +4.744529894e-02f, +4.064051541e-02f, +3.303216567e-02f, +2.535999546e-02f, +1.826853297e-02f, +1.222638897e-02f, +7.485801959e-03f, +4.085398290e-03f, +1.889625146e-03f, +6.513091287e-04f, - /* 24, 5 */ +1.093632798e-03f, +2.716144855e-03f, +5.413512274e-03f, +9.392578266e-03f, +1.471939531e-02f, +2.126482169e-02f, +2.867979883e-02f, +3.641121873e-02f, +4.376094899e-02f, +4.998066438e-02f, +5.438611851e-02f, +5.646878599e-02f, +5.598207354e-02f, +5.298394839e-02f, +4.782687301e-02f, +4.109720465e-02f, +3.351695842e-02f, +2.582842673e-02f, +1.868482156e-02f, +1.256738733e-02f, +7.742238512e-03f, +4.260520294e-03f, +1.995891717e-03f, +7.061153220e-04f, - /* 24, 6 */ +1.021698233e-03f, +2.585927824e-03f, +5.208950715e-03f, +9.104195104e-03f, +1.434833590e-02f, +2.082553239e-02f, +2.820045990e-02f, +3.593146595e-02f, +4.332700946e-02f, +4.963865252e-02f, +5.417472708e-02f, +5.641282954e-02f, +5.608822683e-02f, +5.323958602e-02f, +4.820225940e-02f, +4.155056502e-02f, +3.400135826e-02f, +2.629904416e-02f, +1.910519032e-02f, +1.291350505e-02f, +8.003981455e-03f, +4.440434453e-03f, +2.105981077e-03f, +7.635952183e-04f, - /* 24, 7 */ +9.527998831e-04f, +2.459868628e-03f, +5.009403670e-03f, +8.821144768e-03f, +1.398216608e-02f, +2.038981869e-02f, +2.772256216e-02f, +3.545042216e-02f, +4.288881749e-02f, +4.928964888e-02f, +5.395427373e-02f, +5.634676181e-02f, +5.618442211e-02f, +5.348659488e-02f, +4.857129262e-02f, +4.200041076e-02f, +3.448518802e-02f, +2.677170395e-02f, +1.952954505e-02f, +1.326470299e-02f, +8.271041819e-03f, +4.625189083e-03f, +2.219961884e-03f, +8.238209888e-04f, - /* 24, 8 */ +8.868650246e-04f, +2.337902042e-03f, +4.814830642e-03f, +8.543427812e-03f, +1.362093865e-02f, +1.995778816e-02f, +2.724625964e-02f, +3.496826923e-02f, +4.244655653e-02f, +4.893380942e-02f, +5.372486088e-02f, +5.627061400e-02f, +5.627061400e-02f, +5.372486088e-02f, +4.893380942e-02f, +4.244655653e-02f, +3.496826923e-02f, +2.724625964e-02f, +1.995778816e-02f, +1.362093865e-02f, +8.543427812e-03f, +4.814830642e-03f, +2.337902042e-03f, +8.868650246e-04f, - /* 24, 9 */ +8.238209888e-04f, +2.219961884e-03f, +4.625189083e-03f, +8.271041819e-03f, +1.326470299e-02f, +1.952954505e-02f, +2.677170395e-02f, +3.448518802e-02f, +4.200041076e-02f, +4.857129262e-02f, +5.348659488e-02f, +5.618442211e-02f, +5.634676181e-02f, +5.395427373e-02f, +4.928964888e-02f, +4.288881749e-02f, +3.545042216e-02f, +2.772256216e-02f, +2.038981869e-02f, +1.398216608e-02f, +8.821144768e-03f, +5.009403670e-03f, +2.459868628e-03f, +9.527998831e-04f, - /* 24,10 */ +7.635952183e-04f, +2.105981077e-03f, +4.440434453e-03f, +8.003981455e-03f, +1.291350505e-02f, +1.910519032e-02f, +2.629904416e-02f, +3.400135826e-02f, +4.155056502e-02f, +4.820225940e-02f, +5.323958602e-02f, +5.608822683e-02f, +5.641282954e-02f, +5.417472708e-02f, +4.963865252e-02f, +4.332700946e-02f, +3.593146595e-02f, +2.820045990e-02f, +2.082553239e-02f, +1.434833590e-02f, +9.104195104e-03f, +5.208950715e-03f, +2.585927824e-03f, +1.021698233e-03f, - /* 24,11 */ +7.061153220e-04f, +1.995891717e-03f, +4.260520294e-03f, +7.742238512e-03f, +1.256738733e-02f, +1.868482156e-02f, +2.582842673e-02f, +3.351695842e-02f, +4.109720465e-02f, +4.782687301e-02f, +5.298394839e-02f, +5.598207354e-02f, +5.646878599e-02f, +5.438611851e-02f, +4.998066438e-02f, +4.376094899e-02f, +3.641121873e-02f, +2.867979883e-02f, +2.126482169e-02f, +1.471939531e-02f, +9.392578266e-03f, +5.413512274e-03f, +2.716144855e-03f, +1.093632798e-03f, - /* 24,12 */ +6.513091287e-04f, +1.889625146e-03f, +4.085398290e-03f, +7.485801959e-03f, +1.222638897e-02f, +1.826853297e-02f, +2.535999546e-02f, +3.303216567e-02f, +4.064051541e-02f, +4.744529894e-02f, +5.271979985e-02f, +5.586601230e-02f, +5.651460469e-02f, +5.458834968e-02f, +5.031553118e-02f, +4.419045351e-02f, +3.688949768e-02f, +2.916042250e-02f, +2.170757578e-02f, +1.509528803e-02f, +9.686290690e-03f, +5.623126723e-03f, +2.850583915e-03f, +1.168676301e-03f, - /* 24,13 */ +5.991047395e-04f, +1.787112015e-03f, +3.915018340e-03f, +7.234657995e-03f, +1.189054572e-02f, +1.785641537e-02f, +2.489389144e-02f, +3.254715574e-02f, +4.018068337e-02f, +4.705770477e-02f, +5.244726189e-02f, +5.574009777e-02f, +5.655026396e-02f, +5.478132634e-02f, +5.064310236e-02f, +4.461534144e-02f, +3.736611920e-02f, +2.964217216e-02f, +2.215368059e-02f, +1.547595434e-02f, +9.985325752e-03f, +5.837830254e-03f, +2.989308098e-03f, +1.246901403e-03f, - /* 24,14 */ +5.494305796e-04f, +1.688282347e-03f, +3.749328623e-03f, +6.988790100e-03f, +1.155988996e-02f, +1.744855617e-02f, +2.443025293e-02f, +3.206210284e-02f, +3.971789474e-02f, +4.666426010e-02f, +5.216645963e-02f, +5.560438923e-02f, +5.657574693e-02f, +5.496495842e-02f, +5.096323022e-02f, +4.503543229e-02f, +3.784089895e-02f, +3.012488684e-02f, +2.260301890e-02f, +1.586133102e-02f, +1.028967374e-02f, +6.057656813e-03f, +3.132379333e-03f, +1.328380648e-03f, - /* 24,15 */ +5.022154476e-04f, +1.593065611e-03f, +3.588275667e-03f, +6.748179094e-03f, +1.123445076e-02f, +1.704503934e-02f, +2.396921539e-02f, +3.157717954e-02f, +3.925233583e-02f, +4.626513642e-02f, +5.187752167e-02f, +5.545895049e-02f, +5.659104154e-02f, +5.513916011e-02f, +5.127577001e-02f, +4.545054680e-02f, +3.831365198e-02f, +3.060840342e-02f, +2.305547031e-02f, +1.625135142e-02f, +1.059932179e-02f, +6.282638036e-03f, +3.279858311e-03f, +1.413186400e-03f, - /* 24, 0 */ -1.127794091e-03f, -1.412146034e-03f, -3.831821143e-04f, +3.227045776e-03f, +1.066768284e-02f, +2.270769386e-02f, +3.918787347e-02f, +5.876378120e-02f, +7.897914846e-02f, +9.670702233e-02f, +1.088639494e-01f, +1.131922811e-01f, +1.088639494e-01f, +9.670702233e-02f, +7.897914846e-02f, +5.876378120e-02f, +3.918787347e-02f, +2.270769386e-02f, +1.066768284e-02f, +3.227045776e-03f, -3.831821143e-04f, -1.412146034e-03f, -1.127794091e-03f, -4.881068065e-04f, - /* 24, 1 */ -1.090580766e-03f, -1.420873386e-03f, -5.091873886e-04f, +2.900756187e-03f, +1.007202248e-02f, +2.181774373e-02f, +3.804709217e-02f, +5.749143322e-02f, +7.775467878e-02f, +9.573284944e-02f, +1.083163184e-01f, +1.131750947e-01f, +1.093805191e-01f, +9.765915788e-02f, +8.019389052e-02f, +6.003885715e-02f, +4.034112484e-02f, +2.361538773e-02f, +1.128161899e-02f, +3.568453927e-03f, -2.470940015e-04f, -1.398398357e-03f, -1.163769773e-03f, -5.264712252e-04f, - /* 24, 2 */ -1.052308046e-03f, -1.424863695e-03f, -6.254426725e-04f, +2.589304991e-03f, +9.494532203e-03f, +2.094570441e-02f, +3.691925193e-02f, +5.622252667e-02f, +7.652128881e-02f, +9.473734332e-02f, +1.077380418e-01f, +1.131235487e-01f, +1.098656350e-01f, +9.858856505e-02f, +8.139809812e-02f, +6.131593665e-02f, +4.150635732e-02f, +2.454063933e-02f, +1.191392194e-02f, +3.925253463e-03f, -1.005901154e-04f, -1.379341793e-03f, -1.198322390e-03f, -5.655319713e-04f, - /* 24, 3 */ -1.013146991e-03f, -1.424394748e-03f, -7.322803183e-04f, +2.292405169e-03f, +8.935092066e-03f, +2.009172411e-02f, +3.580480556e-02f, +5.495776346e-02f, +7.527978553e-02f, +9.372122042e-02f, +1.071295572e-01f, +1.130376830e-01f, +1.103189277e-01f, +9.949456662e-02f, +8.259096568e-02f, +6.259428489e-02f, +4.268306423e-02f, +2.548324354e-02f, +1.256466766e-02f, +4.297709369e-03f, +5.666214823e-05f, -1.354682733e-03f, -1.231259367e-03f, -6.052075404e-04f, - /* 24, 4 */ -9.732614753e-04f, -1.419738627e-03f, -8.300317840e-04f, +2.009763334e-03f, +8.393568260e-03f, +1.925593236e-02f, +3.470418745e-02f, +5.369783330e-02f, +7.403097485e-02f, +9.268520876e-02f, +1.064913245e-01f, +1.129175635e-01f, +1.107400515e-01f, +1.003764999e-01f, +8.377168968e-02f, +6.387315732e-02f, +4.387072153e-02f, +2.644297610e-02f, +1.323391671e-02f, +4.686078310e-03f, +2.249946366e-04f, -1.324122762e-03f, -1.262381011e-03f, -6.454100415e-04f, - /* 24, 5 */ -9.328082015e-04f, -1.411161525e-03f, -9.190272443e-04f, +1.741080225e-03f, +7.869813543e-03f, +1.843844016e-02f, +3.361781336e-02f, +5.244341325e-02f, +7.277566076e-02f, +9.163004717e-02f, +1.058238246e-01f, +1.127632829e-01f, +1.111286847e-01f, +1.012337173e-01f, +8.493946948e-02f, +6.515180031e-02f, +4.506878807e-02f, +2.741959349e-02f, +1.392171386e-02f, +5.090608136e-03f, +4.047380047e-04f, -1.287358924e-03f, -1.291480556e-03f, -6.860450823e-04f, - /* 24, 6 */ -8.919367204e-04f, -1.398923562e-03f, -9.995952120e-04f, +1.486051192e-03f, +7.363667669e-03f, +1.763934022e-02f, +3.254608027e-02f, +5.119516710e-02f, +7.151464464e-02f, +9.055648452e-02f, +1.051275597e-01f, +1.125749599e-01f, +1.114845301e-01f, +1.020655875e-01f, +8.609350809e-02f, +6.642945179e-02f, +4.627670593e-02f, +2.841283293e-02f, +1.462808772e-02f, +5.511537402e-03f, +5.962212734e-04f, -1.244083985e-03f, -1.318344226e-03f, -7.270116618e-04f, - /* 24, 7 */ -8.507894667e-04f, -1.383278624e-03f, -1.072062171e-03f, +1.244366682e-03f, +6.874957829e-03f, +1.685870710e-02f, +3.148936626e-02f, +4.995374490e-02f, +7.024872443e-02f, +8.946527894e-02f, +1.044030520e-01f, +1.123527394e-01f, +1.118073151e-01f, +1.028714955e-01f, +8.723301301e-02f, +6.770534195e-02f, +4.749390083e-02f, +2.942241233e-02f, +1.535305047e-02f, +5.949094883e-03f, +7.997713791e-04f, -1.193986722e-03f, -1.342751302e-03f, -7.682020711e-04f, - /* 24, 8 */ -8.095018024e-04f, -1.364474212e-03f, -1.136752219e-03f, +1.015712718e-03f, +6.403499096e-03f, +1.609659749e-02f, +3.044803032e-02f, +4.871978245e-02f, +6.897869391e-02f, +8.835719701e-02f, +1.036508436e-01f, +1.120967923e-01f, +1.120967923e-01f, +1.036508436e-01f, +8.835719701e-02f, +6.897869391e-02f, +4.871978245e-02f, +3.044803032e-02f, +1.609659749e-02f, +6.403499096e-03f, +1.015712718e-03f, -1.136752219e-03f, -1.364474212e-03f, -8.095018024e-04f, - /* 24, 9 */ -7.682020711e-04f, -1.342751302e-03f, -1.193986722e-03f, +7.997713791e-04f, +5.949094883e-03f, +1.535305047e-02f, +2.942241233e-02f, +4.749390083e-02f, +6.770534195e-02f, +8.723301301e-02f, +1.028714955e-01f, +1.118073151e-01f, +1.123527394e-01f, +1.044030520e-01f, +8.946527894e-02f, +7.024872443e-02f, +4.995374490e-02f, +3.148936626e-02f, +1.685870710e-02f, +6.874957829e-03f, +1.244366682e-03f, -1.072062171e-03f, -1.383278624e-03f, -8.507894667e-04f, - /* 24,10 */ -7.270116618e-04f, -1.318344226e-03f, -1.244083985e-03f, +5.962212734e-04f, +5.511537402e-03f, +1.462808772e-02f, +2.841283293e-02f, +4.627670593e-02f, +6.642945179e-02f, +8.609350809e-02f, +1.020655875e-01f, +1.114845301e-01f, +1.125749599e-01f, +1.051275597e-01f, +9.055648452e-02f, +7.151464464e-02f, +5.119516710e-02f, +3.254608027e-02f, +1.763934022e-02f, +7.363667669e-03f, +1.486051192e-03f, -9.995952120e-04f, -1.398923562e-03f, -8.919367204e-04f, - /* 24,11 */ -6.860450823e-04f, -1.291480556e-03f, -1.287358924e-03f, +4.047380047e-04f, +5.090608136e-03f, +1.392171386e-02f, +2.741959349e-02f, +4.506878807e-02f, +6.515180031e-02f, +8.493946948e-02f, +1.012337173e-01f, +1.111286847e-01f, +1.127632829e-01f, +1.058238246e-01f, +9.163004717e-02f, +7.277566076e-02f, +5.244341325e-02f, +3.361781336e-02f, +1.843844016e-02f, +7.869813543e-03f, +1.741080225e-03f, -9.190272443e-04f, -1.411161525e-03f, -9.328082015e-04f, - /* 24,12 */ -6.454100415e-04f, -1.262381011e-03f, -1.324122762e-03f, +2.249946366e-04f, +4.686078310e-03f, +1.323391671e-02f, +2.644297610e-02f, +4.387072153e-02f, +6.387315732e-02f, +8.377168968e-02f, +1.003764999e-01f, +1.107400515e-01f, +1.129175635e-01f, +1.064913245e-01f, +9.268520876e-02f, +7.403097485e-02f, +5.369783330e-02f, +3.470418745e-02f, +1.925593236e-02f, +8.393568260e-03f, +2.009763334e-03f, -8.300317840e-04f, -1.419738627e-03f, -9.732614753e-04f, - /* 24,13 */ -6.052075404e-04f, -1.231259367e-03f, -1.354682733e-03f, +5.666214823e-05f, +4.297709369e-03f, +1.256466766e-02f, +2.548324354e-02f, +4.268306423e-02f, +6.259428489e-02f, +8.259096568e-02f, +9.949456662e-02f, +1.103189277e-01f, +1.130376830e-01f, +1.071295572e-01f, +9.372122042e-02f, +7.527978553e-02f, +5.495776346e-02f, +3.580480556e-02f, +2.009172411e-02f, +8.935092066e-03f, +2.292405169e-03f, -7.322803183e-04f, -1.424394748e-03f, -1.013146991e-03f, - /* 24,14 */ -5.655319713e-04f, -1.198322390e-03f, -1.379341793e-03f, -1.005901154e-04f, +3.925253463e-03f, +1.191392194e-02f, +2.454063933e-02f, +4.150635732e-02f, +6.131593665e-02f, +8.139809812e-02f, +9.858856505e-02f, +1.098656350e-01f, +1.131235487e-01f, +1.077380418e-01f, +9.473734332e-02f, +7.652128881e-02f, +5.622252667e-02f, +3.691925193e-02f, +2.094570441e-02f, +9.494532203e-03f, +2.589304991e-03f, -6.254426725e-04f, -1.424863695e-03f, -1.052308046e-03f, - /* 24,15 */ -5.264712252e-04f, -1.163769773e-03f, -1.398398357e-03f, -2.470940015e-04f, +3.568453927e-03f, +1.128161899e-02f, +2.361538773e-02f, +4.034112484e-02f, +6.003885715e-02f, +8.019389052e-02f, +9.765915788e-02f, +1.093805191e-01f, +1.131750947e-01f, +1.083163184e-01f, +9.573284944e-02f, +7.775467878e-02f, +5.749143322e-02f, +3.804709217e-02f, +2.181774373e-02f, +1.007202248e-02f, +2.900756187e-03f, -5.091873886e-04f, -1.420873386e-03f, -1.090580766e-03f, - /* 24, 0 */ -6.542299160e-04f, -2.850723396e-03f, -6.490258587e-03f, -9.960104872e-03f, -9.809478345e-03f, -1.578994128e-03f, +1.829834548e-02f, +5.025161588e-02f, +9.015425381e-02f, +1.297327779e-01f, +1.589915292e-01f, +1.697884216e-01f, +1.589915292e-01f, +1.297327779e-01f, +9.015425381e-02f, +5.025161588e-02f, +1.829834548e-02f, -1.578994128e-03f, -9.809478345e-03f, -9.960104872e-03f, -6.490258587e-03f, -2.850723396e-03f, -6.542299160e-04f, +6.349952235e-05f, - /* 24, 1 */ -5.715660670e-04f, -2.664319167e-03f, -6.241370053e-03f, -9.805460951e-03f, -1.000906214e-02f, -2.409006146e-03f, +1.668518463e-02f, +4.795494216e-02f, +8.756853655e-02f, +1.274593023e-01f, +1.576392865e-01f, +1.697451719e-01f, +1.602699418e-01f, +1.319653222e-01f, +9.273931864e-02f, +5.258078166e-02f, +1.996024013e-02f, -7.024321916e-04f, -9.578061730e-03f, -1.010098516e-02f, -6.739131402e-03f, -3.043301383e-03f, -7.429059724e-04f, +4.968305000e-05f, - /* 24, 2 */ -4.947700224e-04f, -2.484234158e-03f, -5.993080931e-03f, -9.638098137e-03f, -1.017794029e-02f, -3.193110201e-03f, +1.512113085e-02f, +4.569233080e-02f, +8.498458400e-02f, +1.251473534e-01f, +1.562147818e-01f, +1.696154741e-01f, +1.614730379e-01f, +1.341545065e-01f, +9.532128436e-02f, +5.494080034e-02f, +2.167042077e-02f, +2.212715669e-04f, -9.313697641e-03f, -1.022703863e-02f, -6.987342300e-03f, -3.241882098e-03f, -8.377276082e-04f, +3.267464436e-05f, - /* 24, 3 */ -4.236872966e-04f, -2.310589033e-03f, -5.745975157e-03f, -9.459041324e-03f, -1.031725016e-02f, -3.931996122e-03f, +1.360648366e-02f, +4.346528177e-02f, +8.240478048e-02f, +1.227994149e-01f, +1.547196623e-01f, +1.693994819e-01f, +1.625994153e-01f, +1.362979353e-01f, +9.789767810e-02f, +5.732996534e-02f, +2.342836441e-02f, +1.192656872e-03f, -9.015286272e-03f, -1.033718507e-02f, -7.234214214e-03f, -3.446268223e-03f, -9.388162067e-04f, +1.226776811e-05f, - /* 24, 4 */ -3.581542611e-04f, -2.143480447e-03f, -5.500605429e-03f, -9.269294257e-03f, -1.042813706e-02f, -4.626399385e-03f, +1.214146970e-02f, +4.127522351e-02f, +7.983147433e-02f, +1.204179923e-01f, +1.531556516e-01f, +1.690974512e-01f, +1.636477581e-01f, +1.383932498e-01f, +1.004660042e-01f, +5.974650439e-02f, +2.523347234e-02f, +2.212209196e-03f, -8.681745020e-03f, -1.043032883e-02f, -7.479039479e-03f, -3.656235461e-03f, -1.046280200e-03f, -1.174474466e-05f, - /* 24, 5 */ -2.979990698e-04f, -1.982981877e-03f, -5.257493218e-03f, -9.069838305e-03f, -1.051175200e-02f, -5.277098842e-03f, +1.072624378e-02f, +3.912351177e-02f, +7.726697481e-02f, +1.180056089e-01f, +1.515245471e-01f, +1.687097397e-01f, +1.646168392e-01f, +1.404381320e-01f, +1.030237476e-01f, +6.218858132e-02f, +2.708506973e-02f, +3.280357753e-03f, -8.312010872e-03f, -1.050536039e-02f, -7.721080180e-03f, -3.871531888e-03f, -1.160214103e-03f, -3.957001380e-05f, - /* 24, 6 */ -2.430425717e-04f, -1.829144469e-03f, -5.017128860e-03f, -8.861631306e-03f, -1.056924947e-02f, -5.884914422e-03f, +9.360889972e-03f, +3.701142868e-02f, +7.471354913e-02f, +1.155648023e-01f, +1.498282170e-01f, +1.682368061e-01f, +1.655055219e-01f, +1.424303080e-01f, +1.055683777e-01f, +6.465429798e-02f, +2.898240538e-02f, +4.397473555e-03f, -7.905042791e-03f, -1.056115807e-02f, -7.959568583e-03f, -4.091877352e-03f, -1.280697546e-03f, -7.141440876e-05f, - /* 24, 7 */ -1.930992056e-04f, -1.681997919e-03f, -4.779971710e-03f, -8.645606504e-03f, -1.060178532e-02f, -6.450704795e-03f, +8.045422842e-03f, +3.494018190e-02f, +7.217341954e-02f, +1.130981205e-01f, +1.480685972e-01f, +1.676792097e-01f, +1.663127619e-01f, +1.443675516e-01f, +1.080973515e-01f, +6.714169632e-02f, +3.092465153e-02f, +5.563867546e-03f, -7.459824124e-03f, -1.059658974e-02f, -8.193707637e-03f, -4.316962918e-03f, -1.407794310e-03f, -1.074828157e-04f, - /* 24, 8 */ -1.479778772e-04f, -1.541551365e-03f, -4.546450360e-03f, -8.422671559e-03f, -1.061051465e-02f, -6.975365011e-03f, +6.779788805e-03f, +3.291090392e-02f, +6.964876056e-02f, +1.106081178e-01f, +1.462476880e-01f, +1.670376092e-01f, +1.670376092e-01f, +1.462476880e-01f, +1.106081178e-01f, +6.964876056e-02f, +3.291090392e-02f, +6.779788805e-03f, -6.975365011e-03f, -1.061051465e-02f, -8.422671559e-03f, -4.546450360e-03f, -1.541551365e-03f, -1.479778772e-04f, - /* 24, 9 */ -1.074828157e-04f, -1.407794310e-03f, -4.316962918e-03f, -8.193707637e-03f, -1.059658974e-02f, -7.459824124e-03f, +5.563867546e-03f, +3.092465153e-02f, +6.714169632e-02f, +1.080973515e-01f, +1.443675516e-01f, +1.663127619e-01f, +1.676792097e-01f, +1.480685972e-01f, +1.130981205e-01f, +7.217341954e-02f, +3.494018190e-02f, +8.045422842e-03f, -6.450704795e-03f, -1.060178532e-02f, -8.645606504e-03f, -4.779971710e-03f, -1.681997919e-03f, -1.930992056e-04f, - /* 24,10 */ -7.141440876e-05f, -1.280697546e-03f, -4.091877352e-03f, -7.959568583e-03f, -1.056115807e-02f, -7.905042791e-03f, +4.397473555e-03f, +2.898240538e-02f, +6.465429798e-02f, +1.055683777e-01f, +1.424303080e-01f, +1.655055219e-01f, +1.682368061e-01f, +1.498282170e-01f, +1.155648023e-01f, +7.471354913e-02f, +3.701142868e-02f, +9.360889972e-03f, -5.884914422e-03f, -1.056924947e-02f, -8.861631306e-03f, -5.017128860e-03f, -1.829144469e-03f, -2.430425717e-04f, - /* 24,11 */ -3.957001380e-05f, -1.160214103e-03f, -3.871531888e-03f, -7.721080180e-03f, -1.050536039e-02f, -8.312010872e-03f, +3.280357753e-03f, +2.708506973e-02f, +6.218858132e-02f, +1.030237476e-01f, +1.404381320e-01f, +1.646168392e-01f, +1.687097397e-01f, +1.515245471e-01f, +1.180056089e-01f, +7.726697481e-02f, +3.912351177e-02f, +1.072624378e-02f, -5.277098842e-03f, -1.051175200e-02f, -9.069838305e-03f, -5.257493218e-03f, -1.982981877e-03f, -2.979990698e-04f, - /* 24,12 */ -1.174474466e-05f, -1.046280200e-03f, -3.656235461e-03f, -7.479039479e-03f, -1.043032883e-02f, -8.681745020e-03f, +2.212209196e-03f, +2.523347234e-02f, +5.974650439e-02f, +1.004660042e-01f, +1.383932498e-01f, +1.636477581e-01f, +1.690974512e-01f, +1.531556516e-01f, +1.204179923e-01f, +7.983147433e-02f, +4.127522351e-02f, +1.214146970e-02f, -4.626399385e-03f, -1.042813706e-02f, -9.269294257e-03f, -5.500605429e-03f, -2.143480447e-03f, -3.581542611e-04f, - /* 24,13 */ +1.226776811e-05f, -9.388162067e-04f, -3.446268223e-03f, -7.234214214e-03f, -1.033718507e-02f, -9.015286272e-03f, +1.192656872e-03f, +2.342836441e-02f, +5.732996534e-02f, +9.789767810e-02f, +1.362979353e-01f, +1.625994153e-01f, +1.693994819e-01f, +1.547196623e-01f, +1.227994149e-01f, +8.240478048e-02f, +4.346528177e-02f, +1.360648366e-02f, -3.931996122e-03f, -1.031725016e-02f, -9.459041324e-03f, -5.745975157e-03f, -2.310589033e-03f, -4.236872966e-04f, - /* 24,14 */ +3.267464436e-05f, -8.377276082e-04f, -3.241882098e-03f, -6.987342300e-03f, -1.022703863e-02f, -9.313697641e-03f, +2.212715669e-04f, +2.167042077e-02f, +5.494080034e-02f, +9.532128436e-02f, +1.341545065e-01f, +1.614730379e-01f, +1.696154741e-01f, +1.562147818e-01f, +1.251473534e-01f, +8.498458400e-02f, +4.569233080e-02f, +1.512113085e-02f, -3.193110201e-03f, -1.017794029e-02f, -9.638098137e-03f, -5.993080931e-03f, -2.484234158e-03f, -4.947700224e-04f, - /* 24,15 */ +4.968305000e-05f, -7.429059724e-04f, -3.043301383e-03f, -6.739131402e-03f, -1.010098516e-02f, -9.578061730e-03f, -7.024321916e-04f, +1.996024013e-02f, +5.258078166e-02f, +9.273931864e-02f, +1.319653222e-01f, +1.602699418e-01f, +1.697451719e-01f, +1.576392865e-01f, +1.274593023e-01f, +8.756853655e-02f, +4.795494216e-02f, +1.668518463e-02f, -2.409006146e-03f, -1.000906214e-02f, -9.805460951e-03f, -6.241370053e-03f, -2.664319167e-03f, -5.715660670e-04f, - /* 24, 0 */ +1.619229527e-03f, +2.585184252e-03f, +7.650378125e-04f, -6.171975840e-03f, -1.695416291e-02f, -2.423274385e-02f, -1.612533623e-02f, +1.737483974e-02f, +7.628093610e-02f, +1.465254238e-01f, +2.041060488e-01f, +2.263845622e-01f, +2.041060488e-01f, +1.465254238e-01f, +7.628093610e-02f, +1.737483974e-02f, -1.612533623e-02f, -2.423274385e-02f, -1.695416291e-02f, -6.171975840e-03f, +7.650378125e-04f, +2.585184252e-03f, +1.619229527e-03f, +4.203426526e-04f, - /* 24, 1 */ +1.531668339e-03f, +2.575087939e-03f, +1.015030141e-03f, -5.584253498e-03f, -1.627529113e-02f, -2.409742304e-02f, -1.730694612e-02f, +1.446720847e-02f, +7.205349539e-02f, +1.422361210e-01f, +2.013530187e-01f, +2.262942875e-01f, +2.067165090e-01f, +1.507648574e-01f, +8.055624103e-02f, +2.038667606e-02f, -1.484111026e-02f, -2.430745079e-02f, -1.762106127e-02f, -6.776879595e-03f, +4.938567092e-04f, +2.584413048e-03f, +1.706479068e-03f, +4.743886054e-04f, - /* 24, 2 */ +1.444251783e-03f, +2.554897668e-03f, +1.244217996e-03f, -5.014646771e-03f, -1.558700841e-02f, -2.390468713e-02f, -1.838770218e-02f, +1.166535016e-02f, +6.787901036e-02f, +1.379034790e-01f, +1.984620386e-01f, +2.260236194e-01f, +2.091800031e-01f, +1.549479100e-01f, +8.487414623e-02f, +2.350091114e-02f, -1.345266938e-02f, -2.431836796e-02f, -1.827334019e-02f, -7.397926552e-03f, +2.011593926e-04f, +2.571998910e-03f, +1.792931314e-03f, +5.318997770e-04f, - /* 24, 3 */ +1.357406375e-03f, +2.525382259e-03f, +1.453038602e-03f, -4.463987325e-03f, -1.489178967e-02f, -2.365774922e-02f, -1.936952211e-02f, +8.970595311e-03f, +6.376239146e-02f, +1.335340325e-01f, +1.954379419e-01f, +2.255730254e-01f, +2.114923689e-01f, +1.590681020e-01f, +8.922922426e-02f, +2.671549986e-02f, -1.195858585e-02f, -2.426235104e-02f, -1.890827435e-02f, -8.033973302e-03f, -1.133208208e-04f, +2.547167581e-03f, +1.878071789e-03f, +5.928148062e-04f, - /* 24, 4 */ +1.271528621e-03f, +2.487303056e-03f, +1.641978155e-03f, -3.933006021e-03f, -1.419201875e-02f, -2.335982837e-02f, -2.025447087e-02f, +6.384038515e-03f, +5.970836021e-02f, +1.291343068e-01f, +1.922857641e-01f, +2.249432832e-01f, +2.136496877e-01f, +1.631190001e-01f, +9.361589375e-02f, +3.002815853e-02f, -1.035761042e-02f, -2.413629608e-02f, -1.952306378e-02f, -8.683770335e-03f, -4.497860188e-04f, +2.509149105e-03f, +1.961357874e-03f, +6.570484107e-04f, - /* 24, 5 */ +1.186984902e-03f, +2.441411339e-03f, +1.811567846e-03f, -3.422334900e-03f, -1.348998519e-02f, -2.301414142e-02f, -2.104475231e-02f, +3.906540614e-03f, +5.572144173e-02f, +1.247108046e-01f, +1.890107314e-01f, +2.241354793e-01f, +2.156482934e-01f, +1.670942309e-01f, +9.802842938e-02f, +3.343636564e-02f, -8.648679404e-03f, -2.393714847e-02f, -2.011483893e-02f, -9.345961431e-03f, -8.083699235e-04f, +2.457181100e-03f, +2.042219659e-03f, +7.244903794e-04f, - /* 24, 6 */ +1.104111497e-03f, +2.388445882e-03f, +1.962379900e-03f, -2.932509404e-03f, -1.278788140e-02f, -2.262389503e-02f, -2.174270056e-02f, +1.538731332e-03f, +5.180595798e-02f, +1.202699924e-01f, +1.856182490e-01f, +2.231510062e-01f, +2.174847808e-01f, +1.709874949e-01f, +1.024609723e-01f, +3.693736330e-02f, -6.830921421e-03f, -2.366191192e-02f, -2.068066597e-02f, -1.001908338e-02f, -1.189134206e-03f, +2.390512141e-03f, +2.120060933e-03f, +7.950046334e-04f, - /* 24, 7 */ +1.023214729e-03f, +2.329130668e-03f, +2.095023622e-03f, -2.463970822e-03f, -1.208780014e-02f, -2.219227795e-02f, -2.235077131e-02f, -7.189875350e-04f, +4.796602143e-02f, +1.158182872e-01f, +1.821138888e-01f, +2.219915591e-01f, +2.191560137e-01f, +1.747925803e-01f, +1.069075413e-01f, +4.052815924e-02f, -4.903663772e-03f, -2.330765754e-02f, -2.121755248e-02f, -1.070156599e-02f, -1.592064902e-03f, +2.308405249e-03f, +2.194260355e-03f, +8.684283615e-04f, - /* 24, 8 */ +9.445712380e-04f, +2.264172764e-03f, +2.210141486e-03f, -2.017068943e-03f, -1.139173248e-02f, -2.172245353e-02f, -2.287153293e-02f, -2.866438416e-03f, +4.420552946e-02f, +1.113620436e-01f, +1.785033768e-01f, +2.206591322e-01f, +2.206591322e-01f, +1.785033768e-01f, +1.113620436e-01f, +4.420552946e-02f, -2.866438416e-03f, -2.287153293e-02f, -2.172245353e-02f, -1.139173248e-02f, -2.017068943e-03f, +2.210141486e-03f, +2.264172764e-03f, +9.445712380e-04f, - /* 24, 9 */ +8.684283615e-04f, +2.194260355e-03f, +2.308405249e-03f, -1.592064902e-03f, -1.070156599e-02f, -2.121755248e-02f, -2.330765754e-02f, -4.903663772e-03f, +4.052815924e-02f, +1.069075413e-01f, +1.747925803e-01f, +2.191560137e-01f, +2.219915591e-01f, +1.821138888e-01f, +1.158182872e-01f, +4.796602143e-02f, -7.189875350e-04f, -2.235077131e-02f, -2.219227795e-02f, -1.208780014e-02f, -2.463970822e-03f, +2.095023622e-03f, +2.329130668e-03f, +1.023214729e-03f, - /* 24,10 */ +7.950046334e-04f, +2.120060933e-03f, +2.390512141e-03f, -1.189134206e-03f, -1.001908338e-02f, -2.068066597e-02f, -2.366191192e-02f, -6.830921421e-03f, +3.693736330e-02f, +1.024609723e-01f, +1.709874949e-01f, +2.174847808e-01f, +2.231510062e-01f, +1.856182490e-01f, +1.202699924e-01f, +5.180595798e-02f, +1.538731332e-03f, -2.174270056e-02f, -2.262389503e-02f, -1.278788140e-02f, -2.932509404e-03f, +1.962379900e-03f, +2.388445882e-03f, +1.104111497e-03f, - /* 24,11 */ +7.244903794e-04f, +2.042219659e-03f, +2.457181100e-03f, -8.083699235e-04f, -9.345961431e-03f, -2.011483893e-02f, -2.393714847e-02f, -8.648679404e-03f, +3.343636564e-02f, +9.802842938e-02f, +1.670942309e-01f, +2.156482934e-01f, +2.241354793e-01f, +1.890107314e-01f, +1.247108046e-01f, +5.572144173e-02f, +3.906540614e-03f, -2.104475231e-02f, -2.301414142e-02f, -1.348998519e-02f, -3.422334900e-03f, +1.811567846e-03f, +2.441411339e-03f, +1.186984902e-03f, - /* 24,12 */ +6.570484107e-04f, +1.961357874e-03f, +2.509149105e-03f, -4.497860188e-04f, -8.683770335e-03f, -1.952306378e-02f, -2.413629608e-02f, -1.035761042e-02f, +3.002815853e-02f, +9.361589375e-02f, +1.631190001e-01f, +2.136496877e-01f, +2.249432832e-01f, +1.922857641e-01f, +1.291343068e-01f, +5.970836021e-02f, +6.384038515e-03f, -2.025447087e-02f, -2.335982837e-02f, -1.419201875e-02f, -3.933006021e-03f, +1.641978155e-03f, +2.487303056e-03f, +1.271528621e-03f, - /* 24,13 */ +5.928148062e-04f, +1.878071789e-03f, +2.547167581e-03f, -1.133208208e-04f, -8.033973302e-03f, -1.890827435e-02f, -2.426235104e-02f, -1.195858585e-02f, +2.671549986e-02f, +8.922922426e-02f, +1.590681020e-01f, +2.114923689e-01f, +2.255730254e-01f, +1.954379419e-01f, +1.335340325e-01f, +6.376239146e-02f, +8.970595311e-03f, -1.936952211e-02f, -2.365774922e-02f, -1.489178967e-02f, -4.463987325e-03f, +1.453038602e-03f, +2.525382259e-03f, +1.357406375e-03f, - /* 24,14 */ +5.318997770e-04f, +1.792931314e-03f, +2.571998910e-03f, +2.011593926e-04f, -7.397926552e-03f, -1.827334019e-02f, -2.431836796e-02f, -1.345266938e-02f, +2.350091114e-02f, +8.487414623e-02f, +1.549479100e-01f, +2.091800031e-01f, +2.260236194e-01f, +1.984620386e-01f, +1.379034790e-01f, +6.787901036e-02f, +1.166535016e-02f, -1.838770218e-02f, -2.390468713e-02f, -1.558700841e-02f, -5.014646771e-03f, +1.244217996e-03f, +2.554897668e-03f, +1.444251783e-03f, - /* 24,15 */ +4.743886054e-04f, +1.706479068e-03f, +2.584413048e-03f, +4.938567092e-04f, -6.776879595e-03f, -1.762106127e-02f, -2.430745079e-02f, -1.484111026e-02f, +2.038667606e-02f, +8.055624103e-02f, +1.507648574e-01f, +2.067165090e-01f, +2.262942875e-01f, +2.013530187e-01f, +1.422361210e-01f, +7.205349539e-02f, +1.446720847e-02f, -1.730694612e-02f, -2.409742304e-02f, -1.627529113e-02f, -5.584253498e-03f, +1.015030141e-03f, +2.575087939e-03f, +1.531668339e-03f, - /* 24, 0 */ -5.620806651e-04f, +1.786951327e-03f, +6.445247430e-03f, +8.135220753e-03f, -1.055728075e-03f, -2.182587186e-02f, -3.862210468e-02f, -2.392616717e-02f, +4.121375257e-02f, +1.449837419e-01f, +2.427850309e-01f, +2.829807027e-01f, +2.427850309e-01f, +1.449837419e-01f, +4.121375257e-02f, -2.392616717e-02f, -3.862210468e-02f, -2.182587186e-02f, -1.055728075e-03f, +8.135220753e-03f, +6.445247430e-03f, +1.786951327e-03f, -5.620806651e-04f, -5.120724112e-04f, - /* 24, 1 */ -6.104492932e-04f, +1.548760636e-03f, +6.159105160e-03f, +8.277197332e-03f, -7.779733613e-05f, -2.039475337e-02f, -3.819819741e-02f, -2.624621678e-02f, +3.569722776e-02f, +1.380982730e-01f, +2.379020609e-01f, +2.828154582e-01f, +2.474326717e-01f, +1.518487179e-01f, +4.689321837e-02f, -2.139810919e-02f, -3.892035913e-02f, -2.324619800e-02f, -2.084809535e-03f, +7.948411519e-03f, +6.721048149e-03f, +2.036121529e-03f, -5.037148469e-04f, -5.469834647e-04f, - /* 24, 2 */ -6.493280747e-04f, +1.322056610e-03f, +5.864617557e-03f, +8.376206823e-03f, +8.476165560e-04f, -1.895882060e-02f, -3.765599422e-02f, -2.836041007e-02f, +3.035103267e-02f, +1.312062799e-01f, +2.327950895e-01f, +2.823201223e-01f, +2.518341522e-01f, +1.586790922e-01f, +5.272765217e-02f, -1.866041870e-02f, -3.908572584e-02f, -2.464952038e-02f, -3.163389088e-03f, +7.715013258e-03f, +6.984447000e-03f, +2.295668536e-03f, -4.348733531e-04f, -5.801620624e-04f, - /* 24, 3 */ -6.792484933e-04f, +1.107253309e-03f, +5.563710253e-03f, +8.434210700e-03f, +1.719427448e-03f, -1.752380524e-02f, -3.700294628e-02f, -3.027140813e-02f, +2.518195985e-02f, +1.243215533e-01f, +2.274759065e-01f, +2.814958870e-01f, +2.559791715e-01f, +1.654606562e-01f, +5.870851072e-02f, -1.571201688e-02f, -3.911111998e-02f, -2.602940857e-02f, -4.289522020e-03f, +7.433392157e-03f, +7.233326681e-03f, +2.564892035e-03f, -3.551113499e-04f, -6.111213026e-04f, - /* 24, 4 */ -7.007615573e-04f, +9.046745282e-04f, +5.258232435e-03f, +8.453253159e-03f, +2.536821717e-03f, -1.609518093e-02f, -3.624657153e-02f, -3.198236083e-02f, +2.019619593e-02f, +1.174576676e-01f, +2.219567270e-01f, +2.803447347e-01f, +2.598579915e-01f, +1.721791413e-01f, +6.482669661e-02f, -1.255238605e-02f, -3.898963496e-02f, -2.737922870e-02f, -5.460966964e-03f, +7.102050305e-03f, +7.465520628e-03f, +2.842992490e-03f, -2.640225027e-04f, -6.393525967e-04f, - /* 24, 5 */ -7.144333056e-04f, +7.145569834e-04f, +4.949951622e-03f, +8.435448103e-03f, +3.299249997e-03f, -1.467815287e-02f, -3.539442781e-02f, -3.349688539e-02f, +1.539931407e-02f, +1.106279448e-01f, +2.162501543e-01f, +2.788694321e-01f, +2.634614666e-01f, +1.788202595e-01f, +7.107257652e-02f, -9.181583996e-03f, -3.871457066e-02f, -2.869216031e-02f, -6.675182397e-03f, +6.719638981e-03f, +7.678821339e-03f, +3.129069982e-03f, -1.612438490e-04f, -6.643278432e-04f, - /* 24, 6 */ -7.208404573e-04f, +5.370537968e-04f, +4.640549073e-03f, +8.382966356e-03f, +4.006418111e-03f, -1.327764882e-02f, -3.445408633e-02f, -3.481904366e-02f, +1.079626845e-02f, +1.038454185e-01f, +2.103691410e-01f, +2.770735210e-01f, +2.667810728e-01f, +1.853697450e-01f, +7.743600141e-02f, -5.600256400e-03f, -3.827946167e-02f, -2.996121443e-02f, -7.929324241e-03f, +6.284971816e-03f, +7.870989279e-03f, +3.422123547e-03f, -4.646067064e-05f, -6.855018549e-04f, - /* 24, 7 */ -7.205662235e-04f, +3.722382714e-04f, +4.331615834e-03f, +8.298023138e-03f, +4.658277300e-03f, -1.189831143e-02f, -3.343310598e-02f, -3.595331849e-02f, +6.391391026e-03f, +9.712280024e-02f, +2.043269499e-01f, +2.749613076e-01f, +2.698089343e-01f, +1.918133956e-01f, +8.390632879e-02f, -1.809647645e-03f, -3.767810524e-02f, -3.117925279e-02f, -9.220244622e-03f, +5.797037759e-03f, +8.039762345e-03f, +3.721051017e-03f, +8.058866307e-05f, -7.023150347e-04f, - /* 24, 8 */ -7.141962964e-04f, +2.201079121e-04f, +4.024649403e-03f, +8.182865872e-03f, +5.255013788e-03f, -1.054449181e-02f, -3.233900821e-02f, -3.690458903e-02f, +2.188390323e-03f, +9.047244679e-02f, +1.981371140e-01f, +2.725378483e-01f, +2.725378483e-01f, +1.981371140e-01f, +9.047244679e-02f, +2.188390323e-03f, -3.690458903e-02f, -3.233900821e-02f, -1.054449181e-02f, +5.255013788e-03f, +8.182865872e-03f, +4.024649403e-03f, +2.201079121e-04f, -7.141962964e-04f, - /* 24, 9 */ -7.023150347e-04f, +8.058866307e-05f, +3.721051017e-03f, +8.039762345e-03f, +5.797037759e-03f, -9.220244622e-03f, -3.117925279e-02f, -3.767810524e-02f, -1.809647645e-03f, +8.390632879e-02f, +1.918133956e-01f, +2.698089343e-01f, +2.749613076e-01f, +2.043269499e-01f, +9.712280024e-02f, +6.391391026e-03f, -3.595331849e-02f, -3.343310598e-02f, -1.189831143e-02f, +4.658277300e-03f, +8.298023138e-03f, +4.331615834e-03f, +3.722382714e-04f, -7.205662235e-04f, - /* 24,10 */ -6.855018549e-04f, -4.646067064e-05f, +3.422123547e-03f, +7.870989279e-03f, +6.284971816e-03f, -7.929324241e-03f, -2.996121443e-02f, -3.827946167e-02f, -5.600256400e-03f, +7.743600141e-02f, +1.853697450e-01f, +2.667810728e-01f, +2.770735210e-01f, +2.103691410e-01f, +1.038454185e-01f, +1.079626845e-02f, -3.481904366e-02f, -3.445408633e-02f, -1.327764882e-02f, +4.006418111e-03f, +8.382966356e-03f, +4.640549073e-03f, +5.370537968e-04f, -7.208404573e-04f, - /* 24,11 */ -6.643278432e-04f, -1.612438490e-04f, +3.129069982e-03f, +7.678821339e-03f, +6.719638981e-03f, -6.675182397e-03f, -2.869216031e-02f, -3.871457066e-02f, -9.181583996e-03f, +7.107257652e-02f, +1.788202595e-01f, +2.634614666e-01f, +2.788694321e-01f, +2.162501543e-01f, +1.106279448e-01f, +1.539931407e-02f, -3.349688539e-02f, -3.539442781e-02f, -1.467815287e-02f, +3.299249997e-03f, +8.435448103e-03f, +4.949951622e-03f, +7.145569834e-04f, -7.144333056e-04f, - /* 24,12 */ -6.393525967e-04f, -2.640225027e-04f, +2.842992490e-03f, +7.465520628e-03f, +7.102050305e-03f, -5.460966964e-03f, -2.737922870e-02f, -3.898963496e-02f, -1.255238605e-02f, +6.482669661e-02f, +1.721791413e-01f, +2.598579915e-01f, +2.803447347e-01f, +2.219567270e-01f, +1.174576676e-01f, +2.019619593e-02f, -3.198236083e-02f, -3.624657153e-02f, -1.609518093e-02f, +2.536821717e-03f, +8.453253159e-03f, +5.258232435e-03f, +9.046745282e-04f, -7.007615573e-04f, - /* 24,13 */ -6.111213026e-04f, -3.551113499e-04f, +2.564892035e-03f, +7.233326681e-03f, +7.433392157e-03f, -4.289522020e-03f, -2.602940857e-02f, -3.911111998e-02f, -1.571201688e-02f, +5.870851072e-02f, +1.654606562e-01f, +2.559791715e-01f, +2.814958870e-01f, +2.274759065e-01f, +1.243215533e-01f, +2.518195985e-02f, -3.027140813e-02f, -3.700294628e-02f, -1.752380524e-02f, +1.719427448e-03f, +8.434210700e-03f, +5.563710253e-03f, +1.107253309e-03f, -6.792484933e-04f, - /* 24,14 */ -5.801620624e-04f, -4.348733531e-04f, +2.295668536e-03f, +6.984447000e-03f, +7.715013258e-03f, -3.163389088e-03f, -2.464952038e-02f, -3.908572584e-02f, -1.866041870e-02f, +5.272765217e-02f, +1.586790922e-01f, +2.518341522e-01f, +2.823201223e-01f, +2.327950895e-01f, +1.312062799e-01f, +3.035103267e-02f, -2.836041007e-02f, -3.765599422e-02f, -1.895882060e-02f, +8.476165560e-04f, +8.376206823e-03f, +5.864617557e-03f, +1.322056610e-03f, -6.493280747e-04f, - /* 24,15 */ -5.469834647e-04f, -5.037148469e-04f, +2.036121529e-03f, +6.721048149e-03f, +7.948411519e-03f, -2.084809535e-03f, -2.324619800e-02f, -3.892035913e-02f, -2.139810919e-02f, +4.689321837e-02f, +1.518487179e-01f, +2.474326717e-01f, +2.828154582e-01f, +2.379020609e-01f, +1.380982730e-01f, +3.569722776e-02f, -2.624621678e-02f, -3.819819741e-02f, -2.039475337e-02f, -7.779733613e-05f, +8.277197332e-03f, +6.159105160e-03f, +1.548760636e-03f, -6.104492932e-04f, - /* 24, 0 */ -1.197013499e-03f, -3.320493122e-03f, -1.144245270e-03f, +8.577337679e-03f, +1.627759141e-02f, +3.152522439e-03f, -3.255249254e-02f, -5.362651723e-02f, -5.304244056e-03f, +1.253006387e-01f, +2.738089134e-01f, +3.395768433e-01f, +2.738089134e-01f, +1.253006387e-01f, -5.304244056e-03f, -5.362651723e-02f, -3.255249254e-02f, +3.152522439e-03f, +1.627759141e-02f, +8.577337679e-03f, -1.144245270e-03f, -3.320493122e-03f, -1.197013499e-03f, +1.261205705e-04f, - /* 24, 1 */ -1.060573898e-03f, -3.246029352e-03f, -1.514205592e-03f, +7.849505167e-03f, +1.622707505e-02f, +4.797556391e-03f, -3.017446993e-02f, -5.385088872e-02f, -1.098434059e-02f, +1.155960124e-01f, +2.659858985e-01f, +3.393017042e-01f, +2.812897341e-01f, +1.350895441e-01f, +7.263382766e-04f, -5.311639759e-02f, -3.488122370e-02f, +1.404407443e-03f, +1.624118609e-02f, +9.301572693e-03f, -7.399572733e-04f, -3.377916464e-03f, -1.338504197e-03f, +9.901282259e-05f, - /* 24, 2 */ -9.298712414e-04f, -3.156277727e-03f, -1.849729696e-03f, +7.122444811e-03f, +1.609438844e-02f, +6.335978542e-03f, -2.776122262e-02f, -5.380213751e-02f, -1.630850202e-02f, +1.060004951e-01f, +2.578448120e-01f, +3.384771755e-01f, +2.884051592e-01f, +1.449371908e-01f, +7.100538384e-03f, -5.230860749e-02f, -3.714619841e-02f, -4.425295608e-04f, +1.611336946e-02f, +1.001762126e-02f, -3.016869975e-04f, -3.416553196e-03f, -1.484263468e-03f, +6.526428163e-05f, - /* 24, 3 */ -8.054954021e-04f, -3.052984548e-03f, -2.150934111e-03f, +6.400291527e-03f, +1.588450664e-02f, +7.764974256e-03f, -2.532636892e-02f, -5.349351937e-02f, -2.127269005e-02f, +9.653812261e-02f, +2.494105998e-01f, +3.371059190e-01f, +2.951330020e-01f, +1.548174220e-01f, +1.381006797e-02f, -5.119199897e-02f, -3.933260713e-02f, -2.383292518e-03f, +1.588995194e-02f, +1.072069264e-02f, +1.699725421e-04f, -3.434676821e-03f, -1.633412152e-03f, +2.453170435e-05f, - /* 24, 4 */ -6.879416803e-04f, -2.937877889e-03f, -2.418147761e-03f, +5.686932142e-03f, +1.560259046e-02f, +9.082429619e-03f, -2.288303213e-02f, -5.293884648e-02f, -2.587426360e-02f, +8.723205545e-02f, +2.407089312e-01f, +3.351923590e-01f, +3.014521813e-01f, +1.647035561e-01f, +2.084522321e-02f, -4.975626781e-02f, -4.142535273e-02f, -4.412143180e-03f, +1.556708209e-02f, +1.140581394e-02f, +6.741710759e-04f, -3.430594409e-03f, -1.784975276e-03f, -2.348660763e-05f, - /* 24, 5 */ -5.776128643e-04f, -2.812656385e-03f, -2.651898517e-03f, +4.985994150e-03f, +1.525394912e-02f, +1.028691298e-02f, -2.044379769e-02f, -5.215241275e-02f, -3.011195925e-02f, +7.810450253e-02f, +2.317660961e-01f, +3.327426635e-01f, +3.073428069e-01f, +1.745684830e-01f, +2.819489579e-02f, -4.799202051e-02f, -4.340911052e-02f, -6.522599631e-03f, +1.514128438e-02f, +1.206785167e-02f, +1.209792693e-03f, -3.402660968e-03f, -1.937883690e-03f, -7.904503123e-05f, - /* 24, 6 */ -4.748218959e-04f, -2.678978820e-03f, -2.852899102e-03f, +4.300836533e-03f, +1.484400357e-02f, +1.137765361e-02f, -1.802067434e-02f, -5.114891871e-02f, -3.398586582e-02f, +6.917664952e-02f, +2.226089010e-01f, +3.297647184e-01f, +3.127862620e-01f, +1.843847637e-01f, +3.584659036e-02f, -4.589083871e-02f, -4.526839113e-02f, -8.707438641e-03f, +1.460949637e-02f, +1.270153536e-02f, +1.775448814e-03f, -3.349294247e-03f, -2.090976552e-03f, -1.423449116e-04f, - /* 24, 7 */ -3.797950945e-04f, -2.538454547e-03f, -3.022032460e-03f, +3.634542645e-03f, +1.437825069e-02f, +1.235451773e-02f, -1.562505912e-02f, -4.994339647e-02f, -3.749739364e-02f, +6.046859273e-02f, +2.132645624e-01f, +3.262680950e-01f, +3.177652787e-01f, +1.941247325e-01f, +4.378644843e-02f, -4.344534054e-02f, -4.698760595e-02f, -1.095870195e-02f, +1.396910503e-02f, +1.330148306e-02f, +2.369472628e-03f, -3.268989872e-03f, -2.243004675e-03f, -2.135289700e-04f, - /* 24, 8 */ -2.926758839e-04f, -2.392634763e-03f, -3.160336722e-03f, +2.989915102e-03f, +1.386222860e-02f, +1.321798203e-02f, -1.326770657e-02f, -4.855113496e-02f, -4.064923848e-02f, +5.199927852e-02f, +2.037606007e-01f, +3.222640100e-01f, +3.222640100e-01f, +2.037606007e-01f, +5.199927852e-02f, -4.064923848e-02f, -4.855113496e-02f, -1.326770657e-02f, +1.321798203e-02f, +1.386222860e-02f, +2.989915102e-03f, -3.160336722e-03f, -2.392634763e-03f, -2.926758839e-04f, - /* 24, 9 */ -2.135289700e-04f, -2.243004675e-03f, -3.268989872e-03f, +2.369472628e-03f, +1.330148306e-02f, +1.396910503e-02f, -1.095870195e-02f, -4.698760595e-02f, -4.344534054e-02f, +4.378644843e-02f, +1.941247325e-01f, +3.177652787e-01f, +3.262680950e-01f, +2.132645624e-01f, +6.046859273e-02f, -3.749739364e-02f, -4.994339647e-02f, -1.562505912e-02f, +1.235451773e-02f, +1.437825069e-02f, +3.634542645e-03f, -3.022032460e-03f, -2.538454547e-03f, -3.797950945e-04f, - /* 24,10 */ -1.423449116e-04f, -2.090976552e-03f, -3.349294247e-03f, +1.775448814e-03f, +1.270153536e-02f, +1.460949637e-02f, -8.707438641e-03f, -4.526839113e-02f, -4.589083871e-02f, +3.584659036e-02f, +1.843847637e-01f, +3.127862620e-01f, +3.297647184e-01f, +2.226089010e-01f, +6.917664952e-02f, -3.398586582e-02f, -5.114891871e-02f, -1.802067434e-02f, +1.137765361e-02f, +1.484400357e-02f, +4.300836533e-03f, -2.852899102e-03f, -2.678978820e-03f, -4.748218959e-04f, - /* 24,11 */ -7.904503123e-05f, -1.937883690e-03f, -3.402660968e-03f, +1.209792693e-03f, +1.206785167e-02f, +1.514128438e-02f, -6.522599631e-03f, -4.340911052e-02f, -4.799202051e-02f, +2.819489579e-02f, +1.745684830e-01f, +3.073428069e-01f, +3.327426635e-01f, +2.317660961e-01f, +7.810450253e-02f, -3.011195925e-02f, -5.215241275e-02f, -2.044379769e-02f, +1.028691298e-02f, +1.525394912e-02f, +4.985994150e-03f, -2.651898517e-03f, -2.812656385e-03f, -5.776128643e-04f, - /* 24,12 */ -2.348660763e-05f, -1.784975276e-03f, -3.430594409e-03f, +6.741710759e-04f, +1.140581394e-02f, +1.556708209e-02f, -4.412143180e-03f, -4.142535273e-02f, -4.975626781e-02f, +2.084522321e-02f, +1.647035561e-01f, +3.014521813e-01f, +3.351923590e-01f, +2.407089312e-01f, +8.723205545e-02f, -2.587426360e-02f, -5.293884648e-02f, -2.288303213e-02f, +9.082429619e-03f, +1.560259046e-02f, +5.686932142e-03f, -2.418147761e-03f, -2.937877889e-03f, -6.879416803e-04f, - /* 24,13 */ +2.453170435e-05f, -1.633412152e-03f, -3.434676821e-03f, +1.699725421e-04f, +1.072069264e-02f, +1.588995194e-02f, -2.383292518e-03f, -3.933260713e-02f, -5.119199897e-02f, +1.381006797e-02f, +1.548174220e-01f, +2.951330020e-01f, +3.371059190e-01f, +2.494105998e-01f, +9.653812261e-02f, -2.127269005e-02f, -5.349351937e-02f, -2.532636892e-02f, +7.764974256e-03f, +1.588450664e-02f, +6.400291527e-03f, -2.150934111e-03f, -3.052984548e-03f, -8.054954021e-04f, - /* 24,14 */ +6.526428163e-05f, -1.484263468e-03f, -3.416553196e-03f, -3.016869975e-04f, +1.001762126e-02f, +1.611336946e-02f, -4.425295608e-04f, -3.714619841e-02f, -5.230860749e-02f, +7.100538384e-03f, +1.449371908e-01f, +2.884051592e-01f, +3.384771755e-01f, +2.578448120e-01f, +1.060004951e-01f, -1.630850202e-02f, -5.380213751e-02f, -2.776122262e-02f, +6.335978542e-03f, +1.609438844e-02f, +7.122444811e-03f, -1.849729696e-03f, -3.156277727e-03f, -9.298712414e-04f, - /* 24,15 */ +9.901282259e-05f, -1.338504197e-03f, -3.377916464e-03f, -7.399572733e-04f, +9.301572693e-03f, +1.624118609e-02f, +1.404407443e-03f, -3.488122370e-02f, -5.311639759e-02f, +7.263382766e-04f, +1.350895441e-01f, +2.812897341e-01f, +3.393017042e-01f, +2.659858985e-01f, +1.155960124e-01f, -1.098434059e-02f, -5.385088872e-02f, -3.017446993e-02f, +4.797556391e-03f, +1.622707505e-02f, +7.849505167e-03f, -1.514205592e-03f, -3.246029352e-03f, -1.060573898e-03f, - /* 20, 0 */ -4.161478318e-03f, -1.410215661e-03f, +1.216462436e-02f, +1.839753508e-02f, -1.019572218e-02f, -5.576407638e-02f, -3.857794503e-02f, +9.869941459e-02f, +2.903842315e-01f, +3.819037908e-01f, +2.903842315e-01f, +9.869941459e-02f, -3.857794503e-02f, -5.576407638e-02f, -1.019572218e-02f, +1.839753508e-02f, +1.216462436e-02f, -1.410215661e-03f, -4.161478318e-03f, -1.002136091e-03f, - /* 20, 1 */ -4.024812873e-03f, -1.935046598e-03f, +1.120868183e-02f, +1.884704309e-02f, -7.349314558e-03f, -5.377462232e-02f, -4.306909662e-02f, +8.713841011e-02f, +2.797272456e-01f, +3.815142140e-01f, +3.006231905e-01f, +1.105090175e-01f, -3.357053763e-02f, -5.750258783e-02f, -1.313424017e-02f, +1.779561475e-02f, +1.309754391e-02f, -8.338854378e-04f, -4.274968522e-03f, -1.184613130e-03f, - /* 20, 2 */ -3.867923854e-03f, -2.407896178e-03f, +1.023778220e-02f, +1.914947854e-02f, -4.608279480e-03f, -5.155911253e-02f, -4.704785126e-02f, +7.585987841e-02f, +2.686929243e-01f, +3.803470604e-01f, +3.104047352e-01f, +1.225315522e-01f, -2.804532708e-02f, -5.896552129e-02f, -1.615031726e-02f, +1.703673197e-02f, +1.399907244e-02f, -2.069933478e-04f, -4.362323551e-03f, -1.376799150e-03f, - /* 20, 3 */ -3.693729756e-03f, -2.828715617e-03f, +9.259646102e-03f, +1.931089692e-02f, -1.984565051e-03f, -4.914254142e-02f, -5.052030051e-02f, +6.489576800e-02f, +2.573230589e-01f, +3.784070525e-01f, +3.196909791e-01f, +1.347297046e-01f, -2.200314505e-02f, -6.012863981e-02f, -1.922814732e-02f, +1.611719780e-02f, +1.486058724e-02f, +4.690483654e-04f, -4.420601658e-03f, -1.577606548e-03f, - /* 20, 4 */ -3.505092707e-03f, -3.197865053e-03f, +8.281610454e-03f, +1.933799402e-02f, +5.112106557e-04f, -4.654987033e-02f, -5.349467921e-02f, +5.427598051e-02f, +2.456603330e-01f, +3.757020336e-01f, +3.284457292e-01f, +1.470646693e-01f, -1.544725782e-02f, -6.096825350e-02f, -2.235071271e-02f, +1.503425320e-02f, +1.567326271e-02f, +1.192336051e-03f, -4.446907145e-03f, -1.785766437e-03f, - /* 20, 5 */ -3.304797071e-03f, -3.516087186e-03f, +7.310594668e-03f, +1.923802927e-02f, +2.869766685e-03f, -4.380589142e-02f, -5.598126618e-02f, +4.402826232e-02f, +2.337481127e-01f, +3.722429273e-01f, +3.366346688e-01f, +1.594963158e-01f, -8.383409345e-03f, -6.146136934e-02f, -2.549983702e-02f, +1.378613431e-02f, +1.642812632e-02f, +1.960461229e-03f, -4.438419451e-03f, -1.999828319e-03f, - /* 20, 6 */ -3.095529963e-03f, -3.784479230e-03f, +6.353071566e-03f, +1.901874863e-02f, +5.083157654e-03f, -4.093509653e-02f, -5.799227582e-02f, +3.417810958e-02f, +2.216302330e-01f, +3.680436800e-01f, +3.442255330e-01f, +1.719833640e-01f, -8.198514564e-04f, -6.158584092e-02f, -2.865624686e-02f, +1.237213363e-02f, +1.711611824e-02f, +2.770500592e-03f, -4.392423280e-03f, -2.218161540e-03f, - /* 20, 7 */ -2.879863731e-03f, -4.004463491e-03f, +5.415043050e-03f, +1.868830751e-02f, +7.144763866e-03f, -3.796155187e-02f, -5.954174144e-02f, +2.474868675e-02f, +2.093507858e-01f, +3.631211887e-01f, +3.511882735e-01f, +1.844835679e-01f, +7.232639407e-03f, -6.132051750e-02f, -3.179964276e-02f, +1.079265669e-02f, +1.772815465e-02f, +3.619009684e-03f, -4.306339536e-03f, -2.438958613e-03f, - /* 20, 8 */ -2.660240473e-03f, -4.177756859e-03f, +4.502020476e-03f, +1.825519424e-02f, +9.049273418e-03f, -3.490877898e-02f, -6.064539119e-02f, +1.576075912e-02f, +1.969539074e-01f, +3.574952133e-01f, +3.574952133e-01f, +1.969539074e-01f, +1.576075912e-02f, -6.064539119e-02f, -3.490877898e-02f, +9.049273418e-03f, +1.825519424e-02f, +4.502020476e-03f, -4.177756859e-03f, -2.660240473e-03f, - /* 20, 9 */ -2.438958613e-03f, -4.306339536e-03f, +3.619009684e-03f, +1.772815465e-02f, +1.079265669e-02f, -3.179964276e-02f, -6.132051750e-02f, +7.232639407e-03f, +1.844835679e-01f, +3.511882735e-01f, +3.631211887e-01f, +2.093507858e-01f, +2.474868675e-02f, -5.954174144e-02f, -3.796155187e-02f, +7.144763866e-03f, +1.868830751e-02f, +5.415043050e-03f, -4.004463491e-03f, -2.879863731e-03f, - /* 20,10 */ -2.218161540e-03f, -4.392423280e-03f, +2.770500592e-03f, +1.711611824e-02f, +1.237213363e-02f, -2.865624686e-02f, -6.158584092e-02f, -8.198514564e-04f, +1.719833640e-01f, +3.442255330e-01f, +3.680436800e-01f, +2.216302330e-01f, +3.417810958e-02f, -5.799227582e-02f, -4.093509653e-02f, +5.083157654e-03f, +1.901874863e-02f, +6.353071566e-03f, -3.784479230e-03f, -3.095529963e-03f, - /* 20,11 */ -1.999828319e-03f, -4.438419451e-03f, +1.960461229e-03f, +1.642812632e-02f, +1.378613431e-02f, -2.549983702e-02f, -6.146136934e-02f, -8.383409345e-03f, +1.594963158e-01f, +3.366346688e-01f, +3.722429273e-01f, +2.337481127e-01f, +4.402826232e-02f, -5.598126618e-02f, -4.380589142e-02f, +2.869766685e-03f, +1.923802927e-02f, +7.310594668e-03f, -3.516087186e-03f, -3.304797071e-03f, - /* 20,12 */ -1.785766437e-03f, -4.446907145e-03f, +1.192336051e-03f, +1.567326271e-02f, +1.503425320e-02f, -2.235071271e-02f, -6.096825350e-02f, -1.544725782e-02f, +1.470646693e-01f, +3.284457292e-01f, +3.757020336e-01f, +2.456603330e-01f, +5.427598051e-02f, -5.349467921e-02f, -4.654987033e-02f, +5.112106557e-04f, +1.933799402e-02f, +8.281610454e-03f, -3.197865053e-03f, -3.505092707e-03f, - /* 20,13 */ -1.577606548e-03f, -4.420601658e-03f, +4.690483654e-04f, +1.486058724e-02f, +1.611719780e-02f, -1.922814732e-02f, -6.012863981e-02f, -2.200314505e-02f, +1.347297046e-01f, +3.196909791e-01f, +3.784070525e-01f, +2.573230589e-01f, +6.489576800e-02f, -5.052030051e-02f, -4.914254142e-02f, -1.984565051e-03f, +1.931089692e-02f, +9.259646102e-03f, -2.828715617e-03f, -3.693729756e-03f, - /* 20,14 */ -1.376799150e-03f, -4.362323551e-03f, -2.069933478e-04f, +1.399907244e-02f, +1.703673197e-02f, -1.615031726e-02f, -5.896552129e-02f, -2.804532708e-02f, +1.225315522e-01f, +3.104047352e-01f, +3.803470604e-01f, +2.686929243e-01f, +7.585987841e-02f, -4.704785126e-02f, -5.155911253e-02f, -4.608279480e-03f, +1.914947854e-02f, +1.023778220e-02f, -2.407896178e-03f, -3.867923854e-03f, - /* 20,15 */ -1.184613130e-03f, -4.274968522e-03f, -8.338854378e-04f, +1.309754391e-02f, +1.779561475e-02f, -1.313424017e-02f, -5.750258783e-02f, -3.357053763e-02f, +1.105090175e-01f, +3.006231905e-01f, +3.815142140e-01f, +2.797272456e-01f, +8.713841011e-02f, -4.306909662e-02f, -5.377462232e-02f, -7.349314558e-03f, +1.884704309e-02f, +1.120868183e-02f, -1.935046598e-03f, -4.024812873e-03f, - /* 20, 0 */ -1.329352252e-03f, -4.865562069e-03f, +1.662947600e-03f, +1.893743982e-02f, +1.052975469e-02f, -4.314924294e-02f, -6.168215525e-02f, +6.793829558e-02f, +3.007295231e-01f, +4.214013440e-01f, +3.007295231e-01f, +6.793829558e-02f, -6.168215525e-02f, -4.314924294e-02f, +1.052975469e-02f, +1.893743982e-02f, +1.662947600e-03f, -4.865562069e-03f, -1.329352252e-03f, +0.000000000e+00f, - /* 20, 1 */ -1.106503038e-03f, -4.784011640e-03f, +7.620481209e-04f, +1.810159639e-02f, +1.258770510e-02f, -3.946126222e-02f, -6.412166469e-02f, +5.516844650e-02f, +2.870012762e-01f, +4.208780002e-01f, +3.139874692e-01f, +8.118253044e-02f, -5.860314053e-02f, -4.671882663e-02f, +8.254179692e-03f, +1.967037055e-02f, +2.622520317e-03f, -4.905078775e-03f, -1.565095816e-03f, +0.000000000e+00f, - /* 20, 2 */ -8.979094201e-04f, -4.664743082e-03f, -7.633034189e-05f, +1.717630323e-02f, +1.442449893e-02f, -3.568911340e-02f, -6.594250862e-02f, +4.291292121e-02f, +2.728656387e-01f, +4.193105477e-01f, +3.267137817e-01f, +9.485763802e-02f, -5.486676259e-02f, -5.013477905e-02f, +5.766539049e-03f, +2.028700325e-02f, +3.636071544e-03f, -4.898357639e-03f, -1.812078842e-03f, +3.513221827e-04f, - /* 20, 3 */ -7.046452899e-04f, -4.512131585e-03f, -8.491713087e-04f, +1.617498084e-02f, +1.603855621e-02f, -3.186582692e-02f, -6.716828458e-02f, +3.120792005e-02f, +2.583867198e-01f, +4.167067067e-01f, +3.388490774e-01f, +1.089167196e-01f, -5.045835457e-02f, -5.336106841e-02f, +3.074480429e-03f, +2.077415592e-02f, +4.698051453e-03f, -4.841360048e-03f, -2.068349661e-03f, +3.288882594e-04f, - /* 20, 4 */ -5.275063595e-04f, -4.330562617e-03f, -1.554266965e-03f, +1.511089362e-02f, +1.743016199e-02f, -2.802305698e-02f, -6.782511100e-02f, +2.008577030e-02f, +2.436294448e-01f, +4.130792899e-01f, +3.503362849e-01f, +1.233097059e-01f, -4.536663323e-02f, -5.636108634e-02f, +1.877878266e-04f, +2.111898038e-02f, +5.802054958e-03f, -4.730268616e-03f, -2.331660076e-03f, +2.941732022e-04f, - /* 20, 5 */ -3.670219514e-04f, -4.124385552e-03f, -2.190189120e-03f, +1.399704337e-02f, +1.860136846e-02f, -2.419092016e-02f, -6.794137953e-02f, +9.574818877e-03f, +2.286591711e-01f, +4.084461208e-01f, +3.611209950e-01f, +1.379835966e-01f, -3.958387309e-02f, -5.909788086e-02f, -2.881585959e-03f, +2.130909659e-02f, +6.940829951e-03f, -4.561544087e-03f, -2.599469210e-03f, +2.461206998e-04f, - /* 20, 6 */ -2.234691091e-04f, -3.897870552e-03f, -2.756254356e-03f, +1.284607053e-02f, +1.955588746e-02f, -2.039785121e-02f, -6.754749865e-02f, -3.006469464e-04f, +2.135413047e-01f, +4.028299211e-01f, +3.711517965e-01f, +1.528827232e-01f, -3.310606021e-02f, -6.153439984e-02f, -6.119502817e-03f, +2.133272965e-02f, +8.106294302e-03f, -4.331982887e-03f, -2.868951124e-03f, +1.837671888e-04f, - /* 20, 7 */ -9.688872179e-05f, -3.655168976e-03f, -3.252484018e-03f, +1.167016373e-02f, +2.029897446e-02f, -1.667047641e-02f, -6.667563061e-02f, -9.520450398e-03f, +1.983409219e-01f, +3.962581664e-01f, +3.803805952e-01f, +1.679490334e-01f, -2.593302438e-02f, -6.363374348e-02f, -9.509639499e-03f, +2.117884859e-02f, +9.289561904e-03f, -4.038774728e-03f, -3.137006363e-03f, +1.062635081e-04f, - /* 20, 8 */ +1.289664191e-05f, -3.400277535e-03f, -3.679559671e-03f, +1.048097797e-02f, +2.083730557e-02f, -1.303350512e-02f, -6.535942396e-02f, -1.806854797e-02f, +1.831223958e-01f, +3.887629129e-01f, +3.887629129e-01f, +1.831223958e-01f, -1.806854797e-02f, -6.535942396e-02f, -1.303350512e-02f, +2.083730557e-02f, +1.048097797e-02f, -3.679559671e-03f, -3.400277535e-03f, +1.289664191e-05f, - /* 20, 9 */ +1.062635081e-04f, -3.137006363e-03f, -4.038774728e-03f, +9.289561904e-03f, +2.117884859e-02f, -9.509639499e-03f, -6.363374348e-02f, -2.593302438e-02f, +1.679490334e-01f, +3.803805952e-01f, +3.962581664e-01f, +1.983409219e-01f, -9.520450398e-03f, -6.667563061e-02f, -1.667047641e-02f, +2.029897446e-02f, +1.167016373e-02f, -3.252484018e-03f, -3.655168976e-03f, -9.688872179e-05f, - /* 20,10 */ +1.837671888e-04f, -2.868951124e-03f, -4.331982887e-03f, +8.106294302e-03f, +2.133272965e-02f, -6.119502817e-03f, -6.153439984e-02f, -3.310606021e-02f, +1.528827232e-01f, +3.711517965e-01f, +4.028299211e-01f, +2.135413047e-01f, -3.006469464e-04f, -6.754749865e-02f, -2.039785121e-02f, +1.955588746e-02f, +1.284607053e-02f, -2.756254356e-03f, -3.897870552e-03f, -2.234691091e-04f, - /* 20,11 */ +2.461206998e-04f, -2.599469210e-03f, -4.561544087e-03f, +6.940829951e-03f, +2.130909659e-02f, -2.881585959e-03f, -5.909788086e-02f, -3.958387309e-02f, +1.379835966e-01f, +3.611209950e-01f, +4.084461208e-01f, +2.286591711e-01f, +9.574818877e-03f, -6.794137953e-02f, -2.419092016e-02f, +1.860136846e-02f, +1.399704337e-02f, -2.190189120e-03f, -4.124385552e-03f, -3.670219514e-04f, - /* 20,12 */ +2.941732022e-04f, -2.331660076e-03f, -4.730268616e-03f, +5.802054958e-03f, +2.111898038e-02f, +1.877878266e-04f, -5.636108634e-02f, -4.536663323e-02f, +1.233097059e-01f, +3.503362849e-01f, +4.130792899e-01f, +2.436294448e-01f, +2.008577030e-02f, -6.782511100e-02f, -2.802305698e-02f, +1.743016199e-02f, +1.511089362e-02f, -1.554266965e-03f, -4.330562617e-03f, -5.275063595e-04f, - /* 20,13 */ +3.288882594e-04f, -2.068349661e-03f, -4.841360048e-03f, +4.698051453e-03f, +2.077415592e-02f, +3.074480429e-03f, -5.336106841e-02f, -5.045835457e-02f, +1.089167196e-01f, +3.388490774e-01f, +4.167067067e-01f, +2.583867198e-01f, +3.120792005e-02f, -6.716828458e-02f, -3.186582692e-02f, +1.603855621e-02f, +1.617498084e-02f, -8.491713087e-04f, -4.512131585e-03f, -7.046452899e-04f, - /* 20,14 */ +3.513221827e-04f, -1.812078842e-03f, -4.898357639e-03f, +3.636071544e-03f, +2.028700325e-02f, +5.766539049e-03f, -5.013477905e-02f, -5.486676259e-02f, +9.485763802e-02f, +3.267137817e-01f, +4.193105477e-01f, +2.728656387e-01f, +4.291292121e-02f, -6.594250862e-02f, -3.568911340e-02f, +1.442449893e-02f, +1.717630323e-02f, -7.633034189e-05f, -4.664743082e-03f, -8.979094201e-04f, - /* 20,15 */ +0.000000000e+00f, -1.565095816e-03f, -4.905078775e-03f, +2.622520317e-03f, +1.967037055e-02f, +8.254179692e-03f, -4.671882663e-02f, -5.860314053e-02f, +8.118253044e-02f, +3.139874692e-01f, +4.208780002e-01f, +2.870012762e-01f, +5.516844650e-02f, -6.412166469e-02f, -3.946126222e-02f, +1.258770510e-02f, +1.810159639e-02f, +7.620481209e-04f, -4.784011640e-03f, -1.106503038e-03f, - /* 20, 0 */ +3.735125865e-04f, -2.550984103e-03f, -4.871486096e-03f, +1.016287769e-02f, +2.252246682e-02f, -2.231523982e-02f, -7.431762424e-02f, +3.414137659e-02f, +3.062278786e-01f, +4.608988972e-01f, +3.062278786e-01f, +3.414137659e-02f, -7.431762424e-02f, -2.231523982e-02f, +2.252246682e-02f, +1.016287769e-02f, -4.871486096e-03f, -2.550984103e-03f, +3.735125865e-04f, +0.000000000e+00f, - /* 20, 1 */ +3.929324583e-04f, -2.236335973e-03f, -5.106050653e-03f, +8.748210493e-03f, +2.303691111e-02f, -1.786093260e-02f, -7.411924916e-02f, +2.086992015e-02f, +2.890848421e-01f, +4.602142272e-01f, +3.228796668e-01f, +4.817530421e-02f, -7.382833631e-02f, -2.685541297e-02f, +2.174514756e-02f, +1.158816420e-02f, -4.555417854e-03f, -2.871502680e-03f, +3.387491377e-04f, +0.000000000e+00f, - /* 20, 2 */ +0.000000000e+00f, -1.931175707e-03f, -5.263447672e-03f, +7.357928950e-03f, +2.330080531e-02f, -1.352771902e-02f, -7.327813327e-02f, +8.401230311e-03f, +2.715429904e-01f, +4.581642525e-01f, +3.389493512e-01f, +6.292517925e-02f, -7.260941515e-02f, -3.144322519e-02f, +2.069454672e-02f, +1.300917115e-02f, -4.154170312e-03f, -3.193828376e-03f, +2.870815261e-04f, +0.000000000e+00f, - /* 20, 3 */ +0.000000000e+00f, -1.638662038e-03f, -5.348575554e-03f, +6.004591146e-03f, +2.332816092e-02f, -9.347674729e-03f, -7.184169597e-02f, -3.230759097e-03f, +2.536956771e-01f, +4.547610488e-01f, +3.543483057e-01f, +7.833843581e-02f, -7.062228683e-02f, -3.603763775e-02f, +1.936240016e-02f, +1.440996064e-02f, -3.664825055e-03f, -3.513472060e-03f, +2.170808154e-04f, +0.000000000e+00f, - /* 20, 4 */ +0.000000000e+00f, -1.361489293e-03f, -5.366796329e-03f, +4.699488665e-03f, +2.313444000e-02f, -5.349604768e-03f, -6.985939290e-02f, -1.399855627e-02f, +2.356365195e-01f, +4.500246402e-01f, +3.689907742e-01f, +9.435670405e-02f, -6.783220328e-02f, -4.059502103e-02f, +1.774280068e-02f, +1.577366666e-02f, -3.085314600e-03f, -3.825546457e-03f, +1.274866066e-04f, +0.000000000e+00f, - /* 20, 5 */ +0.000000000e+00f, -1.101888322e-03f, -5.323837897e-03f, +3.452605627e-03f, +2.273631696e-02f, -1.558959414e-03f, -6.738225311e-02f, -2.388113922e-02f, +2.174587480e-01f, +4.439828472e-01f, +3.827944964e-01f, +1.109160995e-01f, -6.420865295e-02f, -4.506940842e-02f, +1.583239979e-02f, +1.708262332e-02f, -2.414511840e-03f, -4.124801502e-03f, +1.724424543e-05f, +0.000000000e+00f, - /* 20, 6 */ +0.000000000e+00f, -8.616336525e-04f, -5.225698259e-03f, +2.272594520e-03f, +2.215144089e-02f, +2.002216238e-03f, -6.446241843e-02f, -3.286393171e-02f, +1.992545658e-01f, +4.366710759e-01f, +3.956813102e-01f, +1.279475618e-01f, -5.972574809e-02f, -4.941278189e-02f, +1.363059437e-02f, +1.831850983e-02f, -1.652313816e-03f, -4.405667401e-03f, -1.144582079e-04f, +0.000000000e+00f, - /* 20, 7 */ +0.000000000e+00f, -6.420563626e-04f, -5.078552799e-03f, +1.166768183e-03f, +2.139820068e-02f, +5.315299677e-03f, -6.115268907e-02f, -4.093872873e-02f, +1.811145256e-01f, +4.281320500e-01f, +4.075777294e-01f, +1.453772407e-01f, -5.436258502e-02f, -5.357538755e-02f, +1.113969540e-02f, +1.946251142e-02f, -7.997184460e-04f, -4.662305323e-03f, -2.681538305e-04f, +0.000000000e+00f, - /* 20, 8 */ +0.000000000e+00f, -4.440621234e-04f, -4.888665552e-03f, +1.411071672e-04f, +2.049549532e-02f, +8.365076494e-03f, -5.750607943e-02f, -4.810357305e-02f, +1.631269271e-01f, +4.184154881e-01f, +4.184154881e-01f, +1.631269271e-01f, -4.810357305e-02f, -5.750607943e-02f, +8.365076494e-03f, +2.049549532e-02f, +1.411071672e-04f, -4.888665552e-03f, -4.440621234e-04f, +0.000000000e+00f, - /* 20, 9 */ +0.000000000e+00f, -2.681538305e-04f, -4.662305323e-03f, -7.997184460e-04f, +1.946251142e-02f, +1.113969540e-02f, -5.357538755e-02f, -5.436258502e-02f, +1.453772407e-01f, +4.075777294e-01f, +4.281320500e-01f, +1.811145256e-01f, -4.093872873e-02f, -6.115268907e-02f, +5.315299677e-03f, +2.139820068e-02f, +1.166768183e-03f, -5.078552799e-03f, -6.420563626e-04f, +0.000000000e+00f, - /* 20,10 */ +0.000000000e+00f, -1.144582079e-04f, -4.405667401e-03f, -1.652313816e-03f, +1.831850983e-02f, +1.363059437e-02f, -4.941278189e-02f, -5.972574809e-02f, +1.279475618e-01f, +3.956813102e-01f, +4.366710759e-01f, +1.992545658e-01f, -3.286393171e-02f, -6.446241843e-02f, +2.002216238e-03f, +2.215144089e-02f, +2.272594520e-03f, -5.225698259e-03f, -8.616336525e-04f, +0.000000000e+00f, - /* 20,11 */ +0.000000000e+00f, +1.724424543e-05f, -4.124801502e-03f, -2.414511840e-03f, +1.708262332e-02f, +1.583239979e-02f, -4.506940842e-02f, -6.420865295e-02f, +1.109160995e-01f, +3.827944964e-01f, +4.439828472e-01f, +2.174587480e-01f, -2.388113922e-02f, -6.738225311e-02f, -1.558959414e-03f, +2.273631696e-02f, +3.452605627e-03f, -5.323837897e-03f, -1.101888322e-03f, +0.000000000e+00f, - /* 20,12 */ +0.000000000e+00f, +1.274866066e-04f, -3.825546457e-03f, -3.085314600e-03f, +1.577366666e-02f, +1.774280068e-02f, -4.059502103e-02f, -6.783220328e-02f, +9.435670405e-02f, +3.689907742e-01f, +4.500246402e-01f, +2.356365195e-01f, -1.399855627e-02f, -6.985939290e-02f, -5.349604768e-03f, +2.313444000e-02f, +4.699488665e-03f, -5.366796329e-03f, -1.361489293e-03f, +0.000000000e+00f, - /* 20,13 */ +0.000000000e+00f, +2.170808154e-04f, -3.513472060e-03f, -3.664825055e-03f, +1.440996064e-02f, +1.936240016e-02f, -3.603763775e-02f, -7.062228683e-02f, +7.833843581e-02f, +3.543483057e-01f, +4.547610488e-01f, +2.536956771e-01f, -3.230759097e-03f, -7.184169597e-02f, -9.347674729e-03f, +2.332816092e-02f, +6.004591146e-03f, -5.348575554e-03f, -1.638662038e-03f, +0.000000000e+00f, - /* 20,14 */ +0.000000000e+00f, +2.870815261e-04f, -3.193828376e-03f, -4.154170312e-03f, +1.300917115e-02f, +2.069454672e-02f, -3.144322519e-02f, -7.260941515e-02f, +6.292517925e-02f, +3.389493512e-01f, +4.581642525e-01f, +2.715429904e-01f, +8.401230311e-03f, -7.327813327e-02f, -1.352771902e-02f, +2.330080531e-02f, +7.357928950e-03f, -5.263447672e-03f, -1.931175707e-03f, +0.000000000e+00f, - /* 20,15 */ +0.000000000e+00f, +3.387491377e-04f, -2.871502680e-03f, -4.555417854e-03f, +1.158816420e-02f, +2.174514756e-02f, -2.685541297e-02f, -7.382833631e-02f, +4.817530421e-02f, +3.228796668e-01f, +4.602142272e-01f, +2.890848421e-01f, +2.086992015e-02f, -7.411924916e-02f, -1.786093260e-02f, +2.303691111e-02f, +8.748210493e-03f, -5.106050653e-03f, -2.236335973e-03f, +3.929324583e-04f, - /* 16, 0 */ -4.898743621e-03f, -8.679086087e-05f, +2.336043359e-02f, +2.135055302e-04f, -7.556698393e-02f, -3.418085064e-04f, +3.068350485e-01f, +5.003964504e-01f, +3.068350485e-01f, -3.418085064e-04f, -7.556698393e-02f, +2.135055302e-04f, +2.336043359e-02f, -8.679086087e-05f, -4.898743621e-03f, +1.466795211e-05f, - /* 16, 1 */ -4.577177643e-03f, -1.168030162e-03f, +2.231338881e-02f, +4.259286102e-03f, -7.256190983e-02f, -1.325523148e-02f, +2.859961851e-01f, +4.995203198e-01f, +3.272077887e-01f, +1.366916740e-02f, -7.794631959e-02f, -4.137969722e-03f, +2.421268789e-02f, +1.104119466e-03f, -5.186216174e-03f, -1.424716020e-04f, - /* 16, 2 */ -4.229744004e-03f, -2.135347302e-03f, +2.109817837e-02f, +7.975999347e-03f, -6.900371451e-02f, -2.503996167e-02f, +2.648211478e-01f, +4.968980143e-01f, +3.469854770e-01f, +2.873680235e-02f, -7.962890015e-02f, -8.766610174e-03f, +2.484400873e-02f, +2.398541233e-03f, -5.431090074e-03f, -3.278051009e-04f, - /* 16, 3 */ -3.864289504e-03f, -2.986316790e-03f, +1.974155805e-02f, +1.134537917e-02f, -6.496587406e-02f, -3.567459207e-02f, +2.434398342e-01f, +4.925477372e-01f, +3.660412816e-01f, +4.481051979e-02f, -8.054606315e-02f, -1.363873477e-02f, +2.522910176e-02f, +3.788344934e-03f, -5.624692566e-03f, -5.415628140e-04f, - /* 16, 4 */ -3.488195595e-03f, -3.720237037e-03f, +1.827008292e-02f, +1.435416313e-02f, -6.052200094e-02f, -4.514733704e-02f, +2.219810322e-01f, +4.864996469e-01f, +3.842515379e-01f, +6.183022559e-02f, -8.063225815e-02f, -1.871557408e-02f, +2.534390000e-02f, +5.263393235e-03f, -5.758306879e-03f, -7.834433658e-04f, - /* 16, 5 */ -3.108305495e-03f, -4.338012209e-03f, +1.670979794e-02f, +1.699394035e-02f, -5.574514781e-02f, -5.345583367e-02f, +2.005713869e-01f, +4.787955863e-01f, +4.014968013e-01f, +7.972656727e-02f, -7.982580067e-02f, -2.395339311e-02f, +2.516595041e-02f, +6.811528665e-03f, -5.823306183e-03f, -1.052565974e-03f, - /* 16, 6 */ -2.730865011e-03f, -4.842020290e-03f, +1.508595356e-02f, +1.926095418e-02f, -5.070714412e-02f, -6.060686010e-02f, +1.793344024e-01f, +4.694887096e-01f, +4.176628724e-01f, +9.842128660e-02f, -7.806961406e-02f, -2.930367505e-02f, +2.467480385e-02f, +8.418588685e-03f, -5.811296621e-03f, -1.347428958e-03f, - /* 16, 7 */ -2.361477017e-03f, -5.235970004e-03f, +1.342274837e-02f, +2.115586371e-02f, -4.547797122e-02f, -6.661597542e-02f, +1.583894867e-01f, +4.586430086e-01f, +4.326417845e-01f, +1.178276637e-01f, -7.531195111e-02f, -3.471336612e-02f, +2.385240383e-02f, +1.006844961e-02f, -5.714267850e-03f, -1.665875716e-03f, - /* 16, 8 */ -2.005069351e-03f, -5.524749278e-03f, +1.174310057e-02f, +2.268346885e-02f, -4.012518151e-02f, -7.150708699e-02f, +1.378510501e-01f, +4.463327434e-01f, +4.463327434e-01f, +1.378510501e-01f, -7.150708699e-02f, -4.012518151e-02f, +2.268346885e-02f, +1.174310057e-02f, -5.524749278e-03f, -2.005069351e-03f, - /* 16, 9 */ -1.665875716e-03f, -5.714267850e-03f, +1.006844961e-02f, +2.385240383e-02f, -3.471336612e-02f, -7.531195111e-02f, +1.178276637e-01f, +4.326417845e-01f, +4.586430086e-01f, +1.583894867e-01f, -6.661597542e-02f, -4.547797122e-02f, +2.115586371e-02f, +1.342274837e-02f, -5.235970004e-03f, -2.361477017e-03f, - /* 16,10 */ -1.347428958e-03f, -5.811296621e-03f, +8.418588685e-03f, +2.467480385e-02f, -2.930367505e-02f, -7.806961406e-02f, +9.842128660e-02f, +4.176628724e-01f, +4.694887096e-01f, +1.793344024e-01f, -6.060686010e-02f, -5.070714412e-02f, +1.926095418e-02f, +1.508595356e-02f, -4.842020290e-03f, -2.730865011e-03f, - /* 16,11 */ -1.052565974e-03f, -5.823306183e-03f, +6.811528665e-03f, +2.516595041e-02f, -2.395339311e-02f, -7.982580067e-02f, +7.972656727e-02f, +4.014968013e-01f, +4.787955863e-01f, +2.005713869e-01f, -5.345583367e-02f, -5.574514781e-02f, +1.699394035e-02f, +1.670979794e-02f, -4.338012209e-03f, -3.108305495e-03f, - /* 16,12 */ -7.834433658e-04f, -5.758306879e-03f, +5.263393235e-03f, +2.534390000e-02f, -1.871557408e-02f, -8.063225815e-02f, +6.183022559e-02f, +3.842515379e-01f, +4.864996469e-01f, +2.219810322e-01f, -4.514733704e-02f, -6.052200094e-02f, +1.435416313e-02f, +1.827008292e-02f, -3.720237037e-03f, -3.488195595e-03f, - /* 16,13 */ -5.415628140e-04f, -5.624692566e-03f, +3.788344934e-03f, +2.522910176e-02f, -1.363873477e-02f, -8.054606315e-02f, +4.481051979e-02f, +3.660412816e-01f, +4.925477372e-01f, +2.434398342e-01f, -3.567459207e-02f, -6.496587406e-02f, +1.134537917e-02f, +1.974155805e-02f, -2.986316790e-03f, -3.864289504e-03f, - /* 16,14 */ -3.278051009e-04f, -5.431090074e-03f, +2.398541233e-03f, +2.484400873e-02f, -8.766610174e-03f, -7.962890015e-02f, +2.873680235e-02f, +3.469854770e-01f, +4.968980143e-01f, +2.648211478e-01f, -2.503996167e-02f, -6.900371451e-02f, +7.975999347e-03f, +2.109817837e-02f, -2.135347302e-03f, -4.229744004e-03f, - /* 16,15 */ -1.424716020e-04f, -5.186216174e-03f, +1.104119466e-03f, +2.421268789e-02f, -4.137969722e-03f, -7.794631959e-02f, +1.366916740e-02f, +3.272077887e-01f, +4.995203198e-01f, +2.859961851e-01f, -1.325523148e-02f, -7.256190983e-02f, +4.259286102e-03f, +2.231338881e-02f, -1.168030162e-03f, -4.577177643e-03f, - /* 16, 0 */ -1.854349243e-03f, -5.842655877e-03f, +1.571555836e-02f, +1.847159410e-02f, -6.634453543e-02f, -3.320569278e-02f, +3.025932104e-01f, +5.398940036e-01f, +3.025932104e-01f, -3.320569278e-02f, -6.634453543e-02f, +1.847159410e-02f, +1.571555836e-02f, -5.842655877e-03f, -1.854349243e-03f, +0.000000000e+00f, - /* 16, 1 */ -1.480579358e-03f, -6.106700866e-03f, +1.376986381e-02f, +2.107103425e-02f, -6.084498265e-02f, -4.482173865e-02f, +2.778559558e-01f, +5.387937054e-01f, +3.269511876e-01f, -2.013603096e-02f, -7.140657205e-02f, +1.540395578e-02f, +1.762103499e-02f, -5.450677830e-03f, -2.253515747e-03f, +0.000000000e+00f, - /* 16, 2 */ -1.136163241e-03f, -6.251562574e-03f, +1.181432209e-02f, +2.320368920e-02f, -5.500558000e-02f, -5.497544958e-02f, +2.529151163e-01f, +5.355017071e-01f, +3.507537104e-01f, -5.635398845e-03f, -7.593183970e-02f, +1.187314151e-02f, +1.945395611e-02f, -4.923375547e-03f, -2.673102395e-03f, +0.000000000e+00f, - /* 16, 3 */ -8.240613879e-04f, -6.287094834e-03f, +9.877041313e-03f, +2.487696888e-02f, -4.892141083e-02f, -6.367164518e-02f, +2.279442418e-01f, +5.300446041e-01f, +3.738258052e-01f, +1.025938806e-02f, -7.982055919e-02f, +7.890985370e-03f, +2.118036474e-02f, -4.254967852e-03f, -3.107109230e-03f, +0.000000000e+00f, - /* 16, 4 */ -5.462770218e-04f, -6.224002243e-03f, +7.983624178e-03f, +2.610378910e-02f, -4.268405269e-02f, -7.092815895e-02f, +2.031131300e-01f, +5.224664143e-01f, +3.959953988e-01f, +2.749725254e-02f, -8.297353764e-02f, +3.476439880e-03f, +2.276508169e-02f, -3.441527233e-03f, -3.548528769e-03f, +4.634120047e-04f, - /* 16, 5 */ -3.039101756e-04f, -6.073592210e-03f, +6.156978545e-03f, +2.690203687e-02f, -3.638073666e-02f, -7.677518685e-02f, +1.785862812e-01f, +5.128281199e-01f, +4.170950072e-01f, +4.601292009e-02f, -8.529332152e-02f, -1.344195268e-03f, +2.417214928e-02f, -2.481210963e-03f, -3.989383394e-03f, +4.400286560e-04f, - /* 16, 6 */ -9.722433303e-05f, -5.847536081e-03f, +4.417180930e-03f, +2.729400173e-02f, -3.009359622e-02f, -8.125451993e-02f, +1.545214364e-01f, +5.012070337e-01f, +4.369633957e-01f, +6.572714234e-02f, -8.668537697e-02f, -6.537129252e-03f, +2.536531778e-02f, -1.374474827e-03f, -4.420785166e-03f, +3.921992729e-04f, - /* 16, 7 */ +7.427658644e-05f, -5.557642708e-03f, +2.781391675e-03f, +2.730578215e-02f, -2.389901141e-02f, -8.441867356e-02f, +1.310682124e-01f, +4.876959980e-01f, +4.554471907e-01f, +8.654708074e-02f, -8.705928349e-02f, -1.206102709e-02f, +2.630856978e-02f, -1.242645535e-04f, -4.833018707e-03f, +3.169896142e-04f, - /* 16, 8 */ +2.117631665e-04f, -5.215647395e-03f, +1.263819875e-03f, +2.696667686e-02f, -1.786705263e-02f, -8.632992647e-02f, +1.083668491e-01f, +4.724024249e-01f, +4.724024249e-01f, +1.083668491e-01f, -8.632992647e-02f, -1.786705263e-02f, +2.696667686e-02f, +1.263819875e-03f, -5.215647395e-03f, +2.117631665e-04f, - /* 16, 9 */ +3.169896142e-04f, -4.833018707e-03f, -1.242645535e-04f, +2.630856978e-02f, -1.206102709e-02f, -8.705928349e-02f, +8.654708074e-02f, +4.554471907e-01f, +4.876959980e-01f, +1.310682124e-01f, -8.441867356e-02f, -2.389901141e-02f, +2.730578215e-02f, +2.781391675e-03f, -5.557642708e-03f, +7.427658644e-05f, - /* 16,10 */ +3.921992729e-04f, -4.420785166e-03f, -1.374474827e-03f, +2.536531778e-02f, -6.537129252e-03f, -8.668537697e-02f, +6.572714234e-02f, +4.369633957e-01f, +5.012070337e-01f, +1.545214364e-01f, -8.125451993e-02f, -3.009359622e-02f, +2.729400173e-02f, +4.417180930e-03f, -5.847536081e-03f, -9.722433303e-05f, - /* 16,11 */ +4.400286560e-04f, -3.989383394e-03f, -2.481210963e-03f, +2.417214928e-02f, -1.344195268e-03f, -8.529332152e-02f, +4.601292009e-02f, +4.170950072e-01f, +5.128281199e-01f, +1.785862812e-01f, -7.677518685e-02f, -3.638073666e-02f, +2.690203687e-02f, +6.156978545e-03f, -6.073592210e-03f, -3.039101756e-04f, - /* 16,12 */ +4.634120047e-04f, -3.548528769e-03f, -3.441527233e-03f, +2.276508169e-02f, +3.476439880e-03f, -8.297353764e-02f, +2.749725254e-02f, +3.959953988e-01f, +5.224664143e-01f, +2.031131300e-01f, -7.092815895e-02f, -4.268405269e-02f, +2.610378910e-02f, +7.983624178e-03f, -6.224002243e-03f, -5.462770218e-04f, - /* 16,13 */ +0.000000000e+00f, -3.107109230e-03f, -4.254967852e-03f, +2.118036474e-02f, +7.890985370e-03f, -7.982055919e-02f, +1.025938806e-02f, +3.738258052e-01f, +5.300446041e-01f, +2.279442418e-01f, -6.367164518e-02f, -4.892141083e-02f, +2.487696888e-02f, +9.877041313e-03f, -6.287094834e-03f, -8.240613879e-04f, - /* 16,14 */ +0.000000000e+00f, -2.673102395e-03f, -4.923375547e-03f, +1.945395611e-02f, +1.187314151e-02f, -7.593183970e-02f, -5.635398845e-03f, +3.507537104e-01f, +5.355017071e-01f, +2.529151163e-01f, -5.497544958e-02f, -5.500558000e-02f, +2.320368920e-02f, +1.181432209e-02f, -6.251562574e-03f, -1.136163241e-03f, - /* 16,15 */ +0.000000000e+00f, -2.253515747e-03f, -5.450677830e-03f, +1.762103499e-02f, +1.540395578e-02f, -7.140657205e-02f, -2.013603096e-02f, +3.269511876e-01f, +5.387937054e-01f, +2.778559558e-01f, -4.482173865e-02f, -6.084498265e-02f, +2.107103425e-02f, +1.376986381e-02f, -6.106700866e-03f, -1.480579358e-03f, - /* 16, 0 */ +2.517634455e-04f, -5.956310854e-03f, +5.008864062e-03f, +2.864631470e-02f, -4.909056125e-02f, -6.235528720e-02f, +2.936293584e-01f, +5.793915568e-01f, +2.936293584e-01f, -6.235528720e-02f, -4.909056125e-02f, +2.864631470e-02f, +5.008864062e-03f, -5.956310854e-03f, +2.517634455e-04f, +0.000000000e+00f, - /* 16, 1 */ +3.647589216e-04f, -5.559366521e-03f, +3.110945653e-03f, +2.922667528e-02f, -4.185408685e-02f, -7.174125192e-02f, +2.648835910e-01f, +5.780318135e-01f, +3.221602930e-01f, -5.117389488e-02f, -5.619351824e-02f, +2.755457966e-02f, +7.032385926e-03f, -6.289189967e-03f, +9.939782505e-05f, +0.000000000e+00f, - /* 16, 2 */ +4.414886472e-04f, -5.113535158e-03f, +1.357910925e-03f, +2.932892142e-02f, -3.459618474e-02f, -7.936172697e-02f, +2.361522790e-01f, +5.739652427e-01f, +3.502436629e-01f, -3.818535953e-02f, -6.304412145e-02f, +2.592390265e-02f, +9.158035052e-03f, -6.542440674e-03f, -9.477253367e-05f, +0.000000000e+00f, - /* 16, 3 */ +4.855802427e-04f, -4.633347213e-03f, -2.351453324e-04f, +2.899108127e-02f, -2.742112952e-02f, -8.526380919e-02f, +2.076588264e-01f, +5.672296697e-01f, +3.776458156e-01f, -2.339704980e-02f, -6.951800781e-02f, +2.373330296e-02f, +1.135820669e-02f, -6.700410184e-03f, -3.323676319e-04f, +0.000000000e+00f, - /* 16, 4 */ +0.000000000e+00f, -4.132457962e-03f, -1.657230762e-03f, +2.825501306e-02f, -2.042447313e-02f, -8.951050933e-02f, +1.796184274e-01f, +5.578876325e-01f, +4.041347532e-01f, -6.836060229e-03f, -7.548664793e-02f, +2.096923455e-02f, +1.360131724e-02f, -6.747680557e-03f, -6.140535745e-04f, +0.000000000e+00f, - /* 16, 5 */ +0.000000000e+00f, -3.623457200e-03f, -2.901306411e-03f, +2.716546883e-02f, -1.369230379e-02f, -9.217934767e-02f, +1.522358833e-01f, +5.460256322e-01f, +4.294827240e-01f, +1.145038182e-02f, -8.081883229e-02f, +1.762637069e-02f, +1.585203938e-02f, -6.669417793e-03f, -9.394126333e-04f, +0.000000000e+00f, - /* 16, 6 */ +0.000000000e+00f, -3.117716971e-03f, -3.964078879e-03f, +2.576917487e-02f, -7.300675124e-03f, -9.336081470e-02f, +1.257035893e-01f, +5.317530991e-01f, +4.534687988e-01f, +3.139475616e-02f, -8.538226676e-02f, +1.370830904e-02f, +1.807162423e-02f, -6.451740247e-03f, -1.306826648e-03f, +0.000000000e+00f, - /* 16, 7 */ +0.000000000e+00f, -2.625277441e-03f, -4.845741482e-03f, +2.411394259e-02f, -1.315205805e-03f, -9.315672206e-02f, +1.001997139e-01f, +5.152010878e-01f, +4.758813956e-01f, +5.290934542e-02f, -8.904525833e-02f, +9.228181275e-03f, +2.021831098e-02f, -6.082100328e-03f, -1.713377737e-03f, +0.000000000e+00f, - /* 16, 8 */ +0.000000000e+00f, -2.154770219e-03f, -5.549672684e-03f, +2.224782226e-02f, +4.209152176e-03f, -9.167847004e-02f, +7.588659143e-02f, +4.965207199e-01f, +4.965207199e-01f, +7.588659143e-02f, -9.167847004e-02f, +4.209152176e-03f, +2.224782226e-02f, -5.549672684e-03f, -2.154770219e-03f, +0.000000000e+00f, - /* 16, 9 */ +0.000000000e+00f, -1.713377737e-03f, -6.082100328e-03f, +2.021831098e-02f, +9.228181275e-03f, -8.904525833e-02f, +5.290934542e-02f, +4.758813956e-01f, +5.152010878e-01f, +1.001997139e-01f, -9.315672206e-02f, -1.315205805e-03f, +2.411394259e-02f, -4.845741482e-03f, -2.625277441e-03f, +0.000000000e+00f, - /* 16,10 */ +0.000000000e+00f, -1.306826648e-03f, -6.451740247e-03f, +1.807162423e-02f, +1.370830904e-02f, -8.538226676e-02f, +3.139475616e-02f, +4.534687988e-01f, +5.317530991e-01f, +1.257035893e-01f, -9.336081470e-02f, -7.300675124e-03f, +2.576917487e-02f, -3.964078879e-03f, -3.117716971e-03f, +0.000000000e+00f, - /* 16,11 */ +0.000000000e+00f, -9.394126333e-04f, -6.669417793e-03f, +1.585203938e-02f, +1.762637069e-02f, -8.081883229e-02f, +1.145038182e-02f, +4.294827240e-01f, +5.460256322e-01f, +1.522358833e-01f, -9.217934767e-02f, -1.369230379e-02f, +2.716546883e-02f, -2.901306411e-03f, -3.623457200e-03f, +0.000000000e+00f, - /* 16,12 */ +0.000000000e+00f, -6.140535745e-04f, -6.747680557e-03f, +1.360131724e-02f, +2.096923455e-02f, -7.548664793e-02f, -6.836060229e-03f, +4.041347532e-01f, +5.578876325e-01f, +1.796184274e-01f, -8.951050933e-02f, -2.042447313e-02f, +2.825501306e-02f, -1.657230762e-03f, -4.132457962e-03f, +0.000000000e+00f, - /* 16,13 */ +0.000000000e+00f, -3.323676319e-04f, -6.700410184e-03f, +1.135820669e-02f, +2.373330296e-02f, -6.951800781e-02f, -2.339704980e-02f, +3.776458156e-01f, +5.672296697e-01f, +2.076588264e-01f, -8.526380919e-02f, -2.742112952e-02f, +2.899108127e-02f, -2.351453324e-04f, -4.633347213e-03f, +4.855802427e-04f, - /* 16,14 */ +0.000000000e+00f, -9.477253367e-05f, -6.542440674e-03f, +9.158035052e-03f, +2.592390265e-02f, -6.304412145e-02f, -3.818535953e-02f, +3.502436629e-01f, +5.739652427e-01f, +2.361522790e-01f, -7.936172697e-02f, -3.459618474e-02f, +2.932892142e-02f, +1.357910925e-03f, -5.113535158e-03f, +4.414886472e-04f, - /* 16,15 */ +0.000000000e+00f, +9.939782505e-05f, -6.289189967e-03f, +7.032385926e-03f, +2.755457966e-02f, -5.619351824e-02f, -5.117389488e-02f, +3.221602930e-01f, +5.780318135e-01f, +2.648835910e-01f, -7.174125192e-02f, -4.185408685e-02f, +2.922667528e-02f, +3.110945653e-03f, -5.559366521e-03f, +3.647589216e-04f, - /* 12, 0 */ -3.638165547e-03f, +2.979985982e-02f, -2.723323293e-02f, -8.605047059e-02f, +2.801520768e-01f, +6.188891100e-01f, +2.801520768e-01f, -8.605047059e-02f, -2.723323293e-02f, +2.979985982e-02f, -3.638165547e-03f, -3.041512814e-03f, - /* 12, 1 */ -4.749738186e-03f, +2.841159300e-02f, -1.933319589e-02f, -9.237133076e-02f, +2.473915856e-01f, +6.172320760e-01f, +3.129551421e-01f, -7.764805088e-02f, -3.538029377e-02f, +3.077779188e-02f, -2.305275216e-03f, -3.612081594e-03f, - /* 12, 2 */ -5.642312008e-03f, +2.667449885e-02f, -1.178831271e-02f, -9.669686191e-02f, +2.149632830e-01f, +6.122785731e-01f, +3.455026876e-01f, -6.709962705e-02f, -4.365285408e-02f, +3.128617370e-02f, -7.534120996e-04f, -4.192641091e-03f, - /* 12, 3 */ -6.322395719e-03f, +2.465107974e-02f, -4.692548813e-03f, -9.913294928e-02f, +1.831448749e-01f, +6.040811565e-01f, +3.774917553e-01f, -5.436442589e-02f, -5.191703591e-02f, +3.126943445e-02f, +1.010002855e-03f, -4.769140004e-03f, - /* 12, 4 */ -6.800166749e-03f, +2.240361196e-02f, +1.874795505e-03f, -9.980279721e-02f, +1.521989634e-01f, +5.927266195e-01f, +4.086182709e-01f, -3.942694703e-02f, -6.002791415e-02f, +3.067703358e-02f, +2.972136287e-03f, -5.325763732e-03f, - /* 12, 5 */ -7.088917510e-03f, +1.999301835e-02f, +7.849320649e-03f, -9.884443272e-02f, +1.223701278e-01f, +5.783348068e-01f, +4.385808709e-01f, -2.229824534e-02f, -6.783107929e-02f, +2.946485483e-02f, +5.114495497e-03f, -5.845139328e-03f, - /* 12, 6 */ -7.204483224e-03f, +1.747784955e-02f, +1.318150805e-02f, -9.640809295e-02f, +9.388232321e-02f, +5.610569814e-01f, +4.670847512e-01f, -3.016864363e-03f, -7.516444191e-02f, +2.759658236e-02f, +7.412783505e-03f, -6.308600966e-03f, - /* 12, 7 */ -7.164664930e-03f, +1.491338589e-02f, +1.783645872e-02f, -9.265354184e-02f, +6.693662660e-02f, +5.410737692e-01f, +4.938454794e-01f, +1.835060492e-02f, -8.186025948e-02f, +2.504503167e-02f, +9.836867291e-03f, -6.696514785e-03f, - /* 12, 8 */ -6.988660420e-03f, +1.235086875e-02f, +2.179340724e-02f, -8.774736114e-02f, +4.170935934e-02f, +5.185927134e-01f, +5.185927134e-01f, +4.170935934e-02f, -8.774736114e-02f, +2.179340724e-02f, +1.235086875e-02f, -6.988660420e-03f, - /* 12, 9 */ -6.696514785e-03f, +9.836867291e-03f, +2.504503167e-02f, -8.186025948e-02f, +1.835060492e-02f, +4.938454794e-01f, +5.410737692e-01f, +6.693662660e-02f, -9.265354184e-02f, +1.783645872e-02f, +1.491338589e-02f, -7.164664930e-03f, - /* 12,10 */ -6.308600966e-03f, +7.412783505e-03f, +2.759658236e-02f, -7.516444191e-02f, -3.016864363e-03f, +4.670847512e-01f, +5.610569814e-01f, +9.388232321e-02f, -9.640809295e-02f, +1.318150805e-02f, +1.747784955e-02f, -7.204483224e-03f, - /* 12,11 */ -5.845139328e-03f, +5.114495497e-03f, +2.946485483e-02f, -6.783107929e-02f, -2.229824534e-02f, +4.385808709e-01f, +5.783348068e-01f, +1.223701278e-01f, -9.884443272e-02f, +7.849320649e-03f, +1.999301835e-02f, -7.088917510e-03f, - /* 12,12 */ -5.325763732e-03f, +2.972136287e-03f, +3.067703358e-02f, -6.002791415e-02f, -3.942694703e-02f, +4.086182709e-01f, +5.927266195e-01f, +1.521989634e-01f, -9.980279721e-02f, +1.874795505e-03f, +2.240361196e-02f, -6.800166749e-03f, - /* 12,13 */ -4.769140004e-03f, +1.010002855e-03f, +3.126943445e-02f, -5.191703591e-02f, -5.436442589e-02f, +3.774917553e-01f, +6.040811565e-01f, +1.831448749e-01f, -9.913294928e-02f, -4.692548813e-03f, +2.465107974e-02f, -6.322395719e-03f, - /* 12,14 */ -4.192641091e-03f, -7.534120996e-04f, +3.128617370e-02f, -4.365285408e-02f, -6.709962705e-02f, +3.455026876e-01f, +6.122785731e-01f, +2.149632830e-01f, -9.669686191e-02f, -1.178831271e-02f, +2.667449885e-02f, -5.642312008e-03f, - /* 12,15 */ -3.612081594e-03f, -2.305275216e-03f, +3.077779188e-02f, -3.538029377e-02f, -7.764805088e-02f, +3.129551421e-01f, +6.172320760e-01f, +2.473915856e-01f, -9.237133076e-02f, -1.933319589e-02f, +2.841159300e-02f, -4.749738186e-03f, - /* 12, 0 */ -7.562702671e-03f, +2.362257603e-02f, -4.531854693e-03f, -1.030173373e-01f, +2.624467795e-01f, +6.583866631e-01f, +2.624467795e-01f, -1.030173373e-01f, -4.531854693e-03f, +2.362257603e-02f, -7.562702671e-03f, -3.516889901e-04f, - /* 12, 1 */ -7.668183010e-03f, +2.087771707e-02f, +2.839059860e-03f, -1.056218320e-01f, +2.257778124e-01f, +6.563919279e-01f, +2.995227467e-01f, -9.814415944e-02f, -1.254420342e-02f, +2.617709089e-02f, -7.250906804e-03f, -7.142430143e-04f, - /* 12, 2 */ -7.590423774e-03f, +1.801705410e-02f, +9.487879886e-03f, -1.061169074e-01f, +1.898705313e-01f, +6.504316937e-01f, +3.366347146e-01f, -9.086648783e-02f, -2.109702270e-02f, +2.846338313e-02f, -6.712315500e-03f, -1.140764971e-03f, - /* 12, 3 */ -7.354275530e-03f, +1.511050856e-02f, +1.535418598e-02f, -1.046816488e-01f, +1.550586973e-01f, +6.405775033e-01f, +3.734003416e-01f, -8.107535131e-02f, -3.006937567e-02f, +3.040170317e-02f, -5.929880498e-03f, -1.628307909e-03f, - /* 12, 4 */ -6.985575046e-03f, +1.222230420e-02f, +2.039736787e-02f, -1.015111601e-01f, +1.216509697e-01f, +6.269473635e-01f, +4.094311989e-01f, -6.869168809e-02f, -3.932109040e-02f, +3.191206547e-02f, -4.890814148e-03f, -2.171433859e-03f, - /* 12, 5 */ -6.510406524e-03f, +9.410098002e-03f, +2.459585213e-02f, -9.681266365e-02f, +8.992722338e-02f, +6.097039216e-01f, +4.443382217e-01f, -5.366903171e-02f, -4.869391429e-02f, +3.291602689e-02f, -3.587389454e-03f, -2.762058981e-03f, - /* 12, 6 */ -5.954426605e-03f, +6.724324555e-03f, +2.794602403e-02f, -9.080157573e-02f, +6.013541337e-02f, +5.890519583e-01f, +4.777372670e-01f, -3.599575069e-02f, -5.801308453e-02f, +3.333857894e-02f, -2.017687876e-03f, -3.389362400e-03f, - /* 12, 7 */ -5.342264546e-03f, +4.207752570e-03f, +3.046088231e-02f, -8.369763050e-02f, +3.248902822e-02f, +5.652352421e-01f, +5.092546840e-01f, -1.569678608e-02f, -6.708930595e-02f, +3.311011989e-02f, -1.862710466e-04f, -4.039767889e-03f, - /* 12, 8 */ -4.697006242e-03f, +1.895247343e-03f, +3.216846911e-02f, -7.572111885e-02f, +7.165160645e-03f, +5.385328020e-01f, +5.385328020e-01f, +7.165160645e-03f, -7.572111885e-02f, +3.216846911e-02f, +1.895247343e-03f, -4.697006242e-03f, - /* 12, 9 */ -4.039767889e-03f, -1.862710466e-04f, +3.311011989e-02f, -6.708930595e-02f, -1.569678608e-02f, +5.092546840e-01f, +5.652352421e-01f, +3.248902822e-02f, -8.369763050e-02f, +3.046088231e-02f, +4.207752570e-03f, -5.342264546e-03f, - /* 12,10 */ -3.389362400e-03f, -2.017687876e-03f, +3.333857894e-02f, -5.801308453e-02f, -3.599575069e-02f, +4.777372670e-01f, +5.890519583e-01f, +6.013541337e-02f, -9.080157573e-02f, +2.794602403e-02f, +6.724324555e-03f, -5.954426605e-03f, - /* 12,11 */ -2.762058981e-03f, -3.587389454e-03f, +3.291602689e-02f, -4.869391429e-02f, -5.366903171e-02f, +4.443382217e-01f, +6.097039216e-01f, +8.992722338e-02f, -9.681266365e-02f, +2.459585213e-02f, +9.410098002e-03f, -6.510406524e-03f, - /* 12,12 */ -2.171433859e-03f, -4.890814148e-03f, +3.191206547e-02f, -3.932109040e-02f, -6.869168809e-02f, +4.094311989e-01f, +6.269473635e-01f, +1.216509697e-01f, -1.015111601e-01f, +2.039736787e-02f, +1.222230420e-02f, -6.985575046e-03f, - /* 12,13 */ -1.628307909e-03f, -5.929880498e-03f, +3.040170317e-02f, -3.006937567e-02f, -8.107535131e-02f, +3.734003416e-01f, +6.405775033e-01f, +1.550586973e-01f, -1.046816488e-01f, +1.535418598e-02f, +1.511050856e-02f, -7.354275530e-03f, - /* 12,14 */ -1.140764971e-03f, -6.712315500e-03f, +2.846338313e-02f, -2.109702270e-02f, -9.086648783e-02f, +3.366347146e-01f, +6.504316937e-01f, +1.898705313e-01f, -1.061169074e-01f, +9.487879886e-03f, +1.801705410e-02f, -7.590423774e-03f, - /* 12,15 */ -7.142430143e-04f, -7.250906804e-03f, +2.617709089e-02f, -1.254420342e-02f, -9.814415944e-02f, +2.995227467e-01f, +6.563919279e-01f, +2.257778124e-01f, -1.056218320e-01f, +2.839059860e-03f, +2.087771707e-02f, -7.668183010e-03f, - /* 12, 0 */ -7.009786996e-03f, +1.344312953e-02f, +1.557210222e-02f, -1.125190619e-01f, +2.408695221e-01f, +6.978842163e-01f, +2.408695221e-01f, -1.125190619e-01f, +1.557210222e-02f, +1.344312953e-02f, -7.009786996e-03f, +6.003640016e-04f, - /* 12, 1 */ -6.398742119e-03f, +1.026913982e-02f, +2.132332546e-02f, -1.110115061e-01f, +2.005160832e-01f, +6.955088069e-01f, +2.821133540e-01f, -1.117099281e-01f, +8.845385329e-03f, +1.669708199e-02f, -7.518519523e-03f, +5.590854556e-04f, - /* 12, 2 */ -5.716737920e-03f, +7.240001966e-03f, +2.606967700e-02f, -1.074325911e-01f, +1.614746033e-01f, +6.884146462e-01f, +3.237982615e-01f, -1.083606220e-01f, +1.198165974e-03f, +1.995657080e-02f, -7.892366537e-03f, +4.637249154e-04f, - /* 12, 3 */ -4.993154633e-03f, +4.410399512e-03f, +2.980590100e-02f, -1.020439692e-01f, +1.241329667e-01f, +6.766973789e-01f, +3.654537522e-01f, -1.022748781e-01f, -7.287927063e-03f, +2.313861998e-02f, -8.098411048e-03f, +3.063703263e-04f, - /* 12, 4 */ -4.254780730e-03f, +1.824453005e-03f, +3.254896791e-02f, -9.511805181e-02f, +8.884019172e-02f, +6.605145641e-01f, +4.065952670e-01f, -9.328874484e-02f, -1.650412301e-02f, +2.615301189e-02f, -8.104377377e-03f, +8.035370630e-05f, - /* 12, 5 */ -3.525333045e-03f, -4.843426812e-04f, +3.433584064e-02f, -8.693252112e-02f, +5.590207404e-02f, +6.400829406e-01f, +4.467316931e-01f, -8.127529114e-02f, -2.631456917e-02f, +2.890390773e-02f, -7.879705669e-03f, -2.193022854e-04f, - /* 12, 6 */ -2.825116890e-03f, -2.492908449e-03f, +3.522097401e-02f, -7.776502604e-02f, +2.557772128e-02f, +6.156746770e-01f, +4.853731430e-01f, -6.614880956e-02f, -3.655698883e-02f, +3.129176395e-02f, -7.396691856e-03f, -5.954441701e-04f, - /* 12, 7 */ -2.170822930e-03f, -4.188126176e-03f, +3.527362061e-02f, -6.788815999e-02f, -1.922977207e-03f, +5.876126808e-01f, +5.220388545e-01f, -4.786841211e-02f, -4.704395826e-02f, +3.321551909e-02f, -6.631665064e-03f, -1.048370326e-03f, - /* 12, 8 */ -1.575453811e-03f, -5.566170902e-03f, +3.457501660e-02f, -5.756481055e-02f, -2.644092188e-02f, +5.562650609e-01f, +5.562650609e-01f, -2.644092188e-02f, -5.756481055e-02f, +3.457501660e-02f, -5.566170902e-03f, -1.575453811e-03f, - /* 12, 9 */ -1.048370326e-03f, -6.631665064e-03f, +3.321551909e-02f, -4.704395826e-02f, -4.786841211e-02f, +5.220388545e-01f, +5.876126808e-01f, -1.922977207e-03f, -6.788815999e-02f, +3.527362061e-02f, -4.188126176e-03f, -2.170822930e-03f, - /* 12,10 */ -5.954441701e-04f, -7.396691856e-03f, +3.129176395e-02f, -3.655698883e-02f, -6.614880956e-02f, +4.853731430e-01f, +6.156746770e-01f, +2.557772128e-02f, -7.776502604e-02f, +3.522097401e-02f, -2.492908449e-03f, -2.825116890e-03f, - /* 12,11 */ -2.193022854e-04f, -7.879705669e-03f, +2.890390773e-02f, -2.631456917e-02f, -8.127529114e-02f, +4.467316931e-01f, +6.400829406e-01f, +5.590207404e-02f, -8.693252112e-02f, +3.433584064e-02f, -4.843426812e-04f, -3.525333045e-03f, - /* 12,12 */ +8.035370630e-05f, -8.104377377e-03f, +2.615301189e-02f, -1.650412301e-02f, -9.328874484e-02f, +4.065952670e-01f, +6.605145641e-01f, +8.884019172e-02f, -9.511805181e-02f, +3.254896791e-02f, +1.824453005e-03f, -4.254780730e-03f, - /* 12,13 */ +3.063703263e-04f, -8.098411048e-03f, +2.313861998e-02f, -7.287927063e-03f, -1.022748781e-01f, +3.654537522e-01f, +6.766973789e-01f, +1.241329667e-01f, -1.020439692e-01f, +2.980590100e-02f, +4.410399512e-03f, -4.993154633e-03f, - /* 12,14 */ +4.637249154e-04f, -7.892366537e-03f, +1.995657080e-02f, +1.198165974e-03f, -1.083606220e-01f, +3.237982615e-01f, +6.884146462e-01f, +1.614746033e-01f, -1.074325911e-01f, +2.606967700e-02f, +7.240001966e-03f, -5.716737920e-03f, - /* 12,15 */ +5.590854556e-04f, -7.518519523e-03f, +1.669708199e-02f, +8.845385329e-03f, -1.117099281e-01f, +2.821133540e-01f, +6.955088069e-01f, +2.005160832e-01f, -1.110115061e-01f, +2.132332546e-02f, +1.026913982e-02f, -6.398742119e-03f, - - /* 24, 0 */ +1.501390780e-03f, +3.431804419e-03f, +6.512803185e-03f, +1.091425387e-02f, +1.664594540e-02f, +2.351091132e-02f, +3.109255671e-02f, +3.878419288e-02f, +4.586050701e-02f, +5.158058002e-02f, +5.530384985e-02f, +5.659614054e-02f, +5.530384985e-02f, +5.158058002e-02f, +4.586050701e-02f, +3.878419288e-02f, +3.109255671e-02f, +2.351091132e-02f, +1.664594540e-02f, +1.091425387e-02f, +6.512803185e-03f, +3.431804419e-03f, +1.501390780e-03f, +4.573885647e-04f, - /* 24, 1 */ +1.413186400e-03f, +3.279858311e-03f, +6.282638036e-03f, +1.059932179e-02f, +1.625135142e-02f, +2.305547031e-02f, +3.060840342e-02f, +3.831365198e-02f, +4.545054680e-02f, +5.127577001e-02f, +5.513916011e-02f, +5.659104154e-02f, +5.545895049e-02f, +5.187752167e-02f, +4.626513642e-02f, +3.925233583e-02f, +3.157717954e-02f, +2.396921539e-02f, +1.704503934e-02f, +1.123445076e-02f, +6.748179094e-03f, +3.588275667e-03f, +1.593065611e-03f, +5.022154476e-04f, - /* 24, 2 */ +1.328380648e-03f, +3.132379333e-03f, +6.057656813e-03f, +1.028967374e-02f, +1.586133102e-02f, +2.260301890e-02f, +3.012488684e-02f, +3.784089895e-02f, +4.503543229e-02f, +5.096323022e-02f, +5.496495842e-02f, +5.657574693e-02f, +5.560438923e-02f, +5.216645963e-02f, +4.666426010e-02f, +3.971789474e-02f, +3.206210284e-02f, +2.443025293e-02f, +1.744855617e-02f, +1.155988996e-02f, +6.988790100e-03f, +3.749328623e-03f, +1.688282347e-03f, +5.494305796e-04f, - /* 24, 3 */ +1.246901403e-03f, +2.989308098e-03f, +5.837830254e-03f, +9.985325752e-03f, +1.547595434e-02f, +2.215368059e-02f, +2.964217216e-02f, +3.736611920e-02f, +4.461534144e-02f, +5.064310236e-02f, +5.478132634e-02f, +5.655026396e-02f, +5.574009777e-02f, +5.244726189e-02f, +4.705770477e-02f, +4.018068337e-02f, +3.254715574e-02f, +2.489389144e-02f, +1.785641537e-02f, +1.189054572e-02f, +7.234657995e-03f, +3.915018340e-03f, +1.787112015e-03f, +5.991047395e-04f, - /* 24, 4 */ +1.168676301e-03f, +2.850583915e-03f, +5.623126723e-03f, +9.686290690e-03f, +1.509528803e-02f, +2.170757578e-02f, +2.916042250e-02f, +3.688949768e-02f, +4.419045351e-02f, +5.031553118e-02f, +5.458834968e-02f, +5.651460469e-02f, +5.586601230e-02f, +5.271979985e-02f, +4.744529894e-02f, +4.064051541e-02f, +3.303216567e-02f, +2.535999546e-02f, +1.826853297e-02f, +1.222638897e-02f, +7.485801959e-03f, +4.085398290e-03f, +1.889625146e-03f, +6.513091287e-04f, - /* 24, 5 */ +1.093632798e-03f, +2.716144855e-03f, +5.413512274e-03f, +9.392578266e-03f, +1.471939531e-02f, +2.126482169e-02f, +2.867979883e-02f, +3.641121873e-02f, +4.376094899e-02f, +4.998066438e-02f, +5.438611851e-02f, +5.646878599e-02f, +5.598207354e-02f, +5.298394839e-02f, +4.782687301e-02f, +4.109720465e-02f, +3.351695842e-02f, +2.582842673e-02f, +1.868482156e-02f, +1.256738733e-02f, +7.742238512e-03f, +4.260520294e-03f, +1.995891717e-03f, +7.061153220e-04f, - /* 24, 6 */ +1.021698233e-03f, +2.585927824e-03f, +5.208950715e-03f, +9.104195104e-03f, +1.434833590e-02f, +2.082553239e-02f, +2.820045990e-02f, +3.593146595e-02f, +4.332700946e-02f, +4.963865252e-02f, +5.417472708e-02f, +5.641282954e-02f, +5.608822683e-02f, +5.323958602e-02f, +4.820225940e-02f, +4.155056502e-02f, +3.400135826e-02f, +2.629904416e-02f, +1.910519032e-02f, +1.291350505e-02f, +8.003981455e-03f, +4.440434453e-03f, +2.105981077e-03f, +7.635952183e-04f, - /* 24, 7 */ +9.527998831e-04f, +2.459868628e-03f, +5.009403670e-03f, +8.821144768e-03f, +1.398216608e-02f, +2.038981869e-02f, +2.772256216e-02f, +3.545042216e-02f, +4.288881749e-02f, +4.928964888e-02f, +5.395427373e-02f, +5.634676181e-02f, +5.618442211e-02f, +5.348659488e-02f, +4.857129262e-02f, +4.200041076e-02f, +3.448518802e-02f, +2.677170395e-02f, +1.952954505e-02f, +1.326470299e-02f, +8.271041819e-03f, +4.625189083e-03f, +2.219961884e-03f, +8.238209888e-04f, - /* 24, 8 */ +8.868650246e-04f, +2.337902042e-03f, +4.814830642e-03f, +8.543427812e-03f, +1.362093865e-02f, +1.995778816e-02f, +2.724625964e-02f, +3.496826923e-02f, +4.244655653e-02f, +4.893380942e-02f, +5.372486088e-02f, +5.627061400e-02f, +5.627061400e-02f, +5.372486088e-02f, +4.893380942e-02f, +4.244655653e-02f, +3.496826923e-02f, +2.724625964e-02f, +1.995778816e-02f, +1.362093865e-02f, +8.543427812e-03f, +4.814830642e-03f, +2.337902042e-03f, +8.868650246e-04f, - /* 24, 9 */ +8.238209888e-04f, +2.219961884e-03f, +4.625189083e-03f, +8.271041819e-03f, +1.326470299e-02f, +1.952954505e-02f, +2.677170395e-02f, +3.448518802e-02f, +4.200041076e-02f, +4.857129262e-02f, +5.348659488e-02f, +5.618442211e-02f, +5.634676181e-02f, +5.395427373e-02f, +4.928964888e-02f, +4.288881749e-02f, +3.545042216e-02f, +2.772256216e-02f, +2.038981869e-02f, +1.398216608e-02f, +8.821144768e-03f, +5.009403670e-03f, +2.459868628e-03f, +9.527998831e-04f, - /* 24,10 */ +7.635952183e-04f, +2.105981077e-03f, +4.440434453e-03f, +8.003981455e-03f, +1.291350505e-02f, +1.910519032e-02f, +2.629904416e-02f, +3.400135826e-02f, +4.155056502e-02f, +4.820225940e-02f, +5.323958602e-02f, +5.608822683e-02f, +5.641282954e-02f, +5.417472708e-02f, +4.963865252e-02f, +4.332700946e-02f, +3.593146595e-02f, +2.820045990e-02f, +2.082553239e-02f, +1.434833590e-02f, +9.104195104e-03f, +5.208950715e-03f, +2.585927824e-03f, +1.021698233e-03f, - /* 24,11 */ +7.061153220e-04f, +1.995891717e-03f, +4.260520294e-03f, +7.742238512e-03f, +1.256738733e-02f, +1.868482156e-02f, +2.582842673e-02f, +3.351695842e-02f, +4.109720465e-02f, +4.782687301e-02f, +5.298394839e-02f, +5.598207354e-02f, +5.646878599e-02f, +5.438611851e-02f, +4.998066438e-02f, +4.376094899e-02f, +3.641121873e-02f, +2.867979883e-02f, +2.126482169e-02f, +1.471939531e-02f, +9.392578266e-03f, +5.413512274e-03f, +2.716144855e-03f, +1.093632798e-03f, - /* 24,12 */ +6.513091287e-04f, +1.889625146e-03f, +4.085398290e-03f, +7.485801959e-03f, +1.222638897e-02f, +1.826853297e-02f, +2.535999546e-02f, +3.303216567e-02f, +4.064051541e-02f, +4.744529894e-02f, +5.271979985e-02f, +5.586601230e-02f, +5.651460469e-02f, +5.458834968e-02f, +5.031553118e-02f, +4.419045351e-02f, +3.688949768e-02f, +2.916042250e-02f, +2.170757578e-02f, +1.509528803e-02f, +9.686290690e-03f, +5.623126723e-03f, +2.850583915e-03f, +1.168676301e-03f, - /* 24,13 */ +5.991047395e-04f, +1.787112015e-03f, +3.915018340e-03f, +7.234657995e-03f, +1.189054572e-02f, +1.785641537e-02f, +2.489389144e-02f, +3.254715574e-02f, +4.018068337e-02f, +4.705770477e-02f, +5.244726189e-02f, +5.574009777e-02f, +5.655026396e-02f, +5.478132634e-02f, +5.064310236e-02f, +4.461534144e-02f, +3.736611920e-02f, +2.964217216e-02f, +2.215368059e-02f, +1.547595434e-02f, +9.985325752e-03f, +5.837830254e-03f, +2.989308098e-03f, +1.246901403e-03f, - /* 24,14 */ +5.494305796e-04f, +1.688282347e-03f, +3.749328623e-03f, +6.988790100e-03f, +1.155988996e-02f, +1.744855617e-02f, +2.443025293e-02f, +3.206210284e-02f, +3.971789474e-02f, +4.666426010e-02f, +5.216645963e-02f, +5.560438923e-02f, +5.657574693e-02f, +5.496495842e-02f, +5.096323022e-02f, +4.503543229e-02f, +3.784089895e-02f, +3.012488684e-02f, +2.260301890e-02f, +1.586133102e-02f, +1.028967374e-02f, +6.057656813e-03f, +3.132379333e-03f, +1.328380648e-03f, - /* 24,15 */ +5.022154476e-04f, +1.593065611e-03f, +3.588275667e-03f, +6.748179094e-03f, +1.123445076e-02f, +1.704503934e-02f, +2.396921539e-02f, +3.157717954e-02f, +3.925233583e-02f, +4.626513642e-02f, +5.187752167e-02f, +5.545895049e-02f, +5.659104154e-02f, +5.513916011e-02f, +5.127577001e-02f, +4.545054680e-02f, +3.831365198e-02f, +3.060840342e-02f, +2.305547031e-02f, +1.625135142e-02f, +1.059932179e-02f, +6.282638036e-03f, +3.279858311e-03f, +1.413186400e-03f, - /* 24, 0 */ -2.629184871e-03f, -4.843950453e-03f, -6.895985300e-03f, -7.687208098e-03f, -5.978262553e-03f, -8.032174656e-04f, +8.095316761e-03f, +1.997958831e-02f, +3.311864145e-02f, +4.512644231e-02f, +5.356009950e-02f, +5.659614054e-02f, +5.356009950e-02f, +4.512644231e-02f, +3.311864145e-02f, +1.997958831e-02f, +8.095316761e-03f, -8.032174656e-04f, -5.978262553e-03f, -7.687208098e-03f, -6.895985300e-03f, -4.843950453e-03f, -2.629184871e-03f, -9.454953712e-04f, - /* 24, 1 */ -2.503767166e-03f, -4.700731697e-03f, -6.791825424e-03f, -7.698565601e-03f, -6.179328945e-03f, -1.237726578e-03f, +7.438688744e-03f, +1.917778123e-02f, +3.230413198e-02f, +4.445707943e-02f, +5.317715832e-02f, +5.658405316e-02f, +5.392156860e-02f, +4.578163621e-02f, +3.392875410e-02f, +2.078652132e-02f, +8.763945305e-03f, -3.538276542e-04f, -5.763420347e-03f, -7.665996832e-03f, -6.995273095e-03f, -4.986674025e-03f, -2.756835384e-03f, -1.028686673e-03f, - /* 24, 2 */ -2.380688695e-03f, -4.557243028e-03f, -6.683099486e-03f, -7.700368745e-03f, -6.366798820e-03f, -1.657314491e-03f, +6.794365087e-03f, +1.838162773e-02f, +3.148585651e-02f, +4.377411309e-02f, +5.277308334e-02f, +5.654780182e-02f, +5.426124576e-02f, +4.642210542e-02f, +3.473383802e-02f, +2.159804191e-02f, +9.444254477e-03f, +1.103863968e-04f, -5.534634231e-03f, -7.634636496e-03f, -7.089380216e-03f, -5.128670417e-03f, -2.886604737e-03f, -1.114962551e-03f, - /* 24, 3 */ -2.260048394e-03f, -4.413702845e-03f, -6.570110572e-03f, -7.692920583e-03f, -6.540862270e-03f, -2.061956485e-03f, +6.162633403e-03f, +1.759164425e-02f, +3.066444409e-02f, +4.307811806e-02f, +5.234823086e-02f, +5.648741902e-02f, +5.457882991e-02f, +4.704730472e-02f, +3.553326091e-02f, +2.241360152e-02f, +1.013590849e-02f, +5.893521078e-04f, -5.291747706e-03f, -7.592836347e-03f, -7.177995846e-03f, -5.269701073e-03f, -3.018371382e-03f, -1.204312280e-03f, - /* 24, 4 */ -2.141937776e-03f, -4.270322542e-03f, -6.453158507e-03f, -7.676527355e-03f, -6.701719772e-03f, -2.451643421e-03f, +5.543764951e-03f, +1.680833562e-02f, +2.984052134e-02f, +4.236967758e-02f, +5.190297478e-02f, +5.640295884e-02f, +5.487403917e-02f, +4.765670002e-02f, +3.632639074e-02f, +2.323264190e-02f, +1.083855586e-02f, +1.082980638e-03f, -5.034616251e-03f, -7.540310660e-03f, -7.260807322e-03f, -5.409521052e-03f, -3.152006158e-03f, -1.296719170e-03f, - /* 24, 5 */ -2.026441000e-03f, -4.127306381e-03f, -6.332539518e-03f, -7.651498041e-03f, -6.849581767e-03f, -2.826381528e-03f, +4.938014526e-03f, +1.603219452e-02f, +2.901471178e-02f, +4.164938279e-02f, +5.143770614e-02f, +5.629449693e-02f, +5.514661113e-02f, +4.824976895e-02f, +3.711259647e-02f, +2.405459566e-02f, +1.155182965e-02f, +1.591166761e-03f, -4.763107701e-03f, -7.476779193e-03f, -7.337500507e-03f, -5.547879217e-03f, -3.287372274e-03f, -1.392160404e-03f, - /* 24, 6 */ -1.913634953e-03f, -3.984851387e-03f, -6.208545927e-03f, -7.618143912e-03f, -6.984668233e-03f, -3.186192169e-03f, +4.345620369e-03f, +1.526370115e-02f, +2.818763519e-02f, +4.091783200e-02f, +5.095283267e-02f, +5.616213037e-02f, +5.539630322e-02f, +4.882600150e-02f, +3.789124869e-02f, +2.487888677e-02f, +1.227534767e-02f, +2.113788767e-03f, -4.477102606e-03f, -7.401967644e-03f, -7.407760182e-03f, -5.684518438e-03f, -3.424325302e-03f, -1.490606880e-03f, - /* 24, 7 */ -1.803589350e-03f, -3.843147252e-03f, -6.081465840e-03f, -7.576778087e-03f, -7.107208249e-03f, -3.531111592e-03f, +3.766804102e-03f, +1.450332275e-02f, +2.735990694e-02f, +4.017563005e-02f, +5.044877831e-02f, +5.600597761e-02f, +5.562289296e-02f, +4.938490059e-02f, +3.866172039e-02f, +2.570493119e-02f, +1.300871280e-02f, +2.650708377e-03f, -4.176494585e-03f, -7.315608112e-03f, -7.471270440e-03f, -5.819175805e-03f, -3.562713186e-03f, -1.592023060e-03f, - /* 24, 8 */ -1.696366827e-03f, -3.702376254e-03f, -5.951582861e-03f, -7.527715094e-03f, -7.217439556e-03f, -3.861190662e-03f, +3.201770681e-03f, +1.375151322e-02f, +2.653213738e-02f, +3.942338759e-02f, +4.992598268e-02f, +5.582617825e-02f, +5.582617825e-02f, +4.992598268e-02f, +3.942338759e-02f, +2.653213738e-02f, +1.375151322e-02f, +3.201770681e-03f, -3.861190662e-03f, -7.217439556e-03f, -7.527715094e-03f, -5.951582861e-03f, -3.702376254e-03f, -1.696366827e-03f, - /* 24, 9 */ -1.592023060e-03f, -3.562713186e-03f, -5.819175805e-03f, -7.471270440e-03f, -7.315608112e-03f, -4.176494585e-03f, +2.650708377e-03f, +1.300871280e-02f, +2.570493119e-02f, +3.866172039e-02f, +4.938490059e-02f, +5.562289296e-02f, +5.600597761e-02f, +5.044877831e-02f, +4.017563005e-02f, +2.735990694e-02f, +1.450332275e-02f, +3.766804102e-03f, -3.531111592e-03f, -7.107208249e-03f, -7.576778087e-03f, -6.081465840e-03f, -3.843147252e-03f, -1.803589350e-03f, - /* 24,10 */ -1.490606880e-03f, -3.424325302e-03f, -5.684518438e-03f, -7.407760182e-03f, -7.401967644e-03f, -4.477102606e-03f, +2.113788767e-03f, +1.227534767e-02f, +2.487888677e-02f, +3.789124869e-02f, +4.882600150e-02f, +5.539630322e-02f, +5.616213037e-02f, +5.095283267e-02f, +4.091783200e-02f, +2.818763519e-02f, +1.526370115e-02f, +4.345620369e-03f, -3.186192169e-03f, -6.984668233e-03f, -7.618143912e-03f, -6.208545927e-03f, -3.984851387e-03f, -1.913634953e-03f, - /* 24,11 */ -1.392160404e-03f, -3.287372274e-03f, -5.547879217e-03f, -7.337500507e-03f, -7.476779193e-03f, -4.763107701e-03f, +1.591166761e-03f, +1.155182965e-02f, +2.405459566e-02f, +3.711259647e-02f, +4.824976895e-02f, +5.514661113e-02f, +5.629449693e-02f, +5.143770614e-02f, +4.164938279e-02f, +2.901471178e-02f, +1.603219452e-02f, +4.938014526e-03f, -2.826381528e-03f, -6.849581767e-03f, -7.651498041e-03f, -6.332539518e-03f, -4.127306381e-03f, -2.026441000e-03f, - /* 24,12 */ -1.296719170e-03f, -3.152006158e-03f, -5.409521052e-03f, -7.260807322e-03f, -7.540310660e-03f, -5.034616251e-03f, +1.082980638e-03f, +1.083855586e-02f, +2.323264190e-02f, +3.632639074e-02f, +4.765670002e-02f, +5.487403917e-02f, +5.640295884e-02f, +5.190297478e-02f, +4.236967758e-02f, +2.984052134e-02f, +1.680833562e-02f, +5.543764951e-03f, -2.451643421e-03f, -6.701719772e-03f, -7.676527355e-03f, -6.453158507e-03f, -4.270322542e-03f, -2.141937776e-03f, - /* 24,13 */ -1.204312280e-03f, -3.018371382e-03f, -5.269701073e-03f, -7.177995846e-03f, -7.592836347e-03f, -5.291747706e-03f, +5.893521078e-04f, +1.013590849e-02f, +2.241360152e-02f, +3.553326091e-02f, +4.704730472e-02f, +5.457882991e-02f, +5.648741902e-02f, +5.234823086e-02f, +4.307811806e-02f, +3.066444409e-02f, +1.759164425e-02f, +6.162633403e-03f, -2.061956485e-03f, -6.540862270e-03f, -7.692920583e-03f, -6.570110572e-03f, -4.413702845e-03f, -2.260048394e-03f, - /* 24,14 */ -1.114962551e-03f, -2.886604737e-03f, -5.128670417e-03f, -7.089380216e-03f, -7.634636496e-03f, -5.534634231e-03f, +1.103863968e-04f, +9.444254477e-03f, +2.159804191e-02f, +3.473383802e-02f, +4.642210542e-02f, +5.426124576e-02f, +5.654780182e-02f, +5.277308334e-02f, +4.377411309e-02f, +3.148585651e-02f, +1.838162773e-02f, +6.794365087e-03f, -1.657314491e-03f, -6.366798820e-03f, -7.700368745e-03f, -6.683099486e-03f, -4.557243028e-03f, -2.380688695e-03f, - /* 24,15 */ -1.028686673e-03f, -2.756835384e-03f, -4.986674025e-03f, -6.995273095e-03f, -7.665996832e-03f, -5.763420347e-03f, -3.538276542e-04f, +8.763945305e-03f, +2.078652132e-02f, +3.392875410e-02f, +4.578163621e-02f, +5.392156860e-02f, +5.658405316e-02f, +5.317715832e-02f, +4.445707943e-02f, +3.230413198e-02f, +1.917778123e-02f, +7.438688744e-03f, -1.237726578e-03f, -6.179328945e-03f, -7.698565601e-03f, -6.791825424e-03f, -4.700731697e-03f, -2.503767166e-03f, - /* 24, 0 */ +4.735641749e-04f, -1.438577362e-03f, -6.107076473e-03f, -1.318715065e-02f, -2.047716119e-02f, -2.428668798e-02f, -2.088952800e-02f, -8.512165320e-03f, +1.117510535e-02f, +3.302575560e-02f, +5.012757987e-02f, +5.659614054e-02f, +5.012757987e-02f, +3.302575560e-02f, +1.117510535e-02f, -8.512165320e-03f, -2.088952800e-02f, -2.428668798e-02f, -2.047716119e-02f, -1.318715065e-02f, -6.107076473e-03f, -1.438577362e-03f, +4.735641749e-04f, +5.516063288e-04f, - /* 24, 1 */ +5.190146993e-04f, -1.243445781e-03f, -5.732182665e-03f, -1.270621714e-02f, -2.008108462e-02f, -2.422674988e-02f, -2.136190754e-02f, -9.536491055e-03f, +9.813857768e-03f, +3.172645287e-02f, +4.932296812e-02f, +5.657007725e-02f, +5.088942272e-02f, +3.430616434e-02f, +1.254542812e-02f, -7.458075491e-03f, -2.038088472e-02f, -2.431781992e-02f, -2.085968072e-02f, -1.366943909e-02f, -6.492037400e-03f, -1.644903025e-03f, +4.208638005e-04f, +5.761542752e-04f, - /* 24, 2 */ +5.575380238e-04f, -1.059370463e-03f, -5.367638258e-03f, -1.222740313e-02f, -1.967247249e-02f, -2.413881461e-02f, -2.179812108e-02f, -1.053019587e-02f, +8.463295193e-03f, +3.041001010e-02f, +4.847674006e-02f, +5.649192540e-02f, +5.160740292e-02f, +3.556594146e-02f, +1.392318625e-02f, -6.375136316e-03f, -1.983593655e-02f, -2.431936776e-02f, -2.122761958e-02f, -1.415229209e-02f, -6.886752185e-03f, -1.862540304e-03f, +3.605947820e-04f, +5.982066157e-04f, - /* 24, 3 */ +5.894596941e-04f, -8.861942853e-04f, -5.013694839e-03f, -1.175144649e-02f, -1.925234223e-02f, -2.402372023e-02f, -2.219832191e-02f, -1.149248169e-02f, +7.124994951e-03f, +2.907819451e-02f, +4.759010507e-02f, +5.636179897e-02f, +5.228048761e-02f, +3.680336864e-02f, +1.530671242e-02f, -5.264319552e-03f, -1.925469982e-02f, -2.429058667e-02f, -2.157995394e-02f, -1.463489443e-02f, -7.290876362e-03f, -2.091585491e-03f, +2.924431607e-04f, +6.174753085e-04f, - /* 24, 4 */ +6.151072142e-04f, -7.237418200e-04f, -4.670573645e-03f, -1.127905759e-02f, -1.882170532e-02f, -2.388233174e-02f, -2.256271775e-02f, -1.242260980e-02f, +5.800499486e-03f, +2.773278351e-02f, +4.666432713e-02f, +5.617988770e-02f, +5.290770668e-02f, +3.801674993e-02f, +1.669431448e-02f, -4.126652928e-03f, -1.863724919e-02f, -2.423076690e-02f, -2.191566174e-02f, -1.511640714e-02f, -7.704034115e-03f, -2.332112699e-03f, +2.161008111e-04f, +6.336652968e-04f, - /* 24, 5 */ +6.348091316e-04f, -5.718203517e-04f, -4.338465973e-03f, -1.081091853e-02f, -1.838156554e-02f, -2.371553901e-02f, -2.289156957e-02f, -1.331990148e-02f, +4.491314051e-03f, +2.637556170e-02f, +4.570072248e-02f, +5.594645674e-02f, +5.348815454e-02f, +3.920441468e-02f, +1.808427811e-02f, -2.963218986e-03f, -1.798371833e-02f, -2.413923574e-02f, -2.223372473e-02f, -1.559596853e-02f, -8.125818185e-03f, -2.584172964e-03f, +1.312664533e-04f, +6.464750685e-04f, - /* 24, 6 */ +6.488941487e-04f, -4.302209069e-04f, -4.017533648e-03f, -1.034768250e-02f, -1.793291714e-02f, -2.352425464e-02f, -2.318519030e-02f, -1.418373842e-02f, +3.198904487e-03f, +2.500831779e-02f, +4.470065727e-02f, +5.566184614e-02f, +5.402099181e-02f, +4.036472049e-02f, +1.947486957e-02f, -1.775153809e-03f, -1.729430055e-02f, -2.401535937e-02f, -2.253313051e-02f, -1.607269547e-02f, -8.555789856e-03f, -2.847793367e-03f, +3.764667972e-05f, +6.555972530e-04f, - /* 24, 7 */ +6.576902611e-04f, -2.987192943e-04f, -3.707909539e-03f, -9.889973186e-03f, -1.747674315e-02f, -2.330941189e-02f, -2.344394342e-02f, -1.501356300e-02f, +1.924695104e-03f, +2.363284155e-02f, +4.366554511e-02f, +5.532647026e-02f, +5.450544680e-02f, +4.149605616e-02f, +2.086433852e-02f, -5.636456344e-04f, -1.656924930e-02f, -2.385854478e-02f, -2.281287459e-02f, -1.654568462e-02f, -8.993479016e-03f, -3.122976195e-03f, -6.504300803e-05f, +6.607192554e-04f, - /* 24, 8 */ +6.615239252e-04f, -1.770771536e-04f, -3.409698141e-03f, -9.438384277e-03f, -1.701401374e-02f, -2.307196251e-02f, -2.366824152e-02f, -1.580887853e-02f, +6.700666468e-04f, +2.225092083e-02f, +4.259684448e-02f, +5.494081698e-02f, +5.494081698e-02f, +4.259684448e-02f, +2.225092083e-02f, +6.700666468e-04f, -1.580887853e-02f, -2.366824152e-02f, -2.307196251e-02f, -1.701401374e-02f, -9.438384277e-03f, -3.409698141e-03f, -1.770771536e-04f, +6.615239252e-04f, - /* 24, 9 */ +6.607192554e-04f, -6.504300803e-05f, -3.122976195e-03f, -8.993479016e-03f, -1.654568462e-02f, -2.281287459e-02f, -2.385854478e-02f, -1.656924930e-02f, -5.636456344e-04f, +2.086433852e-02f, +4.149605616e-02f, +5.450544680e-02f, +5.532647026e-02f, +4.366554511e-02f, +2.363284155e-02f, +1.924695104e-03f, -1.501356300e-02f, -2.344394342e-02f, -2.330941189e-02f, -1.747674315e-02f, -9.889973186e-03f, -3.707909539e-03f, -2.987192943e-04f, +6.576902611e-04f, - /* 24,10 */ +6.555972530e-04f, +3.764667972e-05f, -2.847793367e-03f, -8.555789856e-03f, -1.607269547e-02f, -2.253313051e-02f, -2.401535937e-02f, -1.729430055e-02f, -1.775153809e-03f, +1.947486957e-02f, +4.036472049e-02f, +5.402099181e-02f, +5.566184614e-02f, +4.470065727e-02f, +2.500831779e-02f, +3.198904487e-03f, -1.418373842e-02f, -2.318519030e-02f, -2.352425464e-02f, -1.793291714e-02f, -1.034768250e-02f, -4.017533648e-03f, -4.302209069e-04f, +6.488941487e-04f, - /* 24,11 */ +6.464750685e-04f, +1.312664533e-04f, -2.584172964e-03f, -8.125818185e-03f, -1.559596853e-02f, -2.223372473e-02f, -2.413923574e-02f, -1.798371833e-02f, -2.963218986e-03f, +1.808427811e-02f, +3.920441468e-02f, +5.348815454e-02f, +5.594645674e-02f, +4.570072248e-02f, +2.637556170e-02f, +4.491314051e-03f, -1.331990148e-02f, -2.289156957e-02f, -2.371553901e-02f, -1.838156554e-02f, -1.081091853e-02f, -4.338465973e-03f, -5.718203517e-04f, +6.348091316e-04f, - /* 24,12 */ +6.336652968e-04f, +2.161008111e-04f, -2.332112699e-03f, -7.704034115e-03f, -1.511640714e-02f, -2.191566174e-02f, -2.423076690e-02f, -1.863724919e-02f, -4.126652928e-03f, +1.669431448e-02f, +3.801674993e-02f, +5.290770668e-02f, +5.617988770e-02f, +4.666432713e-02f, +2.773278351e-02f, +5.800499486e-03f, -1.242260980e-02f, -2.256271775e-02f, -2.388233174e-02f, -1.882170532e-02f, -1.127905759e-02f, -4.670573645e-03f, -7.237418200e-04f, +6.151072142e-04f, - /* 24,13 */ +6.174753085e-04f, +2.924431607e-04f, -2.091585491e-03f, -7.290876362e-03f, -1.463489443e-02f, -2.157995394e-02f, -2.429058667e-02f, -1.925469982e-02f, -5.264319552e-03f, +1.530671242e-02f, +3.680336864e-02f, +5.228048761e-02f, +5.636179897e-02f, +4.759010507e-02f, +2.907819451e-02f, +7.124994951e-03f, -1.149248169e-02f, -2.219832191e-02f, -2.402372023e-02f, -1.925234223e-02f, -1.175144649e-02f, -5.013694839e-03f, -8.861942853e-04f, +5.894596941e-04f, - /* 24,14 */ +5.982066157e-04f, +3.605947820e-04f, -1.862540304e-03f, -6.886752185e-03f, -1.415229209e-02f, -2.122761958e-02f, -2.431936776e-02f, -1.983593655e-02f, -6.375136316e-03f, +1.392318625e-02f, +3.556594146e-02f, +5.160740292e-02f, +5.649192540e-02f, +4.847674006e-02f, +3.041001010e-02f, +8.463295193e-03f, -1.053019587e-02f, -2.179812108e-02f, -2.413881461e-02f, -1.967247249e-02f, -1.222740313e-02f, -5.367638258e-03f, -1.059370463e-03f, +5.575380238e-04f, - /* 24,15 */ +5.761542752e-04f, +4.208638005e-04f, -1.644903025e-03f, -6.492037400e-03f, -1.366943909e-02f, -2.085968072e-02f, -2.431781992e-02f, -2.038088472e-02f, -7.458075491e-03f, +1.254542812e-02f, +3.430616434e-02f, +5.088942272e-02f, +5.657007725e-02f, +4.932296812e-02f, +3.172645287e-02f, +9.813857768e-03f, -9.536491055e-03f, -2.136190754e-02f, -2.422674988e-02f, -2.008108462e-02f, -1.270621714e-02f, -5.732182665e-03f, -1.243445781e-03f, +5.190146993e-04f, - /* 24, 0 */ +2.273459443e-03f, +5.435907648e-03f, +7.255296399e-03f, +3.788129032e-03f, -7.144684562e-03f, -2.265374973e-02f, -3.442368170e-02f, -3.287677614e-02f, -1.387331771e-02f, +1.679264590e-02f, +4.511451955e-02f, +5.659614054e-02f, +4.511451955e-02f, +1.679264590e-02f, -1.387331771e-02f, -3.287677614e-02f, -3.442368170e-02f, -2.265374973e-02f, -7.144684562e-03f, +3.788129032e-03f, +7.255296399e-03f, +5.435907648e-03f, +2.273459443e-03f, +3.568431303e-04f, - /* 24, 1 */ +2.103234406e-03f, +5.239407106e-03f, +7.256400195e-03f, +4.221207454e-03f, -6.266228991e-03f, -2.168841690e-02f, -3.399213075e-02f, -3.348773370e-02f, -1.551504116e-02f, +1.477681868e-02f, +4.371373211e-02f, +5.654911556e-02f, +4.644656718e-02f, +1.879953521e-02f, -1.218307761e-02f, -3.219410560e-02f, -3.480135038e-02f, -2.360501860e-02f, -8.042999544e-03f, +3.324105568e-03f, +7.232988111e-03f, +5.627714430e-03f, +2.449385040e-03f, +4.247055554e-04f, - /* 24, 2 */ +1.939021806e-03f, +5.039131826e-03f, +7.237298926e-03f, +4.623451366e-03f, -5.409068119e-03f, -2.071157693e-02f, -3.350883303e-02f, -3.402698064e-02f, -1.710557364e-02f, +1.275612557e-02f, +4.224725679e-02f, +5.640814528e-02f, +4.770696520e-02f, +2.079340350e-02f, -1.044713814e-02f, -3.143988919e-02f, -3.512309015e-02f, -2.453963953e-02f, -8.959642554e-03f, +2.829112073e-03f, +7.188501693e-03f, +5.813881008e-03f, +2.630658922e-03f, +4.992251326e-04f, - /* 24, 3 */ +1.781093672e-03f, +4.835971292e-03f, +7.199013760e-03f, +4.995053998e-03f, -4.574539506e-03f, -1.972575310e-02f, -3.297600576e-02f, -3.449468646e-02f, -1.864238902e-02f, +1.073461753e-02f, +4.071827965e-02f, +5.617354343e-02f, +4.889295364e-02f, +2.277016679e-02f, -8.668453837e-03f, -3.061446547e-02f, -3.538695026e-02f, -2.545500791e-02f, -9.892988076e-03f, +2.303211764e-03f, +7.120893393e-03f, +5.993435804e-03f, +2.816887995e-03f, +5.805470381e-04f, - /* 24, 4 */ +1.629682882e-03f, +4.630783503e-03f, +7.142583584e-03f, +5.336288236e-03f, -3.763881685e-03f, -1.873342898e-02f, -3.239594057e-02f, -3.489118499e-02f, -2.012311412e-02f, +8.716314532e-03f, +3.913011251e-02f, +5.584583195e-02f, +5.000192959e-02f, +2.472575033e-02f, -6.850110412e-03f, -2.971834586e-02f, -3.559108276e-02f, -2.634850527e-02f, -1.084131876e-02f, +1.746558492e-03f, +7.029253460e-03f, +6.165384566e-03f, +3.007638074e-03f, +6.687931554e-04f, - /* 24, 5 */ +1.484983972e-03f, +4.424393216e-03f, +7.069061064e-03f, +5.647503405e-03f, -2.978233194e-03f, -1.773704257e-02f, -3.177099609e-02f, -3.521697115e-02f, -2.154553308e-02f, +6.705195776e-03f, +3.748618427e-02f, +5.542573963e-02f, +5.103145416e-02f, +2.665609886e-02f, -4.995318215e-03f, -2.875221569e-02f, -3.573374914e-02f, -2.721750622e-02f, -1.180282806e-02f, +1.159398961e-03f, +6.912710257e-03f, +6.328712988e-03f, +3.202433762e-03f, +7.640603932e-04f, - /* 24, 6 */ +1.347154069e-03f, +4.217590351e-03f, +6.979508760e-03f, +5.929121902e-03f, -2.218631929e-03f, -1.673898061e-02f, -3.110359053e-02f, -3.547269735e-02f, -2.290759116e-02f, +4.705190128e-03f, +3.579003198e-02f, +5.491420012e-02f, +5.197925890e-02f, +2.855718684e-02f, -3.107405323e-03f, -2.771693469e-02f, -3.581332680e-02f, -2.805938547e-02f, -1.277562317e-02f, +5.420746921e-04f, +6.770434377e-03f, +6.482389493e-03f, +3.400758480e-03f, +8.664190421e-04f, - /* 24, 7 */ +1.216313935e-03f, +4.011128586e-03f, +6.874995333e-03f, +6.181635683e-03f, -1.486014823e-03f, -1.574157316e-02f, -3.039619415e-02f, -3.565916944e-02f, -2.420739811e-02f, +2.720166717e-03f, +3.404529163e-02f, +5.431234943e-02f, +5.284325182e-02f, +3.042502866e-02f, -1.189810237e-03f, -2.661353708e-02f, -3.582831530e-02f, -2.887152508e-02f, -1.375772836e-02f, -1.049762569e-04f, +6.601642735e-03f, +6.625368167e-03f, +3.602054665e-03f, +9.759111772e-04f, - /* 24, 8 */ +1.092549115e-03f, +3.805724130e-03f, +6.756591845e-03f, +6.405602617e-03f, -7.812178358e-04f, -1.474708852e-02f, -2.965132174e-02f, -3.577734234e-02f, -2.544323110e-02f, +7.539257812e-04f, +3.225568873e-02f, +5.362152294e-02f, +5.362152294e-02f, +3.225568873e-02f, +7.539257812e-04f, -2.544323110e-02f, -3.577734234e-02f, -2.965132174e-02f, -1.474708852e-02f, -7.812178358e-04f, +6.405602617e-03f, +6.756591845e-03f, +3.805724130e-03f, +1.092549115e-03f, - /* 24, 9 */ +9.759111772e-04f, +3.602054665e-03f, +6.625368167e-03f, +6.601642735e-03f, -1.049762569e-04f, -1.375772836e-02f, -2.887152508e-02f, -3.582831530e-02f, -2.661353708e-02f, -1.189810237e-03f, +3.042502866e-02f, +5.284325182e-02f, +5.431234943e-02f, +3.404529163e-02f, +2.720166717e-03f, -2.420739811e-02f, -3.565916944e-02f, -3.039619415e-02f, -1.574157316e-02f, -1.486014823e-03f, +6.181635683e-03f, +6.874995333e-03f, +4.011128586e-03f, +1.216313935e-03f, - /* 24,10 */ +8.664190421e-04f, +3.400758480e-03f, +6.482389493e-03f, +6.770434377e-03f, +5.420746921e-04f, -1.277562317e-02f, -2.805938547e-02f, -3.581332680e-02f, -2.771693469e-02f, -3.107405323e-03f, +2.855718684e-02f, +5.197925890e-02f, +5.491420012e-02f, +3.579003198e-02f, +4.705190128e-03f, -2.290759116e-02f, -3.547269735e-02f, -3.110359053e-02f, -1.673898061e-02f, -2.218631929e-03f, +5.929121902e-03f, +6.979508760e-03f, +4.217590351e-03f, +1.347154069e-03f, - /* 24,11 */ +7.640603932e-04f, +3.202433762e-03f, +6.328712988e-03f, +6.912710257e-03f, +1.159398961e-03f, -1.180282806e-02f, -2.721750622e-02f, -3.573374914e-02f, -2.875221569e-02f, -4.995318215e-03f, +2.665609886e-02f, +5.103145416e-02f, +5.542573963e-02f, +3.748618427e-02f, +6.705195776e-03f, -2.154553308e-02f, -3.521697115e-02f, -3.177099609e-02f, -1.773704257e-02f, -2.978233194e-03f, +5.647503405e-03f, +7.069061064e-03f, +4.424393216e-03f, +1.484983972e-03f, - /* 24,12 */ +6.687931554e-04f, +3.007638074e-03f, +6.165384566e-03f, +7.029253460e-03f, +1.746558492e-03f, -1.084131876e-02f, -2.634850527e-02f, -3.559108276e-02f, -2.971834586e-02f, -6.850110412e-03f, +2.472575033e-02f, +5.000192959e-02f, +5.584583195e-02f, +3.913011251e-02f, +8.716314532e-03f, -2.012311412e-02f, -3.489118499e-02f, -3.239594057e-02f, -1.873342898e-02f, -3.763881685e-03f, +5.336288236e-03f, +7.142583584e-03f, +4.630783503e-03f, +1.629682882e-03f, - /* 24,13 */ +5.805470381e-04f, +2.816887995e-03f, +5.993435804e-03f, +7.120893393e-03f, +2.303211764e-03f, -9.892988076e-03f, -2.545500791e-02f, -3.538695026e-02f, -3.061446547e-02f, -8.668453837e-03f, +2.277016679e-02f, +4.889295364e-02f, +5.617354343e-02f, +4.071827965e-02f, +1.073461753e-02f, -1.864238902e-02f, -3.449468646e-02f, -3.297600576e-02f, -1.972575310e-02f, -4.574539506e-03f, +4.995053998e-03f, +7.199013760e-03f, +4.835971292e-03f, +1.781093672e-03f, - /* 24,14 */ +4.992251326e-04f, +2.630658922e-03f, +5.813881008e-03f, +7.188501693e-03f, +2.829112073e-03f, -8.959642554e-03f, -2.453963953e-02f, -3.512309015e-02f, -3.143988919e-02f, -1.044713814e-02f, +2.079340350e-02f, +4.770696520e-02f, +5.640814528e-02f, +4.224725679e-02f, +1.275612557e-02f, -1.710557364e-02f, -3.402698064e-02f, -3.350883303e-02f, -2.071157693e-02f, -5.409068119e-03f, +4.623451366e-03f, +7.237298926e-03f, +5.039131826e-03f, +1.939021806e-03f, - /* 24,15 */ +4.247055554e-04f, +2.449385040e-03f, +5.627714430e-03f, +7.232988111e-03f, +3.324105568e-03f, -8.042999544e-03f, -2.360501860e-02f, -3.480135038e-02f, -3.219410560e-02f, -1.218307761e-02f, +1.879953521e-02f, +4.644656718e-02f, +5.654911556e-02f, +4.371373211e-02f, +1.477681868e-02f, -1.551504116e-02f, -3.348773370e-02f, -3.399213075e-02f, -2.168841690e-02f, -6.266228991e-03f, +4.221207454e-03f, +7.256400195e-03f, +5.239407106e-03f, +2.103234406e-03f, - /* 24, 0 */ -2.181310192e-03f, -7.982329251e-04f, +5.680209618e-03f, +1.430719659e-02f, +1.589843483e-02f, +2.406871994e-03f, -2.249676846e-02f, -4.130100690e-02f, -3.506718353e-02f, -1.541681908e-03f, +3.867898214e-02f, +5.659614054e-02f, +3.867898214e-02f, -1.541681908e-03f, -3.506718353e-02f, -4.130100690e-02f, -2.249676846e-02f, +2.406871994e-03f, +1.589843483e-02f, +1.430719659e-02f, +5.680209618e-03f, -7.982329251e-04f, -2.181310192e-03f, -9.324150638e-04f, - /* 24, 1 */ -2.142117633e-03f, -1.026327303e-03f, +5.144075019e-03f, +1.386145083e-02f, +1.619749380e-02f, +3.702669669e-03f, -2.089125129e-02f, -4.071342524e-02f, -3.635626763e-02f, -4.137848013e-03f, +3.654904222e-02f, +5.652117066e-02f, +4.071616274e-02f, +1.083860427e-03f, -3.366302266e-02f, -4.178478525e-02f, -2.407924887e-02f, +1.061252794e-03f, +1.553625174e-02f, +1.472529111e-02f, +6.227191439e-03f, -5.482915187e-04f, -2.210193915e-03f, -1.021372070e-03f, - /* 24, 2 */ -2.093579858e-03f, -1.232841058e-03f, +4.620399561e-03f, +1.339085359e-02f, +1.643462496e-02f, +4.945866528e-03f, -1.926829204e-02f, -4.002576024e-02f, -3.752797769e-02f, -6.697199080e-03f, +3.433305089e-02f, +5.629650283e-02f, +4.265414906e-02f, +3.731182183e-03f, -3.214649405e-02f, -4.216132985e-02f, -2.563305646e-02f, -3.311524193e-04f, +1.510995111e-02f, +1.511293981e-02f, +6.783287607e-03f, -2.763303743e-04f, -2.227804667e-03f, -1.112061839e-03f, - /* 24, 3 */ -2.036654869e-03f, -1.418128950e-03f, +4.110671651e-03f, +1.289819803e-02f, +1.661121711e-02f, +6.133943976e-03f, -1.763342417e-02f, -3.924200344e-02f, -3.858043162e-02f, -9.212479159e-03f, +3.203796457e-02f, +5.592286159e-02f, +4.448680259e-02f, +6.392554173e-03f, -3.052071354e-02f, -4.242751674e-02f, -2.715253413e-02f, -1.767057534e-03f, +1.461875233e-02f, +1.546736546e-02f, +7.346647501e-03f, +1.772445414e-05f, -2.233183138e-03f, -1.203936109e-03f, - /* 24, 4 */ -1.972290178e-03f, -1.582628528e-03f, +3.616254280e-03f, +1.238625918e-02f, +1.672884047e-02f, +7.264647438e-03f, -1.599210066e-02f, -3.836639935e-02f, -3.951216427e-02f, -1.167663915e-02f, +2.967096294e-02f, +5.540145153e-02f, +4.620830373e-02f, +9.060141131e-03f, -2.878919714e-02f, -4.258054458e-02f, -2.863202454e-02f, -3.242932618e-03f, +1.406209682e-02f, +1.578582064e-02f, +7.915306646e-03f, +3.338433846e-04f, -2.225380377e-03f, -1.296401007e-03f, - /* 24, 5 */ -1.901418208e-03f, -1.726854356e-03f, +3.138383775e-03f, +1.185778300e-02f, +1.678923519e-02f, +8.335988548e-03f, -1.434967550e-02f, -3.740342600e-02f, -4.032212766e-02f, -1.408285985e-02f, +2.723942290e-02f, +5.473395280e-02f, +4.781317317e-02f, +1.172602857e-02f, -2.695585286e-02f, -4.261794963e-02f, -3.006589126e-02f, -4.755011838e-03f, +1.343965653e-02f, +1.606560041e-02f, +8.487191262e-03f, +6.718888821e-04f, -2.203463508e-03f, -1.388818223e-03f, - /* 24, 6 */ -1.824951954e-03f, -1.851392085e-03f, +2.678169173e-03f, +1.131547576e-02f, +1.679429951e-02f, +9.346246206e-03f, -1.271138577e-02f, -3.635777499e-02f, -4.100968953e-02f, -1.642457396e-02f, +2.475089197e-02f, +5.392251484e-02f, +4.929629202e-02f, +1.438225015e-02f, -2.502497093e-02f, -4.253761970e-02f, -3.144854025e-02f, -6.299302508e-03f, +1.275134172e-02f, +1.630405519e-02f, +9.060123484e-03f, +1.031611407e-03f, -2.166521604e-03f, -1.480506488e-03f, - /* 24, 7 */ -1.743780953e-03f, -1.956892396e-03f, +2.236592212e-03f, +1.076199396e-02f, +1.674607744e-02f, +1.029396653e-02f, -1.108233467e-02f, -3.523433096e-02f, -4.157463041e-02f, -1.869548696e-02f, +2.221306113e-02f, +5.296974848e-02f, +5.065292065e-02f, +1.702081530e-02f, -2.300121251e-02f, -4.233780689e-02f, -3.277444146e-02f, -7.871595256e-03f, +1.199730786e-02f, +1.649860375e-02f, +9.631827247e-03f, +1.412645767e-03f, -2.113671692e-03f, -1.570743396e-03f, - /* 24, 8 */ -1.658767534e-03f, -2.044064852e-03f, +1.814507917e-03f, +1.019993481e-02f, +1.664674627e-02f, +1.117796172e-02f, -9.467475281e-03f, -3.403815061e-02f, -4.201713914e-02f, -2.088959684e-02f, +1.963373727e-02f, +5.187871616e-02f, +5.187871616e-02f, +1.963373727e-02f, -2.088959684e-02f, -4.201713914e-02f, -3.403815061e-02f, -9.467475281e-03f, +1.117796172e-02f, +1.664674627e-02f, +1.019993481e-02f, +1.814507917e-03f, -2.044064852e-03f, -1.658767534e-03f, - /* 24, 9 */ -1.570743396e-03f, -2.113671692e-03f, +1.412645767e-03f, +9.631827247e-03f, +1.649860375e-02f, +1.199730786e-02f, -7.871595256e-03f, -3.277444146e-02f, -4.233780689e-02f, -2.300121251e-02f, +1.702081530e-02f, +5.065292065e-02f, +5.296974848e-02f, +2.221306113e-02f, -1.869548696e-02f, -4.157463041e-02f, -3.523433096e-02f, -1.108233467e-02f, +1.029396653e-02f, +1.674607744e-02f, +1.076199396e-02f, +2.236592212e-03f, -1.956892396e-03f, -1.743780953e-03f, - /* 24,10 */ -1.480506488e-03f, -2.166521604e-03f, +1.031611407e-03f, +9.060123484e-03f, +1.630405519e-02f, +1.275134172e-02f, -6.299302508e-03f, -3.144854025e-02f, -4.253761970e-02f, -2.502497093e-02f, +1.438225015e-02f, +4.929629202e-02f, +5.392251484e-02f, +2.475089197e-02f, -1.642457396e-02f, -4.100968953e-02f, -3.635777499e-02f, -1.271138577e-02f, +9.346246206e-03f, +1.679429951e-02f, +1.131547576e-02f, +2.678169173e-03f, -1.851392085e-03f, -1.824951954e-03f, - /* 24,11 */ -1.388818223e-03f, -2.203463508e-03f, +6.718888821e-04f, +8.487191262e-03f, +1.606560041e-02f, +1.343965653e-02f, -4.755011838e-03f, -3.006589126e-02f, -4.261794963e-02f, -2.695585286e-02f, +1.172602857e-02f, +4.781317317e-02f, +5.473395280e-02f, +2.723942290e-02f, -1.408285985e-02f, -4.032212766e-02f, -3.740342600e-02f, -1.434967550e-02f, +8.335988548e-03f, +1.678923519e-02f, +1.185778300e-02f, +3.138383775e-03f, -1.726854356e-03f, -1.901418208e-03f, - /* 24,12 */ -1.296401007e-03f, -2.225380377e-03f, +3.338433846e-04f, +7.915306646e-03f, +1.578582064e-02f, +1.406209682e-02f, -3.242932618e-03f, -2.863202454e-02f, -4.258054458e-02f, -2.878919714e-02f, +9.060141131e-03f, +4.620830373e-02f, +5.540145153e-02f, +2.967096294e-02f, -1.167663915e-02f, -3.951216427e-02f, -3.836639935e-02f, -1.599210066e-02f, +7.264647438e-03f, +1.672884047e-02f, +1.238625918e-02f, +3.616254280e-03f, -1.582628528e-03f, -1.972290178e-03f, - /* 24,13 */ -1.203936109e-03f, -2.233183138e-03f, +1.772445414e-05f, +7.346647501e-03f, +1.546736546e-02f, +1.461875233e-02f, -1.767057534e-03f, -2.715253413e-02f, -4.242751674e-02f, -3.052071354e-02f, +6.392554173e-03f, +4.448680259e-02f, +5.592286159e-02f, +3.203796457e-02f, -9.212479159e-03f, -3.858043162e-02f, -3.924200344e-02f, -1.763342417e-02f, +6.133943976e-03f, +1.661121711e-02f, +1.289819803e-02f, +4.110671651e-03f, -1.418128950e-03f, -2.036654869e-03f, - /* 24,14 */ -1.112061839e-03f, -2.227804667e-03f, -2.763303743e-04f, +6.783287607e-03f, +1.511293981e-02f, +1.510995111e-02f, -3.311524193e-04f, -2.563305646e-02f, -4.216132985e-02f, -3.214649405e-02f, +3.731182183e-03f, +4.265414906e-02f, +5.629650283e-02f, +3.433305089e-02f, -6.697199080e-03f, -3.752797769e-02f, -4.002576024e-02f, -1.926829204e-02f, +4.945866528e-03f, +1.643462496e-02f, +1.339085359e-02f, +4.620399561e-03f, -1.232841058e-03f, -2.093579858e-03f, - /* 24,15 */ -1.021372070e-03f, -2.210193915e-03f, -5.482915187e-04f, +6.227191439e-03f, +1.472529111e-02f, +1.553625174e-02f, +1.061252794e-03f, -2.407924887e-02f, -4.178478525e-02f, -3.366302266e-02f, +1.083860427e-03f, +4.071616274e-02f, +5.652117066e-02f, +3.654904222e-02f, -4.137848013e-03f, -3.635626763e-02f, -4.071342524e-02f, -2.089125129e-02f, +3.702669669e-03f, +1.619749380e-02f, +1.386145083e-02f, +5.144075019e-03f, -1.026327303e-03f, -2.142117633e-03f, - /* 24, 0 */ -6.349328336e-04f, -5.107444449e-03f, -7.589492700e-03f, +4.421169254e-04f, +1.733331948e-02f, +2.497839430e-02f, +6.069612140e-03f, -2.970035006e-02f, -4.651799663e-02f, -1.968310326e-02f, +3.102388246e-02f, +5.659614054e-02f, +3.102388246e-02f, -1.968310326e-02f, -4.651799663e-02f, -2.970035006e-02f, +6.069612140e-03f, +2.497839430e-02f, +1.733331948e-02f, +4.421169254e-04f, -7.589492700e-03f, -5.107444449e-03f, -6.349328336e-04f, +6.381929817e-04f, - /* 24, 1 */ -4.501246045e-04f, -4.794789988e-03f, -7.673310752e-03f, -4.276921651e-04f, +1.630487239e-02f, +2.519230977e-02f, +8.023727481e-03f, -2.760467194e-02f, -4.668156835e-02f, -2.250226055e-02f, +2.808383767e-02f, +5.648624601e-02f, +3.385706239e-02f, -1.675917373e-02f, -4.616688010e-02f, -3.171828840e-02f, +4.039135426e-03f, +2.465060544e-02f, +1.832599562e-02f, +1.353161175e-03f, -7.461005422e-03f, -5.414037993e-03f, -8.347893499e-04f, +6.459962873e-04f, - /* 24, 2 */ -2.805431667e-04f, -4.478334337e-03f, -7.714347254e-03f, -1.253762011e-03f, +1.524677189e-02f, +2.529479915e-02f, +9.894771606e-03f, -2.544172743e-02f, -4.665953469e-02f, -2.520578478e-02f, +2.504972253e-02f, +5.615705320e-02f, +3.657100703e-02f, -1.374190145e-02f, -4.562711379e-02f, -3.364818878e-02f, +1.939527429e-03f, +2.420699082e-02f, +1.927675855e-02f, +2.302607998e-03f, -7.286133997e-03f, -5.712221732e-03f, -1.049390115e-03f, +6.454263440e-04f, - /* 24, 3 */ -1.262469087e-04f, -4.160237857e-03f, -7.714644364e-03f, -2.033919173e-03f, +1.416507919e-02f, +2.528877950e-02f, +1.167657735e-02f, -2.322211124e-02f, -4.645464989e-02f, -2.778343069e-02f, +2.193469332e-02f, +5.561003206e-02f, +3.915383052e-02f, -1.064323425e-02f, -4.489844274e-02f, -3.547998209e-02f, -2.214871506e-04f, +2.364611605e-02f, +2.017947396e-02f, +3.287300483e-03f, -7.063354139e-03f, -5.999568857e-03f, -1.278300802e-03f, +6.356530069e-04f, - /* 24, 4 */ +1.281987696e-05f, -3.842552418e-03f, -7.676380196e-03f, -2.766321017e-03f, +1.306576874e-02f, +2.517761055e-02f, +1.336353941e-02f, -2.095648565e-02f, -4.607045954e-02f, -3.022561220e-02f, +1.875220414e-02f, +5.484762432e-02f, +4.159418981e-02f, -7.475585158e-03f, -4.398147340e-02f, -3.720388175e-02f, -2.435717775e-03f, +2.296708552e-02f, +2.102804905e-02f, +4.303763633e-03f, -6.791349552e-03f, -6.273586899e-03f, -1.520952773e-03f, +6.158659890e-04f, - /* 24, 5 */ +1.368204413e-04f, -3.527213369e-03f, -7.601850138e-03f, -3.449453954e-03f, +1.195469912e-02f, +2.496506585e-02f, +1.495063011e-02f, -1.865552736e-02f, -4.551127331e-02f, -3.252344226e-02f, +1.551594186e-02f, +5.387323140e-02f, +4.388134039e-02f, -4.251776447e-03f, -4.287768073e-02f, -3.881043651e-02f, -4.694539858e-03f, +2.216956067e-02f, +2.181646678e-02f, +5.348212687e-03f, -6.469028645e-03f, -6.531730950e-03f, -1.776639841e-03f, +5.852828120e-04f, - /* 24, 6 */ +2.460185614e-04f, -3.216032617e-03f, -7.493448175e-03f, -4.082129823e-03f, +1.083758546e-02f, +2.465530244e-02f, +1.643341199e-02f, -1.632987505e-02f, -4.478213426e-02f, -3.466876896e-02f, +1.223976005e-02f, +5.269119738e-02f, +4.600518917e-02f, -9.849812576e-04f, -4.158941105e-02f, -4.029058231e-02f, -6.988929457e-03f, +2.125377578e-02f, +2.253882061e-02f, +6.416563547e-03f, -6.095540465e-03f, -6.771417794e-03f, -2.044515881e-03f, +5.431569434e-04f, - /* 24, 7 */ +3.407711290e-04f, -2.910692818e-03f, -7.353648294e-03f, -4.663480492e-03f, +9.719973395e-03f, +2.425282916e-02f, +1.780804686e-02f, -1.399007798e-02f, -4.388878466e-02f, -3.665420751e-02f, +8.937612534e-03f, +5.130678745e-02f, +4.795634432e-02f, +2.311336934e-03f, -4.011988036e-02f, -4.163569289e-02f, -9.309500719e-03f, +2.022055084e-02f, +2.318934965e-02f, +7.504445299e-03f, -5.670289717e-03f, -6.990040888e-03f, -2.323593338e-03f, +4.887860648e-04f, - /* 24, 8 */ +4.215204125e-04f, -2.612742676e-03f, -7.184986124e-03f, -5.192950770e-03f, +8.607214812e-03f, +2.376247385e-02f, +1.907130164e-02f, -1.164654593e-02f, -4.283762880e-02f, -3.847316827e-02f, +5.623486691e-03f, +4.972616165e-02f, +4.972616165e-02f, +5.623486691e-03f, -3.847316827e-02f, -4.283762880e-02f, -1.164654593e-02f, +1.907130164e-02f, +2.376247385e-02f, +8.607214812e-03f, -5.192950770e-03f, -7.184986124e-03f, -2.612742676e-03f, +4.215204125e-04f, - /* 24, 9 */ +4.887860648e-04f, -2.323593338e-03f, -6.990040888e-03f, -5.670289717e-03f, +7.504445299e-03f, +2.318934965e-02f, +2.022055084e-02f, -9.309500719e-03f, -4.163569289e-02f, -4.011988036e-02f, +2.311336934e-03f, +4.795634432e-02f, +5.130678745e-02f, +8.937612534e-03f, -3.665420751e-02f, -4.388878466e-02f, -1.399007798e-02f, +1.780804686e-02f, +2.425282916e-02f, +9.719973395e-03f, -4.663480492e-03f, -7.353648294e-03f, -2.910692818e-03f, +3.407711290e-04f, - /* 24,10 */ +5.431569434e-04f, -2.044515881e-03f, -6.771417794e-03f, -6.095540465e-03f, +6.416563547e-03f, +2.253882061e-02f, +2.125377578e-02f, -6.988929457e-03f, -4.029058231e-02f, -4.158941105e-02f, -9.849812576e-04f, +4.600518917e-02f, +5.269119738e-02f, +1.223976005e-02f, -3.466876896e-02f, -4.478213426e-02f, -1.632987505e-02f, +1.643341199e-02f, +2.465530244e-02f, +1.083758546e-02f, -4.082129823e-03f, -7.493448175e-03f, -3.216032617e-03f, +2.460185614e-04f, - /* 24,11 */ +5.852828120e-04f, -1.776639841e-03f, -6.531730950e-03f, -6.469028645e-03f, +5.348212687e-03f, +2.181646678e-02f, +2.216956067e-02f, -4.694539858e-03f, -3.881043651e-02f, -4.287768073e-02f, -4.251776447e-03f, +4.388134039e-02f, +5.387323140e-02f, +1.551594186e-02f, -3.252344226e-02f, -4.551127331e-02f, -1.865552736e-02f, +1.495063011e-02f, +2.496506585e-02f, +1.195469912e-02f, -3.449453954e-03f, -7.601850138e-03f, -3.527213369e-03f, +1.368204413e-04f, - /* 24,12 */ +6.158659890e-04f, -1.520952773e-03f, -6.273586899e-03f, -6.791349552e-03f, +4.303763633e-03f, +2.102804905e-02f, +2.296708552e-02f, -2.435717775e-03f, -3.720388175e-02f, -4.398147340e-02f, -7.475585158e-03f, +4.159418981e-02f, +5.484762432e-02f, +1.875220414e-02f, -3.022561220e-02f, -4.607045954e-02f, -2.095648565e-02f, +1.336353941e-02f, +2.517761055e-02f, +1.306576874e-02f, -2.766321017e-03f, -7.676380196e-03f, -3.842552418e-03f, +1.281987696e-05f, - /* 24,13 */ +6.356530069e-04f, -1.278300802e-03f, -5.999568857e-03f, -7.063354139e-03f, +3.287300483e-03f, +2.017947396e-02f, +2.364611605e-02f, -2.214871506e-04f, -3.547998209e-02f, -4.489844274e-02f, -1.064323425e-02f, +3.915383052e-02f, +5.561003206e-02f, +2.193469332e-02f, -2.778343069e-02f, -4.645464989e-02f, -2.322211124e-02f, +1.167657735e-02f, +2.528877950e-02f, +1.416507919e-02f, -2.033919173e-03f, -7.714644364e-03f, -4.160237857e-03f, -1.262469087e-04f, - /* 24,14 */ +6.454263440e-04f, -1.049390115e-03f, -5.712221732e-03f, -7.286133997e-03f, +2.302607998e-03f, +1.927675855e-02f, +2.420699082e-02f, +1.939527429e-03f, -3.364818878e-02f, -4.562711379e-02f, -1.374190145e-02f, +3.657100703e-02f, +5.615705320e-02f, +2.504972253e-02f, -2.520578478e-02f, -4.665953469e-02f, -2.544172743e-02f, +9.894771606e-03f, +2.529479915e-02f, +1.524677189e-02f, -1.253762011e-03f, -7.714347254e-03f, -4.478334337e-03f, -2.805431667e-04f, - /* 24,15 */ +6.459962873e-04f, -8.347893499e-04f, -5.414037993e-03f, -7.461005422e-03f, +1.353161175e-03f, +1.832599562e-02f, +2.465060544e-02f, +4.039135426e-03f, -3.171828840e-02f, -4.616688010e-02f, -1.675917373e-02f, +3.385706239e-02f, +5.648624601e-02f, +2.808383767e-02f, -2.250226055e-02f, -4.668156835e-02f, -2.760467194e-02f, +8.023727481e-03f, +2.519230977e-02f, +1.630487239e-02f, -4.276921651e-04f, -7.673310752e-03f, -4.794789988e-03f, -4.501246045e-04f, - /* 24, 0 */ +1.197013499e-03f, +3.320493122e-03f, -3.017233048e-03f, -9.987553340e-03f, -4.112967049e-03f, +1.524501264e-02f, +2.235677036e-02f, -2.137559158e-03f, -3.327370097e-02f, -2.660122408e-02f, +1.657531807e-02f, +4.232694754e-02f, +1.657531807e-02f, -2.660122408e-02f, -3.327370097e-02f, -2.137559158e-03f, +2.235677036e-02f, +1.524501264e-02f, -4.112967049e-03f, -9.987553340e-03f, -3.017233048e-03f, +2.318357031e-03f, +1.197013499e-03f, -1.261205705e-04f, - /* 24, 1 */ +1.060573898e-03f, +3.246029352e-03f, -2.510607281e-03f, -9.784551764e-03f, -5.018393221e-03f, +1.404948670e-02f, +2.282515537e-02f, +7.626640355e-05f, -3.208475603e-02f, -2.845760231e-02f, +1.374134711e-02f, +4.221250979e-02f, +1.933345641e-02f, -2.458052660e-02f, -3.429687591e-02f, -4.386190237e-03f, +2.174698353e-02f, +1.639120730e-02f, -3.143642175e-03f, -1.013545813e-02f, -3.535011248e-03f, +2.193303334e-03f, +1.338504197e-03f, -9.901282259e-05f, - /* 24, 2 */ +9.298712414e-04f, +3.156277727e-03f, -2.018194158e-03f, -9.530340989e-03f, -5.856606243e-03f, +1.281349999e-02f, +2.315294314e-02f, +2.243024978e-03f, -3.073934924e-02f, -3.014061672e-02f, +1.084811230e-02f, +4.186988491e-02f, +2.199957595e-02f, -2.240563854e-02f, -3.514586546e-02f, -6.656913804e-03f, +2.099588115e-02f, +1.747926153e-02f, -2.114297018e-03f, -1.022461460e-02f, -4.060636553e-03f, +2.039754046e-03f, +1.484263468e-03f, -6.526428163e-05f, - /* 24, 3 */ +8.054954021e-04f, +3.052984548e-03f, -1.542795645e-03f, -9.229007144e-03f, -6.624860539e-03f, +1.154592266e-02f, +2.334180387e-02f, +4.350977952e-03f, -2.924761047e-02f, -3.164235460e-02f, +7.912459038e-03f, +4.130113344e-02f, +2.455797710e-02f, -2.008771737e-02f, -3.581321303e-02f, -8.936640836e-03f, +2.010445982e-02f, +1.850049032e-02f, -1.029364704e-03f, -1.025164428e-02f, -4.590574200e-03f, +1.857070273e-03f, +1.633412152e-03f, -2.453170435e-05f, - /* 24, 4 */ +6.879416803e-04f, +2.937877889e-03f, -1.086944946e-03f, -8.884797195e-03f, -7.320980005e-03f, +1.025556440e-02f, +2.339424278e-02f, +6.388976156e-03f, -2.762041561e-02f, -3.295607494e-02f, +4.951401864e-03f, +4.050967459e-02f, +2.699354793e-02f, -1.763888677e-02f, -3.629248103e-02f, -1.121198570e-02f, +1.907464002e-02f, +1.944639638e-02f, +1.061806254e-04f, -1.021347789e-02f, -5.121078221e-03f, +1.644827972e-03f, +1.784975276e-03f, +2.348660763e-05f, - /* 24, 5 */ +5.776128643e-04f, +2.812656385e-03f, -6.528985547e-04f, -8.502081335e-03f, -7.943354450e-03f, +8.951116293e-03f, +2.331356438e-02f, +8.346521334e-03f, -2.586930694e-02f, -3.407624020e-02f, +1.982016505e-03f, +3.950026382e-02f, +2.929186185e-02f, -1.507216716e-02f, -3.657830513e-02f, -1.346934883e-02f, +1.790927350e-02f, +2.030873394e-02f, +1.286841938e-03f, -1.010739044e-02f, -5.648212144e-03f, +1.402832649e-03f, +1.937883690e-03f, +7.904503123e-05f, - /* 24, 6 */ +4.748218959e-04f, +2.678978820e-03f, -2.426308611e-04f, -8.085315763e-03f, -8.490932000e-03f, +7.641095022e-03f, +2.310383199e-02f, +1.021382218e-02f, -2.400641001e-02f, -3.499853994e-02f, -9.786680537e-04f, +3.827896159e-02f, +3.143927100e-02f, -1.240139974e-02f, -3.666644182e-02f, -1.569500220e-02f, +1.661214427e-02f, +2.107957227e-02f, +2.506621864e-03f, -9.931034771e-03f, -6.167872094e-03f, +1.131132707e-03f, +2.090976552e-03f, +1.423449116e-04f, - /* 24, 7 */ +3.797950945e-04f, +2.538454547e-03f, +1.421687298e-04f, -7.639006136e-03f, -8.963207645e-03f, +6.333789781e-03f, +2.276982298e-02f, +1.198184460e-02f, -2.204434780e-02f, -3.571990598e-02f, -3.913776625e-03f, +3.685309369e-02f, +3.342299483e-02f, -9.641164594e-03f, -3.655380902e-02f, -1.787517696e-02f, +1.518796320e-02f, +2.175135864e-02f, +3.759049618e-03f, -9.682473374e-03f, -6.675812165e-03f, +8.300312585e-04f, +2.243004675e-03f, +2.135289700e-04f, - /* 24, 8 */ +2.926758839e-04f, +2.392634763e-03f, +5.000962484e-04f, -7.167671961e-03f, -9.360208124e-03f, +5.037212205e-03f, +2.231697999e-02f, +1.364235598e-02f, -1.999615271e-02f, -3.623851940e-02f, -6.806693291e-03f, +3.523120326e-02f, +3.523120326e-02f, -6.806693291e-03f, -3.623851940e-02f, -1.999615271e-02f, +1.364235598e-02f, +2.231697999e-02f, +5.037212205e-03f, -9.360208124e-03f, -7.167671961e-03f, +5.000962484e-04f, +2.392634763e-03f, +2.926758839e-04f, - /* 24, 9 */ +2.135289700e-04f, +2.243004675e-03f, +8.300312585e-04f, -6.675812165e-03f, -9.682473374e-03f, +3.759049618e-03f, +2.175135864e-02f, +1.518796320e-02f, -1.787517696e-02f, -3.655380902e-02f, -9.641164594e-03f, +3.342299483e-02f, +3.685309369e-02f, -3.913776625e-03f, -3.571990598e-02f, -2.204434780e-02f, +1.198184460e-02f, +2.276982298e-02f, +6.333789781e-03f, -8.963207645e-03f, -7.639006136e-03f, +1.421687298e-04f, +2.538454547e-03f, +3.797950945e-04f, - /* 24,10 */ +1.423449116e-04f, +2.090976552e-03f, +1.131132707e-03f, -6.167872094e-03f, -9.931034771e-03f, +2.506621864e-03f, +2.107957227e-02f, +1.661214427e-02f, -1.569500220e-02f, -3.666644182e-02f, -1.240139974e-02f, +3.143927100e-02f, +3.827896159e-02f, -9.786680537e-04f, -3.499853994e-02f, -2.400641001e-02f, +1.021382218e-02f, +2.310383199e-02f, +7.641095022e-03f, -8.490932000e-03f, -8.085315763e-03f, -2.426308611e-04f, +2.678978820e-03f, +4.748218959e-04f, - /* 24,11 */ +7.904503123e-05f, +1.937883690e-03f, +1.402832649e-03f, -5.648212144e-03f, -1.010739044e-02f, +1.286841938e-03f, +2.030873394e-02f, +1.790927350e-02f, -1.346934883e-02f, -3.657830513e-02f, -1.507216716e-02f, +2.929186185e-02f, +3.950026382e-02f, +1.982016505e-03f, -3.407624020e-02f, -2.586930694e-02f, +8.346521334e-03f, +2.331356438e-02f, +8.951116293e-03f, -7.943354450e-03f, -8.502081335e-03f, -6.528985547e-04f, +2.812656385e-03f, +5.776128643e-04f, - /* 24,12 */ +2.348660763e-05f, +1.784975276e-03f, +1.644827972e-03f, -5.121078221e-03f, -1.021347789e-02f, +1.061806254e-04f, +1.944639638e-02f, +1.907464002e-02f, -1.121198570e-02f, -3.629248103e-02f, -1.763888677e-02f, +2.699354793e-02f, +4.050967459e-02f, +4.951401864e-03f, -3.295607494e-02f, -2.762041561e-02f, +6.388976156e-03f, +2.339424278e-02f, +1.025556440e-02f, -7.320980005e-03f, -8.884797195e-03f, -1.086944946e-03f, +2.937877889e-03f, +6.879416803e-04f, - /* 24,13 */ -2.453170435e-05f, +1.633412152e-03f, +1.857070273e-03f, -4.590574200e-03f, -1.025164428e-02f, -1.029364704e-03f, +1.850049032e-02f, +2.010445982e-02f, -8.936640836e-03f, -3.581321303e-02f, -2.008771737e-02f, +2.455797710e-02f, +4.130113344e-02f, +7.912459038e-03f, -3.164235460e-02f, -2.924761047e-02f, +4.350977952e-03f, +2.334180387e-02f, +1.154592266e-02f, -6.624860539e-03f, -9.229007144e-03f, -1.542795645e-03f, +3.052984548e-03f, +8.054954021e-04f, - /* 24,14 */ -6.526428163e-05f, +1.484263468e-03f, +2.039754046e-03f, -4.060636553e-03f, -1.022461460e-02f, -2.114297018e-03f, +1.747926153e-02f, +2.099588115e-02f, -6.656913804e-03f, -3.514586546e-02f, -2.240563854e-02f, +2.199957595e-02f, +4.186988491e-02f, +1.084811230e-02f, -3.014061672e-02f, -3.073934924e-02f, +2.243024978e-03f, +2.315294314e-02f, +1.281349999e-02f, -5.856606243e-03f, -9.530340989e-03f, -2.018194158e-03f, +3.156277727e-03f, +9.298712414e-04f, - /* 24,15 */ -9.901282259e-05f, +1.338504197e-03f, +2.193303334e-03f, -3.535011248e-03f, -1.013545813e-02f, -3.143642175e-03f, +1.639120730e-02f, +2.174698353e-02f, -4.386190237e-03f, -3.429687591e-02f, -2.458052660e-02f, +1.933345641e-02f, +4.221250979e-02f, +1.374134711e-02f, -2.845760231e-02f, -3.208475603e-02f, +7.626640355e-05f, +2.282515537e-02f, +1.404948670e-02f, -5.018393221e-03f, -9.784551764e-03f, -2.510607281e-03f, +3.246029352e-03f, +1.060573898e-03f, - /* 20, 0 */ +2.832126065e-03f, -3.455346407e-03f, -1.050167676e-02f, +5.399047405e-04f, +2.072547687e-02f, +1.261483344e-02f, -2.310421022e-02f, -3.076111900e-02f, +1.034529168e-02f, +3.949755319e-02f, +1.034529168e-02f, -3.076111900e-02f, -2.310421022e-02f, +1.261483344e-02f, +2.072547687e-02f, +5.399047405e-04f, -1.050167676e-02f, -3.455346407e-03f, +2.832126065e-03f, +1.002136091e-03f, - /* 20, 1 */ +2.918309836e-03f, -2.848965042e-03f, -1.044663371e-02f, -7.454467031e-04f, +1.993701966e-02f, +1.431336010e-02f, -2.105256806e-02f, -3.196996361e-02f, +7.274030562e-03f, +3.936378623e-02f, +1.336427867e-02f, -2.932648708e-02f, -2.503260290e-02f, +1.078376120e-02f, +2.138841986e-02f, +1.874755806e-03f, -1.047502359e-02f, -4.071193337e-03f, +2.709872705e-03f, +1.184613130e-03f, - /* 20, 2 */ +2.970014434e-03f, -2.256846905e-03f, -1.031411254e-02f, -1.973175306e-03f, +1.903277841e-02f, +1.586999913e-02f, -1.889465735e-02f, -3.294695719e-02f, +4.172714360e-03f, +3.896348732e-02f, +1.630904655e-02f, -2.767391419e-02f, -2.682143551e-02f, +8.830742245e-03f, +2.191685631e-02f, +3.250271284e-03f, -1.036300090e-02f, -4.691364292e-03f, +2.550244709e-03f, +1.728121332e-03f, - /* 20, 3 */ +2.989084466e-03f, -1.683415968e-03f, -1.010881741e-02f, -3.135916081e-03f, +1.802312126e-02f, +1.727671449e-02f, -1.664798407e-02f, -3.368784795e-02f, +1.063660935e-03f, +3.829965427e-02f, +1.915809828e-02f, -2.581298498e-02f, -2.845520951e-02f, +6.767571398e-03f, +2.230262774e-02f, +4.656958119e-03f, -1.016253578e-02f, -5.310408414e-03f, +2.352251997e-03f, +1.906494808e-03f, - /* 20, 4 */ +2.977586348e-03f, -1.132697564e-03f, -9.835877420e-03f, -4.227100403e-03f, +1.691895133e-02f, +1.852681335e-02f, -1.433043179e-02f, -3.419021020e-02f, -2.030888217e-03f, +3.737725626e-02f, +2.189055571e-02f, -2.375496340e-02f, -2.991937541e-02f, +4.607167163e-03f, +2.253850054e-02f, +6.084727180e-03f, -9.871207756e-03f, -5.922604667e-03f, +2.115247068e-03f, +2.079939639e-03f, - /* 20, 5 */ +2.937775120e-03f, -6.082983663e-04f, -9.500783787e-03f, -5.240985904e-03f, +1.573160178e-02f, +1.961497125e-02f, -1.196011335e-02f, -3.445344345e-02f, -5.088941581e-03f, +3.620319350e-02f, +2.448632622e-02f, -2.151271924e-02f, -3.120046374e-02f, +2.363488482e-03f, +2.261825107e-02f, +7.522962281e-03f, -9.487296369e-03f, -6.522005316e-03f, +1.838950241e-03f, +2.245949018e-03f, - /* 20, 6 */ +2.872060854e-03f, -1.133913219e-04f, -9.109325922e-03f, -6.172678101e-03f, +1.447272980e-02f, +2.053724533e-02f, -9.555222824e-03f, -3.447875653e-02f, -8.088928223e-03f, +3.478624106e-02f, +2.692626358e-02f, -1.910064083e-02f, -3.228620876e-02f, +5.144107936e-05f, +2.253674404e-02f, +8.960596019e-03f, -9.009823935e-03f, -7.102483479e-03f, +1.523472156e-03f, +2.401928729e-03f, - /* 20, 7 */ +2.782975009e-03f, +3.492945151e-04f, -8.667527067e-03f, -7.018143782e-03f, +1.315421060e-02f, +2.129107545e-02f, -7.133889173e-03f, -3.426913715e-02f, -1.100986395e-02f, +3.313697764e-02f, +2.919232167e-02f, -1.653453452e-02f, -3.316566379e-02f, -2.313225982e-03f, +2.229000326e-02f, +1.038619190e-02f, -8.438592747e-03f, -7.657784411e-03f, +1.169333173e-03f, +2.545222121e-03f, - /* 20, 8 */ +2.673137115e-03f, +7.774793244e-04f, -8.181580147e-03f, -7.774216267e-03f, +1.178803215e-02f, +2.187527386e-02f, -4.714032773e-03f, -3.382930709e-02f, -1.383151166e-02f, +3.126769968e-02f, +3.126769968e-02f, -1.383151166e-02f, -3.382930709e-02f, -4.714032773e-03f, +2.187527386e-02f, +1.178803215e-02f, -7.774216267e-03f, -8.181580147e-03f, +7.774793244e-04f, +2.673137115e-03f, - /* 20, 9 */ +2.545222121e-03f, +1.169333173e-03f, -7.657784411e-03f, -8.438592747e-03f, +1.038619190e-02f, +2.229000326e-02f, -2.313225982e-03f, -3.316566379e-02f, -1.653453452e-02f, +2.919232167e-02f, +3.313697764e-02f, -1.100986395e-02f, -3.426913715e-02f, -7.133889173e-03f, +2.129107545e-02f, +1.315421060e-02f, -7.018143782e-03f, -8.667527067e-03f, +3.492945151e-04f, +2.782975009e-03f, - /* 20,10 */ +2.401928729e-03f, +1.523472156e-03f, -7.102483479e-03f, -9.009823935e-03f, +8.960596019e-03f, +2.253674404e-02f, +5.144107936e-05f, -3.228620876e-02f, -1.910064083e-02f, +2.692626358e-02f, +3.478624106e-02f, -8.088928223e-03f, -3.447875653e-02f, -9.555222824e-03f, +2.053724533e-02f, +1.447272980e-02f, -6.172678101e-03f, -9.109325922e-03f, -1.133913219e-04f, +2.872060854e-03f, - /* 20,11 */ +2.245949018e-03f, +1.838950241e-03f, -6.522005316e-03f, -9.487296369e-03f, +7.522962281e-03f, +2.261825107e-02f, +2.363488482e-03f, -3.120046374e-02f, -2.151271924e-02f, +2.448632622e-02f, +3.620319350e-02f, -5.088941581e-03f, -3.445344345e-02f, -1.196011335e-02f, +1.961497125e-02f, +1.573160178e-02f, -5.240985904e-03f, -9.500783787e-03f, -6.082983663e-04f, +2.937775120e-03f, - /* 20,12 */ +2.079939639e-03f, +2.115247068e-03f, -5.922604667e-03f, -9.871207756e-03f, +6.084727180e-03f, +2.253850054e-02f, +4.607167163e-03f, -2.991937541e-02f, -2.375496340e-02f, +2.189055571e-02f, +3.737725626e-02f, -2.030888217e-03f, -3.419021020e-02f, -1.433043179e-02f, +1.852681335e-02f, +1.691895133e-02f, -4.227100403e-03f, -9.835877420e-03f, -1.132697564e-03f, +2.977586348e-03f, - /* 20,13 */ +1.906494808e-03f, +2.352251997e-03f, -5.310408414e-03f, -1.016253578e-02f, +4.656958119e-03f, +2.230262774e-02f, +6.767571398e-03f, -2.845520951e-02f, -2.581298498e-02f, +1.915809828e-02f, +3.829965427e-02f, +1.063660935e-03f, -3.368784795e-02f, -1.664798407e-02f, +1.727671449e-02f, +1.802312126e-02f, -3.135916081e-03f, -1.010881741e-02f, -1.683415968e-03f, +2.989084466e-03f, - /* 20,14 */ +1.728121332e-03f, +2.550244709e-03f, -4.691364292e-03f, -1.036300090e-02f, +3.250271284e-03f, +2.191685631e-02f, +8.830742245e-03f, -2.682143551e-02f, -2.767391419e-02f, +1.630904655e-02f, +3.896348732e-02f, +4.172714360e-03f, -3.294695719e-02f, -1.889465735e-02f, +1.586999913e-02f, +1.903277841e-02f, -1.973175306e-03f, -1.031411254e-02f, -2.256846905e-03f, +2.970014434e-03f, - /* 20,15 */ +1.184613130e-03f, +2.709872705e-03f, -4.071193337e-03f, -1.047502359e-02f, +1.874755806e-03f, +2.138841986e-02f, +1.078376120e-02f, -2.503260290e-02f, -2.932648708e-02f, +1.336427867e-02f, +3.936378623e-02f, +7.274030562e-03f, -3.196996361e-02f, -2.105256806e-02f, +1.431336010e-02f, +1.993701966e-02f, -7.454467031e-04f, -1.044663371e-02f, -2.848965042e-03f, +2.918309836e-03f, - /* 20, 0 */ +1.702864838e-03f, +2.314577966e-03f, -6.534433696e-03f, -8.774562126e-03f, +1.199271213e-02f, +2.083400312e-02f, -1.263546899e-02f, -3.379691899e-02f, +5.498355442e-03f, +3.949755319e-02f, +5.498355442e-03f, -3.379691899e-02f, -1.263546899e-02f, +2.083400312e-02f, +1.199271213e-02f, -8.774562126e-03f, -6.534433696e-03f, +2.314577966e-03f, +1.702864838e-03f, +0.000000000e+00f, - /* 20, 1 */ +1.499435496e-03f, +2.547675666e-03f, -5.868098774e-03f, -9.353385898e-03f, +1.044920601e-02f, +2.160032962e-02f, -9.997584470e-03f, -3.429852636e-02f, +2.083565903e-03f, +3.933622696e-02f, +8.892197588e-03f, -3.300722623e-02f, -1.522519578e-02f, +1.986341365e-02f, +1.349096787e-02f, -8.082206357e-03f, -7.177938171e-03f, +2.033576095e-03f, +1.903844954e-03f, +0.000000000e+00f, - /* 20, 2 */ +8.979094201e-04f, +2.733567376e-03f, -5.187117330e-03f, -9.818374279e-03f, +8.876306372e-03f, +2.216139438e-02f, -7.335624654e-03f, -3.451169090e-02f, -1.322648265e-03f, +3.885370480e-02f, +1.223556951e-02f, -3.193245877e-02f, -1.774265256e-02f, +1.869155385e-02f, +1.492800767e-02f, -7.277832099e-03f, -7.790241855e-03f, +1.704529263e-03f, +2.099160368e-03f, -3.513221827e-04f, - /* 20, 3 */ +7.046452899e-04f, +2.873469547e-03f, -4.499404245e-03f, -1.017038969e-02f, +7.289604703e-03f, +2.251815219e-02f, -4.673411391e-03f, -3.443867914e-02f, -4.691042688e-03f, +3.805434209e-02f, +1.549922824e-02f, -3.057828381e-02f, -2.016393226e-02f, +1.732343066e-02f, +1.628791973e-02f, -6.364195274e-03f, -8.362876507e-03f, +1.327887989e-03f, +2.285430476e-03f, -3.288882594e-04f, - /* 20, 4 */ +5.275063595e-04f, +2.969073324e-03f, -3.812529364e-03f, -1.041140495e-02f, +5.704278009e-03f, +2.267345221e-02f, -2.034281900e-03f, -3.408432658e-02f, -7.992925296e-03f, +3.694535030e-02f, +1.865448932e-02f, -2.895300188e-02f, -2.246557005e-02f, +1.576606531e-02f, +1.755501285e-02f, -5.345313722e-03f, -8.887369558e-03f, +9.047221591e-04f, +2.459146683e-03f, -2.941732022e-04f, - /* 20, 5 */ +3.670219514e-04f, +3.022497230e-03f, -3.133648777e-03f, -1.054443774e-02f, +4.134948499e-03f, +2.263196075e-02f, +5.591264205e-04f, -3.345595810e-02f, -1.120042307e-02f, +3.553672638e-02f, +2.167350137e-02f, -2.706749712e-02f, -2.462477986e-02f, +1.402847243e-02f, +1.871398575e-02f, -4.226473266e-03f, -9.355341791e-03f, +4.367425848e-04f, +2.616713456e-03f, -2.461206998e-04f, - /* 20, 6 */ +2.234691091e-04f, +3.036236900e-03f, -2.469443903e-03f, -1.057347601e-02f, +2.595553432e-03f, +2.240006745e-02f, +3.085080219e-03f, -3.256328476e-02f, -1.428673893e-02f, +3.384115481e-02f, +2.452951370e-02f, -2.493516141e-02f, -2.661968788e-02f, +1.212161795e-02f, +1.975009719e-02f, -3.014219819e-03f, -9.758608118e-03f, -7.368451392e-05f, +2.754492916e-03f, -1.837671888e-04f, - /* 20, 7 */ +9.688872179e-05f, +3.013112613e-03f, -1.826068782e-03f, -1.050339555e-02f, +1.099226216e-03f, +2.198577609e-02f, +5.522941542e-03f, -3.141827834e-02f, -1.722639627e-02f, +3.187388359e-02f, +2.719713425e-02f, -2.257179274e-02f, -2.842956063e-02f, +1.005835593e-02f, +2.064933490e-02f, -1.716337171e-03f, -1.008928035e-02f, -6.235305950e-04f, +2.868852533e-03f, -1.062635081e-04f, - /* 20, 8 */ -1.289664191e-05f, +2.956215411e-03f, -1.209105881e-03f, -1.033987080e-02f, -3.418102460e-04f, +2.139858161e-02f, +7.853344535e-03f, -3.003502508e-02f, -1.999546871e-02f, +2.965257519e-02f, +2.965257519e-02f, -1.999546871e-02f, -3.003502508e-02f, +7.853344535e-03f, +2.139858161e-02f, -3.418102460e-04f, -1.033987080e-02f, -1.209105881e-03f, +2.956215411e-03f, -1.289664191e-05f, - /* 20, 9 */ -1.062635081e-04f, +2.868852533e-03f, -6.235305950e-04f, -1.008928035e-02f, -1.716337171e-03f, +2.064933490e-02f, +1.005835593e-02f, -2.842956063e-02f, -2.257179274e-02f, +2.719713425e-02f, +3.187388359e-02f, -1.722639627e-02f, -3.141827834e-02f, +5.522941542e-03f, +2.198577609e-02f, +1.099226216e-03f, -1.050339555e-02f, -1.826068782e-03f, +3.013112613e-03f, +9.688872179e-05f, - /* 20,10 */ -1.837671888e-04f, +2.754492916e-03f, -7.368451392e-05f, -9.758608118e-03f, -3.014219819e-03f, +1.975009719e-02f, +1.212161795e-02f, -2.661968788e-02f, -2.493516141e-02f, +2.452951370e-02f, +3.384115481e-02f, -1.428673893e-02f, -3.256328476e-02f, +3.085080219e-03f, +2.240006745e-02f, +2.595553432e-03f, -1.057347601e-02f, -2.469443903e-03f, +3.036236900e-03f, +2.234691091e-04f, - /* 20,11 */ -2.461206998e-04f, +2.616713456e-03f, +4.367425848e-04f, -9.355341791e-03f, -4.226473266e-03f, +1.871398575e-02f, +1.402847243e-02f, -2.462477986e-02f, -2.706749712e-02f, +2.167350137e-02f, +3.553672638e-02f, -1.120042307e-02f, -3.345595810e-02f, +5.591264205e-04f, +2.263196075e-02f, +4.134948499e-03f, -1.054443774e-02f, -3.133648777e-03f, +3.022497230e-03f, +3.670219514e-04f, - /* 20,12 */ -2.941732022e-04f, +2.459146683e-03f, +9.047221591e-04f, -8.887369558e-03f, -5.345313722e-03f, +1.755501285e-02f, +1.576606531e-02f, -2.246557005e-02f, -2.895300188e-02f, +1.865448932e-02f, +3.694535030e-02f, -7.992925296e-03f, -3.408432658e-02f, -2.034281900e-03f, +2.267345221e-02f, +5.704278009e-03f, -1.041140495e-02f, -3.812529364e-03f, +2.969073324e-03f, +5.275063595e-04f, - /* 20,13 */ -3.288882594e-04f, +2.285430476e-03f, +1.327887989e-03f, -8.362876507e-03f, -6.364195274e-03f, +1.628791973e-02f, +1.732343066e-02f, -2.016393226e-02f, -3.057828381e-02f, +1.549922824e-02f, +3.805434209e-02f, -4.691042688e-03f, -3.443867914e-02f, -4.673411391e-03f, +2.251815219e-02f, +7.289604703e-03f, -1.017038969e-02f, -4.499404245e-03f, +2.873469547e-03f, +7.046452899e-04f, - /* 20,14 */ -3.513221827e-04f, +2.099160368e-03f, +1.704529263e-03f, -7.790241855e-03f, -7.277832099e-03f, +1.492800767e-02f, +1.869155385e-02f, -1.774265256e-02f, -3.193245877e-02f, +1.223556951e-02f, +3.885370480e-02f, -1.322648265e-03f, -3.451169090e-02f, -7.335624654e-03f, +2.216139438e-02f, +8.876306372e-03f, -9.818374279e-03f, -5.187117330e-03f, +2.733567376e-03f, +8.979094201e-04f, - /* 20,15 */ +0.000000000e+00f, +1.903844954e-03f, +2.033576095e-03f, -7.177938171e-03f, -8.082206357e-03f, +1.349096787e-02f, +1.986341365e-02f, -1.522519578e-02f, -3.300722623e-02f, +8.892197588e-03f, +3.933622696e-02f, +2.083565903e-03f, -3.429852636e-02f, -9.997584470e-03f, +2.160032962e-02f, +1.044920601e-02f, -9.353385898e-03f, -5.868098774e-03f, +2.547675666e-03f, +1.499435496e-03f, - /* 20, 0 */ -3.735125865e-04f, +2.550984103e-03f, -2.725752467e-05f, -1.024966855e-02f, +8.379667777e-04f, +2.252874535e-02f, -1.249359695e-03f, -3.448318510e-02f, +6.071698875e-04f, +3.949755319e-02f, +6.071698875e-04f, -3.448318510e-02f, -1.249359695e-03f, +2.252874535e-02f, +8.379667777e-04f, -1.024966855e-02f, -2.725752467e-05f, +2.565652055e-03f, -3.735125865e-04f, +0.000000000e+00f, - /* 20, 1 */ -3.929324583e-04f, +2.236335973e-03f, +5.288730096e-04f, -9.916240655e-03f, -7.235223044e-04f, +2.212021870e-02f, +1.557339330e-03f, -3.412515163e-02f, -3.088657053e-03f, +3.930609269e-02f, +4.328121901e-03f, -3.450613681e-02f, -4.117983282e-03f, +2.271744325e-02f, +2.467540325e-03f, -1.048404473e-02f, -6.307983207e-04f, +2.729031078e-03f, -3.387491377e-04f, +0.000000000e+00f, - /* 20, 2 */ +0.000000000e+00f, +1.931175707e-03f, +1.033703668e-03f, -9.493276252e-03f, -2.202626937e-03f, +2.150371837e-02f, +4.274418757e-03f, -3.344119198e-02f, -6.721842627e-03f, +3.873376177e-02f, +8.036125742e-03f, -3.418837690e-02f, -7.019484999e-03f, +2.267661502e-02f, +4.149462009e-03f, -1.061062992e-02f, -1.276919763e-03f, +2.866023275e-03f, -2.870815261e-04f, +0.000000000e+00f, - /* 20, 3 */ +0.000000000e+00f, +1.638662038e-03f, +1.484286050e-03f, -8.990907936e-03f, -3.586602863e-03f, +2.069305390e-02f, +6.875821908e-03f, -3.244383298e-02f, -1.025584288e-02f, +3.778668841e-02f, +1.169297592e-02f, -3.352791602e-02f, -9.923776326e-03f, +2.239890298e-02f, +5.866701604e-03f, -1.062161571e-02f, -1.959867511e-03f, +2.971909246e-03f, -2.170808154e-04f, +0.000000000e+00f, - /* 20, 4 */ +0.000000000e+00f, +1.361489293e-03f, +1.878600735e-03f, -8.419725702e-03f, -4.864357078e-03f, +1.970376789e-02f, +9.337391966e-03f, -3.114878076e-02f, -1.365548733e-02f, +3.647500669e-02f, +1.526076366e-02f, -3.252647846e-02f, -1.280005487e-02f, +2.187944695e-02f, +7.601099328e-03f, -1.051027343e-02f, -2.672992279e-03f, +3.042103091e-03f, -1.274866066e-04f, +0.000000000e+00f, - /* 20, 5 */ +0.000000000e+00f, +1.101888322e-03f, +2.215532402e-03f, -7.790617836e-03f, -6.026519023e-03f, +1.855289977e-02f, +1.163710530e-02f, -2.957469445e-02f, -1.688736106e-02f, +3.481273909e-02f, +1.870230489e-02f, -3.118953221e-02f, -1.561714772e-02f, +2.111601531e-02f, +9.333550613e-03f, -1.027109466e-02f, -3.408794343e-03f, +3.072235528e-03f, -1.724424543e-05f, +0.000000000e+00f, - /* 20, 6 */ +0.000000000e+00f, +8.616336525e-04f, +2.494833248e-03f, -7.114614810e-03f, -7.065487327e-03f, +1.725873795e-02f, +1.375527431e-02f, -2.774292839e-02f, -1.992016339e-02f, +3.281763375e-02f, +2.198156213e-02f, -2.952627516e-02f, -1.834386597e-02f, +2.010910684e-02f, +1.104420948e-02f, -9.899921148e-03f, -4.158982805e-03f, +3.058238443e-03f, +1.144582079e-04f, +0.000000000e+00f, - /* 20, 7 */ +0.000000000e+00f, +6.420563626e-04f, +2.717075783e-03f, -6.402738187e-03f, -7.975452307e-03f, +1.584056403e-02f, +1.567471786e-02f, -2.567724669e-02f, -2.272503888e-02f, +3.051095862e-02f, +2.506405514e-02f, -2.754957697e-02f, -2.094936609e-02f, +1.886202143e-02f, +1.271270843e-02f, -9.394061811e-03f, -4.914549404e-03f, +2.996429606e-03f, +2.681538305e-04f, +0.000000000e+00f, - /* 20, 8 */ +0.000000000e+00f, +4.440621234e-04f, +2.883596201e-03f, -5.665856445e-03f, -8.752394750e-03f, +1.431839236e-02f, +1.738089791e-02f, -2.340351394e-02f, -2.527587699e-02f, +2.791725525e-02f, +2.791725525e-02f, -2.527587699e-02f, -2.340351394e-02f, +1.738089791e-02f, +1.431839236e-02f, -8.752394750e-03f, -5.665856445e-03f, +2.883596201e-03f, +4.440621234e-04f, +0.000000000e+00f, - /* 20, 9 */ +0.000000000e+00f, +2.681538305e-04f, +2.996429606e-03f, -4.914549404e-03f, -9.394061811e-03f, +1.271270843e-02f, +1.886202143e-02f, -2.094936609e-02f, -2.754957697e-02f, +2.506405514e-02f, +3.051095862e-02f, -2.272503888e-02f, -2.567724669e-02f, +1.567471786e-02f, +1.584056403e-02f, -7.975452307e-03f, -6.402738187e-03f, +2.717075783e-03f, +6.420563626e-04f, +0.000000000e+00f, - /* 20,10 */ +0.000000000e+00f, +1.144582079e-04f, +3.058238443e-03f, -4.158982805e-03f, -9.899921148e-03f, +1.104420948e-02f, +2.010910684e-02f, -1.834386597e-02f, -2.952627516e-02f, +2.198156213e-02f, +3.281763375e-02f, -1.992016339e-02f, -2.774292839e-02f, +1.375527431e-02f, +1.725873795e-02f, -7.065487327e-03f, -7.114614810e-03f, +2.494833248e-03f, +8.616336525e-04f, +0.000000000e+00f, - /* 20,11 */ +0.000000000e+00f, -1.724424543e-05f, +3.072235528e-03f, -3.408794343e-03f, -1.027109466e-02f, +9.333550613e-03f, +2.111601531e-02f, -1.561714772e-02f, -3.118953221e-02f, +1.870230489e-02f, +3.481273909e-02f, -1.688736106e-02f, -2.957469445e-02f, +1.163710530e-02f, +1.855289977e-02f, -6.026519023e-03f, -7.790617836e-03f, +2.215532402e-03f, +1.101888322e-03f, +0.000000000e+00f, - /* 20,12 */ +0.000000000e+00f, -1.274866066e-04f, +3.042103091e-03f, -2.672992279e-03f, -1.051027343e-02f, +7.601099328e-03f, +2.187944695e-02f, -1.280005487e-02f, -3.252647846e-02f, +1.526076366e-02f, +3.647500669e-02f, -1.365548733e-02f, -3.114878076e-02f, +9.337391966e-03f, +1.970376789e-02f, -4.864357078e-03f, -8.419725702e-03f, +1.878600735e-03f, +1.361489293e-03f, +0.000000000e+00f, - /* 20,13 */ +0.000000000e+00f, -2.170808154e-04f, +2.971909246e-03f, -1.959867511e-03f, -1.062161571e-02f, +5.866701604e-03f, +2.239890298e-02f, -9.923776326e-03f, -3.352791602e-02f, +1.169297592e-02f, +3.778668841e-02f, -1.025584288e-02f, -3.244383298e-02f, +6.875821908e-03f, +2.069305390e-02f, -3.586602863e-03f, -8.990907936e-03f, +1.484286050e-03f, +1.638662038e-03f, +0.000000000e+00f, - /* 20,14 */ +0.000000000e+00f, -2.870815261e-04f, +2.866023275e-03f, -1.276919763e-03f, -1.061062992e-02f, +4.149462009e-03f, +2.267661502e-02f, -7.019484999e-03f, -3.418837690e-02f, +8.036125742e-03f, +3.873376177e-02f, -6.721842627e-03f, -3.344119198e-02f, +4.274418757e-03f, +2.150371837e-02f, -2.202626937e-03f, -9.493276252e-03f, +1.033703668e-03f, +1.931175707e-03f, +0.000000000e+00f, - /* 20,15 */ +0.000000000e+00f, -3.387491377e-04f, +2.729031078e-03f, -6.307983207e-04f, -1.048404473e-02f, +2.467540325e-03f, +2.271744325e-02f, -4.117983282e-03f, -3.450613681e-02f, +4.328121901e-03f, +3.930609269e-02f, -3.088657053e-03f, -3.412515163e-02f, +1.557339330e-03f, +2.212021870e-02f, -7.235223044e-04f, -9.916240655e-03f, +5.288730096e-04f, +2.236335973e-03f, -3.929324583e-04f, - /* 16, 0 */ +3.044394378e-03f, -5.755865016e-03f, -7.644875237e-03f, +1.825808857e-02f, +9.222448502e-03f, -3.286388427e-02f, -4.241838036e-03f, +3.949755319e-02f, -4.241838036e-03f, -3.286388427e-02f, +9.222448502e-03f, +1.825808857e-02f, -7.644875237e-03f, -5.755865016e-03f, +3.044394378e-03f, -1.466795211e-05f, - /* 16, 1 */ +3.096598285e-03f, -4.938670705e-03f, -8.543525001e-03f, +1.681174815e-02f, +1.171692718e-02f, -3.156650717e-02f, -8.140229219e-03f, +3.927338559e-02f, -2.566011090e-04f, -3.380519836e-02f, +6.539747546e-03f, +1.954192550e-02f, -6.591652894e-03f, -6.554797296e-03f, +2.932700428e-03f, +1.424716020e-04f, - /* 16, 2 */ +3.093580763e-03f, -4.116215273e-03f, -9.283856280e-03f, +1.522768985e-02f, +1.399813452e-02f, -2.993548791e-02f, -1.190603152e-02f, +3.860369285e-02f, +3.768233493e-03f, -3.437220120e-02f, +3.697060454e-03f, +2.063975168e-02f, -5.390052618e-03f, -7.321916780e-03f, +2.757987679e-03f, +3.278051009e-04f, - /* 16, 3 */ +3.040228116e-03f, -3.300778044e-03f, -9.864516741e-03f, +1.353158972e-02f, +1.604446323e-02f, -2.799705310e-02f, -1.549559239e-02f, +3.749686691e-02f, +7.784523662e-03f, -3.455113173e-02f, +7.255039591e-04f, +2.152972014e-02f, -4.048737024e-03f, -8.043312786e-03f, +2.517583336e-03f, +5.415628140e-04f, - /* 16, 4 */ +2.941918573e-03f, -2.503765206e-03f, -1.028645874e-02f, +1.174962597e-02f, +1.783794825e-02f, -2.578082191e-02f, -1.886790220e-02f, +3.596676747e-02f, +1.174386090e-02f, -3.433297304e-02f, -2.341279491e-03f, +2.219201396e-02f, -2.578818314e-03f, -8.704920467e-03f, +2.209778110e-03f, +1.246855370e-03f, - /* 16, 5 */ +2.804395319e-03f, -1.735580001e-03f, -1.055281940e-02f, +9.908096520e-03f, +1.936441115e-02f, -2.331935318e-02f, -2.198510572e-02f, +3.403253365e-02f, +1.559820593e-02f, -3.371364718e-02f, -5.467520855e-03f, +2.260919785e-02f, -9.938011251e-04f, -9.292739628e-03f, +1.833922789e-03f, +1.492594630e-03f, - /* 16, 6 */ +2.633640678e-03f, -1.005515791e-03f, -1.066877263e-02f, +8.033047542e-03f, +2.061354789e-02f, -2.064765983e-02f, -2.481296600e-02f, +3.171832409e-02f, +1.930052332e-02f, -3.269414425e-02f, -8.615762914e-03f, +2.276654580e-02f, +6.905139302e-04f, -9.793063512e-03f, +1.390511455e-03f, +1.739628231e-03f, - /* 16, 7 */ +2.435753603e-03f, -3.216727033e-04f, -1.064135670e-02f, +6.149918447e-03f, +2.157895980e-02f, -1.780269814e-02f, -2.732127429e-02f, +2.905298940e-02f, +2.280540611e-02f, -3.128058296e-02f, -1.174733238e-02f, +2.265233903e-02f, +2.456165958e-03f, -1.019271416e-02f, +8.812491435e-04f, +1.982865330e-03f, - /* 16, 8 */ +2.216832517e-03f, +3.091018830e-04f, -1.047928070e-02f, +4.283208005e-03f, +2.225812888e-02f, -1.482283947e-02f, -2.948420097e-02f, +2.606968157e-02f, +2.606968157e-02f, -2.948420097e-02f, -1.482283947e-02f, +2.225812888e-02f, +4.283208005e-03f, -1.047928070e-02f, +3.091018830e-04f, +2.216832517e-03f, - /* 16, 9 */ +1.982865330e-03f, +8.812491435e-04f, -1.019271416e-02f, +2.456165958e-03f, +2.265233903e-02f, -1.174733238e-02f, -3.128058296e-02f, +2.280540611e-02f, +2.905298940e-02f, -2.732127429e-02f, -1.780269814e-02f, +2.157895980e-02f, +6.149918447e-03f, -1.064135670e-02f, -3.216727033e-04f, +2.435753603e-03f, - /* 16,10 */ +1.739628231e-03f, +1.390511455e-03f, -9.793063512e-03f, +6.905139302e-04f, +2.276654580e-02f, -8.615762914e-03f, -3.269414425e-02f, +1.930052332e-02f, +3.171832409e-02f, -2.481296600e-02f, -2.064765983e-02f, +2.061354789e-02f, +8.033047542e-03f, -1.066877263e-02f, -1.005515791e-03f, +2.633640678e-03f, - /* 16,11 */ +1.492594630e-03f, +1.833922789e-03f, -9.292739628e-03f, -9.938011251e-04f, +2.260919785e-02f, -5.467520855e-03f, -3.371364718e-02f, +1.559820593e-02f, +3.403253365e-02f, -2.198510572e-02f, -2.331935318e-02f, +1.936441115e-02f, +9.908096520e-03f, -1.055281940e-02f, -1.735580001e-03f, +2.804395319e-03f, - /* 16,12 */ +1.246855370e-03f, +2.209778110e-03f, -8.704920467e-03f, -2.578818314e-03f, +2.219201396e-02f, -2.341279491e-03f, -3.433297304e-02f, +1.174386090e-02f, +3.596676747e-02f, -1.886790220e-02f, -2.578082191e-02f, +1.783794825e-02f, +1.174962597e-02f, -1.028645874e-02f, -2.503765206e-03f, +2.941918573e-03f, - /* 16,13 */ +5.415628140e-04f, +2.517583336e-03f, -8.043312786e-03f, -4.048737024e-03f, +2.152972014e-02f, +7.255039591e-04f, -3.455113173e-02f, +7.784523662e-03f, +3.749686691e-02f, -1.549559239e-02f, -2.799705310e-02f, +1.604446323e-02f, +1.353158972e-02f, -9.864516741e-03f, -3.300778044e-03f, +3.040228116e-03f, - /* 16,14 */ +3.278051009e-04f, +2.757987679e-03f, -7.321916780e-03f, -5.390052618e-03f, +2.063975168e-02f, +3.697060454e-03f, -3.437220120e-02f, +3.768233493e-03f, +3.860369285e-02f, -1.190603152e-02f, -2.993548791e-02f, +1.399813452e-02f, +1.522768985e-02f, -9.283856280e-03f, -4.116215273e-03f, +3.093580763e-03f, - /* 16,15 */ +1.424716020e-04f, +2.932700428e-03f, -6.554797296e-03f, -6.591652894e-03f, +1.954192550e-02f, +6.539747546e-03f, -3.380519836e-02f, -2.566011090e-04f, +3.927338559e-02f, -8.140229219e-03f, -3.156650717e-02f, +1.171692718e-02f, +1.681174815e-02f, -8.543525001e-03f, -4.938670705e-03f, +3.096598285e-03f, - /* 16, 0 */ +2.106112688e-03f, -1.136549770e-04f, -1.070669430e-02f, +1.017472059e-02f, +1.725397418e-02f, -2.914959442e-02f, -8.963852042e-03f, +3.949755319e-02f, -8.963852042e-03f, -2.914959442e-02f, +1.725397418e-02f, +1.017472059e-02f, -1.070669430e-02f, -1.136549770e-04f, +2.106112688e-03f, +0.000000000e+00f, - /* 16, 1 */ +1.845338280e-03f, +5.473343456e-04f, -1.065891816e-02f, +8.155641030e-03f, +1.899089579e-02f, -2.691951328e-02f, -1.297236480e-02f, +3.923810803e-02f, -4.790894575e-03f, -3.103786392e-02f, +1.521305380e-02f, +1.215062389e-02f, -1.058864907e-02f, -8.385121370e-04f, +2.352913572e-03f, +0.000000000e+00f, - /* 16, 2 */ +1.577651889e-03f, +1.138027416e-03f, -1.045641117e-02f, +6.125232216e-03f, +2.040939526e-02f, -2.438627738e-02f, -1.676283724e-02f, +3.846353557e-02f, -5.100475811e-04f, -3.254996068e-02f, +1.288771825e-02f, +1.405076114e-02f, -1.029592106e-02f, -1.619065127e-03f, +2.578329862e-03f, +0.000000000e+00f, - /* 16, 3 */ +1.309641631e-03f, +1.653747621e-03f, -1.011218665e-02f, +4.114112388e-03f, +2.150028131e-02f, -2.159216402e-02f, -2.028541539e-02f, +3.718506562e-02f, +3.820010384e-03f, -3.365643786e-02f, +1.030255138e-02f, +1.584231759e-02f, -9.822158049e-03f, -2.445442331e-03f, +2.774741598e-03f, +0.000000000e+00f, - /* 16, 4 */ +5.462770218e-04f, +2.091544281e-03f, -9.640854940e-03f, +2.151223968e-03f, +2.225957955e-02f, -1.858235038e-02f, -2.349470263e-02f, +3.542121816e-02f, +8.139354376e-03f, -3.433331277e-02f, +7.486889709e-03f, +1.749279467e-02f, -9.163764446e-03f, -3.306153325e-03f, +2.934475195e-03f, -4.634120047e-04f, - /* 16, 5 */ +3.039101756e-04f, +2.450135010e-03f, -9.058284956e-03f, +2.634319572e-04f, +2.268843286e-02f, -1.540416082e-02f, -2.635039795e-02f, +3.319751225e-02f, +1.238771678e-02f, -3.456253827e-02f, +4.474489227e-03f, +1.897056596e-02f, -8.320109905e-03f, -4.188206830e-03f, +3.049970761e-03f, -4.400286560e-04f, - /* 16, 6 */ +9.722433303e-05f, +2.729819110e-03f, -8.381259809e-03f, -1.524826854e-03f, +2.279292110e-02f, -1.210629477e-02f, -2.881784707e-02f, +3.054606534e-02f, +1.650540309e-02f, -3.433238619e-02f, +1.303110212e-03f, +2.024543829e-02f, -7.293693549e-03f, -5.077265419e-03f, +3.113958519e-03f, -3.921992729e-04f, - /* 16, 7 */ -7.427658644e-05f, +2.932365266e-03f, -7.627133157e-03f, -3.191839567e-03f, +2.258380561e-02f, -8.738048497e-03f, -3.086849848e-02f, +2.750508980e-02f, +2.043420490e-02f, -3.363773532e-02f, -1.985974837e-03f, +2.128920837e-02f, -6.090258802e-03f, -5.957835775e-03f, +3.119640969e-03f, -3.169896142e-04f, - /* 16, 8 */ -2.117631665e-04f, +3.060877176e-03f, -6.813492559e-03f, -4.718854594e-03f, +2.207620481e-02f, -5.348543574e-03f, -3.248025769e-02f, +2.411829496e-02f, +2.411829496e-02f, -3.248025769e-02f, -5.348543574e-03f, +2.207620481e-02f, -4.718854594e-03f, -6.813492559e-03f, +3.060877176e-03f, -2.117631665e-04f, - /* 16, 9 */ -3.169896142e-04f, +3.119640969e-03f, -5.957835775e-03f, -6.090258802e-03f, +2.128920837e-02f, -1.985974837e-03f, -3.363773532e-02f, +2.043420490e-02f, +2.750508980e-02f, -3.086849848e-02f, -8.738048497e-03f, +2.258380561e-02f, -3.191839567e-03f, -7.627133157e-03f, +2.932365266e-03f, -7.427658644e-05f, - /* 16,10 */ -3.921992729e-04f, +3.113958519e-03f, -5.077265419e-03f, -7.293693549e-03f, +2.024543829e-02f, +1.303110212e-03f, -3.433238619e-02f, +1.650540309e-02f, +3.054606534e-02f, -2.881784707e-02f, -1.210629477e-02f, +2.279292110e-02f, -1.524826854e-03f, -8.381259809e-03f, +2.729819110e-03f, +9.722433303e-05f, - /* 16,11 */ -4.400286560e-04f, +3.049970761e-03f, -4.188206830e-03f, -8.320109905e-03f, +1.897056596e-02f, +4.474489227e-03f, -3.456253827e-02f, +1.238771678e-02f, +3.319751225e-02f, -2.635039795e-02f, -1.540416082e-02f, +2.268843286e-02f, +2.634319572e-04f, -9.058284956e-03f, +2.450135010e-03f, +3.039101756e-04f, - /* 16,12 */ -4.634120047e-04f, +2.934475195e-03f, -3.306153325e-03f, -9.163764446e-03f, +1.749279467e-02f, +7.486889709e-03f, -3.433331277e-02f, +8.139354376e-03f, +3.542121816e-02f, -2.349470263e-02f, -1.858235038e-02f, +2.225957955e-02f, +2.151223968e-03f, -9.640854940e-03f, +2.091544281e-03f, +5.462770218e-04f, - /* 16,13 */ +0.000000000e+00f, +2.774741598e-03f, -2.445442331e-03f, -9.822158049e-03f, +1.584231759e-02f, +1.030255138e-02f, -3.365643786e-02f, +3.820010384e-03f, +3.718506562e-02f, -2.028541539e-02f, -2.159216402e-02f, +2.150028131e-02f, +4.114112388e-03f, -1.011218665e-02f, +1.653747621e-03f, +1.309641631e-03f, - /* 16,14 */ +0.000000000e+00f, +2.578329862e-03f, -1.619065127e-03f, -1.029592106e-02f, +1.405076114e-02f, +1.288771825e-02f, -3.254996068e-02f, -5.100475811e-04f, +3.846353557e-02f, -1.676283724e-02f, -2.438627738e-02f, +2.040939526e-02f, +6.125232216e-03f, -1.045641117e-02f, +1.138027416e-03f, +1.577651889e-03f, - /* 16,15 */ +0.000000000e+00f, +2.352913572e-03f, -8.385121370e-04f, -1.058864907e-02f, +1.215062389e-02f, +1.521305380e-02f, -3.103786392e-02f, -4.790894575e-03f, +3.923810803e-02f, -1.297236480e-02f, -2.691951328e-02f, +1.899089579e-02f, +8.155641030e-03f, -1.065891816e-02f, +5.473343456e-04f, +1.845338280e-03f, - /* 16, 0 */ -2.517634455e-04f, +5.956310854e-03f, -8.647029609e-03f, +1.153545125e-03f, +2.185732832e-02f, -2.369518339e-02f, -1.347728153e-02f, +3.949755319e-02f, -1.347728153e-02f, -2.369518339e-02f, +2.185732832e-02f, +1.153545125e-03f, -8.647029609e-03f, +2.914798040e-03f, -2.517634455e-04f, +0.000000000e+00f, - /* 16, 1 */ -3.647589216e-04f, +5.559366521e-03f, -7.860683839e-03f, -8.150822761e-04f, +2.252089097e-02f, -2.063007883e-02f, -1.749200540e-02f, +3.920026256e-02f, -9.205150933e-03f, -2.647415600e-02f, +2.081322447e-02f, +3.223212212e-03f, -9.337661142e-03f, +2.677108373e-03f, -9.939782505e-05f, +0.000000000e+00f, - /* 16, 2 */ -4.414886472e-04f, +5.113535158e-03f, -7.000222932e-03f, -2.654422569e-03f, +2.280787202e-02f, -1.733513495e-02f, -2.118899605e-02f, +3.831333038e-02f, -4.740975303e-03f, -2.891426752e-02f, +1.939126736e-02f, +5.362271050e-03f, -9.911447152e-03f, +2.349799583e-03f, +9.477253367e-05f, +0.000000000e+00f, - /* 16, 3 */ -4.855802427e-04f, +4.633347213e-03f, -6.087250386e-03f, -4.340001532e-03f, +2.272858071e-02f, -1.386914009e-02f, -2.451395150e-02f, +3.685148678e-02f, -1.540603716e-04f, -3.096737610e-02f, +1.760097190e-02f, +7.536131493e-03f, -1.034820384e-02f, +1.931270179e-03f, +3.323676319e-04f, +0.000000000e+00f, - /* 16, 4 */ +0.000000000e+00f, +4.132457962e-03f, -5.142935987e-03f, -5.851401101e-03f, +2.229926864e-02f, -1.029228788e-02f, -2.741946400e-02f, +3.483898696e-02f, +4.483517704e-03f, -3.259088680e-02f, +1.545873378e-02f, +9.707799030e-03f, -1.062918096e-02f, +1.421916825e-03f, +6.140535745e-04f, +0.000000000e+00f, - /* 16, 5 */ +0.000000000e+00f, +3.623457200e-03f, -4.187611099e-03f, -7.172450485e-03f, +2.154162444e-02f, -6.665085054e-03f, -2.986575546e-02f, +3.230917458e-02f, +9.098146940e-03f, -3.374862716e-02f, +1.298775300e-02f, +1.183848413e-02f, -1.073754388e-02f, +8.242784646e-04f, +9.394126333e-04f, +0.000000000e+00f, - /* 16, 6 */ +0.000000000e+00f, +3.117716971e-03f, -3.240404345e-03f, -8.291325326e-03f, +2.048218318e-02f, -3.047278250e-03f, -3.182126614e-02f, +2.930388237e-02f, +1.361595241e-02f, -3.441162052e-02f, +1.021782484e-02f, +1.388827332e-02f, -1.065884073e-02f, +1.431392807e-04f, +1.306826648e-03f, +0.000000000e+00f, - /* 16, 7 */ +0.000000000e+00f, +2.625277441e-03f, -2.318923448e-03f, -9.200556695e-03f, +1.915166452e-02f, +5.031802154e-04f, -3.326308735e-02f, +2.587268140e-02f, +1.796408380e-02f, -3.455874049e-02f, +7.184998851e-03f, +1.581685040e-02f, -1.038144369e-02f, -6.144144569e-04f, +1.713377737e-03f, +0.000000000e+00f, - /* 16, 8 */ +0.000000000e+00f, +2.154770219e-03f, -1.438987736e-03f, -9.896953513e-03f, +1.758425506e-02f, +3.931108902e-03f, -3.417723209e-02f, +2.207199352e-02f, +2.207199352e-02f, -3.417723209e-02f, +3.931108902e-03f, +1.758425506e-02f, -9.896953513e-03f, -1.438987736e-03f, +2.154770219e-03f, +0.000000000e+00f, - /* 16, 9 */ +0.000000000e+00f, +1.713377737e-03f, -6.144144569e-04f, -1.038144369e-02f, +1.581685040e-02f, +7.184998851e-03f, -3.455874049e-02f, +1.796408380e-02f, +2.587268140e-02f, -3.326308735e-02f, +5.031802154e-04f, +1.915166452e-02f, -9.200556695e-03f, -2.318923448e-03f, +2.625277441e-03f, +0.000000000e+00f, - /* 16,10 */ +0.000000000e+00f, +1.306826648e-03f, +1.431392807e-04f, -1.065884073e-02f, +1.388827332e-02f, +1.021782484e-02f, -3.441162052e-02f, +1.361595241e-02f, +2.930388237e-02f, -3.182126614e-02f, -3.047278250e-03f, +2.048218318e-02f, -8.291325326e-03f, -3.240404345e-03f, +3.117716971e-03f, +0.000000000e+00f, - /* 16,11 */ +0.000000000e+00f, +9.394126333e-04f, +8.242784646e-04f, -1.073754388e-02f, +1.183848413e-02f, +1.298775300e-02f, -3.374862716e-02f, +9.098146940e-03f, +3.230917458e-02f, -2.986575546e-02f, -6.665085054e-03f, +2.154162444e-02f, -7.172450485e-03f, -4.187611099e-03f, +3.623457200e-03f, +0.000000000e+00f, - /* 16,12 */ +0.000000000e+00f, +6.140535745e-04f, +1.421916825e-03f, -1.062918096e-02f, +9.707799030e-03f, +1.545873378e-02f, -3.259088680e-02f, +4.483517704e-03f, +3.483898696e-02f, -2.741946400e-02f, -1.029228788e-02f, +2.229926864e-02f, -5.851401101e-03f, -5.142935987e-03f, +4.132457962e-03f, +0.000000000e+00f, - /* 16,13 */ +0.000000000e+00f, +3.323676319e-04f, +1.931270179e-03f, -1.034820384e-02f, +7.536131493e-03f, +1.760097190e-02f, -3.096737610e-02f, -1.540603716e-04f, +3.685148678e-02f, -2.451395150e-02f, -1.386914009e-02f, +2.272858071e-02f, -4.340001532e-03f, -6.087250386e-03f, +4.633347213e-03f, -4.855802427e-04f, - /* 16,14 */ +0.000000000e+00f, +9.477253367e-05f, +2.349799583e-03f, -9.911447152e-03f, +5.362271050e-03f, +1.939126736e-02f, -2.891426752e-02f, -4.740975303e-03f, +3.831333038e-02f, -2.118899605e-02f, -1.733513495e-02f, +2.280787202e-02f, -2.654422569e-03f, -7.000222932e-03f, +5.113535158e-03f, -4.414886472e-04f, - /* 16,15 */ +0.000000000e+00f, -9.939782505e-05f, +2.677108373e-03f, -9.337661142e-03f, +3.223212212e-03f, +2.081322447e-02f, -2.647415600e-02f, -9.205150933e-03f, +3.920026256e-02f, -1.749200540e-02f, -2.063007883e-02f, +2.252089097e-02f, -8.150822761e-04f, -7.860683839e-03f, +5.559366521e-03f, -3.647589216e-04f, - /* 12, 0 */ -3.924537125e-03f, -6.177283790e-03f, +2.270137823e-02f, -1.696686670e-02f, -1.770529738e-02f, +3.949755319e-02f, -1.770529738e-02f, -1.696686670e-02f, +2.270137823e-02f, -6.177283790e-03f, -3.924537125e-03f, +2.689823824e-03f, - /* 12, 1 */ -2.918444824e-03f, -7.533875928e-03f, +2.217225575e-02f, -1.325050127e-02f, -2.161377319e-02f, +3.915985190e-02f, -1.343239533e-02f, -2.049610855e-02f, +2.283609035e-02f, -4.600700986e-03f, -4.945631587e-03f, +2.897838580e-03f, - /* 12, 2 */ -1.948111766e-03f, -8.657444743e-03f, +2.127619260e-02f, -9.420045488e-03f, -2.509275167e-02f, +3.815312062e-02f, -8.867972963e-03f, -2.376686078e-02f, +2.255583139e-02f, -2.822790564e-03f, -5.958903400e-03f, +3.051876120e-03f, - /* 12, 3 */ -1.031879811e-03f, -9.540571177e-03f, +2.004673480e-02f, -5.548699503e-03f, -2.808617760e-02f, +3.649634673e-02f, -4.091413649e-03f, -2.671092541e-02f, +2.184766025e-02f, -8.677312765e-04f, -6.939883353e-03f, +3.140832095e-03f, - /* 12, 4 */ -1.854082964e-04f, -1.018130776e-02f, +1.852257236e-02f, -1.708362919e-03f, -3.054799363e-02f, +3.422074403e-02f, +8.129280323e-04f, -2.926474106e-02f, +2.070682375e-02f, +1.235031889e-03f, -7.862950435e-03f, +3.154329873e-03f, - /* 12, 5 */ +5.785109863e-04f, -1.058292035e-02f, +1.674653148e-02f, +2.031769072e-03f, -3.244290444e-02f, +3.136911490e-02f, +5.757350815e-03f, -3.137078637e-02f, +1.913716500e-02f, +3.451172065e-03f, -8.701884951e-03f, +3.083080347e-03f, - /* 12, 6 */ +1.250056620e-03f, -1.075352499e-02f, +1.476451598e-02f, +5.606517218e-03f, -3.374690984e-02f, +2.799497691e-02f, +1.065251585e-02f, -3.297888633e-02f, +1.715135739e-02f, +5.741996578e-03f, -9.430471381e-03f, +2.919238566e-03f, - /* 12, 7 */ +1.822400383e-03f, -1.070563332e-02f, +1.262442359e-02f, +8.955911342e-03f, -3.444759838e-02f, +2.416147295e-02f, +1.540920462e-02f, -3.404739100e-02f, +1.477095353e-02f, +8.065088216e-03f, -1.002313834e-02f, +2.656746896e-03f, - /* 12, 8 */ +2.291654178e-03f, -1.045562141e-02f, +1.037506188e-02f, +1.202624229e-02f, -3.454419870e-02f, +1.994008861e-02f, +1.994008861e-02f, -3.454419870e-02f, +1.202624229e-02f, +1.037506188e-02f, -1.045562141e-02f, +2.291654178e-03f, - /* 12, 9 */ +2.656746896e-03f, -1.002313834e-02f, +8.065088216e-03f, +1.477095353e-02f, -3.404739100e-02f, +1.540920462e-02f, +2.416147295e-02f, -3.444759838e-02f, +8.955911342e-03f, +1.262442359e-02f, -1.070563332e-02f, +1.822400383e-03f, - /* 12,10 */ +2.919238566e-03f, -9.430471381e-03f, +5.741996578e-03f, +1.715135739e-02f, -3.297888633e-02f, +1.065251585e-02f, +2.799497691e-02f, -3.374690984e-02f, +5.606517218e-03f, +1.476451598e-02f, -1.075352499e-02f, +1.250056620e-03f, - /* 12,11 */ +3.083080347e-03f, -8.701884951e-03f, +3.451172065e-03f, +1.913716500e-02f, -3.137078637e-02f, +5.757350815e-03f, +3.136911490e-02f, -3.244290444e-02f, +2.031769072e-03f, +1.674653148e-02f, -1.058292035e-02f, +5.785109863e-04f, - /* 12,12 */ +3.154329873e-03f, -7.862950435e-03f, +1.235031889e-03f, +2.070682375e-02f, -2.926474106e-02f, +8.129280323e-04f, +3.422074403e-02f, -3.054799363e-02f, -1.708362919e-03f, +1.852257236e-02f, -1.018130776e-02f, -1.854082964e-04f, - /* 12,13 */ +3.140832095e-03f, -6.939883353e-03f, -8.677312765e-04f, +2.184766025e-02f, -2.671092541e-02f, -4.091413649e-03f, +3.649634673e-02f, -2.808617760e-02f, -5.548699503e-03f, +2.004673480e-02f, -9.540571177e-03f, -1.031879811e-03f, - /* 12,14 */ +3.051876120e-03f, -5.958903400e-03f, -2.822790564e-03f, +2.255583139e-02f, -2.376686078e-02f, -8.867972963e-03f, +3.815312062e-02f, -2.509275167e-02f, -9.420045488e-03f, +2.127619260e-02f, -8.657444743e-03f, -1.948111766e-03f, - /* 12,15 */ +2.897838580e-03f, -4.945631587e-03f, -4.600700986e-03f, +2.283609035e-02f, -2.049610855e-02f, -1.343239533e-02f, +3.915985190e-02f, -2.161377319e-02f, -1.325050127e-02f, +2.217225575e-02f, -7.533875928e-03f, -2.918444824e-03f, - /* 12, 0 */ +5.529156756e-04f, -1.017944650e-02f, +2.010395691e-02f, -9.501724583e-03f, -2.157725737e-02f, +3.949755319e-02f, -2.157725737e-02f, -9.501724583e-03f, +2.010395691e-02f, -1.017944650e-02f, +5.529156756e-04f, +9.520529918e-04f, - /* 12, 1 */ +1.269440891e-03f, -1.060857725e-02f, +1.848426560e-02f, -5.389674050e-03f, -2.526172923e-02f, +3.911687897e-02f, -1.740939271e-02f, -1.356576871e-02f, +2.138958875e-02f, -9.480008902e-03f, -2.676127190e-04f, +1.273328470e-03f, - /* 12, 2 */ +1.873685854e-03f, -1.077705214e-02f, +1.658179711e-02f, -1.315683663e-03f, -2.839592801e-02f, +3.798295250e-02f, -1.283645305e-02f, -1.749413418e-02f, +2.229518867e-02f, -8.506812328e-03f, -1.180051037e-03f, +1.604489886e-03f, - /* 12, 3 */ +2.361120897e-03f, -1.070010905e-02f, +1.445171501e-02f, +2.637679549e-03f, -3.092573063e-02f, +3.611987567e-02f, -7.946589383e-03f, -2.119952675e-02f, +2.278144860e-02f, -7.263083188e-03f, -2.168530550e-03f, +1.934678236e-03f, - /* 12, 4 */ +2.730794315e-03f, -1.039785120e-02f, +1.215160004e-02f, +6.393108320e-03f, -3.281077803e-02f, +3.356720057e-02f, -2.835931904e-03f, -2.459705675e-02f, +2.281696739e-02f, -5.759053577e-03f, -3.213563229e-03f, +2.251787566e-03f, - /* 12, 5 */ +2.985073479e-03f, -9.894440683e-03f, +9.739988515e-03f, +9.880142532e-03f, -3.402514934e-02f, +3.037901891e-02f, +2.393471366e-03f, -2.760625942e-02f, +2.237934513e-02f, -4.012119167e-03f, -4.292316215e-03f, +2.542756696e-03f, - /* 12, 6 */ +3.129309714e-03f, -9.217233004e-03f, +7.274949975e-03f, +1.303654969e-02f, -3.455769209e-02f, +2.662271867e-02f, +7.635875993e-03f, -3.015305887e-02f, +2.145609570e-02f, -2.046814992e-03f, -5.379003980e-03f, +2.793918230e-03f, - /* 12, 7 */ +3.171441616e-03f, -8.395878746e-03f, +4.812738303e-03f, +1.580947051e-02f, -3.441200543e-02f, +2.237743869e-02f, +1.278417054e-02f, -3.217162603e-02f, +2.004534769e-02f, +1.053992035e-04f, -6.445394017e-03f, +2.991397563e-03f, - /* 12, 8 */ +3.121552430e-03f, -7.461418245e-03f, +2.406547485e-03f, +1.815630830e-02f, -3.360608252e-02f, +1.773225889e-02f, +1.773225889e-02f, -3.360608252e-02f, +1.815630830e-02f, +2.406547485e-03f, -7.461418245e-03f, +3.121552430e-03f, - /* 12, 9 */ +2.991397563e-03f, -6.445394017e-03f, +1.053992035e-04f, +2.004534769e-02f, -3.217162603e-02f, +1.278417054e-02f, +2.237743869e-02f, -3.441200543e-02f, +1.580947051e-02f, +4.812738303e-03f, -8.395878746e-03f, +3.171441616e-03f, - /* 12,10 */ +2.793918230e-03f, -5.379003980e-03f, -2.046814992e-03f, +2.145609570e-02f, -3.015305887e-02f, +7.635875993e-03f, +2.662271867e-02f, -3.455769209e-02f, +1.303654969e-02f, +7.274949975e-03f, -9.217233004e-03f, +3.129309714e-03f, - /* 12,11 */ +2.542756696e-03f, -4.292316215e-03f, -4.012119167e-03f, +2.237934513e-02f, -2.760625942e-02f, +2.393471366e-03f, +3.037901891e-02f, -3.402514934e-02f, +9.880142532e-03f, +9.739988515e-03f, -9.894440683e-03f, +2.985073479e-03f, - /* 12,12 */ +2.251787566e-03f, -3.213563229e-03f, -5.759053577e-03f, +2.281696739e-02f, -2.459705675e-02f, -2.835931904e-03f, +3.356720057e-02f, -3.281077803e-02f, +6.393108320e-03f, +1.215160004e-02f, -1.039785120e-02f, +2.730794315e-03f, - /* 12,13 */ +1.934678236e-03f, -2.168530550e-03f, -7.263083188e-03f, +2.278144860e-02f, -2.119952675e-02f, -7.946589383e-03f, +3.611987567e-02f, -3.092573063e-02f, +2.637679549e-03f, +1.445171501e-02f, -1.070010905e-02f, +2.361120897e-03f, - /* 12,14 */ +1.604489886e-03f, -1.180051037e-03f, -8.506812328e-03f, +2.229518867e-02f, -1.749413418e-02f, -1.283645305e-02f, +3.798295250e-02f, -2.839592801e-02f, -1.315683663e-03f, +1.658179711e-02f, -1.077705214e-02f, +1.873685854e-03f, - /* 12,15 */ +1.273328470e-03f, -2.676127190e-04f, -9.480008902e-03f, +2.138958875e-02f, -1.356576871e-02f, -1.740939271e-02f, +3.911687897e-02f, -2.526172923e-02f, -5.389674050e-03f, +1.848426560e-02f, -1.060857725e-02f, +1.269440891e-03f, - - /* 24, 0 */ -8.820438069e-05f, -1.519461079e-04f, -2.301651496e-04f, -3.149320871e-04f, -3.945939739e-04f, -4.554410135e-04f, -4.841532882e-04f, -4.705408991e-04f, -4.099602091e-04f, -3.048100066e-04f, -1.646897470e-04f, -5.099007530e-06f, +1.551006323e-04f, +2.969416536e-04f, +4.046294158e-04f, +4.681429482e-04f, +4.846228261e-04f, +4.583040637e-04f, +3.990939388e-04f, +3.201968846e-04f, +2.353759082e-04f, +1.564712483e-04f, +9.167483068e-05f, +4.482688286e-05f, - /* 24, 1 */ -8.480575132e-05f, -1.474789784e-04f, -2.249812225e-04f, -3.096480504e-04f, -3.900204007e-04f, -4.524514078e-04f, -4.835165803e-04f, -4.727530367e-04f, -4.151145025e-04f, -3.125397891e-04f, -1.742016828e-04f, -1.529460870e-05f, +1.454387449e-04f, +2.889379628e-04f, +3.991236794e-04f, +4.655589110e-04f, +4.849233000e-04f, +4.610375470e-04f, +4.035168325e-04f, +3.254391996e-04f, +2.406110065e-04f, +1.610529558e-04f, +9.521673594e-05f, +4.721513201e-05f, - /* 24, 2 */ -8.147924507e-05f, -1.430712350e-04f, -2.198265592e-04f, -3.043479843e-04f, -3.853766873e-04f, -4.493383067e-04f, -4.827146831e-04f, -4.747797448e-04f, -4.200908527e-04f, -3.201278616e-04f, -1.836320864e-04f, -2.548296987e-05f, +1.357085413e-04f, +2.808022583e-04f, +3.934446700e-04f, +4.627886263e-04f, +4.850529052e-04f, +4.636385032e-04f, +4.078592000e-04f, +3.306557574e-04f, +2.458678944e-04f, +1.656897170e-04f, +9.882966748e-05f, +4.967415993e-05f, - /* 24, 3 */ -7.822510242e-05f, -1.387241832e-04f, -2.147035314e-04f, -2.990350629e-04f, -3.806663042e-04f, -4.461048161e-04f, -4.817496625e-04f, -4.766215175e-04f, -4.248879309e-04f, -3.275711800e-04f, -1.929766610e-04f, -3.565926997e-05f, +1.259145254e-04f, +2.725379532e-04f, +3.875941701e-04f, +4.598320457e-04f, +4.850099279e-04f, +4.661040260e-04f, +4.121175966e-04f, +3.358432542e-04f, +2.511439643e-04f, +1.703799499e-04f, +1.025131319e-04f, +5.220438912e-05f, - /* 24, 4 */ -7.504350274e-05f, -1.344390595e-04f, -2.096144489e-04f, -2.937124231e-04f, -3.758927218e-04f, -4.427540852e-04f, -4.806236671e-04f, -4.782789577e-04f, -4.295045226e-04f, -3.348667971e-04f, -2.022311686e-04f, -4.581869630e-05f, +1.160612449e-04f, +2.641485480e-04f, +3.815740737e-04f, +4.566892339e-04f, +4.847927474e-04f, +4.684312656e-04f, +4.162885910e-04f, +3.409983591e-04f, +2.564365532e-04f, +1.751220037e-04f, +1.062665706e-04f, +5.480619333e-05f, - /* 24, 5 */ -7.193456522e-05f, -1.302170312e-04f, -2.045615590e-04f, -2.883831622e-04f, -3.710594077e-04f, -4.392893036e-04f, -4.793389263e-04f, -4.797527765e-04f, -4.339395286e-04f, -3.420118645e-04f, -2.113914331e-04f, -5.595644787e-05f, +1.061532886e-04f, +2.556376279e-04f, +3.753863858e-04f, +4.533603695e-04f, +4.843998374e-04f, +4.706174312e-04f, +4.203687678e-04f, +3.461177167e-04f, +2.617429433e-04f, +1.799141593e-04f, +1.100893595e-04f, +5.747989630e-05f, - /* 24, 6 */ -6.889834987e-05f, -1.260591965e-04f, -1.995470454e-04f, -2.830503358e-04f, -3.661698243e-04f, -4.357136989e-04f, -4.778977479e-04f, -4.810437916e-04f, -4.381919648e-04f, -3.490036345e-04f, -2.204533432e-04f, -6.606773875e-05f, +9.619528314e-05f, +2.470088608e-04f, +3.690332209e-04f, +4.498457452e-04f, +4.838297683e-04f, +4.726597937e-04f, +4.243547301e-04f, +3.511979487e-04f, +2.670603639e-04f, +1.847546294e-04f, +1.139808078e-04f, +6.022577049e-05f, - /* 24, 7 */ -6.593485851e-05f, -1.219665852e-04f, -1.945730275e-04f, -2.777169567e-04f, -3.612274261e-04f, -4.320305335e-04f, -4.763025159e-04f, -4.821529264e-04f, -4.422609626e-04f, -3.558394612e-04f, -2.294128549e-04f, -7.614780136e-05f, +8.619188981e-05f, +2.382659945e-04f, +3.625168024e-04f, +4.461457687e-04f, +4.830812085e-04f, +4.745556880e-04f, +4.282431024e-04f, +3.562356572e-04f, +2.723859925e-04f, +1.896415594e-04f, +1.179401580e-04f, +6.304403582e-05f, - /* 24, 8 */ -6.304403582e-05f, -1.179401580e-04f, -1.896415594e-04f, -2.723859925e-04f, -3.562356572e-04f, -4.282431024e-04f, -4.745556880e-04f, -4.830812085e-04f, -4.461457687e-04f, -3.625168024e-04f, -2.382659945e-04f, -8.619188981e-05f, +7.614780136e-05f, +2.294128549e-04f, +3.558394612e-04f, +4.422609626e-04f, +4.821529264e-04f, +4.763025159e-04f, +4.320305335e-04f, +3.612274261e-04f, +2.777169567e-04f, +1.945730275e-04f, +1.219665852e-04f, +6.593485851e-05f, - /* 24, 9 */ -6.022577049e-05f, -1.139808078e-04f, -1.847546294e-04f, -2.670603639e-04f, -3.511979487e-04f, -4.243547301e-04f, -4.726597937e-04f, -4.838297683e-04f, -4.498457452e-04f, -3.690332209e-04f, -2.470088608e-04f, -9.619528314e-05f, +6.606773875e-05f, +2.204533432e-04f, +3.490036345e-04f, +4.381919648e-04f, +4.810437916e-04f, +4.778977479e-04f, +4.357136989e-04f, +3.661698243e-04f, +2.830503358e-04f, +1.995470454e-04f, +1.260591965e-04f, +6.889834987e-05f, - /* 24,10 */ -5.747989630e-05f, -1.100893595e-04f, -1.799141593e-04f, -2.617429433e-04f, -3.461177167e-04f, -4.203687678e-04f, -4.706174312e-04f, -4.843998374e-04f, -4.533603695e-04f, -3.753863858e-04f, -2.556376279e-04f, -1.061532886e-04f, +5.595644787e-05f, +2.113914331e-04f, +3.420118645e-04f, +4.339395286e-04f, +4.797527765e-04f, +4.793389263e-04f, +4.392893036e-04f, +3.710594077e-04f, +2.883831622e-04f, +2.045615590e-04f, +1.302170312e-04f, +7.193456522e-05f, - /* 24,11 */ -5.480619333e-05f, -1.062665706e-04f, -1.751220037e-04f, -2.564365532e-04f, -3.409983591e-04f, -4.162885910e-04f, -4.684312656e-04f, -4.847927474e-04f, -4.566892339e-04f, -3.815740737e-04f, -2.641485480e-04f, -1.160612449e-04f, +4.581869630e-05f, +2.022311686e-04f, +3.348667971e-04f, +4.295045226e-04f, +4.782789577e-04f, +4.806236671e-04f, +4.427540852e-04f, +3.758927218e-04f, +2.937124231e-04f, +2.096144489e-04f, +1.344390595e-04f, +7.504350274e-05f, - /* 24,12 */ -5.220438912e-05f, -1.025131319e-04f, -1.703799499e-04f, -2.511439643e-04f, -3.358432542e-04f, -4.121175966e-04f, -4.661040260e-04f, -4.850099279e-04f, -4.598320457e-04f, -3.875941701e-04f, -2.725379532e-04f, -1.259145254e-04f, +3.565926997e-05f, +1.929766610e-04f, +3.275711800e-04f, +4.248879309e-04f, +4.766215175e-04f, +4.817496625e-04f, +4.461048161e-04f, +3.806663042e-04f, +2.990350629e-04f, +2.147035314e-04f, +1.387241832e-04f, +7.822510242e-05f, - /* 24,13 */ -4.967415993e-05f, -9.882966748e-05f, -1.656897170e-04f, -2.458678944e-04f, -3.306557574e-04f, -4.078592000e-04f, -4.636385032e-04f, -4.850529052e-04f, -4.627886263e-04f, -3.934446700e-04f, -2.808022583e-04f, -1.357085413e-04f, +2.548296987e-05f, +1.836320864e-04f, +3.201278616e-04f, +4.200908527e-04f, +4.747797448e-04f, +4.827146831e-04f, +4.493383067e-04f, +3.853766873e-04f, +3.043479843e-04f, +2.198265592e-04f, +1.430712350e-04f, +8.147924507e-05f, - /* 24,14 */ -4.721513201e-05f, -9.521673594e-05f, -1.610529558e-04f, -2.406110065e-04f, -3.254391996e-04f, -4.035168325e-04f, -4.610375470e-04f, -4.849233000e-04f, -4.655589110e-04f, -3.991236794e-04f, -2.889379628e-04f, -1.454387449e-04f, +1.529460870e-05f, +1.742016828e-04f, +3.125397891e-04f, +4.151145025e-04f, +4.727530367e-04f, +4.835165803e-04f, +4.524514078e-04f, +3.900204007e-04f, +3.096480504e-04f, +2.249812225e-04f, +1.474789784e-04f, +8.480575132e-05f, - /* 24,15 */ -4.482688286e-05f, -9.167483068e-05f, -1.564712483e-04f, -2.353759082e-04f, -3.201968846e-04f, -3.990939388e-04f, -4.583040637e-04f, -4.846228261e-04f, -4.681429482e-04f, -4.046294158e-04f, -2.969416536e-04f, -1.551006323e-04f, +5.099007530e-06f, +1.646897470e-04f, +3.048100066e-04f, +4.099602091e-04f, +4.705408991e-04f, +4.841532882e-04f, +4.554410135e-04f, +3.945939739e-04f, +3.149320871e-04f, +2.301651496e-04f, +1.519461079e-04f, +8.820438069e-05f, - /* 24, 0 */ +3.721332452e-05f, -8.727351622e-06f, -1.260052743e-04f, -3.262895896e-04f, -5.956603662e-04f, -8.899501259e-04f, -1.140781305e-03f, -1.272347980e-03f, -1.224469676e-03f, -9.741728935e-04f, -5.476309302e-04f, -1.718639697e-05f, +5.165697336e-04f, +9.521355524e-04f, +1.214742061e-03f, +1.275075958e-03f, +1.153251370e-03f, +9.076938752e-04f, +6.139361451e-04f, +3.414081512e-04f, +1.360881127e-04f, +1.374767685e-05f, -3.597568203e-05f, -3.836441874e-05f, - /* 24, 1 */ +3.827272022e-05f, -3.990309212e-06f, -1.162552839e-04f, -3.114511951e-04f, -5.774902753e-04f, -8.720393210e-04f, -1.127840237e-03f, -1.268906542e-03f, -1.233389975e-03f, -9.955061195e-04f, -5.782766642e-04f, -5.154594549e-05f, +4.851159022e-04f, +9.294071718e-04f, +1.204207601e-03f, +1.277079499e-03f, +1.165232472e-03f, +9.252515980e-04f, +6.323029482e-04f, +3.567995352e-04f, +1.465038861e-04f, +1.905656402e-05f, -3.455261727e-05f, -3.906074609e-05f, - /* 24, 2 */ +3.916105537e-05f, +4.689475139e-07f, -1.068376458e-04f, -2.968998221e-04f, -5.594401371e-04f, -8.539803004e-04f, -1.114446367e-03f, -1.264763218e-03f, -1.241503276e-03f, -1.016122900e-03f, -6.084845647e-04f, -8.586577249e-05f, +4.532926958e-04f, +9.060015608e-04f, +1.192867560e-03f, +1.278348235e-03f, +1.176706916e-03f, +9.426042142e-04f, +6.507457252e-04f, +3.724559064e-04f, +1.572522637e-04f, +2.465906089e-05f, -3.293697730e-05f, -3.967556907e-05f, - /* 24, 3 */ +3.988551544e-05f, +4.656120273e-06f, -9.775146571e-05f, -2.826418349e-04f, -5.415238064e-04f, -8.357917522e-04f, -1.100618114e-03f, -1.259930153e-03f, -1.248810685e-03f, -1.036011659e-03f, -6.382327409e-04f, -1.201194461e-04f, +4.211237814e-04f, +8.819332498e-04f, +1.180724004e-03f, +1.278872430e-03f, +1.187657300e-03f, +9.597325558e-04f, +6.692490513e-04f, +3.883689407e-04f, +1.683324883e-04f, +3.055997058e-05f, -3.112164378e-05f, -4.020250110e-05f, - /* 24, 4 */ +4.045327387e-05f, +8.577101915e-06f, -8.899546026e-05f, -2.686831091e-04f, -5.237547173e-04f, -8.174921923e-04f, -1.086374092e-03f, -1.254420050e-03f, -1.255314082e-03f, -1.055161588e-03f, -6.674998060e-04f, -1.542806079e-04f, +3.886332072e-04f, +8.572174771e-04f, +1.167779798e-03f, +1.278642989e-03f, +1.198066533e-03f, +9.766173891e-04f, +6.877971412e-04f, +4.045298263e-04f, +1.797433681e-04f, +3.676383839e-05f, -2.909954521e-05f, -4.063504078e-05f, - /* 24, 5 */ +4.087148106e-05f, +1.223796294e-05f, -8.056796775e-05f, -2.550290329e-04f, -5.061458738e-04f, -7.990999447e-04f, -1.071733083e-03f, -1.248246148e-03f, -1.261016119e-03f, -1.073562648e-03f, -6.962648992e-04f, -1.883230024e-04f, +3.558453770e-04f, +8.318701747e-04f, +1.154038613e-03f, +1.277651484e-03f, +1.207917863e-03f, +9.932394374e-04f, +7.063738625e-04f, +4.209292660e-04f, +1.914832687e-04f, +4.327493877e-05f, -2.686366939e-05f, -4.096657950e-05f, - /* 24, 6 */ +4.114725367e-05f, +1.564493806e-05f, -7.246695886e-05f, -2.416845105e-04f, -4.887098400e-04f, -7.806331214e-04f, -1.056714015e-03f, -1.241422199e-03f, -1.265920211e-03f, -1.091205584e-03f, -7.245077077e-04f, -2.222205061e-04f, +3.227850234e-04f, +8.059079530e-04f, +1.139504920e-03f, +1.275890161e-03f, +1.217194897e-03f, +1.009579403e-03f, +7.249627509e-04f, +4.375574807e-04f, +2.035501057e-04f, +5.009726244e-05f, -2.440707607e-05f, -4.119040933e-05f, - /* 24, 7 */ +4.128766430e-05f, +1.880441272e-05f, -6.469004778e-05f, -2.286539641e-04f, -4.714587328e-04f, -7.621096041e-04f, -1.041335936e-03f, -1.233962452e-03f, -1.270030522e-03f, -1.108081926e-03f, -7.522084876e-04f, -2.559471563e-04f, +2.894771803e-04f, +7.793480846e-04f, +1.124183998e-03f, +1.273351959e-03f, +1.225881627e-03f, +1.025617992e-03f, +7.435470253e-04f, +4.544042133e-04f, +2.159413387e-04f, +5.723450367e-05f, -2.172290976e-05f, -4.129973134e-05f, - /* 24, 8 */ +4.129973134e-05f, +2.172290976e-05f, -5.723450367e-05f, -2.159413387e-04f, -4.544042133e-04f, -7.435470253e-04f, -1.025617992e-03f, -1.225881627e-03f, -1.273351959e-03f, -1.124183998e-03f, -7.793480846e-04f, -2.894771803e-04f, +2.559471563e-04f, +7.522084876e-04f, +1.108081926e-03f, +1.270030522e-03f, +1.233962452e-03f, +1.041335936e-03f, +7.621096041e-04f, +4.714587328e-04f, +2.286539641e-04f, +6.469004778e-05f, -1.880441272e-05f, -4.128766430e-05f, - /* 24, 9 */ +4.119040933e-05f, +2.440707607e-05f, -5.009726244e-05f, -2.035501057e-04f, -4.375574807e-04f, -7.249627509e-04f, -1.009579403e-03f, -1.217194897e-03f, -1.275890161e-03f, -1.139504920e-03f, -8.059079530e-04f, -3.227850234e-04f, +2.222205061e-04f, +7.245077077e-04f, +1.091205584e-03f, +1.265920211e-03f, +1.241422199e-03f, +1.056714015e-03f, +7.806331214e-04f, +4.887098400e-04f, +2.416845105e-04f, +7.246695886e-05f, -1.564493806e-05f, -4.114725367e-05f, - /* 24,10 */ +4.096657950e-05f, +2.686366939e-05f, -4.327493877e-05f, -1.914832687e-04f, -4.209292660e-04f, -7.063738625e-04f, -9.932394374e-04f, -1.207917863e-03f, -1.277651484e-03f, -1.154038613e-03f, -8.318701747e-04f, -3.558453770e-04f, +1.883230024e-04f, +6.962648992e-04f, +1.073562648e-03f, +1.261016119e-03f, +1.248246148e-03f, +1.071733083e-03f, +7.990999447e-04f, +5.061458738e-04f, +2.550290329e-04f, +8.056796775e-05f, -1.223796294e-05f, -4.087148106e-05f, - /* 24,11 */ +4.063504078e-05f, +2.909954521e-05f, -3.676383839e-05f, -1.797433681e-04f, -4.045298263e-04f, -6.877971412e-04f, -9.766173891e-04f, -1.198066533e-03f, -1.278642989e-03f, -1.167779798e-03f, -8.572174771e-04f, -3.886332072e-04f, +1.542806079e-04f, +6.674998060e-04f, +1.055161588e-03f, +1.255314082e-03f, +1.254420050e-03f, +1.086374092e-03f, +8.174921923e-04f, +5.237547173e-04f, +2.686831091e-04f, +8.899546026e-05f, -8.577101915e-06f, -4.045327387e-05f, - /* 24,12 */ +4.020250110e-05f, +3.112164378e-05f, -3.055997058e-05f, -1.683324883e-04f, -3.883689407e-04f, -6.692490513e-04f, -9.597325558e-04f, -1.187657300e-03f, -1.278872430e-03f, -1.180724004e-03f, -8.819332498e-04f, -4.211237814e-04f, +1.201194461e-04f, +6.382327409e-04f, +1.036011659e-03f, +1.248810685e-03f, +1.259930153e-03f, +1.100618114e-03f, +8.357917522e-04f, +5.415238064e-04f, +2.826418349e-04f, +9.775146571e-05f, -4.656120273e-06f, -3.988551544e-05f, - /* 24,13 */ +3.967556907e-05f, +3.293697730e-05f, -2.465906089e-05f, -1.572522637e-04f, -3.724559064e-04f, -6.507457252e-04f, -9.426042142e-04f, -1.176706916e-03f, -1.278348235e-03f, -1.192867560e-03f, -9.060015608e-04f, -4.532926958e-04f, +8.586577249e-05f, +6.084845647e-04f, +1.016122900e-03f, +1.241503276e-03f, +1.264763218e-03f, +1.114446367e-03f, +8.539803004e-04f, +5.594401371e-04f, +2.968998221e-04f, +1.068376458e-04f, -4.689475139e-07f, -3.916105537e-05f, - /* 24,14 */ +3.906074609e-05f, +3.455261727e-05f, -1.905656402e-05f, -1.465038861e-04f, -3.567995352e-04f, -6.323029482e-04f, -9.252515980e-04f, -1.165232472e-03f, -1.277079499e-03f, -1.204207601e-03f, -9.294071718e-04f, -4.851159022e-04f, +5.154594549e-05f, +5.782766642e-04f, +9.955061195e-04f, +1.233389975e-03f, +1.268906542e-03f, +1.127840237e-03f, +8.720393210e-04f, +5.774902753e-04f, +3.114511951e-04f, +1.162552839e-04f, +3.990309212e-06f, -3.827272022e-05f, - /* 24,15 */ +3.836441874e-05f, +3.597568203e-05f, -1.374767685e-05f, -1.360881127e-04f, -3.414081512e-04f, -6.139361451e-04f, -9.076938752e-04f, -1.153251370e-03f, -1.275075958e-03f, -1.214742061e-03f, -9.521355524e-04f, -5.165697336e-04f, +1.718639697e-05f, +5.476309302e-04f, +9.741728935e-04f, +1.224469676e-03f, +1.272347980e-03f, +1.140781305e-03f, +8.899501259e-04f, +5.956603662e-04f, +3.262895896e-04f, +1.260052743e-04f, +8.727351622e-06f, -3.721332452e-05f, - /* 24, 0 */ +8.266384897e-05f, +1.864042294e-04f, +2.488885336e-04f, +1.546439211e-04f, -1.995837972e-04f, -8.300120177e-04f, -1.613160849e-03f, -2.296673715e-03f, -2.585717258e-03f, -2.273475621e-03f, -1.352242686e-03f, -4.324968723e-05f, +1.278412578e-03f, +2.232544293e-03f, +2.585064833e-03f, +2.329165788e-03f, +1.661894649e-03f, +8.765619362e-04f, +2.314166150e-04f, -1.408802900e-04f, -2.488728147e-04f, -1.925779863e-04f, -8.867605644e-05f, -1.381647235e-05f, - /* 24, 1 */ +7.679604466e-05f, +1.800850086e-04f, +2.482891228e-04f, +1.673628145e-04f, -1.688781476e-04f, -7.841040553e-04f, -1.564053778e-03f, -2.262611362e-03f, -2.583952550e-03f, -2.311948888e-03f, -1.424504725e-03f, -1.296977982e-04f, +1.203096102e-03f, +2.189184288e-03f, +2.581965725e-03f, +2.360018674e-03f, +1.710180642e-03f, +9.237037585e-04f, +2.643640884e-04f, -1.260534627e-04f, -2.482108983e-04f, -1.985807152e-04f, -9.482163577e-05f, -1.700840565e-05f, - /* 24, 2 */ +7.108272573e-05f, +1.736451253e-04f, +2.471057735e-04f, +1.790568131e-04f, -1.393098721e-04f, -7.388859215e-04f, -1.514647192e-03f, -2.227049028e-03f, -2.579803518e-03f, -2.347938498e-03f, -1.495119547e-03f, -2.159922036e-04f, +1.126377386e-03f, +2.143428746e-03f, +2.576393731e-03f, +2.389164999e-03f, +1.757943642e-03f, +9.713853048e-04f, +2.984113695e-04f, -1.101464409e-04f, -2.468719141e-04f, -2.043861254e-04f, -1.010885985e-04f, -2.040687624e-05f, - /* 24, 3 */ +6.553303557e-05f, +1.671085856e-04f, +2.453697283e-04f, +1.897470664e-04f, -1.108869031e-04f, -6.944032625e-04f, -1.465013955e-03f, -2.190058265e-03f, -2.573306150e-03f, -2.381422658e-03f, -1.564010684e-03f, -3.020307159e-04f, +1.048342851e-03f, +2.095314540e-03f, +2.568326065e-03f, +2.416539054e-03f, +1.805107932e-03f, +1.019552324e-03f, +3.335412514e-04f, -9.314376077e-05f, -2.448252646e-04f, -2.099672379e-04f, -1.074639934e-04f, -2.401251277e-05f, - /* 24, 4 */ +6.015519126e-05f, +1.604985702e-04f, +2.431122111e-04f, +1.994559526e-04f, -8.361493575e-05f, -6.506994570e-04f, -1.415225919e-03f, -2.151711738e-03f, -2.564499518e-03f, -2.412383397e-03f, -1.631104459e-03f, -3.877115714e-04f, +9.690810727e-04f, +2.044882222e-03f, +2.557743429e-03f, +2.442076932e-03f, +1.851597394e-03f, +1.068148557e-03f, +3.697341485e-04f, -7.503156587e-05f, -2.420407013e-04f, -2.152964269e-04f, -1.139339030e-04f, -2.782526914e-05f, - /* 24, 5 */ +5.495649810e-05f, +1.538374078e-04f, +2.403643576e-04f, +2.082069988e-04f, -5.749746926e-05f, -6.078155802e-04f, -1.365353811e-03f, -2.112083086e-03f, -2.553425683e-03f, -2.440806561e-03f, -1.696330106e-03f, -4.729335981e-04f, +8.886826408e-04f, +1.992175989e-03f, +2.544630075e-03f, +2.465716661e-03f, +1.897335642e-03f, +1.117115802e-03f, +4.069680813e-04f, -5.579767803e-05f, -2.384884029e-04f, -2.203454641e-04f, -1.204834430e-04f, -3.184439496e-05f, - /* 24, 6 */ +4.994336610e-05f, +1.471465506e-04f, +2.371571498e-04f, +2.160248014e-04f, -3.253585139e-05f, -5.657903730e-04f, -1.315467130e-03f, -2.071246779e-03f, -2.540129593e-03f, -2.466681818e-03f, -1.759619871e-03f, -5.575963834e-04f, +8.072400133e-04f, +1.937243618e-03f, +2.528973864e-03f, +2.487398336e-03f, +1.942246152e-03f, +1.166393990e-03f, +4.452186667e-04f, -3.543166589e-05f, -2.341390536e-04f, -2.250855657e-04f, -1.270967638e-04f, -3.606840695e-05f, - /* 24, 7 */ +4.512132841e-05f, +1.404465535e-04f, +2.335213506e-04f, +2.229349451e-04f, -8.729326764e-06f, -5.246602166e-04f, -1.265634037e-03f, -2.029277978e-03f, -2.524658979e-03f, -2.490002646e-03f, -1.820909115e-03f, -6.416004392e-04f, +7.248473657e-04f, +1.880136408e-03f, +2.510766314e-03f, +2.507064240e-03f, +1.986252395e-03f, +1.215921259e-03f, +4.844591124e-04f, -1.392491133e-05f, -2.289639228e-04f, -2.294874421e-04f, -1.337570553e-04f, -4.049506149e-05f, - /* 24, 8 */ +4.049506149e-05f, +1.337570553e-04f, +2.294874421e-04f, +2.289639228e-04f, +1.392491133e-05f, -4.844591124e-04f, -1.215921259e-03f, -1.986252395e-03f, -2.507064240e-03f, -2.510766314e-03f, -1.880136408e-03f, -7.248473657e-04f, +6.416004392e-04f, +1.820909115e-03f, +2.490002646e-03f, +2.524658979e-03f, +2.029277978e-03f, +1.265634037e-03f, +5.246602166e-04f, +8.729326764e-06f, -2.229349451e-04f, -2.335213506e-04f, -1.404465535e-04f, -4.512132841e-05f, - /* 24, 9 */ +3.606840695e-05f, +1.270967638e-04f, +2.250855657e-04f, +2.341390536e-04f, +3.543166589e-05f, -4.452186667e-04f, -1.166393990e-03f, -1.942246152e-03f, -2.487398336e-03f, -2.528973864e-03f, -1.937243618e-03f, -8.072400133e-04f, +5.575963834e-04f, +1.759619871e-03f, +2.466681818e-03f, +2.540129593e-03f, +2.071246779e-03f, +1.315467130e-03f, +5.657903730e-04f, +3.253585139e-05f, -2.160248014e-04f, -2.371571498e-04f, -1.471465506e-04f, -4.994336610e-05f, - /* 24,10 */ +3.184439496e-05f, +1.204834430e-04f, +2.203454641e-04f, +2.384884029e-04f, +5.579767803e-05f, -4.069680813e-04f, -1.117115802e-03f, -1.897335642e-03f, -2.465716661e-03f, -2.544630075e-03f, -1.992175989e-03f, -8.886826408e-04f, +4.729335981e-04f, +1.696330106e-03f, +2.440806561e-03f, +2.553425683e-03f, +2.112083086e-03f, +1.365353811e-03f, +6.078155802e-04f, +5.749746926e-05f, -2.082069988e-04f, -2.403643576e-04f, -1.538374078e-04f, -5.495649810e-05f, - /* 24,11 */ +2.782526914e-05f, +1.139339030e-04f, +2.152964269e-04f, +2.420407013e-04f, +7.503156587e-05f, -3.697341485e-04f, -1.068148557e-03f, -1.851597394e-03f, -2.442076932e-03f, -2.557743429e-03f, -2.044882222e-03f, -9.690810727e-04f, +3.877115714e-04f, +1.631104459e-03f, +2.412383397e-03f, +2.564499518e-03f, +2.151711738e-03f, +1.415225919e-03f, +6.506994570e-04f, +8.361493575e-05f, -1.994559526e-04f, -2.431122111e-04f, -1.604985702e-04f, -6.015519126e-05f, - /* 24,12 */ +2.401251277e-05f, +1.074639934e-04f, +2.099672379e-04f, +2.448252646e-04f, +9.314376077e-05f, -3.335412514e-04f, -1.019552324e-03f, -1.805107932e-03f, -2.416539054e-03f, -2.568326065e-03f, -2.095314540e-03f, -1.048342851e-03f, +3.020307159e-04f, +1.564010684e-03f, +2.381422658e-03f, +2.573306150e-03f, +2.190058265e-03f, +1.465013955e-03f, +6.944032625e-04f, +1.108869031e-04f, -1.897470664e-04f, -2.453697283e-04f, -1.671085856e-04f, -6.553303557e-05f, - /* 24,13 */ +2.040687624e-05f, +1.010885985e-04f, +2.043861254e-04f, +2.468719141e-04f, +1.101464409e-04f, -2.984113695e-04f, -9.713853048e-04f, -1.757943642e-03f, -2.389164999e-03f, -2.576393731e-03f, -2.143428746e-03f, -1.126377386e-03f, +2.159922036e-04f, +1.495119547e-03f, +2.347938498e-03f, +2.579803518e-03f, +2.227049028e-03f, +1.514647192e-03f, +7.388859215e-04f, +1.393098721e-04f, -1.790568131e-04f, -2.471057735e-04f, -1.736451253e-04f, -7.108272573e-05f, - /* 24,14 */ +1.700840565e-05f, +9.482163577e-05f, +1.985807152e-04f, +2.482108983e-04f, +1.260534627e-04f, -2.643640884e-04f, -9.237037585e-04f, -1.710180642e-03f, -2.360018674e-03f, -2.581965725e-03f, -2.189184288e-03f, -1.203096102e-03f, +1.296977982e-04f, +1.424504725e-03f, +2.311948888e-03f, +2.583952550e-03f, +2.262611362e-03f, +1.564053778e-03f, +7.841040553e-04f, +1.688781476e-04f, -1.673628145e-04f, -2.482891228e-04f, -1.800850086e-04f, -7.679604466e-05f, - /* 24,15 */ +1.381647235e-05f, +8.867605644e-05f, +1.925779863e-04f, +2.488728147e-04f, +1.408802900e-04f, -2.314166150e-04f, -8.765619362e-04f, -1.661894649e-03f, -2.329165788e-03f, -2.585064833e-03f, -2.232544293e-03f, -1.278412578e-03f, +4.324968723e-05f, +1.352242686e-03f, +2.273475621e-03f, +2.585717258e-03f, +2.296673715e-03f, +1.613160849e-03f, +8.300120177e-04f, +1.995837972e-04f, -1.546439211e-04f, -2.488885336e-04f, -1.864042294e-04f, -8.266384897e-05f, - /* 24, 0 */ -8.756118778e-05f, -1.009631262e-05f, +2.499923290e-04f, +5.877223422e-04f, +6.788717735e-04f, +1.353208099e-04f, -1.181609893e-03f, -2.907631270e-03f, -4.227440709e-03f, -4.289302846e-03f, -2.753030129e-03f, -9.027467135e-05f, +2.610460208e-03f, +4.239433597e-03f, +4.275304929e-03f, +3.011836329e-03f, +1.284225967e-03f, -7.470693818e-05f, -6.668983668e-04f, -6.049037547e-04f, -2.711811033e-04f, -7.712041122e-07f, +8.724954076e-05f, +5.404595280e-05f, - /* 24, 1 */ -8.741655630e-05f, -2.019027119e-05f, +2.291878545e-04f, +5.696067266e-04f, +6.882827247e-04f, +1.927359117e-04f, -1.080756061e-03f, -2.801858302e-03f, -4.174485032e-03f, -4.332641998e-03f, -2.890980043e-03f, -2.706680808e-04f, +2.463494124e-03f, +4.183052585e-03f, +4.317905196e-03f, +3.114235078e-03f, +1.388440877e-03f, -1.091717027e-05f, -6.522789212e-04f, -6.210469572e-04f, -2.926973166e-04f, -1.241413728e-05f, +8.645224618e-05f, +5.751117153e-05f, - /* 24, 2 */ -8.684540791e-05f, -2.951540942e-05f, +2.088206066e-04f, +5.506594457e-04f, +6.952187414e-04f, +2.469379129e-04f, -9.818199274e-04f, -2.694754852e-03f, -4.116618896e-03f, -4.369446535e-03f, -3.024096686e-03f, -4.505940556e-04f, +2.312365817e-03f, +4.120192033e-03f, +4.355078033e-03f, +3.214588722e-03f, +1.494083528e-03f, +5.601692583e-05f, -6.349341530e-04f, -6.360467505e-04f, -3.144802134e-04f, -2.483132916e-05f, +8.514047439e-05f, +6.091502927e-05f, - /* 24, 3 */ -8.587775422e-05f, -3.807920270e-05f, +1.889395528e-04f, +5.309813040e-04f, +6.997709178e-04f, +2.979208532e-04f, -8.849487633e-04f, -2.586556795e-03f, -4.054031257e-03f, -4.399725659e-03f, -3.152177828e-03f, -6.297421881e-04f, +2.157318805e-03f, +4.050898074e-03f, +4.386669491e-03f, +3.312658663e-03f, +1.600975431e-03f, +1.260549593e-04f, -6.147894349e-04f, -6.497970322e-04f, -3.364651980e-04f, -3.801847602e-05f, +8.328608571e-05f, +6.423360450e-05f, - /* 24, 4 */ -8.454371894e-05f, -4.589171696e-05f, +1.695896910e-04f, +5.106711213e-04f, +7.020335552e-04f, +3.456869501e-04f, -7.902814402e-04f, -2.477497901e-03f, -3.986918477e-03f, -4.423502152e-03f, -3.275032702e-03f, -8.078038906e-04f, +1.998605647e-03f, +3.975230752e-03f, +4.412535626e-03f, +3.408207107e-03f, +1.708931018e-03f, +1.991476106e-04f, -5.917751493e-04f, -6.621910968e-04f, -3.585839047e-04f, -5.196800512e-05f, +8.086178430e-05f, +6.744196867e-05f, - /* 24, 5 */ -8.287340509e-05f, -5.296545744e-05f, +1.508120534e-04f, +4.898254962e-04f, +7.021037953e-04f, +3.902463858e-04f, -6.979482496e-04f, -2.367809282e-03f, -3.915483754e-03f, -4.440812209e-03f, -3.392482395e-03f, -9.844731162e-04f, +1.836487379e-03f, +3.893263974e-03f, +4.432542967e-03f, +3.500997660e-03f, +1.817757983e-03f, +2.752365501e-04f, -5.658270331e-04f, -6.731219472e-04f, -3.807642824e-04f, -6.666895953e-05f, +7.784127492e-05f, +7.051425394e-05f, - /* 24, 6 */ -8.089676755e-05f, -5.931521393e-05f, +1.326437227e-04f, +4.685385820e-04f, +7.000812546e-04f, +4.316170765e-04f, -6.080707472e-04f, -2.257718867e-03f, -3.839936544e-03f, -4.451705229e-03f, -3.504360214e-03f, -1.159447072e-03f, +1.671232927e-03f, +3.805085432e-03f, +4.446568950e-03f, +3.590795947e-03f, +1.927257648e-03f, +3.542543807e-04f, -5.368865161e-04f, -6.824826149e-04f, -4.029306956e-04f, -8.210689127e-05f, +7.419942176e-05f, +7.342372810e-05f, - /* 24, 7 */ -7.864349144e-05f, -6.495790319e-05f, +1.151178633e-04f, +4.469018792e-04f, +6.960676605e-04f, +4.698244236e-04f, -5.207616239e-04f, -2.147450881e-03f, -3.760491970e-03f, -4.456243581e-03f, -3.610512013e-03f, -1.332426925e-03f, +1.503118492e-03f, +3.710796487e-03f, +4.454502333e-03f, +3.677370219e-03f, +2.037225356e-03f, +4.361246060e-04f, -5.049010493e-04f, -6.901664903e-04f, -4.250040411e-04f, -9.826376366e-05f, +6.991240915e-05f, +7.614287656e-05f, - /* 24, 8 */ -7.614287656e-05f, -6.991240915e-05f, +9.826376366e-05f, +4.250040411e-04f, +6.901664903e-04f, +5.049010493e-04f, -4.361246060e-04f, -2.037225356e-03f, -3.677370219e-03f, -4.454502333e-03f, -3.710796487e-03f, -1.503118492e-03f, +1.332426925e-03f, +3.610512013e-03f, +4.456243581e-03f, +3.760491970e-03f, +2.147450881e-03f, +5.207616239e-04f, -4.698244236e-04f, -6.960676605e-04f, -4.469018792e-04f, -1.151178633e-04f, +6.495790319e-05f, +7.864349144e-05f, - /* 24, 9 */ -7.342372810e-05f, -7.419942176e-05f, +8.210689127e-05f, +4.029306956e-04f, +6.824826149e-04f, +5.368865161e-04f, -3.542543807e-04f, -1.927257648e-03f, -3.590795947e-03f, -4.446568950e-03f, -3.805085432e-03f, -1.671232927e-03f, +1.159447072e-03f, +3.504360214e-03f, +4.451705229e-03f, +3.839936544e-03f, +2.257718867e-03f, +6.080707472e-04f, -4.316170765e-04f, -7.000812546e-04f, -4.685385820e-04f, -1.326437227e-04f, +5.931521393e-05f, +8.089676755e-05f, - /* 24,10 */ -7.051425394e-05f, -7.784127492e-05f, +6.666895953e-05f, +3.807642824e-04f, +6.731219472e-04f, +5.658270331e-04f, -2.752365501e-04f, -1.817757983e-03f, -3.500997660e-03f, -4.432542967e-03f, -3.893263974e-03f, -1.836487379e-03f, +9.844731162e-04f, +3.392482395e-03f, +4.440812209e-03f, +3.915483754e-03f, +2.367809282e-03f, +6.979482496e-04f, -3.902463858e-04f, -7.021037953e-04f, -4.898254962e-04f, -1.508120534e-04f, +5.296545744e-05f, +8.287340509e-05f, - /* 24,11 */ -6.744196867e-05f, -8.086178430e-05f, +5.196800512e-05f, +3.585839047e-04f, +6.621910968e-04f, +5.917751493e-04f, -1.991476106e-04f, -1.708931018e-03f, -3.408207107e-03f, -4.412535626e-03f, -3.975230752e-03f, -1.998605647e-03f, +8.078038906e-04f, +3.275032702e-03f, +4.423502152e-03f, +3.986918477e-03f, +2.477497901e-03f, +7.902814402e-04f, -3.456869501e-04f, -7.020335552e-04f, -5.106711213e-04f, -1.695896910e-04f, +4.589171696e-05f, +8.454371894e-05f, - /* 24,12 */ -6.423360450e-05f, -8.328608571e-05f, +3.801847602e-05f, +3.364651980e-04f, +6.497970322e-04f, +6.147894349e-04f, -1.260549593e-04f, -1.600975431e-03f, -3.312658663e-03f, -4.386669491e-03f, -4.050898074e-03f, -2.157318805e-03f, +6.297421881e-04f, +3.152177828e-03f, +4.399725659e-03f, +4.054031257e-03f, +2.586556795e-03f, +8.849487633e-04f, -2.979208532e-04f, -6.997709178e-04f, -5.309813040e-04f, -1.889395528e-04f, +3.807920270e-05f, +8.587775422e-05f, - /* 24,13 */ -6.091502927e-05f, -8.514047439e-05f, +2.483132916e-05f, +3.144802134e-04f, +6.360467505e-04f, +6.349341530e-04f, -5.601692583e-05f, -1.494083528e-03f, -3.214588722e-03f, -4.355078033e-03f, -4.120192033e-03f, -2.312365817e-03f, +4.505940556e-04f, +3.024096686e-03f, +4.369446535e-03f, +4.116618896e-03f, +2.694754852e-03f, +9.818199274e-04f, -2.469379129e-04f, -6.952187414e-04f, -5.506594457e-04f, -2.088206066e-04f, +2.951540942e-05f, +8.684540791e-05f, - /* 24,14 */ -5.751117153e-05f, -8.645224618e-05f, +1.241413728e-05f, +2.926973166e-04f, +6.210469572e-04f, +6.522789212e-04f, +1.091717027e-05f, -1.388440877e-03f, -3.114235078e-03f, -4.317905196e-03f, -4.183052585e-03f, -2.463494124e-03f, +2.706680808e-04f, +2.890980043e-03f, +4.332641998e-03f, +4.174485032e-03f, +2.801858302e-03f, +1.080756061e-03f, -1.927359117e-04f, -6.882827247e-04f, -5.696067266e-04f, -2.291878545e-04f, +2.019027119e-05f, +8.741655630e-05f, - /* 24,15 */ -5.404595280e-05f, -8.724954076e-05f, +7.712041122e-07f, +2.711811033e-04f, +6.049037547e-04f, +6.668983668e-04f, +7.470693818e-05f, -1.284225967e-03f, -3.011836329e-03f, -4.275304929e-03f, -4.239433597e-03f, -2.610460208e-03f, +9.027467135e-05f, +2.753030129e-03f, +4.289302846e-03f, +4.227440709e-03f, +2.907631270e-03f, +1.181609893e-03f, -1.353208099e-04f, -6.788717735e-04f, -5.877223422e-04f, -2.499923290e-04f, +1.009631262e-05f, +8.756118778e-05f, - /* 24, 0 */ -4.836862817e-05f, -2.381906908e-04f, -2.861422699e-04f, +1.419765781e-04f, +9.779307384e-04f, +1.431118485e-03f, +4.239072727e-04f, -2.320049614e-03f, -5.516524807e-03f, -6.885468951e-03f, -4.882970050e-03f, -1.652445539e-04f, +4.647640808e-03f, +6.864975932e-03f, +5.679465803e-03f, +2.528057977e-03f, -2.982544427e-04f, -1.420326139e-03f, -1.029081461e-03f, -1.868092348e-04f, +2.758007186e-04f, +2.491702023e-04f, +5.836581816e-05f, -3.491105347e-05f, - /* 24, 1 */ -3.887878147e-05f, -2.267040256e-04f, -2.944876029e-04f, +9.900949096e-05f, +9.254138922e-04f, +1.435932770e-03f, +5.422031866e-04f, -2.114193296e-03f, -5.346195092e-03f, -6.891993065e-03f, -5.106971374e-03f, -4.953359135e-04f, +4.401480442e-03f, +6.830374341e-03f, +5.834433801e-03f, +2.737690485e-03f, -1.653667139e-04f, -1.403322383e-03f, -1.078579553e-03f, -2.333982604e-04f, +2.633988510e-04f, +2.595470071e-04f, +6.884149383e-05f, -3.317859772e-05f, - /* 24, 2 */ -2.992041863e-05f, -2.148033017e-04f, -3.009073041e-04f, +5.800387728e-05f, +8.718108917e-04f, +1.435015360e-03f, +6.530479478e-04f, -1.910998057e-03f, -5.169072824e-03f, -6.884726614e-03f, -5.319183002e-03f, -8.242352929e-04f, +4.145019341e-03f, +6.781564023e-03f, +5.980858542e-03f, +2.948401826e-03f, -2.539414214e-05f, -1.379888189e-03f, -1.126132932e-03f, -2.816211011e-04f, +2.488796810e-04f, +2.692234993e-04f, +7.976200316e-05f, -3.095924021e-05f, - /* 24, 3 */ -2.151306397e-05f, -2.025787804e-04f, -3.054778181e-04f, +1.904245883e-05f, +8.173942695e-04f, +1.428624316e-03f, +7.563747429e-04f, -1.710952703e-03f, -4.985763915e-03f, -6.863885651e-03f, -5.519179462e-03f, -1.151152247e-03f, +3.878819947e-03f, +6.718485032e-03f, +6.118185890e-03f, +3.159630822e-03f, +1.214850236e-04f, -1.349820125e-03f, -1.171444944e-03f, -3.313418525e-04f, +2.321939470e-04f, +2.781004545e-04f, +9.108884721e-05f, -2.823129406e-05f, - /* 24, 4 */ -1.367174826e-05f, -1.901175448e-04f, -3.082808136e-04f, -1.780505549e-05f, +7.624282793e-04f, +1.417028061e-03f, +8.521437270e-04f, -1.514524553e-03f, -4.796881865e-03f, -6.829722854e-03f, -5.706572744e-03f, -1.475302628e-03f, +3.603475092e-03f, +6.641118197e-03f, +6.245879909e-03f, +3.370802059e-03f, +2.750642929e-04f, -1.312931609e-03f, -1.214215433e-03f, -3.824113238e-04f, +2.133007109e-04f, +2.860774924e-04f, +1.027786538e-04f, -2.497524656e-05f, - /* 24, 5 */ -6.407151783e-06f, -1.775031866e-04f, -3.094025487e-04f, -5.248174754e-05f, +7.071681142e-04f, +1.400504044e-03f, +9.403414758e-04f, -1.322158275e-03f, -4.603045619e-03f, -6.782526316e-03f, -5.881013326e-03f, -1.795911068e-03f, +3.319606230e-03f, +6.549485546e-03f, +6.363424898e-03f, +3.581327596e-03f, +4.351089927e-04f, -1.269054120e-03f, -1.254141844e-03f, -4.346671648e-04f, +1.921679399e-04f, +2.930535649e-04f, +1.147831783e-04f, -2.117401174e-05f, - /* 24, 6 */ +2.742338831e-07f, -1.648155254e-04f, -3.089332390e-04f, -8.494321776e-05f, +6.518591895e-04f, +1.379337399e-03f, +1.020980349e-03f, -1.134274832e-03f, -4.404877423e-03f, -6.722618231e-03f, -6.042191052e-03f, -2.112213435e-03f, +3.027861551e-03f, +6.443650588e-03f, +6.470327373e-03f, +3.790608755e-03f, +6.013564365e-04f, -1.218038367e-03f, -1.290920380e-03f, -4.879340571e-04f, +1.687730668e-04f, +2.989274696e-04f, +1.270493337e-04f, -1.681317980e-05f, - /* 24, 7 */ +6.369927035e-06f, -1.521303593e-04f, -3.069664313e-04f, -1.151572658e-04f, +5.967364879e-04f, +1.353819611e-03f, +1.094097769e-03f, -9.512705360e-04f, -4.203000702e-03f, -6.650353458e-03f, -6.189835876e-03f, -2.423459243e-03f, +2.728914008e-03f, +6.323718452e-03f, +6.566118000e-03f, +3.998037969e-03f, +7.735162047e-04f, -1.159755419e-03f, -1.324247193e-03f, -5.420239710e-04f, +1.431035268e-04f, +3.035983857e-04f, +1.395192491e-04f, -1.188126168e-05f, - /* 24, 8 */ +1.188126168e-05f, -1.395192491e-04f, -3.035983857e-04f, -1.431035268e-04f, +5.420239710e-04f, +1.324247193e-03f, +1.159755419e-03f, -7.735162047e-04f, -3.998037969e-03f, -6.566118000e-03f, -6.323718452e-03f, -2.728914008e-03f, +2.423459243e-03f, +6.189835876e-03f, +6.650353458e-03f, +4.203000702e-03f, +9.512705360e-04f, -1.094097769e-03f, -1.353819611e-03f, -5.967364879e-04f, +1.151572658e-04f, +3.069664313e-04f, +1.521303593e-04f, -6.369927035e-06f, - /* 24, 9 */ +1.681317980e-05f, -1.270493337e-04f, -2.989274696e-04f, -1.687730668e-04f, +4.879340571e-04f, +1.290920380e-03f, +1.218038367e-03f, -6.013564365e-04f, -3.790608755e-03f, -6.470327373e-03f, -6.443650588e-03f, -3.027861551e-03f, +2.112213435e-03f, +6.042191052e-03f, +6.722618231e-03f, +4.404877423e-03f, +1.134274832e-03f, -1.020980349e-03f, -1.379337399e-03f, -6.518591895e-04f, +8.494321776e-05f, +3.089332390e-04f, +1.648155254e-04f, -2.742338831e-07f, - /* 24,10 */ +2.117401174e-05f, -1.147831783e-04f, -2.930535649e-04f, -1.921679399e-04f, +4.346671648e-04f, +1.254141844e-03f, +1.269054120e-03f, -4.351089927e-04f, -3.581327596e-03f, -6.363424898e-03f, -6.549485546e-03f, -3.319606230e-03f, +1.795911068e-03f, +5.881013326e-03f, +6.782526316e-03f, +4.603045619e-03f, +1.322158275e-03f, -9.403414758e-04f, -1.400504044e-03f, -7.071681142e-04f, +5.248174754e-05f, +3.094025487e-04f, +1.775031866e-04f, +6.407151783e-06f, - /* 24,11 */ +2.497524656e-05f, -1.027786538e-04f, -2.860774924e-04f, -2.133007109e-04f, +3.824113238e-04f, +1.214215433e-03f, +1.312931609e-03f, -2.750642929e-04f, -3.370802059e-03f, -6.245879909e-03f, -6.641118197e-03f, -3.603475092e-03f, +1.475302628e-03f, +5.706572744e-03f, +6.829722854e-03f, +4.796881865e-03f, +1.514524553e-03f, -8.521437270e-04f, -1.417028061e-03f, -7.624282793e-04f, +1.780505549e-05f, +3.082808136e-04f, +1.901175448e-04f, +1.367174826e-05f, - /* 24,12 */ +2.823129406e-05f, -9.108884721e-05f, -2.781004545e-04f, -2.321939470e-04f, +3.313418525e-04f, +1.171444944e-03f, +1.349820125e-03f, -1.214850236e-04f, -3.159630822e-03f, -6.118185890e-03f, -6.718485032e-03f, -3.878819947e-03f, +1.151152247e-03f, +5.519179462e-03f, +6.863885651e-03f, +4.985763915e-03f, +1.710952703e-03f, -7.563747429e-04f, -1.428624316e-03f, -8.173942695e-04f, -1.904245883e-05f, +3.054778181e-04f, +2.025787804e-04f, +2.151306397e-05f, - /* 24,13 */ +3.095924021e-05f, -7.976200316e-05f, -2.692234993e-04f, -2.488796810e-04f, +2.816211011e-04f, +1.126132932e-03f, +1.379888189e-03f, +2.539414214e-05f, -2.948401826e-03f, -5.980858542e-03f, -6.781564023e-03f, -4.145019341e-03f, +8.242352929e-04f, +5.319183002e-03f, +6.884726614e-03f, +5.169072824e-03f, +1.910998057e-03f, -6.530479478e-04f, -1.435015360e-03f, -8.718108917e-04f, -5.800387728e-05f, +3.009073041e-04f, +2.148033017e-04f, +2.992041863e-05f, - /* 24,14 */ +3.317859772e-05f, -6.884149383e-05f, -2.595470071e-04f, -2.633988510e-04f, +2.333982604e-04f, +1.078579553e-03f, +1.403322383e-03f, +1.653667139e-04f, -2.737690485e-03f, -5.834433801e-03f, -6.830374341e-03f, -4.401480442e-03f, +4.953359135e-04f, +5.106971374e-03f, +6.891993065e-03f, +5.346195092e-03f, +2.114193296e-03f, -5.422031866e-04f, -1.435932770e-03f, -9.254138922e-04f, -9.900949096e-05f, +2.944876029e-04f, +2.267040256e-04f, +3.887878147e-05f, - /* 24,15 */ +3.491105347e-05f, -5.836581816e-05f, -2.491702023e-04f, -2.758007186e-04f, +1.868092348e-04f, +1.029081461e-03f, +1.420326139e-03f, +2.982544427e-04f, -2.528057977e-03f, -5.679465803e-03f, -6.864975932e-03f, -4.647640808e-03f, +1.652445539e-04f, +4.882970050e-03f, +6.885468951e-03f, +5.516524807e-03f, +2.320049614e-03f, -4.239072727e-04f, -1.431118485e-03f, -9.779307384e-04f, -1.419765781e-04f, +2.861422699e-04f, +2.381906908e-04f, +4.836862817e-05f, - /* 24, 0 */ +1.364396009e-04f, +7.446376994e-05f, -3.699603221e-04f, -7.278325124e-04f, -5.051635567e-05f, +1.645033952e-03f, +2.378022613e-03f, -2.243714932e-04f, -5.680096534e-03f, -9.704626250e-03f, -7.823014841e-03f, -2.751390883e-04f, +7.480820734e-03f, +9.788905453e-03f, +6.030582333e-03f, +5.101196376e-04f, -2.328731157e-03f, -1.748114996e-03f, -3.640531891e-05f, +7.242350145e-04f, +4.042879967e-04f, -5.742334247e-05f, -1.414906982e-04f, -2.710774794e-05f, - /* 24, 1 */ +1.307026563e-04f, +8.975162518e-05f, -3.355241044e-04f, -7.270603554e-04f, -1.326866063e-04f, +1.538422151e-03f, +2.413247311e-03f, +4.875121157e-05f, -5.324161431e-03f, -9.595517291e-03f, -8.141086512e-03f, -8.245287223e-04f, +7.115425083e-03f, +9.847646625e-03f, +6.374200107e-03f, +8.077901021e-04f, -2.264974711e-03f, -1.846937004e-03f, -1.278166248e-04f, +7.160485626e-04f, +4.382702758e-04f, -3.863673145e-05f, -1.457592711e-04f, -3.374854096e-05f, - /* 24, 2 */ +1.243758393e-04f, +1.032931784e-04f, -3.012044148e-04f, -7.221532843e-04f, -2.098818030e-04f, +1.428995714e-03f, +2.434853697e-03f, +3.086181402e-04f, -4.964188024e-03f, -9.462372525e-03f, -8.434212217e-03f, -1.371256439e-03f, +6.727842835e-03f, +9.880231223e-03f, +6.709529590e-03f, +1.116608515e-03f, -2.186408722e-03f, -1.940762958e-03f, -2.234175210e-04f, +7.030713845e-04f, +4.716595396e-04f, -1.812362539e-05f, -1.491486840e-04f, -4.073257728e-05f, - /* 24, 3 */ +1.175537217e-04f, +1.151066589e-04f, -2.672136493e-04f, -7.133593846e-04f, -2.819161814e-04f, +1.317455363e-03f, +2.443336794e-03f, +5.546728855e-04f, -4.601573558e-03f, -9.306067159e-03f, -8.701668636e-03f, -1.913559980e-03f, +6.319179241e-03f, +9.886134123e-03f, +7.035155238e-03f, +1.435731166e-03f, -2.092745601e-03f, -2.028850662e-03f, -3.228698520e-04f, +6.851212972e-04f, +5.041985339e-04f, +4.082412249e-06f, -1.515631236e-04f, -4.801831197e-05f, - /* 24, 4 */ +1.103288160e-04f, +1.252215041e-04f, -2.337507561e-04f, -7.009379926e-04f, -3.486413414e-04f, +1.204483360e-03f, +2.439234434e-03f, +7.864337317e-04f, -4.237695644e-03f, -9.127552920e-03f, -8.942835031e-03f, -2.449695551e-03f, +5.890625670e-03f, +9.864926907e-03f, +7.349672574e-03f, +1.764247300e-03f, -1.983757790e-03f, -2.110456450e-03f, -4.257977068e-04f, +6.620377298e-04f, +5.356216172e-04f, +2.793344097e-05f, -1.529084143e-04f, -5.555842361e-05f, - /* 24, 5 */ +1.027909684e-04f, +1.336775649e-04f, -2.010005851e-04f, -6.851576168e-04f, -4.099455518e-04f, +1.090740633e-03f, +2.423123355e-03f, +1.003494037e-03f, -3.873906570e-03f, -8.927853008e-03f, -9.157195135e-03f, -2.977945083e-03f, +5.443455012e-03f, +9.816280735e-03f, +7.651694576e-03f, +2.101181791e-03f, -1.859280606e-03f, -2.184839011e-03f, -5.317880090e-04f, +6.336836952e-04f, +5.656561208e-04f, +5.336672075e-05f, -1.530928622e-04f, -6.329988035e-05f, - /* 24, 6 */ +9.502680145e-05f, +1.405242734e-04f, -1.691333585e-04f, -6.662938873e-04f, -4.657528710e-04f, +9.768641187e-04f, +2.395615219e-03f, +1.205522243e-03f, -3.511527821e-03f, -8.708056786e-03f, -9.344338564e-03f, -3.496623369e-03f, +4.979016698e-03f, +9.739968779e-03f, +7.939858067e-03f, +2.445498177e-03f, -1.719214825e-03f, -2.251263312e-03f, -6.403913399e-04f, +5.999476948e-04f, +5.940238143e-04f, +8.030437567e-05f, -1.520281231e-04f, -7.118405837e-05f, - /* 24, 7 */ +8.711921055e-05f, +1.458197836e-04f, -1.383042613e-04f, -6.446275435e-04f, -5.160220948e-04f, +8.634643034e-04f, +2.357352548e-03f, +1.392261511e-03f, -3.151844842e-03f, -8.469314215e-03f, -9.503961719e-03f, -4.004085039e-03f, +4.498731341e-03f, +9.635868210e-03f, +8.212830089e-03f, +2.796102059e-03f, -1.563529005e-03f, -2.309004616e-03f, -7.511229995e-04f, +5.607455425e-04f, +6.204424737e-04f, +1.086531499e-04f, -1.496300883e-04f, -7.914691395e-05f, - /* 24, 8 */ +7.914691395e-05f, +1.496300883e-04f, -1.086531499e-04f, -6.204424737e-04f, -5.607455425e-04f, +7.511229995e-04f, +2.309004616e-03f, +1.563529005e-03f, -2.796102059e-03f, -8.212830089e-03f, -9.635868210e-03f, -4.498731341e-03f, +4.004085039e-03f, +9.503961719e-03f, +8.469314215e-03f, +3.151844842e-03f, -1.392261511e-03f, -2.357352548e-03f, -8.634643034e-04f, +5.160220948e-04f, +6.446275435e-04f, +1.383042613e-04f, -1.458197836e-04f, -8.711921055e-05f, - /* 24, 9 */ +7.118405837e-05f, +1.520281231e-04f, -8.030437567e-05f, -5.940238143e-04f, -5.999476948e-04f, +6.403913399e-04f, +2.251263312e-03f, +1.719214825e-03f, -2.445498177e-03f, -7.939858067e-03f, -9.739968779e-03f, -4.979016698e-03f, +3.496623369e-03f, +9.344338564e-03f, +8.708056786e-03f, +3.511527821e-03f, -1.205522243e-03f, -2.395615219e-03f, -9.768641187e-04f, +4.657528710e-04f, +6.662938873e-04f, +1.691333585e-04f, -1.405242734e-04f, -9.502680145e-05f, - /* 24,10 */ +6.329988035e-05f, +1.530928622e-04f, -5.336672075e-05f, -5.656561208e-04f, -6.336836952e-04f, +5.317880090e-04f, +2.184839011e-03f, +1.859280606e-03f, -2.101181791e-03f, -7.651694576e-03f, -9.816280735e-03f, -5.443455012e-03f, +2.977945083e-03f, +9.157195135e-03f, +8.927853008e-03f, +3.873906570e-03f, -1.003494037e-03f, -2.423123355e-03f, -1.090740633e-03f, +4.099455518e-04f, +6.851576168e-04f, +2.010005851e-04f, -1.336775649e-04f, -1.027909684e-04f, - /* 24,11 */ +5.555842361e-05f, +1.529084143e-04f, -2.793344097e-05f, -5.356216172e-04f, -6.620377298e-04f, +4.257977068e-04f, +2.110456450e-03f, +1.983757790e-03f, -1.764247300e-03f, -7.349672574e-03f, -9.864926907e-03f, -5.890625670e-03f, +2.449695551e-03f, +8.942835031e-03f, +9.127552920e-03f, +4.237695644e-03f, -7.864337317e-04f, -2.439234434e-03f, -1.204483360e-03f, +3.486413414e-04f, +7.009379926e-04f, +2.337507561e-04f, -1.252215041e-04f, -1.103288160e-04f, - /* 24,12 */ +4.801831197e-05f, +1.515631236e-04f, -4.082412249e-06f, -5.041985339e-04f, -6.851212972e-04f, +3.228698520e-04f, +2.028850662e-03f, +2.092745601e-03f, -1.435731166e-03f, -7.035155238e-03f, -9.886134123e-03f, -6.319179241e-03f, +1.913559980e-03f, +8.701668636e-03f, +9.306067159e-03f, +4.601573558e-03f, -5.546728855e-04f, -2.443336794e-03f, -1.317455363e-03f, +2.819161814e-04f, +7.133593846e-04f, +2.672136493e-04f, -1.151066589e-04f, -1.175537217e-04f, - /* 24,13 */ +4.073257728e-05f, +1.491486840e-04f, +1.812362539e-05f, -4.716595396e-04f, -7.030713845e-04f, +2.234175210e-04f, +1.940762958e-03f, +2.186408722e-03f, -1.116608515e-03f, -6.709529590e-03f, -9.880231223e-03f, -6.727842835e-03f, +1.371256439e-03f, +8.434212217e-03f, +9.462372525e-03f, +4.964188024e-03f, -3.086181402e-04f, -2.434853697e-03f, -1.428995714e-03f, +2.098818030e-04f, +7.221532843e-04f, +3.012044148e-04f, -1.032931784e-04f, -1.243758393e-04f, - /* 24,14 */ +3.374854096e-05f, +1.457592711e-04f, +3.863673145e-05f, -4.382702758e-04f, -7.160485626e-04f, +1.278166248e-04f, +1.846937004e-03f, +2.264974711e-03f, -8.077901021e-04f, -6.374200107e-03f, -9.847646625e-03f, -7.115425083e-03f, +8.245287223e-04f, +8.141086512e-03f, +9.595517291e-03f, +5.324161431e-03f, -4.875121157e-05f, -2.413247311e-03f, -1.538422151e-03f, +1.326866063e-04f, +7.270603554e-04f, +3.355241044e-04f, -8.975162518e-05f, -1.307026563e-04f, - /* 24,15 */ +2.710774794e-05f, +1.414906982e-04f, +5.742334247e-05f, -4.042879967e-04f, -7.242350145e-04f, +3.640531891e-05f, +1.748114996e-03f, +2.328731157e-03f, -5.101196376e-04f, -6.030582333e-03f, -9.788905453e-03f, -7.480820734e-03f, +2.751390883e-04f, +7.823014841e-03f, +9.704626250e-03f, +5.680096534e-03f, +2.243714932e-04f, -2.378022613e-03f, -1.645033952e-03f, +5.051635567e-05f, +7.278325124e-04f, +3.699603221e-04f, -7.446376994e-05f, -1.364396009e-04f, - /* 20, 0 */ +1.366654441e-04f, -5.248309364e-04f, -9.559425272e-04f, +4.495080153e-04f, +2.846407623e-03f, +1.989454068e-03f, -4.491151594e-03f, -1.156100448e-02f, -1.065698581e-02f, -3.895768346e-04f, +1.023895907e-02f, +1.180960294e-02f, +5.007407400e-03f, -1.738511442e-03f, -2.938517986e-03f, -6.019203323e-04f, +9.329195550e-04f, +5.763302237e-04f, -1.134902041e-04f, -1.824770389e-04f, - /* 20, 1 */ +1.568890194e-04f, -4.728495798e-04f, -9.708996289e-04f, +3.024354413e-04f, +2.741035078e-03f, +2.215509786e-03f, -3.978754642e-03f, -1.127853170e-02f, -1.103432131e-02f, -1.167153605e-03f, +9.781544627e-03f, +1.202253469e-02f, +5.525210549e-03f, -1.462933465e-03f, -3.016077094e-03f, -7.588827792e-04f, +9.015285321e-04f, +6.268920900e-04f, -8.735502929e-05f, -1.921860197e-04f, - /* 20, 2 */ +1.741940978e-04f, -4.208194393e-04f, -9.781360984e-04f, +1.614183836e-04f, +2.623714429e-03f, +2.416571115e-03f, -3.472449249e-03f, -1.096411041e-02f, -1.136986548e-02f, -1.940007910e-03f, +9.286243980e-03f, +1.219815240e-02f, +6.042182027e-03f, -1.163118517e-03f, -3.077830056e-03f, -9.195341683e-04f, +8.615147935e-04f, +6.760417132e-04f, -5.827810709e-05f, -2.008073985e-04f, - /* 20, 3 */ +1.886370492e-04f, -3.691494362e-04f, -9.780356474e-04f, +2.709710175e-05f, +2.495775707e-03f, +2.592671089e-03f, -2.974378699e-03f, -1.061978749e-02f, -1.166272581e-02f, -2.705018824e-03f, +8.754750074e-03f, +1.233496472e-02f, +6.555887236e-03f, -8.396136973e-04f, -3.122565398e-03f, -1.082944596e-03f, +8.126754773e-04f, +7.232876858e-04f, -2.630548656e-05f, -2.081598890e-04f, - /* 20, 4 */ +2.002956356e-04f, -3.182221327e-04f, -9.710157868e-04f, -9.996474913e-05f, +2.358556029e-03f, +2.743978910e-03f, -2.486586970e-03f, -1.024771819e-02f, -1.191222039e-02f, -3.459106327e-03f, +8.188939591e-03f, +1.243164652e-02f, +7.063848473e-03f, -4.931158341e-04f, -3.149124311e-03f, -1.248118895e-03f, +7.548636055e-04f, +7.681251779e-04f, +8.487693398e-06f, -2.140618814e-04f, - /* 20, 5 */ +2.092671085e-04f, -2.683920446e-04f, -9.575231021e-04f, -2.192806382e-04f, +2.213390969e-03f, +2.870794883e-03f, -2.011009640e-03f, -9.850152742e-03f, -1.211787969e-02f, -4.199247312e-03f, +7.590864160e-03f, +1.248704815e-02f, +7.563557889e-03f, -1.244715801e-04f, -3.156409832e-03f, -1.414000676e-03f, +6.879919170e-04f, +8.100393630e-04f, +4.599617124e-05f, -2.183332212e-04f, - /* 20, 6 */ +2.156662323e-04f, -2.199842607e-04f, -9.380285157e-04f, -3.304411223e-04f, +2.061606212e-03f, +2.973544666e-03f, -1.549465619e-03f, -9.429422833e-03f, -1.227944713e-02f, -4.922491262e-03f, +6.962740532e-03f, +1.250020393e-02f, +8.052490864e-03f, +2.653234199e-04f, -3.143395899e-03f, -1.579476941e-03f, +6.120364145e-04f, +8.485090918e-04f, +8.608374363e-05f, -2.207970734e-04f, - /* 20, 7 */ +2.196232573e-04f, -1.732933680e-04f, -9.130225739e-04f, -4.331132727e-04f, +1.904509553e-03f, +3.052772891e-03f, -1.103649750e-03f, -8.987927630e-03f, -1.239687839e-02f, -5.625975475e-03f, +6.306939763e-03f, +1.247033951e-02f, +8.528119711e-03f, +6.751263085e-04f, -3.109136222e-03f, -1.743383273e-03f, +5.270395872e-04f, +8.830107920e-04f, +1.285826773e-04f, -2.212818602e-04f, - /* 20, 8 */ +2.212818602e-04f, -1.285826773e-04f, -8.830107920e-04f, -5.270395872e-04f, +1.743383273e-03f, +3.109136222e-03f, -6.751263085e-04f, -8.528119711e-03f, -1.247033951e-02f, -6.306939763e-03f, +5.625975475e-03f, +1.239687839e-02f, +8.987927630e-03f, +1.103649750e-03f, -3.052772891e-03f, -1.904509553e-03f, +4.331132727e-04f, +9.130225739e-04f, +1.732933680e-04f, -2.196232573e-04f, - /* 20, 9 */ +2.207970734e-04f, -8.608374363e-05f, -8.485090918e-04f, -6.120364145e-04f, +1.579476941e-03f, +3.143395899e-03f, -2.653234199e-04f, -8.052490864e-03f, -1.250020393e-02f, -6.962740532e-03f, +4.922491262e-03f, +1.227944713e-02f, +9.429422833e-03f, +1.549465619e-03f, -2.973544666e-03f, -2.061606212e-03f, +3.304411223e-04f, +9.380285157e-04f, +2.199842607e-04f, -2.156662323e-04f, - /* 20,10 */ +2.183332212e-04f, -4.599617124e-05f, -8.100393630e-04f, -6.879919170e-04f, +1.414000676e-03f, +3.156409832e-03f, +1.244715801e-04f, -7.563557889e-03f, -1.248704815e-02f, -7.590864160e-03f, +4.199247312e-03f, +1.211787969e-02f, +9.850152742e-03f, +2.011009640e-03f, -2.870794883e-03f, -2.213390969e-03f, +2.192806382e-04f, +9.575231021e-04f, +2.683920446e-04f, -2.092671085e-04f, - /* 20,11 */ +2.140618814e-04f, -8.487693398e-06f, -7.681251779e-04f, -7.548636055e-04f, +1.248118895e-03f, +3.149124311e-03f, +4.931158341e-04f, -7.063848473e-03f, -1.243164652e-02f, -8.188939591e-03f, +3.459106327e-03f, +1.191222039e-02f, +1.024771819e-02f, +2.486586970e-03f, -2.743978910e-03f, -2.358556029e-03f, +9.996474913e-05f, +9.710157868e-04f, +3.182221327e-04f, -2.002956356e-04f, - /* 20,12 */ +2.081598890e-04f, +2.630548656e-05f, -7.232876858e-04f, -8.126754773e-04f, +1.082944596e-03f, +3.122565398e-03f, +8.396136973e-04f, -6.555887236e-03f, -1.233496472e-02f, -8.754750074e-03f, +2.705018824e-03f, +1.166272581e-02f, +1.061978749e-02f, +2.974378699e-03f, -2.592671089e-03f, -2.495775707e-03f, -2.709710175e-05f, +9.780356474e-04f, +3.691494362e-04f, -1.886370492e-04f, - /* 20,13 */ +2.008073985e-04f, +5.827810709e-05f, -6.760417132e-04f, -8.615147935e-04f, +9.195341683e-04f, +3.077830056e-03f, +1.163118517e-03f, -6.042182027e-03f, -1.219815240e-02f, -9.286243980e-03f, +1.940007910e-03f, +1.136986548e-02f, +1.096411041e-02f, +3.472449249e-03f, -2.416571115e-03f, -2.623714429e-03f, -1.614183836e-04f, +9.781360984e-04f, +4.208194393e-04f, -1.741940978e-04f, - /* 20,14 */ +1.921860197e-04f, +8.735502929e-05f, -6.268920900e-04f, -9.015285321e-04f, +7.588827792e-04f, +3.016077094e-03f, +1.462933465e-03f, -5.525210549e-03f, -1.202253469e-02f, -9.781544627e-03f, +1.167153605e-03f, +1.103432131e-02f, +1.127853170e-02f, +3.978754642e-03f, -2.215509786e-03f, -2.741035078e-03f, -3.024354413e-04f, +9.708996289e-04f, +4.728495798e-04f, -1.568890194e-04f, - /* 20,15 */ +1.824770389e-04f, +1.134902041e-04f, -5.763302237e-04f, -9.329195550e-04f, +6.019203323e-04f, +2.938517986e-03f, +1.738511442e-03f, -5.007407400e-03f, -1.180960294e-02f, -1.023895907e-02f, +3.895768346e-04f, +1.065698581e-02f, +1.156100448e-02f, +4.491151594e-03f, -1.989454068e-03f, -2.846407623e-03f, -4.495080153e-04f, +9.559425272e-04f, +5.248309364e-04f, -1.366654441e-04f, - /* 20, 0 */ +2.228492143e-04f, +8.155042897e-05f, -9.008994790e-04f, -8.358434283e-04f, +2.057950411e-03f, +3.687980724e-03f, -2.439509438e-03f, -1.276984908e-02f, -1.372824692e-02f, -5.233437973e-04f, +1.325794606e-02f, +1.324423486e-02f, +3.079014715e-03f, -3.569583683e-03f, -2.275574997e-03f, +7.329307333e-04f, +9.595727172e-04f, -3.951670647e-05f, -2.357435643e-04f, +0.000000000e+00f, - /* 20, 1 */ +2.085936177e-04f, +1.192685572e-04f, -8.383784628e-04f, -9.252931617e-04f, +1.836793834e-03f, +3.772148819e-03f, -1.820843931e-03f, -1.225552529e-02f, -1.413563751e-02f, -1.567452511e-03f, +1.272631251e-02f, +1.367510758e-02f, +3.736377939e-03f, -3.415952420e-03f, -2.487640644e-03f, +6.166326985e-04f, +1.013551226e-03f, +6.721135679e-06f, -2.469830254e-04f, +3.513221827e-04f, - /* 20, 2 */ +1.932641301e-04f, +1.526114972e-04f, -7.728409668e-04f, -1.001322392e-03f, +1.614057279e-03f, +3.823286477e-03f, -1.225775962e-03f, -1.170500117e-02f, -1.447891891e-02f, -2.603840968e-03f, +1.213529571e-02f, +1.405908160e-02f, +4.408408028e-03f, -3.226289363e-03f, -2.692058620e-03f, +4.871526668e-04f, +1.061979909e-03f, +5.699759108e-05f, -2.562708188e-04f, -2.243392330e-05f, - /* 20, 3 */ +1.771389305e-04f, +1.815689683e-04f, -7.050956564e-04f, -1.064087220e-03f, +1.391605775e-03f, +3.842769943e-03f, -6.568264230e-04f, -1.112214974e-02f, -1.475727496e-02f, -3.627416831e-03f, +1.148720750e-02f, +1.439298630e-02f, +5.091721334e-03f, -3.000017933e-03f, -2.886692602e-03f, +3.448244648e-04f, +1.104003505e-03f, +1.110914327e-04f, -2.633104157e-04f, -3.471505729e-05f, - /* 20, 4 */ +1.604844080e-04f, +2.061770649e-04f, -6.359221544e-04f, -1.113850250e-03f, +1.171206475e-03f, +3.832136817e-03f, -1.162685315e-04f, -1.051095143e-02f, -1.497027375e-02f, -4.633169088e-03f, +1.078471010e-02f, +1.467389068e-02f, +5.782760145e-03f, -2.736794515e-03f, -3.069373786e-03f, +1.901162062e-04f, +1.138774993e-03f, +1.687245284e-04f, -2.678091338e-04f, -4.805250238e-05f, - /* 20, 5 */ +1.435528424e-04f, +2.265149998e-04f, -5.660652366e-04f, -1.150972836e-03f, +9.545189950e-04f, +3.793068954e-03f, +3.938808876e-04f, -9.875465824e-03f, -1.511786634e-02f, -5.616199746e-03f, +1.003080152e-02f, +1.489912656e-02f, +6.477812874e-03f, -2.436518983e-03f, -3.237916857e-03f, +2.363306300e-05f, +1.165464351e-03f, +2.295611999e-04f, -2.694819135e-04f, -6.235351094e-05f, - /* 20, 6 */ +1.265803873e-04f, +2.427015763e-04f, -4.962296614e-04f, -1.175906803e-03f, +7.430870045e-04f, +3.727374795e-03f, +8.718680321e-04f, -9.219803451e-03f, -1.520038286e-02f, -6.571754682e-03f, +9.228798617e-03f, +1.506631023e-02f, +7.173035830e-03f, -2.099343642e-03f, -3.390136682e-03f, -1.538810619e-04f, +1.183267602e-03f, +2.932081598e-04f, -2.680552395e-04f, -7.750368078e-05f, - /* 20, 7 */ +1.097853637e-04f, +2.548914413e-04f, -4.270756535e-04f, -1.189185758e-03f, +5.383311068e-04f, +3.636971298e-03f, +1.316206650e-03f, -8.548097577e-03f, -1.521852609e-02f, -7.495253444e-03f, +8.382317770e-03f, +1.517336238e-02f, +7.864476409e-03f, -1.725680482e-03f, -3.523865616e-03f, -3.415430197e-04f, +1.191416067e-03f, +3.592150564e-04f, -2.632711715e-04f, -9.336686615e-05f, - /* 20, 8 */ +9.336686615e-05f, +2.632711715e-04f, -3.592150564e-04f, -1.191416067e-03f, +3.415430197e-04f, +3.523865616e-03f, +1.725680482e-03f, -7.864476409e-03f, -1.517336238e-02f, -8.382317770e-03f, +7.495253444e-03f, +1.521852609e-02f, +8.548097577e-03f, -1.316206650e-03f, -3.636971298e-03f, -5.383311068e-04f, +1.189185758e-03f, +4.270756535e-04f, -2.548914413e-04f, -1.097853637e-04f, - /* 20, 9 */ +7.750368078e-05f, +2.680552395e-04f, -2.932081598e-04f, -1.183267602e-03f, +1.538810619e-04f, +3.390136682e-03f, +2.099343642e-03f, -7.173035830e-03f, -1.506631023e-02f, -9.228798617e-03f, +6.571754682e-03f, +1.520038286e-02f, +9.219803451e-03f, -8.718680321e-04f, -3.727374795e-03f, -7.430870045e-04f, +1.175906803e-03f, +4.962296614e-04f, -2.427015763e-04f, -1.265803873e-04f, - /* 20,10 */ +6.235351094e-05f, +2.694819135e-04f, -2.295611999e-04f, -1.165464351e-03f, -2.363306300e-05f, +3.237916857e-03f, +2.436518983e-03f, -6.477812874e-03f, -1.489912656e-02f, -1.003080152e-02f, +5.616199746e-03f, +1.511786634e-02f, +9.875465824e-03f, -3.938808876e-04f, -3.793068954e-03f, -9.545189950e-04f, +1.150972836e-03f, +5.660652366e-04f, -2.265149998e-04f, -1.435528424e-04f, - /* 20,11 */ +4.805250238e-05f, +2.678091338e-04f, -1.687245284e-04f, -1.138774993e-03f, -1.901162062e-04f, +3.069373786e-03f, +2.736794515e-03f, -5.782760145e-03f, -1.467389068e-02f, -1.078471010e-02f, +4.633169088e-03f, +1.497027375e-02f, +1.051095143e-02f, +1.162685315e-04f, -3.832136817e-03f, -1.171206475e-03f, +1.113850250e-03f, +6.359221544e-04f, -2.061770649e-04f, -1.604844080e-04f, - /* 20,12 */ +3.471505729e-05f, +2.633104157e-04f, -1.110914327e-04f, -1.104003505e-03f, -3.448244648e-04f, +2.886692602e-03f, +3.000017933e-03f, -5.091721334e-03f, -1.439298630e-02f, -1.148720750e-02f, +3.627416831e-03f, +1.475727496e-02f, +1.112214974e-02f, +6.568264230e-04f, -3.842769943e-03f, -1.391605775e-03f, +1.064087220e-03f, +7.050956564e-04f, -1.815689683e-04f, -1.771389305e-04f, - /* 20,13 */ +2.243392330e-05f, +2.562708188e-04f, -5.699759108e-05f, -1.061979909e-03f, -4.871526668e-04f, +2.692058620e-03f, +3.226289363e-03f, -4.408408028e-03f, -1.405908160e-02f, -1.213529571e-02f, +2.603840968e-03f, +1.447891891e-02f, +1.170500117e-02f, +1.225775962e-03f, -3.823286477e-03f, -1.614057279e-03f, +1.001322392e-03f, +7.728409668e-04f, -1.526114972e-04f, -1.932641301e-04f, - /* 20,14 */ -3.513221827e-04f, +2.469830254e-04f, -6.721135679e-06f, -1.013551226e-03f, -6.166326985e-04f, +2.487640644e-03f, +3.415952420e-03f, -3.736377939e-03f, -1.367510758e-02f, -1.272631251e-02f, +1.567452511e-03f, +1.413563751e-02f, +1.225552529e-02f, +1.820843931e-03f, -3.772148819e-03f, -1.836793834e-03f, +9.252931617e-04f, +8.383784628e-04f, -1.192685572e-04f, -2.085936177e-04f, - /* 20,15 */ +0.000000000e+00f, +2.357435643e-04f, +3.951670647e-05f, -9.595727172e-04f, -7.329307333e-04f, +2.275574997e-03f, +3.569583683e-03f, -3.079014715e-03f, -1.324423486e-02f, -1.325794606e-02f, +5.233437973e-04f, +1.372824692e-02f, +1.276984908e-02f, +2.439509438e-03f, -3.687980724e-03f, -2.057950411e-03f, +8.358434283e-04f, +9.008994790e-04f, -8.155042897e-05f, -2.228492143e-04f, - /* 20, 0 */ +1.941987182e-05f, +3.146481294e-04f, -2.345645569e-04f, -1.414667200e-03f, +5.144442975e-04f, +4.454307224e-03f, +1.983750799e-04f, -1.327145644e-02f, -1.714303646e-02f, -6.846700315e-04f, +1.665178821e-02f, +1.403392762e-02f, +4.892879248e-04f, -4.540173148e-03f, -7.773192529e-04f, +1.425286503e-03f, +3.160682424e-04f, -3.205185770e-04f, -3.476344875e-05f, +0.000000000e+00f, - /* 20, 1 */ -3.929324583e-04f, +3.051602666e-04f, -1.573970191e-04f, -1.390281543e-03f, +2.638941923e-04f, +4.333213577e-03f, +8.411158857e-04f, -1.246868983e-02f, -1.754185168e-02f, -2.049974665e-03f, +1.606968443e-02f, +1.474987505e-02f, +1.218921159e-03f, -4.587812221e-03f, -1.050600845e-03f, +1.421006956e-03f, +4.012475422e-04f, -3.223256966e-04f, -5.166761157e-05f, +0.000000000e+00f, - /* 20, 2 */ +0.000000000e+00f, +2.925136688e-04f, -8.512788201e-05f, -1.353337804e-03f, +2.735561011e-05f, +4.180044295e-03f, +1.436437300e-03f, -1.163198941e-02f, -1.784731333e-02f, -3.403203680e-03f, +1.539895444e-02f, +1.541325656e-02f, +1.987128326e-03f, -4.594412557e-03f, -1.332146559e-03f, +1.400789491e-03f, +4.893452569e-04f, -3.196436833e-04f, -7.000071077e-05f, +0.000000000e+00f, - /* 20, 3 */ +0.000000000e+00f, +2.771727451e-04f, -1.822077520e-05f, -1.305102482e-03f, -1.937209193e-04f, +3.998069961e-03f, +1.982303068e-03f, -1.076779718e-02f, -1.805915757e-02f, -4.736408619e-03f, +1.464246859e-02f, +1.601826823e-02f, +2.790083541e-03f, -4.557383277e-03f, -1.619599483e-03f, +1.363706016e-03f, +5.795104543e-04f, -3.120743969e-04f, -8.959420873e-05f, +0.000000000e+00f, - /* 20, 4 */ +0.000000000e+00f, +2.596009711e-04f, +4.295843246e-05f, -1.246883037e-03f, -3.981230344e-04f, +3.790645354e-03f, +2.477139789e-03f, -9.882582946e-03f, -1.817777152e-02f, -6.041793017e-03f, +1.380372215e-02f, +1.655939544e-02f, +3.623550339e-03f, -4.474387395e-03f, -1.910400883e-03f, +1.308956662e-03f, +6.708027600e-04f, -2.992550459e-04f, -1.102423612e-04f, +0.000000000e+00f, - /* 20, 5 */ +0.000000000e+00f, +2.402546692e-04f, +9.813963752e-05f, -1.180011107e-03f, -5.848760724e-04f, +3.561175652e-03f, +2.919834686e-03f, -8.982792490e-03f, -1.820418220e-02f, -7.311771311e-03f, +1.288681385e-02f, +1.703146227e-02f, +4.482904855e-03f, -4.343373467e-03f, -2.201805423e-03f, +1.235886510e-03f, +7.621980241e-04f, -2.808658988e-04f, -1.317024534e-04f, +0.000000000e+00f, - /* 20, 6 */ +0.000000000e+00f, +2.195772899e-04f, +1.471454599e-04f, -1.105826337e-03f, -7.532402115e-04f, +3.313083439e-03f, +3.309729355e-03f, -8.074797022e-03f, -1.814004021e-02f, -8.539025902e-03f, +1.189641917e-02f, +1.742967891e-02f, +5.363163073e-03f, -4.162605659e-03f, -2.490898970e-03f, +1.144001586e-03f, +8.525953702e-04f, -2.566379213e-04f, -1.536956226e-04f, +0.000000000e+00f, - /* 20, 7 */ +0.000000000e+00f, +1.979942392e-04f, +1.898872476e-04f, -1.025661016e-03f, -9.027053553e-04f, +3.049776817e-03f, +3.646609643e-03f, -7.164844319e-03f, -1.798759853e-02f, -9.716561844e-03f, +1.083775871e-02f, +1.774968640e-02f, +6.259011965e-03f, -3.930691879e-03f, -2.774618906e-03f, +1.032983905e-03f, +9.408256132e-04f, -2.263602294e-04f, -1.759082929e-04f, +0.000000000e+00f, - /* 20, 8 */ +0.000000000e+00f, +1.759082929e-04f, +2.263602294e-04f, -9.408256132e-04f, -1.032983905e-03f, +2.774618906e-03f, +3.930691879e-03f, -6.259011965e-03f, -1.774968640e-02f, -1.083775871e-02f, +9.716561844e-03f, +1.798759853e-02f, +7.164844319e-03f, -3.646609643e-03f, -3.049776817e-03f, +9.027053553e-04f, +1.025661016e-03f, -1.898872476e-04f, -1.979942392e-04f, +0.000000000e+00f, - /* 20, 9 */ +0.000000000e+00f, +1.536956226e-04f, +2.566379213e-04f, -8.525953702e-04f, -1.144001586e-03f, +2.490898970e-03f, +4.162605659e-03f, -5.363163073e-03f, -1.742967891e-02f, -1.189641917e-02f, +8.539025902e-03f, +1.814004021e-02f, +8.074797022e-03f, -3.309729355e-03f, -3.313083439e-03f, +7.532402115e-04f, +1.105826337e-03f, -1.471454599e-04f, -2.195772899e-04f, +0.000000000e+00f, - /* 20,10 */ +0.000000000e+00f, +1.317024534e-04f, +2.808658988e-04f, -7.621980241e-04f, -1.235886510e-03f, +2.201805423e-03f, +4.343373467e-03f, -4.482904855e-03f, -1.703146227e-02f, -1.288681385e-02f, +7.311771311e-03f, +1.820418220e-02f, +8.982792490e-03f, -2.919834686e-03f, -3.561175652e-03f, +5.848760724e-04f, +1.180011107e-03f, -9.813963752e-05f, -2.402546692e-04f, +0.000000000e+00f, - /* 20,11 */ +0.000000000e+00f, +1.102423612e-04f, +2.992550459e-04f, -6.708027600e-04f, -1.308956662e-03f, +1.910400883e-03f, +4.474387395e-03f, -3.623550339e-03f, -1.655939544e-02f, -1.380372215e-02f, +6.041793017e-03f, +1.817777152e-02f, +9.882582946e-03f, -2.477139789e-03f, -3.790645354e-03f, +3.981230344e-04f, +1.246883037e-03f, -4.295843246e-05f, -2.596009711e-04f, +0.000000000e+00f, - /* 20,12 */ +0.000000000e+00f, +8.959420873e-05f, +3.120743969e-04f, -5.795104543e-04f, -1.363706016e-03f, +1.619599483e-03f, +4.557383277e-03f, -2.790083541e-03f, -1.601826823e-02f, -1.464246859e-02f, +4.736408619e-03f, +1.805915757e-02f, +1.076779718e-02f, -1.982303068e-03f, -3.998069961e-03f, +1.937209193e-04f, +1.305102482e-03f, +1.822077520e-05f, -2.771727451e-04f, +0.000000000e+00f, - /* 20,13 */ +0.000000000e+00f, +7.000071077e-05f, +3.196436833e-04f, -4.893452569e-04f, -1.400789491e-03f, +1.332146559e-03f, +4.594412557e-03f, -1.987128326e-03f, -1.541325656e-02f, -1.539895444e-02f, +3.403203680e-03f, +1.784731333e-02f, +1.163198941e-02f, -1.436437300e-03f, -4.180044295e-03f, -2.735561011e-05f, +1.353337804e-03f, +8.512788201e-05f, -2.925136688e-04f, +0.000000000e+00f, - /* 20,14 */ +0.000000000e+00f, +5.166761157e-05f, +3.223256966e-04f, -4.012475422e-04f, -1.421006956e-03f, +1.050600845e-03f, +4.587812221e-03f, -1.218921159e-03f, -1.474987505e-02f, -1.606968443e-02f, +2.049974665e-03f, +1.754185168e-02f, +1.246868983e-02f, -8.411158857e-04f, -4.333213577e-03f, -2.638941923e-04f, +1.390281543e-03f, +1.573970191e-04f, -3.051602666e-04f, +3.929324583e-04f, - /* 20,15 */ +0.000000000e+00f, +3.476344875e-05f, +3.205185770e-04f, -3.160682424e-04f, -1.425286503e-03f, +7.773192529e-04f, +4.540173148e-03f, -4.892879248e-04f, -1.403392762e-02f, -1.665178821e-02f, +6.846700315e-04f, +1.714303646e-02f, +1.327145644e-02f, -1.983750799e-04f, -4.454307224e-03f, -5.144442975e-04f, +1.414667200e-03f, +2.345645569e-04f, -3.146481294e-04f, -1.941987182e-05f, - /* 16, 0 */ +3.215659774e-04f, -1.081239301e-03f, -1.047044785e-03f, +4.045780572e-03f, +3.005074105e-03f, -1.291342297e-02f, -2.083886340e-02f, -8.761305366e-04f, +2.037274022e-02f, +1.401097590e-02f, -2.379335663e-03f, -4.351475252e-03f, +8.522542940e-04f, +1.190910327e-03f, -2.874725537e-04f, -1.571395541e-04f, - /* 16, 1 */ +3.474336395e-04f, -9.673171402e-04f, -1.215210440e-03f, +3.716713245e-03f, +3.558195313e-03f, -1.178473019e-02f, -2.117503726e-02f, -2.622305580e-03f, +1.977768827e-02f, +1.506763496e-02f, -1.682580557e-03f, -4.628640452e-03f, +6.313208395e-04f, +1.294421768e-03f, -2.448738999e-04f, -1.853334990e-04f, - /* 16, 2 */ +3.654544998e-04f, -8.509694882e-04f, -1.356620316e-03f, +3.369379821e-03f, +4.037840451e-03f, -1.063463040e-02f, -2.138131359e-02f, -4.350277043e-03f, +1.905580462e-02f, +1.607371744e-02f, -9.171630004e-04f, -4.872124601e-03f, +3.850930357e-04f, +1.389803701e-03f, -1.936024914e-04f, -2.137577131e-04f, - /* 16, 3 */ +3.760939096e-04f, -7.339202470e-04f, -1.471475134e-03f, +3.008783957e-03f, +4.443873126e-03f, -9.472744965e-03f, -2.145880202e-02f, -6.048090342e-03f, +1.821025632e-02f, +1.701970579e-02f, -8.619500088e-05f, -5.076839304e-03f, +1.147982409e-04f, +1.475048300e-03f, -1.336143134e-04f, -2.418805517e-04f, - /* 16, 4 */ +3.798900997e-04f, -6.177751723e-04f, -1.560284979e-03f, +2.639777229e-03f, +4.776853126e-03f, -8.308496634e-03f, -2.140964525e-02f, -7.704060609e-03f, +1.724526338e-02f, +1.789634168e-02f, +8.064574864e-04f, -5.237819035e-03f, -1.779495980e-04f, +1.548135431e-03f, -6.499930382e-05f, -2.691226085e-04f, - /* 16, 5 */ +3.774404835e-04f, -5.040080805e-04f, -1.623844377e-03f, +2.267013831e-03f, +5.038003695e-03f, -7.151026424e-03f, -2.123698452e-02f, -9.306876654e-03f, +1.616607109e-02f, +1.869471933e-02f, +1.756186609e-03f, -5.350281937e-03f, -4.911465534e-04f, +1.607060019e-03f, +1.200956190e-05f, -2.948629835e-04f, - /* 16, 6 */ +3.693879948e-04f, -3.939497146e-04f, -1.663205192e-03f, +1.894909522e-03f, +5.229172900e-03f, -6.009115326e-03f, -2.094491570e-02f, -1.084570103e-02f, +1.497891218e-02f, +1.940637710e-02f, +2.757662946e-03f, -5.409691072e-03f, -8.224000281e-04f, +1.649860923e-03f, +9.702877105e-05f, -3.184467584e-04f, - /* 16, 7 */ +3.564076658e-04f, -2.887792732e-04f, -1.679647798e-03f, +1.527605146e-03f, +5.352789702e-03f, -4.891111570e-03f, -2.053843663e-02f, -1.231026521e-02f, +1.369095882e-02f, +2.002338639e-02f, +3.804864118e-03f, -5.411815390e-03f, -1.168934972e-03f, +1.674650966e-03f, +1.895185724e-04f, -3.391936346e-04f, - /* 16, 8 */ +3.391936346e-04f, -1.895185724e-04f, -1.674650966e-03f, +1.168934972e-03f, +5.411815390e-03f, -3.804864118e-03f, -2.002338639e-02f, -1.369095882e-02f, +1.231026521e-02f, +2.053843663e-02f, +4.891111570e-03f, -5.352789702e-03f, -1.527605146e-03f, +1.679647798e-03f, +2.887792732e-04f, -3.564076658e-04f, - /* 16, 9 */ +3.184467584e-04f, -9.702877105e-05f, -1.649860923e-03f, +8.224000281e-04f, +5.409691072e-03f, -2.757662946e-03f, -1.940637710e-02f, -1.497891218e-02f, +1.084570103e-02f, +2.094491570e-02f, +6.009115326e-03f, -5.229172900e-03f, -1.894909522e-03f, +1.663205192e-03f, +3.939497146e-04f, -3.693879948e-04f, - /* 16,10 */ +2.948629835e-04f, -1.200956190e-05f, -1.607060019e-03f, +4.911465534e-04f, +5.350281937e-03f, -1.756186609e-03f, -1.869471933e-02f, -1.616607109e-02f, +9.306876654e-03f, +2.123698452e-02f, +7.151026424e-03f, -5.038003695e-03f, -2.267013831e-03f, +1.623844377e-03f, +5.040080805e-04f, -3.774404835e-04f, - /* 16,11 */ +2.691226085e-04f, +6.499930382e-05f, -1.548135431e-03f, +1.779495980e-04f, +5.237819035e-03f, -8.064574864e-04f, -1.789634168e-02f, -1.724526338e-02f, +7.704060609e-03f, +2.140964525e-02f, +8.308496634e-03f, -4.776853126e-03f, -2.639777229e-03f, +1.560284979e-03f, +6.177751723e-04f, -3.798900997e-04f, - /* 16,12 */ +2.418805517e-04f, +1.336143134e-04f, -1.475048300e-03f, -1.147982409e-04f, +5.076839304e-03f, +8.619500088e-05f, -1.701970579e-02f, -1.821025632e-02f, +6.048090342e-03f, +2.145880202e-02f, +9.472744965e-03f, -4.443873126e-03f, -3.008783957e-03f, +1.471475134e-03f, +7.339202470e-04f, -3.760939096e-04f, - /* 16,13 */ +2.137577131e-04f, +1.936024914e-04f, -1.389803701e-03f, -3.850930357e-04f, +4.872124601e-03f, +9.171630004e-04f, -1.607371744e-02f, -1.905580462e-02f, +4.350277043e-03f, +2.138131359e-02f, +1.063463040e-02f, -4.037840451e-03f, -3.369379821e-03f, +1.356620316e-03f, +8.509694882e-04f, -3.654544998e-04f, - /* 16,14 */ +1.853334990e-04f, +2.448738999e-04f, -1.294421768e-03f, -6.313208395e-04f, +4.628640452e-03f, +1.682580557e-03f, -1.506763496e-02f, -1.977768827e-02f, +2.622305580e-03f, +2.117503726e-02f, +1.178473019e-02f, -3.558195313e-03f, -3.716713245e-03f, +1.215210440e-03f, +9.673171402e-04f, -3.474336395e-04f, - /* 16,15 */ +1.571395541e-04f, +2.874725537e-04f, -1.190910327e-03f, -8.522542940e-04f, +4.351475252e-03f, +2.379335663e-03f, -1.401097590e-02f, -2.037274022e-02f, +8.761305366e-04f, +2.083886340e-02f, +1.291342297e-02f, -3.005074105e-03f, -4.045780572e-03f, +1.047044785e-03f, +1.081239301e-03f, -3.215659774e-04f, - /* 16, 0 */ +3.737698842e-04f, -2.640449894e-04f, -1.945694549e-03f, +2.599440145e-03f, +5.499552783e-03f, -1.161604587e-02f, -2.473725459e-02f, -1.100298137e-03f, +2.435797715e-02f, +1.306966182e-02f, -5.062036618e-03f, -3.067638325e-03f, +1.905476637e-03f, +3.919780470e-04f, -3.991665042e-04f, +0.000000000e+00f, - /* 16, 1 */ +3.444161169e-04f, -1.448617079e-04f, -1.955541719e-03f, +2.132654952e-03f, +5.839402648e-03f, -1.015371093e-02f, -2.494083956e-02f, -3.291998323e-03f, +2.380252288e-02f, +1.450063212e-02f, -4.525267650e-03f, -3.530814272e-03f, +1.832921116e-03f, +5.273022833e-04f, -4.195866486e-04f, +0.000000000e+00f, - /* 16, 2 */ +3.121018536e-04f, -3.553225965e-05f, -1.937280777e-03f, +1.673279684e-03f, +6.084169165e-03f, -8.696195593e-03f, -2.497087446e-02f, -5.457102987e-03f, +2.307209479e-02f, +1.589478690e-02f, -3.888719495e-03f, -3.982156136e-03f, +1.726408630e-03f, +6.684076945e-04f, -4.340068349e-04f, +0.000000000e+00f, - /* 16, 3 */ +2.777843660e-04f, +6.309259068e-05f, -1.893417136e-03f, +1.226820211e-03f, +6.237358144e-03f, -7.256513778e-03f, -2.483111182e-02f, -7.578189778e-03f, +2.216959356e-02f, +1.723786448e-02f, -3.152978451e-03f, -4.414545490e-03f, +1.584716951e-03f, +8.134406195e-04f, -4.414195390e-04f, +4.634120047e-04f, - /* 16, 4 */ +2.423668462e-04f, +1.504100330e-04f, -1.826645633e-03f, +7.982477790e-04f, +6.303316031e-03f, -5.847027899e-03f, -2.452684878e-02f, -9.638294429e-03f, +2.109960841e-02f, +1.851566754e-02f, -2.319783877e-03f, -4.820635148e-03f, +1.407067591e-03f, +9.603162700e-04f, -4.408546251e-04f, -2.338334874e-05f, - /* 16, 5 */ +2.066858426e-04f, +2.260561294e-04f, -1.739797615e-03f, +3.919648528e-04f, +6.287140435e-03f, -4.479333074e-03f, -2.406484480e-02f, -1.162108621e-02f, +1.986838848e-02f, +1.971422226e-02f, -1.392055451e-03f, -5.192933984e-03f, +1.193168502e-03f, +1.106736135e-03f, -4.314017719e-04f, -4.782938304e-05f, - /* 16, 6 */ +1.715009195e-04f, +2.898933732e-04f, -1.635789255e-03f, +1.178042715e-05f, +6.194584811e-03f, -3.164153635e-03f, -2.345322399e-02f, -1.351103572e-02f, +1.848379497e-02f, +2.081993840e-02f, -3.739065234e-04f, -5.523897843e-03f, +9.432519997e-04f, +1.250210274e-03f, -4.122335402e-04f, -7.520965874e-05f, - /* 16, 7 */ +1.374865801e-04f, +3.419953130e-04f, -1.517571800e-03f, -3.391052954e-04f, +6.031958779e-03f, -1.911252903e-03f, -2.270136331e-02f, -1.529357304e-02f, +1.695523429e-02f, +2.181976838e-02f, +7.293570292e-04f, -5.806025538e-03f, +6.581070752e-04f, +1.388084428e-03f, -3.826286881e-04f, -1.052264476e-04f, - /* 16, 8 */ +1.052264476e-04f, +3.826286881e-04f, -1.388084428e-03f, -6.581070752e-04f, +5.806025538e-03f, -7.293570292e-04f, -2.181976838e-02f, -1.695523429e-02f, +1.529357304e-02f, +2.270136331e-02f, +1.911252903e-03f, -6.031958779e-03f, +3.391052954e-04f, +1.517571800e-03f, -3.419953130e-04f, -1.374865801e-04f, - /* 16, 9 */ +7.520965874e-05f, +4.122335402e-04f, -1.250210274e-03f, -9.432519997e-04f, +5.523897843e-03f, +3.739065234e-04f, -2.081993840e-02f, -1.848379497e-02f, +1.351103572e-02f, +2.345322399e-02f, +3.164153635e-03f, -6.194584811e-03f, -1.178042715e-05f, +1.635789255e-03f, -2.898933732e-04f, -1.715009195e-04f, - /* 16,10 */ +4.782938304e-05f, +4.314017719e-04f, -1.106736135e-03f, -1.193168502e-03f, +5.192933984e-03f, +1.392055451e-03f, -1.971422226e-02f, -1.986838848e-02f, +1.162108621e-02f, +2.406484480e-02f, +4.479333074e-03f, -6.287140435e-03f, -3.919648528e-04f, +1.739797615e-03f, -2.260561294e-04f, -2.066858426e-04f, - /* 16,11 */ +2.338334874e-05f, +4.408546251e-04f, -9.603162700e-04f, -1.407067591e-03f, +4.820635148e-03f, +2.319783877e-03f, -1.851566754e-02f, -2.109960841e-02f, +9.638294429e-03f, +2.452684878e-02f, +5.847027899e-03f, -6.303316031e-03f, -7.982477790e-04f, +1.826645633e-03f, -1.504100330e-04f, -2.423668462e-04f, - /* 16,12 */ -4.634120047e-04f, +4.414195390e-04f, -8.134406195e-04f, -1.584716951e-03f, +4.414545490e-03f, +3.152978451e-03f, -1.723786448e-02f, -2.216959356e-02f, +7.578189778e-03f, +2.483111182e-02f, +7.256513778e-03f, -6.237358144e-03f, -1.226820211e-03f, +1.893417136e-03f, -6.309259068e-05f, -2.777843660e-04f, - /* 16,13 */ +0.000000000e+00f, +4.340068349e-04f, -6.684076945e-04f, -1.726408630e-03f, +3.982156136e-03f, +3.888719495e-03f, -1.589478690e-02f, -2.307209479e-02f, +5.457102987e-03f, +2.497087446e-02f, +8.696195593e-03f, -6.084169165e-03f, -1.673279684e-03f, +1.937280777e-03f, +3.553225965e-05f, -3.121018536e-04f, - /* 16,14 */ +0.000000000e+00f, +4.195866486e-04f, -5.273022833e-04f, -1.832921116e-03f, +3.530814272e-03f, +4.525267650e-03f, -1.450063212e-02f, -2.380252288e-02f, +3.291998323e-03f, +2.494083956e-02f, +1.015371093e-02f, -5.839402648e-03f, -2.132654952e-03f, +1.955541719e-03f, +1.448617079e-04f, -3.444161169e-04f, - /* 16,15 */ +0.000000000e+00f, +3.991665042e-04f, -3.919780470e-04f, -1.905476637e-03f, +3.067638325e-03f, +5.062036618e-03f, -1.306966182e-02f, -2.435797715e-02f, +1.100298137e-03f, +2.473725459e-02f, +1.161604587e-02f, -5.499552783e-03f, -2.599440145e-03f, +1.945694549e-03f, +2.640449894e-04f, -3.737698842e-04f, - /* 16, 0 */ +1.129954761e-04f, +3.969443331e-04f, -1.897918409e-03f, +5.803605804e-04f, +7.236474393e-03f, -9.385964725e-03f, -2.874576735e-02f, -1.359743295e-03f, +2.853093461e-02f, +1.118139232e-02f, -7.102956997e-03f, -1.091735034e-03f, +2.023521864e-03f, -3.328791130e-04f, -1.523656204e-04f, +0.000000000e+00f, - /* 16, 1 */ +7.672972562e-05f, +4.458313625e-04f, -1.753034729e-03f, +1.022461377e-04f, +7.257902118e-03f, -7.620475041e-03f, -2.873131200e-02f, -4.066570788e-03f, +2.808336987e-02f, +1.298853535e-02f, -6.850603202e-03f, -1.630677017e-03f, +2.125649126e-03f, -2.532507071e-04f, -1.941703587e-04f, +0.000000000e+00f, - /* 16, 2 */ +4.409159553e-05f, +4.801879450e-04f, -1.593056257e-03f, -3.378401438e-04f, +7.175055211e-03f, -5.902082228e-03f, -2.849345261e-02f, -6.735572940e-03f, +2.740215275e-02f, +1.478830973e-02f, -6.473886365e-03f, -2.190599691e-03f, +2.200171639e-03f, -1.579695096e-04f, -2.375950982e-04f, +0.000000000e+00f, - /* 16, 3 */ -4.855802427e-04f, +5.008892512e-04f, -1.422085430e-03f, -7.360682089e-04f, +6.996656391e-03f, -4.246700138e-03f, -2.804039906e-02f, -9.342037235e-03f, +2.648893755e-02f, +1.656098957e-02f, -5.968640123e-03f, -2.764068406e-03f, +2.243110553e-03f, -4.727037370e-05f, -2.816859426e-04f, +0.000000000e+00f, - /* 16, 4 */ +0.000000000e+00f, +5.090007623e-04f, -1.244075649e-03f, -1.089544232e-03f, +6.732169339e-03f, -2.668838337e-03f, -2.738254409e-02f, -1.186200034e-02f, +2.534797081e-02f, +1.828644204e-02f, -5.332184360e-03f, -3.342863857e-03f, +2.250722132e-03f, +7.826276448e-05f, -3.253590588e-04f, +0.000000000e+00f, - /* 16, 5 */ +0.000000000e+00f, +5.057402285e-04f, -1.062772468e-03f, -1.396293958e-03f, +6.391628670e-03f, -1.181467029e-03f, -2.653229393e-02f, -1.427253312e-02f, +2.398607480e-02f, +1.994437434e-02f, -4.563434465e-03f, -3.918061651e-03f, +2.219584858e-03f, +2.176775461e-04f, -3.674140144e-04f, +0.000000000e+00f, - /* 16, 6 */ +0.000000000e+00f, +4.924395299e-04f, -8.816626027e-04f, -1.655232286e-03f, +5.985469320e-03f, +2.040926394e-04f, -2.550387540e-02f, -1.655201127e-02f, +2.241259678e-02f, +2.151458926e-02f, -3.662991573e-03f, -4.480127768e-03f, +2.146686747e-03f, +3.696399185e-04f, -4.065510896e-04f, +0.000000000e+00f, - /* 16, 7 */ +0.000000000e+00f, +4.705072223e-04f, -7.039312026e-04f, -1.866120323e-03f, +5.524357980e-03f, +1.478252020e-03f, -2.431312252e-02f, -1.868036788e-02f, +2.063932435e-02f, +2.297724601e-02f, -2.633211707e-03f, -5.019029099e-03f, +2.029511283e-03f, +5.324276437e-04f, -4.413924818e-04f, +0.000000000e+00f, - /* 16, 8 */ +0.000000000e+00f, +4.413924818e-04f, -5.324276437e-04f, -2.029511283e-03f, +5.019029099e-03f, +2.633211707e-03f, -2.297724601e-02f, -2.063932435e-02f, +1.868036788e-02f, +2.431312252e-02f, -1.478252020e-03f, -5.524357980e-03f, +1.866120323e-03f, +7.039312026e-04f, -4.705072223e-04f, +0.000000000e+00f, - /* 16, 9 */ +0.000000000e+00f, +4.065510896e-04f, -3.696399185e-04f, -2.146686747e-03f, +4.480127768e-03f, +3.662991573e-03f, -2.151458926e-02f, -2.241259678e-02f, +1.655201127e-02f, +2.550387540e-02f, -2.040926394e-04f, -5.985469320e-03f, +1.655232286e-03f, +8.816626027e-04f, -4.924395299e-04f, +0.000000000e+00f, - /* 16,10 */ +0.000000000e+00f, +3.674140144e-04f, -2.176775461e-04f, -2.219584858e-03f, +3.918061651e-03f, +4.563434465e-03f, -1.994437434e-02f, -2.398607480e-02f, +1.427253312e-02f, +2.653229393e-02f, +1.181467029e-03f, -6.391628670e-03f, +1.396293958e-03f, +1.062772468e-03f, -5.057402285e-04f, +0.000000000e+00f, - /* 16,11 */ +0.000000000e+00f, +3.253590588e-04f, -7.826276448e-05f, -2.250722132e-03f, +3.342863857e-03f, +5.332184360e-03f, -1.828644204e-02f, -2.534797081e-02f, +1.186200034e-02f, +2.738254409e-02f, +2.668838337e-03f, -6.732169339e-03f, +1.089544232e-03f, +1.244075649e-03f, -5.090007623e-04f, +0.000000000e+00f, - /* 16,12 */ +0.000000000e+00f, +2.816859426e-04f, +4.727037370e-05f, -2.243110553e-03f, +2.764068406e-03f, +5.968640123e-03f, -1.656098957e-02f, -2.648893755e-02f, +9.342037235e-03f, +2.804039906e-02f, +4.246700138e-03f, -6.996656391e-03f, +7.360682089e-04f, +1.422085430e-03f, -5.008892512e-04f, +4.855802427e-04f, - /* 16,13 */ +0.000000000e+00f, +2.375950982e-04f, +1.579695096e-04f, -2.200171639e-03f, +2.190599691e-03f, +6.473886365e-03f, -1.478830973e-02f, -2.740215275e-02f, +6.735572940e-03f, +2.849345261e-02f, +5.902082228e-03f, -7.175055211e-03f, +3.378401438e-04f, +1.593056257e-03f, -4.801879450e-04f, -4.409159553e-05f, - /* 16,14 */ +0.000000000e+00f, +1.941703587e-04f, +2.532507071e-04f, -2.125649126e-03f, +1.630677017e-03f, +6.850603202e-03f, -1.298853535e-02f, -2.808336987e-02f, +4.066570788e-03f, +2.873131200e-02f, +7.620475041e-03f, -7.257902118e-03f, -1.022461377e-04f, +1.753034729e-03f, -4.458313625e-04f, -7.672972562e-05f, - /* 16,15 */ +0.000000000e+00f, +1.523656204e-04f, +3.328791130e-04f, -2.023521864e-03f, +1.091735034e-03f, +7.102956997e-03f, -1.118139232e-02f, -2.853093461e-02f, +1.359743295e-03f, +2.874576735e-02f, +9.385964725e-03f, -7.236474393e-03f, -5.803605804e-04f, +1.897918409e-03f, -3.969443331e-04f, -1.129954761e-04f, - /* 12, 0 */ -1.111572639e-03f, -1.388266820e-03f, +7.900037037e-03f, -6.320860170e-03f, -3.276049121e-02f, -1.657033928e-03f, +3.280306521e-02f, +8.402419704e-03f, -8.147060845e-03f, +9.779320530e-04f, +1.332890330e-03f, -5.705687800e-04f, - /* 12, 1 */ -8.925738220e-04f, -1.737094155e-03f, +7.544883174e-03f, -4.325531156e-03f, -3.242830266e-02f, -4.953502968e-03f, +3.254754550e-02f, +1.054842384e-02f, -8.272560314e-03f, +5.083818205e-04f, +1.551863117e-03f, -5.805594968e-04f, - /* 12, 2 */ -6.800837112e-04f, -2.023419107e-03f, +7.095763901e-03f, -2.436087367e-03f, -3.181840805e-02f, -8.197416535e-03f, +3.198906769e-02f, +1.273520115e-02f, -8.264181830e-03f, -1.673924732e-05f, +1.763414955e-03f, -5.764989135e-04f, - /* 12, 3 */ -4.777710304e-04f, -2.247467778e-03f, +6.567344318e-03f, -6.698479312e-04f, -3.094591156e-02f, -1.135453705e-02f, +3.112651563e-02f, +1.493747887e-02f, -8.110878239e-03f, -5.924008684e-04f, +1.962133432e-03f, -5.566237283e-04f, - /* 12, 4 */ -2.887507612e-04f, -2.410593616e-03f, +5.974525144e-03f, +9.583644900e-04f, -2.982883555e-02f, -1.439181272e-02f, +2.996260004e-02f, +1.712870168e-02f, -7.803165138e-03f, -1.212178752e-03f, +2.142359210e-03f, -5.193755958e-04f, - /* 12, 5 */ -1.155657138e-04f, -2.515168800e-03f, +5.332187403e-03f, +2.436339775e-03f, -2.848780461e-02f, -1.727782533e-02f, +2.850388027e-02f, +1.928138098e-02f, -7.333362623e-03f, -1.868272468e-03f, +2.298288008e-03f, -4.634616378e-04f, - /* 12, 6 */ +3.981829456e-05f, -2.564463655e-03f, +4.654950666e-03f, +3.754551105e-03f, -2.694569661e-02f, -1.998321224e-02f, +2.676072816e-02f, +2.136746929e-02f, -6.695817566e-03f, -2.551550686e-03f, +2.424083786e-03f, -3.879138191e-04f, - /* 12, 7 */ +1.760045094e-04f, -2.562517141e-03f, +3.956948521e-03f, +4.906180706e-03f, -2.522726725e-02f, -2.248105576e-02f, +2.474723407e-02f, +2.335875442e-02f, -5.887101657e-03f, -3.251624436e-03f, +2.514001460e-03f, -2.921456350e-04f, - /* 12, 8 */ +2.921456350e-04f, -2.514001460e-03f, +3.251624436e-03f, +5.887101657e-03f, -2.335875442e-02f, -2.474723407e-02f, +2.248105576e-02f, +2.522726725e-02f, -4.906180706e-03f, -3.956948521e-03f, +2.562517141e-03f, -1.760045094e-04f, - /* 12, 9 */ +3.879138191e-04f, -2.424083786e-03f, +2.551550686e-03f, +6.695817566e-03f, -2.136746929e-02f, -2.676072816e-02f, +1.998321224e-02f, +2.694569661e-02f, -3.754551105e-03f, -4.654950666e-03f, +2.564463655e-03f, -3.981829456e-05f, - /* 12,10 */ +4.634616378e-04f, -2.298288008e-03f, +1.868272468e-03f, +7.333362623e-03f, -1.928138098e-02f, -2.850388027e-02f, +1.727782533e-02f, +2.848780461e-02f, -2.436339775e-03f, -5.332187403e-03f, +2.515168800e-03f, +1.155657138e-04f, - /* 12,11 */ +5.193755958e-04f, -2.142359210e-03f, +1.212178752e-03f, +7.803165138e-03f, -1.712870168e-02f, -2.996260004e-02f, +1.439181272e-02f, +2.982883555e-02f, -9.583644900e-04f, -5.974525144e-03f, +2.410593616e-03f, +2.887507612e-04f, - /* 12,12 */ +5.566237283e-04f, -1.962133432e-03f, +5.924008684e-04f, +8.110878239e-03f, -1.493747887e-02f, -3.112651563e-02f, +1.135453705e-02f, +3.094591156e-02f, +6.698479312e-04f, -6.567344318e-03f, +2.247467778e-03f, +4.777710304e-04f, - /* 12,13 */ +5.764989135e-04f, -1.763414955e-03f, +1.673924732e-05f, +8.264181830e-03f, -1.273520115e-02f, -3.198906769e-02f, +8.197416535e-03f, +3.181840805e-02f, +2.436087367e-03f, -7.095763901e-03f, +2.023419107e-03f, +6.800837112e-04f, - /* 12,14 */ +5.805594968e-04f, -1.551863117e-03f, -5.083818205e-04f, +8.272560314e-03f, -1.054842384e-02f, -3.254754550e-02f, +4.953502968e-03f, +3.242830266e-02f, +4.325531156e-03f, -7.544883174e-03f, +1.737094155e-03f, +8.925738220e-04f, - /* 12,15 */ +5.705687800e-04f, -1.332890330e-03f, -9.779320530e-04f, +8.147060845e-03f, -8.402419704e-03f, -3.280306521e-02f, +1.657033928e-03f, +3.276049121e-02f, +6.320860170e-03f, -7.900037037e-03f, +1.388266820e-03f, +1.111572639e-03f, - /* 12, 0 */ -1.054803383e-04f, -2.744858958e-03f, +7.370914553e-03f, -2.604494739e-03f, -3.666896703e-02f, -1.994735221e-03f, +3.707596726e-02f, +4.873177855e-03f, -8.012348726e-03f, +2.554514858e-03f, +3.117958677e-04f, -3.625540242e-04f, - /* 12, 1 */ +7.775923585e-05f, -2.860662969e-03f, +6.648820026e-03f, -4.950753709e-04f, -3.590728113e-02f, -5.960234251e-03f, +3.711196787e-02f, +7.277671607e-03f, -8.552819277e-03f, +2.286292242e-03f, +5.385913036e-04f, -4.265219564e-04f, - /* 12, 2 */ +2.361482435e-04f, -2.906545541e-03f, +5.866306097e-03f, +1.435258618e-03f, -3.481183398e-02f, -9.854190425e-03f, +3.676562700e-02f, +9.791136525e-03f, -8.972352970e-03f, +1.938320040e-03f, +7.824350015e-04f, -4.875429386e-04f, - /* 12, 3 */ +3.687004846e-04f, -2.888204359e-03f, +5.043181884e-03f, +3.170488652e-03f, -3.340772759e-02f, -1.363013975e-02f, +3.603085731e-02f, +1.238366322e-02f, -9.251714734e-03f, +1.510362297e-03f, +1.039066351e-03f, -5.431259501e-04f, - /* 12, 4 */ +4.751685216e-04f, -2.812206203e-03f, +4.198484259e-03f, +4.698496481e-03f, -3.172374637e-02f, -1.724344185e-02f, +3.490702283e-02f, +1.502265637e-02f, -9.372823891e-03f, +1.003961424e-03f, +1.303424694e-03f, -5.906251216e-04f, - /* 12, 5 */ +5.559799195e-04f, -2.685773447e-03f, +3.350171906e-03f, +6.011087921e-03f, -2.979181001e-02f, -2.065196332e-02f, +3.339904530e-02f, +1.767328103e-02f, -9.319170237e-03f, +4.225520445e-04f, +1.569701578e-03f, -6.273034189e-04f, - /* 12, 6 */ +6.121620582e-04f, -2.516571985e-03f, +2.514858275e-03f, +7.103945228e-03f, -2.764638515e-02f, -2.381671619e-02f, +3.151741694e-02f, +2.029896461e-02f, -9.076221424e-03f, -2.284590483e-04f, +1.831416829e-03f, -6.504054889e-04f, - /* 12, 7 */ +6.452583046e-04f, -2.312505227e-03f, +1.707586806e-03f, +7.976511649e-03f, -2.532386758e-02f, -2.670244010e-02f, +2.927811806e-02f, +2.286194672e-02f, -8.631812899e-03f, -9.416507761e-04f, +2.081518390e-03f, -6.572383529e-04f, - /* 12, 8 */ +6.572383529e-04f, -2.081518390e-03f, +9.416507761e-04f, +8.631812899e-03f, -2.286194672e-02f, -2.927811806e-02f, +2.670244010e-02f, +2.532386758e-02f, -7.976511649e-03f, -1.707586806e-03f, +2.312505227e-03f, -6.452583046e-04f, - /* 12, 9 */ +6.504054889e-04f, -1.831416829e-03f, +2.284590483e-04f, +9.076221424e-03f, -2.029896461e-02f, -3.151741694e-02f, +2.381671619e-02f, +2.764638515e-02f, -7.103945228e-03f, -2.514858275e-03f, +2.516571985e-03f, -6.121620582e-04f, - /* 12,10 */ +6.273034189e-04f, -1.569701578e-03f, -4.225520445e-04f, +9.319170237e-03f, -1.767328103e-02f, -3.339904530e-02f, +2.065196332e-02f, +2.979181001e-02f, -6.011087921e-03f, -3.350171906e-03f, +2.685773447e-03f, -5.559799195e-04f, - /* 12,11 */ +5.906251216e-04f, -1.303424694e-03f, -1.003961424e-03f, +9.372823891e-03f, -1.502265637e-02f, -3.490702283e-02f, +1.724344185e-02f, +3.172374637e-02f, -4.698496481e-03f, -4.198484259e-03f, +2.812206203e-03f, -4.751685216e-04f, - /* 12,12 */ +5.431259501e-04f, -1.039066351e-03f, -1.510362297e-03f, +9.251714734e-03f, -1.238366322e-02f, -3.603085731e-02f, +1.363013975e-02f, +3.340772759e-02f, -3.170488652e-03f, -5.043181884e-03f, +2.888204359e-03f, -3.687004846e-04f, - /* 12,13 */ +4.875429386e-04f, -7.824350015e-04f, -1.938320040e-03f, +8.972352970e-03f, -9.791136525e-03f, -3.676562700e-02f, +9.854190425e-03f, +3.481183398e-02f, -1.435258618e-03f, -5.866306097e-03f, +2.906545541e-03f, -2.361482435e-04f, - /* 12,14 */ +4.265219564e-04f, -5.385913036e-04f, -2.286292242e-03f, +8.552819277e-03f, -7.277671607e-03f, -3.711196787e-02f, +5.960234251e-03f, +3.590728113e-02f, +4.950753709e-04f, -6.648820026e-03f, +2.860662969e-03f, -7.775923585e-05f, - /* 12,15 */ +3.625540242e-04f, -3.117958677e-04f, -2.554514858e-03f, +8.012348726e-03f, -4.873177855e-03f, -3.707596726e-02f, +1.994735221e-03f, +3.666896703e-02f, +2.604494739e-03f, -7.370914553e-03f, +2.744858958e-03f, +1.054803383e-04f, - /* 12, 0 */ +6.110448771e-04f, -3.173989705e-03f, +5.751223243e-03f, +1.507555794e-03f, -4.035343888e-02f, -2.375409442e-03f, +4.124383193e-02f, +8.091337269e-04f, -6.726716888e-03f, +3.253952459e-03f, -5.087325269e-04f, -4.127854608e-05f, - /* 12, 1 */ +6.820041984e-04f, -3.029137857e-03f, +4.746351538e-03f, +3.578915017e-03f, -3.904147991e-02f, -7.094160720e-03f, +4.168490752e-02f, +3.349306133e-03f, -7.647219355e-03f, +3.259488816e-03f, -3.738470149e-04f, -9.536054020e-05f, - /* 12, 2 */ +7.235832870e-04f, -2.829602454e-03f, +3.736224000e-03f, +5.388621830e-03f, -3.734163661e-02f, -1.171726725e-02f, +4.165549067e-02f, +6.085743956e-03f, -8.486093037e-03f, +3.182049180e-03f, -2.060445111e-04f, -1.573545891e-04f, - /* 12, 3 */ +7.383739029e-04f, -2.585946508e-03f, +2.743066911e-03f, +6.925917423e-03f, -3.529277498e-02f, -1.618281485e-02f, +4.114151479e-02f, +8.986133221e-03f, -9.216195947e-03f, +3.014391908e-03f, -5.966328360e-06f, -2.260166200e-04f, - /* 12, 4 */ +7.294476853e-04f, -2.308795686e-03f, +1.786872733e-03f, +8.185530694e-03f, -3.293811768e-02f, -2.043162352e-02f, +4.013642610e-02f, +1.201345370e-02f, -9.810446156e-03f, +2.750895834e-03f, +2.246717082e-04f, -2.996559917e-04f, - /* 12, 5 */ +7.002161546e-04f, -2.008565767e-03f, +8.851333656e-04f, +9.167495079e-03f, -3.032435275e-02f, -2.440826356e-02f, +3.864144993e-02f, +1.512648157e-02f, -1.024241966e-02f, +2.387856219e-03f, +4.830138128e-04f, -3.761418846e-04f, - /* 12, 6 */ +6.542939604e-04f, -1.695217727e-03f, +5.264660367e-05f, +9.876866054e-03f, -2.750069849e-02f, -2.806199617e-02f, +3.666571148e-02f, +1.828039745e-02f, -1.048696943e-02f, +1.923755148e-03f, +7.650267923e-04f, -4.529261561e-04f, - /* 12, 7 */ +5.953691186e-04f, -1.378044726e-03f, -6.986040124e-04f, +1.032334944e-02f, -2.451794467e-02f, -3.134761990e-02f, +3.422620641e-02f, +2.142749023e-02f, -1.052085229e-02f, +1.359497506e-03f, +1.065494162e-03f, -5.270834853e-04f, - /* 12, 8 */ +5.270834853e-04f, -1.065494162e-03f, -1.359497506e-03f, +1.052085229e-02f, -2.142749023e-02f, -3.422620641e-02f, +3.134761990e-02f, +2.451794467e-02f, -1.032334944e-02f, +6.986040124e-04f, +1.378044726e-03f, -5.953691186e-04f, - /* 12, 9 */ +4.529261561e-04f, -7.650267923e-04f, -1.923755148e-03f, +1.048696943e-02f, -1.828039745e-02f, -3.666571148e-02f, +2.806199617e-02f, +2.750069849e-02f, -9.876866054e-03f, -5.264660367e-05f, +1.695217727e-03f, -6.542939604e-04f, - /* 12,10 */ +3.761418846e-04f, -4.830138128e-04f, -2.387856219e-03f, +1.024241966e-02f, -1.512648157e-02f, -3.864144993e-02f, +2.440826356e-02f, +3.032435275e-02f, -9.167495079e-03f, -8.851333656e-04f, +2.008565767e-03f, -7.002161546e-04f, - /* 12,11 */ +2.996559917e-04f, -2.246717082e-04f, -2.750895834e-03f, +9.810446156e-03f, -1.201345370e-02f, -4.013642610e-02f, +2.043162352e-02f, +3.293811768e-02f, -8.185530694e-03f, -1.786872733e-03f, +2.308795686e-03f, -7.294476853e-04f, - /* 12,12 */ +2.260166200e-04f, +5.966328360e-06f, -3.014391908e-03f, +9.216195947e-03f, -8.986133221e-03f, -4.114151479e-02f, +1.618281485e-02f, +3.529277498e-02f, -6.925917423e-03f, -2.743066911e-03f, +2.585946508e-03f, -7.383739029e-04f, - /* 12,13 */ +1.573545891e-04f, +2.060445111e-04f, -3.182049180e-03f, +8.486093037e-03f, -6.085743956e-03f, -4.165549067e-02f, +1.171726725e-02f, +3.734163661e-02f, -5.388621830e-03f, -3.736224000e-03f, +2.829602454e-03f, -7.235832870e-04f, - /* 12,14 */ +9.536054020e-05f, +3.738470149e-04f, -3.259488816e-03f, +7.647219355e-03f, -3.349306133e-03f, -4.168490752e-02f, +7.094160720e-03f, +3.904147991e-02f, -3.578915017e-03f, -4.746351538e-03f, +3.029137857e-03f, -6.820041984e-04f, - /* 12,15 */ +4.127854608e-05f, +5.087325269e-04f, -3.253952459e-03f, +6.726716888e-03f, -8.091337269e-04f, -4.124383193e-02f, +2.375409442e-03f, +4.035343888e-02f, -1.507555794e-03f, -5.751223243e-03f, +3.173989705e-03f, -6.110448771e-04f, - - /* 24, 0 */ -8.820438069e-05f, -1.519461079e-04f, -2.301651496e-04f, -3.149320871e-04f, -3.945939739e-04f, -4.554410135e-04f, -4.841532882e-04f, -4.705408991e-04f, -4.099602091e-04f, -3.048100066e-04f, -1.646897470e-04f, -5.099007530e-06f, +1.551006323e-04f, +2.969416536e-04f, +4.046294158e-04f, +4.681429482e-04f, +4.846228261e-04f, +4.583040637e-04f, +3.990939388e-04f, +3.201968846e-04f, +2.353759082e-04f, +1.564712483e-04f, +9.167483068e-05f, +4.482688286e-05f, - /* 24, 1 */ -8.480575132e-05f, -1.474789784e-04f, -2.249812225e-04f, -3.096480504e-04f, -3.900204007e-04f, -4.524514078e-04f, -4.835165803e-04f, -4.727530367e-04f, -4.151145025e-04f, -3.125397891e-04f, -1.742016828e-04f, -1.529460870e-05f, +1.454387449e-04f, +2.889379628e-04f, +3.991236794e-04f, +4.655589110e-04f, +4.849233000e-04f, +4.610375470e-04f, +4.035168325e-04f, +3.254391996e-04f, +2.406110065e-04f, +1.610529558e-04f, +9.521673594e-05f, +4.721513201e-05f, - /* 24, 2 */ -8.147924507e-05f, -1.430712350e-04f, -2.198265592e-04f, -3.043479843e-04f, -3.853766873e-04f, -4.493383067e-04f, -4.827146831e-04f, -4.747797448e-04f, -4.200908527e-04f, -3.201278616e-04f, -1.836320864e-04f, -2.548296987e-05f, +1.357085413e-04f, +2.808022583e-04f, +3.934446700e-04f, +4.627886263e-04f, +4.850529052e-04f, +4.636385032e-04f, +4.078592000e-04f, +3.306557574e-04f, +2.458678944e-04f, +1.656897170e-04f, +9.882966748e-05f, +4.967415993e-05f, - /* 24, 3 */ -7.822510242e-05f, -1.387241832e-04f, -2.147035314e-04f, -2.990350629e-04f, -3.806663042e-04f, -4.461048161e-04f, -4.817496625e-04f, -4.766215175e-04f, -4.248879309e-04f, -3.275711800e-04f, -1.929766610e-04f, -3.565926997e-05f, +1.259145254e-04f, +2.725379532e-04f, +3.875941701e-04f, +4.598320457e-04f, +4.850099279e-04f, +4.661040260e-04f, +4.121175966e-04f, +3.358432542e-04f, +2.511439643e-04f, +1.703799499e-04f, +1.025131319e-04f, +5.220438912e-05f, - /* 24, 4 */ -7.504350274e-05f, -1.344390595e-04f, -2.096144489e-04f, -2.937124231e-04f, -3.758927218e-04f, -4.427540852e-04f, -4.806236671e-04f, -4.782789577e-04f, -4.295045226e-04f, -3.348667971e-04f, -2.022311686e-04f, -4.581869630e-05f, +1.160612449e-04f, +2.641485480e-04f, +3.815740737e-04f, +4.566892339e-04f, +4.847927474e-04f, +4.684312656e-04f, +4.162885910e-04f, +3.409983591e-04f, +2.564365532e-04f, +1.751220037e-04f, +1.062665706e-04f, +5.480619333e-05f, - /* 24, 5 */ -7.193456522e-05f, -1.302170312e-04f, -2.045615590e-04f, -2.883831622e-04f, -3.710594077e-04f, -4.392893036e-04f, -4.793389263e-04f, -4.797527765e-04f, -4.339395286e-04f, -3.420118645e-04f, -2.113914331e-04f, -5.595644787e-05f, +1.061532886e-04f, +2.556376279e-04f, +3.753863858e-04f, +4.533603695e-04f, +4.843998374e-04f, +4.706174312e-04f, +4.203687678e-04f, +3.461177167e-04f, +2.617429433e-04f, +1.799141593e-04f, +1.100893595e-04f, +5.747989630e-05f, - /* 24, 6 */ -6.889834987e-05f, -1.260591965e-04f, -1.995470454e-04f, -2.830503358e-04f, -3.661698243e-04f, -4.357136989e-04f, -4.778977479e-04f, -4.810437916e-04f, -4.381919648e-04f, -3.490036345e-04f, -2.204533432e-04f, -6.606773875e-05f, +9.619528314e-05f, +2.470088608e-04f, +3.690332209e-04f, +4.498457452e-04f, +4.838297683e-04f, +4.726597937e-04f, +4.243547301e-04f, +3.511979487e-04f, +2.670603639e-04f, +1.847546294e-04f, +1.139808078e-04f, +6.022577049e-05f, - /* 24, 7 */ -6.593485851e-05f, -1.219665852e-04f, -1.945730275e-04f, -2.777169567e-04f, -3.612274261e-04f, -4.320305335e-04f, -4.763025159e-04f, -4.821529264e-04f, -4.422609626e-04f, -3.558394612e-04f, -2.294128549e-04f, -7.614780136e-05f, +8.619188981e-05f, +2.382659945e-04f, +3.625168024e-04f, +4.461457687e-04f, +4.830812085e-04f, +4.745556880e-04f, +4.282431024e-04f, +3.562356572e-04f, +2.723859925e-04f, +1.896415594e-04f, +1.179401580e-04f, +6.304403582e-05f, - /* 24, 8 */ -6.304403582e-05f, -1.179401580e-04f, -1.896415594e-04f, -2.723859925e-04f, -3.562356572e-04f, -4.282431024e-04f, -4.745556880e-04f, -4.830812085e-04f, -4.461457687e-04f, -3.625168024e-04f, -2.382659945e-04f, -8.619188981e-05f, +7.614780136e-05f, +2.294128549e-04f, +3.558394612e-04f, +4.422609626e-04f, +4.821529264e-04f, +4.763025159e-04f, +4.320305335e-04f, +3.612274261e-04f, +2.777169567e-04f, +1.945730275e-04f, +1.219665852e-04f, +6.593485851e-05f, - /* 24, 9 */ -6.022577049e-05f, -1.139808078e-04f, -1.847546294e-04f, -2.670603639e-04f, -3.511979487e-04f, -4.243547301e-04f, -4.726597937e-04f, -4.838297683e-04f, -4.498457452e-04f, -3.690332209e-04f, -2.470088608e-04f, -9.619528314e-05f, +6.606773875e-05f, +2.204533432e-04f, +3.490036345e-04f, +4.381919648e-04f, +4.810437916e-04f, +4.778977479e-04f, +4.357136989e-04f, +3.661698243e-04f, +2.830503358e-04f, +1.995470454e-04f, +1.260591965e-04f, +6.889834987e-05f, - /* 24,10 */ -5.747989630e-05f, -1.100893595e-04f, -1.799141593e-04f, -2.617429433e-04f, -3.461177167e-04f, -4.203687678e-04f, -4.706174312e-04f, -4.843998374e-04f, -4.533603695e-04f, -3.753863858e-04f, -2.556376279e-04f, -1.061532886e-04f, +5.595644787e-05f, +2.113914331e-04f, +3.420118645e-04f, +4.339395286e-04f, +4.797527765e-04f, +4.793389263e-04f, +4.392893036e-04f, +3.710594077e-04f, +2.883831622e-04f, +2.045615590e-04f, +1.302170312e-04f, +7.193456522e-05f, - /* 24,11 */ -5.480619333e-05f, -1.062665706e-04f, -1.751220037e-04f, -2.564365532e-04f, -3.409983591e-04f, -4.162885910e-04f, -4.684312656e-04f, -4.847927474e-04f, -4.566892339e-04f, -3.815740737e-04f, -2.641485480e-04f, -1.160612449e-04f, +4.581869630e-05f, +2.022311686e-04f, +3.348667971e-04f, +4.295045226e-04f, +4.782789577e-04f, +4.806236671e-04f, +4.427540852e-04f, +3.758927218e-04f, +2.937124231e-04f, +2.096144489e-04f, +1.344390595e-04f, +7.504350274e-05f, - /* 24,12 */ -5.220438912e-05f, -1.025131319e-04f, -1.703799499e-04f, -2.511439643e-04f, -3.358432542e-04f, -4.121175966e-04f, -4.661040260e-04f, -4.850099279e-04f, -4.598320457e-04f, -3.875941701e-04f, -2.725379532e-04f, -1.259145254e-04f, +3.565926997e-05f, +1.929766610e-04f, +3.275711800e-04f, +4.248879309e-04f, +4.766215175e-04f, +4.817496625e-04f, +4.461048161e-04f, +3.806663042e-04f, +2.990350629e-04f, +2.147035314e-04f, +1.387241832e-04f, +7.822510242e-05f, - /* 24,13 */ -4.967415993e-05f, -9.882966748e-05f, -1.656897170e-04f, -2.458678944e-04f, -3.306557574e-04f, -4.078592000e-04f, -4.636385032e-04f, -4.850529052e-04f, -4.627886263e-04f, -3.934446700e-04f, -2.808022583e-04f, -1.357085413e-04f, +2.548296987e-05f, +1.836320864e-04f, +3.201278616e-04f, +4.200908527e-04f, +4.747797448e-04f, +4.827146831e-04f, +4.493383067e-04f, +3.853766873e-04f, +3.043479843e-04f, +2.198265592e-04f, +1.430712350e-04f, +8.147924507e-05f, - /* 24,14 */ -4.721513201e-05f, -9.521673594e-05f, -1.610529558e-04f, -2.406110065e-04f, -3.254391996e-04f, -4.035168325e-04f, -4.610375470e-04f, -4.849233000e-04f, -4.655589110e-04f, -3.991236794e-04f, -2.889379628e-04f, -1.454387449e-04f, +1.529460870e-05f, +1.742016828e-04f, +3.125397891e-04f, +4.151145025e-04f, +4.727530367e-04f, +4.835165803e-04f, +4.524514078e-04f, +3.900204007e-04f, +3.096480504e-04f, +2.249812225e-04f, +1.474789784e-04f, +8.480575132e-05f, - /* 24,15 */ -4.482688286e-05f, -9.167483068e-05f, -1.564712483e-04f, -2.353759082e-04f, -3.201968846e-04f, -3.990939388e-04f, -4.583040637e-04f, -4.846228261e-04f, -4.681429482e-04f, -4.046294158e-04f, -2.969416536e-04f, -1.551006323e-04f, +5.099007530e-06f, +1.646897470e-04f, +3.048100066e-04f, +4.099602091e-04f, +4.705408991e-04f, +4.841532882e-04f, +4.554410135e-04f, +3.945939739e-04f, +3.149320871e-04f, +2.301651496e-04f, +1.519461079e-04f, +8.820438069e-05f, - /* 24, 0 */ +1.254177052e-04f, +1.432187562e-04f, +1.041598752e-04f, -1.135750248e-05f, -2.010663923e-04f, -4.345091125e-04f, -6.566280172e-04f, -8.018070806e-04f, -8.145094672e-04f, -6.693628869e-04f, -3.829411831e-04f, -1.208738944e-05f, +3.614691013e-04f, +6.551938988e-04f, +8.101126455e-04f, +8.069330100e-04f, +6.686285441e-04f, +4.493898115e-04f, +2.148422063e-04f, +2.121126661e-05f, -9.928779545e-05f, -1.427235715e-04f, -1.276505127e-04f, -8.319130160e-05f, - /* 24, 1 */ +1.230784715e-04f, +1.434886692e-04f, +1.087259386e-04f, -1.803144714e-06f, -1.874698746e-04f, -4.195879132e-04f, -6.443236569e-04f, -7.961535056e-04f, -8.182754723e-04f, -6.829663304e-04f, -4.040749814e-04f, -3.625133679e-05f, +3.396771574e-04f, +6.404692089e-04f, +8.050839212e-04f, +8.115205881e-04f, +6.803091718e-04f, +4.642140510e-04f, +2.287861157e-04f, +3.136033560e-05f, -9.410712043e-05f, -1.419963918e-04f, -1.297693532e-04f, -8.627587811e-05f, - /* 24, 2 */ +1.206403004e-04f, +1.435401825e-04f, +1.129889134e-04f, +7.448162127e-06f, -1.740634498e-04f, -4.046419937e-04f, -6.317316839e-04f, -7.899834729e-04f, -8.214124236e-04f, -6.959950382e-04f, -4.248524782e-04f, -6.038280262e-05f, +3.175841545e-04f, +6.251993025e-04f, +7.994228899e-04f, +8.155596091e-04f, +6.916540113e-04f, +4.789657110e-04f, +2.428865252e-04f, +4.180014906e-05f, -8.861563067e-05f, -1.410306561e-04f, -1.317666448e-04f, -8.934972901e-05f, - /* 24, 3 */ +1.181106179e-04f, +1.433803035e-04f, +1.169520657e-04f, +1.639322797e-05f, -1.608575022e-04f, -3.896869361e-04f, -6.188684520e-04f, -7.833086355e-04f, -8.239227539e-04f, -7.084404793e-04f, -4.452560799e-04f, -8.446017611e-05f, +2.952092559e-04f, +6.093952965e-04f, +7.931298338e-04f, +8.190403838e-04f, +7.026473724e-04f, +4.936285297e-04f, +2.571314547e-04f, +5.252568657e-05f, -8.281147599e-05f, -1.398199793e-04f, -1.336347757e-04f, -9.240689021e-05f, - /* 24, 4 */ +1.154967766e-04f, +1.430161614e-04f, +1.206189886e-04f, +2.502931407e-05f, -1.478619956e-04f, -3.747381071e-04f, -6.057504254e-04f, -7.761410928e-04f, -8.258095592e-04f, -7.202947906e-04f, -4.652686374e-04f, -1.084619116e-04f, +2.725719623e-04f, +5.930689291e-04f, +7.862057246e-04f, +8.219537553e-04f, +7.132737861e-04f, +5.081861235e-04f, +2.715085502e-04f, +6.353146713e-05f, -7.669318508e-05f, -1.383581653e-04f, -1.353661159e-04f, -9.544123411e-05f, - /* 24, 5 */ +1.128060463e-04f, +1.424549941e-04f, +1.239935912e-04f, +3.335412922e-05f, -1.350864661e-04f, -3.598106411e-04f, -5.923941571e-04f, -7.684933716e-04f, -8.270765907e-04f, -7.315507834e-04f, -4.848734661e-04f, -1.323665545e-04f, +2.496920884e-04f, +5.762325468e-04f, +7.786522269e-04f, +8.242911148e-04f, +7.235180256e-04f, +5.226220062e-04f, +2.860050947e-04f, +7.481154929e-05f, -7.025967465e-05f, -1.366392205e-04f, -1.369530289e-04f, -9.844647580e-05f, - /* 24, 6 */ +1.100456035e-04f, +1.417041346e-04f, +1.270800866e-04f, +4.136582536e-05f, -1.225400157e-04f, -3.449194225e-04f, -5.788162671e-04f, -7.603784078e-04f, -8.277282458e-04f, -7.422019493e-04f, -5.040543645e-04f, -1.561527673e-04f, +2.265897402e-04f, +5.588990922e-04f, +7.704716994e-04f, +8.260444163e-04f, +7.333651287e-04f, +5.369196097e-04f, +3.006080208e-04f, +8.635953200e-05f, -6.351025813e-05f, -1.346573670e-04f, -1.383878839e-04f, -1.014161798e-04f, - /* 24, 7 */ +1.072225228e-04f, +1.407709979e-04f, +1.298829797e-04f, +4.906299265e-05f, -1.102313067e-04f, -3.300790706e-04f, -5.650334202e-04f, -7.518095256e-04f, -8.277695590e-04f, -7.522424649e-04f, -5.227956327e-04f, -1.797993550e-04f, +2.032852905e-04f, +5.410820901e-04f, +7.616671958e-04f, +8.272061905e-04f, +7.428004186e-04f, +5.510623045e-04f, +3.153039229e-04f, +9.816855611e-05f, -5.644465382e-05f, -1.324070557e-04f, -1.396630677e-04f, -1.043437672e-04f, - /* 24, 8 */ +1.043437672e-04f, +1.396630677e-04f, +1.324070557e-04f, +5.644465382e-05f, -9.816855611e-05f, -3.153039229e-04f, -5.510623045e-04f, -7.428004186e-04f, -8.272061905e-04f, -7.616671958e-04f, -5.410820901e-04f, -2.032852905e-04f, +1.797993550e-04f, +5.227956327e-04f, +7.522424649e-04f, +8.277695590e-04f, +7.518095256e-04f, +5.650334202e-04f, +3.300790706e-04f, +1.102313067e-04f, -4.906299265e-05f, -1.298829797e-04f, -1.407709979e-04f, -1.072225228e-04f, - /* 24, 9 */ +1.014161798e-04f, +1.383878839e-04f, +1.346573670e-04f, +6.351025813e-05f, -8.635953200e-05f, -3.006080208e-04f, -5.369196097e-04f, -7.333651287e-04f, -8.260444163e-04f, -7.704716994e-04f, -5.588990922e-04f, -2.265897402e-04f, +1.561527673e-04f, +5.040543645e-04f, +7.422019493e-04f, +8.277282458e-04f, +7.603784078e-04f, +5.788162671e-04f, +3.449194225e-04f, +1.225400157e-04f, -4.136582536e-05f, -1.270800866e-04f, -1.417041346e-04f, -1.100456035e-04f, - /* 24,10 */ +9.844647580e-05f, +1.369530289e-04f, +1.366392205e-04f, +7.025967465e-05f, -7.481154929e-05f, -2.860050947e-04f, -5.226220062e-04f, -7.235180256e-04f, -8.242911148e-04f, -7.786522269e-04f, -5.762325468e-04f, -2.496920884e-04f, +1.323665545e-04f, +4.848734661e-04f, +7.315507834e-04f, +8.270765907e-04f, +7.684933716e-04f, +5.923941571e-04f, +3.598106411e-04f, +1.350864661e-04f, -3.335412922e-05f, -1.239935912e-04f, -1.424549941e-04f, -1.128060463e-04f, - /* 24,11 */ +9.544123411e-05f, +1.353661159e-04f, +1.383581653e-04f, +7.669318508e-05f, -6.353146713e-05f, -2.715085502e-04f, -5.081861235e-04f, -7.132737861e-04f, -8.219537553e-04f, -7.862057246e-04f, -5.930689291e-04f, -2.725719623e-04f, +1.084619116e-04f, +4.652686374e-04f, +7.202947906e-04f, +8.258095592e-04f, +7.761410928e-04f, +6.057504254e-04f, +3.747381071e-04f, +1.478619956e-04f, -2.502931407e-05f, -1.206189886e-04f, -1.430161614e-04f, -1.154967766e-04f, - /* 24,12 */ +9.240689021e-05f, +1.336347757e-04f, +1.398199793e-04f, +8.281147599e-05f, -5.252568657e-05f, -2.571314547e-04f, -4.936285297e-04f, -7.026473724e-04f, -8.190403838e-04f, -7.931298338e-04f, -6.093952965e-04f, -2.952092559e-04f, +8.446017611e-05f, +4.452560799e-04f, +7.084404793e-04f, +8.239227539e-04f, +7.833086355e-04f, +6.188684520e-04f, +3.896869361e-04f, +1.608575022e-04f, -1.639322797e-05f, -1.169520657e-04f, -1.433803035e-04f, -1.181106179e-04f, - /* 24,13 */ +8.934972901e-05f, +1.317666448e-04f, +1.410306561e-04f, +8.861563067e-05f, -4.180014906e-05f, -2.428865252e-04f, -4.789657110e-04f, -6.916540113e-04f, -8.155596091e-04f, -7.994228899e-04f, -6.251993025e-04f, -3.175841545e-04f, +6.038280262e-05f, +4.248524782e-04f, +6.959950382e-04f, +8.214124236e-04f, +7.899834729e-04f, +6.317316839e-04f, +4.046419937e-04f, +1.740634498e-04f, -7.448162127e-06f, -1.129889134e-04f, -1.435401825e-04f, -1.206403004e-04f, - /* 24,14 */ +8.627587811e-05f, +1.297693532e-04f, +1.419963918e-04f, +9.410712043e-05f, -3.136033560e-05f, -2.287861157e-04f, -4.642140510e-04f, -6.803091718e-04f, -8.115205881e-04f, -8.050839212e-04f, -6.404692089e-04f, -3.396771574e-04f, +3.625133679e-05f, +4.040749814e-04f, +6.829663304e-04f, +8.182754723e-04f, +7.961535056e-04f, +6.443236569e-04f, +4.195879132e-04f, +1.874698746e-04f, +1.803144714e-06f, -1.087259386e-04f, -1.434886692e-04f, -1.230784715e-04f, - /* 24,15 */ +8.319130160e-05f, +1.276505127e-04f, +1.427235715e-04f, +9.928779545e-05f, -2.121126661e-05f, -2.148422063e-04f, -4.493898115e-04f, -6.686285441e-04f, -8.069330100e-04f, -8.101126455e-04f, -6.551938988e-04f, -3.614691013e-04f, +1.208738944e-05f, +3.829411831e-04f, +6.693628869e-04f, +8.145094672e-04f, +8.018070806e-04f, +6.566280172e-04f, +4.345091125e-04f, +2.010663923e-04f, +1.135750248e-05f, -1.041598752e-04f, -1.432187562e-04f, -1.254177052e-04f, - /* 24, 0 */ +4.545052445e-05f, +1.951315810e-04f, +3.748938080e-04f, +4.809335107e-04f, +3.960765690e-04f, +5.993810822e-05f, -4.723795438e-04f, -1.024325735e-03f, -1.361247582e-03f, -1.299302728e-03f, -8.046117557e-04f, -2.606329026e-05f, +7.618428442e-04f, +1.280408741e-03f, +1.370322771e-03f, +1.054089829e-03f, +5.086432784e-04f, -3.113193898e-05f, -3.825195300e-04f, -4.822884412e-04f, -3.849609275e-04f, -2.063256631e-04f, -5.270037440e-05f, +2.454794639e-05f, - /* 24, 1 */ +3.852332445e-05f, +1.840753178e-04f, +3.645444067e-04f, +4.788140096e-04f, +4.086121277e-04f, +8.793526572e-05f, -4.362135407e-04f, -9.937048198e-04f, -1.350562575e-03f, -1.316442769e-03f, -8.462280606e-04f, -7.815185270e-05f, +7.179801999e-04f, +1.259777116e-03f, +1.377758125e-03f, +1.082939175e-03f, +5.449481703e-04f, -1.547839432e-06f, -3.679388598e-04f, -4.828529979e-04f, -3.947147844e-04f, -2.176372792e-04f, -6.026901850e-05f, +2.205234045e-05f, - /* 24, 2 */ +3.192167036e-05f, +1.731761778e-04f, +3.539434193e-04f, +4.759566352e-04f, +4.201302650e-04f, +1.150943789e-04f, -4.002008253e-04f, -9.622858103e-04f, -1.338300241e-03f, -1.331815598e-03f, -8.866349827e-04f, -1.301264311e-04f, +6.730846905e-04f, +1.237427186e-03f, +1.383526171e-03f, +1.110816763e-03f, +5.812367254e-04f, +2.878109064e-05f, -3.523343557e-04f, -4.826023474e-04f, -4.041241778e-04f, -2.290451863e-04f, -6.815162122e-05f, +1.926869283e-05f, - /* 24, 3 */ +2.564752013e-05f, +1.624524653e-04f, +3.431211940e-04f, +4.723889014e-04f, +4.306369033e-04f, +1.413884897e-04f, -3.643958409e-04f, -9.301281119e-04f, -1.324495465e-03f, -1.345410999e-03f, -9.257779427e-04f, -1.819112698e-04f, +6.272190697e-04f, +1.213381290e-03f, +1.387602061e-03f, +1.137666624e-03f, +6.174506312e-04f, +5.981976836e-05f, -3.357077999e-04f, -4.815127015e-04f, -4.131577529e-04f, -2.405272085e-04f, -7.634234963e-05f, +1.618998833e-05f, - /* 24, 4 */ +1.970191739e-05f, +1.519214683e-04f, +3.321076713e-04f, +4.681390617e-04f, +4.401397816e-04f, +1.667927354e-04f, -3.288518263e-04f, -8.972916878e-04f, -1.309185436e-03f, -1.357221809e-03f, -9.636046528e-04f, -2.334309635e-04f, +5.804478655e-04f, +1.187664745e-03f, +1.389963631e-03f, +1.163433942e-03f, +6.535308606e-04f, +9.153116784e-05f, -3.180629927e-04f, -4.795613921e-04f, -4.217840695e-04f, -2.520602653e-04f, -8.483435780e-05f, +1.280977164e-05f, - /* 24, 5 */ +1.408501704e-05f, +1.415994448e-04f, +3.209323254e-04f, +4.632360317e-04f, +4.486484045e-04f, +1.912843645e-04f, -2.936207276e-04f, -8.638369381e-04f, -1.292409564e-03f, -1.367243913e-03f, -1.000065207e-03f, -2.846105957e-04f, +5.328372638e-04f, +1.160305814e-03f, +1.390591463e-03f, +1.188065177e-03f, +6.894177793e-04f, +1.238763650e-04f, -2.994057812e-04f, -4.767269440e-04f, -4.299716716e-04f, -2.636204028e-04f, -9.361977359e-05f, +9.122184539e-06f, - /* 24, 6 */ +8.796112429e-06f, +1.315016126e-04f, +3.096241086e-04f, +4.577093118e-04f, +4.561739887e-04f, +2.148427485e-04f, -2.587531149e-04f, -8.298245798e-04f, -1.274209383e-03f, -1.375476234e-03f, -1.035112163e-03f, -3.353758773e-04f, +4.844549899e-04f, +1.131335665e-03f, +1.389468944e-03f, +1.211508174e-03f, +7.250512548e-04f, +1.568145870e-04f, -2.797440842e-04f, -4.729891466e-04f, -4.376891593e-04f, -2.751828281e-04f, -1.026896878e-04f, +5.122002376e-06f, - /* 24, 7 */ +3.833664119e-06f, +1.216421408e-04f, +2.982113984e-04f, +4.515889092e-04f, +4.627294060e-04f, +2.374493875e-04f, -2.242981012e-04f, -7.953155261e-04f, -1.254628457e-03f, -1.381920720e-03f, -1.068700627e-03f, -3.856532828e-04f, +4.353701854e-04f, +1.100788324e-03f, +1.386582316e-03f, +1.233712281e-03f, +7.603707678e-04f, +1.903032668e-04f, -2.590879129e-04f, -4.683291247e-04f, -4.449052614e-04f, -2.867219458e-04f, -1.120341455e-04f, +8.046698450e-07f, - /* 24, 8 */ -8.046698450e-07f, +1.120341455e-04f, +2.867219458e-04f, +4.449052614e-04f, +4.683291247e-04f, +2.590879129e-04f, -1.903032668e-04f, -7.603707678e-04f, -1.233712281e-03f, -1.386582316e-03f, -1.100788324e-03f, -4.353701854e-04f, +3.856532828e-04f, +1.068700627e-03f, +1.381920720e-03f, +1.254628457e-03f, +7.953155261e-04f, +2.242981012e-04f, -2.374493875e-04f, -4.627294060e-04f, -4.515889092e-04f, -2.982113984e-04f, -1.216421408e-04f, -3.833664119e-06f, - /* 24, 9 */ -5.122002376e-06f, +1.026896878e-04f, +2.751828281e-04f, +4.376891593e-04f, +4.729891466e-04f, +2.797440842e-04f, -1.568145870e-04f, -7.250512548e-04f, -1.211508174e-03f, -1.389468944e-03f, -1.131335665e-03f, -4.844549899e-04f, +3.353758773e-04f, +1.035112163e-03f, +1.375476234e-03f, +1.274209383e-03f, +8.298245798e-04f, +2.587531149e-04f, -2.148427485e-04f, -4.561739887e-04f, -4.577093118e-04f, -3.096241086e-04f, -1.315016126e-04f, -8.796112429e-06f, - /* 24,10 */ -9.122184539e-06f, +9.361977359e-05f, +2.636204028e-04f, +4.299716716e-04f, +4.767269440e-04f, +2.994057812e-04f, -1.238763650e-04f, -6.894177793e-04f, -1.188065177e-03f, -1.390591463e-03f, -1.160305814e-03f, -5.328372638e-04f, +2.846105957e-04f, +1.000065207e-03f, +1.367243913e-03f, +1.292409564e-03f, +8.638369381e-04f, +2.936207276e-04f, -1.912843645e-04f, -4.486484045e-04f, -4.632360317e-04f, -3.209323254e-04f, -1.415994448e-04f, -1.408501704e-05f, - /* 24,11 */ -1.280977164e-05f, +8.483435780e-05f, +2.520602653e-04f, +4.217840695e-04f, +4.795613921e-04f, +3.180629927e-04f, -9.153116784e-05f, -6.535308606e-04f, -1.163433942e-03f, -1.389963631e-03f, -1.187664745e-03f, -5.804478655e-04f, +2.334309635e-04f, +9.636046528e-04f, +1.357221809e-03f, +1.309185436e-03f, +8.972916878e-04f, +3.288518263e-04f, -1.667927354e-04f, -4.401397816e-04f, -4.681390617e-04f, -3.321076713e-04f, -1.519214683e-04f, -1.970191739e-05f, - /* 24,12 */ -1.618998833e-05f, +7.634234963e-05f, +2.405272085e-04f, +4.131577529e-04f, +4.815127015e-04f, +3.357077999e-04f, -5.981976836e-05f, -6.174506312e-04f, -1.137666624e-03f, -1.387602061e-03f, -1.213381290e-03f, -6.272190697e-04f, +1.819112698e-04f, +9.257779427e-04f, +1.345410999e-03f, +1.324495465e-03f, +9.301281119e-04f, +3.643958409e-04f, -1.413884897e-04f, -4.306369033e-04f, -4.723889014e-04f, -3.431211940e-04f, -1.624524653e-04f, -2.564752013e-05f, - /* 24,13 */ -1.926869283e-05f, +6.815162122e-05f, +2.290451863e-04f, +4.041241778e-04f, +4.826023474e-04f, +3.523343557e-04f, -2.878109064e-05f, -5.812367254e-04f, -1.110816763e-03f, -1.383526171e-03f, -1.237427186e-03f, -6.730846905e-04f, +1.301264311e-04f, +8.866349827e-04f, +1.331815598e-03f, +1.338300241e-03f, +9.622858103e-04f, +4.002008253e-04f, -1.150943789e-04f, -4.201302650e-04f, -4.759566352e-04f, -3.539434193e-04f, -1.731761778e-04f, -3.192167036e-05f, - /* 24,14 */ -2.205234045e-05f, +6.026901850e-05f, +2.176372792e-04f, +3.947147844e-04f, +4.828529979e-04f, +3.679388598e-04f, +1.547839432e-06f, -5.449481703e-04f, -1.082939175e-03f, -1.377758125e-03f, -1.259777116e-03f, -7.179801999e-04f, +7.815185270e-05f, +8.462280606e-04f, +1.316442769e-03f, +1.350562575e-03f, +9.937048198e-04f, +4.362135407e-04f, -8.793526572e-05f, -4.086121277e-04f, -4.788140096e-04f, -3.645444067e-04f, -1.840753178e-04f, -3.852332445e-05f, - /* 24,15 */ -2.454794639e-05f, +5.270037440e-05f, +2.063256631e-04f, +3.849609275e-04f, +4.822884412e-04f, +3.825195300e-04f, +3.113193898e-05f, -5.086432784e-04f, -1.054089829e-03f, -1.370322771e-03f, -1.280408741e-03f, -7.618428442e-04f, +2.606329026e-05f, +8.046117557e-04f, +1.299302728e-03f, +1.361247582e-03f, +1.024325735e-03f, +4.723795438e-04f, -5.993810822e-05f, -3.960765690e-04f, -4.809335107e-04f, -3.748938080e-04f, -1.951315810e-04f, -4.545052445e-05f, - /* 24, 0 */ -1.702250368e-04f, -1.965005420e-04f, +1.103795304e-06f, +4.330784212e-04f, +8.784555707e-04f, +9.653328276e-04f, +4.315509563e-04f, -6.109575553e-04f, -1.641723450e-03f, -2.015827225e-03f, -1.400787443e-03f, -4.702498413e-05f, +1.332047630e-03f, +2.006889303e-03f, +1.690240096e-03f, +6.826705419e-04f, -3.776686811e-04f, -9.512688743e-04f, -8.983149818e-04f, -4.640234647e-04f, -2.230828855e-05f, +1.918067822e-04f, +1.759255972e-04f, +6.786242515e-05f, - /* 24, 1 */ -1.642126010e-04f, -2.002752798e-04f, -1.910126829e-05f, +4.022439121e-04f, +8.571608722e-04f, +9.768399670e-04f, +4.832977173e-04f, -5.392469404e-04f, -1.590532482e-03f, -2.020693110e-03f, -1.466475318e-03f, -1.409702826e-04f, +1.260398022e-03f, +1.993868298e-03f, +1.735939471e-03f, +7.542164043e-04f, -3.217397652e-04f, -9.346209288e-04f, -9.166430096e-04f, -4.949934945e-04f, -4.448641826e-05f, +1.861665779e-04f, +1.812738819e-04f, +7.451957718e-05f, - /* 24, 2 */ -1.579281336e-04f, -2.031605347e-04f, -3.828516688e-05f, +3.716026326e-04f, +8.345286135e-04f, +9.858238344e-04f, +5.328272649e-04f, -4.677058239e-04f, -1.536815378e-03f, -2.021508037e-03f, -1.528977139e-03f, -2.346018520e-04f, +1.185988431e-03f, +1.976763286e-03f, +1.778684302e-03f, +8.254237228e-04f, -2.638601140e-04f, -9.153683790e-04f, -9.333455225e-04f, -5.259003096e-04f, -6.760829922e-05f, +1.795547962e-04f, +1.862290729e-04f, +8.132190552e-05f, - /* 24, 3 */ -1.514107898e-04f, -2.051877883e-04f, -5.643017558e-05f, +3.412342375e-04f, +8.106578209e-04f, +9.923241157e-04f, +5.800651921e-04f, -3.964985305e-04f, -1.480725107e-03f, -2.018303000e-03f, -1.588167145e-03f, -3.277114722e-04f, +1.108975953e-03f, +1.955583535e-03f, +1.818343426e-03f, +8.961196099e-04f, -2.041325004e-04f, -8.934973649e-04f, -9.483306864e-04f, -5.566532714e-04f, -9.163993343e-05f, +1.719487619e-04f, +1.907500791e-04f, +8.824611727e-05f, - /* 24, 4 */ -1.446989102e-04f, -2.063902871e-04f, -7.352252002e-05f, +3.112151687e-04f, +7.856484910e-04f, +9.963864071e-04f, +6.249444785e-04f, -3.257861630e-04f, -1.422418959e-03f, -2.011118755e-03f, -1.643928243e-03f, -4.200923193e-04f, +1.029524574e-03f, +1.930348530e-03f, +1.854792197e-03f, +9.661301752e-04f, -1.426663759e-04f, -8.690009463e-04f, -9.615092978e-04f, -5.871595310e-04f, -1.165432034e-04f, +1.633284218e-04f, +1.947956873e-04f, +9.526723781e-05f, - /* 24, 5 */ -1.378299032e-04f, -2.068028652e-04f, -8.955230425e-05f, +2.816184974e-04f, +7.596012646e-04f, +9.980619660e-04f, +6.674055614e-04f, -2.557261963e-04f, -1.362058071e-03f, -2.000005648e-03f, -1.696152289e-03f, -5.115395181e-04f, +9.478047386e-04f, +1.901087985e-03f, +1.887912892e-03f, +1.035280999e-03f, -7.957765930e-05f, -8.418792522e-04f, -9.727951144e-04f, -6.173242692e-04f, -1.422758795e-04f, +1.536765045e-04f, +1.983247179e-04f, +1.023586489e-04f, - /* 24, 6 */ -1.308401336e-04f, -2.064617646e-04f, -1.045134271e-04f, +2.525137807e-04f, +7.326171060e-04f, +9.974074494e-04f, +7.073963828e-04f, -1.864720875e-04f, -1.299806951e-03f, -1.985023411e-03f, -1.744740344e-03f, -6.018506887e-04f, +8.639929140e-04f, +1.867841815e-03f, +1.917595086e-03f, +1.103397612e-03f, -1.498850339e-05f, -8.121396097e-04f, -9.821051828e-04f, -6.470509490e-04f, -1.687916421e-04f, +1.429786744e-04f, +2.012961856e-04f, +1.094921351e-04f, - /* 24, 7 */ -1.237648199e-04f, -2.054044567e-04f, -1.184034872e-04f, +2.239669341e-04f, +7.047969872e-04f, +9.944846402e-04f, +7.448724134e-04f, -1.181729029e-04f, -1.235832990e-03f, -1.966240936e-03f, -1.789602898e-03f, -6.908264855e-04f, +7.782711267e-04f, +1.830660078e-03f, +1.943736019e-03f, +1.170305979e-03f, +5.097296116e-05f, -7.797966533e-04f, -9.893601617e-04f, -6.762415789e-04f, -1.960401183e-04f, +1.312236785e-04f, +2.036694644e-04f, +1.166379381e-04f, - /* 24, 8 */ -1.166379381e-04f, -2.036694644e-04f, -1.312236785e-04f, +1.960401183e-04f, +6.762415789e-04f, +9.893601617e-04f, +7.797966533e-04f, -5.097296116e-05f, -1.170305979e-03f, -1.943736019e-03f, -1.830660078e-03f, -7.782711267e-04f, +6.908264855e-04f, +1.789602898e-03f, +1.966240936e-03f, +1.235832990e-03f, +1.181729029e-04f, -7.448724134e-04f, -9.944846402e-04f, -7.047969872e-04f, -2.239669341e-04f, +1.184034872e-04f, +2.054044567e-04f, +1.237648199e-04f, - /* 24, 9 */ -1.094921351e-04f, -2.012961856e-04f, -1.429786744e-04f, +1.687916421e-04f, +6.470509490e-04f, +9.821051828e-04f, +8.121396097e-04f, +1.498850339e-05f, -1.103397612e-03f, -1.917595086e-03f, -1.867841815e-03f, -8.639929140e-04f, +6.018506887e-04f, +1.744740344e-03f, +1.985023411e-03f, +1.299806951e-03f, +1.864720875e-04f, -7.073963828e-04f, -9.974074494e-04f, -7.326171060e-04f, -2.525137807e-04f, +1.045134271e-04f, +2.064617646e-04f, +1.308401336e-04f, - /* 24,10 */ -1.023586489e-04f, -1.983247179e-04f, -1.536765045e-04f, +1.422758795e-04f, +6.173242692e-04f, +9.727951144e-04f, +8.418792522e-04f, +7.957765930e-05f, -1.035280999e-03f, -1.887912892e-03f, -1.901087985e-03f, -9.478047386e-04f, +5.115395181e-04f, +1.696152289e-03f, +2.000005648e-03f, +1.362058071e-03f, +2.557261963e-04f, -6.674055614e-04f, -9.980619660e-04f, -7.596012646e-04f, -2.816184974e-04f, +8.955230425e-05f, +2.068028652e-04f, +1.378299032e-04f, - /* 24,11 */ -9.526723781e-05f, -1.947956873e-04f, -1.633284218e-04f, +1.165432034e-04f, +5.871595310e-04f, +9.615092978e-04f, +8.690009463e-04f, +1.426663759e-04f, -9.661301752e-04f, -1.854792197e-03f, -1.930348530e-03f, -1.029524574e-03f, +4.200923193e-04f, +1.643928243e-03f, +2.011118755e-03f, +1.422418959e-03f, +3.257861630e-04f, -6.249444785e-04f, -9.963864071e-04f, -7.856484910e-04f, -3.112151687e-04f, +7.352252002e-05f, +2.063902871e-04f, +1.446989102e-04f, - /* 24,12 */ -8.824611727e-05f, -1.907500791e-04f, -1.719487619e-04f, +9.163993343e-05f, +5.566532714e-04f, +9.483306864e-04f, +8.934973649e-04f, +2.041325004e-04f, -8.961196099e-04f, -1.818343426e-03f, -1.955583535e-03f, -1.108975953e-03f, +3.277114722e-04f, +1.588167145e-03f, +2.018303000e-03f, +1.480725107e-03f, +3.964985305e-04f, -5.800651921e-04f, -9.923241157e-04f, -8.106578209e-04f, -3.412342375e-04f, +5.643017558e-05f, +2.051877883e-04f, +1.514107898e-04f, - /* 24,13 */ -8.132190552e-05f, -1.862290729e-04f, -1.795547962e-04f, +6.760829922e-05f, +5.259003096e-04f, +9.333455225e-04f, +9.153683790e-04f, +2.638601140e-04f, -8.254237228e-04f, -1.778684302e-03f, -1.976763286e-03f, -1.185988431e-03f, +2.346018520e-04f, +1.528977139e-03f, +2.021508037e-03f, +1.536815378e-03f, +4.677058239e-04f, -5.328272649e-04f, -9.858238344e-04f, -8.345286135e-04f, -3.716026326e-04f, +3.828516688e-05f, +2.031605347e-04f, +1.579281336e-04f, - /* 24,14 */ -7.451957718e-05f, -1.812738819e-04f, -1.861665779e-04f, +4.448641826e-05f, +4.949934945e-04f, +9.166430096e-04f, +9.346209288e-04f, +3.217397652e-04f, -7.542164043e-04f, -1.735939471e-03f, -1.993868298e-03f, -1.260398022e-03f, +1.409702826e-04f, +1.466475318e-03f, +2.020693110e-03f, +1.590532482e-03f, +5.392469404e-04f, -4.832977173e-04f, -9.768399670e-04f, -8.571608722e-04f, -4.022439121e-04f, +1.910126829e-05f, +2.002752798e-04f, +1.642126010e-04f, - /* 24,15 */ -6.786242515e-05f, -1.759255972e-04f, -1.918067822e-04f, +2.230828855e-05f, +4.640234647e-04f, +8.983149818e-04f, +9.512688743e-04f, +3.776686811e-04f, -6.826705419e-04f, -1.690240096e-03f, -2.006889303e-03f, -1.332047630e-03f, +4.702498413e-05f, +1.400787443e-03f, +2.015827225e-03f, +1.641723450e-03f, +6.109575553e-04f, -4.315509563e-04f, -9.653328276e-04f, -8.784555707e-04f, -4.330784212e-04f, -1.103795304e-06f, +1.965005420e-04f, +1.702250368e-04f, - /* 24, 0 */ +3.919255962e-05f, -2.280943782e-04f, -5.361345988e-04f, -4.457457641e-04f, +2.990589649e-04f, +1.295797675e-03f, +1.605517166e-03f, +5.875816565e-04f, -1.289084098e-03f, -2.596166105e-03f, -2.129939921e-03f, -7.496988250e-05f, +2.037180601e-03f, +2.625542335e-03f, +1.404160874e-03f, -4.837783526e-04f, -1.582480410e-03f, -1.345619201e-03f, -3.621830939e-04f, +4.180945199e-04f, +5.469818219e-04f, +2.499414065e-04f, -2.888372260e-05f, -8.895700627e-05f, - /* 24, 1 */ +4.853777483e-05f, -2.065137544e-04f, -5.236754574e-04f, -4.705972357e-04f, +2.371311675e-04f, +1.243196859e-03f, +1.622959247e-03f, +6.876650067e-04f, -1.171710060e-03f, -2.559351067e-03f, -2.215991331e-03f, -2.246678327e-04f, +1.937986318e-03f, +2.647321756e-03f, +1.516528605e-03f, -3.765445934e-04f, -1.553807591e-03f, -1.392405213e-03f, -4.263006320e-04f, +3.876486968e-04f, +5.560961676e-04f, +2.719611444e-04f, -1.761075235e-05f, -9.068976925e-05f, - /* 24, 2 */ +5.692498928e-05f, -1.852878923e-04f, -5.097279107e-04f, -4.926555685e-04f, +1.765921503e-04f, +1.188077447e-03f, +1.634867875e-03f, +7.837567953e-04f, -1.052453928e-03f, -2.515280079e-03f, -2.295086316e-03f, -3.736412373e-04f, +1.832653524e-03f, +2.661371990e-03f, +1.625780509e-03f, -2.661868955e-04f, -1.519477670e-03f, -1.435905115e-03f, -4.911987788e-04f, +3.544256494e-04f, +5.633598944e-04f, +2.940548284e-04f, -5.378471232e-06f, -9.187426948e-05f, - /* 24, 3 */ +6.436469025e-05f, -1.644995777e-04f, -4.944173708e-04f, -5.119388451e-04f, +1.176233517e-04f, +1.130703462e-03f, +1.641323506e-03f, +8.756040923e-04f, -9.317326579e-04f, -2.464159993e-03f, -2.367001633e-03f, -5.214100591e-04f, +1.721501142e-03f, +2.667586958e-03f, +1.731516399e-03f, -1.530278412e-04f, -1.479490407e-03f, -1.475875084e-03f, -5.566555092e-04f, +3.184551797e-04f, +5.686591450e-04f, +3.161189305e-04f, +7.802761507e-06f, -9.246489856e-05f, - /* 24, 4 */ +7.087197068e-05f, -1.442258278e-04f, -4.778705046e-04f, -5.284761768e-04f, +6.039472401e-05f, +1.071341110e-03f, +1.642425167e-03f, +9.629733481e-04f, -8.099633882e-04f, -2.406220702e-03f, -2.431540042e-03f, -6.674987371e-04f, +1.604869446e-03f, +2.665887444e-03f, +1.833344283e-03f, -3.740504807e-05f, -1.433866725e-03f, -1.512079220e-03f, -6.224402836e-04f, +2.797797731e-04f, +5.718846156e-04f, +3.380454975e-04f, +2.191686946e-05f, -9.241721523e-05f, - /* 24, 5 */ +7.646625331e-05f, -1.245377292e-04f, -4.602146020e-04f, -5.423072437e-04f, +5.064318866e-06f, +1.010257658e-03f, +1.638289725e-03f, +1.045651008e-03f, -6.875618648e-04f, -2.341714107e-03f, -2.488530931e-03f, -8.114379517e-04f, +1.483118851e-03f, +2.656221571e-03f, +1.930881931e-03f, +8.032993590e-05f, -1.382648990e-03f, -1.544290670e-03f, -6.883148110e-04f, +2.384547825e-04f, +5.729322223e-04f, +3.597225244e-04f, +3.694190340e-05f, -9.168826568e-05f, - /* 24, 6 */ +8.117100143e-05f, -1.055003114e-04f, -4.415769617e-04f, -5.534817998e-04f, -4.822206513e-05f, +9.477203224e-04f, +1.629051096e-03f, +1.123444034e-03f, -5.649408783e-04f, -2.270913001e-03f, -2.537830838e-03f, -9.527663633e-04f, +1.356628624e-03f, +2.638565156e-03f, +2.023758423e-03f, +1.998128074e-04f, -1.325901212e-03f, -1.572292748e-03f, -7.540338642e-04f, +1.945485578e-04f, +5.717037624e-04f, +3.810343609e-04f, +5.284991195e-05f, -9.023690790e-05f, - /* 24, 7 */ +8.501341847e-05f, -8.717245610e-05f, -4.220842946e-04f, -5.620591450e-04f, -9.933117260e-05f, +8.839951872e-04f, +1.614859393e-03f, +1.196180345e-03f, -4.425087329e-04f, -2.194109877e-03f, -2.579323863e-03f, -1.091032318e-03f, +1.225795515e-03f, +2.612921966e-03f, +2.111615667e-03f, +3.206677492e-04f, -1.263709151e-03f, -1.595880025e-03f, -8.193461436e-04f, +1.481425192e-04f, +5.681075679e-04f, +4.018621494e-04f, +6.960683992e-05f, -8.802413824e-05f, - /* 24, 8 */ +8.802413824e-05f, -6.960683992e-05f, -4.018621494e-04f, -5.681075679e-04f, -1.481425192e-04f, +8.193461436e-04f, +1.595880025e-03f, +1.263709151e-03f, -3.206677492e-04f, -2.111615667e-03f, -2.612921966e-03f, -1.225795515e-03f, +1.091032318e-03f, +2.579323863e-03f, +2.194109877e-03f, +4.425087329e-04f, -1.196180345e-03f, -1.614859393e-03f, -8.839951872e-04f, +9.933117260e-05f, +5.620591450e-04f, +4.220842946e-04f, +8.717245610e-05f, -8.501341847e-05f, - /* 24, 9 */ +9.023690790e-05f, -5.284991195e-05f, -3.810343609e-04f, -5.717037624e-04f, -1.945485578e-04f, +7.540338642e-04f, +1.572292748e-03f, +1.325901212e-03f, -1.998128074e-04f, -2.023758423e-03f, -2.638565156e-03f, -1.356628624e-03f, +9.527663633e-04f, +2.537830838e-03f, +2.270913001e-03f, +5.649408783e-04f, -1.123444034e-03f, -1.629051096e-03f, -9.477203224e-04f, +4.822206513e-05f, +5.534817998e-04f, +4.415769617e-04f, +1.055003114e-04f, -8.117100143e-05f, - /* 24,10 */ +9.168826568e-05f, -3.694190340e-05f, -3.597225244e-04f, -5.729322223e-04f, -2.384547825e-04f, +6.883148110e-04f, +1.544290670e-03f, +1.382648990e-03f, -8.032993590e-05f, -1.930881931e-03f, -2.656221571e-03f, -1.483118851e-03f, +8.114379517e-04f, +2.488530931e-03f, +2.341714107e-03f, +6.875618648e-04f, -1.045651008e-03f, -1.638289725e-03f, -1.010257658e-03f, -5.064318866e-06f, +5.423072437e-04f, +4.602146020e-04f, +1.245377292e-04f, -7.646625331e-05f, - /* 24,11 */ +9.241721523e-05f, -2.191686946e-05f, -3.380454975e-04f, -5.718846156e-04f, -2.797797731e-04f, +6.224402836e-04f, +1.512079220e-03f, +1.433866725e-03f, +3.740504807e-05f, -1.833344283e-03f, -2.665887444e-03f, -1.604869446e-03f, +6.674987371e-04f, +2.431540042e-03f, +2.406220702e-03f, +8.099633882e-04f, -9.629733481e-04f, -1.642425167e-03f, -1.071341110e-03f, -6.039472401e-05f, +5.284761768e-04f, +4.778705046e-04f, +1.442258278e-04f, -7.087197068e-05f, - /* 24,12 */ +9.246489856e-05f, -7.802761507e-06f, -3.161189305e-04f, -5.686591450e-04f, -3.184551797e-04f, +5.566555092e-04f, +1.475875084e-03f, +1.479490407e-03f, +1.530278412e-04f, -1.731516399e-03f, -2.667586958e-03f, -1.721501142e-03f, +5.214100591e-04f, +2.367001633e-03f, +2.464159993e-03f, +9.317326579e-04f, -8.756040923e-04f, -1.641323506e-03f, -1.130703462e-03f, -1.176233517e-04f, +5.119388451e-04f, +4.944173708e-04f, +1.644995777e-04f, -6.436469025e-05f, - /* 24,13 */ +9.187426948e-05f, +5.378471232e-06f, -2.940548284e-04f, -5.633598944e-04f, -3.544256494e-04f, +4.911987788e-04f, +1.435905115e-03f, +1.519477670e-03f, +2.661868955e-04f, -1.625780509e-03f, -2.661371990e-03f, -1.832653524e-03f, +3.736412373e-04f, +2.295086316e-03f, +2.515280079e-03f, +1.052453928e-03f, -7.837567953e-04f, -1.634867875e-03f, -1.188077447e-03f, -1.765921503e-04f, +4.926555685e-04f, +5.097279107e-04f, +1.852878923e-04f, -5.692498928e-05f, - /* 24,14 */ +9.068976925e-05f, +1.761075235e-05f, -2.719611444e-04f, -5.560961676e-04f, -3.876486968e-04f, +4.263006320e-04f, +1.392405213e-03f, +1.553807591e-03f, +3.765445934e-04f, -1.516528605e-03f, -2.647321756e-03f, -1.937986318e-03f, +2.246678327e-04f, +2.215991331e-03f, +2.559351067e-03f, +1.171710060e-03f, -6.876650067e-04f, -1.622959247e-03f, -1.243196859e-03f, -2.371311675e-04f, +4.705972357e-04f, +5.236754574e-04f, +2.065137544e-04f, -4.853777483e-05f, - /* 24,15 */ +8.895700627e-05f, +2.888372260e-05f, -2.499414065e-04f, -5.469818219e-04f, -4.180945199e-04f, +3.621830939e-04f, +1.345619201e-03f, +1.582480410e-03f, +4.837783526e-04f, -1.404160874e-03f, -2.625542335e-03f, -2.037180601e-03f, +7.496988250e-05f, +2.129939921e-03f, +2.596166105e-03f, +1.289084098e-03f, -5.875816565e-04f, -1.605517166e-03f, -1.295797675e-03f, -2.990589649e-04f, +4.457457641e-04f, +5.361345988e-04f, +2.280943782e-04f, -3.919255962e-05f, - /* 24, 0 */ +1.848082291e-04f, +3.126544607e-04f, -8.381805218e-05f, -8.698090905e-04f, -1.028447094e-03f, +2.139154673e-04f, +1.954115341e-03f, +2.095678120e-03f, -1.635717275e-04f, -2.819157299e-03f, -2.940044791e-03f, -1.098945345e-04f, +2.833179926e-03f, +2.923929522e-03f, +3.511165299e-04f, -2.017938339e-03f, -2.030476715e-03f, -3.277888569e-04f, +9.926761418e-04f, +9.110442493e-04f, +1.284872781e-04f, -3.065935448e-04f, -1.998565163e-04f, +7.803305534e-06f, - /* 24, 1 */ +1.695814378e-04f, +3.164556508e-04f, -4.103650150e-05f, -8.260698464e-04f, -1.058100498e-03f, +1.024893805e-04f, +1.871044125e-03f, +2.162944507e-03f, +2.203366063e-05f, -2.703524226e-03f, -3.034115138e-03f, -3.291928088e-04f, +2.713944640e-03f, +3.017272284e-03f, +5.397663057e-04f, -1.929900383e-03f, -2.099607997e-03f, -4.436146208e-04f, +9.507629285e-04f, +9.494468230e-04f, +1.748714247e-04f, -2.981837386e-04f, -2.146007649e-04f, -5.699432396e-07f, - /* 24, 2 */ +1.542962580e-04f, +3.180964801e-04f, -2.971107404e-07f, -7.801571616e-04f, -1.081692695e-03f, -6.019646704e-06f, +1.781805749e-03f, +2.219616197e-03f, +2.048848004e-04f, -2.577645910e-03f, -3.115029215e-03f, -5.470211463e-04f, +2.582823494e-03f, +3.098667200e-03f, +7.286710477e-04f, -1.831793311e-03f, -2.161014579e-03f, -5.608747689e-04f, +9.027154107e-04f, +9.846924856e-04f, +2.227798586e-04f, -2.873471247e-04f, -2.289106872e-04f, -9.773337074e-06f, - /* 24, 3 */ +1.390667857e-04f, +3.176854393e-04f, +3.826416878e-05f, -7.324018434e-04f, -1.099310451e-03f, -1.111689527e-04f, +1.686962051e-03f, +2.265625589e-03f, +3.841903571e-04f, -2.442181508e-03f, -3.182489175e-03f, -7.624077328e-04f, +2.440359294e-03f, +3.167649091e-03f, +9.169693475e-04f, -1.723899657e-03f, -2.214230624e-03f, -6.790305367e-04f, +8.485750922e-04f, +1.016463150e-03f, +2.720045869e-04f, -2.740180422e-04f, -2.426519708e-04f, -1.978701792e-05f, - /* 24, 4 */ +1.240005643e-04f, +3.153390489e-04f, +7.453005747e-05f, -6.831329371e-04f, -1.111069621e-03f, -2.125447010e-04f, +1.587090707e-03f, +2.300958285e-03f, +5.591862212e-04f, -2.297830066e-03f, -3.236262287e-03f, -9.743929228e-04f, +2.287150577e-03f, +3.223808711e-03f, +1.103792665e-03f, -1.606554759e-03f, -2.258822083e-03f, -7.975248409e-04f, +7.884177261e-04f, +1.044449054e-03f, +3.223209063e-04f, -2.581440514e-04f, -2.556870681e-04f, -3.058317705e-05f, - /* 24, 5 */ +1.091981202e-04f, +3.111807515e-04f, +1.084019636e-04f, -6.326758693e-04f, -1.117113666e-03f, -3.097634105e-04f, +1.482781879e-03f, +2.325652312e-03f, +7.291390495e-04f, -2.145326692e-03f, -3.276181809e-03f, -1.182034015e-03f, +2.123848782e-03f, +3.266795190e-03f, +1.288269679e-03f, -1.480145805e-03f, -2.294389599e-03f, -9.157848908e-04f, +7.223538352e-04f, +1.068350860e-03f, +3.734881809e-04f, -2.396868442e-04f, -2.678760406e-04f, -4.212586861e-05f, - /* 24, 6 */ +9.475256757e-05f, +3.053397988e-04f, +1.397998805e-04f, -5.813506695e-04f, -1.117612060e-03f, -4.024732802e-04f, +1.374634870e-03f, +2.339797075e-03f, +8.933496022e-04f, -1.985438555e-03f, -3.302147511e-03f, -1.384409934e-03f, +1.951155148e-03f, +3.296318191e-03f, +1.469530695e-03f, -1.345110577e-03f, -2.320571262e-03f, -1.033224945e-03f, +6.505290403e-04f, +1.087881752e-03f, +4.252507475e-04f, -2.186230940e-04f, -2.790774568e-04f, -5.437087857e-05f, - /* 24, 7 */ +8.074928352e-05f, +2.979501429e-04f, +1.686621699e-04f, -5.294702777e-04f, -1.112758583e-03f, -4.903553074e-04f, +1.263254779e-03f, +2.343532047e-03f, +1.051155860e-03f, -1.818960757e-03f, -3.314125843e-03f, -1.580625796e-03f, +1.769817333e-03f, +3.312149758e-03f, +1.646712089e-03f, -1.201935910e-03f, -2.337045209e-03f, -1.149249197e-03f, +5.731241934e-04f, +1.102769514e-03f, +4.773389469e-04f, -1.949452358e-04f, -2.891493374e-04f, -6.726565227e-05f, - /* 24, 8 */ +6.726565227e-05f, +2.891493374e-04f, +1.949452358e-04f, -4.773389469e-04f, -1.102769514e-03f, -5.731241934e-04f, +1.149249197e-03f, +2.337045209e-03f, +1.201935910e-03f, -1.646712089e-03f, -3.312149758e-03f, -1.769817333e-03f, +1.580625796e-03f, +3.314125843e-03f, +1.818960757e-03f, -1.051155860e-03f, -2.343532047e-03f, -1.263254779e-03f, +4.903553074e-04f, +1.112758583e-03f, +5.294702777e-04f, -1.686621699e-04f, -2.979501429e-04f, -8.074928352e-05f, - /* 24, 9 */ +5.437087857e-05f, +2.790774568e-04f, +2.186230940e-04f, -4.252507475e-04f, -1.087881752e-03f, -6.505290403e-04f, +1.033224945e-03f, +2.320571262e-03f, +1.345110577e-03f, -1.469530695e-03f, -3.296318191e-03f, -1.951155148e-03f, +1.384409934e-03f, +3.302147511e-03f, +1.985438555e-03f, -8.933496022e-04f, -2.339797075e-03f, -1.374634870e-03f, +4.024732802e-04f, +1.117612060e-03f, +5.813506695e-04f, -1.397998805e-04f, -3.053397988e-04f, -9.475256757e-05f, - /* 24,10 */ +4.212586861e-05f, +2.678760406e-04f, +2.396868442e-04f, -3.734881809e-04f, -1.068350860e-03f, -7.223538352e-04f, +9.157848908e-04f, +2.294389599e-03f, +1.480145805e-03f, -1.288269679e-03f, -3.266795190e-03f, -2.123848782e-03f, +1.182034015e-03f, +3.276181809e-03f, +2.145326692e-03f, -7.291390495e-04f, -2.325652312e-03f, -1.482781879e-03f, +3.097634105e-04f, +1.117113666e-03f, +6.326758693e-04f, -1.084019636e-04f, -3.111807515e-04f, -1.091981202e-04f, - /* 24,11 */ +3.058317705e-05f, +2.556870681e-04f, +2.581440514e-04f, -3.223209063e-04f, -1.044449054e-03f, -7.884177261e-04f, +7.975248409e-04f, +2.258822083e-03f, +1.606554759e-03f, -1.103792665e-03f, -3.223808711e-03f, -2.287150577e-03f, +9.743929228e-04f, +3.236262287e-03f, +2.297830066e-03f, -5.591862212e-04f, -2.300958285e-03f, -1.587090707e-03f, +2.125447010e-04f, +1.111069621e-03f, +6.831329371e-04f, -7.453005747e-05f, -3.153390489e-04f, -1.240005643e-04f, - /* 24,12 */ +1.978701792e-05f, +2.426519708e-04f, +2.740180422e-04f, -2.720045869e-04f, -1.016463150e-03f, -8.485750922e-04f, +6.790305367e-04f, +2.214230624e-03f, +1.723899657e-03f, -9.169693475e-04f, -3.167649091e-03f, -2.440359294e-03f, +7.624077328e-04f, +3.182489175e-03f, +2.442181508e-03f, -3.841903571e-04f, -2.265625589e-03f, -1.686962051e-03f, +1.111689527e-04f, +1.099310451e-03f, +7.324018434e-04f, -3.826416878e-05f, -3.176854393e-04f, -1.390667857e-04f, - /* 24,13 */ +9.773337074e-06f, +2.289106872e-04f, +2.873471247e-04f, -2.227798586e-04f, -9.846924856e-04f, -9.027154107e-04f, +5.608747689e-04f, +2.161014579e-03f, +1.831793311e-03f, -7.286710477e-04f, -3.098667200e-03f, -2.582823494e-03f, +5.470211463e-04f, +3.115029215e-03f, +2.577645910e-03f, -2.048848004e-04f, -2.219616197e-03f, -1.781805749e-03f, +6.019646704e-06f, +1.081692695e-03f, +7.801571616e-04f, +2.971107404e-07f, -3.180964801e-04f, -1.542962580e-04f, - /* 24,14 */ +5.699432396e-07f, +2.146007649e-04f, +2.981837386e-04f, -1.748714247e-04f, -9.494468230e-04f, -9.507629285e-04f, +4.436146208e-04f, +2.099607997e-03f, +1.929900383e-03f, -5.397663057e-04f, -3.017272284e-03f, -2.713944640e-03f, +3.291928088e-04f, +3.034115138e-03f, +2.703524226e-03f, -2.203366063e-05f, -2.162944507e-03f, -1.871044125e-03f, -1.024893805e-04f, +1.058100498e-03f, +8.260698464e-04f, +4.103650150e-05f, -3.164556508e-04f, -1.695814378e-04f, - /* 24,15 */ -7.803305534e-06f, +1.998565163e-04f, +3.065935448e-04f, -1.284872781e-04f, -9.110442493e-04f, -9.926761418e-04f, +3.277888569e-04f, +2.030476715e-03f, +2.017938339e-03f, -3.511165299e-04f, -2.923929522e-03f, -2.833179926e-03f, +1.098945345e-04f, +2.940044791e-03f, +2.819157299e-03f, +1.635717275e-04f, -2.095678120e-03f, -1.954115341e-03f, -2.139154673e-04f, +1.028447094e-03f, +8.698090905e-04f, +8.381805218e-05f, -3.126544607e-04f, -1.848082291e-04f, - /* 24, 0 */ -1.364396009e-04f, -7.446376994e-05f, +5.066257662e-04f, +2.030015760e-04f, -9.054261715e-04f, -1.195525937e-03f, +4.683850093e-04f, +2.213825561e-03f, +1.188944940e-03f, -1.856378227e-03f, -2.833970964e-03f, -1.144377463e-04f, +2.758138339e-03f, +2.020697482e-03f, -1.023174933e-03f, -2.248631080e-03f, -6.097868283e-04f, +1.146194663e-03f, +9.693248739e-04f, -1.479047908e-04f, -5.177782008e-04f, -1.250536964e-04f, +1.414906982e-04f, +2.710774794e-05f, - /* 24, 1 */ -1.307026563e-04f, -8.975162518e-05f, +4.924131238e-04f, +2.542107757e-04f, -8.382130226e-04f, -1.235986710e-03f, +3.277877666e-04f, +2.166758574e-03f, +1.345406789e-03f, -1.683014413e-03f, -2.893234801e-03f, -3.426248829e-04f, +2.666119545e-03f, +2.174888063e-03f, -8.489895579e-04f, -2.270723567e-03f, -7.511023835e-04f, +1.088054225e-03f, +1.029345157e-03f, -8.915647260e-05f, -5.256253050e-04f, -1.535492882e-04f, +1.457592711e-04f, +3.374854096e-05f, - /* 24, 2 */ -1.243758393e-04f, -1.032931784e-04f, +4.753985127e-04f, +3.013338450e-04f, -7.682542954e-04f, -1.267577330e-03f, +1.888607322e-04f, +2.107952975e-03f, +1.491738775e-03f, -1.501737881e-03f, -2.935653267e-03f, -5.687514710e-04f, +2.558401145e-03f, +2.317921172e-03f, -6.673475630e-04f, -2.279727032e-03f, -8.914213340e-04f, +1.021228789e-03f, +1.084932315e-03f, -2.702967135e-05f, -5.299376467e-04f, -1.826837732e-04f, +1.491486840e-04f, +4.073257728e-05f, - /* 24, 3 */ -1.175537217e-04f, -1.151066589e-04f, +4.558506985e-04f, +3.442099484e-04f, -6.961194660e-04f, -1.290358261e-03f, +5.243891240e-05f, +2.037998203e-03f, +1.627194859e-03f, -1.313720334e-03f, -2.961057174e-03f, -7.914588446e-04f, +2.435570833e-03f, +2.448830599e-03f, -4.792680017e-04f, -2.275344863e-03f, -1.029819797e-03f, +9.459060659e-04f, +1.135545329e-03f, +3.816638860e-05f, -5.305040204e-04f, -2.122423012e-04f, +1.515631236e-04f, +4.801831197e-05f, - /* 24, 4 */ -1.103288160e-04f, -1.252215041e-04f, +4.340463917e-04f, +3.827158599e-04f, -6.223744454e-04f, -1.304448109e-03f, -8.067840470e-05f, +1.957545178e-03f, +1.751108674e-03f, -1.120165265e-03f, -2.969385358e-03f, -1.009410776e-03f, +2.298313921e-03f, +2.566719612e-03f, -2.858241016e-04f, -2.257363134e-03f, -1.165366520e-03f, +8.623375551e-04f, +1.180661312e-03f, +1.060874480e-04f, -5.271339238e-04f, -2.419953224e-04f, +1.529084143e-04f, +5.555842361e-05f, - /* 24, 5 */ -1.027909684e-04f, -1.336775649e-04f, +4.102676936e-04f, +4.167655723e-04f, -5.475775503e-04f, -1.310021272e-03f, -2.097323863e-04f, +1.867300846e-03f, +1.862896930e-03f, -9.222997333e-04f, -2.960684559e-03f, -1.221302229e-03f, +2.147409148e-03f, +2.670767418e-03f, -8.813668768e-05f, -2.225653372e-03f, -1.297129225e-03f, +7.708383352e-04f, +1.219779926e-03f, +1.763556677e-04f, -5.196599496e-04f, -2.716999419e-04f, +1.530928622e-04f, +6.329988035e-05f, - /* 24, 6 */ -9.502680145e-05f, -1.405242734e-04f, +3.847995909e-04f, +4.463096266e-04f, -4.722756447e-04f, -1.307305241e-03f, -3.340090076e-04f, +1.768022423e-03f, +1.962062202e-03f, -7.213660470e-04f, -2.935108571e-03f, -1.425867893e-03f, +1.983723834e-03f, +2.760235146e-03f, +1.126327965e-04f, -2.180174758e-03f, -1.424181074e-03f, +6.717863708e-04f, +1.252427754e-03f, +2.485613970e-04f, -5.079400707e-04f, -3.011014490e-04f, +1.520281231e-04f, +7.118405837e-05f, - /* 24, 7 */ -8.711921055e-05f, -1.458197836e-04f, +3.579275186e-04f, +4.713341756e-04f, -3.970004792e-04f, -1.296577576e-03f, -4.528429958e-04f, +1.660511380e-03f, +2.048195092e-03f, -5.186134147e-04f, -2.892916666e-03f, -1.621890436e-03f, +1.808208423e-03f, +2.834471303e-03f, +3.152896222e-04f, -2.120975750e-03f, -1.545607217e-03f, +5.656213428e-04f, +1.278162587e-03f, +3.222652495e-04f, -4.918597964e-04f, -3.299350101e-04f, +1.496300883e-04f, +7.914691395e-05f, - /* 24, 8 */ -7.914691395e-05f, -1.496300883e-04f, +3.299350101e-04f, +4.918597964e-04f, -3.222652495e-04f, -1.278162587e-03f, -5.656213428e-04f, +1.545607217e-03f, +2.120975750e-03f, -3.152896222e-04f, -2.834471303e-03f, -1.808208423e-03f, +1.621890436e-03f, +2.892916666e-03f, +5.186134147e-04f, -2.048195092e-03f, -1.660511380e-03f, +4.528429958e-04f, +1.296577576e-03f, +3.970004792e-04f, -4.713341756e-04f, -3.579275186e-04f, +1.458197836e-04f, +8.711921055e-05f, - /* 24, 9 */ -7.118405837e-05f, -1.520281231e-04f, +3.011014490e-04f, +5.079400707e-04f, -2.485613970e-04f, -1.252427754e-03f, -6.717863708e-04f, +1.424181074e-03f, +2.180174758e-03f, -1.126327965e-04f, -2.760235146e-03f, -1.983723834e-03f, +1.425867893e-03f, +2.935108571e-03f, +7.213660470e-04f, -1.962062202e-03f, -1.768022423e-03f, +3.340090076e-04f, +1.307305241e-03f, +4.722756447e-04f, -4.463096266e-04f, -3.847995909e-04f, +1.405242734e-04f, +9.502680145e-05f, - /* 24,10 */ -6.329988035e-05f, -1.530928622e-04f, +2.716999419e-04f, +5.196599496e-04f, -1.763556677e-04f, -1.219779926e-03f, -7.708383352e-04f, +1.297129225e-03f, +2.225653372e-03f, +8.813668768e-05f, -2.670767418e-03f, -2.147409148e-03f, +1.221302229e-03f, +2.960684559e-03f, +9.222997333e-04f, -1.862896930e-03f, -1.867300846e-03f, +2.097323863e-04f, +1.310021272e-03f, +5.475775503e-04f, -4.167655723e-04f, -4.102676936e-04f, +1.336775649e-04f, +1.027909684e-04f, - /* 24,11 */ -5.555842361e-05f, -1.529084143e-04f, +2.419953224e-04f, +5.271339238e-04f, -1.060874480e-04f, -1.180661312e-03f, -8.623375551e-04f, +1.165366520e-03f, +2.257363134e-03f, +2.858241016e-04f, -2.566719612e-03f, -2.298313921e-03f, +1.009410776e-03f, +2.969385358e-03f, +1.120165265e-03f, -1.751108674e-03f, -1.957545178e-03f, +8.067840470e-05f, +1.304448109e-03f, +6.223744454e-04f, -3.827158599e-04f, -4.340463917e-04f, +1.252215041e-04f, +1.103288160e-04f, - /* 24,12 */ -4.801831197e-05f, -1.515631236e-04f, +2.122423012e-04f, +5.305040204e-04f, -3.816638860e-05f, -1.135545329e-03f, -9.459060659e-04f, +1.029819797e-03f, +2.275344863e-03f, +4.792680017e-04f, -2.448830599e-03f, -2.435570833e-03f, +7.914588446e-04f, +2.961057174e-03f, +1.313720334e-03f, -1.627194859e-03f, -2.037998203e-03f, -5.243891240e-05f, +1.290358261e-03f, +6.961194660e-04f, -3.442099484e-04f, -4.558506985e-04f, +1.151066589e-04f, +1.175537217e-04f, - /* 24,13 */ -4.073257728e-05f, -1.491486840e-04f, +1.826837732e-04f, +5.299376467e-04f, +2.702967135e-05f, -1.084932315e-03f, -1.021228789e-03f, +8.914213340e-04f, +2.279727032e-03f, +6.673475630e-04f, -2.317921172e-03f, -2.558401145e-03f, +5.687514710e-04f, +2.935653267e-03f, +1.501737881e-03f, -1.491738775e-03f, -2.107952975e-03f, -1.888607322e-04f, +1.267577330e-03f, +7.682542954e-04f, -3.013338450e-04f, -4.753985127e-04f, +1.032931784e-04f, +1.243758393e-04f, - /* 24,14 */ -3.374854096e-05f, -1.457592711e-04f, +1.535492882e-04f, +5.256253050e-04f, +8.915647260e-05f, -1.029345157e-03f, -1.088054225e-03f, +7.511023835e-04f, +2.270723567e-03f, +8.489895579e-04f, -2.174888063e-03f, -2.666119545e-03f, +3.426248829e-04f, +2.893234801e-03f, +1.683014413e-03f, -1.345406789e-03f, -2.166758574e-03f, -3.277877666e-04f, +1.235986710e-03f, +8.382130226e-04f, -2.542107757e-04f, -4.924131238e-04f, +8.975162518e-05f, +1.307026563e-04f, - /* 24,15 */ -2.710774794e-05f, -1.414906982e-04f, +1.250536964e-04f, +5.177782008e-04f, +1.479047908e-04f, -9.693248739e-04f, -1.146194663e-03f, +6.097868283e-04f, +2.248631080e-03f, +1.023174933e-03f, -2.020697482e-03f, -2.758138339e-03f, +1.144377463e-04f, +2.833970964e-03f, +1.856378227e-03f, -1.188944940e-03f, -2.213825561e-03f, -4.683850093e-04f, +1.195525937e-03f, +9.054261715e-04f, -2.030015760e-04f, -5.066257662e-04f, +7.446376994e-05f, +1.364396009e-04f, - /* 20, 0 */ +8.618377023e-05f, +6.063813654e-04f, +5.504304823e-05f, -1.285351444e-03f, -7.884572117e-04f, +1.698526656e-03f, +2.051642156e-03f, -1.208844608e-03f, -3.071261118e-03f, -1.337669627e-04f, +3.018986987e-03f, +1.434631920e-03f, -1.928392685e-03f, -1.831072241e-03f, +6.629429882e-04f, +1.334851066e-03f, +2.665316224e-05f, -6.158469302e-04f, -1.222533602e-04f, +1.824770389e-04f, - /* 20, 1 */ +5.170459821e-05f, +5.921181369e-04f, +1.325211661e-04f, -1.227728603e-03f, -9.042412445e-04f, +1.556639033e-03f, +2.157910711e-03f, -9.769935819e-04f, -3.101316201e-03f, -4.002989059e-04f, +2.944767882e-03f, +1.652572896e-03f, -1.788832610e-03f, -1.953018956e-03f, +5.284364506e-04f, +1.375515478e-03f, +1.120226944e-04f, -6.201709543e-04f, -1.596279961e-04f, +5.435082024e-04f, - /* 20, 2 */ +1.907003227e-05f, +5.734309365e-04f, +2.052951315e-04f, -1.162740775e-03f, -1.009657150e-03f, +1.406715362e-03f, +2.246673287e-03f, -7.408907618e-04f, -3.109053425e-03f, -6.638330580e-04f, +2.849051730e-03f, +1.860929207e-03f, -1.633773999e-03f, -2.063170847e-03f, +3.857714352e-04f, +1.406686835e-03f, +2.004651158e-04f, -6.190441221e-04f, -1.979927117e-04f, +1.783734753e-04f, - /* 20, 3 */ -1.149811868e-05f, +5.507184044e-04f, +2.729399910e-04f, -1.091184321e-03f, -1.104169932e-03f, +1.250098855e-03f, +2.317552276e-03f, -5.023622502e-04f, -3.094549152e-03f, -9.223980063e-04f, +2.732457430e-03f, +2.058021578e-03f, -1.464165902e-03f, -2.160404235e-03f, +2.358727957e-04f, +1.427769061e-03f, +2.913280278e-04f, -6.121962531e-04f, -2.370049292e-04f, +1.734448317e-04f, - /* 20, 4 */ -3.981122763e-05f, +5.243991976e-04f, +3.350936324e-04f, -1.013885501e-03f, -1.187349554e-03f, +1.088157908e-03f, +2.370318438e-03f, -2.632332411e-04f, -3.058053364e-03f, -1.174062761e-03f, +2.595770512e-03f, +2.242244162e-03f, -1.281088328e-03f, -2.243678681e-03f, +7.975052491e-05f, +1.438235101e-03f, +3.839113875e-04f, -5.994006494e-04f, -2.762968272e-04f, +1.660093790e-04f, - /* 20, 5 */ -6.571426612e-05f, +4.949070444e-04f, +3.914578654e-04f, -9.316921975e-04f, -1.258871974e-03f, +9.222740706e-04f, +2.404890527e-03f, -2.531308203e-05f, -2.999986642e-03f, -1.416952434e-03f, +2.439937364e-03f, +2.412078410e-03f, -1.085745014e-03f, -2.312047403e-03f, -8.150702581e-05f, +1.437633739e-03f, +4.774724341e-04f, -5.804781630e-04f, -3.154780847e-04f, +1.559797103e-04f, - /* 20, 6 */ -8.908584503e-05f, +4.626858369e-04f, +4.417988543e-04f, -8.454656803e-04f, -1.318519207e-03f, +7.538301290e-04f, +2.421333651e-03f, +2.096193816e-04f, -2.920935727e-03f, -1.649263420e-03f, +2.266058084e-03f, +2.566106310e-03f, -8.794550343e-04f, -2.364667062e-03f, -2.467407834e-04f, +1.425595879e-03f, +5.712311871e-04f, -5.553009320e-04f, -3.541389831e-04f, +1.432933926e-04f, - /* 20, 7 */ -1.098378936e-04f, +4.281848093e-04f, +4.859469205e-04f, -7.560724855e-04f, -1.366178446e-03f, +5.841984075e-04f, +2.419856400e-03f, +4.398300532e-04f, -2.821647705e-03f, -1.869277969e-03f, +2.075378006e-03f, +2.703022864e-03f, -6.636433018e-04f, -2.400806791e-03f, -4.147293943e-04f, +1.401840253e-03f, +6.643764801e-04f, -5.237957356e-04f, -3.918538488e-04f, +1.279149940e-04f, - /* 20, 8 */ -1.279149940e-04f, +3.918538488e-04f, +5.237957356e-04f, -6.643764801e-04f, -1.401840253e-03f, +4.147293943e-04f, +2.400806791e-03f, +6.636433018e-04f, -2.703022864e-03f, -2.075378006e-03f, +1.869277969e-03f, +2.821647705e-03f, -4.398300532e-04f, -2.419856400e-03f, -5.841984075e-04f, +1.366178446e-03f, +7.560724855e-04f, -4.859469205e-04f, -4.281848093e-04f, +1.098378936e-04f, - /* 20, 9 */ -1.432933926e-04f, +3.541389831e-04f, +5.553009320e-04f, -5.712311871e-04f, -1.425595879e-03f, +2.467407834e-04f, +2.364667062e-03f, +8.794550343e-04f, -2.566106310e-03f, -2.266058084e-03f, +1.649263420e-03f, +2.920935727e-03f, -2.096193816e-04f, -2.421333651e-03f, -7.538301290e-04f, +1.318519207e-03f, +8.454656803e-04f, -4.417988543e-04f, -4.626858369e-04f, +8.908584503e-05f, - /* 20,10 */ -1.559797103e-04f, +3.154780847e-04f, +5.804781630e-04f, -4.774724341e-04f, -1.437633739e-03f, +8.150702581e-05f, +2.312047403e-03f, +1.085745014e-03f, -2.412078410e-03f, -2.439937364e-03f, +1.416952434e-03f, +2.999986642e-03f, +2.531308203e-05f, -2.404890527e-03f, -9.222740706e-04f, +1.258871974e-03f, +9.316921975e-04f, -3.914578654e-04f, -4.949070444e-04f, +6.571426612e-05f, - /* 20,11 */ -1.660093790e-04f, +2.762968272e-04f, +5.994006494e-04f, -3.839113875e-04f, -1.438235101e-03f, -7.975052491e-05f, +2.243678681e-03f, +1.281088328e-03f, -2.242244162e-03f, -2.595770512e-03f, +1.174062761e-03f, +3.058053364e-03f, +2.632332411e-04f, -2.370318438e-03f, -1.088157908e-03f, +1.187349554e-03f, +1.013885501e-03f, -3.350936324e-04f, -5.243991976e-04f, +3.981122763e-05f, - /* 20,12 */ -1.734448317e-04f, +2.370049292e-04f, +6.121962531e-04f, -2.913280278e-04f, -1.427769061e-03f, -2.358727957e-04f, +2.160404235e-03f, +1.464165902e-03f, -2.058021578e-03f, -2.732457430e-03f, +9.223980063e-04f, +3.094549152e-03f, +5.023622502e-04f, -2.317552276e-03f, -1.250098855e-03f, +1.104169932e-03f, +1.091184321e-03f, -2.729399910e-04f, -5.507184044e-04f, +1.149811868e-05f, - /* 20,13 */ -1.783734753e-04f, +1.979927117e-04f, +6.190441221e-04f, -2.004651158e-04f, -1.406686835e-03f, -3.857714352e-04f, +2.063170847e-03f, +1.633773999e-03f, -1.860929207e-03f, -2.849051730e-03f, +6.638330580e-04f, +3.109053425e-03f, +7.408907618e-04f, -2.246673287e-03f, -1.406715362e-03f, +1.009657150e-03f, +1.162740775e-03f, -2.052951315e-04f, -5.734309365e-04f, -1.907003227e-05f, - /* 20,14 */ -5.435082024e-04f, +1.596279961e-04f, +6.201709543e-04f, -1.120226944e-04f, -1.375515478e-03f, -5.284364506e-04f, +1.953018956e-03f, +1.788832610e-03f, -1.652572896e-03f, -2.944767882e-03f, +4.002989059e-04f, +3.101316201e-03f, +9.769935819e-04f, -2.157910711e-03f, -1.556639033e-03f, +9.042412445e-04f, +1.227728603e-03f, -1.325211661e-04f, -5.921181369e-04f, -5.170459821e-05f, - /* 20,15 */ -1.824770389e-04f, +1.222533602e-04f, +6.158469302e-04f, -2.665316224e-05f, -1.334851066e-03f, -6.629429882e-04f, +1.831072241e-03f, +1.928392685e-03f, -1.434631920e-03f, -3.018986987e-03f, +1.337669627e-04f, +3.071261118e-03f, +1.208844608e-03f, -2.051642156e-03f, -1.698526656e-03f, +7.884572117e-04f, +1.285351444e-03f, -5.504304823e-05f, -6.063813654e-04f, -8.618377023e-05f, - /* 20, 0 */ -2.034293425e-04f, +2.330977005e-04f, +6.663349221e-04f, -5.788237715e-04f, -1.543506114e-03f, +7.663264997e-04f, +2.637884518e-03f, -5.016073607e-04f, -3.414789539e-03f, -1.613262342e-04f, +3.393842146e-03f, +7.896927597e-04f, -2.589726790e-03f, -9.705894653e-04f, +1.498255744e-03f, +6.923557695e-04f, -6.435044748e-04f, -2.810018705e-04f, +2.009801156e-04f, +0.000000000e+00f, - /* 20, 1 */ -6.015260759e-04f, +1.858917095e-04f, +6.809814437e-04f, -4.649883812e-04f, -1.572899641e-03f, +5.610647582e-04f, +2.661959816e-03f, -2.131645492e-04f, -3.406214168e-03f, -4.825221542e-04f, +3.343371924e-03f, +1.074767465e-03f, -2.517456780e-03f, -1.171859801e-03f, +1.437039798e-03f, +8.043742580e-04f, -6.123036842e-04f, -3.290468323e-04f, +1.953154138e-04f, -3.513221827e-04f, - /* 20, 2 */ -1.932641301e-04f, +1.399021716e-04f, +6.877130848e-04f, -3.520154127e-04f, -1.586701669e-03f, +3.567578182e-04f, +2.662213263e-03f, +7.301175991e-05f, -3.368394423e-03f, -7.993627115e-04f, +3.263658730e-03f, +1.354174959e-03f, -2.421279702e-03f, -1.368123194e-03f, +1.359912061e-03f, +9.136368247e-04f, -5.726346524e-04f, -3.766412744e-04f, +1.862701081e-04f, +2.243392330e-05f, - /* 20, 3 */ -1.771389305e-04f, +9.560377684e-05f, +6.868748812e-04f, -2.410152618e-04f, -1.585326694e-03f, +1.553000173e-04f, +2.639129491e-03f, +3.543525656e-04f, -3.301882608e-03f, -1.108991788e-03f, +3.155261081e-03f, +1.625281932e-03f, -2.301637793e-03f, -1.557365345e-03f, +1.267093119e-03f, +1.018881552e-03f, -5.244930508e-04f, -4.231658296e-04f, +1.737162070e-04f, +3.471505729e-05f, - /* 20, 4 */ -1.604844080e-04f, +5.342390613e-05f, +6.788805869e-04f, -1.330327870e-04f, -1.569329509e-03f, -4.149146373e-05f, +2.593408320e-03f, +6.283684809e-04f, -3.207497769e-03f, -1.408623929e-03f, +3.019012048e-03f, +1.885504757e-03f, -2.159209806e-03f, -1.737592880e-03f, +1.158972903e-03f, +1.118840456e-03f, -4.679722330e-04f, -4.679795743e-04f, +1.575667726e-04f, +4.805250238e-05f, - /* 20, 5 */ -1.435528424e-04f, +1.373966937e-05f, +6.642048742e-04f, -2.903827106e-05f, -1.539395067e-03f, -2.318933016e-04f, +2.525953799e-03f, +8.926733333e-04f, -3.086315860e-03f, -1.695571566e-03f, +2.856012327e-03f, +2.132335710e-03f, -1.994908019e-03f, -1.906854484e-03f, +1.036111434e-03f, +1.212253447e-03f, -4.032663270e-04f, -5.104270987e-04f, +1.377794601e-04f, +6.235351094e-05f, - /* 20, 6 */ -1.265803873e-04f, -2.312428639e-05f, +6.433751213e-04f, +7.008046528e-05f, -1.496327216e-03f, -4.142913555e-04f, +2.437861323e-03f, +1.145006429e-03f, -2.939657349e-03f, -1.967271220e-03f, +2.667620552e-03f, +2.363368676e-03f, -1.809872756e-03f, -2.063262017e-03f, +8.992377119e-04f, +1.297882648e-03f, -3.306722314e-04f, -5.498460811e-04f, +1.143596169e-04f, +7.750368078e-05f, - /* 20, 7 */ -1.097853637e-04f, -5.689720211e-05f, +6.169629011e-04f, +1.635247423e-04f, -1.441036462e-03f, -5.871944806e-04f, +2.330402993e-03f, +1.383253258e-03f, -2.769072436e-03f, -2.221308400e-03f, +2.455440941e-03f, +2.576324026e-03f, -1.605464444e-03f, -2.205011397e-03f, +7.492467105e-04f, +1.374526925e-03f, -2.505904541e-04f, -5.855752858e-04f, +8.736287854e-05f, +9.336686615e-05f, - /* 20, 8 */ -9.336686615e-05f, -8.736287854e-05f, +5.855752858e-04f, +2.505904541e-04f, -1.374526925e-03f, -7.492467105e-04f, +2.205011397e-03f, +1.605464444e-03f, -2.576324026e-03f, -2.455440941e-03f, +2.221308400e-03f, +2.769072436e-03f, -1.383253258e-03f, -2.330402993e-03f, +5.871944806e-04f, +1.441036462e-03f, -1.635247423e-04f, -6.169629011e-04f, +5.689720211e-05f, +1.097853637e-04f, - /* 20, 9 */ -7.750368078e-05f, -1.143596169e-04f, +5.498460811e-04f, +3.306722314e-04f, -1.297882648e-03f, -8.992377119e-04f, +2.063262017e-03f, +1.809872756e-03f, -2.363368676e-03f, -2.667620552e-03f, +1.967271220e-03f, +2.939657349e-03f, -1.145006429e-03f, -2.437861323e-03f, +4.142913555e-04f, +1.496327216e-03f, -7.008046528e-05f, -6.433751213e-04f, +2.312428639e-05f, +1.265803873e-04f, - /* 20,10 */ -6.235351094e-05f, -1.377794601e-04f, +5.104270987e-04f, +4.032663270e-04f, -1.212253447e-03f, -1.036111434e-03f, +1.906854484e-03f, +1.994908019e-03f, -2.132335710e-03f, -2.856012327e-03f, +1.695571566e-03f, +3.086315860e-03f, -8.926733333e-04f, -2.525953799e-03f, +2.318933016e-04f, +1.539395067e-03f, +2.903827106e-05f, -6.642048742e-04f, -1.373966937e-05f, +1.435528424e-04f, - /* 20,11 */ -4.805250238e-05f, -1.575667726e-04f, +4.679795743e-04f, +4.679722330e-04f, -1.118840456e-03f, -1.158972903e-03f, +1.737592880e-03f, +2.159209806e-03f, -1.885504757e-03f, -3.019012048e-03f, +1.408623929e-03f, +3.207497769e-03f, -6.283684809e-04f, -2.593408320e-03f, +4.149146373e-05f, +1.569329509e-03f, +1.330327870e-04f, -6.788805869e-04f, -5.342390613e-05f, +1.604844080e-04f, - /* 20,12 */ -3.471505729e-05f, -1.737162070e-04f, +4.231658296e-04f, +5.244930508e-04f, -1.018881552e-03f, -1.267093119e-03f, +1.557365345e-03f, +2.301637793e-03f, -1.625281932e-03f, -3.155261081e-03f, +1.108991788e-03f, +3.301882608e-03f, -3.543525656e-04f, -2.639129491e-03f, -1.553000173e-04f, +1.585326694e-03f, +2.410152618e-04f, -6.868748812e-04f, -9.560377684e-05f, +1.771389305e-04f, - /* 20,13 */ -2.243392330e-05f, -1.862701081e-04f, +3.766412744e-04f, +5.726346524e-04f, -9.136368247e-04f, -1.359912061e-03f, +1.368123194e-03f, +2.421279702e-03f, -1.354174959e-03f, -3.263658730e-03f, +7.993627115e-04f, +3.368394423e-03f, -7.301175991e-05f, -2.662213263e-03f, -3.567578182e-04f, +1.586701669e-03f, +3.520154127e-04f, -6.877130848e-04f, -1.399021716e-04f, +1.932641301e-04f, - /* 20,14 */ +3.513221827e-04f, -1.953154138e-04f, +3.290468323e-04f, +6.123036842e-04f, -8.043742580e-04f, -1.437039798e-03f, +1.171859801e-03f, +2.517456780e-03f, -1.074767465e-03f, -3.343371924e-03f, +4.825221542e-04f, +3.406214168e-03f, +2.131645492e-04f, -2.661959816e-03f, -5.610647582e-04f, +1.572899641e-03f, +4.649883812e-04f, -6.809814437e-04f, -1.858917095e-04f, +6.015260759e-04f, - /* 20,15 */ +0.000000000e+00f, -2.009801156e-04f, +2.810018705e-04f, +6.435044748e-04f, -6.923557695e-04f, -1.498255744e-03f, +9.705894653e-04f, +2.589726790e-03f, -7.896927597e-04f, -3.393842146e-03f, +1.613262342e-04f, +3.414789539e-03f, +5.016073607e-04f, -2.637884518e-03f, -7.663264997e-04f, +1.543506114e-03f, +5.788237715e-04f, -6.663349221e-04f, -2.330977005e-04f, +2.034293425e-04f, - /* 20, 0 */ -1.941987182e-05f, -3.146481294e-04f, +5.561305343e-04f, +3.334278991e-04f, -1.561489082e-03f, -4.085266513e-04f, +2.806699025e-03f, +3.580334706e-04f, -3.695826941e-03f, -1.914605051e-04f, +3.720952014e-03f, -2.295171057e-05f, -2.868623587e-03f, +1.886978960e-04f, +1.629573547e-03f, -2.343761763e-04f, -6.035407960e-04f, +1.633790229e-04f, +3.476344875e-05f, +0.000000000e+00f, - /* 20, 1 */ +3.929324583e-04f, -3.051602666e-04f, +5.048306585e-04f, +4.229644027e-04f, -1.479104632e-03f, -6.165003319e-04f, +2.717079427e-03f, +6.839596419e-04f, -3.633185574e-03f, -5.723309145e-04f, +3.708003841e-03f, +3.177599071e-04f, -2.901501717e-03f, -4.082823094e-05f, +1.681921685e-03f, -1.265851889e-04f, -6.461214422e-04f, +1.369921977e-04f, +5.166761157e-05f, +0.000000000e+00f, - /* 20, 2 */ +0.000000000e+00f, -2.925136688e-04f, +4.505823818e-04f, +5.023683161e-04f, -1.383975926e-03f, -8.106644739e-04f, +2.601403151e-03f, +9.973590062e-04f, -3.534000256e-03f, -9.470733637e-04f, +3.656850180e-03f, +6.604608766e-04f, -2.904291326e-03f, -2.777120434e-04f, +1.717239595e-03f, -1.098579054e-05f, -6.829477483e-04f, +1.058859702e-04f, +7.000071077e-05f, +0.000000000e+00f, - /* 20, 3 */ +0.000000000e+00f, -2.771727451e-04f, +3.943146848e-04f, +5.711822345e-04f, -1.277754215e-03f, -9.892860040e-04f, +2.461570058e-03f, +1.295052213e-03f, -3.399644449e-03f, -1.311681723e-03f, +3.567787737e-03f, +1.001437562e-03f, -2.876278542e-03f, -5.194560271e-04f, +1.734397724e-03f, +1.113422841e-04f, -7.131247677e-04f, +7.019384523e-05f, +8.959420873e-05f, +0.000000000e+00f, - /* 20, 4 */ +0.000000000e+00f, -2.596009711e-04f, +3.369316672e-04f, +6.291078651e-04f, -1.162161945e-03f, -1.150868125e-03f, +2.299713337e-03f, +1.574086312e-03f, -3.231873732e-03f, -1.662267592e-03f, +3.441541225e-03f, +1.336946247e-03f, -2.817092852e-03f, -7.634316403e-04f, +1.732451285e-03f, +2.391787684e-04f, -7.358020638e-04f, +3.013243736e-05f, +1.102423612e-04f, +0.000000000e+00f, - /* 20, 5 */ +0.000000000e+00f, -2.402546692e-04f, +2.793008459e-04f, +6.760030262e-04f, -1.038968304e-03f, -1.294161821e-03f, +2.118169008e-03f, +1.831766066e-03f, -3.032802328e-03f, -1.995105343e-03f, +3.279257242e-03f, +1.663257052e-03f, -2.726718246e-03f, -1.006908470e-03f, +1.710658870e-03f, +3.711735089e-04f, -7.501884622e-04f, -1.399708473e-05f, +1.317024534e-04f, +0.000000000e+00f, - /* 20, 6 */ +0.000000000e+00f, -2.195772899e-04f, +2.222425350e-04f, +7.118766228e-04f, -9.099649801e-04f, -1.418173917e-03f, +1.919443545e-03f, +2.065681697e-03f, -2.804875489e-03f, -2.306675131e-03f, +3.082493013e-03f, +1.976698190e-03f, -2.605500127e-03f, -1.247085413e-03f, +1.668498942e-03f, +5.058593370e-04f, -7.555665992e-04f, -6.180883712e-05f, +1.536956226e-04f, +0.000000000e+00f, - /* 20, 7 */ +0.000000000e+00f, -1.979942392e-04f, +1.665204182e-04f, +7.368817426e-04f, -7.769424426e-04f, -1.522171671e-03f, +1.706180058e-03f, +2.273732749e-03f, -2.550838108e-03f, -2.593703365e-03f, +2.853200114e-03f, +2.273699984e-03f, -2.454147846e-03f, -1.481123511e-03f, +1.605683934e-03f, +6.416670612e-04f, -7.513070408e-04f, -1.128334053e-04f, +1.759082929e-04f, +0.000000000e+00f, - /* 20, 8 */ +0.000000000e+00f, -1.759082929e-04f, +1.128334053e-04f, +7.513070408e-04f, -6.416670612e-04f, -1.605683934e-03f, +1.481123511e-03f, +2.454147846e-03f, -2.273699984e-03f, -2.853200114e-03f, +2.593703365e-03f, +2.550838108e-03f, -2.273732749e-03f, -1.706180058e-03f, +1.522171671e-03f, +7.769424426e-04f, -7.368817426e-04f, -1.665204182e-04f, +1.979942392e-04f, +0.000000000e+00f, - /* 20, 9 */ +0.000000000e+00f, -1.536956226e-04f, +6.180883712e-05f, +7.555665992e-04f, -5.058593370e-04f, -1.668498942e-03f, +1.247085413e-03f, +2.605500127e-03f, -1.976698190e-03f, -3.082493013e-03f, +2.306675131e-03f, +2.804875489e-03f, -2.065681697e-03f, -1.919443545e-03f, +1.418173917e-03f, +9.099649801e-04f, -7.118766228e-04f, -2.222425350e-04f, +2.195772899e-04f, +0.000000000e+00f, - /* 20,10 */ +0.000000000e+00f, -1.317024534e-04f, +1.399708473e-05f, +7.501884622e-04f, -3.711735089e-04f, -1.710658870e-03f, +1.006908470e-03f, +2.726718246e-03f, -1.663257052e-03f, -3.279257242e-03f, +1.995105343e-03f, +3.032802328e-03f, -1.831766066e-03f, -2.118169008e-03f, +1.294161821e-03f, +1.038968304e-03f, -6.760030262e-04f, -2.793008459e-04f, +2.402546692e-04f, +0.000000000e+00f, - /* 20,11 */ +0.000000000e+00f, -1.102423612e-04f, -3.013243736e-05f, +7.358020638e-04f, -2.391787684e-04f, -1.732451285e-03f, +7.634316403e-04f, +2.817092852e-03f, -1.336946247e-03f, -3.441541225e-03f, +1.662267592e-03f, +3.231873732e-03f, -1.574086312e-03f, -2.299713337e-03f, +1.150868125e-03f, +1.162161945e-03f, -6.291078651e-04f, -3.369316672e-04f, +2.596009711e-04f, +0.000000000e+00f, - /* 20,12 */ +0.000000000e+00f, -8.959420873e-05f, -7.019384523e-05f, +7.131247677e-04f, -1.113422841e-04f, -1.734397724e-03f, +5.194560271e-04f, +2.876278542e-03f, -1.001437562e-03f, -3.567787737e-03f, +1.311681723e-03f, +3.399644449e-03f, -1.295052213e-03f, -2.461570058e-03f, +9.892860040e-04f, +1.277754215e-03f, -5.711822345e-04f, -3.943146848e-04f, +2.771727451e-04f, +0.000000000e+00f, - /* 20,13 */ +0.000000000e+00f, -7.000071077e-05f, -1.058859702e-04f, +6.829477483e-04f, +1.098579054e-05f, -1.717239595e-03f, +2.777120434e-04f, +2.904291326e-03f, -6.604608766e-04f, -3.656850180e-03f, +9.470733637e-04f, +3.534000256e-03f, -9.973590062e-04f, -2.601403151e-03f, +8.106644739e-04f, +1.383975926e-03f, -5.023683161e-04f, -4.505823818e-04f, +2.925136688e-04f, +0.000000000e+00f, - /* 20,14 */ +0.000000000e+00f, -5.166761157e-05f, -1.369921977e-04f, +6.461214422e-04f, +1.265851889e-04f, -1.681921685e-03f, +4.082823094e-05f, +2.901501717e-03f, -3.177599071e-04f, -3.708003841e-03f, +5.723309145e-04f, +3.633185574e-03f, -6.839596419e-04f, -2.717079427e-03f, +6.165003319e-04f, +1.479104632e-03f, -4.229644027e-04f, -5.048306585e-04f, +3.051602666e-04f, -3.929324583e-04f, - /* 20,15 */ +0.000000000e+00f, -3.476344875e-05f, -1.633790229e-04f, +6.035407960e-04f, +2.343761763e-04f, -1.629573547e-03f, -1.886978960e-04f, +2.868623587e-03f, +2.295171057e-05f, -3.720952014e-03f, +1.914605051e-04f, +3.695826941e-03f, -3.580334706e-04f, -2.806699025e-03f, +4.085266513e-04f, +1.561489082e-03f, -3.334278991e-04f, -5.561305343e-04f, +3.146481294e-04f, +1.941987182e-05f, - /* 16, 0 */ +5.220390682e-05f, +8.171943113e-04f, -8.986497643e-04f, -1.446340428e-03f, +2.494478678e-03f, +1.297377101e-03f, -3.898391184e-03f, -2.241676001e-04f, +3.985236927e-03f, -9.413140896e-04f, -2.682700956e-03f, +1.283836927e-03f, +1.053222343e-03f, -7.989322796e-04f, -1.116939505e-04f, +1.571395541e-04f, - /* 16, 1 */ -3.017522584e-06f, +8.224554322e-04f, -7.403312787e-04f, -1.584058293e-03f, +2.281207335e-03f, +1.631019258e-03f, -3.765802305e-03f, -6.696927435e-04f, +4.024834602e-03f, -5.670028406e-04f, -2.842687093e-03f, +1.097826180e-03f, +1.201600277e-03f, -7.671194843e-04f, -1.747127487e-04f, +1.853334990e-04f, - /* 16, 2 */ -5.335264618e-05f, +8.154372286e-04f, -5.806604605e-04f, -1.696100138e-03f, +2.046328714e-03f, +1.938434809e-03f, -3.589560871e-03f, -1.106825943e-03f, +4.016290169e-03f, -1.789305351e-04f, -2.971556495e-03f, +8.899684644e-04f, +1.341315594e-03f, -7.213960065e-04f, -2.404043435e-04f, +2.137577131e-04f, - /* 16, 3 */ -9.830954357e-05f, +7.970128377e-04f, -4.219420013e-04f, -1.781963746e-03f, +1.793485018e-03f, +2.216231187e-03f, -3.372309802e-03f, -1.530099436e-03f, +3.959337237e-03f, +2.181586899e-04f, -3.066783450e-03f, +6.622938144e-04f, +1.469918710e-03f, -6.616076810e-04f, -3.078052257e-04f, +7.052925564e-04f, - /* 16, 4 */ -1.375232535e-04f, +7.681852053e-04f, -2.663606532e-04f, -1.841529450e-03f, +1.526462906e-03f, +2.461468734e-03f, -3.117203525e-03f, -1.934233820e-03f, +3.854345030e-03f, +6.193258599e-04f, -3.126241364e-03f, +4.171838871e-04f, +1.585017189e-03f, -5.878191605e-04f, -3.758553213e-04f, +2.457392598e-04f, - /* 16, 5 */ -1.707546409e-04f, +7.300642099e-04f, -1.159532388e-04f, -1.875048978e-03f, +1.249136740e-03f, +2.671693350e-03f, -2.827860277e-03f, -2.314209556e-03f, +3.702317390e-03f, +1.019502933e-03f, -3.148242059e-03f, +1.573479538e-04f, +1.684315055e-03f, -5.003238841e-04f, -4.434113338e-04f, +2.470336005e-04f, - /* 16, 6 */ -1.978870754e-04f, +6.838430878e-04f, +2.741593655e-05f, -1.883129095e-03f, +9.654119112e-04f, +2.844961691e-03f, -2.508308289e-03f, -2.665334690e-03f, +3.504882792e-03f, +1.413561295e-03f, -3.131569469e-03f, -1.142067707e-04f, +1.765652028e-03f, -3.996506493e-04f, -5.092623113e-04f, +2.432370997e-04f, - /* 16, 7 */ -2.189210857e-04f, +6.307745862e-04f, +1.620759979e-04f, -1.866710442e-03f, +6.791690772e-04f, +2.979858667e-03f, -2.162926680e-03f, -2.983307830e-03f, +3.264275462e-03f, +1.796381989e-03f, -3.075507089e-03f, -3.942101476e-04f, +1.827042047e-03f, -2.865665382e-04f, -5.721472605e-04f, +2.339671870e-04f, - /* 16, 8 */ -2.339671870e-04f, +5.721472605e-04f, +2.865665382e-04f, -1.827042047e-03f, +3.942101476e-04f, +3.075507089e-03f, -1.796381989e-03f, -3.264275462e-03f, +2.983307830e-03f, +2.162926680e-03f, -2.979858667e-03f, -6.791690772e-04f, +1.866710442e-03f, -1.620759979e-04f, -6.307745862e-04f, +2.189210857e-04f, - /* 16, 9 */ -2.432370997e-04f, +5.092623113e-04f, +3.996506493e-04f, -1.765652028e-03f, +1.142067707e-04f, +3.131569469e-03f, -1.413561295e-03f, -3.504882792e-03f, +2.665334690e-03f, +2.508308289e-03f, -2.844961691e-03f, -9.654119112e-04f, +1.883129095e-03f, -2.741593655e-05f, -6.838430878e-04f, +1.978870754e-04f, - /* 16,10 */ -2.470336005e-04f, +4.434113338e-04f, +5.003238841e-04f, -1.684315055e-03f, -1.573479538e-04f, +3.148242059e-03f, -1.019502933e-03f, -3.702317390e-03f, +2.314209556e-03f, +2.827860277e-03f, -2.671693350e-03f, -1.249136740e-03f, +1.875048978e-03f, +1.159532388e-04f, -7.300642099e-04f, +1.707546409e-04f, - /* 16,11 */ -2.457392598e-04f, +3.758553213e-04f, +5.878191605e-04f, -1.585017189e-03f, -4.171838871e-04f, +3.126241364e-03f, -6.193258599e-04f, -3.854345030e-03f, +1.934233820e-03f, +3.117203525e-03f, -2.461468734e-03f, -1.526462906e-03f, +1.841529450e-03f, +2.663606532e-04f, -7.681852053e-04f, +1.375232535e-04f, - /* 16,12 */ -7.052925564e-04f, +3.078052257e-04f, +6.616076810e-04f, -1.469918710e-03f, -6.622938144e-04f, +3.066783450e-03f, -2.181586899e-04f, -3.959337237e-03f, +1.530099436e-03f, +3.372309802e-03f, -2.216231187e-03f, -1.793485018e-03f, +1.781963746e-03f, +4.219420013e-04f, -7.970128377e-04f, +9.830954357e-05f, - /* 16,13 */ -2.137577131e-04f, +2.404043435e-04f, +7.213960065e-04f, -1.341315594e-03f, -8.899684644e-04f, +2.971556495e-03f, +1.789305351e-04f, -4.016290169e-03f, +1.106825943e-03f, +3.589560871e-03f, -1.938434809e-03f, -2.046328714e-03f, +1.696100138e-03f, +5.806604605e-04f, -8.154372286e-04f, +5.335264618e-05f, - /* 16,14 */ -1.853334990e-04f, +1.747127487e-04f, +7.671194843e-04f, -1.201600277e-03f, -1.097826180e-03f, +2.842687093e-03f, +5.670028406e-04f, -4.024834602e-03f, +6.696927435e-04f, +3.765802305e-03f, -1.631019258e-03f, -2.281207335e-03f, +1.584058293e-03f, +7.403312787e-04f, -8.224554322e-04f, +3.017522584e-06f, - /* 16,15 */ -1.571395541e-04f, +1.116939505e-04f, +7.989322796e-04f, -1.053222343e-03f, -1.283836927e-03f, +2.682700956e-03f, +9.413140896e-04f, -3.985236927e-03f, +2.241676001e-04f, +3.898391184e-03f, -1.297377101e-03f, -2.494478678e-03f, +1.446340428e-03f, +8.986497643e-04f, -8.171943113e-04f, -5.220390682e-05f, - /* 16, 0 */ -2.607744081e-04f, +6.609893225e-04f, +4.777614003e-05f, -2.019079564e-03f, +1.736921610e-03f, +2.230081148e-03f, -4.008512761e-03f, -2.594451583e-04f, +4.172957467e-03f, -1.888269495e-03f, -2.040920379e-03f, +1.975903291e-03f, +1.180452271e-04f, -7.248571600e-04f, +2.468008838e-04f, +0.000000000e+00f, - /* 16, 1 */ -2.676863913e-04f, +5.906930705e-04f, +2.025069901e-04f, -2.030408814e-03f, +1.418499470e-03f, +2.533235894e-03f, -3.790472440e-03f, -7.745724648e-04f, +4.280846994e-03f, -1.512096765e-03f, -2.325335551e-03f, +1.900137256e-03f, +2.927280105e-04f, -7.805529904e-04f, +2.254162899e-04f, +0.000000000e+00f, - /* 16, 2 */ -2.680102581e-04f, +5.157202047e-04f, +3.442245196e-04f, -2.011119828e-03f, +1.090886046e-03f, +2.794113365e-03f, -3.522578151e-03f, -1.278469954e-03f, +4.330057965e-03f, -1.106477171e-03f, -2.585166870e-03f, +1.791556445e-03f, +4.737630093e-04f, -8.263772041e-04f, +1.964117366e-04f, +0.000000000e+00f, - /* 16, 3 */ -7.633646088e-04f, +4.377966605e-04f, +4.713317060e-04f, -1.962888420e-03f, +7.592982470e-04f, +3.009813640e-03f, -3.209287239e-03f, -1.763847458e-03f, +4.319343992e-03f, -6.768749158e-04f, -2.815661672e-03f, +1.650477084e-03f, +6.583936022e-04f, -8.607109932e-04f, +1.597335965e-04f, -4.634120047e-04f, - /* 16, 4 */ -2.423668462e-04f, +3.585907293e-04f, +5.825699836e-04f, -1.887792011e-03f, +4.288533077e-04f, +3.178189562e-03f, -2.855695312e-03f, -2.223705909e-03f, +4.248362401e-03f, -2.292254995e-04f, -3.012400483e-03f, +1.477771292e-03f, +8.436545409e-04f, -8.820535056e-04f, +1.154955663e-04f, +2.338334874e-05f, - /* 16, 5 */ -2.066858426e-04f, +2.796840991e-04f, +6.770251471e-04f, -1.788258811e-03f, +1.044882353e-04f, +3.297866045e-03f, -2.467449129e-03f, -2.651446905e-03f, +4.117686315e-03f, +2.301520823e-04f, -3.171379014e-03f, +1.274872332e-03f, +1.026416356e-03f, -8.890585891e-04f, +6.398775754e-05f, +4.782938304e-05f, - /* 16, 6 */ -1.715009195e-04f, +2.025461567e-04f, +7.541266524e-04f, -1.667012713e-03f, -2.091154912e-04f, +3.368246274e-03f, -2.050651409e-03f, -3.040975547e-03f, +3.928801804e-03f, +6.946508648e-04f, -3.289085050e-03f, +1.043770075e-03f, +1.203434747e-03f, -8.805703554e-04f, +5.682450650e-06f, +7.520965874e-05f, - /* 16, 7 */ -1.374865801e-04f, +1.285119093e-04f, +8.136405975e-04f, -1.527015027e-03f, -5.076007987e-04f, +3.389504923e-03f, -1.611759203e-03f, -3.386794836e-03f, +3.684090065e-03f, +1.157477637e-03f, -3.362568736e-03f, +7.869964389e-04f, +1.371404208e-03f, -8.556567843e-04f, -5.876379361e-05f, +1.052264476e-04f, - /* 16, 8 */ -1.052264476e-04f, +5.876379361e-05f, +8.556567843e-04f, -1.371404208e-03f, -7.869964389e-04f, +3.362568736e-03f, -1.157477637e-03f, -3.684090065e-03f, +3.386794836e-03f, +1.611759203e-03f, -3.389504923e-03f, +5.076007987e-04f, +1.527015027e-03f, -8.136405975e-04f, -1.285119093e-04f, +1.374865801e-04f, - /* 16, 9 */ -7.520965874e-05f, -5.682450650e-06f, +8.805703554e-04f, -1.203434747e-03f, -1.043770075e-03f, +3.289085050e-03f, -6.946508648e-04f, -3.928801804e-03f, +3.040975547e-03f, +2.050651409e-03f, -3.368246274e-03f, +2.091154912e-04f, +1.667012713e-03f, -7.541266524e-04f, -2.025461567e-04f, +1.715009195e-04f, - /* 16,10 */ -4.782938304e-05f, -6.398775754e-05f, +8.890585891e-04f, -1.026416356e-03f, -1.274872332e-03f, +3.171379014e-03f, -2.301520823e-04f, -4.117686315e-03f, +2.651446905e-03f, +2.467449129e-03f, -3.297866045e-03f, -1.044882353e-04f, +1.788258811e-03f, -6.770251471e-04f, -2.796840991e-04f, +2.066858426e-04f, - /* 16,11 */ -2.338334874e-05f, -1.154955663e-04f, +8.820535056e-04f, -8.436545409e-04f, -1.477771292e-03f, +3.012400483e-03f, +2.292254995e-04f, -4.248362401e-03f, +2.223705909e-03f, +2.855695312e-03f, -3.178189562e-03f, -4.288533077e-04f, +1.887792011e-03f, -5.825699836e-04f, -3.585907293e-04f, +2.423668462e-04f, - /* 16,12 */ +4.634120047e-04f, -1.597335965e-04f, +8.607109932e-04f, -6.583936022e-04f, -1.650477084e-03f, +2.815661672e-03f, +6.768749158e-04f, -4.319343992e-03f, +1.763847458e-03f, +3.209287239e-03f, -3.009813640e-03f, -7.592982470e-04f, +1.962888420e-03f, -4.713317060e-04f, -4.377966605e-04f, +7.633646088e-04f, - /* 16,13 */ +0.000000000e+00f, -1.964117366e-04f, +8.263772041e-04f, -4.737630093e-04f, -1.791556445e-03f, +2.585166870e-03f, +1.106477171e-03f, -4.330057965e-03f, +1.278469954e-03f, +3.522578151e-03f, -2.794113365e-03f, -1.090886046e-03f, +2.011119828e-03f, -3.442245196e-04f, -5.157202047e-04f, +2.680102581e-04f, - /* 16,14 */ +0.000000000e+00f, -2.254162899e-04f, +7.805529904e-04f, -2.927280105e-04f, -1.900137256e-03f, +2.325335551e-03f, +1.512096765e-03f, -4.280846994e-03f, +7.745724648e-04f, +3.790472440e-03f, -2.533235894e-03f, -1.418499470e-03f, +2.030408814e-03f, -2.025069901e-04f, -5.906930705e-04f, +2.676863913e-04f, - /* 16,15 */ +0.000000000e+00f, -2.468008838e-04f, +7.248571600e-04f, -1.180452271e-04f, -1.975903291e-03f, +2.040920379e-03f, +1.888269495e-03f, -4.172957467e-03f, +2.594451583e-04f, +4.008512761e-03f, -2.230081148e-03f, -1.736921610e-03f, +2.019079564e-03f, -4.777614003e-05f, -6.609893225e-04f, +2.607744081e-04f, - /* 16, 0 */ -1.129954761e-04f, -3.969443331e-04f, +7.863457700e-04f, -1.968627401e-03f, +6.635626436e-04f, +3.065104554e-03f, -4.014723865e-03f, -2.972906332e-04f, +4.272130602e-03f, -2.778972616e-03f, -1.044103847e-03f, +2.069667087e-03f, -6.906315332e-04f, -2.376896670e-04f, +1.523656204e-04f, +0.000000000e+00f, - /* 16, 1 */ -7.672972562e-05f, -4.458313625e-04f, +8.604609066e-04f, -1.839340292e-03f, +2.869810557e-04f, +3.294943885e-03f, -3.696990655e-03f, -8.869321804e-04f, +4.464175630e-03f, -2.440111513e-03f, -1.421957113e-03f, +2.139058837e-03f, -5.737860098e-04f, -3.273087897e-04f, +1.941703587e-04f, +0.000000000e+00f, - /* 16, 2 */ -4.409159553e-05f, -4.801879450e-04f, +9.129725459e-04f, -1.685578963e-03f, -7.929130936e-05f, +3.465994861e-03f, -3.324955442e-03f, -1.461843594e-03f, +4.586914931e-03f, -2.053108579e-03f, -1.790295465e-03f, +2.173860444e-03f, -4.367566844e-04f, -4.185294039e-04f, +2.375950982e-04f, +0.000000000e+00f, - /* 16, 3 */ +4.855802427e-04f, -5.008892512e-04f, +9.443143993e-04f, -1.511399569e-03f, -4.293120730e-04f, +3.576852207e-03f, -2.905512498e-03f, -2.012499819e-03f, +4.637578076e-03f, -1.623510702e-03f, -2.142238116e-03f, +2.171667537e-03f, -2.809771210e-04f, -5.093533546e-04f, +2.816859426e-04f, +0.000000000e+00f, - /* 16, 4 */ +0.000000000e+00f, -5.090007623e-04f, +9.553248878e-04f, -1.321049384e-03f, -7.576441950e-04f, +3.627202827e-03f, -2.446291464e-03f, -2.529812382e-03f, +4.614629236e-03f, -1.157740361e-03f, -2.470980778e-03f, +2.130685105e-03f, -1.083629217e-04f, -5.976383603e-04f, +3.253590588e-04f, +0.000000000e+00f, - /* 16, 5 */ +0.000000000e+00f, -5.057402285e-04f, +9.472067544e-04f, -1.118874842e-03f, -1.059441268e-03f, +3.617806804e-03f, -1.955510679e-03f, -3.005292216e-03f, +4.517805471e-03f, -6.629933593e-04f, -2.769928158e-03f, +2.049789183e-03f, +7.870314989e-05f, -6.811391839e-04f, +3.674140144e-04f, +0.000000000e+00f, - /* 16, 6 */ +0.000000000e+00f, -4.924395299e-04f, +9.214808972e-04f, -9.092313688e-04f, -1.330518654e-03f, +3.550458465e-03f, -1.441821213e-03f, -3.431200966e-03f, +4.348131386e-03f, -1.471199733e-04f, -3.032825993e-03f, +1.928577081e-03f, +2.773970394e-04f, -7.575537377e-04f, +4.065510896e-04f, +0.000000000e+00f, - /* 16, 7 */ +0.000000000e+00f, -4.705072223e-04f, +8.799357120e-04f, -6.963968181e-04f, -1.567409460e-03f, +3.427928686e-03f, -9.141447359e-04f, -3.800687882e-03f, +4.107909720e-03f, +3.815084058e-04f, -3.253889950e-03f, +1.767404663e-03f, +4.844901765e-04f, -8.245732787e-04f, +4.413924818e-04f, +0.000000000e+00f, - /* 16, 8 */ +0.000000000e+00f, -4.413924818e-04f, +8.245732787e-04f, -4.844901765e-04f, -1.767404663e-03f, +3.253889950e-03f, -3.815084058e-04f, -4.107909720e-03f, +3.800687882e-03f, +9.141447359e-04f, -3.427928686e-03f, +1.567409460e-03f, +6.963968181e-04f, -8.799357120e-04f, +4.705072223e-04f, +0.000000000e+00f, - /* 16, 9 */ +0.000000000e+00f, -4.065510896e-04f, +7.575537377e-04f, -2.773970394e-04f, -1.928577081e-03f, +3.032825993e-03f, +1.471199733e-04f, -4.348131386e-03f, +3.431200966e-03f, +1.441821213e-03f, -3.550458465e-03f, +1.330518654e-03f, +9.092313688e-04f, -9.214808972e-04f, +4.924395299e-04f, +0.000000000e+00f, - /* 16,10 */ +0.000000000e+00f, -3.674140144e-04f, +6.811391839e-04f, -7.870314989e-05f, -2.049789183e-03f, +2.769928158e-03f, +6.629933593e-04f, -4.517805471e-03f, +3.005292216e-03f, +1.955510679e-03f, -3.617806804e-03f, +1.059441268e-03f, +1.118874842e-03f, -9.472067544e-04f, +5.057402285e-04f, +0.000000000e+00f, - /* 16,11 */ +0.000000000e+00f, -3.253590588e-04f, +5.976383603e-04f, +1.083629217e-04f, -2.130685105e-03f, +2.470980778e-03f, +1.157740361e-03f, -4.614629236e-03f, +2.529812382e-03f, +2.446291464e-03f, -3.627202827e-03f, +7.576441950e-04f, +1.321049384e-03f, -9.553248878e-04f, +5.090007623e-04f, +0.000000000e+00f, - /* 16,12 */ +0.000000000e+00f, -2.816859426e-04f, +5.093533546e-04f, +2.809771210e-04f, -2.171667537e-03f, +2.142238116e-03f, +1.623510702e-03f, -4.637578076e-03f, +2.012499819e-03f, +2.905512498e-03f, -3.576852207e-03f, +4.293120730e-04f, +1.511399569e-03f, -9.443143993e-04f, +5.008892512e-04f, -4.855802427e-04f, - /* 16,13 */ +0.000000000e+00f, -2.375950982e-04f, +4.185294039e-04f, +4.367566844e-04f, -2.173860444e-03f, +1.790295465e-03f, +2.053108579e-03f, -4.586914931e-03f, +1.461843594e-03f, +3.324955442e-03f, -3.465994861e-03f, +7.929130936e-05f, +1.685578963e-03f, -9.129725459e-04f, +4.801879450e-04f, +4.409159553e-05f, - /* 16,14 */ +0.000000000e+00f, -1.941703587e-04f, +3.273087897e-04f, +5.737860098e-04f, -2.139058837e-03f, +1.421957113e-03f, +2.440111513e-03f, -4.464175630e-03f, +8.869321804e-04f, +3.696990655e-03f, -3.294943885e-03f, -2.869810557e-04f, +1.839340292e-03f, -8.604609066e-04f, +4.458313625e-04f, +7.672972562e-05f, - /* 16,15 */ +0.000000000e+00f, -1.523656204e-04f, +2.376896670e-04f, +6.906315332e-04f, -2.069667087e-03f, +1.044103847e-03f, +2.778972616e-03f, -4.272130602e-03f, +2.972906332e-04f, +4.014723865e-03f, -3.065104554e-03f, -6.635626436e-04f, +1.968627401e-03f, -7.863457700e-04f, +3.969443331e-04f, +1.129954761e-04f, - /* 12, 0 */ +1.006092301e-03f, -1.356592138e-03f, -5.291224839e-04f, +3.716365432e-03f, -3.908475818e-03f, -3.377012930e-04f, +4.272902045e-03f, -3.529241849e-03f, +1.347121185e-04f, +1.576582805e-03f, -1.021094463e-03f, +2.080147558e-04f, - /* 12, 1 */ +9.703330579e-04f, -1.123568815e-03f, -8.960631472e-04f, +3.830455785e-03f, -3.478978472e-03f, -1.006731283e-03f, +4.564422369e-03f, -3.270752231e-03f, -2.802589631e-04f, +1.777910422e-03f, -1.013271813e-03f, +1.540375404e-04f, - /* 12, 2 */ +9.162319547e-04f, -8.831264337e-04f, -1.229457804e-03f, +3.871345986e-03f, -2.993425932e-03f, -1.656773890e-03f, +4.776559314e-03f, -2.944064628e-03f, -7.081711396e-04f, +1.955059288e-03f, -9.809799530e-04f, +8.895597490e-05f, - /* 12, 3 */ +8.464715149e-04f, -6.407365814e-04f, -1.524162434e-03f, +3.840336583e-03f, -2.461816027e-03f, -2.275602698e-03f, +4.904341682e-03f, -2.553815646e-03f, -1.140836495e-03f, +2.102763165e-03f, -9.230670815e-04f, +1.349777819e-05f, - /* 12, 4 */ +7.639192828e-04f, -4.016125871e-04f, -1.776040886e-03f, +3.740131991e-03f, -1.894910812e-03f, -2.851629129e-03f, +4.944422783e-03f, -2.106045312e-03f, -1.569658753e-03f, +2.216140176e-03f, -8.389345160e-04f, -7.124952580e-05f, - /* 12, 5 */ +6.715456333e-04f, -1.706046467e-04f, -1.982015497e-03f, +3.574748146e-03f, -1.304005398e-03f, -3.374137989e-03f, +4.895165032e-03f, -1.608099956e-03f, -1.985807614e-03f, +2.290824513e-03f, -7.285864297e-04f, -1.638417811e-04f, - /* 12, 6 */ +5.723437636e-04f, +4.789167018e-05f, -2.140092391e-03f, +3.349394124e-03f, -7.006885404e-04f, -3.833503957e-03f, +4.756688774e-03f, -1.068504673e-03f, -2.380403858e-03f, +2.323091638e-03f, -5.926669574e-04f, -2.624916697e-04f, - /* 12, 7 */ +4.692537952e-04f, +2.500119139e-04f, -2.249361715e-03f, +3.070330944e-03f, -9.660032268e-05f, -4.221384345e-03f, +4.530883988e-03f, -4.968076992e-04f, -2.744711242e-03f, +2.309973659e-03f, -4.324830696e-04f, -3.650927179e-04f, - /* 12, 8 */ +3.650927179e-04f, +4.324830696e-04f, -2.309973659e-03f, +2.744711242e-03f, +4.968076992e-04f, -4.530883988e-03f, +4.221384345e-03f, +9.660032268e-05f, -3.070330944e-03f, +2.249361715e-03f, -2.500119139e-04f, -4.692537952e-04f, - /* 12, 9 */ +2.624916697e-04f, +5.926669574e-04f, -2.323091638e-03f, +2.380403858e-03f, +1.068504673e-03f, -4.756688774e-03f, +3.833503957e-03f, +7.006885404e-04f, -3.349394124e-03f, +2.140092391e-03f, -4.789167018e-05f, -5.723437636e-04f, - /* 12,10 */ +1.638417811e-04f, +7.285864297e-04f, -2.290824513e-03f, +1.985807614e-03f, +1.608099956e-03f, -4.895165032e-03f, +3.374137989e-03f, +1.304005398e-03f, -3.574748146e-03f, +1.982015497e-03f, +1.706046467e-04f, -6.715456333e-04f, - /* 12,11 */ +7.124952580e-05f, +8.389345160e-04f, -2.216140176e-03f, +1.569658753e-03f, +2.106045312e-03f, -4.944422783e-03f, +2.851629129e-03f, +1.894910812e-03f, -3.740131991e-03f, +1.776040886e-03f, +4.016125871e-04f, -7.639192828e-04f, - /* 12,12 */ -1.349777819e-05f, +9.230670815e-04f, -2.102763165e-03f, +1.140836495e-03f, +2.553815646e-03f, -4.904341682e-03f, +2.275602698e-03f, +2.461816027e-03f, -3.840336583e-03f, +1.524162434e-03f, +6.407365814e-04f, -8.464715149e-04f, - /* 12,13 */ -8.895597490e-05f, +9.809799530e-04f, -1.955059288e-03f, +7.081711396e-04f, +2.944064628e-03f, -4.776559314e-03f, +1.656773890e-03f, +2.993425932e-03f, -3.871345986e-03f, +1.229457804e-03f, +8.831264337e-04f, -9.162319547e-04f, - /* 12,14 */ -1.540375404e-04f, +1.013271813e-03f, -1.777910422e-03f, +2.802589631e-04f, +3.270752231e-03f, -4.564422369e-03f, +1.006731283e-03f, +3.478978472e-03f, -3.830455785e-03f, +8.960631472e-04f, +1.123568815e-03f, -9.703330579e-04f, - /* 12,15 */ -2.080147558e-04f, +1.021094463e-03f, -1.576582805e-03f, -1.347121185e-04f, +3.529241849e-03f, -4.272902045e-03f, +3.377012930e-04f, +3.908475818e-03f, -3.716365432e-03f, +5.291224839e-04f, +1.356592138e-03f, -1.006092301e-03f, - /* 12, 0 */ +7.165252154e-04f, -4.291307465e-04f, -1.619691310e-03f, +4.112050532e-03f, -3.684471854e-03f, -3.806742210e-04f, +4.167864669e-03f, -4.064044128e-03f, +1.285631838e-03f, +6.994376016e-04f, -8.205283947e-04f, +3.212754781e-04f, - /* 12, 1 */ +6.042449626e-04f, -1.684748882e-04f, -1.902468489e-03f, +4.073990388e-03f, -3.134198780e-03f, -1.133926469e-03f, +4.572939653e-03f, -3.928365474e-03f, +9.055999228e-04f, +9.731965741e-04f, -9.124383184e-04f, +3.311614162e-04f, - /* 12, 2 */ +4.874350434e-04f, +7.694308689e-05f, -2.130082097e-03f, +3.953363211e-03f, -2.529802622e-03f, -1.863076830e-03f, +4.889863669e-03f, -3.705392569e-03f, +4.862599326e-04f, +1.243729140e-03f, -9.884795125e-04f, +3.301883495e-04f, - /* 12, 3 */ +3.696734183e-04f, +3.022578517e-04f, -2.300114973e-03f, +3.755428771e-03f, -1.885047396e-03f, -2.552675098e-03f, +5.110657479e-03f, -3.397530000e-03f, +3.551878686e-05f, +1.504029611e-03f, -1.045032679e-03f, +3.171093301e-04f, - /* 12, 4 */ +2.542791637e-04f, +5.034105172e-04f, -2.411611526e-03f, +3.487034212e-03f, -1.214371318e-03f, -3.188181667e-03f, +5.229403271e-03f, -3.009202669e-03f, -4.376222644e-04f, +1.746934410e-03f, -1.078752986e-03f, +2.909691299e-04f, - /* 12, 5 */ +1.442362351e-04f, +6.772076791e-04f, -2.465038541e-03f, +3.156407157e-03f, -5.325427440e-04f, -3.756300237e-03f, +5.242404627e-03f, -2.546799451e-03f, -9.232494237e-04f, +1.965304174e-03f, -1.086687765e-03f, +2.511615343e-04f, - /* 12, 6 */ +4.213190220e-05f, +8.213542577e-04f, -2.462211671e-03f, +2.772920825e-03f, +1.456866600e-04f, -4.245279979e-03f, +5.148294544e-03f, -2.018567160e-03f, -1.410748009e-03f, +2.152214196e-03f, -1.066390037e-03f, +1.974793328e-04f, - /* 12, 7 */ -4.988918599e-05f, +9.344605010e-04f, -2.406190818e-03f, +2.346837790e-03f, +8.059229054e-04f, -4.645179801e-03f, +4.948088353e-03f, -1.434456490e-03f, -1.889039390e-03f, +2.301148282e-03f, -1.016024228e-03f, +1.301548676e-04f, - /* 12, 8 */ -1.301548676e-04f, +1.016024228e-03f, -2.301148282e-03f, +1.889039390e-03f, +1.434456490e-03f, -4.948088353e-03f, +4.645179801e-03f, -8.059229054e-04f, -2.346837790e-03f, +2.406190818e-03f, -9.344605010e-04f, +4.988918599e-05f, - /* 12, 9 */ -1.974793328e-04f, +1.066390037e-03f, -2.152214196e-03f, +1.410748009e-03f, +2.018567160e-03f, -5.148294544e-03f, +4.245279979e-03f, -1.456866600e-04f, -2.772920825e-03f, +2.462211671e-03f, -8.213542577e-04f, -4.213190220e-05f, - /* 12,10 */ -2.511615343e-04f, +1.086687765e-03f, -1.965304174e-03f, +9.232494237e-04f, +2.546799451e-03f, -5.242404627e-03f, +3.756300237e-03f, +5.325427440e-04f, -3.156407157e-03f, +2.465038541e-03f, -6.772076791e-04f, -1.442362351e-04f, - /* 12,11 */ -2.909691299e-04f, +1.078752986e-03f, -1.746934410e-03f, +4.376222644e-04f, +3.009202669e-03f, -5.229403271e-03f, +3.188181667e-03f, +1.214371318e-03f, -3.487034212e-03f, +2.411611526e-03f, -5.034105172e-04f, -2.542791637e-04f, - /* 12,12 */ -3.171093301e-04f, +1.045032679e-03f, -1.504029611e-03f, -3.551878686e-05f, +3.397530000e-03f, -5.110657479e-03f, +2.552675098e-03f, +1.885047396e-03f, -3.755428771e-03f, +2.300114973e-03f, -3.022578517e-04f, -3.696734183e-04f, - /* 12,13 */ -3.301883495e-04f, +9.884795125e-04f, -1.243729140e-03f, -4.862599326e-04f, +3.705392569e-03f, -4.889863669e-03f, +1.863076830e-03f, +2.529802622e-03f, -3.953363211e-03f, +2.130082097e-03f, -7.694308689e-05f, -4.874350434e-04f, - /* 12,14 */ -3.311614162e-04f, +9.124383184e-04f, -9.731965741e-04f, -9.055999228e-04f, +3.928365474e-03f, -4.572939653e-03f, +1.133926469e-03f, +3.134198780e-03f, -4.073990388e-03f, +1.902468489e-03f, +1.684748882e-04f, -6.042449626e-04f, - /* 12,15 */ -3.212754781e-04f, +8.205283947e-04f, -6.994376016e-04f, -1.285631838e-03f, +4.064044128e-03f, -4.167864669e-03f, +3.806742210e-04f, +3.684471854e-03f, -4.112050532e-03f, +1.619691310e-03f, +4.291307465e-04f, -7.165252154e-04f -}; - -alignas(16) const ALfloat sinc4Tab[4096][4] = -{ - { +1.972846707e-17f, +1.000000000e+00f, +1.972846707e-17f, -7.947592825e-19f }, - { -1.234844220e-04f, +9.999998638e-01f, +1.236324705e-04f, -2.493930525e-06f }, - { -2.468208365e-04f, +9.999994551e-01f, +2.474130305e-04f, -4.998192808e-06f }, - { -3.700092848e-04f, +9.999987739e-01f, +3.713417210e-04f, -7.512801591e-06f }, - { -4.930498082e-04f, +9.999978203e-01f, +4.954185828e-04f, -1.003777162e-05f }, - { -6.159424479e-04f, +9.999965942e-01f, +6.196436566e-04f, -1.257311763e-05f }, - { -7.386872455e-04f, +9.999950956e-01f, +7.440169831e-04f, -1.511885438e-05f }, - { -8.612842424e-04f, +9.999933246e-01f, +8.685386028e-04f, -1.767499661e-05f }, - { -9.837334803e-04f, +9.999912812e-01f, +9.932085563e-04f, -2.024155907e-05f }, - { -1.106035001e-03f, +9.999889652e-01f, +1.118026884e-03f, -2.281855651e-05f }, - { -1.228188846e-03f, +9.999863768e-01f, +1.242993626e-03f, -2.540600368e-05f }, - { -1.350195058e-03f, +9.999835160e-01f, +1.368108822e-03f, -2.800391533e-05f }, - { -1.472053677e-03f, +9.999803827e-01f, +1.493372514e-03f, -3.061230620e-05f }, - { -1.593764748e-03f, +9.999769770e-01f, +1.618784740e-03f, -3.323119106e-05f }, - { -1.715328311e-03f, +9.999732988e-01f, +1.744345541e-03f, -3.586058466e-05f }, - { -1.836744408e-03f, +9.999693481e-01f, +1.870054956e-03f, -3.850050175e-05f }, - { -1.958013083e-03f, +9.999651250e-01f, +1.995913026e-03f, -4.115095708e-05f }, - { -2.079134377e-03f, +9.999606295e-01f, +2.121919790e-03f, -4.381196542e-05f }, - { -2.200108333e-03f, +9.999558615e-01f, +2.248075287e-03f, -4.648354151e-05f }, - { -2.320934994e-03f, +9.999508211e-01f, +2.374379558e-03f, -4.916570012e-05f }, - { -2.441614402e-03f, +9.999455083e-01f, +2.500832641e-03f, -5.185845600e-05f }, - { -2.562146601e-03f, +9.999399230e-01f, +2.627434576e-03f, -5.456182391e-05f }, - { -2.682531632e-03f, +9.999340653e-01f, +2.754185402e-03f, -5.727581862e-05f }, - { -2.802769538e-03f, +9.999279352e-01f, +2.881085158e-03f, -6.000045487e-05f }, - { -2.922860364e-03f, +9.999215326e-01f, +3.008133883e-03f, -6.273574744e-05f }, - { -3.042804151e-03f, +9.999148577e-01f, +3.135331617e-03f, -6.548171107e-05f }, - { -3.162600944e-03f, +9.999079103e-01f, +3.262678397e-03f, -6.823836055e-05f }, - { -3.282250785e-03f, +9.999006906e-01f, +3.390174264e-03f, -7.100571061e-05f }, - { -3.401753717e-03f, +9.998931984e-01f, +3.517819255e-03f, -7.378377604e-05f }, - { -3.521109785e-03f, +9.998854338e-01f, +3.645613409e-03f, -7.657257158e-05f }, - { -3.640319031e-03f, +9.998773969e-01f, +3.773556765e-03f, -7.937211202e-05f }, - { -3.759381500e-03f, +9.998690875e-01f, +3.901649361e-03f, -8.218241209e-05f }, - { -3.878297235e-03f, +9.998605058e-01f, +4.029891236e-03f, -8.500348659e-05f }, - { -3.997066279e-03f, +9.998516517e-01f, +4.158282427e-03f, -8.783535025e-05f }, - { -4.115688677e-03f, +9.998425252e-01f, +4.286822973e-03f, -9.067801786e-05f }, - { -4.234164473e-03f, +9.998331264e-01f, +4.415512912e-03f, -9.353150418e-05f }, - { -4.352493710e-03f, +9.998234552e-01f, +4.544352281e-03f, -9.639582397e-05f }, - { -4.470676433e-03f, +9.998135116e-01f, +4.673341119e-03f, -9.927099199e-05f }, - { -4.588712686e-03f, +9.998032957e-01f, +4.802479464e-03f, -1.021570230e-04f }, - { -4.706602513e-03f, +9.997928075e-01f, +4.931767353e-03f, -1.050539318e-04f }, - { -4.824345959e-03f, +9.997820469e-01f, +5.061204824e-03f, -1.079617332e-04f }, - { -4.941943068e-03f, +9.997710141e-01f, +5.190791913e-03f, -1.108804418e-04f }, - { -5.059393885e-03f, +9.997597089e-01f, +5.320528660e-03f, -1.138100725e-04f }, - { -5.176698454e-03f, +9.997481313e-01f, +5.450415101e-03f, -1.167506400e-04f }, - { -5.293856820e-03f, +9.997362815e-01f, +5.580451273e-03f, -1.197021592e-04f }, - { -5.410869028e-03f, +9.997241594e-01f, +5.710637213e-03f, -1.226646447e-04f }, - { -5.527735122e-03f, +9.997117650e-01f, +5.840972959e-03f, -1.256381113e-04f }, - { -5.644455148e-03f, +9.996990983e-01f, +5.971458547e-03f, -1.286225739e-04f }, - { -5.761029151e-03f, +9.996861593e-01f, +6.102094014e-03f, -1.316180471e-04f }, - { -5.877457176e-03f, +9.996729481e-01f, +6.232879398e-03f, -1.346245458e-04f }, - { -5.993739268e-03f, +9.996594646e-01f, +6.363814734e-03f, -1.376420846e-04f }, - { -6.109875472e-03f, +9.996457089e-01f, +6.494900059e-03f, -1.406706784e-04f }, - { -6.225865834e-03f, +9.996316809e-01f, +6.626135411e-03f, -1.437103420e-04f }, - { -6.341710400e-03f, +9.996173807e-01f, +6.757520824e-03f, -1.467610900e-04f }, - { -6.457409214e-03f, +9.996028083e-01f, +6.889056337e-03f, -1.498229373e-04f }, - { -6.572962323e-03f, +9.995879637e-01f, +7.020741983e-03f, -1.528958987e-04f }, - { -6.688369772e-03f, +9.995728468e-01f, +7.152577801e-03f, -1.559799888e-04f }, - { -6.803631606e-03f, +9.995574578e-01f, +7.284563826e-03f, -1.590752225e-04f }, - { -6.918747873e-03f, +9.995417966e-01f, +7.416700094e-03f, -1.621816145e-04f }, - { -7.033718618e-03f, +9.995258632e-01f, +7.548986640e-03f, -1.652991797e-04f }, - { -7.148543887e-03f, +9.995096577e-01f, +7.681423501e-03f, -1.684279326e-04f }, - { -7.263223725e-03f, +9.994931800e-01f, +7.814010713e-03f, -1.715678882e-04f }, - { -7.377758181e-03f, +9.994764302e-01f, +7.946748310e-03f, -1.747190612e-04f }, - { -7.492147298e-03f, +9.994594082e-01f, +8.079636328e-03f, -1.778814663e-04f }, - { -7.606391125e-03f, +9.994421141e-01f, +8.212674803e-03f, -1.810551183e-04f }, - { -7.720489707e-03f, +9.994245479e-01f, +8.345863769e-03f, -1.842400320e-04f }, - { -7.834443092e-03f, +9.994067096e-01f, +8.479203263e-03f, -1.874362221e-04f }, - { -7.948251325e-03f, +9.993885992e-01f, +8.612693320e-03f, -1.906437034e-04f }, - { -8.061914453e-03f, +9.993702168e-01f, +8.746333973e-03f, -1.938624906e-04f }, - { -8.175432524e-03f, +9.993515622e-01f, +8.880125258e-03f, -1.970925985e-04f }, - { -8.288805583e-03f, +9.993326357e-01f, +9.014067211e-03f, -2.003340419e-04f }, - { -8.402033679e-03f, +9.993134371e-01f, +9.148159865e-03f, -2.035868356e-04f }, - { -8.515116858e-03f, +9.992939664e-01f, +9.282403256e-03f, -2.068509942e-04f }, - { -8.628055168e-03f, +9.992742238e-01f, +9.416797418e-03f, -2.101265325e-04f }, - { -8.740848654e-03f, +9.992542091e-01f, +9.551342385e-03f, -2.134134654e-04f }, - { -8.853497366e-03f, +9.992339225e-01f, +9.686038192e-03f, -2.167118075e-04f }, - { -8.966001349e-03f, +9.992133639e-01f, +9.820884872e-03f, -2.200215735e-04f }, - { -9.078360653e-03f, +9.991925333e-01f, +9.955882461e-03f, -2.233427784e-04f }, - { -9.190575323e-03f, +9.991714307e-01f, +1.009103099e-02f, -2.266754367e-04f }, - { -9.302645409e-03f, +9.991500563e-01f, +1.022633050e-02f, -2.300195634e-04f }, - { -9.414570956e-03f, +9.991284099e-01f, +1.036178102e-02f, -2.333751730e-04f }, - { -9.526352014e-03f, +9.991064916e-01f, +1.049738258e-02f, -2.367422804e-04f }, - { -9.637988631e-03f, +9.990843014e-01f, +1.063313522e-02f, -2.401209002e-04f }, - { -9.749480853e-03f, +9.990618393e-01f, +1.076903897e-02f, -2.435110474e-04f }, - { -9.860828729e-03f, +9.990391053e-01f, +1.090509386e-02f, -2.469127365e-04f }, - { -9.972032308e-03f, +9.990160995e-01f, +1.104129994e-02f, -2.503259824e-04f }, - { -1.008309164e-02f, +9.989928219e-01f, +1.117765722e-02f, -2.537507998e-04f }, - { -1.019400677e-02f, +9.989692724e-01f, +1.131416575e-02f, -2.571872034e-04f }, - { -1.030477774e-02f, +9.989454512e-01f, +1.145082556e-02f, -2.606352080e-04f }, - { -1.041540461e-02f, +9.989213581e-01f, +1.158763668e-02f, -2.640948284e-04f }, - { -1.052588743e-02f, +9.988969933e-01f, +1.172459914e-02f, -2.675660791e-04f }, - { -1.063622623e-02f, +9.988723567e-01f, +1.186171298e-02f, -2.710489751e-04f }, - { -1.074642108e-02f, +9.988474483e-01f, +1.199897823e-02f, -2.745435310e-04f }, - { -1.085647202e-02f, +9.988222682e-01f, +1.213639492e-02f, -2.780497616e-04f }, - { -1.096637910e-02f, +9.987968164e-01f, +1.227396308e-02f, -2.815676816e-04f }, - { -1.107614236e-02f, +9.987710929e-01f, +1.241168275e-02f, -2.850973058e-04f }, - { -1.118576186e-02f, +9.987450978e-01f, +1.254955397e-02f, -2.886386488e-04f }, - { -1.129523765e-02f, +9.987188309e-01f, +1.268757675e-02f, -2.921917254e-04f }, - { -1.140456977e-02f, +9.986922924e-01f, +1.282575114e-02f, -2.957565503e-04f }, - { -1.151375828e-02f, +9.986654823e-01f, +1.296407716e-02f, -2.993331383e-04f }, - { -1.162280322e-02f, +9.986384006e-01f, +1.310255485e-02f, -3.029215041e-04f }, - { -1.173170465e-02f, +9.986110473e-01f, +1.324118424e-02f, -3.065216624e-04f }, - { -1.184046260e-02f, +9.985834223e-01f, +1.337996537e-02f, -3.101336280e-04f }, - { -1.194907714e-02f, +9.985555259e-01f, +1.351889825e-02f, -3.137574155e-04f }, - { -1.205754831e-02f, +9.985273578e-01f, +1.365798293e-02f, -3.173930397e-04f }, - { -1.216587616e-02f, +9.984989183e-01f, +1.379721944e-02f, -3.210405152e-04f }, - { -1.227406075e-02f, +9.984702072e-01f, +1.393660781e-02f, -3.246998569e-04f }, - { -1.238210211e-02f, +9.984412247e-01f, +1.407614806e-02f, -3.283710794e-04f }, - { -1.249000030e-02f, +9.984119707e-01f, +1.421584024e-02f, -3.320541975e-04f }, - { -1.259775538e-02f, +9.983824452e-01f, +1.435568436e-02f, -3.357492258e-04f }, - { -1.270536739e-02f, +9.983526483e-01f, +1.449568047e-02f, -3.394561791e-04f }, - { -1.281283638e-02f, +9.983225800e-01f, +1.463582860e-02f, -3.431750720e-04f }, - { -1.292016240e-02f, +9.982922403e-01f, +1.477612876e-02f, -3.469059193e-04f }, - { -1.302734550e-02f, +9.982616292e-01f, +1.491658101e-02f, -3.506487357e-04f }, - { -1.313438573e-02f, +9.982307467e-01f, +1.505718535e-02f, -3.544035359e-04f }, - { -1.324128315e-02f, +9.981995929e-01f, +1.519794184e-02f, -3.581703346e-04f }, - { -1.334803780e-02f, +9.981681678e-01f, +1.533885049e-02f, -3.619491465e-04f }, - { -1.345464973e-02f, +9.981364714e-01f, +1.547991134e-02f, -3.657399862e-04f }, - { -1.356111900e-02f, +9.981045038e-01f, +1.562112441e-02f, -3.695428686e-04f }, - { -1.366744566e-02f, +9.980722648e-01f, +1.576248975e-02f, -3.733578082e-04f }, - { -1.377362975e-02f, +9.980397546e-01f, +1.590400737e-02f, -3.771848197e-04f }, - { -1.387967133e-02f, +9.980069732e-01f, +1.604567730e-02f, -3.810239179e-04f }, - { -1.398557045e-02f, +9.979739207e-01f, +1.618749959e-02f, -3.848751175e-04f }, - { -1.409132716e-02f, +9.979405969e-01f, +1.632947425e-02f, -3.887384331e-04f }, - { -1.419694151e-02f, +9.979070020e-01f, +1.647160132e-02f, -3.926138794e-04f }, - { -1.430241355e-02f, +9.978731359e-01f, +1.661388082e-02f, -3.965014710e-04f }, - { -1.440774333e-02f, +9.978389988e-01f, +1.675631280e-02f, -4.004012227e-04f }, - { -1.451293091e-02f, +9.978045905e-01f, +1.689889726e-02f, -4.043131492e-04f }, - { -1.461797634e-02f, +9.977699112e-01f, +1.704163425e-02f, -4.082372651e-04f }, - { -1.472287966e-02f, +9.977349608e-01f, +1.718452380e-02f, -4.121735850e-04f }, - { -1.482764093e-02f, +9.976997395e-01f, +1.732756592e-02f, -4.161221238e-04f }, - { -1.493226021e-02f, +9.976642471e-01f, +1.747076066e-02f, -4.200828959e-04f }, - { -1.503673754e-02f, +9.976284837e-01f, +1.761410804e-02f, -4.240559161e-04f }, - { -1.514107297e-02f, +9.975924494e-01f, +1.775760809e-02f, -4.280411991e-04f }, - { -1.524526657e-02f, +9.975561442e-01f, +1.790126083e-02f, -4.320387594e-04f }, - { -1.534931837e-02f, +9.975195680e-01f, +1.804506631e-02f, -4.360486119e-04f }, - { -1.545322843e-02f, +9.974827210e-01f, +1.818902453e-02f, -4.400707710e-04f }, - { -1.555699680e-02f, +9.974456031e-01f, +1.833313554e-02f, -4.441052515e-04f }, - { -1.566062355e-02f, +9.974082143e-01f, +1.847739937e-02f, -4.481520680e-04f }, - { -1.576410871e-02f, +9.973705548e-01f, +1.862181603e-02f, -4.522112352e-04f }, - { -1.586745234e-02f, +9.973326244e-01f, +1.876638556e-02f, -4.562827677e-04f }, - { -1.597065449e-02f, +9.972944233e-01f, +1.891110799e-02f, -4.603666801e-04f }, - { -1.607371522e-02f, +9.972559515e-01f, +1.905598334e-02f, -4.644629872e-04f }, - { -1.617663458e-02f, +9.972172089e-01f, +1.920101164e-02f, -4.685717034e-04f }, - { -1.627941262e-02f, +9.971781956e-01f, +1.934619292e-02f, -4.726928435e-04f }, - { -1.638204939e-02f, +9.971389117e-01f, +1.949152721e-02f, -4.768264221e-04f }, - { -1.648454495e-02f, +9.970993571e-01f, +1.963701453e-02f, -4.809724538e-04f }, - { -1.658689935e-02f, +9.970595319e-01f, +1.978265492e-02f, -4.851309533e-04f }, - { -1.668911265e-02f, +9.970194362e-01f, +1.992844839e-02f, -4.893019351e-04f }, - { -1.679118489e-02f, +9.969790698e-01f, +2.007439498e-02f, -4.934854139e-04f }, - { -1.689311613e-02f, +9.969384329e-01f, +2.022049471e-02f, -4.976814042e-04f }, - { -1.699490642e-02f, +9.968975255e-01f, +2.036674762e-02f, -5.018899208e-04f }, - { -1.709655581e-02f, +9.968563476e-01f, +2.051315372e-02f, -5.061109782e-04f }, - { -1.719806437e-02f, +9.968148993e-01f, +2.065971304e-02f, -5.103445911e-04f }, - { -1.729943214e-02f, +9.967731805e-01f, +2.080642562e-02f, -5.145907739e-04f }, - { -1.740065918e-02f, +9.967311913e-01f, +2.095329147e-02f, -5.188495414e-04f }, - { -1.750174553e-02f, +9.966889317e-01f, +2.110031063e-02f, -5.231209082e-04f }, - { -1.760269126e-02f, +9.966464017e-01f, +2.124748312e-02f, -5.274048887e-04f }, - { -1.770349642e-02f, +9.966036014e-01f, +2.139480896e-02f, -5.317014977e-04f }, - { -1.780416106e-02f, +9.965605309e-01f, +2.154228819e-02f, -5.360107497e-04f }, - { -1.790468523e-02f, +9.965171900e-01f, +2.168992083e-02f, -5.403326592e-04f }, - { -1.800506899e-02f, +9.964735789e-01f, +2.183770690e-02f, -5.446672410e-04f }, - { -1.810531240e-02f, +9.964296976e-01f, +2.198564643e-02f, -5.490145094e-04f }, - { -1.820541550e-02f, +9.963855461e-01f, +2.213373945e-02f, -5.533744792e-04f }, - { -1.830537836e-02f, +9.963411244e-01f, +2.228198598e-02f, -5.577471650e-04f }, - { -1.840520102e-02f, +9.962964326e-01f, +2.243038605e-02f, -5.621325811e-04f }, - { -1.850488354e-02f, +9.962514707e-01f, +2.257893968e-02f, -5.665307423e-04f }, - { -1.860442598e-02f, +9.962062387e-01f, +2.272764690e-02f, -5.709416631e-04f }, - { -1.870382839e-02f, +9.961607366e-01f, +2.287650774e-02f, -5.753653581e-04f }, - { -1.880309082e-02f, +9.961149645e-01f, +2.302552221e-02f, -5.798018418e-04f }, - { -1.890221333e-02f, +9.960689225e-01f, +2.317469035e-02f, -5.842511287e-04f }, - { -1.900119597e-02f, +9.960226105e-01f, +2.332401218e-02f, -5.887132334e-04f }, - { -1.910003880e-02f, +9.959760285e-01f, +2.347348772e-02f, -5.931881705e-04f }, - { -1.919874188e-02f, +9.959291766e-01f, +2.362311700e-02f, -5.976759545e-04f }, - { -1.929730525e-02f, +9.958820549e-01f, +2.377290004e-02f, -6.021765999e-04f }, - { -1.939572898e-02f, +9.958346633e-01f, +2.392283688e-02f, -6.066901213e-04f }, - { -1.949401312e-02f, +9.957870019e-01f, +2.407292752e-02f, -6.112165332e-04f }, - { -1.959215772e-02f, +9.957390708e-01f, +2.422317200e-02f, -6.157558500e-04f }, - { -1.969016283e-02f, +9.956908698e-01f, +2.437357035e-02f, -6.203080865e-04f }, - { -1.978802853e-02f, +9.956423992e-01f, +2.452412258e-02f, -6.248732570e-04f }, - { -1.988575485e-02f, +9.955936589e-01f, +2.467482872e-02f, -6.294513760e-04f }, - { -1.998334185e-02f, +9.955446489e-01f, +2.482568879e-02f, -6.340424582e-04f }, - { -2.008078960e-02f, +9.954953692e-01f, +2.497670282e-02f, -6.386465180e-04f }, - { -2.017809815e-02f, +9.954458200e-01f, +2.512787083e-02f, -6.432635698e-04f }, - { -2.027526754e-02f, +9.953960012e-01f, +2.527919285e-02f, -6.478936283e-04f }, - { -2.037229785e-02f, +9.953459129e-01f, +2.543066889e-02f, -6.525367078e-04f }, - { -2.046918912e-02f, +9.952955551e-01f, +2.558229899e-02f, -6.571928229e-04f }, - { -2.056594140e-02f, +9.952449278e-01f, +2.573408316e-02f, -6.618619881e-04f }, - { -2.066255477e-02f, +9.951940310e-01f, +2.588602143e-02f, -6.665442179e-04f }, - { -2.075902926e-02f, +9.951428649e-01f, +2.603811383e-02f, -6.712395266e-04f }, - { -2.085536494e-02f, +9.950914294e-01f, +2.619036036e-02f, -6.759479289e-04f }, - { -2.095156187e-02f, +9.950397245e-01f, +2.634276107e-02f, -6.806694392e-04f }, - { -2.104762010e-02f, +9.949877504e-01f, +2.649531596e-02f, -6.854040719e-04f }, - { -2.114353968e-02f, +9.949355069e-01f, +2.664802507e-02f, -6.901518415e-04f }, - { -2.123932068e-02f, +9.948829943e-01f, +2.680088842e-02f, -6.949127625e-04f }, - { -2.133496314e-02f, +9.948302124e-01f, +2.695390602e-02f, -6.996868493e-04f }, - { -2.143046713e-02f, +9.947771613e-01f, +2.710707790e-02f, -7.044741164e-04f }, - { -2.152583271e-02f, +9.947238411e-01f, +2.726040409e-02f, -7.092745782e-04f }, - { -2.162105992e-02f, +9.946702518e-01f, +2.741388460e-02f, -7.140882492e-04f }, - { -2.171614883e-02f, +9.946163934e-01f, +2.756751946e-02f, -7.189151437e-04f }, - { -2.181109950e-02f, +9.945622660e-01f, +2.772130869e-02f, -7.237552763e-04f }, - { -2.190591197e-02f, +9.945078696e-01f, +2.787525232e-02f, -7.286086614e-04f }, - { -2.200058631e-02f, +9.944532042e-01f, +2.802935035e-02f, -7.334753133e-04f }, - { -2.209512257e-02f, +9.943982699e-01f, +2.818360282e-02f, -7.383552465e-04f }, - { -2.218952082e-02f, +9.943430666e-01f, +2.833800975e-02f, -7.432484754e-04f }, - { -2.228378110e-02f, +9.942875945e-01f, +2.849257115e-02f, -7.481550144e-04f }, - { -2.237790348e-02f, +9.942318536e-01f, +2.864728706e-02f, -7.530748780e-04f }, - { -2.247188802e-02f, +9.941758439e-01f, +2.880215748e-02f, -7.580080805e-04f }, - { -2.256573476e-02f, +9.941195654e-01f, +2.895718245e-02f, -7.629546363e-04f }, - { -2.265944377e-02f, +9.940630182e-01f, +2.911236198e-02f, -7.679145598e-04f }, - { -2.275301511e-02f, +9.940062023e-01f, +2.926769610e-02f, -7.728878654e-04f }, - { -2.284644883e-02f, +9.939491178e-01f, +2.942318481e-02f, -7.778745675e-04f }, - { -2.293974499e-02f, +9.938917647e-01f, +2.957882816e-02f, -7.828746805e-04f }, - { -2.303290364e-02f, +9.938341429e-01f, +2.973462615e-02f, -7.878882187e-04f }, - { -2.312592486e-02f, +9.937762527e-01f, +2.989057881e-02f, -7.929151965e-04f }, - { -2.321880869e-02f, +9.937180939e-01f, +3.004668616e-02f, -7.979556282e-04f }, - { -2.331155519e-02f, +9.936596666e-01f, +3.020294821e-02f, -8.030095283e-04f }, - { -2.340416442e-02f, +9.936009710e-01f, +3.035936500e-02f, -8.080769110e-04f }, - { -2.349663644e-02f, +9.935420069e-01f, +3.051593653e-02f, -8.131577908e-04f }, - { -2.358897131e-02f, +9.934827745e-01f, +3.067266283e-02f, -8.182521819e-04f }, - { -2.368116908e-02f, +9.934232738e-01f, +3.082954391e-02f, -8.233600987e-04f }, - { -2.377322981e-02f, +9.933635047e-01f, +3.098657981e-02f, -8.284815556e-04f }, - { -2.386515357e-02f, +9.933034675e-01f, +3.114377053e-02f, -8.336165668e-04f }, - { -2.395694040e-02f, +9.932431620e-01f, +3.130111610e-02f, -8.387651466e-04f }, - { -2.404859038e-02f, +9.931825884e-01f, +3.145861654e-02f, -8.439273095e-04f }, - { -2.414010355e-02f, +9.931217466e-01f, +3.161627187e-02f, -8.491030697e-04f }, - { -2.423147998e-02f, +9.930606368e-01f, +3.177408210e-02f, -8.542924415e-04f }, - { -2.432271972e-02f, +9.929992589e-01f, +3.193204725e-02f, -8.594954392e-04f }, - { -2.441382283e-02f, +9.929376130e-01f, +3.209016735e-02f, -8.647120771e-04f }, - { -2.450478938e-02f, +9.928756991e-01f, +3.224844242e-02f, -8.699423695e-04f }, - { -2.459561942e-02f, +9.928135173e-01f, +3.240687246e-02f, -8.751863308e-04f }, - { -2.468631300e-02f, +9.927510676e-01f, +3.256545750e-02f, -8.804439750e-04f }, - { -2.477687020e-02f, +9.926883501e-01f, +3.272419757e-02f, -8.857153167e-04f }, - { -2.486729107e-02f, +9.926253647e-01f, +3.288309267e-02f, -8.910003699e-04f }, - { -2.495757566e-02f, +9.925621116e-01f, +3.304214283e-02f, -8.962991490e-04f }, - { -2.504772404e-02f, +9.924985907e-01f, +3.320134807e-02f, -9.016116683e-04f }, - { -2.513773626e-02f, +9.924348021e-01f, +3.336070839e-02f, -9.069379419e-04f }, - { -2.522761239e-02f, +9.923707459e-01f, +3.352022383e-02f, -9.122779842e-04f }, - { -2.531735249e-02f, +9.923064221e-01f, +3.367989440e-02f, -9.176318093e-04f }, - { -2.540695661e-02f, +9.922418307e-01f, +3.383972011e-02f, -9.229994316e-04f }, - { -2.549642481e-02f, +9.921769718e-01f, +3.399970099e-02f, -9.283808652e-04f }, - { -2.558575716e-02f, +9.921118453e-01f, +3.415983706e-02f, -9.337761243e-04f }, - { -2.567495371e-02f, +9.920464515e-01f, +3.432012832e-02f, -9.391852233e-04f }, - { -2.576401452e-02f, +9.919807902e-01f, +3.448057480e-02f, -9.446081762e-04f }, - { -2.585293966e-02f, +9.919148616e-01f, +3.464117652e-02f, -9.500449974e-04f }, - { -2.594172918e-02f, +9.918486656e-01f, +3.480193349e-02f, -9.554957009e-04f }, - { -2.603038315e-02f, +9.917822024e-01f, +3.496284573e-02f, -9.609603011e-04f }, - { -2.611890161e-02f, +9.917154719e-01f, +3.512391325e-02f, -9.664388120e-04f }, - { -2.620728464e-02f, +9.916484743e-01f, +3.528513608e-02f, -9.719312480e-04f }, - { -2.629553230e-02f, +9.915812094e-01f, +3.544651423e-02f, -9.774376231e-04f }, - { -2.638364463e-02f, +9.915136775e-01f, +3.560804772e-02f, -9.829579515e-04f }, - { -2.647162171e-02f, +9.914458785e-01f, +3.576973656e-02f, -9.884922474e-04f }, - { -2.655946360e-02f, +9.913778125e-01f, +3.593158078e-02f, -9.940405249e-04f }, - { -2.664717035e-02f, +9.913094795e-01f, +3.609358038e-02f, -9.996027983e-04f }, - { -2.673474203e-02f, +9.912408796e-01f, +3.625573538e-02f, -1.005179082e-03f }, - { -2.682217869e-02f, +9.911720128e-01f, +3.641804581e-02f, -1.010769389e-03f }, - { -2.690948040e-02f, +9.911028791e-01f, +3.658051167e-02f, -1.016373735e-03f }, - { -2.699664722e-02f, +9.910334786e-01f, +3.674313298e-02f, -1.021992133e-03f }, - { -2.708367921e-02f, +9.909638114e-01f, +3.690590976e-02f, -1.027624597e-03f }, - { -2.717057642e-02f, +9.908938774e-01f, +3.706884203e-02f, -1.033271142e-03f }, - { -2.725733893e-02f, +9.908236768e-01f, +3.723192979e-02f, -1.038931782e-03f }, - { -2.734396678e-02f, +9.907532095e-01f, +3.739517307e-02f, -1.044606531e-03f }, - { -2.743046005e-02f, +9.906824756e-01f, +3.755857188e-02f, -1.050295402e-03f }, - { -2.751681879e-02f, +9.906114753e-01f, +3.772212623e-02f, -1.055998411e-03f }, - { -2.760304307e-02f, +9.905402084e-01f, +3.788583615e-02f, -1.061715570e-03f }, - { -2.768913294e-02f, +9.904686751e-01f, +3.804970164e-02f, -1.067446895e-03f }, - { -2.777508847e-02f, +9.903968753e-01f, +3.821372273e-02f, -1.073192399e-03f }, - { -2.786090972e-02f, +9.903248092e-01f, +3.837789942e-02f, -1.078952096e-03f }, - { -2.794659675e-02f, +9.902524768e-01f, +3.854223173e-02f, -1.084726001e-03f }, - { -2.803214962e-02f, +9.901798782e-01f, +3.870671968e-02f, -1.090514127e-03f }, - { -2.811756839e-02f, +9.901070133e-01f, +3.887136328e-02f, -1.096316489e-03f }, - { -2.820285313e-02f, +9.900338822e-01f, +3.903616254e-02f, -1.102133100e-03f }, - { -2.828800389e-02f, +9.899604850e-01f, +3.920111748e-02f, -1.107963974e-03f }, - { -2.837302075e-02f, +9.898868218e-01f, +3.936622812e-02f, -1.113809126e-03f }, - { -2.845790375e-02f, +9.898128925e-01f, +3.953149447e-02f, -1.119668570e-03f }, - { -2.854265296e-02f, +9.897386972e-01f, +3.969691653e-02f, -1.125542319e-03f }, - { -2.862726845e-02f, +9.896642360e-01f, +3.986249434e-02f, -1.131430388e-03f }, - { -2.871175028e-02f, +9.895895088e-01f, +4.002822789e-02f, -1.137332791e-03f }, - { -2.879609850e-02f, +9.895145159e-01f, +4.019411721e-02f, -1.143249541e-03f }, - { -2.888031318e-02f, +9.894392571e-01f, +4.036016230e-02f, -1.149180652e-03f }, - { -2.896439439e-02f, +9.893637326e-01f, +4.052636319e-02f, -1.155126140e-03f }, - { -2.904834218e-02f, +9.892879424e-01f, +4.069271988e-02f, -1.161086016e-03f }, - { -2.913215661e-02f, +9.892118865e-01f, +4.085923238e-02f, -1.167060297e-03f }, - { -2.921583776e-02f, +9.891355651e-01f, +4.102590072e-02f, -1.173048994e-03f }, - { -2.929938568e-02f, +9.890589780e-01f, +4.119272490e-02f, -1.179052123e-03f }, - { -2.938280043e-02f, +9.889821255e-01f, +4.135970494e-02f, -1.185069698e-03f }, - { -2.946608208e-02f, +9.889050075e-01f, +4.152684085e-02f, -1.191101731e-03f }, - { -2.954923069e-02f, +9.888276241e-01f, +4.169413264e-02f, -1.197148238e-03f }, - { -2.963224632e-02f, +9.887499753e-01f, +4.186158033e-02f, -1.203209232e-03f }, - { -2.971512904e-02f, +9.886720613e-01f, +4.202918393e-02f, -1.209284727e-03f }, - { -2.979787891e-02f, +9.885938819e-01f, +4.219694344e-02f, -1.215374737e-03f }, - { -2.988049599e-02f, +9.885154374e-01f, +4.236485889e-02f, -1.221479275e-03f }, - { -2.996298034e-02f, +9.884367276e-01f, +4.253293028e-02f, -1.227598357e-03f }, - { -3.004533202e-02f, +9.883577528e-01f, +4.270115763e-02f, -1.233731995e-03f }, - { -3.012755111e-02f, +9.882785129e-01f, +4.286954095e-02f, -1.239880203e-03f }, - { -3.020963766e-02f, +9.881990080e-01f, +4.303808025e-02f, -1.246042996e-03f }, - { -3.029159174e-02f, +9.881192381e-01f, +4.320677555e-02f, -1.252220388e-03f }, - { -3.037341341e-02f, +9.880392034e-01f, +4.337562684e-02f, -1.258412391e-03f }, - { -3.045510273e-02f, +9.879589037e-01f, +4.354463416e-02f, -1.264619020e-03f }, - { -3.053665977e-02f, +9.878783393e-01f, +4.371379750e-02f, -1.270840289e-03f }, - { -3.061808459e-02f, +9.877975101e-01f, +4.388311688e-02f, -1.277076211e-03f }, - { -3.069937725e-02f, +9.877164161e-01f, +4.405259231e-02f, -1.283326801e-03f }, - { -3.078053782e-02f, +9.876350576e-01f, +4.422222380e-02f, -1.289592072e-03f }, - { -3.086156636e-02f, +9.875534344e-01f, +4.439201136e-02f, -1.295872038e-03f }, - { -3.094246293e-02f, +9.874715467e-01f, +4.456195501e-02f, -1.302166714e-03f }, - { -3.102322761e-02f, +9.873893944e-01f, +4.473205475e-02f, -1.308476111e-03f }, - { -3.110386044e-02f, +9.873069778e-01f, +4.490231060e-02f, -1.314800245e-03f }, - { -3.118436150e-02f, +9.872242967e-01f, +4.507272256e-02f, -1.321139130e-03f }, - { -3.126473085e-02f, +9.871413513e-01f, +4.524329065e-02f, -1.327492778e-03f }, - { -3.134496856e-02f, +9.870581415e-01f, +4.541401487e-02f, -1.333861204e-03f }, - { -3.142507468e-02f, +9.869746676e-01f, +4.558489524e-02f, -1.340244422e-03f }, - { -3.150504929e-02f, +9.868909295e-01f, +4.575593177e-02f, -1.346642444e-03f }, - { -3.158489244e-02f, +9.868069272e-01f, +4.592712446e-02f, -1.353055286e-03f }, - { -3.166460421e-02f, +9.867226608e-01f, +4.609847333e-02f, -1.359482960e-03f }, - { -3.174418465e-02f, +9.866381305e-01f, +4.626997838e-02f, -1.365925481e-03f }, - { -3.182363382e-02f, +9.865533361e-01f, +4.644163964e-02f, -1.372382862e-03f }, - { -3.190295181e-02f, +9.864682779e-01f, +4.661345709e-02f, -1.378855117e-03f }, - { -3.198213866e-02f, +9.863829557e-01f, +4.678543077e-02f, -1.385342260e-03f }, - { -3.206119444e-02f, +9.862973698e-01f, +4.695756066e-02f, -1.391844303e-03f }, - { -3.214011922e-02f, +9.862115201e-01f, +4.712984679e-02f, -1.398361262e-03f }, - { -3.221891307e-02f, +9.861254067e-01f, +4.730228917e-02f, -1.404893149e-03f }, - { -3.229757604e-02f, +9.860390297e-01f, +4.747488779e-02f, -1.411439979e-03f }, - { -3.237610820e-02f, +9.859523890e-01f, +4.764764268e-02f, -1.418001764e-03f }, - { -3.245450962e-02f, +9.858654848e-01f, +4.782055384e-02f, -1.424578519e-03f }, - { -3.253278036e-02f, +9.857783172e-01f, +4.799362127e-02f, -1.431170257e-03f }, - { -3.261092049e-02f, +9.856908861e-01f, +4.816684499e-02f, -1.437776992e-03f }, - { -3.268893007e-02f, +9.856031917e-01f, +4.834022501e-02f, -1.444398738e-03f }, - { -3.276680917e-02f, +9.855152339e-01f, +4.851376133e-02f, -1.451035507e-03f }, - { -3.284455785e-02f, +9.854270129e-01f, +4.868745396e-02f, -1.457687314e-03f }, - { -3.292217617e-02f, +9.853385286e-01f, +4.886130292e-02f, -1.464354173e-03f }, - { -3.299966421e-02f, +9.852497812e-01f, +4.903530820e-02f, -1.471036096e-03f }, - { -3.307702203e-02f, +9.851607708e-01f, +4.920946982e-02f, -1.477733098e-03f }, - { -3.315424969e-02f, +9.850714973e-01f, +4.938378778e-02f, -1.484445192e-03f }, - { -3.323134726e-02f, +9.849819608e-01f, +4.955826209e-02f, -1.491172391e-03f }, - { -3.330831480e-02f, +9.848921614e-01f, +4.973289276e-02f, -1.497914710e-03f }, - { -3.338515239e-02f, +9.848020991e-01f, +4.990767980e-02f, -1.504672161e-03f }, - { -3.346186007e-02f, +9.847117740e-01f, +5.008262322e-02f, -1.511444759e-03f }, - { -3.353843793e-02f, +9.846211862e-01f, +5.025772301e-02f, -1.518232516e-03f }, - { -3.361488603e-02f, +9.845303356e-01f, +5.043297919e-02f, -1.525035446e-03f }, - { -3.369120443e-02f, +9.844392225e-01f, +5.060839177e-02f, -1.531853564e-03f }, - { -3.376739320e-02f, +9.843478467e-01f, +5.078396076e-02f, -1.538686881e-03f }, - { -3.384345240e-02f, +9.842562085e-01f, +5.095968615e-02f, -1.545535412e-03f }, - { -3.391938210e-02f, +9.841643077e-01f, +5.113556795e-02f, -1.552399171e-03f }, - { -3.399518237e-02f, +9.840721446e-01f, +5.131160618e-02f, -1.559278170e-03f }, - { -3.407085327e-02f, +9.839797191e-01f, +5.148780084e-02f, -1.566172424e-03f }, - { -3.414639488e-02f, +9.838870314e-01f, +5.166415193e-02f, -1.573081945e-03f }, - { -3.422180724e-02f, +9.837940814e-01f, +5.184065947e-02f, -1.580006747e-03f }, - { -3.429709044e-02f, +9.837008692e-01f, +5.201732345e-02f, -1.586946844e-03f }, - { -3.437224453e-02f, +9.836073950e-01f, +5.219414389e-02f, -1.593902249e-03f }, - { -3.444726959e-02f, +9.835136587e-01f, +5.237112079e-02f, -1.600872975e-03f }, - { -3.452216568e-02f, +9.834196603e-01f, +5.254825415e-02f, -1.607859036e-03f }, - { -3.459693287e-02f, +9.833254001e-01f, +5.272554398e-02f, -1.614860445e-03f }, - { -3.467157122e-02f, +9.832308780e-01f, +5.290299029e-02f, -1.621877216e-03f }, - { -3.474608080e-02f, +9.831360941e-01f, +5.308059308e-02f, -1.628909362e-03f }, - { -3.482046167e-02f, +9.830410484e-01f, +5.325835236e-02f, -1.635956896e-03f }, - { -3.489471391e-02f, +9.829457410e-01f, +5.343626813e-02f, -1.643019832e-03f }, - { -3.496883758e-02f, +9.828501720e-01f, +5.361434040e-02f, -1.650098183e-03f }, - { -3.504283275e-02f, +9.827543414e-01f, +5.379256918e-02f, -1.657191962e-03f }, - { -3.511669948e-02f, +9.826582494e-01f, +5.397095446e-02f, -1.664301183e-03f }, - { -3.519043784e-02f, +9.825618958e-01f, +5.414949625e-02f, -1.671425859e-03f }, - { -3.526404790e-02f, +9.824652809e-01f, +5.432819456e-02f, -1.678566004e-03f }, - { -3.533752973e-02f, +9.823684047e-01f, +5.450704939e-02f, -1.685721630e-03f }, - { -3.541088338e-02f, +9.822712671e-01f, +5.468606075e-02f, -1.692892751e-03f }, - { -3.548410894e-02f, +9.821738684e-01f, +5.486522863e-02f, -1.700079381e-03f }, - { -3.555720646e-02f, +9.820762086e-01f, +5.504455306e-02f, -1.707281532e-03f }, - { -3.563017602e-02f, +9.819782876e-01f, +5.522403402e-02f, -1.714499218e-03f }, - { -3.570301768e-02f, +9.818801056e-01f, +5.540367152e-02f, -1.721732452e-03f }, - { -3.577573150e-02f, +9.817816627e-01f, +5.558346557e-02f, -1.728981247e-03f }, - { -3.584831757e-02f, +9.816829589e-01f, +5.576341617e-02f, -1.736245617e-03f }, - { -3.592077593e-02f, +9.815839943e-01f, +5.594352333e-02f, -1.743525575e-03f }, - { -3.599310667e-02f, +9.814847688e-01f, +5.612378704e-02f, -1.750821133e-03f }, - { -3.606530984e-02f, +9.813852827e-01f, +5.630420731e-02f, -1.758132306e-03f }, - { -3.613738552e-02f, +9.812855360e-01f, +5.648478415e-02f, -1.765459107e-03f }, - { -3.620933378e-02f, +9.811855286e-01f, +5.666551755e-02f, -1.772801548e-03f }, - { -3.628115468e-02f, +9.810852607e-01f, +5.684640752e-02f, -1.780159642e-03f }, - { -3.635284829e-02f, +9.809847324e-01f, +5.702745407e-02f, -1.787533404e-03f }, - { -3.642441467e-02f, +9.808839437e-01f, +5.720865720e-02f, -1.794922846e-03f }, - { -3.649585390e-02f, +9.807828947e-01f, +5.739001690e-02f, -1.802327981e-03f }, - { -3.656716604e-02f, +9.806815854e-01f, +5.757153318e-02f, -1.809748823e-03f }, - { -3.663835117e-02f, +9.805800159e-01f, +5.775320605e-02f, -1.817185384e-03f }, - { -3.670940934e-02f, +9.804781863e-01f, +5.793503550e-02f, -1.824637677e-03f }, - { -3.678034064e-02f, +9.803760966e-01f, +5.811702155e-02f, -1.832105717e-03f }, - { -3.685114512e-02f, +9.802737469e-01f, +5.829916418e-02f, -1.839589515e-03f }, - { -3.692182285e-02f, +9.801711372e-01f, +5.848146341e-02f, -1.847089085e-03f }, - { -3.699237391e-02f, +9.800682677e-01f, +5.866391923e-02f, -1.854604440e-03f }, - { -3.706279835e-02f, +9.799651384e-01f, +5.884653165e-02f, -1.862135594e-03f }, - { -3.713309626e-02f, +9.798617493e-01f, +5.902930066e-02f, -1.869682558e-03f }, - { -3.720326769e-02f, +9.797581006e-01f, +5.921222628e-02f, -1.877245347e-03f }, - { -3.727331272e-02f, +9.796541922e-01f, +5.939530849e-02f, -1.884823973e-03f }, - { -3.734323142e-02f, +9.795500243e-01f, +5.957854731e-02f, -1.892418449e-03f }, - { -3.741302385e-02f, +9.794455969e-01f, +5.976194274e-02f, -1.900028788e-03f }, - { -3.748269008e-02f, +9.793409101e-01f, +5.994549476e-02f, -1.907655004e-03f }, - { -3.755223018e-02f, +9.792359640e-01f, +6.012920340e-02f, -1.915297108e-03f }, - { -3.762164423e-02f, +9.791307585e-01f, +6.031306864e-02f, -1.922955116e-03f }, - { -3.769093228e-02f, +9.790252939e-01f, +6.049709048e-02f, -1.930629038e-03f }, - { -3.776009441e-02f, +9.789195701e-01f, +6.068126894e-02f, -1.938318888e-03f }, - { -3.782913069e-02f, +9.788135872e-01f, +6.086560401e-02f, -1.946024680e-03f }, - { -3.789804118e-02f, +9.787073453e-01f, +6.105009568e-02f, -1.953746425e-03f }, - { -3.796682595e-02f, +9.786008444e-01f, +6.123474396e-02f, -1.961484138e-03f }, - { -3.803548508e-02f, +9.784940847e-01f, +6.141954886e-02f, -1.969237830e-03f }, - { -3.810401864e-02f, +9.783870661e-01f, +6.160451036e-02f, -1.977007515e-03f }, - { -3.817242668e-02f, +9.782797888e-01f, +6.178962847e-02f, -1.984793206e-03f }, - { -3.824070929e-02f, +9.781722528e-01f, +6.197490319e-02f, -1.992594915e-03f }, - { -3.830886653e-02f, +9.780644583e-01f, +6.216033452e-02f, -2.000412656e-03f }, - { -3.837689847e-02f, +9.779564051e-01f, +6.234592246e-02f, -2.008246441e-03f }, - { -3.844480518e-02f, +9.778480935e-01f, +6.253166701e-02f, -2.016096283e-03f }, - { -3.851258673e-02f, +9.777395235e-01f, +6.271756817e-02f, -2.023962196e-03f }, - { -3.858024318e-02f, +9.776306952e-01f, +6.290362593e-02f, -2.031844191e-03f }, - { -3.864777462e-02f, +9.775216086e-01f, +6.308984030e-02f, -2.039742281e-03f }, - { -3.871518110e-02f, +9.774122638e-01f, +6.327621127e-02f, -2.047656480e-03f }, - { -3.878246270e-02f, +9.773026608e-01f, +6.346273885e-02f, -2.055586801e-03f }, - { -3.884961949e-02f, +9.771927998e-01f, +6.364942303e-02f, -2.063533255e-03f }, - { -3.891665153e-02f, +9.770826809e-01f, +6.383626381e-02f, -2.071495856e-03f }, - { -3.898355890e-02f, +9.769723040e-01f, +6.402326120e-02f, -2.079474617e-03f }, - { -3.905034167e-02f, +9.768616692e-01f, +6.421041518e-02f, -2.087469549e-03f }, - { -3.911699991e-02f, +9.767507766e-01f, +6.439772576e-02f, -2.095480667e-03f }, - { -3.918353368e-02f, +9.766396264e-01f, +6.458519293e-02f, -2.103507983e-03f }, - { -3.924994306e-02f, +9.765282185e-01f, +6.477281670e-02f, -2.111551509e-03f }, - { -3.931622812e-02f, +9.764165530e-01f, +6.496059705e-02f, -2.119611258e-03f }, - { -3.938238892e-02f, +9.763046301e-01f, +6.514853400e-02f, -2.127687243e-03f }, - { -3.944842554e-02f, +9.761924497e-01f, +6.533662753e-02f, -2.135779477e-03f }, - { -3.951433805e-02f, +9.760800119e-01f, +6.552487765e-02f, -2.143887971e-03f }, - { -3.958012651e-02f, +9.759673169e-01f, +6.571328435e-02f, -2.152012740e-03f }, - { -3.964579101e-02f, +9.758543646e-01f, +6.590184763e-02f, -2.160153795e-03f }, - { -3.971133160e-02f, +9.757411552e-01f, +6.609056749e-02f, -2.168311149e-03f }, - { -3.977674836e-02f, +9.756276888e-01f, +6.627944392e-02f, -2.176484815e-03f }, - { -3.984204137e-02f, +9.755139653e-01f, +6.646847692e-02f, -2.184674805e-03f }, - { -3.990721068e-02f, +9.753999849e-01f, +6.665766648e-02f, -2.192881133e-03f }, - { -3.997225637e-02f, +9.752857476e-01f, +6.684701262e-02f, -2.201103809e-03f }, - { -4.003717851e-02f, +9.751712536e-01f, +6.703651531e-02f, -2.209342848e-03f }, - { -4.010197718e-02f, +9.750565028e-01f, +6.722617456e-02f, -2.217598262e-03f }, - { -4.016665244e-02f, +9.749414954e-01f, +6.741599037e-02f, -2.225870062e-03f }, - { -4.023120436e-02f, +9.748262314e-01f, +6.760596272e-02f, -2.234158263e-03f }, - { -4.029563302e-02f, +9.747107110e-01f, +6.779609163e-02f, -2.242462875e-03f }, - { -4.035993848e-02f, +9.745949341e-01f, +6.798637707e-02f, -2.250783913e-03f }, - { -4.042412082e-02f, +9.744789009e-01f, +6.817681906e-02f, -2.259121387e-03f }, - { -4.048818011e-02f, +9.743626113e-01f, +6.836741758e-02f, -2.267475312e-03f }, - { -4.055211641e-02f, +9.742460656e-01f, +6.855817263e-02f, -2.275845698e-03f }, - { -4.061592981e-02f, +9.741292638e-01f, +6.874908421e-02f, -2.284232560e-03f }, - { -4.067962036e-02f, +9.740122059e-01f, +6.894015231e-02f, -2.292635908e-03f }, - { -4.074318815e-02f, +9.738948920e-01f, +6.913137692e-02f, -2.301055756e-03f }, - { -4.080663324e-02f, +9.737773222e-01f, +6.932275805e-02f, -2.309492116e-03f }, - { -4.086995570e-02f, +9.736594966e-01f, +6.951429569e-02f, -2.317945001e-03f }, - { -4.093315561e-02f, +9.735414153e-01f, +6.970598983e-02f, -2.326414422e-03f }, - { -4.099623304e-02f, +9.734230782e-01f, +6.989784046e-02f, -2.334900392e-03f }, - { -4.105918805e-02f, +9.733044855e-01f, +7.008984759e-02f, -2.343402924e-03f }, - { -4.112202073e-02f, +9.731856373e-01f, +7.028201121e-02f, -2.351922030e-03f }, - { -4.118473113e-02f, +9.730665337e-01f, +7.047433131e-02f, -2.360457723e-03f }, - { -4.124731934e-02f, +9.729471746e-01f, +7.066680788e-02f, -2.369010014e-03f }, - { -4.130978543e-02f, +9.728275603e-01f, +7.085944093e-02f, -2.377578915e-03f }, - { -4.137212946e-02f, +9.727076907e-01f, +7.105223044e-02f, -2.386164441e-03f }, - { -4.143435151e-02f, +9.725875660e-01f, +7.124517640e-02f, -2.394766601e-03f }, - { -4.149645164e-02f, +9.724671862e-01f, +7.143827882e-02f, -2.403385410e-03f }, - { -4.155842994e-02f, +9.723465513e-01f, +7.163153769e-02f, -2.412020878e-03f }, - { -4.162028648e-02f, +9.722256616e-01f, +7.182495300e-02f, -2.420673020e-03f }, - { -4.168202131e-02f, +9.721045170e-01f, +7.201852474e-02f, -2.429341845e-03f }, - { -4.174363453e-02f, +9.719831176e-01f, +7.221225291e-02f, -2.438027368e-03f }, - { -4.180512620e-02f, +9.718614635e-01f, +7.240613750e-02f, -2.446729599e-03f }, - { -4.186649638e-02f, +9.717395548e-01f, +7.260017851e-02f, -2.455448552e-03f }, - { -4.192774516e-02f, +9.716173916e-01f, +7.279437592e-02f, -2.464184239e-03f }, - { -4.198887261e-02f, +9.714949738e-01f, +7.298872973e-02f, -2.472936671e-03f }, - { -4.204987879e-02f, +9.713723017e-01f, +7.318323994e-02f, -2.481705861e-03f }, - { -4.211076378e-02f, +9.712493753e-01f, +7.337790653e-02f, -2.490491821e-03f }, - { -4.217152766e-02f, +9.711261947e-01f, +7.357272950e-02f, -2.499294563e-03f }, - { -4.223217049e-02f, +9.710027598e-01f, +7.376770885e-02f, -2.508114099e-03f }, - { -4.229269235e-02f, +9.708790709e-01f, +7.396284455e-02f, -2.516950442e-03f }, - { -4.235309331e-02f, +9.707551280e-01f, +7.415813662e-02f, -2.525803603e-03f }, - { -4.241337343e-02f, +9.706309312e-01f, +7.435358503e-02f, -2.534673595e-03f }, - { -4.247353281e-02f, +9.705064805e-01f, +7.454918978e-02f, -2.543560430e-03f }, - { -4.253357150e-02f, +9.703817761e-01f, +7.474495086e-02f, -2.552464119e-03f }, - { -4.259348958e-02f, +9.702568180e-01f, +7.494086827e-02f, -2.561384675e-03f }, - { -4.265328712e-02f, +9.701316062e-01f, +7.513694200e-02f, -2.570322110e-03f }, - { -4.271296420e-02f, +9.700061410e-01f, +7.533317203e-02f, -2.579276435e-03f }, - { -4.277252088e-02f, +9.698804222e-01f, +7.552955836e-02f, -2.588247664e-03f }, - { -4.283195724e-02f, +9.697544501e-01f, +7.572610098e-02f, -2.597235807e-03f }, - { -4.289127336e-02f, +9.696282248e-01f, +7.592279989e-02f, -2.606240877e-03f }, - { -4.295046931e-02f, +9.695017462e-01f, +7.611965506e-02f, -2.615262886e-03f }, - { -4.300954515e-02f, +9.693750144e-01f, +7.631666650e-02f, -2.624301846e-03f }, - { -4.306850096e-02f, +9.692480296e-01f, +7.651383420e-02f, -2.633357769e-03f }, - { -4.312733682e-02f, +9.691207919e-01f, +7.671115814e-02f, -2.642430666e-03f }, - { -4.318605280e-02f, +9.689933012e-01f, +7.690863832e-02f, -2.651520549e-03f }, - { -4.324464897e-02f, +9.688655578e-01f, +7.710627472e-02f, -2.660627431e-03f }, - { -4.330312541e-02f, +9.687375615e-01f, +7.730406734e-02f, -2.669751324e-03f }, - { -4.336148218e-02f, +9.686093127e-01f, +7.750201617e-02f, -2.678892238e-03f }, - { -4.341971936e-02f, +9.684808113e-01f, +7.770012120e-02f, -2.688050187e-03f }, - { -4.347783703e-02f, +9.683520574e-01f, +7.789838241e-02f, -2.697225181e-03f }, - { -4.353583525e-02f, +9.682230510e-01f, +7.809679980e-02f, -2.706417234e-03f }, - { -4.359371410e-02f, +9.680937924e-01f, +7.829537336e-02f, -2.715626355e-03f }, - { -4.365147366e-02f, +9.679642815e-01f, +7.849410308e-02f, -2.724852558e-03f }, - { -4.370911400e-02f, +9.678345184e-01f, +7.869298894e-02f, -2.734095855e-03f }, - { -4.376663518e-02f, +9.677045033e-01f, +7.889203094e-02f, -2.743356256e-03f }, - { -4.382403729e-02f, +9.675742361e-01f, +7.909122907e-02f, -2.752633774e-03f }, - { -4.388132040e-02f, +9.674437171e-01f, +7.929058330e-02f, -2.761928420e-03f }, - { -4.393848458e-02f, +9.673129462e-01f, +7.949009365e-02f, -2.771240206e-03f }, - { -4.399552991e-02f, +9.671819235e-01f, +7.968976008e-02f, -2.780569145e-03f }, - { -4.405245646e-02f, +9.670506492e-01f, +7.988958260e-02f, -2.789915247e-03f }, - { -4.410926430e-02f, +9.669191233e-01f, +8.008956119e-02f, -2.799278524e-03f }, - { -4.416595350e-02f, +9.667873459e-01f, +8.028969584e-02f, -2.808658988e-03f }, - { -4.422252415e-02f, +9.666553170e-01f, +8.048998653e-02f, -2.818056650e-03f }, - { -4.427897631e-02f, +9.665230369e-01f, +8.069043326e-02f, -2.827471523e-03f }, - { -4.433531006e-02f, +9.663905054e-01f, +8.089103602e-02f, -2.836903618e-03f }, - { -4.439152547e-02f, +9.662577228e-01f, +8.109179479e-02f, -2.846352946e-03f }, - { -4.444762262e-02f, +9.661246891e-01f, +8.129270955e-02f, -2.855819519e-03f }, - { -4.450360157e-02f, +9.659914044e-01f, +8.149378031e-02f, -2.865303349e-03f }, - { -4.455946242e-02f, +9.658578688e-01f, +8.169500704e-02f, -2.874804447e-03f }, - { -4.461520522e-02f, +9.657240824e-01f, +8.189638974e-02f, -2.884322825e-03f }, - { -4.467083005e-02f, +9.655900451e-01f, +8.209792838e-02f, -2.893858495e-03f }, - { -4.472633699e-02f, +9.654557573e-01f, +8.229962297e-02f, -2.903411467e-03f }, - { -4.478172612e-02f, +9.653212188e-01f, +8.250147348e-02f, -2.912981754e-03f }, - { -4.483699749e-02f, +9.651864298e-01f, +8.270347990e-02f, -2.922569366e-03f }, - { -4.489215120e-02f, +9.650513905e-01f, +8.290564223e-02f, -2.932174316e-03f }, - { -4.494718732e-02f, +9.649161008e-01f, +8.310796044e-02f, -2.941796615e-03f }, - { -4.500210591e-02f, +9.647805608e-01f, +8.331043452e-02f, -2.951436274e-03f }, - { -4.505690705e-02f, +9.646447707e-01f, +8.351306447e-02f, -2.961093304e-03f }, - { -4.511159083e-02f, +9.645087305e-01f, +8.371585026e-02f, -2.970767718e-03f }, - { -4.516615730e-02f, +9.643724404e-01f, +8.391879188e-02f, -2.980459527e-03f }, - { -4.522060655e-02f, +9.642359003e-01f, +8.412188933e-02f, -2.990168741e-03f }, - { -4.527493866e-02f, +9.640991104e-01f, +8.432514258e-02f, -2.999895373e-03f }, - { -4.532915369e-02f, +9.639620708e-01f, +8.452855162e-02f, -3.009639433e-03f }, - { -4.538325172e-02f, +9.638247816e-01f, +8.473211644e-02f, -3.019400934e-03f }, - { -4.543723283e-02f, +9.636872427e-01f, +8.493583703e-02f, -3.029179886e-03f }, - { -4.549109708e-02f, +9.635494545e-01f, +8.513971336e-02f, -3.038976300e-03f }, - { -4.554484457e-02f, +9.634114168e-01f, +8.534374543e-02f, -3.048790189e-03f }, - { -4.559847535e-02f, +9.632731298e-01f, +8.554793322e-02f, -3.058621563e-03f }, - { -4.565198951e-02f, +9.631345937e-01f, +8.575227672e-02f, -3.068470433e-03f }, - { -4.570538712e-02f, +9.629958084e-01f, +8.595677591e-02f, -3.078336812e-03f }, - { -4.575866826e-02f, +9.628567741e-01f, +8.616143077e-02f, -3.088220709e-03f }, - { -4.581183299e-02f, +9.627174908e-01f, +8.636624129e-02f, -3.098122137e-03f }, - { -4.586488140e-02f, +9.625779587e-01f, +8.657120747e-02f, -3.108041106e-03f }, - { -4.591781356e-02f, +9.624381778e-01f, +8.677632927e-02f, -3.117977628e-03f }, - { -4.597062955e-02f, +9.622981482e-01f, +8.698160668e-02f, -3.127931713e-03f }, - { -4.602332944e-02f, +9.621578700e-01f, +8.718703970e-02f, -3.137903374e-03f }, - { -4.607591330e-02f, +9.620173433e-01f, +8.739262830e-02f, -3.147892621e-03f }, - { -4.612838122e-02f, +9.618765682e-01f, +8.759837247e-02f, -3.157899465e-03f }, - { -4.618073326e-02f, +9.617355447e-01f, +8.780427220e-02f, -3.167923918e-03f }, - { -4.623296951e-02f, +9.615942731e-01f, +8.801032746e-02f, -3.177965990e-03f }, - { -4.628509003e-02f, +9.614527532e-01f, +8.821653824e-02f, -3.188025693e-03f }, - { -4.633709491e-02f, +9.613109853e-01f, +8.842290452e-02f, -3.198103037e-03f }, - { -4.638898421e-02f, +9.611689695e-01f, +8.862942629e-02f, -3.208198035e-03f }, - { -4.644075802e-02f, +9.610267057e-01f, +8.883610354e-02f, -3.218310696e-03f }, - { -4.649241641e-02f, +9.608841941e-01f, +8.904293624e-02f, -3.228441031e-03f }, - { -4.654395945e-02f, +9.607414349e-01f, +8.924992437e-02f, -3.238589053e-03f }, - { -4.659538723e-02f, +9.605984280e-01f, +8.945706793e-02f, -3.248754771e-03f }, - { -4.664669981e-02f, +9.604551736e-01f, +8.966436689e-02f, -3.258938197e-03f }, - { -4.669789727e-02f, +9.603116718e-01f, +8.987182124e-02f, -3.269139342e-03f }, - { -4.674897969e-02f, +9.601679226e-01f, +9.007943096e-02f, -3.279358217e-03f }, - { -4.679994715e-02f, +9.600239261e-01f, +9.028719604e-02f, -3.289594832e-03f }, - { -4.685079971e-02f, +9.598796825e-01f, +9.049511645e-02f, -3.299849199e-03f }, - { -4.690153746e-02f, +9.597351919e-01f, +9.070319217e-02f, -3.310121328e-03f }, - { -4.695216048e-02f, +9.595904542e-01f, +9.091142320e-02f, -3.320411230e-03f }, - { -4.700266883e-02f, +9.594454696e-01f, +9.111980950e-02f, -3.330718916e-03f }, - { -4.705306259e-02f, +9.593002383e-01f, +9.132835108e-02f, -3.341044398e-03f }, - { -4.710334184e-02f, +9.591547602e-01f, +9.153704790e-02f, -3.351387685e-03f }, - { -4.715350666e-02f, +9.590090355e-01f, +9.174589994e-02f, -3.361748789e-03f }, - { -4.720355712e-02f, +9.588630643e-01f, +9.195490720e-02f, -3.372127720e-03f }, - { -4.725349330e-02f, +9.587168467e-01f, +9.216406964e-02f, -3.382524489e-03f }, - { -4.730331527e-02f, +9.585703827e-01f, +9.237338726e-02f, -3.392939107e-03f }, - { -4.735302311e-02f, +9.584236724e-01f, +9.258286004e-02f, -3.403371585e-03f }, - { -4.740261690e-02f, +9.582767160e-01f, +9.279248795e-02f, -3.413821934e-03f }, - { -4.745209672e-02f, +9.581295136e-01f, +9.300227097e-02f, -3.424290163e-03f }, - { -4.750146263e-02f, +9.579820651e-01f, +9.321220909e-02f, -3.434776284e-03f }, - { -4.755071471e-02f, +9.578343708e-01f, +9.342230229e-02f, -3.445280308e-03f }, - { -4.759985305e-02f, +9.576864307e-01f, +9.363255055e-02f, -3.455802245e-03f }, - { -4.764887772e-02f, +9.575382449e-01f, +9.384295385e-02f, -3.466342106e-03f }, - { -4.769778879e-02f, +9.573898135e-01f, +9.405351217e-02f, -3.476899901e-03f }, - { -4.774658634e-02f, +9.572411365e-01f, +9.426422548e-02f, -3.487475641e-03f }, - { -4.779527045e-02f, +9.570922142e-01f, +9.447509378e-02f, -3.498069337e-03f }, - { -4.784384120e-02f, +9.569430465e-01f, +9.468611704e-02f, -3.508680999e-03f }, - { -4.789229866e-02f, +9.567936336e-01f, +9.489729524e-02f, -3.519310638e-03f }, - { -4.794064290e-02f, +9.566439756e-01f, +9.510862835e-02f, -3.529958264e-03f }, - { -4.798887401e-02f, +9.564940726e-01f, +9.532011637e-02f, -3.540623888e-03f }, - { -4.803699206e-02f, +9.563439245e-01f, +9.553175927e-02f, -3.551307520e-03f }, - { -4.808499713e-02f, +9.561935317e-01f, +9.574355703e-02f, -3.562009171e-03f }, - { -4.813288929e-02f, +9.560428941e-01f, +9.595550962e-02f, -3.572728851e-03f }, - { -4.818066862e-02f, +9.558920118e-01f, +9.616761703e-02f, -3.583466571e-03f }, - { -4.822833521e-02f, +9.557408849e-01f, +9.637987924e-02f, -3.594222342e-03f }, - { -4.827588911e-02f, +9.555895136e-01f, +9.659229622e-02f, -3.604996173e-03f }, - { -4.832333042e-02f, +9.554378979e-01f, +9.680486796e-02f, -3.615788075e-03f }, - { -4.837065921e-02f, +9.552860379e-01f, +9.701759443e-02f, -3.626598058e-03f }, - { -4.841787556e-02f, +9.551339337e-01f, +9.723047561e-02f, -3.637426133e-03f }, - { -4.846497954e-02f, +9.549815854e-01f, +9.744351149e-02f, -3.648272311e-03f }, - { -4.851197123e-02f, +9.548289931e-01f, +9.765670203e-02f, -3.659136601e-03f }, - { -4.855885071e-02f, +9.546761570e-01f, +9.787004721e-02f, -3.670019013e-03f }, - { -4.860561805e-02f, +9.545230770e-01f, +9.808354703e-02f, -3.680919559e-03f }, - { -4.865227334e-02f, +9.543697533e-01f, +9.829720144e-02f, -3.691838248e-03f }, - { -4.869881664e-02f, +9.542161860e-01f, +9.851101044e-02f, -3.702775091e-03f }, - { -4.874524804e-02f, +9.540623752e-01f, +9.872497399e-02f, -3.713730097e-03f }, - { -4.879156762e-02f, +9.539083209e-01f, +9.893909208e-02f, -3.724703278e-03f }, - { -4.883777544e-02f, +9.537540234e-01f, +9.915336469e-02f, -3.735694643e-03f }, - { -4.888387160e-02f, +9.535994826e-01f, +9.936779178e-02f, -3.746704203e-03f }, - { -4.892985616e-02f, +9.534446987e-01f, +9.958237334e-02f, -3.757731967e-03f }, - { -4.897572920e-02f, +9.532896717e-01f, +9.979710935e-02f, -3.768777946e-03f }, - { -4.902149080e-02f, +9.531344018e-01f, +1.000119998e-01f, -3.779842151e-03f }, - { -4.906714105e-02f, +9.529788891e-01f, +1.002270446e-01f, -3.790924590e-03f }, - { -4.911268001e-02f, +9.528231336e-01f, +1.004422438e-01f, -3.802025274e-03f }, - { -4.915810776e-02f, +9.526671355e-01f, +1.006575974e-01f, -3.813144214e-03f }, - { -4.920342438e-02f, +9.525108949e-01f, +1.008731053e-01f, -3.824281419e-03f }, - { -4.924862995e-02f, +9.523544118e-01f, +1.010887674e-01f, -3.835436900e-03f }, - { -4.929372455e-02f, +9.521976863e-01f, +1.013045839e-01f, -3.846610666e-03f }, - { -4.933870825e-02f, +9.520407186e-01f, +1.015205546e-01f, -3.857802728e-03f }, - { -4.938358114e-02f, +9.518835087e-01f, +1.017366796e-01f, -3.869013095e-03f }, - { -4.942834328e-02f, +9.517260568e-01f, +1.019529588e-01f, -3.880241778e-03f }, - { -4.947299476e-02f, +9.515683630e-01f, +1.021693921e-01f, -3.891488786e-03f }, - { -4.951753566e-02f, +9.514104273e-01f, +1.023859797e-01f, -3.902754129e-03f }, - { -4.956196605e-02f, +9.512522498e-01f, +1.026027213e-01f, -3.914037818e-03f }, - { -4.960628601e-02f, +9.510938306e-01f, +1.028196171e-01f, -3.925339862e-03f }, - { -4.965049562e-02f, +9.509351700e-01f, +1.030366669e-01f, -3.936660271e-03f }, - { -4.969459496e-02f, +9.507762678e-01f, +1.032538708e-01f, -3.947999054e-03f }, - { -4.973858410e-02f, +9.506171243e-01f, +1.034712288e-01f, -3.959356223e-03f }, - { -4.978246313e-02f, +9.504577395e-01f, +1.036887408e-01f, -3.970731786e-03f }, - { -4.982623211e-02f, +9.502981136e-01f, +1.039064067e-01f, -3.982125754e-03f }, - { -4.986989114e-02f, +9.501382466e-01f, +1.041242266e-01f, -3.993538136e-03f }, - { -4.991344028e-02f, +9.499781386e-01f, +1.043422005e-01f, -4.004968942e-03f }, - { -4.995687962e-02f, +9.498177898e-01f, +1.045603282e-01f, -4.016418182e-03f }, - { -5.000020923e-02f, +9.496572003e-01f, +1.047786099e-01f, -4.027885865e-03f }, - { -5.004342920e-02f, +9.494963700e-01f, +1.049970454e-01f, -4.039372002e-03f }, - { -5.008653959e-02f, +9.493352993e-01f, +1.052156347e-01f, -4.050876601e-03f }, - { -5.012954049e-02f, +9.491739880e-01f, +1.054343779e-01f, -4.062399673e-03f }, - { -5.017243198e-02f, +9.490124364e-01f, +1.056532748e-01f, -4.073941228e-03f }, - { -5.021521414e-02f, +9.488506446e-01f, +1.058723254e-01f, -4.085501274e-03f }, - { -5.025788704e-02f, +9.486886126e-01f, +1.060915299e-01f, -4.097079822e-03f }, - { -5.030045076e-02f, +9.485263405e-01f, +1.063108880e-01f, -4.108676881e-03f }, - { -5.034290538e-02f, +9.483638285e-01f, +1.065303997e-01f, -4.120292461e-03f }, - { -5.038525098e-02f, +9.482010767e-01f, +1.067500652e-01f, -4.131926571e-03f }, - { -5.042748764e-02f, +9.480380851e-01f, +1.069698842e-01f, -4.143579220e-03f }, - { -5.046961543e-02f, +9.478748538e-01f, +1.071898568e-01f, -4.155250420e-03f }, - { -5.051163444e-02f, +9.477113830e-01f, +1.074099830e-01f, -4.166940178e-03f }, - { -5.055354474e-02f, +9.475476728e-01f, +1.076302628e-01f, -4.178648505e-03f }, - { -5.059534642e-02f, +9.473837233e-01f, +1.078506960e-01f, -4.190375409e-03f }, - { -5.063703954e-02f, +9.472195345e-01f, +1.080712828e-01f, -4.202120901e-03f }, - { -5.067862420e-02f, +9.470551065e-01f, +1.082920229e-01f, -4.213884989e-03f }, - { -5.072010046e-02f, +9.468904396e-01f, +1.085129166e-01f, -4.225667684e-03f }, - { -5.076146841e-02f, +9.467255337e-01f, +1.087339636e-01f, -4.237468994e-03f }, - { -5.080272812e-02f, +9.465603890e-01f, +1.089551640e-01f, -4.249288929e-03f }, - { -5.084387968e-02f, +9.463950056e-01f, +1.091765177e-01f, -4.261127499e-03f }, - { -5.088492316e-02f, +9.462293836e-01f, +1.093980247e-01f, -4.272984712e-03f }, - { -5.092585865e-02f, +9.460635230e-01f, +1.096196851e-01f, -4.284860578e-03f }, - { -5.096668621e-02f, +9.458974241e-01f, +1.098414987e-01f, -4.296755107e-03f }, - { -5.100740594e-02f, +9.457310868e-01f, +1.100634655e-01f, -4.308668306e-03f }, - { -5.104801790e-02f, +9.455645113e-01f, +1.102855855e-01f, -4.320600187e-03f }, - { -5.108852219e-02f, +9.453976978e-01f, +1.105078587e-01f, -4.332550758e-03f }, - { -5.112891887e-02f, +9.452306462e-01f, +1.107302850e-01f, -4.344520028e-03f }, - { -5.116920802e-02f, +9.450633568e-01f, +1.109528645e-01f, -4.356508006e-03f }, - { -5.120938973e-02f, +9.448958296e-01f, +1.111755970e-01f, -4.368514702e-03f }, - { -5.124946408e-02f, +9.447280647e-01f, +1.113984826e-01f, -4.380540125e-03f }, - { -5.128943114e-02f, +9.445600623e-01f, +1.116215212e-01f, -4.392584284e-03f }, - { -5.132929099e-02f, +9.443918223e-01f, +1.118447128e-01f, -4.404647188e-03f }, - { -5.136904371e-02f, +9.442233450e-01f, +1.120680573e-01f, -4.416728846e-03f }, - { -5.140868939e-02f, +9.440546305e-01f, +1.122915548e-01f, -4.428829267e-03f }, - { -5.144822810e-02f, +9.438856788e-01f, +1.125152052e-01f, -4.440948461e-03f }, - { -5.148765991e-02f, +9.437164901e-01f, +1.127390085e-01f, -4.453086436e-03f }, - { -5.152698491e-02f, +9.435470644e-01f, +1.129629646e-01f, -4.465243201e-03f }, - { -5.156620319e-02f, +9.433774019e-01f, +1.131870735e-01f, -4.477418765e-03f }, - { -5.160531481e-02f, +9.432075026e-01f, +1.134113352e-01f, -4.489613138e-03f }, - { -5.164431986e-02f, +9.430373667e-01f, +1.136357497e-01f, -4.501826329e-03f }, - { -5.168321841e-02f, +9.428669944e-01f, +1.138603169e-01f, -4.514058345e-03f }, - { -5.172201055e-02f, +9.426963856e-01f, +1.140850368e-01f, -4.526309197e-03f }, - { -5.176069636e-02f, +9.425255405e-01f, +1.143099093e-01f, -4.538578892e-03f }, - { -5.179927591e-02f, +9.423544592e-01f, +1.145349345e-01f, -4.550867441e-03f }, - { -5.183774929e-02f, +9.421831418e-01f, +1.147601122e-01f, -4.563174852e-03f }, - { -5.187611657e-02f, +9.420115885e-01f, +1.149854425e-01f, -4.575501133e-03f }, - { -5.191437783e-02f, +9.418397993e-01f, +1.152109254e-01f, -4.587846293e-03f }, - { -5.195253316e-02f, +9.416677743e-01f, +1.154365607e-01f, -4.600210342e-03f }, - { -5.199058263e-02f, +9.414955136e-01f, +1.156623486e-01f, -4.612593288e-03f }, - { -5.202852632e-02f, +9.413230174e-01f, +1.158882888e-01f, -4.624995140e-03f }, - { -5.206636432e-02f, +9.411502858e-01f, +1.161143815e-01f, -4.637415906e-03f }, - { -5.210409670e-02f, +9.409773188e-01f, +1.163406265e-01f, -4.649855595e-03f }, - { -5.214172354e-02f, +9.408041166e-01f, +1.165670239e-01f, -4.662314217e-03f }, - { -5.217924493e-02f, +9.406306792e-01f, +1.167935736e-01f, -4.674791779e-03f }, - { -5.221666093e-02f, +9.404570069e-01f, +1.170202755e-01f, -4.687288290e-03f }, - { -5.225397164e-02f, +9.402830997e-01f, +1.172471298e-01f, -4.699803759e-03f }, - { -5.229117713e-02f, +9.401089576e-01f, +1.174741362e-01f, -4.712338195e-03f }, - { -5.232827748e-02f, +9.399345809e-01f, +1.177012947e-01f, -4.724891606e-03f }, - { -5.236527277e-02f, +9.397599696e-01f, +1.179286055e-01f, -4.737464000e-03f }, - { -5.240216308e-02f, +9.395851238e-01f, +1.181560683e-01f, -4.750055387e-03f }, - { -5.243894849e-02f, +9.394100437e-01f, +1.183836832e-01f, -4.762665774e-03f }, - { -5.247562909e-02f, +9.392347294e-01f, +1.186114502e-01f, -4.775295171e-03f }, - { -5.251220495e-02f, +9.390591808e-01f, +1.188393692e-01f, -4.787943585e-03f }, - { -5.254867615e-02f, +9.388833983e-01f, +1.190674401e-01f, -4.800611026e-03f }, - { -5.258504277e-02f, +9.387073818e-01f, +1.192956630e-01f, -4.813297501e-03f }, - { -5.262130489e-02f, +9.385311316e-01f, +1.195240378e-01f, -4.826003020e-03f }, - { -5.265746259e-02f, +9.383546476e-01f, +1.197525644e-01f, -4.838727590e-03f }, - { -5.269351596e-02f, +9.381779301e-01f, +1.199812429e-01f, -4.851471219e-03f }, - { -5.272946506e-02f, +9.380009790e-01f, +1.202100732e-01f, -4.864233917e-03f }, - { -5.276531000e-02f, +9.378237946e-01f, +1.204390553e-01f, -4.877015692e-03f }, - { -5.280105083e-02f, +9.376463769e-01f, +1.206681891e-01f, -4.889816551e-03f }, - { -5.283668764e-02f, +9.374687261e-01f, +1.208974746e-01f, -4.902636504e-03f }, - { -5.287222052e-02f, +9.372908423e-01f, +1.211269118e-01f, -4.915475558e-03f }, - { -5.290764955e-02f, +9.371127255e-01f, +1.213565006e-01f, -4.928333721e-03f }, - { -5.294297479e-02f, +9.369343759e-01f, +1.215862410e-01f, -4.941211003e-03f }, - { -5.297819635e-02f, +9.367557936e-01f, +1.218161330e-01f, -4.954107411e-03f }, - { -5.301331428e-02f, +9.365769788e-01f, +1.220461765e-01f, -4.967022953e-03f }, - { -5.304832868e-02f, +9.363979314e-01f, +1.222763714e-01f, -4.979957637e-03f }, - { -5.308323963e-02f, +9.362186517e-01f, +1.225067179e-01f, -4.992911472e-03f }, - { -5.311804720e-02f, +9.360391397e-01f, +1.227372157e-01f, -5.005884466e-03f }, - { -5.315275148e-02f, +9.358593955e-01f, +1.229678649e-01f, -5.018876627e-03f }, - { -5.318735255e-02f, +9.356794194e-01f, +1.231986655e-01f, -5.031887963e-03f }, - { -5.322185049e-02f, +9.354992113e-01f, +1.234296174e-01f, -5.044918481e-03f }, - { -5.325624537e-02f, +9.353187714e-01f, +1.236607205e-01f, -5.057968191e-03f }, - { -5.329053728e-02f, +9.351380998e-01f, +1.238919749e-01f, -5.071037100e-03f }, - { -5.332472630e-02f, +9.349571966e-01f, +1.241233805e-01f, -5.084125216e-03f }, - { -5.335881251e-02f, +9.347760620e-01f, +1.243549372e-01f, -5.097232546e-03f }, - { -5.339279600e-02f, +9.345946960e-01f, +1.245866451e-01f, -5.110359100e-03f }, - { -5.342667683e-02f, +9.344130987e-01f, +1.248185041e-01f, -5.123504885e-03f }, - { -5.346045510e-02f, +9.342312704e-01f, +1.250505141e-01f, -5.136669908e-03f }, - { -5.349413088e-02f, +9.340492110e-01f, +1.252826751e-01f, -5.149854178e-03f }, - { -5.352770425e-02f, +9.338669207e-01f, +1.255149871e-01f, -5.163057703e-03f }, - { -5.356117530e-02f, +9.336843996e-01f, +1.257474501e-01f, -5.176280490e-03f }, - { -5.359454410e-02f, +9.335016478e-01f, +1.259800639e-01f, -5.189522547e-03f }, - { -5.362781074e-02f, +9.333186655e-01f, +1.262128286e-01f, -5.202783882e-03f }, - { -5.366097530e-02f, +9.331354527e-01f, +1.264457441e-01f, -5.216064503e-03f }, - { -5.369403785e-02f, +9.329520096e-01f, +1.266788105e-01f, -5.229364417e-03f }, - { -5.372699848e-02f, +9.327683363e-01f, +1.269120275e-01f, -5.242683633e-03f }, - { -5.375985728e-02f, +9.325844328e-01f, +1.271453953e-01f, -5.256022157e-03f }, - { -5.379261431e-02f, +9.324002994e-01f, +1.273789138e-01f, -5.269379998e-03f }, - { -5.382526966e-02f, +9.322159361e-01f, +1.276125829e-01f, -5.282757164e-03f }, - { -5.385782342e-02f, +9.320313430e-01f, +1.278464026e-01f, -5.296153661e-03f }, - { -5.389027566e-02f, +9.318465203e-01f, +1.280803728e-01f, -5.309569498e-03f }, - { -5.392262647e-02f, +9.316614680e-01f, +1.283144936e-01f, -5.323004682e-03f }, - { -5.395487592e-02f, +9.314761864e-01f, +1.285487648e-01f, -5.336459220e-03f }, - { -5.398702410e-02f, +9.312906754e-01f, +1.287831865e-01f, -5.349933121e-03f }, - { -5.401907109e-02f, +9.311049353e-01f, +1.290177586e-01f, -5.363426391e-03f }, - { -5.405101697e-02f, +9.309189660e-01f, +1.292524811e-01f, -5.376939039e-03f }, - { -5.408286181e-02f, +9.307327679e-01f, +1.294873538e-01f, -5.390471071e-03f }, - { -5.411460571e-02f, +9.305463408e-01f, +1.297223769e-01f, -5.404022496e-03f }, - { -5.414624875e-02f, +9.303596851e-01f, +1.299575502e-01f, -5.417593320e-03f }, - { -5.417779099e-02f, +9.301728008e-01f, +1.301928737e-01f, -5.431183551e-03f }, - { -5.420923253e-02f, +9.299856879e-01f, +1.304283474e-01f, -5.444793197e-03f }, - { -5.424057345e-02f, +9.297983467e-01f, +1.306639711e-01f, -5.458422264e-03f }, - { -5.427181382e-02f, +9.296107773e-01f, +1.308997450e-01f, -5.472070761e-03f }, - { -5.430295374e-02f, +9.294229797e-01f, +1.311356689e-01f, -5.485738694e-03f }, - { -5.433399327e-02f, +9.292349540e-01f, +1.313717428e-01f, -5.499426070e-03f }, - { -5.436493251e-02f, +9.290467005e-01f, +1.316079667e-01f, -5.513132898e-03f }, - { -5.439577153e-02f, +9.288582192e-01f, +1.318443405e-01f, -5.526859184e-03f }, - { -5.442651041e-02f, +9.286695102e-01f, +1.320808642e-01f, -5.540604935e-03f }, - { -5.445714924e-02f, +9.284805736e-01f, +1.323175377e-01f, -5.554370159e-03f }, - { -5.448768810e-02f, +9.282914097e-01f, +1.325543610e-01f, -5.568154863e-03f }, - { -5.451812706e-02f, +9.281020184e-01f, +1.327913341e-01f, -5.581959054e-03f }, - { -5.454846622e-02f, +9.279123998e-01f, +1.330284568e-01f, -5.595782739e-03f }, - { -5.457870565e-02f, +9.277225543e-01f, +1.332657293e-01f, -5.609625925e-03f }, - { -5.460884543e-02f, +9.275324817e-01f, +1.335031514e-01f, -5.623488619e-03f }, - { -5.463888565e-02f, +9.273421823e-01f, +1.337407230e-01f, -5.637370829e-03f }, - { -5.466882638e-02f, +9.271516562e-01f, +1.339784442e-01f, -5.651272561e-03f }, - { -5.469866771e-02f, +9.269609034e-01f, +1.342163150e-01f, -5.665193823e-03f }, - { -5.472840972e-02f, +9.267699242e-01f, +1.344543351e-01f, -5.679134621e-03f }, - { -5.475805249e-02f, +9.265787186e-01f, +1.346925048e-01f, -5.693094963e-03f }, - { -5.478759611e-02f, +9.263872867e-01f, +1.349308237e-01f, -5.707074854e-03f }, - { -5.481704064e-02f, +9.261956287e-01f, +1.351692920e-01f, -5.721074303e-03f }, - { -5.484638619e-02f, +9.260037447e-01f, +1.354079097e-01f, -5.735093317e-03f }, - { -5.487563282e-02f, +9.258116348e-01f, +1.356466765e-01f, -5.749131901e-03f }, - { -5.490478063e-02f, +9.256192991e-01f, +1.358855926e-01f, -5.763190063e-03f }, - { -5.493382968e-02f, +9.254267378e-01f, +1.361246578e-01f, -5.777267810e-03f }, - { -5.496278007e-02f, +9.252339509e-01f, +1.363638722e-01f, -5.791365148e-03f }, - { -5.499163187e-02f, +9.250409386e-01f, +1.366032356e-01f, -5.805482085e-03f }, - { -5.502038517e-02f, +9.248477010e-01f, +1.368427480e-01f, -5.819618626e-03f }, - { -5.504904005e-02f, +9.246542383e-01f, +1.370824095e-01f, -5.833774780e-03f }, - { -5.507759658e-02f, +9.244605504e-01f, +1.373222199e-01f, -5.847950552e-03f }, - { -5.510605486e-02f, +9.242666377e-01f, +1.375621792e-01f, -5.862145949e-03f }, - { -5.513441497e-02f, +9.240725001e-01f, +1.378022873e-01f, -5.876360977e-03f }, - { -5.516267698e-02f, +9.238781378e-01f, +1.380425443e-01f, -5.890595645e-03f }, - { -5.519084097e-02f, +9.236835509e-01f, +1.382829500e-01f, -5.904849957e-03f }, - { -5.521890704e-02f, +9.234887396e-01f, +1.385235045e-01f, -5.919123921e-03f }, - { -5.524687526e-02f, +9.232937039e-01f, +1.387642076e-01f, -5.933417543e-03f }, - { -5.527474572e-02f, +9.230984441e-01f, +1.390050594e-01f, -5.947730830e-03f }, - { -5.530251848e-02f, +9.229029601e-01f, +1.392460598e-01f, -5.962063788e-03f }, - { -5.533019365e-02f, +9.227072522e-01f, +1.394872087e-01f, -5.976416423e-03f }, - { -5.535777130e-02f, +9.225113204e-01f, +1.397285061e-01f, -5.990788743e-03f }, - { -5.538525151e-02f, +9.223151649e-01f, +1.399699520e-01f, -6.005180754e-03f }, - { -5.541263436e-02f, +9.221187858e-01f, +1.402115463e-01f, -6.019592461e-03f }, - { -5.543991994e-02f, +9.219221832e-01f, +1.404532889e-01f, -6.034023872e-03f }, - { -5.546710832e-02f, +9.217253573e-01f, +1.406951799e-01f, -6.048474993e-03f }, - { -5.549419960e-02f, +9.215283081e-01f, +1.409372192e-01f, -6.062945830e-03f }, - { -5.552119385e-02f, +9.213310358e-01f, +1.411794066e-01f, -6.077436389e-03f }, - { -5.554809115e-02f, +9.211335405e-01f, +1.414217423e-01f, -6.091946678e-03f }, - { -5.557489159e-02f, +9.209358223e-01f, +1.416642261e-01f, -6.106476701e-03f }, - { -5.560159525e-02f, +9.207378813e-01f, +1.419068580e-01f, -6.121026465e-03f }, - { -5.562820221e-02f, +9.205397178e-01f, +1.421496379e-01f, -6.135595977e-03f }, - { -5.565471255e-02f, +9.203413317e-01f, +1.423925658e-01f, -6.150185242e-03f }, - { -5.568112636e-02f, +9.201427233e-01f, +1.426356417e-01f, -6.164794268e-03f }, - { -5.570744371e-02f, +9.199438926e-01f, +1.428788655e-01f, -6.179423059e-03f }, - { -5.573366470e-02f, +9.197448398e-01f, +1.431222371e-01f, -6.194071622e-03f }, - { -5.575978940e-02f, +9.195455649e-01f, +1.433657566e-01f, -6.208739964e-03f }, - { -5.578581789e-02f, +9.193460682e-01f, +1.436094238e-01f, -6.223428090e-03f }, - { -5.581175026e-02f, +9.191463497e-01f, +1.438532387e-01f, -6.238136006e-03f }, - { -5.583758659e-02f, +9.189464096e-01f, +1.440972013e-01f, -6.252863718e-03f }, - { -5.586332696e-02f, +9.187462479e-01f, +1.443413115e-01f, -6.267611233e-03f }, - { -5.588897145e-02f, +9.185458649e-01f, +1.445855693e-01f, -6.282378556e-03f }, - { -5.591452015e-02f, +9.183452606e-01f, +1.448299746e-01f, -6.297165693e-03f }, - { -5.593997314e-02f, +9.181444351e-01f, +1.450745274e-01f, -6.311972650e-03f }, - { -5.596533050e-02f, +9.179433886e-01f, +1.453192276e-01f, -6.326799433e-03f }, - { -5.599059231e-02f, +9.177421213e-01f, +1.455640752e-01f, -6.341646048e-03f }, - { -5.601575866e-02f, +9.175406331e-01f, +1.458090702e-01f, -6.356512501e-03f }, - { -5.604082963e-02f, +9.173389243e-01f, +1.460542124e-01f, -6.371398797e-03f }, - { -5.606580530e-02f, +9.171369950e-01f, +1.462995018e-01f, -6.386304943e-03f }, - { -5.609068575e-02f, +9.169348454e-01f, +1.465449385e-01f, -6.401230944e-03f }, - { -5.611547107e-02f, +9.167324754e-01f, +1.467905223e-01f, -6.416176806e-03f }, - { -5.614016133e-02f, +9.165298853e-01f, +1.470362531e-01f, -6.431142534e-03f }, - { -5.616475663e-02f, +9.163270752e-01f, +1.472821311e-01f, -6.446128134e-03f }, - { -5.618925704e-02f, +9.161240451e-01f, +1.475281560e-01f, -6.461133612e-03f }, - { -5.621366265e-02f, +9.159207954e-01f, +1.477743278e-01f, -6.476158974e-03f }, - { -5.623797353e-02f, +9.157173259e-01f, +1.480206466e-01f, -6.491204225e-03f }, - { -5.626218978e-02f, +9.155136370e-01f, +1.482671122e-01f, -6.506269371e-03f }, - { -5.628631147e-02f, +9.153097287e-01f, +1.485137245e-01f, -6.521354417e-03f }, - { -5.631033869e-02f, +9.151056011e-01f, +1.487604837e-01f, -6.536459369e-03f }, - { -5.633427152e-02f, +9.149012543e-01f, +1.490073895e-01f, -6.551584232e-03f }, - { -5.635811004e-02f, +9.146966886e-01f, +1.492544420e-01f, -6.566729012e-03f }, - { -5.638185433e-02f, +9.144919040e-01f, +1.495016410e-01f, -6.581893714e-03f }, - { -5.640550448e-02f, +9.142869006e-01f, +1.497489866e-01f, -6.597078344e-03f }, - { -5.642906057e-02f, +9.140816786e-01f, +1.499964787e-01f, -6.612282907e-03f }, - { -5.645252268e-02f, +9.138762381e-01f, +1.502441173e-01f, -6.627507408e-03f }, - { -5.647589090e-02f, +9.136705792e-01f, +1.504919022e-01f, -6.642751853e-03f }, - { -5.649916531e-02f, +9.134647021e-01f, +1.507398335e-01f, -6.658016248e-03f }, - { -5.652234599e-02f, +9.132586068e-01f, +1.509879110e-01f, -6.673300597e-03f }, - { -5.654543302e-02f, +9.130522936e-01f, +1.512361348e-01f, -6.688604905e-03f }, - { -5.656842649e-02f, +9.128457625e-01f, +1.514845048e-01f, -6.703929179e-03f }, - { -5.659132648e-02f, +9.126390136e-01f, +1.517330210e-01f, -6.719273423e-03f }, - { -5.661413307e-02f, +9.124320471e-01f, +1.519816832e-01f, -6.734637642e-03f }, - { -5.663684634e-02f, +9.122248632e-01f, +1.522304914e-01f, -6.750021842e-03f }, - { -5.665946638e-02f, +9.120174619e-01f, +1.524794457e-01f, -6.765426027e-03f }, - { -5.668199328e-02f, +9.118098434e-01f, +1.527285458e-01f, -6.780850204e-03f }, - { -5.670442710e-02f, +9.116020078e-01f, +1.529777918e-01f, -6.796294376e-03f }, - { -5.672676795e-02f, +9.113939552e-01f, +1.532271837e-01f, -6.811758549e-03f }, - { -5.674901589e-02f, +9.111856858e-01f, +1.534767213e-01f, -6.827242728e-03f }, - { -5.677117101e-02f, +9.109771996e-01f, +1.537264047e-01f, -6.842746919e-03f }, - { -5.679323340e-02f, +9.107684969e-01f, +1.539762337e-01f, -6.858271125e-03f }, - { -5.681520314e-02f, +9.105595777e-01f, +1.542262084e-01f, -6.873815352e-03f }, - { -5.683708031e-02f, +9.103504422e-01f, +1.544763286e-01f, -6.889379605e-03f }, - { -5.685886499e-02f, +9.101410905e-01f, +1.547265943e-01f, -6.904963889e-03f }, - { -5.688055727e-02f, +9.099315228e-01f, +1.549770055e-01f, -6.920568209e-03f }, - { -5.690215723e-02f, +9.097217391e-01f, +1.552275620e-01f, -6.936192569e-03f }, - { -5.692366496e-02f, +9.095117396e-01f, +1.554782640e-01f, -6.951836974e-03f }, - { -5.694508053e-02f, +9.093015244e-01f, +1.557291112e-01f, -6.967501430e-03f }, - { -5.696640402e-02f, +9.090910937e-01f, +1.559801037e-01f, -6.983185940e-03f }, - { -5.698763554e-02f, +9.088804476e-01f, +1.562312413e-01f, -6.998890510e-03f }, - { -5.700877514e-02f, +9.086695861e-01f, +1.564825241e-01f, -7.014615145e-03f }, - { -5.702982292e-02f, +9.084585096e-01f, +1.567339520e-01f, -7.030359849e-03f }, - { -5.705077897e-02f, +9.082472180e-01f, +1.569855249e-01f, -7.046124626e-03f }, - { -5.707164336e-02f, +9.080357115e-01f, +1.572372428e-01f, -7.061909482e-03f }, - { -5.709241618e-02f, +9.078239902e-01f, +1.574891056e-01f, -7.077714420e-03f }, - { -5.711309750e-02f, +9.076120543e-01f, +1.577411133e-01f, -7.093539446e-03f }, - { -5.713368743e-02f, +9.073999039e-01f, +1.579932657e-01f, -7.109384565e-03f }, - { -5.715418602e-02f, +9.071875391e-01f, +1.582455630e-01f, -7.125249780e-03f }, - { -5.717459338e-02f, +9.069749601e-01f, +1.584980049e-01f, -7.141135096e-03f }, - { -5.719490958e-02f, +9.067621670e-01f, +1.587505915e-01f, -7.157040517e-03f }, - { -5.721513471e-02f, +9.065491599e-01f, +1.590033227e-01f, -7.172966049e-03f }, - { -5.723526885e-02f, +9.063359389e-01f, +1.592561984e-01f, -7.188911695e-03f }, - { -5.725531208e-02f, +9.061225043e-01f, +1.595092186e-01f, -7.204877460e-03f }, - { -5.727526448e-02f, +9.059088560e-01f, +1.597623832e-01f, -7.220863348e-03f }, - { -5.729512615e-02f, +9.056949943e-01f, +1.600156922e-01f, -7.236869364e-03f }, - { -5.731489716e-02f, +9.054809193e-01f, +1.602691455e-01f, -7.252895512e-03f }, - { -5.733457759e-02f, +9.052666311e-01f, +1.605227430e-01f, -7.268941796e-03f }, - { -5.735416753e-02f, +9.050521298e-01f, +1.607764848e-01f, -7.285008220e-03f }, - { -5.737366706e-02f, +9.048374156e-01f, +1.610303707e-01f, -7.301094788e-03f }, - { -5.739307627e-02f, +9.046224887e-01f, +1.612844007e-01f, -7.317201506e-03f }, - { -5.741239524e-02f, +9.044073490e-01f, +1.615385747e-01f, -7.333328376e-03f }, - { -5.743162405e-02f, +9.041919969e-01f, +1.617928927e-01f, -7.349475404e-03f }, - { -5.745076279e-02f, +9.039764323e-01f, +1.620473546e-01f, -7.365642593e-03f }, - { -5.746981153e-02f, +9.037606555e-01f, +1.623019604e-01f, -7.381829947e-03f }, - { -5.748877036e-02f, +9.035446666e-01f, +1.625567100e-01f, -7.398037471e-03f }, - { -5.750763937e-02f, +9.033284656e-01f, +1.628116034e-01f, -7.414265167e-03f }, - { -5.752641864e-02f, +9.031120528e-01f, +1.630666404e-01f, -7.430513042e-03f }, - { -5.754510825e-02f, +9.028954283e-01f, +1.633218211e-01f, -7.446781098e-03f }, - { -5.756370829e-02f, +9.026785922e-01f, +1.635771453e-01f, -7.463069339e-03f }, - { -5.758221883e-02f, +9.024615447e-01f, +1.638326131e-01f, -7.479377769e-03f }, - { -5.760063997e-02f, +9.022442858e-01f, +1.640882243e-01f, -7.495706392e-03f }, - { -5.761897178e-02f, +9.020268157e-01f, +1.643439789e-01f, -7.512055213e-03f }, - { -5.763721435e-02f, +9.018091345e-01f, +1.645998769e-01f, -7.528424234e-03f }, - { -5.765536777e-02f, +9.015912425e-01f, +1.648559182e-01f, -7.544813460e-03f }, - { -5.767343210e-02f, +9.013731396e-01f, +1.651121027e-01f, -7.561222894e-03f }, - { -5.769140745e-02f, +9.011548261e-01f, +1.653684303e-01f, -7.577652540e-03f }, - { -5.770929389e-02f, +9.009363021e-01f, +1.656249011e-01f, -7.594102403e-03f }, - { -5.772709151e-02f, +9.007175676e-01f, +1.658815150e-01f, -7.610572484e-03f }, - { -5.774480038e-02f, +9.004986230e-01f, +1.661382718e-01f, -7.627062789e-03f }, - { -5.776242060e-02f, +9.002794682e-01f, +1.663951716e-01f, -7.643573321e-03f }, - { -5.777995224e-02f, +9.000601034e-01f, +1.666522142e-01f, -7.660104084e-03f }, - { -5.779739540e-02f, +8.998405288e-01f, +1.669093997e-01f, -7.676655080e-03f }, - { -5.781475014e-02f, +8.996207445e-01f, +1.671667279e-01f, -7.693226314e-03f }, - { -5.783201657e-02f, +8.994007506e-01f, +1.674241988e-01f, -7.709817790e-03f }, - { -5.784919475e-02f, +8.991805472e-01f, +1.676818124e-01f, -7.726429509e-03f }, - { -5.786628478e-02f, +8.989601346e-01f, +1.679395686e-01f, -7.743061477e-03f }, - { -5.788328673e-02f, +8.987395128e-01f, +1.681974672e-01f, -7.759713697e-03f }, - { -5.790020070e-02f, +8.985186819e-01f, +1.684555084e-01f, -7.776386171e-03f }, - { -5.791702676e-02f, +8.982976422e-01f, +1.687136919e-01f, -7.793078904e-03f }, - { -5.793376500e-02f, +8.980763937e-01f, +1.689720178e-01f, -7.809791898e-03f }, - { -5.795041550e-02f, +8.978549365e-01f, +1.692304860e-01f, -7.826525157e-03f }, - { -5.796697834e-02f, +8.976332709e-01f, +1.694890963e-01f, -7.843278685e-03f }, - { -5.798345361e-02f, +8.974113969e-01f, +1.697478489e-01f, -7.860052484e-03f }, - { -5.799984140e-02f, +8.971893148e-01f, +1.700067435e-01f, -7.876846558e-03f }, - { -5.801614178e-02f, +8.969670245e-01f, +1.702657802e-01f, -7.893660909e-03f }, - { -5.803235484e-02f, +8.967445263e-01f, +1.705249588e-01f, -7.910495542e-03f }, - { -5.804848066e-02f, +8.965218203e-01f, +1.707842794e-01f, -7.927350459e-03f }, - { -5.806451933e-02f, +8.962989066e-01f, +1.710437419e-01f, -7.944225664e-03f }, - { -5.808047093e-02f, +8.960757854e-01f, +1.713033461e-01f, -7.961121159e-03f }, - { -5.809633554e-02f, +8.958524568e-01f, +1.715630920e-01f, -7.978036948e-03f }, - { -5.811211325e-02f, +8.956289209e-01f, +1.718229797e-01f, -7.994973033e-03f }, - { -5.812780414e-02f, +8.954051779e-01f, +1.720830089e-01f, -8.011929418e-03f }, - { -5.814340830e-02f, +8.951812279e-01f, +1.723431797e-01f, -8.028906105e-03f }, - { -5.815892580e-02f, +8.949570711e-01f, +1.726034920e-01f, -8.045903098e-03f }, - { -5.817435673e-02f, +8.947327076e-01f, +1.728639457e-01f, -8.062920399e-03f }, - { -5.818970119e-02f, +8.945081375e-01f, +1.731245407e-01f, -8.079958012e-03f }, - { -5.820495924e-02f, +8.942833610e-01f, +1.733852771e-01f, -8.097015938e-03f }, - { -5.822013097e-02f, +8.940583782e-01f, +1.736461547e-01f, -8.114094182e-03f }, - { -5.823521647e-02f, +8.938331892e-01f, +1.739071734e-01f, -8.131192745e-03f }, - { -5.825021582e-02f, +8.936077942e-01f, +1.741683333e-01f, -8.148311631e-03f }, - { -5.826512910e-02f, +8.933821934e-01f, +1.744296343e-01f, -8.165450843e-03f }, - { -5.827995640e-02f, +8.931563868e-01f, +1.746910762e-01f, -8.182610382e-03f }, - { -5.829469780e-02f, +8.929303746e-01f, +1.749526590e-01f, -8.199790252e-03f }, - { -5.830935339e-02f, +8.927041569e-01f, +1.752143827e-01f, -8.216990455e-03f }, - { -5.832392325e-02f, +8.924777339e-01f, +1.754762472e-01f, -8.234210994e-03f }, - { -5.833840746e-02f, +8.922511057e-01f, +1.757382524e-01f, -8.251451871e-03f }, - { -5.835280610e-02f, +8.920242725e-01f, +1.760003983e-01f, -8.268713090e-03f }, - { -5.836711927e-02f, +8.917972344e-01f, +1.762626848e-01f, -8.285994652e-03f }, - { -5.838134704e-02f, +8.915699915e-01f, +1.765251119e-01f, -8.303296561e-03f }, - { -5.839548949e-02f, +8.913425440e-01f, +1.767876794e-01f, -8.320618817e-03f }, - { -5.840954672e-02f, +8.911148920e-01f, +1.770503873e-01f, -8.337961425e-03f }, - { -5.842351880e-02f, +8.908870357e-01f, +1.773132356e-01f, -8.355324387e-03f }, - { -5.843740582e-02f, +8.906589751e-01f, +1.775762242e-01f, -8.372707704e-03f }, - { -5.845120786e-02f, +8.904307105e-01f, +1.778393529e-01f, -8.390111379e-03f }, - { -5.846492501e-02f, +8.902022419e-01f, +1.781026219e-01f, -8.407535414e-03f }, - { -5.847855735e-02f, +8.899735696e-01f, +1.783660309e-01f, -8.424979813e-03f }, - { -5.849210496e-02f, +8.897446936e-01f, +1.786295800e-01f, -8.442444576e-03f }, - { -5.850556793e-02f, +8.895156142e-01f, +1.788932690e-01f, -8.459929707e-03f }, - { -5.851894634e-02f, +8.892863313e-01f, +1.791570979e-01f, -8.477435207e-03f }, - { -5.853224028e-02f, +8.890568452e-01f, +1.794210666e-01f, -8.494961078e-03f }, - { -5.854544983e-02f, +8.888271561e-01f, +1.796851751e-01f, -8.512507324e-03f }, - { -5.855857506e-02f, +8.885972640e-01f, +1.799494234e-01f, -8.530073945e-03f }, - { -5.857161608e-02f, +8.883671691e-01f, +1.802138112e-01f, -8.547660944e-03f }, - { -5.858457295e-02f, +8.881368715e-01f, +1.804783386e-01f, -8.565268323e-03f }, - { -5.859744577e-02f, +8.879063714e-01f, +1.807430055e-01f, -8.582896084e-03f }, - { -5.861023462e-02f, +8.876756689e-01f, +1.810078118e-01f, -8.600544229e-03f }, - { -5.862293958e-02f, +8.874447642e-01f, +1.812727576e-01f, -8.618212759e-03f }, - { -5.863556073e-02f, +8.872136574e-01f, +1.815378426e-01f, -8.635901678e-03f }, - { -5.864809816e-02f, +8.869823487e-01f, +1.818030668e-01f, -8.653610986e-03f }, - { -5.866055196e-02f, +8.867508381e-01f, +1.820684302e-01f, -8.671340686e-03f }, - { -5.867292220e-02f, +8.865191259e-01f, +1.823339328e-01f, -8.689090780e-03f }, - { -5.868520898e-02f, +8.862872121e-01f, +1.825995743e-01f, -8.706861268e-03f }, - { -5.869741236e-02f, +8.860550970e-01f, +1.828653548e-01f, -8.724652154e-03f }, - { -5.870953245e-02f, +8.858227806e-01f, +1.831312743e-01f, -8.742463438e-03f }, - { -5.872156932e-02f, +8.855902631e-01f, +1.833973325e-01f, -8.760295123e-03f }, - { -5.873352306e-02f, +8.853575446e-01f, +1.836635296e-01f, -8.778147210e-03f }, - { -5.874539374e-02f, +8.851246253e-01f, +1.839298653e-01f, -8.796019700e-03f }, - { -5.875718146e-02f, +8.848915054e-01f, +1.841963397e-01f, -8.813912596e-03f }, - { -5.876888630e-02f, +8.846581849e-01f, +1.844629526e-01f, -8.831825899e-03f }, - { -5.878050834e-02f, +8.844246640e-01f, +1.847297040e-01f, -8.849759611e-03f }, - { -5.879204767e-02f, +8.841909429e-01f, +1.849965939e-01f, -8.867713732e-03f }, - { -5.880350436e-02f, +8.839570217e-01f, +1.852636221e-01f, -8.885688265e-03f }, - { -5.881487851e-02f, +8.837229005e-01f, +1.855307886e-01f, -8.903683211e-03f }, - { -5.882617019e-02f, +8.834885795e-01f, +1.857980933e-01f, -8.921698572e-03f }, - { -5.883737950e-02f, +8.832540589e-01f, +1.860655362e-01f, -8.939734348e-03f }, - { -5.884850651e-02f, +8.830193387e-01f, +1.863331172e-01f, -8.957790542e-03f }, - { -5.885955131e-02f, +8.827844191e-01f, +1.866008361e-01f, -8.975867154e-03f }, - { -5.887051398e-02f, +8.825493003e-01f, +1.868686931e-01f, -8.993964185e-03f }, - { -5.888139461e-02f, +8.823139824e-01f, +1.871366879e-01f, -9.012081638e-03f }, - { -5.889219328e-02f, +8.820784655e-01f, +1.874048205e-01f, -9.030219514e-03f }, - { -5.890291007e-02f, +8.818427498e-01f, +1.876730909e-01f, -9.048377812e-03f }, - { -5.891354507e-02f, +8.816068354e-01f, +1.879414989e-01f, -9.066556536e-03f }, - { -5.892409837e-02f, +8.813707226e-01f, +1.882100446e-01f, -9.084755685e-03f }, - { -5.893457003e-02f, +8.811344113e-01f, +1.884787277e-01f, -9.102975262e-03f }, - { -5.894496016e-02f, +8.808979018e-01f, +1.887475484e-01f, -9.121215266e-03f }, - { -5.895526884e-02f, +8.806611943e-01f, +1.890165064e-01f, -9.139475700e-03f }, - { -5.896549614e-02f, +8.804242888e-01f, +1.892856017e-01f, -9.157756564e-03f }, - { -5.897564215e-02f, +8.801871854e-01f, +1.895548343e-01f, -9.176057859e-03f }, - { -5.898570696e-02f, +8.799498845e-01f, +1.898242041e-01f, -9.194379586e-03f }, - { -5.899569065e-02f, +8.797123860e-01f, +1.900937110e-01f, -9.212721746e-03f }, - { -5.900559330e-02f, +8.794746902e-01f, +1.903633550e-01f, -9.231084340e-03f }, - { -5.901541499e-02f, +8.792367971e-01f, +1.906331359e-01f, -9.249467369e-03f }, - { -5.902515582e-02f, +8.789987070e-01f, +1.909030537e-01f, -9.267870833e-03f }, - { -5.903481587e-02f, +8.787604199e-01f, +1.911731083e-01f, -9.286294734e-03f }, - { -5.904439521e-02f, +8.785219361e-01f, +1.914432997e-01f, -9.304739072e-03f }, - { -5.905389393e-02f, +8.782832556e-01f, +1.917136278e-01f, -9.323203848e-03f }, - { -5.906331213e-02f, +8.780443786e-01f, +1.919840925e-01f, -9.341689062e-03f }, - { -5.907264987e-02f, +8.778053053e-01f, +1.922546937e-01f, -9.360194716e-03f }, - { -5.908190725e-02f, +8.775660358e-01f, +1.925254314e-01f, -9.378720810e-03f }, - { -5.909108434e-02f, +8.773265703e-01f, +1.927963055e-01f, -9.397267344e-03f }, - { -5.910018124e-02f, +8.770869088e-01f, +1.930673159e-01f, -9.415834320e-03f }, - { -5.910919802e-02f, +8.768470516e-01f, +1.933384626e-01f, -9.434421737e-03f }, - { -5.911813478e-02f, +8.766069987e-01f, +1.936097455e-01f, -9.453029596e-03f }, - { -5.912699159e-02f, +8.763667504e-01f, +1.938811645e-01f, -9.471657898e-03f }, - { -5.913576853e-02f, +8.761263068e-01f, +1.941527195e-01f, -9.490306643e-03f }, - { -5.914446570e-02f, +8.758856680e-01f, +1.944244105e-01f, -9.508975831e-03f }, - { -5.915308317e-02f, +8.756448342e-01f, +1.946962373e-01f, -9.527665464e-03f }, - { -5.916162104e-02f, +8.754038055e-01f, +1.949682000e-01f, -9.546375540e-03f }, - { -5.917007938e-02f, +8.751625821e-01f, +1.952402985e-01f, -9.565106062e-03f }, - { -5.917845827e-02f, +8.749211640e-01f, +1.955125326e-01f, -9.583857028e-03f }, - { -5.918675781e-02f, +8.746795516e-01f, +1.957849023e-01f, -9.602628439e-03f }, - { -5.919497807e-02f, +8.744377448e-01f, +1.960574076e-01f, -9.621420295e-03f }, - { -5.920311914e-02f, +8.741957439e-01f, +1.963300483e-01f, -9.640232597e-03f }, - { -5.921118110e-02f, +8.739535491e-01f, +1.966028244e-01f, -9.659065344e-03f }, - { -5.921916404e-02f, +8.737111603e-01f, +1.968757357e-01f, -9.677918538e-03f }, - { -5.922706804e-02f, +8.734685779e-01f, +1.971487824e-01f, -9.696792177e-03f }, - { -5.923489319e-02f, +8.732258019e-01f, +1.974219642e-01f, -9.715686262e-03f }, - { -5.924263957e-02f, +8.729828325e-01f, +1.976952810e-01f, -9.734600793e-03f }, - { -5.925030726e-02f, +8.727396699e-01f, +1.979687329e-01f, -9.753535770e-03f }, - { -5.925789634e-02f, +8.724963141e-01f, +1.982423197e-01f, -9.772491192e-03f }, - { -5.926540690e-02f, +8.722527654e-01f, +1.985160414e-01f, -9.791467061e-03f }, - { -5.927283903e-02f, +8.720090239e-01f, +1.987898979e-01f, -9.810463375e-03f }, - { -5.928019281e-02f, +8.717650897e-01f, +1.990638891e-01f, -9.829480135e-03f }, - { -5.928746832e-02f, +8.715209630e-01f, +1.993380149e-01f, -9.848517340e-03f }, - { -5.929466565e-02f, +8.712766439e-01f, +1.996122753e-01f, -9.867574990e-03f }, - { -5.930178487e-02f, +8.710321326e-01f, +1.998866701e-01f, -9.886653086e-03f }, - { -5.930882608e-02f, +8.707874293e-01f, +2.001611994e-01f, -9.905751626e-03f }, - { -5.931578936e-02f, +8.705425340e-01f, +2.004358631e-01f, -9.924870610e-03f }, - { -5.932267479e-02f, +8.702974470e-01f, +2.007106609e-01f, -9.944010038e-03f }, - { -5.932948245e-02f, +8.700521683e-01f, +2.009855930e-01f, -9.963169910e-03f }, - { -5.933621243e-02f, +8.698066982e-01f, +2.012606592e-01f, -9.982350225e-03f }, - { -5.934286482e-02f, +8.695610368e-01f, +2.015358594e-01f, -1.000155098e-02f }, - { -5.934943969e-02f, +8.693151841e-01f, +2.018111936e-01f, -1.002077218e-02f }, - { -5.935593714e-02f, +8.690691405e-01f, +2.020866616e-01f, -1.004001383e-02f }, - { -5.936235724e-02f, +8.688229060e-01f, +2.023622635e-01f, -1.005927591e-02f }, - { -5.936870008e-02f, +8.685764808e-01f, +2.026379991e-01f, -1.007855843e-02f }, - { -5.937496574e-02f, +8.683298650e-01f, +2.029138683e-01f, -1.009786140e-02f }, - { -5.938115430e-02f, +8.680830587e-01f, +2.031898712e-01f, -1.011718480e-02f }, - { -5.938726586e-02f, +8.678360622e-01f, +2.034660075e-01f, -1.013652864e-02f }, - { -5.939330049e-02f, +8.675888756e-01f, +2.037422772e-01f, -1.015589292e-02f }, - { -5.939925828e-02f, +8.673414990e-01f, +2.040186803e-01f, -1.017527764e-02f }, - { -5.940513931e-02f, +8.670939326e-01f, +2.042952167e-01f, -1.019468279e-02f }, - { -5.941094367e-02f, +8.668461765e-01f, +2.045718862e-01f, -1.021410838e-02f }, - { -5.941667144e-02f, +8.665982309e-01f, +2.048486889e-01f, -1.023355441e-02f }, - { -5.942232269e-02f, +8.663500959e-01f, +2.051256246e-01f, -1.025302087e-02f }, - { -5.942789753e-02f, +8.661017718e-01f, +2.054026933e-01f, -1.027250776e-02f }, - { -5.943339603e-02f, +8.658532585e-01f, +2.056798948e-01f, -1.029201508e-02f }, - { -5.943881827e-02f, +8.656045563e-01f, +2.059572292e-01f, -1.031154284e-02f }, - { -5.944416434e-02f, +8.653556654e-01f, +2.062346962e-01f, -1.033109103e-02f }, - { -5.944943433e-02f, +8.651065858e-01f, +2.065122959e-01f, -1.035065964e-02f }, - { -5.945462831e-02f, +8.648573178e-01f, +2.067900282e-01f, -1.037024868e-02f }, - { -5.945974637e-02f, +8.646078615e-01f, +2.070678930e-01f, -1.038985815e-02f }, - { -5.946478859e-02f, +8.643582170e-01f, +2.073458902e-01f, -1.040948805e-02f }, - { -5.946975506e-02f, +8.641083845e-01f, +2.076240197e-01f, -1.042913837e-02f }, - { -5.947464586e-02f, +8.638583642e-01f, +2.079022815e-01f, -1.044880911e-02f }, - { -5.947946108e-02f, +8.636081562e-01f, +2.081806754e-01f, -1.046850028e-02f }, - { -5.948420080e-02f, +8.633577606e-01f, +2.084592015e-01f, -1.048821187e-02f }, - { -5.948886510e-02f, +8.631071776e-01f, +2.087378595e-01f, -1.050794387e-02f }, - { -5.949345407e-02f, +8.628564073e-01f, +2.090166495e-01f, -1.052769630e-02f }, - { -5.949796779e-02f, +8.626054500e-01f, +2.092955714e-01f, -1.054746914e-02f }, - { -5.950240634e-02f, +8.623543057e-01f, +2.095746250e-01f, -1.056726239e-02f }, - { -5.950676981e-02f, +8.621029746e-01f, +2.098538103e-01f, -1.058707606e-02f }, - { -5.951105828e-02f, +8.618514569e-01f, +2.101331273e-01f, -1.060691015e-02f }, - { -5.951527184e-02f, +8.615997527e-01f, +2.104125758e-01f, -1.062676464e-02f }, - { -5.951941056e-02f, +8.613478622e-01f, +2.106921557e-01f, -1.064663954e-02f }, - { -5.952347454e-02f, +8.610957855e-01f, +2.109718671e-01f, -1.066653486e-02f }, - { -5.952746386e-02f, +8.608435227e-01f, +2.112517097e-01f, -1.068645057e-02f }, - { -5.953137860e-02f, +8.605910741e-01f, +2.115316835e-01f, -1.070638669e-02f }, - { -5.953521884e-02f, +8.603384398e-01f, +2.118117885e-01f, -1.072634322e-02f }, - { -5.953898467e-02f, +8.600856199e-01f, +2.120920245e-01f, -1.074632015e-02f }, - { -5.954267617e-02f, +8.598326146e-01f, +2.123723915e-01f, -1.076631747e-02f }, - { -5.954629343e-02f, +8.595794240e-01f, +2.126528894e-01f, -1.078633519e-02f }, - { -5.954983652e-02f, +8.593260484e-01f, +2.129335181e-01f, -1.080637331e-02f }, - { -5.955330554e-02f, +8.590724878e-01f, +2.132142776e-01f, -1.082643182e-02f }, - { -5.955670057e-02f, +8.588187423e-01f, +2.134951677e-01f, -1.084651073e-02f }, - { -5.956002168e-02f, +8.585648123e-01f, +2.137761883e-01f, -1.086661002e-02f }, - { -5.956326897e-02f, +8.583106977e-01f, +2.140573395e-01f, -1.088672970e-02f }, - { -5.956644252e-02f, +8.580563988e-01f, +2.143386210e-01f, -1.090686977e-02f }, - { -5.956954241e-02f, +8.578019157e-01f, +2.146200329e-01f, -1.092703022e-02f }, - { -5.957256872e-02f, +8.575472486e-01f, +2.149015750e-01f, -1.094721106e-02f }, - { -5.957552154e-02f, +8.572923976e-01f, +2.151832473e-01f, -1.096741227e-02f }, - { -5.957840096e-02f, +8.570373629e-01f, +2.154650497e-01f, -1.098763386e-02f }, - { -5.958120705e-02f, +8.567821446e-01f, +2.157469820e-01f, -1.100787583e-02f }, - { -5.958393990e-02f, +8.565267430e-01f, +2.160290443e-01f, -1.102813817e-02f }, - { -5.958659959e-02f, +8.562711580e-01f, +2.163112364e-01f, -1.104842088e-02f }, - { -5.958918621e-02f, +8.560153900e-01f, +2.165935582e-01f, -1.106872396e-02f }, - { -5.959169984e-02f, +8.557594390e-01f, +2.168760097e-01f, -1.108904740e-02f }, - { -5.959414057e-02f, +8.555033052e-01f, +2.171585908e-01f, -1.110939121e-02f }, - { -5.959650847e-02f, +8.552469888e-01f, +2.174413013e-01f, -1.112975538e-02f }, - { -5.959880364e-02f, +8.549904899e-01f, +2.177241413e-01f, -1.115013991e-02f }, - { -5.960102614e-02f, +8.547338087e-01f, +2.180071107e-01f, -1.117054480e-02f }, - { -5.960317608e-02f, +8.544769453e-01f, +2.182902092e-01f, -1.119097004e-02f }, - { -5.960525353e-02f, +8.542198999e-01f, +2.185734369e-01f, -1.121141563e-02f }, - { -5.960725858e-02f, +8.539626726e-01f, +2.188567938e-01f, -1.123188157e-02f }, - { -5.960919130e-02f, +8.537052637e-01f, +2.191402796e-01f, -1.125236786e-02f }, - { -5.961105179e-02f, +8.534476731e-01f, +2.194238943e-01f, -1.127287449e-02f }, - { -5.961284013e-02f, +8.531899012e-01f, +2.197076378e-01f, -1.129340147e-02f }, - { -5.961455639e-02f, +8.529319481e-01f, +2.199915101e-01f, -1.131394878e-02f }, - { -5.961620067e-02f, +8.526738139e-01f, +2.202755110e-01f, -1.133451643e-02f }, - { -5.961777305e-02f, +8.524154987e-01f, +2.205596406e-01f, -1.135510441e-02f }, - { -5.961927360e-02f, +8.521570028e-01f, +2.208438986e-01f, -1.137571272e-02f }, - { -5.962070242e-02f, +8.518983262e-01f, +2.211282850e-01f, -1.139634135e-02f }, - { -5.962205959e-02f, +8.516394693e-01f, +2.214127997e-01f, -1.141699032e-02f }, - { -5.962334519e-02f, +8.513804320e-01f, +2.216974426e-01f, -1.143765960e-02f }, - { -5.962455930e-02f, +8.511212145e-01f, +2.219822138e-01f, -1.145834920e-02f }, - { -5.962570201e-02f, +8.508618171e-01f, +2.222671129e-01f, -1.147905912e-02f }, - { -5.962677341e-02f, +8.506022399e-01f, +2.225521401e-01f, -1.149978935e-02f }, - { -5.962777357e-02f, +8.503424830e-01f, +2.228372951e-01f, -1.152053989e-02f }, - { -5.962870257e-02f, +8.500825465e-01f, +2.231225780e-01f, -1.154131073e-02f }, - { -5.962956051e-02f, +8.498224307e-01f, +2.234079885e-01f, -1.156210188e-02f }, - { -5.963034747e-02f, +8.495621358e-01f, +2.236935267e-01f, -1.158291333e-02f }, - { -5.963106352e-02f, +8.493016617e-01f, +2.239791925e-01f, -1.160374507e-02f }, - { -5.963170876e-02f, +8.490410088e-01f, +2.242649857e-01f, -1.162459711e-02f }, - { -5.963228326e-02f, +8.487801771e-01f, +2.245509063e-01f, -1.164546944e-02f }, - { -5.963278711e-02f, +8.485191669e-01f, +2.248369542e-01f, -1.166636205e-02f }, - { -5.963322039e-02f, +8.482579783e-01f, +2.251231293e-01f, -1.168727495e-02f }, - { -5.963358319e-02f, +8.479966114e-01f, +2.254094315e-01f, -1.170820813e-02f }, - { -5.963387559e-02f, +8.477350664e-01f, +2.256958607e-01f, -1.172916159e-02f }, - { -5.963409767e-02f, +8.474733435e-01f, +2.259824169e-01f, -1.175013531e-02f }, - { -5.963424952e-02f, +8.472114428e-01f, +2.262690999e-01f, -1.177112931e-02f }, - { -5.963433122e-02f, +8.469493644e-01f, +2.265559097e-01f, -1.179214358e-02f }, - { -5.963434285e-02f, +8.466871086e-01f, +2.268428462e-01f, -1.181317810e-02f }, - { -5.963428449e-02f, +8.464246755e-01f, +2.271299092e-01f, -1.183423289e-02f }, - { -5.963415624e-02f, +8.461620653e-01f, +2.274170988e-01f, -1.185530793e-02f }, - { -5.963395817e-02f, +8.458992780e-01f, +2.277044148e-01f, -1.187640322e-02f }, - { -5.963369036e-02f, +8.456363139e-01f, +2.279918571e-01f, -1.189751876e-02f }, - { -5.963335291e-02f, +8.453731732e-01f, +2.282794257e-01f, -1.191865455e-02f }, - { -5.963294588e-02f, +8.451098559e-01f, +2.285671204e-01f, -1.193981057e-02f }, - { -5.963246938e-02f, +8.448463623e-01f, +2.288549412e-01f, -1.196098683e-02f }, - { -5.963192347e-02f, +8.445826924e-01f, +2.291428879e-01f, -1.198218333e-02f }, - { -5.963130824e-02f, +8.443188466e-01f, +2.294309606e-01f, -1.200340005e-02f }, - { -5.963062378e-02f, +8.440548248e-01f, +2.297191590e-01f, -1.202463700e-02f }, - { -5.962987017e-02f, +8.437906274e-01f, +2.300074831e-01f, -1.204589416e-02f }, - { -5.962904749e-02f, +8.435262543e-01f, +2.302959329e-01f, -1.206717155e-02f }, - { -5.962815583e-02f, +8.432617059e-01f, +2.305845082e-01f, -1.208846914e-02f }, - { -5.962719526e-02f, +8.429969822e-01f, +2.308732090e-01f, -1.210978695e-02f }, - { -5.962616588e-02f, +8.427320835e-01f, +2.311620351e-01f, -1.213112496e-02f }, - { -5.962506776e-02f, +8.424670098e-01f, +2.314509865e-01f, -1.215248317e-02f }, - { -5.962390099e-02f, +8.422017613e-01f, +2.317400630e-01f, -1.217386158e-02f }, - { -5.962266566e-02f, +8.419363383e-01f, +2.320292646e-01f, -1.219526018e-02f }, - { -5.962136183e-02f, +8.416707408e-01f, +2.323185913e-01f, -1.221667896e-02f }, - { -5.961998961e-02f, +8.414049690e-01f, +2.326080428e-01f, -1.223811793e-02f }, - { -5.961854906e-02f, +8.411390231e-01f, +2.328976192e-01f, -1.225957708e-02f }, - { -5.961704028e-02f, +8.408729033e-01f, +2.331873202e-01f, -1.228105640e-02f }, - { -5.961546335e-02f, +8.406066096e-01f, +2.334771460e-01f, -1.230255589e-02f }, - { -5.961381834e-02f, +8.403401423e-01f, +2.337670962e-01f, -1.232407555e-02f }, - { -5.961210535e-02f, +8.400735015e-01f, +2.340571709e-01f, -1.234561537e-02f }, - { -5.961032446e-02f, +8.398066874e-01f, +2.343473700e-01f, -1.236717535e-02f }, - { -5.960847575e-02f, +8.395397001e-01f, +2.346376934e-01f, -1.238875548e-02f }, - { -5.960655929e-02f, +8.392725398e-01f, +2.349281409e-01f, -1.241035575e-02f }, - { -5.960457519e-02f, +8.390052067e-01f, +2.352187125e-01f, -1.243197617e-02f }, - { -5.960252351e-02f, +8.387377009e-01f, +2.355094081e-01f, -1.245361672e-02f }, - { -5.960040434e-02f, +8.384700225e-01f, +2.358002277e-01f, -1.247527741e-02f }, - { -5.959821777e-02f, +8.382021718e-01f, +2.360911710e-01f, -1.249695823e-02f }, - { -5.959596388e-02f, +8.379341490e-01f, +2.363822381e-01f, -1.251865917e-02f }, - { -5.959364274e-02f, +8.376659540e-01f, +2.366734288e-01f, -1.254038023e-02f }, - { -5.959125445e-02f, +8.373975872e-01f, +2.369647431e-01f, -1.256212141e-02f }, - { -5.958879909e-02f, +8.371290487e-01f, +2.372561808e-01f, -1.258388269e-02f }, - { -5.958627674e-02f, +8.368603387e-01f, +2.375477418e-01f, -1.260566408e-02f }, - { -5.958368747e-02f, +8.365914572e-01f, +2.378394262e-01f, -1.262746557e-02f }, - { -5.958103139e-02f, +8.363224045e-01f, +2.381312337e-01f, -1.264928715e-02f }, - { -5.957830856e-02f, +8.360531808e-01f, +2.384231642e-01f, -1.267112882e-02f }, - { -5.957551907e-02f, +8.357837861e-01f, +2.387152178e-01f, -1.269299057e-02f }, - { -5.957266301e-02f, +8.355142207e-01f, +2.390073943e-01f, -1.271487241e-02f }, - { -5.956974045e-02f, +8.352444848e-01f, +2.392996936e-01f, -1.273677432e-02f }, - { -5.956675149e-02f, +8.349745784e-01f, +2.395921155e-01f, -1.275869629e-02f }, - { -5.956369619e-02f, +8.347045017e-01f, +2.398846601e-01f, -1.278063833e-02f }, - { -5.956057466e-02f, +8.344342550e-01f, +2.401773273e-01f, -1.280260043e-02f }, - { -5.955738696e-02f, +8.341638383e-01f, +2.404701168e-01f, -1.282458258e-02f }, - { -5.955413318e-02f, +8.338932518e-01f, +2.407630287e-01f, -1.284658477e-02f }, - { -5.955081340e-02f, +8.336224957e-01f, +2.410560629e-01f, -1.286860701e-02f }, - { -5.954742771e-02f, +8.333515702e-01f, +2.413492191e-01f, -1.289064929e-02f }, - { -5.954397620e-02f, +8.330804754e-01f, +2.416424975e-01f, -1.291271159e-02f }, - { -5.954045893e-02f, +8.328092115e-01f, +2.419358978e-01f, -1.293479392e-02f }, - { -5.953687600e-02f, +8.325377786e-01f, +2.422294200e-01f, -1.295689627e-02f }, - { -5.953322748e-02f, +8.322661770e-01f, +2.425230639e-01f, -1.297901864e-02f }, - { -5.952951347e-02f, +8.319944067e-01f, +2.428168296e-01f, -1.300116101e-02f }, - { -5.952573404e-02f, +8.317224679e-01f, +2.431107168e-01f, -1.302332339e-02f }, - { -5.952188928e-02f, +8.314503608e-01f, +2.434047255e-01f, -1.304550576e-02f }, - { -5.951797926e-02f, +8.311780856e-01f, +2.436988556e-01f, -1.306770813e-02f }, - { -5.951400408e-02f, +8.309056424e-01f, +2.439931070e-01f, -1.308993048e-02f }, - { -5.950996381e-02f, +8.306330313e-01f, +2.442874796e-01f, -1.311217281e-02f }, - { -5.950585853e-02f, +8.303602527e-01f, +2.445819733e-01f, -1.313443511e-02f }, - { -5.950168834e-02f, +8.300873065e-01f, +2.448765881e-01f, -1.315671739e-02f }, - { -5.949745330e-02f, +8.298141930e-01f, +2.451713237e-01f, -1.317901962e-02f }, - { -5.949315351e-02f, +8.295409124e-01f, +2.454661802e-01f, -1.320134181e-02f }, - { -5.948878905e-02f, +8.292674647e-01f, +2.457611574e-01f, -1.322368395e-02f }, - { -5.948436000e-02f, +8.289938502e-01f, +2.460562553e-01f, -1.324604604e-02f }, - { -5.947986644e-02f, +8.287200691e-01f, +2.463514737e-01f, -1.326842806e-02f }, - { -5.947530845e-02f, +8.284461214e-01f, +2.466468125e-01f, -1.329083001e-02f }, - { -5.947068612e-02f, +8.281720074e-01f, +2.469422717e-01f, -1.331325190e-02f }, - { -5.946599953e-02f, +8.278977272e-01f, +2.472378511e-01f, -1.333569370e-02f }, - { -5.946124877e-02f, +8.276232810e-01f, +2.475335507e-01f, -1.335815541e-02f }, - { -5.945643390e-02f, +8.273486689e-01f, +2.478293703e-01f, -1.338063703e-02f }, - { -5.945155503e-02f, +8.270738912e-01f, +2.481253099e-01f, -1.340313855e-02f }, - { -5.944661222e-02f, +8.267989479e-01f, +2.484213694e-01f, -1.342565996e-02f }, - { -5.944160557e-02f, +8.265238393e-01f, +2.487175486e-01f, -1.344820127e-02f }, - { -5.943653515e-02f, +8.262485655e-01f, +2.490138475e-01f, -1.347076245e-02f }, - { -5.943140104e-02f, +8.259731267e-01f, +2.493102660e-01f, -1.349334351e-02f }, - { -5.942620334e-02f, +8.256975230e-01f, +2.496068040e-01f, -1.351594444e-02f }, - { -5.942094212e-02f, +8.254217546e-01f, +2.499034613e-01f, -1.353856523e-02f }, - { -5.941561746e-02f, +8.251458217e-01f, +2.502002379e-01f, -1.356120587e-02f }, - { -5.941022944e-02f, +8.248697244e-01f, +2.504971337e-01f, -1.358386636e-02f }, - { -5.940477816e-02f, +8.245934629e-01f, +2.507941486e-01f, -1.360654670e-02f }, - { -5.939926369e-02f, +8.243170373e-01f, +2.510912825e-01f, -1.362924687e-02f }, - { -5.939368611e-02f, +8.240404479e-01f, +2.513885353e-01f, -1.365196686e-02f }, - { -5.938804550e-02f, +8.237636948e-01f, +2.516859068e-01f, -1.367470668e-02f }, - { -5.938234196e-02f, +8.234867781e-01f, +2.519833971e-01f, -1.369746632e-02f }, - { -5.937657555e-02f, +8.232096981e-01f, +2.522810059e-01f, -1.372024576e-02f }, - { -5.937074636e-02f, +8.229324548e-01f, +2.525787333e-01f, -1.374304500e-02f }, - { -5.936485448e-02f, +8.226550485e-01f, +2.528765790e-01f, -1.376586404e-02f }, - { -5.935889999e-02f, +8.223774794e-01f, +2.531745431e-01f, -1.378870286e-02f }, - { -5.935288297e-02f, +8.220997475e-01f, +2.534726253e-01f, -1.381156147e-02f }, - { -5.934680349e-02f, +8.218218531e-01f, +2.537708257e-01f, -1.383443984e-02f }, - { -5.934066165e-02f, +8.215437962e-01f, +2.540691440e-01f, -1.385733799e-02f }, - { -5.933445753e-02f, +8.212655772e-01f, +2.543675803e-01f, -1.388025589e-02f }, - { -5.932819120e-02f, +8.209871961e-01f, +2.546661344e-01f, -1.390319354e-02f }, - { -5.932186275e-02f, +8.207086532e-01f, +2.549648062e-01f, -1.392615094e-02f }, - { -5.931547226e-02f, +8.204299485e-01f, +2.552635955e-01f, -1.394912807e-02f }, - { -5.930901982e-02f, +8.201510823e-01f, +2.555625024e-01f, -1.397212493e-02f }, - { -5.930250550e-02f, +8.198720547e-01f, +2.558615267e-01f, -1.399514152e-02f }, - { -5.929592939e-02f, +8.195928658e-01f, +2.561606683e-01f, -1.401817782e-02f }, - { -5.928929157e-02f, +8.193135159e-01f, +2.564599271e-01f, -1.404123383e-02f }, - { -5.928259213e-02f, +8.190340052e-01f, +2.567593031e-01f, -1.406430953e-02f }, - { -5.927583113e-02f, +8.187543337e-01f, +2.570587960e-01f, -1.408740493e-02f }, - { -5.926900867e-02f, +8.184745017e-01f, +2.573584058e-01f, -1.411052002e-02f }, - { -5.926212483e-02f, +8.181945092e-01f, +2.576581325e-01f, -1.413365478e-02f }, - { -5.925517969e-02f, +8.179143566e-01f, +2.579579758e-01f, -1.415680921e-02f }, - { -5.924817333e-02f, +8.176340439e-01f, +2.582579358e-01f, -1.417998331e-02f }, - { -5.924110584e-02f, +8.173535714e-01f, +2.585580122e-01f, -1.420317705e-02f }, - { -5.923397729e-02f, +8.170729391e-01f, +2.588582051e-01f, -1.422639045e-02f }, - { -5.922678777e-02f, +8.167921473e-01f, +2.591585142e-01f, -1.424962348e-02f }, - { -5.921953735e-02f, +8.165111960e-01f, +2.594589396e-01f, -1.427287614e-02f }, - { -5.921222613e-02f, +8.162300856e-01f, +2.597594810e-01f, -1.429614843e-02f }, - { -5.920485418e-02f, +8.159488162e-01f, +2.600601385e-01f, -1.431944033e-02f }, - { -5.919742158e-02f, +8.156673878e-01f, +2.603609118e-01f, -1.434275184e-02f }, - { -5.918992842e-02f, +8.153858007e-01f, +2.606618010e-01f, -1.436608295e-02f }, - { -5.918237478e-02f, +8.151040551e-01f, +2.609628058e-01f, -1.438943365e-02f }, - { -5.917476074e-02f, +8.148221512e-01f, +2.612639263e-01f, -1.441280393e-02f }, - { -5.916708638e-02f, +8.145400890e-01f, +2.615651622e-01f, -1.443619379e-02f }, - { -5.915935179e-02f, +8.142578688e-01f, +2.618665135e-01f, -1.445960321e-02f }, - { -5.915155704e-02f, +8.139754907e-01f, +2.621679801e-01f, -1.448303220e-02f }, - { -5.914370221e-02f, +8.136929549e-01f, +2.624695618e-01f, -1.450648073e-02f }, - { -5.913578740e-02f, +8.134102615e-01f, +2.627712587e-01f, -1.452994881e-02f }, - { -5.912781267e-02f, +8.131274108e-01f, +2.630730705e-01f, -1.455343641e-02f }, - { -5.911977812e-02f, +8.128444029e-01f, +2.633749972e-01f, -1.457694355e-02f }, - { -5.911168382e-02f, +8.125612380e-01f, +2.636770386e-01f, -1.460047020e-02f }, - { -5.910352985e-02f, +8.122779162e-01f, +2.639791948e-01f, -1.462401636e-02f }, - { -5.909531630e-02f, +8.119944377e-01f, +2.642814655e-01f, -1.464758202e-02f }, - { -5.908704325e-02f, +8.117108027e-01f, +2.645838506e-01f, -1.467116717e-02f }, - { -5.907871078e-02f, +8.114270114e-01f, +2.648863501e-01f, -1.469477181e-02f }, - { -5.907031897e-02f, +8.111430638e-01f, +2.651889639e-01f, -1.471839591e-02f }, - { -5.906186790e-02f, +8.108589603e-01f, +2.654916918e-01f, -1.474203949e-02f }, - { -5.905335765e-02f, +8.105747008e-01f, +2.657945338e-01f, -1.476570252e-02f }, - { -5.904478831e-02f, +8.102902857e-01f, +2.660974897e-01f, -1.478938500e-02f }, - { -5.903615996e-02f, +8.100057151e-01f, +2.664005594e-01f, -1.481308692e-02f }, - { -5.902747268e-02f, +8.097209892e-01f, +2.667037429e-01f, -1.483680827e-02f }, - { -5.901872654e-02f, +8.094361081e-01f, +2.670070400e-01f, -1.486054904e-02f }, - { -5.900992164e-02f, +8.091510719e-01f, +2.673104506e-01f, -1.488430923e-02f }, - { -5.900105805e-02f, +8.088658810e-01f, +2.676139746e-01f, -1.490808882e-02f }, - { -5.899213585e-02f, +8.085805354e-01f, +2.679176120e-01f, -1.493188780e-02f }, - { -5.898315513e-02f, +8.082950352e-01f, +2.682213626e-01f, -1.495570618e-02f }, - { -5.897411596e-02f, +8.080093808e-01f, +2.685252263e-01f, -1.497954392e-02f }, - { -5.896501843e-02f, +8.077235722e-01f, +2.688292029e-01f, -1.500340104e-02f }, - { -5.895586262e-02f, +8.074376096e-01f, +2.691332925e-01f, -1.502727751e-02f }, - { -5.894664861e-02f, +8.071514932e-01f, +2.694374949e-01f, -1.505117334e-02f }, - { -5.893737648e-02f, +8.068652231e-01f, +2.697418099e-01f, -1.507508850e-02f }, - { -5.892804632e-02f, +8.065787996e-01f, +2.700462376e-01f, -1.509902300e-02f }, - { -5.891865819e-02f, +8.062922227e-01f, +2.703507777e-01f, -1.512297682e-02f }, - { -5.890921220e-02f, +8.060054928e-01f, +2.706554301e-01f, -1.514694995e-02f }, - { -5.889970841e-02f, +8.057186098e-01f, +2.709601949e-01f, -1.517094238e-02f }, - { -5.889014690e-02f, +8.054315741e-01f, +2.712650718e-01f, -1.519495411e-02f }, - { -5.888052777e-02f, +8.051443857e-01f, +2.715700607e-01f, -1.521898512e-02f }, - { -5.887085108e-02f, +8.048570449e-01f, +2.718751616e-01f, -1.524303541e-02f }, - { -5.886111692e-02f, +8.045695518e-01f, +2.721803743e-01f, -1.526710496e-02f }, - { -5.885132538e-02f, +8.042819066e-01f, +2.724856987e-01f, -1.529119377e-02f }, - { -5.884147653e-02f, +8.039941094e-01f, +2.727911348e-01f, -1.531530183e-02f }, - { -5.883157045e-02f, +8.037061604e-01f, +2.730966824e-01f, -1.533942912e-02f }, - { -5.882160722e-02f, +8.034180599e-01f, +2.734023414e-01f, -1.536357563e-02f }, - { -5.881158693e-02f, +8.031298079e-01f, +2.737081117e-01f, -1.538774137e-02f }, - { -5.880150966e-02f, +8.028414047e-01f, +2.740139932e-01f, -1.541192631e-02f }, - { -5.879137549e-02f, +8.025528503e-01f, +2.743199858e-01f, -1.543613045e-02f }, - { -5.878118449e-02f, +8.022641451e-01f, +2.746260894e-01f, -1.546035377e-02f }, - { -5.877093675e-02f, +8.019752891e-01f, +2.749323038e-01f, -1.548459628e-02f }, - { -5.876063235e-02f, +8.016862825e-01f, +2.752386291e-01f, -1.550885795e-02f }, - { -5.875027137e-02f, +8.013971255e-01f, +2.755450649e-01f, -1.553313878e-02f }, - { -5.873985390e-02f, +8.011078183e-01f, +2.758516114e-01f, -1.555743875e-02f }, - { -5.872938000e-02f, +8.008183610e-01f, +2.761582682e-01f, -1.558175787e-02f }, - { -5.871884977e-02f, +8.005287538e-01f, +2.764650354e-01f, -1.560609611e-02f }, - { -5.870826329e-02f, +8.002389969e-01f, +2.767719129e-01f, -1.563045347e-02f }, - { -5.869762062e-02f, +7.999490904e-01f, +2.770789004e-01f, -1.565482993e-02f }, - { -5.868692187e-02f, +7.996590346e-01f, +2.773859980e-01f, -1.567922549e-02f }, - { -5.867616710e-02f, +7.993688295e-01f, +2.776932054e-01f, -1.570364014e-02f }, - { -5.866535639e-02f, +7.990784754e-01f, +2.780005227e-01f, -1.572807386e-02f }, - { -5.865448983e-02f, +7.987879725e-01f, +2.783079496e-01f, -1.575252665e-02f }, - { -5.864356750e-02f, +7.984973209e-01f, +2.786154861e-01f, -1.577699850e-02f }, - { -5.863258948e-02f, +7.982065207e-01f, +2.789231321e-01f, -1.580148939e-02f }, - { -5.862155585e-02f, +7.979155722e-01f, +2.792308874e-01f, -1.582599931e-02f }, - { -5.861046669e-02f, +7.976244755e-01f, +2.795387520e-01f, -1.585052826e-02f }, - { -5.859932207e-02f, +7.973332308e-01f, +2.798467258e-01f, -1.587507622e-02f }, - { -5.858812209e-02f, +7.970418383e-01f, +2.801548085e-01f, -1.589964318e-02f }, - { -5.857686682e-02f, +7.967502981e-01f, +2.804630002e-01f, -1.592422914e-02f }, - { -5.856555634e-02f, +7.964586105e-01f, +2.807713007e-01f, -1.594883407e-02f }, - { -5.855419074e-02f, +7.961667755e-01f, +2.810797098e-01f, -1.597345798e-02f }, - { -5.854277008e-02f, +7.958747933e-01f, +2.813882276e-01f, -1.599810084e-02f }, - { -5.853129446e-02f, +7.955826642e-01f, +2.816968539e-01f, -1.602276266e-02f }, - { -5.851976395e-02f, +7.952903884e-01f, +2.820055885e-01f, -1.604744341e-02f }, - { -5.850817864e-02f, +7.949979658e-01f, +2.823144314e-01f, -1.607214309e-02f }, - { -5.849653859e-02f, +7.947053969e-01f, +2.826233824e-01f, -1.609686168e-02f }, - { -5.848484391e-02f, +7.944126816e-01f, +2.829324415e-01f, -1.612159918e-02f }, - { -5.847309465e-02f, +7.941198202e-01f, +2.832416085e-01f, -1.614635558e-02f }, - { -5.846129092e-02f, +7.938268129e-01f, +2.835508833e-01f, -1.617113085e-02f }, - { -5.844943277e-02f, +7.935336599e-01f, +2.838602658e-01f, -1.619592500e-02f }, - { -5.843752031e-02f, +7.932403612e-01f, +2.841697559e-01f, -1.622073801e-02f }, - { -5.842555359e-02f, +7.929469172e-01f, +2.844793535e-01f, -1.624556986e-02f }, - { -5.841353272e-02f, +7.926533279e-01f, +2.847890584e-01f, -1.627042056e-02f }, - { -5.840145776e-02f, +7.923595935e-01f, +2.850988707e-01f, -1.629529008e-02f }, - { -5.838932879e-02f, +7.920657142e-01f, +2.854087900e-01f, -1.632017842e-02f }, - { -5.837714590e-02f, +7.917716902e-01f, +2.857188164e-01f, -1.634508556e-02f }, - { -5.836490917e-02f, +7.914775217e-01f, +2.860289498e-01f, -1.637001149e-02f }, - { -5.835261867e-02f, +7.911832088e-01f, +2.863391899e-01f, -1.639495620e-02f }, - { -5.834027449e-02f, +7.908887516e-01f, +2.866495368e-01f, -1.641991969e-02f }, - { -5.832787671e-02f, +7.905941505e-01f, +2.869599902e-01f, -1.644490193e-02f }, - { -5.831542540e-02f, +7.902994055e-01f, +2.872705501e-01f, -1.646990291e-02f }, - { -5.830292065e-02f, +7.900045168e-01f, +2.875812164e-01f, -1.649492264e-02f }, - { -5.829036253e-02f, +7.897094846e-01f, +2.878919890e-01f, -1.651996108e-02f }, - { -5.827775113e-02f, +7.894143091e-01f, +2.882028676e-01f, -1.654501824e-02f }, - { -5.826508653e-02f, +7.891189904e-01f, +2.885138523e-01f, -1.657009409e-02f }, - { -5.825236880e-02f, +7.888235287e-01f, +2.888249429e-01f, -1.659518863e-02f }, - { -5.823959802e-02f, +7.885279242e-01f, +2.891361394e-01f, -1.662030185e-02f }, - { -5.822677428e-02f, +7.882321771e-01f, +2.894474415e-01f, -1.664543373e-02f }, - { -5.821389766e-02f, +7.879362875e-01f, +2.897588491e-01f, -1.667058426e-02f }, - { -5.820096823e-02f, +7.876402556e-01f, +2.900703623e-01f, -1.669575344e-02f }, - { -5.818798608e-02f, +7.873440816e-01f, +2.903819808e-01f, -1.672094124e-02f }, - { -5.817495128e-02f, +7.870477656e-01f, +2.906937045e-01f, -1.674614765e-02f }, - { -5.816186392e-02f, +7.867513079e-01f, +2.910055333e-01f, -1.677137267e-02f }, - { -5.814872407e-02f, +7.864547086e-01f, +2.913174672e-01f, -1.679661628e-02f }, - { -5.813553181e-02f, +7.861579679e-01f, +2.916295059e-01f, -1.682187847e-02f }, - { -5.812228722e-02f, +7.858610859e-01f, +2.919416495e-01f, -1.684715923e-02f }, - { -5.810899039e-02f, +7.855640629e-01f, +2.922538976e-01f, -1.687245854e-02f }, - { -5.809564139e-02f, +7.852668990e-01f, +2.925662504e-01f, -1.689777639e-02f }, - { -5.808224030e-02f, +7.849695943e-01f, +2.928787076e-01f, -1.692311278e-02f }, - { -5.806878721e-02f, +7.846721491e-01f, +2.931912691e-01f, -1.694846768e-02f }, - { -5.805528218e-02f, +7.843745636e-01f, +2.935039348e-01f, -1.697384108e-02f }, - { -5.804172530e-02f, +7.840768378e-01f, +2.938167045e-01f, -1.699923298e-02f }, - { -5.802811666e-02f, +7.837789720e-01f, +2.941295783e-01f, -1.702464336e-02f }, - { -5.801445632e-02f, +7.834809664e-01f, +2.944425560e-01f, -1.705007220e-02f }, - { -5.800074437e-02f, +7.831828211e-01f, +2.947556373e-01f, -1.707551950e-02f }, - { -5.798698089e-02f, +7.828845363e-01f, +2.950688223e-01f, -1.710098524e-02f }, - { -5.797316596e-02f, +7.825861121e-01f, +2.953821109e-01f, -1.712646941e-02f }, - { -5.795929965e-02f, +7.822875489e-01f, +2.956955028e-01f, -1.715197200e-02f }, - { -5.794538205e-02f, +7.819888466e-01f, +2.960089980e-01f, -1.717749299e-02f }, - { -5.793141324e-02f, +7.816900056e-01f, +2.963225964e-01f, -1.720303237e-02f }, - { -5.791739329e-02f, +7.813910260e-01f, +2.966362979e-01f, -1.722859012e-02f }, - { -5.790332228e-02f, +7.810919079e-01f, +2.969501022e-01f, -1.725416625e-02f }, - { -5.788920029e-02f, +7.807926515e-01f, +2.972640094e-01f, -1.727976072e-02f }, - { -5.787502741e-02f, +7.804932570e-01f, +2.975780194e-01f, -1.730537353e-02f }, - { -5.786080371e-02f, +7.801937247e-01f, +2.978921319e-01f, -1.733100467e-02f }, - { -5.784652927e-02f, +7.798940546e-01f, +2.982063468e-01f, -1.735665412e-02f }, - { -5.783220417e-02f, +7.795942469e-01f, +2.985206642e-01f, -1.738232187e-02f }, - { -5.781782849e-02f, +7.792943018e-01f, +2.988350837e-01f, -1.740800791e-02f }, - { -5.780340230e-02f, +7.789942195e-01f, +2.991496054e-01f, -1.743371222e-02f }, - { -5.778892569e-02f, +7.786940002e-01f, +2.994642291e-01f, -1.745943479e-02f }, - { -5.777439874e-02f, +7.783936440e-01f, +2.997789547e-01f, -1.748517560e-02f }, - { -5.775982152e-02f, +7.780931511e-01f, +3.000937821e-01f, -1.751093465e-02f }, - { -5.774519411e-02f, +7.777925218e-01f, +3.004087111e-01f, -1.753671192e-02f }, - { -5.773051660e-02f, +7.774917560e-01f, +3.007237417e-01f, -1.756250739e-02f }, - { -5.771578906e-02f, +7.771908542e-01f, +3.010388736e-01f, -1.758832105e-02f }, - { -5.770101157e-02f, +7.768898163e-01f, +3.013541069e-01f, -1.761415290e-02f }, - { -5.768618420e-02f, +7.765886426e-01f, +3.016694414e-01f, -1.764000291e-02f }, - { -5.767130705e-02f, +7.762873333e-01f, +3.019848769e-01f, -1.766587107e-02f }, - { -5.765638018e-02f, +7.759858886e-01f, +3.023004134e-01f, -1.769175736e-02f }, - { -5.764140368e-02f, +7.756843086e-01f, +3.026160507e-01f, -1.771766179e-02f }, - { -5.762637762e-02f, +7.753825935e-01f, +3.029317887e-01f, -1.774358432e-02f }, - { -5.761130208e-02f, +7.750807434e-01f, +3.032476274e-01f, -1.776952495e-02f }, - { -5.759617715e-02f, +7.747787586e-01f, +3.035635665e-01f, -1.779548366e-02f }, - { -5.758100289e-02f, +7.744766393e-01f, +3.038796059e-01f, -1.782146044e-02f }, - { -5.756577939e-02f, +7.741743855e-01f, +3.041957456e-01f, -1.784745527e-02f }, - { -5.755050673e-02f, +7.738719975e-01f, +3.045119855e-01f, -1.787346814e-02f }, - { -5.753518499e-02f, +7.735694755e-01f, +3.048283253e-01f, -1.789949905e-02f }, - { -5.751981424e-02f, +7.732668197e-01f, +3.051447650e-01f, -1.792554796e-02f }, - { -5.750439457e-02f, +7.729640301e-01f, +3.054613045e-01f, -1.795161487e-02f }, - { -5.748892604e-02f, +7.726611070e-01f, +3.057779436e-01f, -1.797769977e-02f }, - { -5.747340875e-02f, +7.723580506e-01f, +3.060946822e-01f, -1.800380263e-02f }, - { -5.745784276e-02f, +7.720548611e-01f, +3.064115203e-01f, -1.802992345e-02f }, - { -5.744222816e-02f, +7.717515386e-01f, +3.067284576e-01f, -1.805606221e-02f }, - { -5.742656503e-02f, +7.714480832e-01f, +3.070454941e-01f, -1.808221890e-02f }, - { -5.741085343e-02f, +7.711444953e-01f, +3.073626297e-01f, -1.810839350e-02f }, - { -5.739509346e-02f, +7.708407749e-01f, +3.076798642e-01f, -1.813458600e-02f }, - { -5.737928519e-02f, +7.705369222e-01f, +3.079971975e-01f, -1.816079639e-02f }, - { -5.736342870e-02f, +7.702329374e-01f, +3.083146294e-01f, -1.818702464e-02f }, - { -5.734752407e-02f, +7.699288208e-01f, +3.086321600e-01f, -1.821327074e-02f }, - { -5.733157137e-02f, +7.696245724e-01f, +3.089497890e-01f, -1.823953469e-02f }, - { -5.731557068e-02f, +7.693201924e-01f, +3.092675163e-01f, -1.826581646e-02f }, - { -5.729952209e-02f, +7.690156811e-01f, +3.095853418e-01f, -1.829211604e-02f }, - { -5.728342566e-02f, +7.687110385e-01f, +3.099032654e-01f, -1.831843341e-02f }, - { -5.726728148e-02f, +7.684062649e-01f, +3.102212870e-01f, -1.834476857e-02f }, - { -5.725108962e-02f, +7.681013605e-01f, +3.105394064e-01f, -1.837112149e-02f }, - { -5.723485017e-02f, +7.677963254e-01f, +3.108576236e-01f, -1.839749217e-02f }, - { -5.721856321e-02f, +7.674911598e-01f, +3.111759383e-01f, -1.842388058e-02f }, - { -5.720222880e-02f, +7.671858639e-01f, +3.114943506e-01f, -1.845028671e-02f }, - { -5.718584702e-02f, +7.668804379e-01f, +3.118128601e-01f, -1.847671054e-02f }, - { -5.716941797e-02f, +7.665748819e-01f, +3.121314670e-01f, -1.850315207e-02f }, - { -5.715294170e-02f, +7.662691962e-01f, +3.124501709e-01f, -1.852961127e-02f }, - { -5.713641831e-02f, +7.659633808e-01f, +3.127689718e-01f, -1.855608813e-02f }, - { -5.711984787e-02f, +7.656574360e-01f, +3.130878696e-01f, -1.858258264e-02f }, - { -5.710323045e-02f, +7.653513620e-01f, +3.134068642e-01f, -1.860909478e-02f }, - { -5.708656614e-02f, +7.650451589e-01f, +3.137259554e-01f, -1.863562453e-02f }, - { -5.706985501e-02f, +7.647388269e-01f, +3.140451431e-01f, -1.866217188e-02f }, - { -5.705309714e-02f, +7.644323662e-01f, +3.143644272e-01f, -1.868873682e-02f }, - { -5.703629260e-02f, +7.641257769e-01f, +3.146838075e-01f, -1.871531932e-02f }, - { -5.701944149e-02f, +7.638190593e-01f, +3.150032840e-01f, -1.874191938e-02f }, - { -5.700254386e-02f, +7.635122136e-01f, +3.153228565e-01f, -1.876853697e-02f }, - { -5.698559981e-02f, +7.632052398e-01f, +3.156425249e-01f, -1.879517209e-02f }, - { -5.696860941e-02f, +7.628981382e-01f, +3.159622890e-01f, -1.882182471e-02f }, - { -5.695157273e-02f, +7.625909090e-01f, +3.162821488e-01f, -1.884849482e-02f }, - { -5.693448985e-02f, +7.622835524e-01f, +3.166021042e-01f, -1.887518241e-02f }, - { -5.691736086e-02f, +7.619760684e-01f, +3.169221549e-01f, -1.890188745e-02f }, - { -5.690018582e-02f, +7.616684574e-01f, +3.172423009e-01f, -1.892860994e-02f }, - { -5.688296482e-02f, +7.613607194e-01f, +3.175625421e-01f, -1.895534986e-02f }, - { -5.686569793e-02f, +7.610528546e-01f, +3.178828783e-01f, -1.898210719e-02f }, - { -5.684838523e-02f, +7.607448634e-01f, +3.182033094e-01f, -1.900888191e-02f }, - { -5.683102681e-02f, +7.604367457e-01f, +3.185238353e-01f, -1.903567401e-02f }, - { -5.681362272e-02f, +7.601285018e-01f, +3.188444558e-01f, -1.906248348e-02f }, - { -5.679617306e-02f, +7.598201319e-01f, +3.191651709e-01f, -1.908931029e-02f }, - { -5.677867790e-02f, +7.595116361e-01f, +3.194859804e-01f, -1.911615443e-02f }, - { -5.676113731e-02f, +7.592030147e-01f, +3.198068842e-01f, -1.914301589e-02f }, - { -5.674355138e-02f, +7.588942678e-01f, +3.201278822e-01f, -1.916989465e-02f }, - { -5.672592019e-02f, +7.585853955e-01f, +3.204489742e-01f, -1.919679069e-02f }, - { -5.670824380e-02f, +7.582763982e-01f, +3.207701601e-01f, -1.922370400e-02f }, - { -5.669052229e-02f, +7.579672759e-01f, +3.210914398e-01f, -1.925063455e-02f }, - { -5.667275575e-02f, +7.576580288e-01f, +3.214128132e-01f, -1.927758234e-02f }, - { -5.665494425e-02f, +7.573486571e-01f, +3.217342801e-01f, -1.930454735e-02f }, - { -5.663708786e-02f, +7.570391610e-01f, +3.220558404e-01f, -1.933152956e-02f }, - { -5.661918667e-02f, +7.567295407e-01f, +3.223774940e-01f, -1.935852895e-02f }, - { -5.660124075e-02f, +7.564197963e-01f, +3.226992408e-01f, -1.938554550e-02f }, - { -5.658325018e-02f, +7.561099280e-01f, +3.230210806e-01f, -1.941257921e-02f }, - { -5.656521503e-02f, +7.557999361e-01f, +3.233430133e-01f, -1.943963005e-02f }, - { -5.654713538e-02f, +7.554898206e-01f, +3.236650389e-01f, -1.946669801e-02f }, - { -5.652901131e-02f, +7.551795818e-01f, +3.239871571e-01f, -1.949378307e-02f }, - { -5.651084290e-02f, +7.548692198e-01f, +3.243093678e-01f, -1.952088522e-02f }, - { -5.649263022e-02f, +7.545587349e-01f, +3.246316709e-01f, -1.954800443e-02f }, - { -5.647437335e-02f, +7.542481271e-01f, +3.249540663e-01f, -1.957514069e-02f }, - { -5.645607236e-02f, +7.539373968e-01f, +3.252765539e-01f, -1.960229398e-02f }, - { -5.643772734e-02f, +7.536265440e-01f, +3.255991335e-01f, -1.962946429e-02f }, - { -5.641933835e-02f, +7.533155690e-01f, +3.259218051e-01f, -1.965665160e-02f }, - { -5.640090548e-02f, +7.530044718e-01f, +3.262445684e-01f, -1.968385589e-02f }, - { -5.638242880e-02f, +7.526932528e-01f, +3.265674233e-01f, -1.971107714e-02f }, - { -5.636390839e-02f, +7.523819121e-01f, +3.268903698e-01f, -1.973831534e-02f }, - { -5.634534432e-02f, +7.520704498e-01f, +3.272134077e-01f, -1.976557047e-02f }, - { -5.632673668e-02f, +7.517588662e-01f, +3.275365369e-01f, -1.979284251e-02f }, - { -5.630808553e-02f, +7.514471614e-01f, +3.278597572e-01f, -1.982013145e-02f }, - { -5.628939096e-02f, +7.511353356e-01f, +3.281830685e-01f, -1.984743727e-02f }, - { -5.627065304e-02f, +7.508233890e-01f, +3.285064707e-01f, -1.987475995e-02f }, - { -5.625187185e-02f, +7.505113218e-01f, +3.288299637e-01f, -1.990209947e-02f }, - { -5.623304746e-02f, +7.501991341e-01f, +3.291535473e-01f, -1.992945582e-02f }, - { -5.621417995e-02f, +7.498868261e-01f, +3.294772215e-01f, -1.995682897e-02f }, - { -5.619526939e-02f, +7.495743981e-01f, +3.298009860e-01f, -1.998421892e-02f }, - { -5.617631587e-02f, +7.492618501e-01f, +3.301248407e-01f, -2.001162564e-02f }, - { -5.615731946e-02f, +7.489491824e-01f, +3.304487856e-01f, -2.003904911e-02f }, - { -5.613828023e-02f, +7.486363951e-01f, +3.307728205e-01f, -2.006648932e-02f }, - { -5.611919827e-02f, +7.483234885e-01f, +3.310969453e-01f, -2.009394625e-02f }, - { -5.610007364e-02f, +7.480104627e-01f, +3.314211598e-01f, -2.012141988e-02f }, - { -5.608090642e-02f, +7.476973179e-01f, +3.317454639e-01f, -2.014891020e-02f }, - { -5.606169669e-02f, +7.473840543e-01f, +3.320698576e-01f, -2.017641718e-02f }, - { -5.604244453e-02f, +7.470706720e-01f, +3.323943405e-01f, -2.020394081e-02f }, - { -5.602315001e-02f, +7.467571712e-01f, +3.327189127e-01f, -2.023148107e-02f }, - { -5.600381321e-02f, +7.464435522e-01f, +3.330435740e-01f, -2.025903794e-02f }, - { -5.598443420e-02f, +7.461298151e-01f, +3.333683243e-01f, -2.028661141e-02f }, - { -5.596501306e-02f, +7.458159600e-01f, +3.336931634e-01f, -2.031420145e-02f }, - { -5.594554986e-02f, +7.455019872e-01f, +3.340180912e-01f, -2.034180804e-02f }, - { -5.592604469e-02f, +7.451878969e-01f, +3.343431076e-01f, -2.036943118e-02f }, - { -5.590649761e-02f, +7.448736891e-01f, +3.346682125e-01f, -2.039707084e-02f }, - { -5.588690871e-02f, +7.445593642e-01f, +3.349934057e-01f, -2.042472700e-02f }, - { -5.586727805e-02f, +7.442449222e-01f, +3.353186871e-01f, -2.045239964e-02f }, - { -5.584760571e-02f, +7.439303635e-01f, +3.356440565e-01f, -2.048008875e-02f }, - { -5.582789178e-02f, +7.436156880e-01f, +3.359695139e-01f, -2.050779431e-02f }, - { -5.580813632e-02f, +7.433008961e-01f, +3.362950591e-01f, -2.053551629e-02f }, - { -5.578833941e-02f, +7.429859879e-01f, +3.366206920e-01f, -2.056325469e-02f }, - { -5.576850113e-02f, +7.426709636e-01f, +3.369464124e-01f, -2.059100947e-02f }, - { -5.574862155e-02f, +7.423558234e-01f, +3.372722202e-01f, -2.061878063e-02f }, - { -5.572870075e-02f, +7.420405674e-01f, +3.375981153e-01f, -2.064656814e-02f }, - { -5.570873880e-02f, +7.417251959e-01f, +3.379240976e-01f, -2.067437199e-02f }, - { -5.568873578e-02f, +7.414097090e-01f, +3.382501669e-01f, -2.070219216e-02f }, - { -5.566869176e-02f, +7.410941069e-01f, +3.385763231e-01f, -2.073002862e-02f }, - { -5.564860682e-02f, +7.407783897e-01f, +3.389025660e-01f, -2.075788136e-02f }, - { -5.562848104e-02f, +7.404625577e-01f, +3.392288956e-01f, -2.078575035e-02f }, - { -5.560831448e-02f, +7.401466111e-01f, +3.395553117e-01f, -2.081363559e-02f }, - { -5.558810723e-02f, +7.398305500e-01f, +3.398818142e-01f, -2.084153705e-02f }, - { -5.556785936e-02f, +7.395143746e-01f, +3.402084029e-01f, -2.086945472e-02f }, - { -5.554757095e-02f, +7.391980851e-01f, +3.405350777e-01f, -2.089738856e-02f }, - { -5.552724207e-02f, +7.388816817e-01f, +3.408618385e-01f, -2.092533857e-02f }, - { -5.550687279e-02f, +7.385651645e-01f, +3.411886851e-01f, -2.095330472e-02f }, - { -5.548646320e-02f, +7.382485338e-01f, +3.415156174e-01f, -2.098128700e-02f }, - { -5.546601336e-02f, +7.379317896e-01f, +3.418426354e-01f, -2.100928539e-02f }, - { -5.544552335e-02f, +7.376149323e-01f, +3.421697387e-01f, -2.103729986e-02f }, - { -5.542499324e-02f, +7.372979620e-01f, +3.424969274e-01f, -2.106533040e-02f }, - { -5.540442312e-02f, +7.369808788e-01f, +3.428242013e-01f, -2.109337699e-02f }, - { -5.538381306e-02f, +7.366636830e-01f, +3.431515602e-01f, -2.112143960e-02f }, - { -5.536316312e-02f, +7.363463747e-01f, +3.434790041e-01f, -2.114951822e-02f }, - { -5.534247339e-02f, +7.360289541e-01f, +3.438065327e-01f, -2.117761283e-02f }, - { -5.532174395e-02f, +7.357114214e-01f, +3.441341461e-01f, -2.120572342e-02f }, - { -5.530097485e-02f, +7.353937768e-01f, +3.444618439e-01f, -2.123384995e-02f }, - { -5.528016619e-02f, +7.350760204e-01f, +3.447896261e-01f, -2.126199241e-02f }, - { -5.525931803e-02f, +7.347581525e-01f, +3.451174926e-01f, -2.129015078e-02f }, - { -5.523843046e-02f, +7.344401732e-01f, +3.454454432e-01f, -2.131832504e-02f }, - { -5.521750353e-02f, +7.341220827e-01f, +3.457734778e-01f, -2.134651517e-02f }, - { -5.519653734e-02f, +7.338038812e-01f, +3.461015962e-01f, -2.137472115e-02f }, - { -5.517553195e-02f, +7.334855689e-01f, +3.464297984e-01f, -2.140294296e-02f }, - { -5.515448744e-02f, +7.331671459e-01f, +3.467580842e-01f, -2.143118058e-02f }, - { -5.513340388e-02f, +7.328486125e-01f, +3.470864534e-01f, -2.145943399e-02f }, - { -5.511228134e-02f, +7.325299688e-01f, +3.474149060e-01f, -2.148770317e-02f }, - { -5.509111991e-02f, +7.322112150e-01f, +3.477434418e-01f, -2.151598810e-02f }, - { -5.506991966e-02f, +7.318923513e-01f, +3.480720606e-01f, -2.154428875e-02f }, - { -5.504868065e-02f, +7.315733778e-01f, +3.484007623e-01f, -2.157260512e-02f }, - { -5.502740298e-02f, +7.312542948e-01f, +3.487295469e-01f, -2.160093718e-02f }, - { -5.500608670e-02f, +7.309351024e-01f, +3.490584141e-01f, -2.162928490e-02f }, - { -5.498473189e-02f, +7.306158008e-01f, +3.493873638e-01f, -2.165764827e-02f }, - { -5.496333863e-02f, +7.302963903e-01f, +3.497163959e-01f, -2.168602727e-02f }, - { -5.494190699e-02f, +7.299768709e-01f, +3.500455102e-01f, -2.171442188e-02f }, - { -5.492043705e-02f, +7.296572429e-01f, +3.503747067e-01f, -2.174283207e-02f }, - { -5.489892888e-02f, +7.293375064e-01f, +3.507039852e-01f, -2.177125783e-02f }, - { -5.487738256e-02f, +7.290176616e-01f, +3.510333455e-01f, -2.179969913e-02f }, - { -5.485579815e-02f, +7.286977088e-01f, +3.513627875e-01f, -2.182815596e-02f }, - { -5.483417574e-02f, +7.283776481e-01f, +3.516923111e-01f, -2.185662829e-02f }, - { -5.481251539e-02f, +7.280574796e-01f, +3.520219162e-01f, -2.188511610e-02f }, - { -5.479081718e-02f, +7.277372036e-01f, +3.523516026e-01f, -2.191361938e-02f }, - { -5.476908119e-02f, +7.274168203e-01f, +3.526813701e-01f, -2.194213809e-02f }, - { -5.474730748e-02f, +7.270963298e-01f, +3.530112187e-01f, -2.197067223e-02f }, - { -5.472549614e-02f, +7.267757323e-01f, +3.533411482e-01f, -2.199922176e-02f }, - { -5.470364724e-02f, +7.264550280e-01f, +3.536711584e-01f, -2.202778667e-02f }, - { -5.468176084e-02f, +7.261342170e-01f, +3.540012493e-01f, -2.205636694e-02f }, - { -5.465983703e-02f, +7.258132997e-01f, +3.543314207e-01f, -2.208496254e-02f }, - { -5.463787587e-02f, +7.254922761e-01f, +3.546616725e-01f, -2.211357346e-02f }, - { -5.461587745e-02f, +7.251711464e-01f, +3.549920045e-01f, -2.214219967e-02f }, - { -5.459384183e-02f, +7.248499108e-01f, +3.553224165e-01f, -2.217084115e-02f }, - { -5.457176909e-02f, +7.245285695e-01f, +3.556529085e-01f, -2.219949788e-02f }, - { -5.454965931e-02f, +7.242071227e-01f, +3.559834804e-01f, -2.222816984e-02f }, - { -5.452751254e-02f, +7.238855706e-01f, +3.563141319e-01f, -2.225685701e-02f }, - { -5.450532888e-02f, +7.235639133e-01f, +3.566448630e-01f, -2.228555936e-02f }, - { -5.448310839e-02f, +7.232421510e-01f, +3.569756734e-01f, -2.231427688e-02f }, - { -5.446085115e-02f, +7.229202840e-01f, +3.573065632e-01f, -2.234300954e-02f }, - { -5.443855722e-02f, +7.225983123e-01f, +3.576375321e-01f, -2.237175733e-02f }, - { -5.441622669e-02f, +7.222762363e-01f, +3.579685799e-01f, -2.240052021e-02f }, - { -5.439385962e-02f, +7.219540560e-01f, +3.582997067e-01f, -2.242929816e-02f }, - { -5.437145610e-02f, +7.216317716e-01f, +3.586309121e-01f, -2.245809118e-02f }, - { -5.434901618e-02f, +7.213093834e-01f, +3.589621962e-01f, -2.248689923e-02f }, - { -5.432653996e-02f, +7.209868915e-01f, +3.592935587e-01f, -2.251572229e-02f }, - { -5.430402749e-02f, +7.206642961e-01f, +3.596249995e-01f, -2.254456034e-02f }, - { -5.428147885e-02f, +7.203415974e-01f, +3.599565185e-01f, -2.257341336e-02f }, - { -5.425889412e-02f, +7.200187955e-01f, +3.602881155e-01f, -2.260228132e-02f }, - { -5.423627337e-02f, +7.196958907e-01f, +3.606197904e-01f, -2.263116421e-02f }, - { -5.421361667e-02f, +7.193728831e-01f, +3.609515431e-01f, -2.266006200e-02f }, - { -5.419092410e-02f, +7.190497730e-01f, +3.612833734e-01f, -2.268897467e-02f }, - { -5.416819572e-02f, +7.187265605e-01f, +3.616152812e-01f, -2.271790220e-02f }, - { -5.414543161e-02f, +7.184032457e-01f, +3.619472663e-01f, -2.274684456e-02f }, - { -5.412263185e-02f, +7.180798289e-01f, +3.622793287e-01f, -2.277580174e-02f }, - { -5.409979650e-02f, +7.177563103e-01f, +3.626114681e-01f, -2.280477371e-02f }, - { -5.407692564e-02f, +7.174326900e-01f, +3.629436844e-01f, -2.283376044e-02f }, - { -5.405401935e-02f, +7.171089682e-01f, +3.632759775e-01f, -2.286276192e-02f }, - { -5.403107768e-02f, +7.167851452e-01f, +3.636083473e-01f, -2.289177812e-02f }, - { -5.400810073e-02f, +7.164612210e-01f, +3.639407936e-01f, -2.292080903e-02f }, - { -5.398508856e-02f, +7.161371959e-01f, +3.642733163e-01f, -2.294985461e-02f }, - { -5.396204124e-02f, +7.158130701e-01f, +3.646059152e-01f, -2.297891485e-02f }, - { -5.393895884e-02f, +7.154888437e-01f, +3.649385903e-01f, -2.300798972e-02f }, - { -5.391584144e-02f, +7.151645170e-01f, +3.652713412e-01f, -2.303707919e-02f }, - { -5.389268911e-02f, +7.148400900e-01f, +3.656041680e-01f, -2.306618326e-02f }, - { -5.386950193e-02f, +7.145155631e-01f, +3.659370705e-01f, -2.309530189e-02f }, - { -5.384627996e-02f, +7.141909364e-01f, +3.662700485e-01f, -2.312443506e-02f }, - { -5.382302328e-02f, +7.138662100e-01f, +3.666031020e-01f, -2.315358275e-02f }, - { -5.379973196e-02f, +7.135413841e-01f, +3.669362306e-01f, -2.318274493e-02f }, - { -5.377640607e-02f, +7.132164590e-01f, +3.672694344e-01f, -2.321192159e-02f }, - { -5.375304569e-02f, +7.128914348e-01f, +3.676027132e-01f, -2.324111270e-02f }, - { -5.372965088e-02f, +7.125663118e-01f, +3.679360669e-01f, -2.327031823e-02f }, - { -5.370622173e-02f, +7.122410900e-01f, +3.682694952e-01f, -2.329953816e-02f }, - { -5.368275829e-02f, +7.119157697e-01f, +3.686029981e-01f, -2.332877247e-02f }, - { -5.365926065e-02f, +7.115903510e-01f, +3.689365754e-01f, -2.335802114e-02f }, - { -5.363572888e-02f, +7.112648342e-01f, +3.692702270e-01f, -2.338728414e-02f }, - { -5.361216304e-02f, +7.109392194e-01f, +3.696039527e-01f, -2.341656145e-02f }, - { -5.358856321e-02f, +7.106135068e-01f, +3.699377525e-01f, -2.344585305e-02f }, - { -5.356492947e-02f, +7.102876966e-01f, +3.702716261e-01f, -2.347515891e-02f }, - { -5.354126188e-02f, +7.099617891e-01f, +3.706055734e-01f, -2.350447901e-02f }, - { -5.351756051e-02f, +7.096357842e-01f, +3.709395943e-01f, -2.353381332e-02f }, - { -5.349382545e-02f, +7.093096823e-01f, +3.712736886e-01f, -2.356316182e-02f }, - { -5.347005675e-02f, +7.089834836e-01f, +3.716078562e-01f, -2.359252450e-02f }, - { -5.344625449e-02f, +7.086571882e-01f, +3.719420970e-01f, -2.362190131e-02f }, - { -5.342241875e-02f, +7.083307963e-01f, +3.722764108e-01f, -2.365129225e-02f }, - { -5.339854959e-02f, +7.080043080e-01f, +3.726107975e-01f, -2.368069728e-02f }, - { -5.337464709e-02f, +7.076777237e-01f, +3.729452569e-01f, -2.371011639e-02f }, - { -5.335071132e-02f, +7.073510434e-01f, +3.732797888e-01f, -2.373954954e-02f }, - { -5.332674235e-02f, +7.070242673e-01f, +3.736143933e-01f, -2.376899672e-02f }, - { -5.330274025e-02f, +7.066973957e-01f, +3.739490700e-01f, -2.379845790e-02f }, - { -5.327870509e-02f, +7.063704287e-01f, +3.742838189e-01f, -2.382793305e-02f }, - { -5.325463695e-02f, +7.060433665e-01f, +3.746186398e-01f, -2.385742216e-02f }, - { -5.323053590e-02f, +7.057162093e-01f, +3.749535326e-01f, -2.388692520e-02f }, - { -5.320640200e-02f, +7.053889572e-01f, +3.752884971e-01f, -2.391644214e-02f }, - { -5.318223533e-02f, +7.050616105e-01f, +3.756235333e-01f, -2.394597296e-02f }, - { -5.315803596e-02f, +7.047341694e-01f, +3.759586408e-01f, -2.397551763e-02f }, - { -5.313380397e-02f, +7.044066339e-01f, +3.762938197e-01f, -2.400507614e-02f }, - { -5.310953941e-02f, +7.040790044e-01f, +3.766290698e-01f, -2.403464845e-02f }, - { -5.308524237e-02f, +7.037512810e-01f, +3.769643909e-01f, -2.406423454e-02f }, - { -5.306091292e-02f, +7.034234638e-01f, +3.772997828e-01f, -2.409383439e-02f }, - { -5.303655112e-02f, +7.030955531e-01f, +3.776352455e-01f, -2.412344797e-02f }, - { -5.301215705e-02f, +7.027675491e-01f, +3.779707788e-01f, -2.415307527e-02f }, - { -5.298773078e-02f, +7.024394519e-01f, +3.783063825e-01f, -2.418271624e-02f }, - { -5.296327238e-02f, +7.021112617e-01f, +3.786420566e-01f, -2.421237087e-02f }, - { -5.293878193e-02f, +7.017829788e-01f, +3.789778008e-01f, -2.424203914e-02f }, - { -5.291425948e-02f, +7.014546032e-01f, +3.793136151e-01f, -2.427172102e-02f }, - { -5.288970511e-02f, +7.011261352e-01f, +3.796494992e-01f, -2.430141648e-02f }, - { -5.286511890e-02f, +7.007975749e-01f, +3.799854530e-01f, -2.433112550e-02f }, - { -5.284050092e-02f, +7.004689226e-01f, +3.803214765e-01f, -2.436084805e-02f }, - { -5.281585123e-02f, +7.001401785e-01f, +3.806575694e-01f, -2.439058412e-02f }, - { -5.279116991e-02f, +6.998113426e-01f, +3.809937316e-01f, -2.442033366e-02f }, - { -5.276645702e-02f, +6.994824153e-01f, +3.813299629e-01f, -2.445009667e-02f }, - { -5.274171264e-02f, +6.991533966e-01f, +3.816662633e-01f, -2.447987311e-02f }, - { -5.271693684e-02f, +6.988242869e-01f, +3.820026325e-01f, -2.450966296e-02f }, - { -5.269212969e-02f, +6.984950861e-01f, +3.823390705e-01f, -2.453946619e-02f }, - { -5.266729126e-02f, +6.981657947e-01f, +3.826755771e-01f, -2.456928278e-02f }, - { -5.264242161e-02f, +6.978364126e-01f, +3.830121520e-01f, -2.459911271e-02f }, - { -5.261752083e-02f, +6.975069402e-01f, +3.833487953e-01f, -2.462895594e-02f }, - { -5.259258898e-02f, +6.971773775e-01f, +3.836855068e-01f, -2.465881245e-02f }, - { -5.256762613e-02f, +6.968477249e-01f, +3.840222862e-01f, -2.468868221e-02f }, - { -5.254263236e-02f, +6.965179824e-01f, +3.843591335e-01f, -2.471856521e-02f }, - { -5.251760772e-02f, +6.961881503e-01f, +3.846960485e-01f, -2.474846141e-02f }, - { -5.249255230e-02f, +6.958582288e-01f, +3.850330311e-01f, -2.477837080e-02f }, - { -5.246746616e-02f, +6.955282179e-01f, +3.853700811e-01f, -2.480829333e-02f }, - { -5.244234938e-02f, +6.951981180e-01f, +3.857071983e-01f, -2.483822900e-02f }, - { -5.241720201e-02f, +6.948679292e-01f, +3.860443828e-01f, -2.486817776e-02f }, - { -5.239202415e-02f, +6.945376516e-01f, +3.863816342e-01f, -2.489813960e-02f }, - { -5.236681584e-02f, +6.942072855e-01f, +3.867189524e-01f, -2.492811449e-02f }, - { -5.234157717e-02f, +6.938768311e-01f, +3.870563373e-01f, -2.495810241e-02f }, - { -5.231630820e-02f, +6.935462886e-01f, +3.873937888e-01f, -2.498810332e-02f }, - { -5.229100900e-02f, +6.932156580e-01f, +3.877313067e-01f, -2.501811720e-02f }, - { -5.226567965e-02f, +6.928849397e-01f, +3.880688909e-01f, -2.504814403e-02f }, - { -5.224032022e-02f, +6.925541338e-01f, +3.884065411e-01f, -2.507818379e-02f }, - { -5.221493076e-02f, +6.922232404e-01f, +3.887442574e-01f, -2.510823643e-02f }, - { -5.218951136e-02f, +6.918922599e-01f, +3.890820394e-01f, -2.513830194e-02f }, - { -5.216406208e-02f, +6.915611922e-01f, +3.894198871e-01f, -2.516838029e-02f }, - { -5.213858300e-02f, +6.912300378e-01f, +3.897578004e-01f, -2.519847146e-02f }, - { -5.211307417e-02f, +6.908987966e-01f, +3.900957790e-01f, -2.522857541e-02f }, - { -5.208753568e-02f, +6.905674690e-01f, +3.904338229e-01f, -2.525869212e-02f }, - { -5.206196759e-02f, +6.902360551e-01f, +3.907719318e-01f, -2.528882157e-02f }, - { -5.203636997e-02f, +6.899045550e-01f, +3.911101057e-01f, -2.531896373e-02f }, - { -5.201074290e-02f, +6.895729691e-01f, +3.914483444e-01f, -2.534911857e-02f }, - { -5.198508643e-02f, +6.892412974e-01f, +3.917866477e-01f, -2.537928607e-02f }, - { -5.195940064e-02f, +6.889095401e-01f, +3.921250156e-01f, -2.540946619e-02f }, - { -5.193368560e-02f, +6.885776975e-01f, +3.924634478e-01f, -2.543965891e-02f }, - { -5.190794138e-02f, +6.882457697e-01f, +3.928019442e-01f, -2.546986421e-02f }, - { -5.188216805e-02f, +6.879137568e-01f, +3.931405046e-01f, -2.550008206e-02f }, - { -5.185636568e-02f, +6.875816592e-01f, +3.934791290e-01f, -2.553031243e-02f }, - { -5.183053433e-02f, +6.872494769e-01f, +3.938178171e-01f, -2.556055529e-02f }, - { -5.180467408e-02f, +6.869172102e-01f, +3.941565688e-01f, -2.559081062e-02f }, - { -5.177878499e-02f, +6.865848593e-01f, +3.944953840e-01f, -2.562107838e-02f }, - { -5.175286714e-02f, +6.862524243e-01f, +3.948342626e-01f, -2.565135856e-02f }, - { -5.172692059e-02f, +6.859199054e-01f, +3.951732042e-01f, -2.568165113e-02f }, - { -5.170094541e-02f, +6.855873028e-01f, +3.955122090e-01f, -2.571195605e-02f }, - { -5.167494167e-02f, +6.852546167e-01f, +3.958512766e-01f, -2.574227331e-02f }, - { -5.164890945e-02f, +6.849218472e-01f, +3.961904069e-01f, -2.577260287e-02f }, - { -5.162284880e-02f, +6.845889947e-01f, +3.965295998e-01f, -2.580294470e-02f }, - { -5.159675980e-02f, +6.842560591e-01f, +3.968688551e-01f, -2.583329878e-02f }, - { -5.157064252e-02f, +6.839230409e-01f, +3.972081727e-01f, -2.586366508e-02f }, - { -5.154449702e-02f, +6.835899400e-01f, +3.975475525e-01f, -2.589404358e-02f }, - { -5.151832338e-02f, +6.832567567e-01f, +3.978869942e-01f, -2.592443425e-02f }, - { -5.149212166e-02f, +6.829234913e-01f, +3.982264977e-01f, -2.595483705e-02f }, - { -5.146589193e-02f, +6.825901438e-01f, +3.985660630e-01f, -2.598525196e-02f }, - { -5.143963427e-02f, +6.822567144e-01f, +3.989056898e-01f, -2.601567895e-02f }, - { -5.141334873e-02f, +6.819232035e-01f, +3.992453779e-01f, -2.604611800e-02f }, - { -5.138703539e-02f, +6.815896110e-01f, +3.995851274e-01f, -2.607656908e-02f }, - { -5.136069431e-02f, +6.812559373e-01f, +3.999249379e-01f, -2.610703216e-02f }, - { -5.133432558e-02f, +6.809221825e-01f, +4.002648093e-01f, -2.613750720e-02f }, - { -5.130792924e-02f, +6.805883468e-01f, +4.006047415e-01f, -2.616799420e-02f }, - { -5.128150537e-02f, +6.802544304e-01f, +4.009447344e-01f, -2.619849310e-02f }, - { -5.125505405e-02f, +6.799204334e-01f, +4.012847878e-01f, -2.622900390e-02f }, - { -5.122857533e-02f, +6.795863561e-01f, +4.016249015e-01f, -2.625952655e-02f }, - { -5.120206929e-02f, +6.792521986e-01f, +4.019650754e-01f, -2.629006103e-02f }, - { -5.117553600e-02f, +6.789179612e-01f, +4.023053093e-01f, -2.632060732e-02f }, - { -5.114897551e-02f, +6.785836440e-01f, +4.026456031e-01f, -2.635116538e-02f }, - { -5.112238791e-02f, +6.782492471e-01f, +4.029859567e-01f, -2.638173519e-02f }, - { -5.109577326e-02f, +6.779147709e-01f, +4.033263699e-01f, -2.641231671e-02f }, - { -5.106913162e-02f, +6.775802154e-01f, +4.036668425e-01f, -2.644290992e-02f }, - { -5.104246307e-02f, +6.772455809e-01f, +4.040073744e-01f, -2.647351480e-02f }, - { -5.101576767e-02f, +6.769108675e-01f, +4.043479654e-01f, -2.650413130e-02f }, - { -5.098904550e-02f, +6.765760755e-01f, +4.046886155e-01f, -2.653475941e-02f }, - { -5.096229661e-02f, +6.762412050e-01f, +4.050293243e-01f, -2.656539910e-02f }, - { -5.093552108e-02f, +6.759062562e-01f, +4.053700919e-01f, -2.659605033e-02f }, - { -5.090871897e-02f, +6.755712292e-01f, +4.057109180e-01f, -2.662671308e-02f }, - { -5.088189036e-02f, +6.752361244e-01f, +4.060518025e-01f, -2.665738731e-02f }, - { -5.085503531e-02f, +6.749009418e-01f, +4.063927452e-01f, -2.668807301e-02f }, - { -5.082815388e-02f, +6.745656817e-01f, +4.067337460e-01f, -2.671877013e-02f }, - { -5.080124615e-02f, +6.742303442e-01f, +4.070748047e-01f, -2.674947866e-02f }, - { -5.077431218e-02f, +6.738949295e-01f, +4.074159212e-01f, -2.678019856e-02f }, - { -5.074735205e-02f, +6.735594378e-01f, +4.077570954e-01f, -2.681092981e-02f }, - { -5.072036581e-02f, +6.732238693e-01f, +4.080983270e-01f, -2.684167237e-02f }, - { -5.069335353e-02f, +6.728882242e-01f, +4.084396159e-01f, -2.687242621e-02f }, - { -5.066631529e-02f, +6.725525027e-01f, +4.087809621e-01f, -2.690319131e-02f }, - { -5.063925115e-02f, +6.722167049e-01f, +4.091223652e-01f, -2.693396764e-02f }, - { -5.061216118e-02f, +6.718808311e-01f, +4.094638252e-01f, -2.696475516e-02f }, - { -5.058504544e-02f, +6.715448814e-01f, +4.098053420e-01f, -2.699555385e-02f }, - { -5.055790401e-02f, +6.712088560e-01f, +4.101469153e-01f, -2.702636369e-02f }, - { -5.053073694e-02f, +6.708727551e-01f, +4.104885450e-01f, -2.705718463e-02f }, - { -5.050354431e-02f, +6.705365788e-01f, +4.108302310e-01f, -2.708801665e-02f }, - { -5.047632619e-02f, +6.702003275e-01f, +4.111719731e-01f, -2.711885972e-02f }, - { -5.044908263e-02f, +6.698640012e-01f, +4.115137711e-01f, -2.714971381e-02f }, - { -5.042181372e-02f, +6.695276002e-01f, +4.118556250e-01f, -2.718057889e-02f }, - { -5.039451951e-02f, +6.691911246e-01f, +4.121975345e-01f, -2.721145493e-02f }, - { -5.036720007e-02f, +6.688545746e-01f, +4.125394995e-01f, -2.724234191e-02f }, - { -5.033985546e-02f, +6.685179504e-01f, +4.128815199e-01f, -2.727323979e-02f }, - { -5.031248577e-02f, +6.681812522e-01f, +4.132235955e-01f, -2.730414853e-02f }, - { -5.028509105e-02f, +6.678444802e-01f, +4.135657261e-01f, -2.733506812e-02f }, - { -5.025767136e-02f, +6.675076346e-01f, +4.139079116e-01f, -2.736599852e-02f }, - { -5.023022678e-02f, +6.671707155e-01f, +4.142501518e-01f, -2.739693971e-02f }, - { -5.020275738e-02f, +6.668337231e-01f, +4.145924466e-01f, -2.742789164e-02f }, - { -5.017526321e-02f, +6.664966577e-01f, +4.149347959e-01f, -2.745885430e-02f }, - { -5.014774435e-02f, +6.661595193e-01f, +4.152771994e-01f, -2.748982764e-02f }, - { -5.012020087e-02f, +6.658223083e-01f, +4.156196570e-01f, -2.752081165e-02f }, - { -5.009263282e-02f, +6.654850247e-01f, +4.159621686e-01f, -2.755180629e-02f }, - { -5.006504027e-02f, +6.651476689e-01f, +4.163047340e-01f, -2.758281153e-02f }, - { -5.003742330e-02f, +6.648102408e-01f, +4.166473531e-01f, -2.761382734e-02f }, - { -5.000978197e-02f, +6.644727409e-01f, +4.169900257e-01f, -2.764485368e-02f }, - { -4.998211634e-02f, +6.641351691e-01f, +4.173327517e-01f, -2.767589054e-02f }, - { -4.995442649e-02f, +6.637975258e-01f, +4.176755308e-01f, -2.770693788e-02f }, - { -4.992671247e-02f, +6.634598110e-01f, +4.180183630e-01f, -2.773799566e-02f }, - { -4.989897435e-02f, +6.631220251e-01f, +4.183612481e-01f, -2.776906386e-02f }, - { -4.987121220e-02f, +6.627841681e-01f, +4.187041859e-01f, -2.780014245e-02f }, - { -4.984342609e-02f, +6.624462403e-01f, +4.190471763e-01f, -2.783123139e-02f }, - { -4.981561608e-02f, +6.621082419e-01f, +4.193902192e-01f, -2.786233066e-02f }, - { -4.978778224e-02f, +6.617701729e-01f, +4.197333143e-01f, -2.789344022e-02f }, - { -4.975992463e-02f, +6.614320337e-01f, +4.200764615e-01f, -2.792456005e-02f }, - { -4.973204333e-02f, +6.610938245e-01f, +4.204196607e-01f, -2.795569010e-02f }, - { -4.970413838e-02f, +6.607555453e-01f, +4.207629117e-01f, -2.798683036e-02f }, - { -4.967620987e-02f, +6.604171963e-01f, +4.211062143e-01f, -2.801798079e-02f }, - { -4.964825786e-02f, +6.600787779e-01f, +4.214495685e-01f, -2.804914136e-02f }, - { -4.962028241e-02f, +6.597402901e-01f, +4.217929740e-01f, -2.808031203e-02f }, - { -4.959228359e-02f, +6.594017331e-01f, +4.221364307e-01f, -2.811149279e-02f }, - { -4.956426147e-02f, +6.590631072e-01f, +4.224799384e-01f, -2.814268358e-02f }, - { -4.953621610e-02f, +6.587244125e-01f, +4.228234970e-01f, -2.817388439e-02f }, - { -4.950814756e-02f, +6.583856492e-01f, +4.231671063e-01f, -2.820509519e-02f }, - { -4.948005591e-02f, +6.580468175e-01f, +4.235107662e-01f, -2.823631593e-02f }, - { -4.945194122e-02f, +6.577079175e-01f, +4.238544765e-01f, -2.826754660e-02f }, - { -4.942380356e-02f, +6.573689495e-01f, +4.241982371e-01f, -2.829878715e-02f }, - { -4.939564297e-02f, +6.570299137e-01f, +4.245420477e-01f, -2.833003756e-02f }, - { -4.936745955e-02f, +6.566908102e-01f, +4.248859083e-01f, -2.836129779e-02f }, - { -4.933925334e-02f, +6.563516392e-01f, +4.252298187e-01f, -2.839256782e-02f }, - { -4.931102441e-02f, +6.560124009e-01f, +4.255737788e-01f, -2.842384761e-02f }, - { -4.928277284e-02f, +6.556730955e-01f, +4.259177883e-01f, -2.845513713e-02f }, - { -4.925449868e-02f, +6.553337232e-01f, +4.262618471e-01f, -2.848643635e-02f }, - { -4.922620200e-02f, +6.549942842e-01f, +4.266059551e-01f, -2.851774523e-02f }, - { -4.919788286e-02f, +6.546547786e-01f, +4.269501121e-01f, -2.854906375e-02f }, - { -4.916954133e-02f, +6.543152066e-01f, +4.272943179e-01f, -2.858039187e-02f }, - { -4.914117748e-02f, +6.539755685e-01f, +4.276385725e-01f, -2.861172956e-02f }, - { -4.911279137e-02f, +6.536358644e-01f, +4.279828756e-01f, -2.864307678e-02f }, - { -4.908438306e-02f, +6.532960945e-01f, +4.283272270e-01f, -2.867443352e-02f }, - { -4.905595262e-02f, +6.529562589e-01f, +4.286716267e-01f, -2.870579972e-02f }, - { -4.902750012e-02f, +6.526163580e-01f, +4.290160745e-01f, -2.873717537e-02f }, - { -4.899902562e-02f, +6.522763918e-01f, +4.293605701e-01f, -2.876856043e-02f }, - { -4.897052918e-02f, +6.519363605e-01f, +4.297051136e-01f, -2.879995486e-02f }, - { -4.894201087e-02f, +6.515962644e-01f, +4.300497046e-01f, -2.883135864e-02f }, - { -4.891347075e-02f, +6.512561036e-01f, +4.303943430e-01f, -2.886277173e-02f }, - { -4.888490889e-02f, +6.509158783e-01f, +4.307390288e-01f, -2.889419410e-02f }, - { -4.885632535e-02f, +6.505755887e-01f, +4.310837617e-01f, -2.892562571e-02f }, - { -4.882772020e-02f, +6.502352350e-01f, +4.314285415e-01f, -2.895706654e-02f }, - { -4.879909350e-02f, +6.498948173e-01f, +4.317733681e-01f, -2.898851656e-02f }, - { -4.877044532e-02f, +6.495543359e-01f, +4.321182414e-01f, -2.901997572e-02f }, - { -4.874177572e-02f, +6.492137910e-01f, +4.324631612e-01f, -2.905144399e-02f }, - { -4.871308476e-02f, +6.488731826e-01f, +4.328081273e-01f, -2.908292135e-02f }, - { -4.868437251e-02f, +6.485325111e-01f, +4.331531396e-01f, -2.911440776e-02f }, - { -4.865563904e-02f, +6.481917765e-01f, +4.334981980e-01f, -2.914590319e-02f }, - { -4.862688440e-02f, +6.478509792e-01f, +4.338433021e-01f, -2.917740760e-02f }, - { -4.859810867e-02f, +6.475101192e-01f, +4.341884520e-01f, -2.920892096e-02f }, - { -4.856931190e-02f, +6.471691968e-01f, +4.345336475e-01f, -2.924044325e-02f }, - { -4.854049416e-02f, +6.468282121e-01f, +4.348788883e-01f, -2.927197441e-02f }, - { -4.851165552e-02f, +6.464871653e-01f, +4.352241743e-01f, -2.930351443e-02f }, - { -4.848279603e-02f, +6.461460567e-01f, +4.355695055e-01f, -2.933506327e-02f }, - { -4.845391577e-02f, +6.458048863e-01f, +4.359148815e-01f, -2.936662089e-02f }, - { -4.842501479e-02f, +6.454636545e-01f, +4.362603023e-01f, -2.939818727e-02f }, - { -4.839609316e-02f, +6.451223613e-01f, +4.366057677e-01f, -2.942976236e-02f }, - { -4.836715094e-02f, +6.447810070e-01f, +4.369512775e-01f, -2.946134614e-02f }, - { -4.833818821e-02f, +6.444395917e-01f, +4.372968316e-01f, -2.949293857e-02f }, - { -4.830920501e-02f, +6.440981157e-01f, +4.376424298e-01f, -2.952453962e-02f }, - { -4.828020142e-02f, +6.437565791e-01f, +4.379880720e-01f, -2.955614925e-02f }, - { -4.825117750e-02f, +6.434149821e-01f, +4.383337580e-01f, -2.958776743e-02f }, - { -4.822213331e-02f, +6.430733249e-01f, +4.386794876e-01f, -2.961939414e-02f }, - { -4.819306891e-02f, +6.427316077e-01f, +4.390252607e-01f, -2.965102932e-02f }, - { -4.816398438e-02f, +6.423898306e-01f, +4.393710771e-01f, -2.968267296e-02f }, - { -4.813487976e-02f, +6.420479939e-01f, +4.397169367e-01f, -2.971432501e-02f }, - { -4.810575513e-02f, +6.417060978e-01f, +4.400628392e-01f, -2.974598544e-02f }, - { -4.807661056e-02f, +6.413641423e-01f, +4.404087847e-01f, -2.977765422e-02f }, - { -4.804744609e-02f, +6.410221278e-01f, +4.407547728e-01f, -2.980933131e-02f }, - { -4.801826180e-02f, +6.406800544e-01f, +4.411008034e-01f, -2.984101669e-02f }, - { -4.798905775e-02f, +6.403379223e-01f, +4.414468764e-01f, -2.987271031e-02f }, - { -4.795983400e-02f, +6.399957316e-01f, +4.417929916e-01f, -2.990441214e-02f }, - { -4.793059062e-02f, +6.396534826e-01f, +4.421391489e-01f, -2.993612215e-02f }, - { -4.790132766e-02f, +6.393111754e-01f, +4.424853480e-01f, -2.996784030e-02f }, - { -4.787204520e-02f, +6.389688103e-01f, +4.428315888e-01f, -2.999956656e-02f }, - { -4.784274329e-02f, +6.386263874e-01f, +4.431778713e-01f, -3.003130090e-02f }, - { -4.781342200e-02f, +6.382839069e-01f, +4.435241951e-01f, -3.006304328e-02f }, - { -4.778408139e-02f, +6.379413690e-01f, +4.438705601e-01f, -3.009479366e-02f }, - { -4.775472152e-02f, +6.375987738e-01f, +4.442169663e-01f, -3.012655201e-02f }, - { -4.772534246e-02f, +6.372561217e-01f, +4.445634133e-01f, -3.015831830e-02f }, - { -4.769594427e-02f, +6.369134126e-01f, +4.449099012e-01f, -3.019009249e-02f }, - { -4.766652701e-02f, +6.365706469e-01f, +4.452564296e-01f, -3.022187454e-02f }, - { -4.763709074e-02f, +6.362278248e-01f, +4.456029984e-01f, -3.025366443e-02f }, - { -4.760763553e-02f, +6.358849463e-01f, +4.459496076e-01f, -3.028546212e-02f }, - { -4.757816144e-02f, +6.355420117e-01f, +4.462962568e-01f, -3.031726757e-02f }, - { -4.754866853e-02f, +6.351990212e-01f, +4.466429460e-01f, -3.034908075e-02f }, - { -4.751915687e-02f, +6.348559750e-01f, +4.469896750e-01f, -3.038090162e-02f }, - { -4.748962651e-02f, +6.345128733e-01f, +4.473364437e-01f, -3.041273015e-02f }, - { -4.746007752e-02f, +6.341697161e-01f, +4.476832518e-01f, -3.044456630e-02f }, - { -4.743050997e-02f, +6.338265038e-01f, +4.480300992e-01f, -3.047641003e-02f }, - { -4.740092391e-02f, +6.334832365e-01f, +4.483769858e-01f, -3.050826133e-02f }, - { -4.737131940e-02f, +6.331399144e-01f, +4.487239113e-01f, -3.054012013e-02f }, - { -4.734169651e-02f, +6.327965377e-01f, +4.490708757e-01f, -3.057198642e-02f }, - { -4.731205530e-02f, +6.324531066e-01f, +4.494178788e-01f, -3.060386016e-02f }, - { -4.728239584e-02f, +6.321096212e-01f, +4.497649203e-01f, -3.063574131e-02f }, - { -4.725271818e-02f, +6.317660818e-01f, +4.501120002e-01f, -3.066762983e-02f }, - { -4.722302238e-02f, +6.314224885e-01f, +4.504591183e-01f, -3.069952570e-02f }, - { -4.719330852e-02f, +6.310788415e-01f, +4.508062744e-01f, -3.073142887e-02f }, - { -4.716357665e-02f, +6.307351410e-01f, +4.511534683e-01f, -3.076333930e-02f }, - { -4.713382682e-02f, +6.303913872e-01f, +4.515006999e-01f, -3.079525698e-02f }, - { -4.710405912e-02f, +6.300475802e-01f, +4.518479691e-01f, -3.082718185e-02f }, - { -4.707427359e-02f, +6.297037204e-01f, +4.521952756e-01f, -3.085911388e-02f }, - { -4.704447029e-02f, +6.293598077e-01f, +4.525426193e-01f, -3.089105304e-02f }, - { -4.701464930e-02f, +6.290158425e-01f, +4.528900001e-01f, -3.092299929e-02f }, - { -4.698481067e-02f, +6.286718249e-01f, +4.532374178e-01f, -3.095495259e-02f }, - { -4.695495446e-02f, +6.283277552e-01f, +4.535848721e-01f, -3.098691291e-02f }, - { -4.692508073e-02f, +6.279836334e-01f, +4.539323631e-01f, -3.101888022e-02f }, - { -4.689518955e-02f, +6.276394598e-01f, +4.542798904e-01f, -3.105085447e-02f }, - { -4.686528098e-02f, +6.272952345e-01f, +4.546274539e-01f, -3.108283564e-02f }, - { -4.683535507e-02f, +6.269509578e-01f, +4.549750535e-01f, -3.111482367e-02f }, - { -4.680541190e-02f, +6.266066299e-01f, +4.553226890e-01f, -3.114681855e-02f }, - { -4.677545152e-02f, +6.262622508e-01f, +4.556703603e-01f, -3.117882023e-02f }, - { -4.674547399e-02f, +6.259178209e-01f, +4.560180671e-01f, -3.121082867e-02f }, - { -4.671547937e-02f, +6.255733402e-01f, +4.563658094e-01f, -3.124284384e-02f }, - { -4.668546773e-02f, +6.252288091e-01f, +4.567135869e-01f, -3.127486571e-02f }, - { -4.665543913e-02f, +6.248842275e-01f, +4.570613994e-01f, -3.130689423e-02f }, - { -4.662539362e-02f, +6.245395959e-01f, +4.574092469e-01f, -3.133892937e-02f }, - { -4.659533127e-02f, +6.241949143e-01f, +4.577571292e-01f, -3.137097110e-02f }, - { -4.656525215e-02f, +6.238501829e-01f, +4.581050460e-01f, -3.140301937e-02f }, - { -4.653515630e-02f, +6.235054019e-01f, +4.584529973e-01f, -3.143507415e-02f }, - { -4.650504379e-02f, +6.231605715e-01f, +4.588009829e-01f, -3.146713541e-02f }, - { -4.647491468e-02f, +6.228156918e-01f, +4.591490025e-01f, -3.149920310e-02f }, - { -4.644476904e-02f, +6.224707632e-01f, +4.594970561e-01f, -3.153127720e-02f }, - { -4.641460692e-02f, +6.221257857e-01f, +4.598451435e-01f, -3.156335765e-02f }, - { -4.638442839e-02f, +6.217807595e-01f, +4.601932645e-01f, -3.159544443e-02f }, - { -4.635423350e-02f, +6.214356849e-01f, +4.605414189e-01f, -3.162753750e-02f }, - { -4.632402231e-02f, +6.210905619e-01f, +4.608896066e-01f, -3.165963682e-02f }, - { -4.629379489e-02f, +6.207453909e-01f, +4.612378274e-01f, -3.169174236e-02f }, - { -4.626355130e-02f, +6.204001719e-01f, +4.615860812e-01f, -3.172385407e-02f }, - { -4.623329159e-02f, +6.200549052e-01f, +4.619343678e-01f, -3.175597193e-02f }, - { -4.620301584e-02f, +6.197095909e-01f, +4.622826870e-01f, -3.178809589e-02f }, - { -4.617272409e-02f, +6.193642293e-01f, +4.626310387e-01f, -3.182022591e-02f }, - { -4.614241641e-02f, +6.190188205e-01f, +4.629794226e-01f, -3.185236196e-02f }, - { -4.611209285e-02f, +6.186733647e-01f, +4.633278387e-01f, -3.188450401e-02f }, - { -4.608175349e-02f, +6.183278621e-01f, +4.636762867e-01f, -3.191665200e-02f }, - { -4.605139837e-02f, +6.179823129e-01f, +4.640247666e-01f, -3.194880592e-02f }, - { -4.602102757e-02f, +6.176367173e-01f, +4.643732781e-01f, -3.198096571e-02f }, - { -4.599064113e-02f, +6.172910754e-01f, +4.647218210e-01f, -3.201313134e-02f }, - { -4.596023912e-02f, +6.169453874e-01f, +4.650703953e-01f, -3.204530278e-02f }, - { -4.592982160e-02f, +6.165996536e-01f, +4.654190007e-01f, -3.207747998e-02f }, - { -4.589938863e-02f, +6.162538740e-01f, +4.657676371e-01f, -3.210966291e-02f }, - { -4.586894027e-02f, +6.159080490e-01f, +4.661163043e-01f, -3.214185153e-02f }, - { -4.583847658e-02f, +6.155621786e-01f, +4.664650021e-01f, -3.217404580e-02f }, - { -4.580799762e-02f, +6.152162631e-01f, +4.668137304e-01f, -3.220624568e-02f }, - { -4.577750344e-02f, +6.148703026e-01f, +4.671624891e-01f, -3.223845114e-02f }, - { -4.574699411e-02f, +6.145242974e-01f, +4.675112778e-01f, -3.227066214e-02f }, - { -4.571646969e-02f, +6.141782476e-01f, +4.678600966e-01f, -3.230287864e-02f }, - { -4.568593024e-02f, +6.138321534e-01f, +4.682089452e-01f, -3.233510060e-02f }, - { -4.565537582e-02f, +6.134860150e-01f, +4.685578234e-01f, -3.236732799e-02f }, - { -4.562480648e-02f, +6.131398326e-01f, +4.689067311e-01f, -3.239956076e-02f }, - { -4.559422228e-02f, +6.127936063e-01f, +4.692556681e-01f, -3.243179888e-02f }, - { -4.556362330e-02f, +6.124473364e-01f, +4.696046343e-01f, -3.246404230e-02f }, - { -4.553300957e-02f, +6.121010230e-01f, +4.699536294e-01f, -3.249629100e-02f }, - { -4.550238117e-02f, +6.117546663e-01f, +4.703026534e-01f, -3.252854493e-02f }, - { -4.547173816e-02f, +6.114082665e-01f, +4.706517061e-01f, -3.256080405e-02f }, - { -4.544108058e-02f, +6.110618238e-01f, +4.710007872e-01f, -3.259306833e-02f }, - { -4.541040851e-02f, +6.107153384e-01f, +4.713498966e-01f, -3.262533772e-02f }, - { -4.537972200e-02f, +6.103688104e-01f, +4.716990342e-01f, -3.265761219e-02f }, - { -4.534902111e-02f, +6.100222401e-01f, +4.720481998e-01f, -3.268989170e-02f }, - { -4.531830590e-02f, +6.096756276e-01f, +4.723973932e-01f, -3.272217621e-02f }, - { -4.528757642e-02f, +6.093289732e-01f, +4.727466142e-01f, -3.275446568e-02f }, - { -4.525683274e-02f, +6.089822769e-01f, +4.730958628e-01f, -3.278676008e-02f }, - { -4.522607492e-02f, +6.086355390e-01f, +4.734451386e-01f, -3.281905935e-02f }, - { -4.519530301e-02f, +6.082887597e-01f, +4.737944416e-01f, -3.285136347e-02f }, - { -4.516451708e-02f, +6.079419391e-01f, +4.741437716e-01f, -3.288367240e-02f }, - { -4.513371718e-02f, +6.075950775e-01f, +4.744931285e-01f, -3.291598609e-02f }, - { -4.510290336e-02f, +6.072481750e-01f, +4.748425119e-01f, -3.294830451e-02f }, - { -4.507207570e-02f, +6.069012318e-01f, +4.751919219e-01f, -3.298062762e-02f }, - { -4.504123425e-02f, +6.065542481e-01f, +4.755413581e-01f, -3.301295538e-02f }, - { -4.501037906e-02f, +6.062072240e-01f, +4.758908206e-01f, -3.304528775e-02f }, - { -4.497951020e-02f, +6.058601599e-01f, +4.762403090e-01f, -3.307762468e-02f }, - { -4.494862772e-02f, +6.055130558e-01f, +4.765898232e-01f, -3.310996615e-02f }, - { -4.491773168e-02f, +6.051659119e-01f, +4.769393630e-01f, -3.314231211e-02f }, - { -4.488682214e-02f, +6.048187284e-01f, +4.772889284e-01f, -3.317466252e-02f }, - { -4.485589916e-02f, +6.044715056e-01f, +4.776385190e-01f, -3.320701734e-02f }, - { -4.482496280e-02f, +6.041242435e-01f, +4.779881348e-01f, -3.323937653e-02f }, - { -4.479401311e-02f, +6.037769424e-01f, +4.783377756e-01f, -3.327174006e-02f }, - { -4.476305016e-02f, +6.034296025e-01f, +4.786874411e-01f, -3.330410788e-02f }, - { -4.473207400e-02f, +6.030822239e-01f, +4.790371313e-01f, -3.333647996e-02f }, - { -4.470108468e-02f, +6.027348068e-01f, +4.793868460e-01f, -3.336885624e-02f }, - { -4.467008228e-02f, +6.023873514e-01f, +4.797365850e-01f, -3.340123671e-02f }, - { -4.463906683e-02f, +6.020398580e-01f, +4.800863481e-01f, -3.343362130e-02f }, - { -4.460803842e-02f, +6.016923266e-01f, +4.804361352e-01f, -3.346600999e-02f }, - { -4.457699708e-02f, +6.013447575e-01f, +4.807859461e-01f, -3.349840273e-02f }, - { -4.454594288e-02f, +6.009971508e-01f, +4.811357806e-01f, -3.353079949e-02f }, - { -4.451487588e-02f, +6.006495068e-01f, +4.814856386e-01f, -3.356320022e-02f }, - { -4.448379613e-02f, +6.003018256e-01f, +4.818355198e-01f, -3.359560488e-02f }, - { -4.445270370e-02f, +5.999541074e-01f, +4.821854242e-01f, -3.362801344e-02f }, - { -4.442159863e-02f, +5.996063524e-01f, +4.825353516e-01f, -3.366042585e-02f }, - { -4.439048099e-02f, +5.992585607e-01f, +4.828853017e-01f, -3.369284207e-02f }, - { -4.435935084e-02f, +5.989107327e-01f, +4.832352745e-01f, -3.372526206e-02f }, - { -4.432820823e-02f, +5.985628683e-01f, +4.835852697e-01f, -3.375768579e-02f }, - { -4.429705321e-02f, +5.982149679e-01f, +4.839352871e-01f, -3.379011321e-02f }, - { -4.426588586e-02f, +5.978670316e-01f, +4.842853267e-01f, -3.382254427e-02f }, - { -4.423470622e-02f, +5.975190596e-01f, +4.846353882e-01f, -3.385497895e-02f }, - { -4.420351435e-02f, +5.971710521e-01f, +4.849854715e-01f, -3.388741720e-02f }, - { -4.417231031e-02f, +5.968230092e-01f, +4.853355764e-01f, -3.391985897e-02f }, - { -4.414109415e-02f, +5.964749312e-01f, +4.856857028e-01f, -3.395230423e-02f }, - { -4.410986594e-02f, +5.961268182e-01f, +4.860358504e-01f, -3.398475294e-02f }, - { -4.407862573e-02f, +5.957786704e-01f, +4.863860191e-01f, -3.401720506e-02f }, - { -4.404737358e-02f, +5.954304881e-01f, +4.867362087e-01f, -3.404966054e-02f }, - { -4.401610954e-02f, +5.950822713e-01f, +4.870864191e-01f, -3.408211934e-02f }, - { -4.398483367e-02f, +5.947340203e-01f, +4.874366500e-01f, -3.411458143e-02f }, - { -4.395354603e-02f, +5.943857352e-01f, +4.877869014e-01f, -3.414704676e-02f }, - { -4.392224667e-02f, +5.940374163e-01f, +4.881371730e-01f, -3.417951529e-02f }, - { -4.389093566e-02f, +5.936890637e-01f, +4.884874647e-01f, -3.421198698e-02f }, - { -4.385961304e-02f, +5.933406776e-01f, +4.888377763e-01f, -3.424446179e-02f }, - { -4.382827888e-02f, +5.929922582e-01f, +4.891881076e-01f, -3.427693968e-02f }, - { -4.379693323e-02f, +5.926438057e-01f, +4.895384585e-01f, -3.430942060e-02f }, - { -4.376557615e-02f, +5.922953202e-01f, +4.898888288e-01f, -3.434190452e-02f }, - { -4.373420769e-02f, +5.919468020e-01f, +4.902392184e-01f, -3.437439139e-02f }, - { -4.370282792e-02f, +5.915982512e-01f, +4.905896269e-01f, -3.440688117e-02f }, - { -4.367143688e-02f, +5.912496680e-01f, +4.909400544e-01f, -3.443937382e-02f }, - { -4.364003464e-02f, +5.909010526e-01f, +4.912905006e-01f, -3.447186930e-02f }, - { -4.360862124e-02f, +5.905524052e-01f, +4.916409653e-01f, -3.450436756e-02f }, - { -4.357719676e-02f, +5.902037260e-01f, +4.919914484e-01f, -3.453686857e-02f }, - { -4.354576123e-02f, +5.898550151e-01f, +4.923419497e-01f, -3.456937229e-02f }, - { -4.351431473e-02f, +5.895062727e-01f, +4.926924690e-01f, -3.460187866e-02f }, - { -4.348285730e-02f, +5.891574990e-01f, +4.930430062e-01f, -3.463438766e-02f }, - { -4.345138900e-02f, +5.888086942e-01f, +4.933935611e-01f, -3.466689923e-02f }, - { -4.341990989e-02f, +5.884598586e-01f, +4.937441335e-01f, -3.469941334e-02f }, - { -4.338842003e-02f, +5.881109921e-01f, +4.940947233e-01f, -3.473192994e-02f }, - { -4.335691946e-02f, +5.877620952e-01f, +4.944453302e-01f, -3.476444900e-02f }, - { -4.332540825e-02f, +5.874131678e-01f, +4.947959542e-01f, -3.479697046e-02f }, - { -4.329388645e-02f, +5.870642103e-01f, +4.951465949e-01f, -3.482949429e-02f }, - { -4.326235411e-02f, +5.867152227e-01f, +4.954972524e-01f, -3.486202044e-02f }, - { -4.323081130e-02f, +5.863662054e-01f, +4.958479263e-01f, -3.489454888e-02f }, - { -4.319925807e-02f, +5.860171584e-01f, +4.961986166e-01f, -3.492707956e-02f }, - { -4.316769447e-02f, +5.856680820e-01f, +4.965493230e-01f, -3.495961243e-02f }, - { -4.313612056e-02f, +5.853189763e-01f, +4.969000454e-01f, -3.499214746e-02f }, - { -4.310453640e-02f, +5.849698415e-01f, +4.972507836e-01f, -3.502468461e-02f }, - { -4.307294203e-02f, +5.846206778e-01f, +4.976015374e-01f, -3.505722382e-02f }, - { -4.304133752e-02f, +5.842714854e-01f, +4.979523067e-01f, -3.508976506e-02f }, - { -4.300972293e-02f, +5.839222644e-01f, +4.983030913e-01f, -3.512230829e-02f }, - { -4.297809830e-02f, +5.835730151e-01f, +4.986538910e-01f, -3.515485346e-02f }, - { -4.294646369e-02f, +5.832237377e-01f, +4.990047056e-01f, -3.518740053e-02f }, - { -4.291481916e-02f, +5.828744322e-01f, +4.993555351e-01f, -3.521994946e-02f }, - { -4.288316476e-02f, +5.825250990e-01f, +4.997063791e-01f, -3.525250020e-02f }, - { -4.285150055e-02f, +5.821757381e-01f, +5.000572376e-01f, -3.528505271e-02f }, - { -4.281982659e-02f, +5.818263498e-01f, +5.004081103e-01f, -3.531760695e-02f }, - { -4.278814292e-02f, +5.814769342e-01f, +5.007589972e-01f, -3.535016287e-02f }, - { -4.275644960e-02f, +5.811274916e-01f, +5.011098979e-01f, -3.538272044e-02f }, - { -4.272474669e-02f, +5.807780221e-01f, +5.014608124e-01f, -3.541527960e-02f }, - { -4.269303424e-02f, +5.804285259e-01f, +5.018117405e-01f, -3.544784032e-02f }, - { -4.266131231e-02f, +5.800790031e-01f, +5.021626819e-01f, -3.548040255e-02f }, - { -4.262958096e-02f, +5.797294541e-01f, +5.025136366e-01f, -3.551296626e-02f }, - { -4.259784023e-02f, +5.793798788e-01f, +5.028646044e-01f, -3.554553138e-02f }, - { -4.256609018e-02f, +5.790302776e-01f, +5.032155850e-01f, -3.557809789e-02f }, - { -4.253433087e-02f, +5.786806507e-01f, +5.035665783e-01f, -3.561066574e-02f }, - { -4.250256235e-02f, +5.783309981e-01f, +5.039175842e-01f, -3.564323489e-02f }, - { -4.247078467e-02f, +5.779813201e-01f, +5.042686025e-01f, -3.567580528e-02f }, - { -4.243899790e-02f, +5.776316168e-01f, +5.046196329e-01f, -3.570837689e-02f }, - { -4.240720208e-02f, +5.772818885e-01f, +5.049706753e-01f, -3.574094966e-02f }, - { -4.237539726e-02f, +5.769321353e-01f, +5.053217296e-01f, -3.577352355e-02f }, - { -4.234358351e-02f, +5.765823574e-01f, +5.056727956e-01f, -3.580609851e-02f }, - { -4.231176088e-02f, +5.762325550e-01f, +5.060238731e-01f, -3.583867451e-02f }, - { -4.227992942e-02f, +5.758827283e-01f, +5.063749619e-01f, -3.587125150e-02f }, - { -4.224808919e-02f, +5.755328774e-01f, +5.067260619e-01f, -3.590382944e-02f }, - { -4.221624023e-02f, +5.751830026e-01f, +5.070771728e-01f, -3.593640828e-02f }, - { -4.218438261e-02f, +5.748331040e-01f, +5.074282945e-01f, -3.596898797e-02f }, - { -4.215251638e-02f, +5.744831818e-01f, +5.077794269e-01f, -3.600156848e-02f }, - { -4.212064159e-02f, +5.741332362e-01f, +5.081305697e-01f, -3.603414976e-02f }, - { -4.208875830e-02f, +5.737832673e-01f, +5.084817229e-01f, -3.606673176e-02f }, - { -4.205686655e-02f, +5.734332754e-01f, +5.088328861e-01f, -3.609931444e-02f }, - { -4.202496641e-02f, +5.730832607e-01f, +5.091840593e-01f, -3.613189776e-02f }, - { -4.199305793e-02f, +5.727332232e-01f, +5.095352422e-01f, -3.616448168e-02f }, - { -4.196114116e-02f, +5.723831633e-01f, +5.098864348e-01f, -3.619706614e-02f }, - { -4.192921615e-02f, +5.720330810e-01f, +5.102376367e-01f, -3.622965110e-02f }, - { -4.189728297e-02f, +5.716829766e-01f, +5.105888479e-01f, -3.626223652e-02f }, - { -4.186534165e-02f, +5.713328502e-01f, +5.109400682e-01f, -3.629482236e-02f }, - { -4.183339226e-02f, +5.709827020e-01f, +5.112912974e-01f, -3.632740857e-02f }, - { -4.180143485e-02f, +5.706325323e-01f, +5.116425353e-01f, -3.635999510e-02f }, - { -4.176946947e-02f, +5.702823411e-01f, +5.119937817e-01f, -3.639258191e-02f }, - { -4.173749618e-02f, +5.699321287e-01f, +5.123450366e-01f, -3.642516896e-02f }, - { -4.170551503e-02f, +5.695818953e-01f, +5.126962996e-01f, -3.645775620e-02f }, - { -4.167352607e-02f, +5.692316410e-01f, +5.130475706e-01f, -3.649034358e-02f }, - { -4.164152936e-02f, +5.688813660e-01f, +5.133988495e-01f, -3.652293107e-02f }, - { -4.160952494e-02f, +5.685310706e-01f, +5.137501361e-01f, -3.655551861e-02f }, - { -4.157751288e-02f, +5.681807548e-01f, +5.141014302e-01f, -3.658810617e-02f }, - { -4.154549322e-02f, +5.678304188e-01f, +5.144527316e-01f, -3.662069369e-02f }, - { -4.151346602e-02f, +5.674800629e-01f, +5.148040402e-01f, -3.665328113e-02f }, - { -4.148143133e-02f, +5.671296873e-01f, +5.151553558e-01f, -3.668586844e-02f }, - { -4.144938921e-02f, +5.667792920e-01f, +5.155066781e-01f, -3.671845559e-02f }, - { -4.141733970e-02f, +5.664288773e-01f, +5.158580071e-01f, -3.675104252e-02f }, - { -4.138528287e-02f, +5.660784434e-01f, +5.162093426e-01f, -3.678362919e-02f }, - { -4.135321875e-02f, +5.657279905e-01f, +5.165606843e-01f, -3.681621556e-02f }, - { -4.132114741e-02f, +5.653775186e-01f, +5.169120321e-01f, -3.684880158e-02f }, - { -4.128906890e-02f, +5.650270281e-01f, +5.172633859e-01f, -3.688138720e-02f }, - { -4.125698327e-02f, +5.646765191e-01f, +5.176147454e-01f, -3.691397237e-02f }, - { -4.122489058e-02f, +5.643259918e-01f, +5.179661105e-01f, -3.694655706e-02f }, - { -4.119279087e-02f, +5.639754463e-01f, +5.183174810e-01f, -3.697914122e-02f }, - { -4.116068419e-02f, +5.636248829e-01f, +5.186688568e-01f, -3.701172480e-02f }, - { -4.112857061e-02f, +5.632743017e-01f, +5.190202376e-01f, -3.704430775e-02f }, - { -4.109645017e-02f, +5.629237029e-01f, +5.193716233e-01f, -3.707689003e-02f }, - { -4.106432293e-02f, +5.625730867e-01f, +5.197230137e-01f, -3.710947160e-02f }, - { -4.103218893e-02f, +5.622224532e-01f, +5.200744086e-01f, -3.714205241e-02f }, - { -4.100004824e-02f, +5.618718027e-01f, +5.204258079e-01f, -3.717463240e-02f }, - { -4.096790089e-02f, +5.615211353e-01f, +5.207772113e-01f, -3.720721154e-02f }, - { -4.093574695e-02f, +5.611704512e-01f, +5.211286188e-01f, -3.723978979e-02f }, - { -4.090358647e-02f, +5.608197506e-01f, +5.214800301e-01f, -3.727236708e-02f }, - { -4.087141949e-02f, +5.604690337e-01f, +5.218314450e-01f, -3.730494338e-02f }, - { -4.083924608e-02f, +5.601183006e-01f, +5.221828634e-01f, -3.733751865e-02f }, - { -4.080706628e-02f, +5.597675516e-01f, +5.225342852e-01f, -3.737009283e-02f }, - { -4.077488014e-02f, +5.594167868e-01f, +5.228857100e-01f, -3.740266587e-02f }, - { -4.074268771e-02f, +5.590660064e-01f, +5.232371378e-01f, -3.743523774e-02f }, - { -4.071048906e-02f, +5.587152105e-01f, +5.235885684e-01f, -3.746780839e-02f }, - { -4.067828422e-02f, +5.583643994e-01f, +5.239400015e-01f, -3.750037777e-02f }, - { -4.064607325e-02f, +5.580135732e-01f, +5.242914371e-01f, -3.753294582e-02f }, - { -4.061385621e-02f, +5.576627322e-01f, +5.246428750e-01f, -3.756551252e-02f }, - { -4.058163314e-02f, +5.573118764e-01f, +5.249943149e-01f, -3.759807780e-02f }, - { -4.054940409e-02f, +5.569610062e-01f, +5.253457567e-01f, -3.763064163e-02f }, - { -4.051716913e-02f, +5.566101215e-01f, +5.256972002e-01f, -3.766320395e-02f }, - { -4.048492829e-02f, +5.562592228e-01f, +5.260486453e-01f, -3.769576473e-02f }, - { -4.045268163e-02f, +5.559083100e-01f, +5.264000917e-01f, -3.772832390e-02f }, - { -4.042042920e-02f, +5.555573834e-01f, +5.267515394e-01f, -3.776088143e-02f }, - { -4.038817105e-02f, +5.552064433e-01f, +5.271029880e-01f, -3.779343727e-02f }, - { -4.035590724e-02f, +5.548554896e-01f, +5.274544375e-01f, -3.782599137e-02f }, - { -4.032363781e-02f, +5.545045228e-01f, +5.278058876e-01f, -3.785854369e-02f }, - { -4.029136282e-02f, +5.541535428e-01f, +5.281573382e-01f, -3.789109417e-02f }, - { -4.025908231e-02f, +5.538025499e-01f, +5.285087891e-01f, -3.792364277e-02f }, - { -4.022679634e-02f, +5.534515443e-01f, +5.288602402e-01f, -3.795618945e-02f }, - { -4.019450496e-02f, +5.531005262e-01f, +5.292116912e-01f, -3.798873415e-02f }, - { -4.016220822e-02f, +5.527494957e-01f, +5.295631419e-01f, -3.802127683e-02f }, - { -4.012990617e-02f, +5.523984531e-01f, +5.299145923e-01f, -3.805381745e-02f }, - { -4.009759887e-02f, +5.520473984e-01f, +5.302660421e-01f, -3.808635594e-02f }, - { -4.006528635e-02f, +5.516963319e-01f, +5.306174912e-01f, -3.811889228e-02f }, - { -4.003296867e-02f, +5.513452538e-01f, +5.309689393e-01f, -3.815142640e-02f }, - { -4.000064589e-02f, +5.509941643e-01f, +5.313203863e-01f, -3.818395826e-02f }, - { -3.996831805e-02f, +5.506430634e-01f, +5.316718320e-01f, -3.821648782e-02f }, - { -3.993598521e-02f, +5.502919514e-01f, +5.320232763e-01f, -3.824901502e-02f }, - { -3.990364741e-02f, +5.499408286e-01f, +5.323747189e-01f, -3.828153982e-02f }, - { -3.987130471e-02f, +5.495896949e-01f, +5.327261597e-01f, -3.831406217e-02f }, - { -3.983895715e-02f, +5.492385508e-01f, +5.330775985e-01f, -3.834658202e-02f }, - { -3.980660479e-02f, +5.488873962e-01f, +5.334290351e-01f, -3.837909933e-02f }, - { -3.977424767e-02f, +5.485362314e-01f, +5.337804694e-01f, -3.841161404e-02f }, - { -3.974188585e-02f, +5.481850566e-01f, +5.341319012e-01f, -3.844412612e-02f }, - { -3.970951938e-02f, +5.478338720e-01f, +5.344833302e-01f, -3.847663550e-02f }, - { -3.967714830e-02f, +5.474826777e-01f, +5.348347564e-01f, -3.850914215e-02f }, - { -3.964477267e-02f, +5.471314739e-01f, +5.351861795e-01f, -3.854164601e-02f }, - { -3.961239253e-02f, +5.467802608e-01f, +5.355375994e-01f, -3.857414703e-02f }, - { -3.958000795e-02f, +5.464290386e-01f, +5.358890159e-01f, -3.860664518e-02f }, - { -3.954761896e-02f, +5.460778075e-01f, +5.362404287e-01f, -3.863914039e-02f }, - { -3.951522561e-02f, +5.457265676e-01f, +5.365918378e-01f, -3.867163263e-02f }, - { -3.948282796e-02f, +5.453753190e-01f, +5.369432430e-01f, -3.870412184e-02f }, - { -3.945042606e-02f, +5.450240621e-01f, +5.372946440e-01f, -3.873660797e-02f }, - { -3.941801995e-02f, +5.446727970e-01f, +5.376460407e-01f, -3.876909098e-02f }, - { -3.938560969e-02f, +5.443215238e-01f, +5.379974330e-01f, -3.880157082e-02f }, - { -3.935319533e-02f, +5.439702427e-01f, +5.383488206e-01f, -3.883404743e-02f }, - { -3.932077690e-02f, +5.436189539e-01f, +5.387002033e-01f, -3.886652078e-02f }, - { -3.928835448e-02f, +5.432676576e-01f, +5.390515810e-01f, -3.889899081e-02f }, - { -3.925592809e-02f, +5.429163540e-01f, +5.394029536e-01f, -3.893145747e-02f }, - { -3.922349780e-02f, +5.425650432e-01f, +5.397543207e-01f, -3.896392071e-02f }, - { -3.919106365e-02f, +5.422137254e-01f, +5.401056823e-01f, -3.899638049e-02f }, - { -3.915862569e-02f, +5.418624009e-01f, +5.404570382e-01f, -3.902883675e-02f }, - { -3.912618397e-02f, +5.415110697e-01f, +5.408083882e-01f, -3.906128945e-02f }, - { -3.909373854e-02f, +5.411597321e-01f, +5.411597321e-01f, -3.909373854e-02f }, - { -3.906128945e-02f, +5.408083882e-01f, +5.415110697e-01f, -3.912618397e-02f }, - { -3.902883675e-02f, +5.404570382e-01f, +5.418624009e-01f, -3.915862569e-02f }, - { -3.899638049e-02f, +5.401056823e-01f, +5.422137254e-01f, -3.919106365e-02f }, - { -3.896392071e-02f, +5.397543207e-01f, +5.425650432e-01f, -3.922349780e-02f }, - { -3.893145747e-02f, +5.394029536e-01f, +5.429163540e-01f, -3.925592809e-02f }, - { -3.889899081e-02f, +5.390515810e-01f, +5.432676576e-01f, -3.928835448e-02f }, - { -3.886652078e-02f, +5.387002033e-01f, +5.436189539e-01f, -3.932077690e-02f }, - { -3.883404743e-02f, +5.383488206e-01f, +5.439702427e-01f, -3.935319533e-02f }, - { -3.880157082e-02f, +5.379974330e-01f, +5.443215238e-01f, -3.938560969e-02f }, - { -3.876909098e-02f, +5.376460407e-01f, +5.446727970e-01f, -3.941801995e-02f }, - { -3.873660797e-02f, +5.372946440e-01f, +5.450240621e-01f, -3.945042606e-02f }, - { -3.870412184e-02f, +5.369432430e-01f, +5.453753190e-01f, -3.948282796e-02f }, - { -3.867163263e-02f, +5.365918378e-01f, +5.457265676e-01f, -3.951522561e-02f }, - { -3.863914039e-02f, +5.362404287e-01f, +5.460778075e-01f, -3.954761896e-02f }, - { -3.860664518e-02f, +5.358890159e-01f, +5.464290386e-01f, -3.958000795e-02f }, - { -3.857414703e-02f, +5.355375994e-01f, +5.467802608e-01f, -3.961239253e-02f }, - { -3.854164601e-02f, +5.351861795e-01f, +5.471314739e-01f, -3.964477267e-02f }, - { -3.850914215e-02f, +5.348347564e-01f, +5.474826777e-01f, -3.967714830e-02f }, - { -3.847663550e-02f, +5.344833302e-01f, +5.478338720e-01f, -3.970951938e-02f }, - { -3.844412612e-02f, +5.341319012e-01f, +5.481850566e-01f, -3.974188585e-02f }, - { -3.841161404e-02f, +5.337804694e-01f, +5.485362314e-01f, -3.977424767e-02f }, - { -3.837909933e-02f, +5.334290351e-01f, +5.488873962e-01f, -3.980660479e-02f }, - { -3.834658202e-02f, +5.330775985e-01f, +5.492385508e-01f, -3.983895715e-02f }, - { -3.831406217e-02f, +5.327261597e-01f, +5.495896949e-01f, -3.987130471e-02f }, - { -3.828153982e-02f, +5.323747189e-01f, +5.499408286e-01f, -3.990364741e-02f }, - { -3.824901502e-02f, +5.320232763e-01f, +5.502919514e-01f, -3.993598521e-02f }, - { -3.821648782e-02f, +5.316718320e-01f, +5.506430634e-01f, -3.996831805e-02f }, - { -3.818395826e-02f, +5.313203863e-01f, +5.509941643e-01f, -4.000064589e-02f }, - { -3.815142640e-02f, +5.309689393e-01f, +5.513452538e-01f, -4.003296867e-02f }, - { -3.811889228e-02f, +5.306174912e-01f, +5.516963319e-01f, -4.006528635e-02f }, - { -3.808635594e-02f, +5.302660421e-01f, +5.520473984e-01f, -4.009759887e-02f }, - { -3.805381745e-02f, +5.299145923e-01f, +5.523984531e-01f, -4.012990617e-02f }, - { -3.802127683e-02f, +5.295631419e-01f, +5.527494957e-01f, -4.016220822e-02f }, - { -3.798873415e-02f, +5.292116912e-01f, +5.531005262e-01f, -4.019450496e-02f }, - { -3.795618945e-02f, +5.288602402e-01f, +5.534515443e-01f, -4.022679634e-02f }, - { -3.792364277e-02f, +5.285087891e-01f, +5.538025499e-01f, -4.025908231e-02f }, - { -3.789109417e-02f, +5.281573382e-01f, +5.541535428e-01f, -4.029136282e-02f }, - { -3.785854369e-02f, +5.278058876e-01f, +5.545045228e-01f, -4.032363781e-02f }, - { -3.782599137e-02f, +5.274544375e-01f, +5.548554896e-01f, -4.035590724e-02f }, - { -3.779343727e-02f, +5.271029880e-01f, +5.552064433e-01f, -4.038817105e-02f }, - { -3.776088143e-02f, +5.267515394e-01f, +5.555573834e-01f, -4.042042920e-02f }, - { -3.772832390e-02f, +5.264000917e-01f, +5.559083100e-01f, -4.045268163e-02f }, - { -3.769576473e-02f, +5.260486453e-01f, +5.562592228e-01f, -4.048492829e-02f }, - { -3.766320395e-02f, +5.256972002e-01f, +5.566101215e-01f, -4.051716913e-02f }, - { -3.763064163e-02f, +5.253457567e-01f, +5.569610062e-01f, -4.054940409e-02f }, - { -3.759807780e-02f, +5.249943149e-01f, +5.573118764e-01f, -4.058163314e-02f }, - { -3.756551252e-02f, +5.246428750e-01f, +5.576627322e-01f, -4.061385621e-02f }, - { -3.753294582e-02f, +5.242914371e-01f, +5.580135732e-01f, -4.064607325e-02f }, - { -3.750037777e-02f, +5.239400015e-01f, +5.583643994e-01f, -4.067828422e-02f }, - { -3.746780839e-02f, +5.235885684e-01f, +5.587152105e-01f, -4.071048906e-02f }, - { -3.743523774e-02f, +5.232371378e-01f, +5.590660064e-01f, -4.074268771e-02f }, - { -3.740266587e-02f, +5.228857100e-01f, +5.594167868e-01f, -4.077488014e-02f }, - { -3.737009283e-02f, +5.225342852e-01f, +5.597675516e-01f, -4.080706628e-02f }, - { -3.733751865e-02f, +5.221828634e-01f, +5.601183006e-01f, -4.083924608e-02f }, - { -3.730494338e-02f, +5.218314450e-01f, +5.604690337e-01f, -4.087141949e-02f }, - { -3.727236708e-02f, +5.214800301e-01f, +5.608197506e-01f, -4.090358647e-02f }, - { -3.723978979e-02f, +5.211286188e-01f, +5.611704512e-01f, -4.093574695e-02f }, - { -3.720721154e-02f, +5.207772113e-01f, +5.615211353e-01f, -4.096790089e-02f }, - { -3.717463240e-02f, +5.204258079e-01f, +5.618718027e-01f, -4.100004824e-02f }, - { -3.714205241e-02f, +5.200744086e-01f, +5.622224532e-01f, -4.103218893e-02f }, - { -3.710947160e-02f, +5.197230137e-01f, +5.625730867e-01f, -4.106432293e-02f }, - { -3.707689003e-02f, +5.193716233e-01f, +5.629237029e-01f, -4.109645017e-02f }, - { -3.704430775e-02f, +5.190202376e-01f, +5.632743017e-01f, -4.112857061e-02f }, - { -3.701172480e-02f, +5.186688568e-01f, +5.636248829e-01f, -4.116068419e-02f }, - { -3.697914122e-02f, +5.183174810e-01f, +5.639754463e-01f, -4.119279087e-02f }, - { -3.694655706e-02f, +5.179661105e-01f, +5.643259918e-01f, -4.122489058e-02f }, - { -3.691397237e-02f, +5.176147454e-01f, +5.646765191e-01f, -4.125698327e-02f }, - { -3.688138720e-02f, +5.172633859e-01f, +5.650270281e-01f, -4.128906890e-02f }, - { -3.684880158e-02f, +5.169120321e-01f, +5.653775186e-01f, -4.132114741e-02f }, - { -3.681621556e-02f, +5.165606843e-01f, +5.657279905e-01f, -4.135321875e-02f }, - { -3.678362919e-02f, +5.162093426e-01f, +5.660784434e-01f, -4.138528287e-02f }, - { -3.675104252e-02f, +5.158580071e-01f, +5.664288773e-01f, -4.141733970e-02f }, - { -3.671845559e-02f, +5.155066781e-01f, +5.667792920e-01f, -4.144938921e-02f }, - { -3.668586844e-02f, +5.151553558e-01f, +5.671296873e-01f, -4.148143133e-02f }, - { -3.665328113e-02f, +5.148040402e-01f, +5.674800629e-01f, -4.151346602e-02f }, - { -3.662069369e-02f, +5.144527316e-01f, +5.678304188e-01f, -4.154549322e-02f }, - { -3.658810617e-02f, +5.141014302e-01f, +5.681807548e-01f, -4.157751288e-02f }, - { -3.655551861e-02f, +5.137501361e-01f, +5.685310706e-01f, -4.160952494e-02f }, - { -3.652293107e-02f, +5.133988495e-01f, +5.688813660e-01f, -4.164152936e-02f }, - { -3.649034358e-02f, +5.130475706e-01f, +5.692316410e-01f, -4.167352607e-02f }, - { -3.645775620e-02f, +5.126962996e-01f, +5.695818953e-01f, -4.170551503e-02f }, - { -3.642516896e-02f, +5.123450366e-01f, +5.699321287e-01f, -4.173749618e-02f }, - { -3.639258191e-02f, +5.119937817e-01f, +5.702823411e-01f, -4.176946947e-02f }, - { -3.635999510e-02f, +5.116425353e-01f, +5.706325323e-01f, -4.180143485e-02f }, - { -3.632740857e-02f, +5.112912974e-01f, +5.709827020e-01f, -4.183339226e-02f }, - { -3.629482236e-02f, +5.109400682e-01f, +5.713328502e-01f, -4.186534165e-02f }, - { -3.626223652e-02f, +5.105888479e-01f, +5.716829766e-01f, -4.189728297e-02f }, - { -3.622965110e-02f, +5.102376367e-01f, +5.720330810e-01f, -4.192921615e-02f }, - { -3.619706614e-02f, +5.098864348e-01f, +5.723831633e-01f, -4.196114116e-02f }, - { -3.616448168e-02f, +5.095352422e-01f, +5.727332232e-01f, -4.199305793e-02f }, - { -3.613189776e-02f, +5.091840593e-01f, +5.730832607e-01f, -4.202496641e-02f }, - { -3.609931444e-02f, +5.088328861e-01f, +5.734332754e-01f, -4.205686655e-02f }, - { -3.606673176e-02f, +5.084817229e-01f, +5.737832673e-01f, -4.208875830e-02f }, - { -3.603414976e-02f, +5.081305697e-01f, +5.741332362e-01f, -4.212064159e-02f }, - { -3.600156848e-02f, +5.077794269e-01f, +5.744831818e-01f, -4.215251638e-02f }, - { -3.596898797e-02f, +5.074282945e-01f, +5.748331040e-01f, -4.218438261e-02f }, - { -3.593640828e-02f, +5.070771728e-01f, +5.751830026e-01f, -4.221624023e-02f }, - { -3.590382944e-02f, +5.067260619e-01f, +5.755328774e-01f, -4.224808919e-02f }, - { -3.587125150e-02f, +5.063749619e-01f, +5.758827283e-01f, -4.227992942e-02f }, - { -3.583867451e-02f, +5.060238731e-01f, +5.762325550e-01f, -4.231176088e-02f }, - { -3.580609851e-02f, +5.056727956e-01f, +5.765823574e-01f, -4.234358351e-02f }, - { -3.577352355e-02f, +5.053217296e-01f, +5.769321353e-01f, -4.237539726e-02f }, - { -3.574094966e-02f, +5.049706753e-01f, +5.772818885e-01f, -4.240720208e-02f }, - { -3.570837689e-02f, +5.046196329e-01f, +5.776316168e-01f, -4.243899790e-02f }, - { -3.567580528e-02f, +5.042686025e-01f, +5.779813201e-01f, -4.247078467e-02f }, - { -3.564323489e-02f, +5.039175842e-01f, +5.783309981e-01f, -4.250256235e-02f }, - { -3.561066574e-02f, +5.035665783e-01f, +5.786806507e-01f, -4.253433087e-02f }, - { -3.557809789e-02f, +5.032155850e-01f, +5.790302776e-01f, -4.256609018e-02f }, - { -3.554553138e-02f, +5.028646044e-01f, +5.793798788e-01f, -4.259784023e-02f }, - { -3.551296626e-02f, +5.025136366e-01f, +5.797294541e-01f, -4.262958096e-02f }, - { -3.548040255e-02f, +5.021626819e-01f, +5.800790031e-01f, -4.266131231e-02f }, - { -3.544784032e-02f, +5.018117405e-01f, +5.804285259e-01f, -4.269303424e-02f }, - { -3.541527960e-02f, +5.014608124e-01f, +5.807780221e-01f, -4.272474669e-02f }, - { -3.538272044e-02f, +5.011098979e-01f, +5.811274916e-01f, -4.275644960e-02f }, - { -3.535016287e-02f, +5.007589972e-01f, +5.814769342e-01f, -4.278814292e-02f }, - { -3.531760695e-02f, +5.004081103e-01f, +5.818263498e-01f, -4.281982659e-02f }, - { -3.528505271e-02f, +5.000572376e-01f, +5.821757381e-01f, -4.285150055e-02f }, - { -3.525250020e-02f, +4.997063791e-01f, +5.825250990e-01f, -4.288316476e-02f }, - { -3.521994946e-02f, +4.993555351e-01f, +5.828744322e-01f, -4.291481916e-02f }, - { -3.518740053e-02f, +4.990047056e-01f, +5.832237377e-01f, -4.294646369e-02f }, - { -3.515485346e-02f, +4.986538910e-01f, +5.835730151e-01f, -4.297809830e-02f }, - { -3.512230829e-02f, +4.983030913e-01f, +5.839222644e-01f, -4.300972293e-02f }, - { -3.508976506e-02f, +4.979523067e-01f, +5.842714854e-01f, -4.304133752e-02f }, - { -3.505722382e-02f, +4.976015374e-01f, +5.846206778e-01f, -4.307294203e-02f }, - { -3.502468461e-02f, +4.972507836e-01f, +5.849698415e-01f, -4.310453640e-02f }, - { -3.499214746e-02f, +4.969000454e-01f, +5.853189763e-01f, -4.313612056e-02f }, - { -3.495961243e-02f, +4.965493230e-01f, +5.856680820e-01f, -4.316769447e-02f }, - { -3.492707956e-02f, +4.961986166e-01f, +5.860171584e-01f, -4.319925807e-02f }, - { -3.489454888e-02f, +4.958479263e-01f, +5.863662054e-01f, -4.323081130e-02f }, - { -3.486202044e-02f, +4.954972524e-01f, +5.867152227e-01f, -4.326235411e-02f }, - { -3.482949429e-02f, +4.951465949e-01f, +5.870642103e-01f, -4.329388645e-02f }, - { -3.479697046e-02f, +4.947959542e-01f, +5.874131678e-01f, -4.332540825e-02f }, - { -3.476444900e-02f, +4.944453302e-01f, +5.877620952e-01f, -4.335691946e-02f }, - { -3.473192994e-02f, +4.940947233e-01f, +5.881109921e-01f, -4.338842003e-02f }, - { -3.469941334e-02f, +4.937441335e-01f, +5.884598586e-01f, -4.341990989e-02f }, - { -3.466689923e-02f, +4.933935611e-01f, +5.888086942e-01f, -4.345138900e-02f }, - { -3.463438766e-02f, +4.930430062e-01f, +5.891574990e-01f, -4.348285730e-02f }, - { -3.460187866e-02f, +4.926924690e-01f, +5.895062727e-01f, -4.351431473e-02f }, - { -3.456937229e-02f, +4.923419497e-01f, +5.898550151e-01f, -4.354576123e-02f }, - { -3.453686857e-02f, +4.919914484e-01f, +5.902037260e-01f, -4.357719676e-02f }, - { -3.450436756e-02f, +4.916409653e-01f, +5.905524052e-01f, -4.360862124e-02f }, - { -3.447186930e-02f, +4.912905006e-01f, +5.909010526e-01f, -4.364003464e-02f }, - { -3.443937382e-02f, +4.909400544e-01f, +5.912496680e-01f, -4.367143688e-02f }, - { -3.440688117e-02f, +4.905896269e-01f, +5.915982512e-01f, -4.370282792e-02f }, - { -3.437439139e-02f, +4.902392184e-01f, +5.919468020e-01f, -4.373420769e-02f }, - { -3.434190452e-02f, +4.898888288e-01f, +5.922953202e-01f, -4.376557615e-02f }, - { -3.430942060e-02f, +4.895384585e-01f, +5.926438057e-01f, -4.379693323e-02f }, - { -3.427693968e-02f, +4.891881076e-01f, +5.929922582e-01f, -4.382827888e-02f }, - { -3.424446179e-02f, +4.888377763e-01f, +5.933406776e-01f, -4.385961304e-02f }, - { -3.421198698e-02f, +4.884874647e-01f, +5.936890637e-01f, -4.389093566e-02f }, - { -3.417951529e-02f, +4.881371730e-01f, +5.940374163e-01f, -4.392224667e-02f }, - { -3.414704676e-02f, +4.877869014e-01f, +5.943857352e-01f, -4.395354603e-02f }, - { -3.411458143e-02f, +4.874366500e-01f, +5.947340203e-01f, -4.398483367e-02f }, - { -3.408211934e-02f, +4.870864191e-01f, +5.950822713e-01f, -4.401610954e-02f }, - { -3.404966054e-02f, +4.867362087e-01f, +5.954304881e-01f, -4.404737358e-02f }, - { -3.401720506e-02f, +4.863860191e-01f, +5.957786704e-01f, -4.407862573e-02f }, - { -3.398475294e-02f, +4.860358504e-01f, +5.961268182e-01f, -4.410986594e-02f }, - { -3.395230423e-02f, +4.856857028e-01f, +5.964749312e-01f, -4.414109415e-02f }, - { -3.391985897e-02f, +4.853355764e-01f, +5.968230092e-01f, -4.417231031e-02f }, - { -3.388741720e-02f, +4.849854715e-01f, +5.971710521e-01f, -4.420351435e-02f }, - { -3.385497895e-02f, +4.846353882e-01f, +5.975190596e-01f, -4.423470622e-02f }, - { -3.382254427e-02f, +4.842853267e-01f, +5.978670316e-01f, -4.426588586e-02f }, - { -3.379011321e-02f, +4.839352871e-01f, +5.982149679e-01f, -4.429705321e-02f }, - { -3.375768579e-02f, +4.835852697e-01f, +5.985628683e-01f, -4.432820823e-02f }, - { -3.372526206e-02f, +4.832352745e-01f, +5.989107327e-01f, -4.435935084e-02f }, - { -3.369284207e-02f, +4.828853017e-01f, +5.992585607e-01f, -4.439048099e-02f }, - { -3.366042585e-02f, +4.825353516e-01f, +5.996063524e-01f, -4.442159863e-02f }, - { -3.362801344e-02f, +4.821854242e-01f, +5.999541074e-01f, -4.445270370e-02f }, - { -3.359560488e-02f, +4.818355198e-01f, +6.003018256e-01f, -4.448379613e-02f }, - { -3.356320022e-02f, +4.814856386e-01f, +6.006495068e-01f, -4.451487588e-02f }, - { -3.353079949e-02f, +4.811357806e-01f, +6.009971508e-01f, -4.454594288e-02f }, - { -3.349840273e-02f, +4.807859461e-01f, +6.013447575e-01f, -4.457699708e-02f }, - { -3.346600999e-02f, +4.804361352e-01f, +6.016923266e-01f, -4.460803842e-02f }, - { -3.343362130e-02f, +4.800863481e-01f, +6.020398580e-01f, -4.463906683e-02f }, - { -3.340123671e-02f, +4.797365850e-01f, +6.023873514e-01f, -4.467008228e-02f }, - { -3.336885624e-02f, +4.793868460e-01f, +6.027348068e-01f, -4.470108468e-02f }, - { -3.333647996e-02f, +4.790371313e-01f, +6.030822239e-01f, -4.473207400e-02f }, - { -3.330410788e-02f, +4.786874411e-01f, +6.034296025e-01f, -4.476305016e-02f }, - { -3.327174006e-02f, +4.783377756e-01f, +6.037769424e-01f, -4.479401311e-02f }, - { -3.323937653e-02f, +4.779881348e-01f, +6.041242435e-01f, -4.482496280e-02f }, - { -3.320701734e-02f, +4.776385190e-01f, +6.044715056e-01f, -4.485589916e-02f }, - { -3.317466252e-02f, +4.772889284e-01f, +6.048187284e-01f, -4.488682214e-02f }, - { -3.314231211e-02f, +4.769393630e-01f, +6.051659119e-01f, -4.491773168e-02f }, - { -3.310996615e-02f, +4.765898232e-01f, +6.055130558e-01f, -4.494862772e-02f }, - { -3.307762468e-02f, +4.762403090e-01f, +6.058601599e-01f, -4.497951020e-02f }, - { -3.304528775e-02f, +4.758908206e-01f, +6.062072240e-01f, -4.501037906e-02f }, - { -3.301295538e-02f, +4.755413581e-01f, +6.065542481e-01f, -4.504123425e-02f }, - { -3.298062762e-02f, +4.751919219e-01f, +6.069012318e-01f, -4.507207570e-02f }, - { -3.294830451e-02f, +4.748425119e-01f, +6.072481750e-01f, -4.510290336e-02f }, - { -3.291598609e-02f, +4.744931285e-01f, +6.075950775e-01f, -4.513371718e-02f }, - { -3.288367240e-02f, +4.741437716e-01f, +6.079419391e-01f, -4.516451708e-02f }, - { -3.285136347e-02f, +4.737944416e-01f, +6.082887597e-01f, -4.519530301e-02f }, - { -3.281905935e-02f, +4.734451386e-01f, +6.086355390e-01f, -4.522607492e-02f }, - { -3.278676008e-02f, +4.730958628e-01f, +6.089822769e-01f, -4.525683274e-02f }, - { -3.275446568e-02f, +4.727466142e-01f, +6.093289732e-01f, -4.528757642e-02f }, - { -3.272217621e-02f, +4.723973932e-01f, +6.096756276e-01f, -4.531830590e-02f }, - { -3.268989170e-02f, +4.720481998e-01f, +6.100222401e-01f, -4.534902111e-02f }, - { -3.265761219e-02f, +4.716990342e-01f, +6.103688104e-01f, -4.537972200e-02f }, - { -3.262533772e-02f, +4.713498966e-01f, +6.107153384e-01f, -4.541040851e-02f }, - { -3.259306833e-02f, +4.710007872e-01f, +6.110618238e-01f, -4.544108058e-02f }, - { -3.256080405e-02f, +4.706517061e-01f, +6.114082665e-01f, -4.547173816e-02f }, - { -3.252854493e-02f, +4.703026534e-01f, +6.117546663e-01f, -4.550238117e-02f }, - { -3.249629100e-02f, +4.699536294e-01f, +6.121010230e-01f, -4.553300957e-02f }, - { -3.246404230e-02f, +4.696046343e-01f, +6.124473364e-01f, -4.556362330e-02f }, - { -3.243179888e-02f, +4.692556681e-01f, +6.127936063e-01f, -4.559422228e-02f }, - { -3.239956076e-02f, +4.689067311e-01f, +6.131398326e-01f, -4.562480648e-02f }, - { -3.236732799e-02f, +4.685578234e-01f, +6.134860150e-01f, -4.565537582e-02f }, - { -3.233510060e-02f, +4.682089452e-01f, +6.138321534e-01f, -4.568593024e-02f }, - { -3.230287864e-02f, +4.678600966e-01f, +6.141782476e-01f, -4.571646969e-02f }, - { -3.227066214e-02f, +4.675112778e-01f, +6.145242974e-01f, -4.574699411e-02f }, - { -3.223845114e-02f, +4.671624891e-01f, +6.148703026e-01f, -4.577750344e-02f }, - { -3.220624568e-02f, +4.668137304e-01f, +6.152162631e-01f, -4.580799762e-02f }, - { -3.217404580e-02f, +4.664650021e-01f, +6.155621786e-01f, -4.583847658e-02f }, - { -3.214185153e-02f, +4.661163043e-01f, +6.159080490e-01f, -4.586894027e-02f }, - { -3.210966291e-02f, +4.657676371e-01f, +6.162538740e-01f, -4.589938863e-02f }, - { -3.207747998e-02f, +4.654190007e-01f, +6.165996536e-01f, -4.592982160e-02f }, - { -3.204530278e-02f, +4.650703953e-01f, +6.169453874e-01f, -4.596023912e-02f }, - { -3.201313134e-02f, +4.647218210e-01f, +6.172910754e-01f, -4.599064113e-02f }, - { -3.198096571e-02f, +4.643732781e-01f, +6.176367173e-01f, -4.602102757e-02f }, - { -3.194880592e-02f, +4.640247666e-01f, +6.179823129e-01f, -4.605139837e-02f }, - { -3.191665200e-02f, +4.636762867e-01f, +6.183278621e-01f, -4.608175349e-02f }, - { -3.188450401e-02f, +4.633278387e-01f, +6.186733647e-01f, -4.611209285e-02f }, - { -3.185236196e-02f, +4.629794226e-01f, +6.190188205e-01f, -4.614241641e-02f }, - { -3.182022591e-02f, +4.626310387e-01f, +6.193642293e-01f, -4.617272409e-02f }, - { -3.178809589e-02f, +4.622826870e-01f, +6.197095909e-01f, -4.620301584e-02f }, - { -3.175597193e-02f, +4.619343678e-01f, +6.200549052e-01f, -4.623329159e-02f }, - { -3.172385407e-02f, +4.615860812e-01f, +6.204001719e-01f, -4.626355130e-02f }, - { -3.169174236e-02f, +4.612378274e-01f, +6.207453909e-01f, -4.629379489e-02f }, - { -3.165963682e-02f, +4.608896066e-01f, +6.210905619e-01f, -4.632402231e-02f }, - { -3.162753750e-02f, +4.605414189e-01f, +6.214356849e-01f, -4.635423350e-02f }, - { -3.159544443e-02f, +4.601932645e-01f, +6.217807595e-01f, -4.638442839e-02f }, - { -3.156335765e-02f, +4.598451435e-01f, +6.221257857e-01f, -4.641460692e-02f }, - { -3.153127720e-02f, +4.594970561e-01f, +6.224707632e-01f, -4.644476904e-02f }, - { -3.149920310e-02f, +4.591490025e-01f, +6.228156918e-01f, -4.647491468e-02f }, - { -3.146713541e-02f, +4.588009829e-01f, +6.231605715e-01f, -4.650504379e-02f }, - { -3.143507415e-02f, +4.584529973e-01f, +6.235054019e-01f, -4.653515630e-02f }, - { -3.140301937e-02f, +4.581050460e-01f, +6.238501829e-01f, -4.656525215e-02f }, - { -3.137097110e-02f, +4.577571292e-01f, +6.241949143e-01f, -4.659533127e-02f }, - { -3.133892937e-02f, +4.574092469e-01f, +6.245395959e-01f, -4.662539362e-02f }, - { -3.130689423e-02f, +4.570613994e-01f, +6.248842275e-01f, -4.665543913e-02f }, - { -3.127486571e-02f, +4.567135869e-01f, +6.252288091e-01f, -4.668546773e-02f }, - { -3.124284384e-02f, +4.563658094e-01f, +6.255733402e-01f, -4.671547937e-02f }, - { -3.121082867e-02f, +4.560180671e-01f, +6.259178209e-01f, -4.674547399e-02f }, - { -3.117882023e-02f, +4.556703603e-01f, +6.262622508e-01f, -4.677545152e-02f }, - { -3.114681855e-02f, +4.553226890e-01f, +6.266066299e-01f, -4.680541190e-02f }, - { -3.111482367e-02f, +4.549750535e-01f, +6.269509578e-01f, -4.683535507e-02f }, - { -3.108283564e-02f, +4.546274539e-01f, +6.272952345e-01f, -4.686528098e-02f }, - { -3.105085447e-02f, +4.542798904e-01f, +6.276394598e-01f, -4.689518955e-02f }, - { -3.101888022e-02f, +4.539323631e-01f, +6.279836334e-01f, -4.692508073e-02f }, - { -3.098691291e-02f, +4.535848721e-01f, +6.283277552e-01f, -4.695495446e-02f }, - { -3.095495259e-02f, +4.532374178e-01f, +6.286718249e-01f, -4.698481067e-02f }, - { -3.092299929e-02f, +4.528900001e-01f, +6.290158425e-01f, -4.701464930e-02f }, - { -3.089105304e-02f, +4.525426193e-01f, +6.293598077e-01f, -4.704447029e-02f }, - { -3.085911388e-02f, +4.521952756e-01f, +6.297037204e-01f, -4.707427359e-02f }, - { -3.082718185e-02f, +4.518479691e-01f, +6.300475802e-01f, -4.710405912e-02f }, - { -3.079525698e-02f, +4.515006999e-01f, +6.303913872e-01f, -4.713382682e-02f }, - { -3.076333930e-02f, +4.511534683e-01f, +6.307351410e-01f, -4.716357665e-02f }, - { -3.073142887e-02f, +4.508062744e-01f, +6.310788415e-01f, -4.719330852e-02f }, - { -3.069952570e-02f, +4.504591183e-01f, +6.314224885e-01f, -4.722302238e-02f }, - { -3.066762983e-02f, +4.501120002e-01f, +6.317660818e-01f, -4.725271818e-02f }, - { -3.063574131e-02f, +4.497649203e-01f, +6.321096212e-01f, -4.728239584e-02f }, - { -3.060386016e-02f, +4.494178788e-01f, +6.324531066e-01f, -4.731205530e-02f }, - { -3.057198642e-02f, +4.490708757e-01f, +6.327965377e-01f, -4.734169651e-02f }, - { -3.054012013e-02f, +4.487239113e-01f, +6.331399144e-01f, -4.737131940e-02f }, - { -3.050826133e-02f, +4.483769858e-01f, +6.334832365e-01f, -4.740092391e-02f }, - { -3.047641003e-02f, +4.480300992e-01f, +6.338265038e-01f, -4.743050997e-02f }, - { -3.044456630e-02f, +4.476832518e-01f, +6.341697161e-01f, -4.746007752e-02f }, - { -3.041273015e-02f, +4.473364437e-01f, +6.345128733e-01f, -4.748962651e-02f }, - { -3.038090162e-02f, +4.469896750e-01f, +6.348559750e-01f, -4.751915687e-02f }, - { -3.034908075e-02f, +4.466429460e-01f, +6.351990212e-01f, -4.754866853e-02f }, - { -3.031726757e-02f, +4.462962568e-01f, +6.355420117e-01f, -4.757816144e-02f }, - { -3.028546212e-02f, +4.459496076e-01f, +6.358849463e-01f, -4.760763553e-02f }, - { -3.025366443e-02f, +4.456029984e-01f, +6.362278248e-01f, -4.763709074e-02f }, - { -3.022187454e-02f, +4.452564296e-01f, +6.365706469e-01f, -4.766652701e-02f }, - { -3.019009249e-02f, +4.449099012e-01f, +6.369134126e-01f, -4.769594427e-02f }, - { -3.015831830e-02f, +4.445634133e-01f, +6.372561217e-01f, -4.772534246e-02f }, - { -3.012655201e-02f, +4.442169663e-01f, +6.375987738e-01f, -4.775472152e-02f }, - { -3.009479366e-02f, +4.438705601e-01f, +6.379413690e-01f, -4.778408139e-02f }, - { -3.006304328e-02f, +4.435241951e-01f, +6.382839069e-01f, -4.781342200e-02f }, - { -3.003130090e-02f, +4.431778713e-01f, +6.386263874e-01f, -4.784274329e-02f }, - { -2.999956656e-02f, +4.428315888e-01f, +6.389688103e-01f, -4.787204520e-02f }, - { -2.996784030e-02f, +4.424853480e-01f, +6.393111754e-01f, -4.790132766e-02f }, - { -2.993612215e-02f, +4.421391489e-01f, +6.396534826e-01f, -4.793059062e-02f }, - { -2.990441214e-02f, +4.417929916e-01f, +6.399957316e-01f, -4.795983400e-02f }, - { -2.987271031e-02f, +4.414468764e-01f, +6.403379223e-01f, -4.798905775e-02f }, - { -2.984101669e-02f, +4.411008034e-01f, +6.406800544e-01f, -4.801826180e-02f }, - { -2.980933131e-02f, +4.407547728e-01f, +6.410221278e-01f, -4.804744609e-02f }, - { -2.977765422e-02f, +4.404087847e-01f, +6.413641423e-01f, -4.807661056e-02f }, - { -2.974598544e-02f, +4.400628392e-01f, +6.417060978e-01f, -4.810575513e-02f }, - { -2.971432501e-02f, +4.397169367e-01f, +6.420479939e-01f, -4.813487976e-02f }, - { -2.968267296e-02f, +4.393710771e-01f, +6.423898306e-01f, -4.816398438e-02f }, - { -2.965102932e-02f, +4.390252607e-01f, +6.427316077e-01f, -4.819306891e-02f }, - { -2.961939414e-02f, +4.386794876e-01f, +6.430733249e-01f, -4.822213331e-02f }, - { -2.958776743e-02f, +4.383337580e-01f, +6.434149821e-01f, -4.825117750e-02f }, - { -2.955614925e-02f, +4.379880720e-01f, +6.437565791e-01f, -4.828020142e-02f }, - { -2.952453962e-02f, +4.376424298e-01f, +6.440981157e-01f, -4.830920501e-02f }, - { -2.949293857e-02f, +4.372968316e-01f, +6.444395917e-01f, -4.833818821e-02f }, - { -2.946134614e-02f, +4.369512775e-01f, +6.447810070e-01f, -4.836715094e-02f }, - { -2.942976236e-02f, +4.366057677e-01f, +6.451223613e-01f, -4.839609316e-02f }, - { -2.939818727e-02f, +4.362603023e-01f, +6.454636545e-01f, -4.842501479e-02f }, - { -2.936662089e-02f, +4.359148815e-01f, +6.458048863e-01f, -4.845391577e-02f }, - { -2.933506327e-02f, +4.355695055e-01f, +6.461460567e-01f, -4.848279603e-02f }, - { -2.930351443e-02f, +4.352241743e-01f, +6.464871653e-01f, -4.851165552e-02f }, - { -2.927197441e-02f, +4.348788883e-01f, +6.468282121e-01f, -4.854049416e-02f }, - { -2.924044325e-02f, +4.345336475e-01f, +6.471691968e-01f, -4.856931190e-02f }, - { -2.920892096e-02f, +4.341884520e-01f, +6.475101192e-01f, -4.859810867e-02f }, - { -2.917740760e-02f, +4.338433021e-01f, +6.478509792e-01f, -4.862688440e-02f }, - { -2.914590319e-02f, +4.334981980e-01f, +6.481917765e-01f, -4.865563904e-02f }, - { -2.911440776e-02f, +4.331531396e-01f, +6.485325111e-01f, -4.868437251e-02f }, - { -2.908292135e-02f, +4.328081273e-01f, +6.488731826e-01f, -4.871308476e-02f }, - { -2.905144399e-02f, +4.324631612e-01f, +6.492137910e-01f, -4.874177572e-02f }, - { -2.901997572e-02f, +4.321182414e-01f, +6.495543359e-01f, -4.877044532e-02f }, - { -2.898851656e-02f, +4.317733681e-01f, +6.498948173e-01f, -4.879909350e-02f }, - { -2.895706654e-02f, +4.314285415e-01f, +6.502352350e-01f, -4.882772020e-02f }, - { -2.892562571e-02f, +4.310837617e-01f, +6.505755887e-01f, -4.885632535e-02f }, - { -2.889419410e-02f, +4.307390288e-01f, +6.509158783e-01f, -4.888490889e-02f }, - { -2.886277173e-02f, +4.303943430e-01f, +6.512561036e-01f, -4.891347075e-02f }, - { -2.883135864e-02f, +4.300497046e-01f, +6.515962644e-01f, -4.894201087e-02f }, - { -2.879995486e-02f, +4.297051136e-01f, +6.519363605e-01f, -4.897052918e-02f }, - { -2.876856043e-02f, +4.293605701e-01f, +6.522763918e-01f, -4.899902562e-02f }, - { -2.873717537e-02f, +4.290160745e-01f, +6.526163580e-01f, -4.902750012e-02f }, - { -2.870579972e-02f, +4.286716267e-01f, +6.529562589e-01f, -4.905595262e-02f }, - { -2.867443352e-02f, +4.283272270e-01f, +6.532960945e-01f, -4.908438306e-02f }, - { -2.864307678e-02f, +4.279828756e-01f, +6.536358644e-01f, -4.911279137e-02f }, - { -2.861172956e-02f, +4.276385725e-01f, +6.539755685e-01f, -4.914117748e-02f }, - { -2.858039187e-02f, +4.272943179e-01f, +6.543152066e-01f, -4.916954133e-02f }, - { -2.854906375e-02f, +4.269501121e-01f, +6.546547786e-01f, -4.919788286e-02f }, - { -2.851774523e-02f, +4.266059551e-01f, +6.549942842e-01f, -4.922620200e-02f }, - { -2.848643635e-02f, +4.262618471e-01f, +6.553337232e-01f, -4.925449868e-02f }, - { -2.845513713e-02f, +4.259177883e-01f, +6.556730955e-01f, -4.928277284e-02f }, - { -2.842384761e-02f, +4.255737788e-01f, +6.560124009e-01f, -4.931102441e-02f }, - { -2.839256782e-02f, +4.252298187e-01f, +6.563516392e-01f, -4.933925334e-02f }, - { -2.836129779e-02f, +4.248859083e-01f, +6.566908102e-01f, -4.936745955e-02f }, - { -2.833003756e-02f, +4.245420477e-01f, +6.570299137e-01f, -4.939564297e-02f }, - { -2.829878715e-02f, +4.241982371e-01f, +6.573689495e-01f, -4.942380356e-02f }, - { -2.826754660e-02f, +4.238544765e-01f, +6.577079175e-01f, -4.945194122e-02f }, - { -2.823631593e-02f, +4.235107662e-01f, +6.580468175e-01f, -4.948005591e-02f }, - { -2.820509519e-02f, +4.231671063e-01f, +6.583856492e-01f, -4.950814756e-02f }, - { -2.817388439e-02f, +4.228234970e-01f, +6.587244125e-01f, -4.953621610e-02f }, - { -2.814268358e-02f, +4.224799384e-01f, +6.590631072e-01f, -4.956426147e-02f }, - { -2.811149279e-02f, +4.221364307e-01f, +6.594017331e-01f, -4.959228359e-02f }, - { -2.808031203e-02f, +4.217929740e-01f, +6.597402901e-01f, -4.962028241e-02f }, - { -2.804914136e-02f, +4.214495685e-01f, +6.600787779e-01f, -4.964825786e-02f }, - { -2.801798079e-02f, +4.211062143e-01f, +6.604171963e-01f, -4.967620987e-02f }, - { -2.798683036e-02f, +4.207629117e-01f, +6.607555453e-01f, -4.970413838e-02f }, - { -2.795569010e-02f, +4.204196607e-01f, +6.610938245e-01f, -4.973204333e-02f }, - { -2.792456005e-02f, +4.200764615e-01f, +6.614320337e-01f, -4.975992463e-02f }, - { -2.789344022e-02f, +4.197333143e-01f, +6.617701729e-01f, -4.978778224e-02f }, - { -2.786233066e-02f, +4.193902192e-01f, +6.621082419e-01f, -4.981561608e-02f }, - { -2.783123139e-02f, +4.190471763e-01f, +6.624462403e-01f, -4.984342609e-02f }, - { -2.780014245e-02f, +4.187041859e-01f, +6.627841681e-01f, -4.987121220e-02f }, - { -2.776906386e-02f, +4.183612481e-01f, +6.631220251e-01f, -4.989897435e-02f }, - { -2.773799566e-02f, +4.180183630e-01f, +6.634598110e-01f, -4.992671247e-02f }, - { -2.770693788e-02f, +4.176755308e-01f, +6.637975258e-01f, -4.995442649e-02f }, - { -2.767589054e-02f, +4.173327517e-01f, +6.641351691e-01f, -4.998211634e-02f }, - { -2.764485368e-02f, +4.169900257e-01f, +6.644727409e-01f, -5.000978197e-02f }, - { -2.761382734e-02f, +4.166473531e-01f, +6.648102408e-01f, -5.003742330e-02f }, - { -2.758281153e-02f, +4.163047340e-01f, +6.651476689e-01f, -5.006504027e-02f }, - { -2.755180629e-02f, +4.159621686e-01f, +6.654850247e-01f, -5.009263282e-02f }, - { -2.752081165e-02f, +4.156196570e-01f, +6.658223083e-01f, -5.012020087e-02f }, - { -2.748982764e-02f, +4.152771994e-01f, +6.661595193e-01f, -5.014774435e-02f }, - { -2.745885430e-02f, +4.149347959e-01f, +6.664966577e-01f, -5.017526321e-02f }, - { -2.742789164e-02f, +4.145924466e-01f, +6.668337231e-01f, -5.020275738e-02f }, - { -2.739693971e-02f, +4.142501518e-01f, +6.671707155e-01f, -5.023022678e-02f }, - { -2.736599852e-02f, +4.139079116e-01f, +6.675076346e-01f, -5.025767136e-02f }, - { -2.733506812e-02f, +4.135657261e-01f, +6.678444802e-01f, -5.028509105e-02f }, - { -2.730414853e-02f, +4.132235955e-01f, +6.681812522e-01f, -5.031248577e-02f }, - { -2.727323979e-02f, +4.128815199e-01f, +6.685179504e-01f, -5.033985546e-02f }, - { -2.724234191e-02f, +4.125394995e-01f, +6.688545746e-01f, -5.036720007e-02f }, - { -2.721145493e-02f, +4.121975345e-01f, +6.691911246e-01f, -5.039451951e-02f }, - { -2.718057889e-02f, +4.118556250e-01f, +6.695276002e-01f, -5.042181372e-02f }, - { -2.714971381e-02f, +4.115137711e-01f, +6.698640012e-01f, -5.044908263e-02f }, - { -2.711885972e-02f, +4.111719731e-01f, +6.702003275e-01f, -5.047632619e-02f }, - { -2.708801665e-02f, +4.108302310e-01f, +6.705365788e-01f, -5.050354431e-02f }, - { -2.705718463e-02f, +4.104885450e-01f, +6.708727551e-01f, -5.053073694e-02f }, - { -2.702636369e-02f, +4.101469153e-01f, +6.712088560e-01f, -5.055790401e-02f }, - { -2.699555385e-02f, +4.098053420e-01f, +6.715448814e-01f, -5.058504544e-02f }, - { -2.696475516e-02f, +4.094638252e-01f, +6.718808311e-01f, -5.061216118e-02f }, - { -2.693396764e-02f, +4.091223652e-01f, +6.722167049e-01f, -5.063925115e-02f }, - { -2.690319131e-02f, +4.087809621e-01f, +6.725525027e-01f, -5.066631529e-02f }, - { -2.687242621e-02f, +4.084396159e-01f, +6.728882242e-01f, -5.069335353e-02f }, - { -2.684167237e-02f, +4.080983270e-01f, +6.732238693e-01f, -5.072036581e-02f }, - { -2.681092981e-02f, +4.077570954e-01f, +6.735594378e-01f, -5.074735205e-02f }, - { -2.678019856e-02f, +4.074159212e-01f, +6.738949295e-01f, -5.077431218e-02f }, - { -2.674947866e-02f, +4.070748047e-01f, +6.742303442e-01f, -5.080124615e-02f }, - { -2.671877013e-02f, +4.067337460e-01f, +6.745656817e-01f, -5.082815388e-02f }, - { -2.668807301e-02f, +4.063927452e-01f, +6.749009418e-01f, -5.085503531e-02f }, - { -2.665738731e-02f, +4.060518025e-01f, +6.752361244e-01f, -5.088189036e-02f }, - { -2.662671308e-02f, +4.057109180e-01f, +6.755712292e-01f, -5.090871897e-02f }, - { -2.659605033e-02f, +4.053700919e-01f, +6.759062562e-01f, -5.093552108e-02f }, - { -2.656539910e-02f, +4.050293243e-01f, +6.762412050e-01f, -5.096229661e-02f }, - { -2.653475941e-02f, +4.046886155e-01f, +6.765760755e-01f, -5.098904550e-02f }, - { -2.650413130e-02f, +4.043479654e-01f, +6.769108675e-01f, -5.101576767e-02f }, - { -2.647351480e-02f, +4.040073744e-01f, +6.772455809e-01f, -5.104246307e-02f }, - { -2.644290992e-02f, +4.036668425e-01f, +6.775802154e-01f, -5.106913162e-02f }, - { -2.641231671e-02f, +4.033263699e-01f, +6.779147709e-01f, -5.109577326e-02f }, - { -2.638173519e-02f, +4.029859567e-01f, +6.782492471e-01f, -5.112238791e-02f }, - { -2.635116538e-02f, +4.026456031e-01f, +6.785836440e-01f, -5.114897551e-02f }, - { -2.632060732e-02f, +4.023053093e-01f, +6.789179612e-01f, -5.117553600e-02f }, - { -2.629006103e-02f, +4.019650754e-01f, +6.792521986e-01f, -5.120206929e-02f }, - { -2.625952655e-02f, +4.016249015e-01f, +6.795863561e-01f, -5.122857533e-02f }, - { -2.622900390e-02f, +4.012847878e-01f, +6.799204334e-01f, -5.125505405e-02f }, - { -2.619849310e-02f, +4.009447344e-01f, +6.802544304e-01f, -5.128150537e-02f }, - { -2.616799420e-02f, +4.006047415e-01f, +6.805883468e-01f, -5.130792924e-02f }, - { -2.613750720e-02f, +4.002648093e-01f, +6.809221825e-01f, -5.133432558e-02f }, - { -2.610703216e-02f, +3.999249379e-01f, +6.812559373e-01f, -5.136069431e-02f }, - { -2.607656908e-02f, +3.995851274e-01f, +6.815896110e-01f, -5.138703539e-02f }, - { -2.604611800e-02f, +3.992453779e-01f, +6.819232035e-01f, -5.141334873e-02f }, - { -2.601567895e-02f, +3.989056898e-01f, +6.822567144e-01f, -5.143963427e-02f }, - { -2.598525196e-02f, +3.985660630e-01f, +6.825901438e-01f, -5.146589193e-02f }, - { -2.595483705e-02f, +3.982264977e-01f, +6.829234913e-01f, -5.149212166e-02f }, - { -2.592443425e-02f, +3.978869942e-01f, +6.832567567e-01f, -5.151832338e-02f }, - { -2.589404358e-02f, +3.975475525e-01f, +6.835899400e-01f, -5.154449702e-02f }, - { -2.586366508e-02f, +3.972081727e-01f, +6.839230409e-01f, -5.157064252e-02f }, - { -2.583329878e-02f, +3.968688551e-01f, +6.842560591e-01f, -5.159675980e-02f }, - { -2.580294470e-02f, +3.965295998e-01f, +6.845889947e-01f, -5.162284880e-02f }, - { -2.577260287e-02f, +3.961904069e-01f, +6.849218472e-01f, -5.164890945e-02f }, - { -2.574227331e-02f, +3.958512766e-01f, +6.852546167e-01f, -5.167494167e-02f }, - { -2.571195605e-02f, +3.955122090e-01f, +6.855873028e-01f, -5.170094541e-02f }, - { -2.568165113e-02f, +3.951732042e-01f, +6.859199054e-01f, -5.172692059e-02f }, - { -2.565135856e-02f, +3.948342626e-01f, +6.862524243e-01f, -5.175286714e-02f }, - { -2.562107838e-02f, +3.944953840e-01f, +6.865848593e-01f, -5.177878499e-02f }, - { -2.559081062e-02f, +3.941565688e-01f, +6.869172102e-01f, -5.180467408e-02f }, - { -2.556055529e-02f, +3.938178171e-01f, +6.872494769e-01f, -5.183053433e-02f }, - { -2.553031243e-02f, +3.934791290e-01f, +6.875816592e-01f, -5.185636568e-02f }, - { -2.550008206e-02f, +3.931405046e-01f, +6.879137568e-01f, -5.188216805e-02f }, - { -2.546986421e-02f, +3.928019442e-01f, +6.882457697e-01f, -5.190794138e-02f }, - { -2.543965891e-02f, +3.924634478e-01f, +6.885776975e-01f, -5.193368560e-02f }, - { -2.540946619e-02f, +3.921250156e-01f, +6.889095401e-01f, -5.195940064e-02f }, - { -2.537928607e-02f, +3.917866477e-01f, +6.892412974e-01f, -5.198508643e-02f }, - { -2.534911857e-02f, +3.914483444e-01f, +6.895729691e-01f, -5.201074290e-02f }, - { -2.531896373e-02f, +3.911101057e-01f, +6.899045550e-01f, -5.203636997e-02f }, - { -2.528882157e-02f, +3.907719318e-01f, +6.902360551e-01f, -5.206196759e-02f }, - { -2.525869212e-02f, +3.904338229e-01f, +6.905674690e-01f, -5.208753568e-02f }, - { -2.522857541e-02f, +3.900957790e-01f, +6.908987966e-01f, -5.211307417e-02f }, - { -2.519847146e-02f, +3.897578004e-01f, +6.912300378e-01f, -5.213858300e-02f }, - { -2.516838029e-02f, +3.894198871e-01f, +6.915611922e-01f, -5.216406208e-02f }, - { -2.513830194e-02f, +3.890820394e-01f, +6.918922599e-01f, -5.218951136e-02f }, - { -2.510823643e-02f, +3.887442574e-01f, +6.922232404e-01f, -5.221493076e-02f }, - { -2.507818379e-02f, +3.884065411e-01f, +6.925541338e-01f, -5.224032022e-02f }, - { -2.504814403e-02f, +3.880688909e-01f, +6.928849397e-01f, -5.226567965e-02f }, - { -2.501811720e-02f, +3.877313067e-01f, +6.932156580e-01f, -5.229100900e-02f }, - { -2.498810332e-02f, +3.873937888e-01f, +6.935462886e-01f, -5.231630820e-02f }, - { -2.495810241e-02f, +3.870563373e-01f, +6.938768311e-01f, -5.234157717e-02f }, - { -2.492811449e-02f, +3.867189524e-01f, +6.942072855e-01f, -5.236681584e-02f }, - { -2.489813960e-02f, +3.863816342e-01f, +6.945376516e-01f, -5.239202415e-02f }, - { -2.486817776e-02f, +3.860443828e-01f, +6.948679292e-01f, -5.241720201e-02f }, - { -2.483822900e-02f, +3.857071983e-01f, +6.951981180e-01f, -5.244234938e-02f }, - { -2.480829333e-02f, +3.853700811e-01f, +6.955282179e-01f, -5.246746616e-02f }, - { -2.477837080e-02f, +3.850330311e-01f, +6.958582288e-01f, -5.249255230e-02f }, - { -2.474846141e-02f, +3.846960485e-01f, +6.961881503e-01f, -5.251760772e-02f }, - { -2.471856521e-02f, +3.843591335e-01f, +6.965179824e-01f, -5.254263236e-02f }, - { -2.468868221e-02f, +3.840222862e-01f, +6.968477249e-01f, -5.256762613e-02f }, - { -2.465881245e-02f, +3.836855068e-01f, +6.971773775e-01f, -5.259258898e-02f }, - { -2.462895594e-02f, +3.833487953e-01f, +6.975069402e-01f, -5.261752083e-02f }, - { -2.459911271e-02f, +3.830121520e-01f, +6.978364126e-01f, -5.264242161e-02f }, - { -2.456928278e-02f, +3.826755771e-01f, +6.981657947e-01f, -5.266729126e-02f }, - { -2.453946619e-02f, +3.823390705e-01f, +6.984950861e-01f, -5.269212969e-02f }, - { -2.450966296e-02f, +3.820026325e-01f, +6.988242869e-01f, -5.271693684e-02f }, - { -2.447987311e-02f, +3.816662633e-01f, +6.991533966e-01f, -5.274171264e-02f }, - { -2.445009667e-02f, +3.813299629e-01f, +6.994824153e-01f, -5.276645702e-02f }, - { -2.442033366e-02f, +3.809937316e-01f, +6.998113426e-01f, -5.279116991e-02f }, - { -2.439058412e-02f, +3.806575694e-01f, +7.001401785e-01f, -5.281585123e-02f }, - { -2.436084805e-02f, +3.803214765e-01f, +7.004689226e-01f, -5.284050092e-02f }, - { -2.433112550e-02f, +3.799854530e-01f, +7.007975749e-01f, -5.286511890e-02f }, - { -2.430141648e-02f, +3.796494992e-01f, +7.011261352e-01f, -5.288970511e-02f }, - { -2.427172102e-02f, +3.793136151e-01f, +7.014546032e-01f, -5.291425948e-02f }, - { -2.424203914e-02f, +3.789778008e-01f, +7.017829788e-01f, -5.293878193e-02f }, - { -2.421237087e-02f, +3.786420566e-01f, +7.021112617e-01f, -5.296327238e-02f }, - { -2.418271624e-02f, +3.783063825e-01f, +7.024394519e-01f, -5.298773078e-02f }, - { -2.415307527e-02f, +3.779707788e-01f, +7.027675491e-01f, -5.301215705e-02f }, - { -2.412344797e-02f, +3.776352455e-01f, +7.030955531e-01f, -5.303655112e-02f }, - { -2.409383439e-02f, +3.772997828e-01f, +7.034234638e-01f, -5.306091292e-02f }, - { -2.406423454e-02f, +3.769643909e-01f, +7.037512810e-01f, -5.308524237e-02f }, - { -2.403464845e-02f, +3.766290698e-01f, +7.040790044e-01f, -5.310953941e-02f }, - { -2.400507614e-02f, +3.762938197e-01f, +7.044066339e-01f, -5.313380397e-02f }, - { -2.397551763e-02f, +3.759586408e-01f, +7.047341694e-01f, -5.315803596e-02f }, - { -2.394597296e-02f, +3.756235333e-01f, +7.050616105e-01f, -5.318223533e-02f }, - { -2.391644214e-02f, +3.752884971e-01f, +7.053889572e-01f, -5.320640200e-02f }, - { -2.388692520e-02f, +3.749535326e-01f, +7.057162093e-01f, -5.323053590e-02f }, - { -2.385742216e-02f, +3.746186398e-01f, +7.060433665e-01f, -5.325463695e-02f }, - { -2.382793305e-02f, +3.742838189e-01f, +7.063704287e-01f, -5.327870509e-02f }, - { -2.379845790e-02f, +3.739490700e-01f, +7.066973957e-01f, -5.330274025e-02f }, - { -2.376899672e-02f, +3.736143933e-01f, +7.070242673e-01f, -5.332674235e-02f }, - { -2.373954954e-02f, +3.732797888e-01f, +7.073510434e-01f, -5.335071132e-02f }, - { -2.371011639e-02f, +3.729452569e-01f, +7.076777237e-01f, -5.337464709e-02f }, - { -2.368069728e-02f, +3.726107975e-01f, +7.080043080e-01f, -5.339854959e-02f }, - { -2.365129225e-02f, +3.722764108e-01f, +7.083307963e-01f, -5.342241875e-02f }, - { -2.362190131e-02f, +3.719420970e-01f, +7.086571882e-01f, -5.344625449e-02f }, - { -2.359252450e-02f, +3.716078562e-01f, +7.089834836e-01f, -5.347005675e-02f }, - { -2.356316182e-02f, +3.712736886e-01f, +7.093096823e-01f, -5.349382545e-02f }, - { -2.353381332e-02f, +3.709395943e-01f, +7.096357842e-01f, -5.351756051e-02f }, - { -2.350447901e-02f, +3.706055734e-01f, +7.099617891e-01f, -5.354126188e-02f }, - { -2.347515891e-02f, +3.702716261e-01f, +7.102876966e-01f, -5.356492947e-02f }, - { -2.344585305e-02f, +3.699377525e-01f, +7.106135068e-01f, -5.358856321e-02f }, - { -2.341656145e-02f, +3.696039527e-01f, +7.109392194e-01f, -5.361216304e-02f }, - { -2.338728414e-02f, +3.692702270e-01f, +7.112648342e-01f, -5.363572888e-02f }, - { -2.335802114e-02f, +3.689365754e-01f, +7.115903510e-01f, -5.365926065e-02f }, - { -2.332877247e-02f, +3.686029981e-01f, +7.119157697e-01f, -5.368275829e-02f }, - { -2.329953816e-02f, +3.682694952e-01f, +7.122410900e-01f, -5.370622173e-02f }, - { -2.327031823e-02f, +3.679360669e-01f, +7.125663118e-01f, -5.372965088e-02f }, - { -2.324111270e-02f, +3.676027132e-01f, +7.128914348e-01f, -5.375304569e-02f }, - { -2.321192159e-02f, +3.672694344e-01f, +7.132164590e-01f, -5.377640607e-02f }, - { -2.318274493e-02f, +3.669362306e-01f, +7.135413841e-01f, -5.379973196e-02f }, - { -2.315358275e-02f, +3.666031020e-01f, +7.138662100e-01f, -5.382302328e-02f }, - { -2.312443506e-02f, +3.662700485e-01f, +7.141909364e-01f, -5.384627996e-02f }, - { -2.309530189e-02f, +3.659370705e-01f, +7.145155631e-01f, -5.386950193e-02f }, - { -2.306618326e-02f, +3.656041680e-01f, +7.148400900e-01f, -5.389268911e-02f }, - { -2.303707919e-02f, +3.652713412e-01f, +7.151645170e-01f, -5.391584144e-02f }, - { -2.300798972e-02f, +3.649385903e-01f, +7.154888437e-01f, -5.393895884e-02f }, - { -2.297891485e-02f, +3.646059152e-01f, +7.158130701e-01f, -5.396204124e-02f }, - { -2.294985461e-02f, +3.642733163e-01f, +7.161371959e-01f, -5.398508856e-02f }, - { -2.292080903e-02f, +3.639407936e-01f, +7.164612210e-01f, -5.400810073e-02f }, - { -2.289177812e-02f, +3.636083473e-01f, +7.167851452e-01f, -5.403107768e-02f }, - { -2.286276192e-02f, +3.632759775e-01f, +7.171089682e-01f, -5.405401935e-02f }, - { -2.283376044e-02f, +3.629436844e-01f, +7.174326900e-01f, -5.407692564e-02f }, - { -2.280477371e-02f, +3.626114681e-01f, +7.177563103e-01f, -5.409979650e-02f }, - { -2.277580174e-02f, +3.622793287e-01f, +7.180798289e-01f, -5.412263185e-02f }, - { -2.274684456e-02f, +3.619472663e-01f, +7.184032457e-01f, -5.414543161e-02f }, - { -2.271790220e-02f, +3.616152812e-01f, +7.187265605e-01f, -5.416819572e-02f }, - { -2.268897467e-02f, +3.612833734e-01f, +7.190497730e-01f, -5.419092410e-02f }, - { -2.266006200e-02f, +3.609515431e-01f, +7.193728831e-01f, -5.421361667e-02f }, - { -2.263116421e-02f, +3.606197904e-01f, +7.196958907e-01f, -5.423627337e-02f }, - { -2.260228132e-02f, +3.602881155e-01f, +7.200187955e-01f, -5.425889412e-02f }, - { -2.257341336e-02f, +3.599565185e-01f, +7.203415974e-01f, -5.428147885e-02f }, - { -2.254456034e-02f, +3.596249995e-01f, +7.206642961e-01f, -5.430402749e-02f }, - { -2.251572229e-02f, +3.592935587e-01f, +7.209868915e-01f, -5.432653996e-02f }, - { -2.248689923e-02f, +3.589621962e-01f, +7.213093834e-01f, -5.434901618e-02f }, - { -2.245809118e-02f, +3.586309121e-01f, +7.216317716e-01f, -5.437145610e-02f }, - { -2.242929816e-02f, +3.582997067e-01f, +7.219540560e-01f, -5.439385962e-02f }, - { -2.240052021e-02f, +3.579685799e-01f, +7.222762363e-01f, -5.441622669e-02f }, - { -2.237175733e-02f, +3.576375321e-01f, +7.225983123e-01f, -5.443855722e-02f }, - { -2.234300954e-02f, +3.573065632e-01f, +7.229202840e-01f, -5.446085115e-02f }, - { -2.231427688e-02f, +3.569756734e-01f, +7.232421510e-01f, -5.448310839e-02f }, - { -2.228555936e-02f, +3.566448630e-01f, +7.235639133e-01f, -5.450532888e-02f }, - { -2.225685701e-02f, +3.563141319e-01f, +7.238855706e-01f, -5.452751254e-02f }, - { -2.222816984e-02f, +3.559834804e-01f, +7.242071227e-01f, -5.454965931e-02f }, - { -2.219949788e-02f, +3.556529085e-01f, +7.245285695e-01f, -5.457176909e-02f }, - { -2.217084115e-02f, +3.553224165e-01f, +7.248499108e-01f, -5.459384183e-02f }, - { -2.214219967e-02f, +3.549920045e-01f, +7.251711464e-01f, -5.461587745e-02f }, - { -2.211357346e-02f, +3.546616725e-01f, +7.254922761e-01f, -5.463787587e-02f }, - { -2.208496254e-02f, +3.543314207e-01f, +7.258132997e-01f, -5.465983703e-02f }, - { -2.205636694e-02f, +3.540012493e-01f, +7.261342170e-01f, -5.468176084e-02f }, - { -2.202778667e-02f, +3.536711584e-01f, +7.264550280e-01f, -5.470364724e-02f }, - { -2.199922176e-02f, +3.533411482e-01f, +7.267757323e-01f, -5.472549614e-02f }, - { -2.197067223e-02f, +3.530112187e-01f, +7.270963298e-01f, -5.474730748e-02f }, - { -2.194213809e-02f, +3.526813701e-01f, +7.274168203e-01f, -5.476908119e-02f }, - { -2.191361938e-02f, +3.523516026e-01f, +7.277372036e-01f, -5.479081718e-02f }, - { -2.188511610e-02f, +3.520219162e-01f, +7.280574796e-01f, -5.481251539e-02f }, - { -2.185662829e-02f, +3.516923111e-01f, +7.283776481e-01f, -5.483417574e-02f }, - { -2.182815596e-02f, +3.513627875e-01f, +7.286977088e-01f, -5.485579815e-02f }, - { -2.179969913e-02f, +3.510333455e-01f, +7.290176616e-01f, -5.487738256e-02f }, - { -2.177125783e-02f, +3.507039852e-01f, +7.293375064e-01f, -5.489892888e-02f }, - { -2.174283207e-02f, +3.503747067e-01f, +7.296572429e-01f, -5.492043705e-02f }, - { -2.171442188e-02f, +3.500455102e-01f, +7.299768709e-01f, -5.494190699e-02f }, - { -2.168602727e-02f, +3.497163959e-01f, +7.302963903e-01f, -5.496333863e-02f }, - { -2.165764827e-02f, +3.493873638e-01f, +7.306158008e-01f, -5.498473189e-02f }, - { -2.162928490e-02f, +3.490584141e-01f, +7.309351024e-01f, -5.500608670e-02f }, - { -2.160093718e-02f, +3.487295469e-01f, +7.312542948e-01f, -5.502740298e-02f }, - { -2.157260512e-02f, +3.484007623e-01f, +7.315733778e-01f, -5.504868065e-02f }, - { -2.154428875e-02f, +3.480720606e-01f, +7.318923513e-01f, -5.506991966e-02f }, - { -2.151598810e-02f, +3.477434418e-01f, +7.322112150e-01f, -5.509111991e-02f }, - { -2.148770317e-02f, +3.474149060e-01f, +7.325299688e-01f, -5.511228134e-02f }, - { -2.145943399e-02f, +3.470864534e-01f, +7.328486125e-01f, -5.513340388e-02f }, - { -2.143118058e-02f, +3.467580842e-01f, +7.331671459e-01f, -5.515448744e-02f }, - { -2.140294296e-02f, +3.464297984e-01f, +7.334855689e-01f, -5.517553195e-02f }, - { -2.137472115e-02f, +3.461015962e-01f, +7.338038812e-01f, -5.519653734e-02f }, - { -2.134651517e-02f, +3.457734778e-01f, +7.341220827e-01f, -5.521750353e-02f }, - { -2.131832504e-02f, +3.454454432e-01f, +7.344401732e-01f, -5.523843046e-02f }, - { -2.129015078e-02f, +3.451174926e-01f, +7.347581525e-01f, -5.525931803e-02f }, - { -2.126199241e-02f, +3.447896261e-01f, +7.350760204e-01f, -5.528016619e-02f }, - { -2.123384995e-02f, +3.444618439e-01f, +7.353937768e-01f, -5.530097485e-02f }, - { -2.120572342e-02f, +3.441341461e-01f, +7.357114214e-01f, -5.532174395e-02f }, - { -2.117761283e-02f, +3.438065327e-01f, +7.360289541e-01f, -5.534247339e-02f }, - { -2.114951822e-02f, +3.434790041e-01f, +7.363463747e-01f, -5.536316312e-02f }, - { -2.112143960e-02f, +3.431515602e-01f, +7.366636830e-01f, -5.538381306e-02f }, - { -2.109337699e-02f, +3.428242013e-01f, +7.369808788e-01f, -5.540442312e-02f }, - { -2.106533040e-02f, +3.424969274e-01f, +7.372979620e-01f, -5.542499324e-02f }, - { -2.103729986e-02f, +3.421697387e-01f, +7.376149323e-01f, -5.544552335e-02f }, - { -2.100928539e-02f, +3.418426354e-01f, +7.379317896e-01f, -5.546601336e-02f }, - { -2.098128700e-02f, +3.415156174e-01f, +7.382485338e-01f, -5.548646320e-02f }, - { -2.095330472e-02f, +3.411886851e-01f, +7.385651645e-01f, -5.550687279e-02f }, - { -2.092533857e-02f, +3.408618385e-01f, +7.388816817e-01f, -5.552724207e-02f }, - { -2.089738856e-02f, +3.405350777e-01f, +7.391980851e-01f, -5.554757095e-02f }, - { -2.086945472e-02f, +3.402084029e-01f, +7.395143746e-01f, -5.556785936e-02f }, - { -2.084153705e-02f, +3.398818142e-01f, +7.398305500e-01f, -5.558810723e-02f }, - { -2.081363559e-02f, +3.395553117e-01f, +7.401466111e-01f, -5.560831448e-02f }, - { -2.078575035e-02f, +3.392288956e-01f, +7.404625577e-01f, -5.562848104e-02f }, - { -2.075788136e-02f, +3.389025660e-01f, +7.407783897e-01f, -5.564860682e-02f }, - { -2.073002862e-02f, +3.385763231e-01f, +7.410941069e-01f, -5.566869176e-02f }, - { -2.070219216e-02f, +3.382501669e-01f, +7.414097090e-01f, -5.568873578e-02f }, - { -2.067437199e-02f, +3.379240976e-01f, +7.417251959e-01f, -5.570873880e-02f }, - { -2.064656814e-02f, +3.375981153e-01f, +7.420405674e-01f, -5.572870075e-02f }, - { -2.061878063e-02f, +3.372722202e-01f, +7.423558234e-01f, -5.574862155e-02f }, - { -2.059100947e-02f, +3.369464124e-01f, +7.426709636e-01f, -5.576850113e-02f }, - { -2.056325469e-02f, +3.366206920e-01f, +7.429859879e-01f, -5.578833941e-02f }, - { -2.053551629e-02f, +3.362950591e-01f, +7.433008961e-01f, -5.580813632e-02f }, - { -2.050779431e-02f, +3.359695139e-01f, +7.436156880e-01f, -5.582789178e-02f }, - { -2.048008875e-02f, +3.356440565e-01f, +7.439303635e-01f, -5.584760571e-02f }, - { -2.045239964e-02f, +3.353186871e-01f, +7.442449222e-01f, -5.586727805e-02f }, - { -2.042472700e-02f, +3.349934057e-01f, +7.445593642e-01f, -5.588690871e-02f }, - { -2.039707084e-02f, +3.346682125e-01f, +7.448736891e-01f, -5.590649761e-02f }, - { -2.036943118e-02f, +3.343431076e-01f, +7.451878969e-01f, -5.592604469e-02f }, - { -2.034180804e-02f, +3.340180912e-01f, +7.455019872e-01f, -5.594554986e-02f }, - { -2.031420145e-02f, +3.336931634e-01f, +7.458159600e-01f, -5.596501306e-02f }, - { -2.028661141e-02f, +3.333683243e-01f, +7.461298151e-01f, -5.598443420e-02f }, - { -2.025903794e-02f, +3.330435740e-01f, +7.464435522e-01f, -5.600381321e-02f }, - { -2.023148107e-02f, +3.327189127e-01f, +7.467571712e-01f, -5.602315001e-02f }, - { -2.020394081e-02f, +3.323943405e-01f, +7.470706720e-01f, -5.604244453e-02f }, - { -2.017641718e-02f, +3.320698576e-01f, +7.473840543e-01f, -5.606169669e-02f }, - { -2.014891020e-02f, +3.317454639e-01f, +7.476973179e-01f, -5.608090642e-02f }, - { -2.012141988e-02f, +3.314211598e-01f, +7.480104627e-01f, -5.610007364e-02f }, - { -2.009394625e-02f, +3.310969453e-01f, +7.483234885e-01f, -5.611919827e-02f }, - { -2.006648932e-02f, +3.307728205e-01f, +7.486363951e-01f, -5.613828023e-02f }, - { -2.003904911e-02f, +3.304487856e-01f, +7.489491824e-01f, -5.615731946e-02f }, - { -2.001162564e-02f, +3.301248407e-01f, +7.492618501e-01f, -5.617631587e-02f }, - { -1.998421892e-02f, +3.298009860e-01f, +7.495743981e-01f, -5.619526939e-02f }, - { -1.995682897e-02f, +3.294772215e-01f, +7.498868261e-01f, -5.621417995e-02f }, - { -1.992945582e-02f, +3.291535473e-01f, +7.501991341e-01f, -5.623304746e-02f }, - { -1.990209947e-02f, +3.288299637e-01f, +7.505113218e-01f, -5.625187185e-02f }, - { -1.987475995e-02f, +3.285064707e-01f, +7.508233890e-01f, -5.627065304e-02f }, - { -1.984743727e-02f, +3.281830685e-01f, +7.511353356e-01f, -5.628939096e-02f }, - { -1.982013145e-02f, +3.278597572e-01f, +7.514471614e-01f, -5.630808553e-02f }, - { -1.979284251e-02f, +3.275365369e-01f, +7.517588662e-01f, -5.632673668e-02f }, - { -1.976557047e-02f, +3.272134077e-01f, +7.520704498e-01f, -5.634534432e-02f }, - { -1.973831534e-02f, +3.268903698e-01f, +7.523819121e-01f, -5.636390839e-02f }, - { -1.971107714e-02f, +3.265674233e-01f, +7.526932528e-01f, -5.638242880e-02f }, - { -1.968385589e-02f, +3.262445684e-01f, +7.530044718e-01f, -5.640090548e-02f }, - { -1.965665160e-02f, +3.259218051e-01f, +7.533155690e-01f, -5.641933835e-02f }, - { -1.962946429e-02f, +3.255991335e-01f, +7.536265440e-01f, -5.643772734e-02f }, - { -1.960229398e-02f, +3.252765539e-01f, +7.539373968e-01f, -5.645607236e-02f }, - { -1.957514069e-02f, +3.249540663e-01f, +7.542481271e-01f, -5.647437335e-02f }, - { -1.954800443e-02f, +3.246316709e-01f, +7.545587349e-01f, -5.649263022e-02f }, - { -1.952088522e-02f, +3.243093678e-01f, +7.548692198e-01f, -5.651084290e-02f }, - { -1.949378307e-02f, +3.239871571e-01f, +7.551795818e-01f, -5.652901131e-02f }, - { -1.946669801e-02f, +3.236650389e-01f, +7.554898206e-01f, -5.654713538e-02f }, - { -1.943963005e-02f, +3.233430133e-01f, +7.557999361e-01f, -5.656521503e-02f }, - { -1.941257921e-02f, +3.230210806e-01f, +7.561099280e-01f, -5.658325018e-02f }, - { -1.938554550e-02f, +3.226992408e-01f, +7.564197963e-01f, -5.660124075e-02f }, - { -1.935852895e-02f, +3.223774940e-01f, +7.567295407e-01f, -5.661918667e-02f }, - { -1.933152956e-02f, +3.220558404e-01f, +7.570391610e-01f, -5.663708786e-02f }, - { -1.930454735e-02f, +3.217342801e-01f, +7.573486571e-01f, -5.665494425e-02f }, - { -1.927758234e-02f, +3.214128132e-01f, +7.576580288e-01f, -5.667275575e-02f }, - { -1.925063455e-02f, +3.210914398e-01f, +7.579672759e-01f, -5.669052229e-02f }, - { -1.922370400e-02f, +3.207701601e-01f, +7.582763982e-01f, -5.670824380e-02f }, - { -1.919679069e-02f, +3.204489742e-01f, +7.585853955e-01f, -5.672592019e-02f }, - { -1.916989465e-02f, +3.201278822e-01f, +7.588942678e-01f, -5.674355138e-02f }, - { -1.914301589e-02f, +3.198068842e-01f, +7.592030147e-01f, -5.676113731e-02f }, - { -1.911615443e-02f, +3.194859804e-01f, +7.595116361e-01f, -5.677867790e-02f }, - { -1.908931029e-02f, +3.191651709e-01f, +7.598201319e-01f, -5.679617306e-02f }, - { -1.906248348e-02f, +3.188444558e-01f, +7.601285018e-01f, -5.681362272e-02f }, - { -1.903567401e-02f, +3.185238353e-01f, +7.604367457e-01f, -5.683102681e-02f }, - { -1.900888191e-02f, +3.182033094e-01f, +7.607448634e-01f, -5.684838523e-02f }, - { -1.898210719e-02f, +3.178828783e-01f, +7.610528546e-01f, -5.686569793e-02f }, - { -1.895534986e-02f, +3.175625421e-01f, +7.613607194e-01f, -5.688296482e-02f }, - { -1.892860994e-02f, +3.172423009e-01f, +7.616684574e-01f, -5.690018582e-02f }, - { -1.890188745e-02f, +3.169221549e-01f, +7.619760684e-01f, -5.691736086e-02f }, - { -1.887518241e-02f, +3.166021042e-01f, +7.622835524e-01f, -5.693448985e-02f }, - { -1.884849482e-02f, +3.162821488e-01f, +7.625909090e-01f, -5.695157273e-02f }, - { -1.882182471e-02f, +3.159622890e-01f, +7.628981382e-01f, -5.696860941e-02f }, - { -1.879517209e-02f, +3.156425249e-01f, +7.632052398e-01f, -5.698559981e-02f }, - { -1.876853697e-02f, +3.153228565e-01f, +7.635122136e-01f, -5.700254386e-02f }, - { -1.874191938e-02f, +3.150032840e-01f, +7.638190593e-01f, -5.701944149e-02f }, - { -1.871531932e-02f, +3.146838075e-01f, +7.641257769e-01f, -5.703629260e-02f }, - { -1.868873682e-02f, +3.143644272e-01f, +7.644323662e-01f, -5.705309714e-02f }, - { -1.866217188e-02f, +3.140451431e-01f, +7.647388269e-01f, -5.706985501e-02f }, - { -1.863562453e-02f, +3.137259554e-01f, +7.650451589e-01f, -5.708656614e-02f }, - { -1.860909478e-02f, +3.134068642e-01f, +7.653513620e-01f, -5.710323045e-02f }, - { -1.858258264e-02f, +3.130878696e-01f, +7.656574360e-01f, -5.711984787e-02f }, - { -1.855608813e-02f, +3.127689718e-01f, +7.659633808e-01f, -5.713641831e-02f }, - { -1.852961127e-02f, +3.124501709e-01f, +7.662691962e-01f, -5.715294170e-02f }, - { -1.850315207e-02f, +3.121314670e-01f, +7.665748819e-01f, -5.716941797e-02f }, - { -1.847671054e-02f, +3.118128601e-01f, +7.668804379e-01f, -5.718584702e-02f }, - { -1.845028671e-02f, +3.114943506e-01f, +7.671858639e-01f, -5.720222880e-02f }, - { -1.842388058e-02f, +3.111759383e-01f, +7.674911598e-01f, -5.721856321e-02f }, - { -1.839749217e-02f, +3.108576236e-01f, +7.677963254e-01f, -5.723485017e-02f }, - { -1.837112149e-02f, +3.105394064e-01f, +7.681013605e-01f, -5.725108962e-02f }, - { -1.834476857e-02f, +3.102212870e-01f, +7.684062649e-01f, -5.726728148e-02f }, - { -1.831843341e-02f, +3.099032654e-01f, +7.687110385e-01f, -5.728342566e-02f }, - { -1.829211604e-02f, +3.095853418e-01f, +7.690156811e-01f, -5.729952209e-02f }, - { -1.826581646e-02f, +3.092675163e-01f, +7.693201924e-01f, -5.731557068e-02f }, - { -1.823953469e-02f, +3.089497890e-01f, +7.696245724e-01f, -5.733157137e-02f }, - { -1.821327074e-02f, +3.086321600e-01f, +7.699288208e-01f, -5.734752407e-02f }, - { -1.818702464e-02f, +3.083146294e-01f, +7.702329374e-01f, -5.736342870e-02f }, - { -1.816079639e-02f, +3.079971975e-01f, +7.705369222e-01f, -5.737928519e-02f }, - { -1.813458600e-02f, +3.076798642e-01f, +7.708407749e-01f, -5.739509346e-02f }, - { -1.810839350e-02f, +3.073626297e-01f, +7.711444953e-01f, -5.741085343e-02f }, - { -1.808221890e-02f, +3.070454941e-01f, +7.714480832e-01f, -5.742656503e-02f }, - { -1.805606221e-02f, +3.067284576e-01f, +7.717515386e-01f, -5.744222816e-02f }, - { -1.802992345e-02f, +3.064115203e-01f, +7.720548611e-01f, -5.745784276e-02f }, - { -1.800380263e-02f, +3.060946822e-01f, +7.723580506e-01f, -5.747340875e-02f }, - { -1.797769977e-02f, +3.057779436e-01f, +7.726611070e-01f, -5.748892604e-02f }, - { -1.795161487e-02f, +3.054613045e-01f, +7.729640301e-01f, -5.750439457e-02f }, - { -1.792554796e-02f, +3.051447650e-01f, +7.732668197e-01f, -5.751981424e-02f }, - { -1.789949905e-02f, +3.048283253e-01f, +7.735694755e-01f, -5.753518499e-02f }, - { -1.787346814e-02f, +3.045119855e-01f, +7.738719975e-01f, -5.755050673e-02f }, - { -1.784745527e-02f, +3.041957456e-01f, +7.741743855e-01f, -5.756577939e-02f }, - { -1.782146044e-02f, +3.038796059e-01f, +7.744766393e-01f, -5.758100289e-02f }, - { -1.779548366e-02f, +3.035635665e-01f, +7.747787586e-01f, -5.759617715e-02f }, - { -1.776952495e-02f, +3.032476274e-01f, +7.750807434e-01f, -5.761130208e-02f }, - { -1.774358432e-02f, +3.029317887e-01f, +7.753825935e-01f, -5.762637762e-02f }, - { -1.771766179e-02f, +3.026160507e-01f, +7.756843086e-01f, -5.764140368e-02f }, - { -1.769175736e-02f, +3.023004134e-01f, +7.759858886e-01f, -5.765638018e-02f }, - { -1.766587107e-02f, +3.019848769e-01f, +7.762873333e-01f, -5.767130705e-02f }, - { -1.764000291e-02f, +3.016694414e-01f, +7.765886426e-01f, -5.768618420e-02f }, - { -1.761415290e-02f, +3.013541069e-01f, +7.768898163e-01f, -5.770101157e-02f }, - { -1.758832105e-02f, +3.010388736e-01f, +7.771908542e-01f, -5.771578906e-02f }, - { -1.756250739e-02f, +3.007237417e-01f, +7.774917560e-01f, -5.773051660e-02f }, - { -1.753671192e-02f, +3.004087111e-01f, +7.777925218e-01f, -5.774519411e-02f }, - { -1.751093465e-02f, +3.000937821e-01f, +7.780931511e-01f, -5.775982152e-02f }, - { -1.748517560e-02f, +2.997789547e-01f, +7.783936440e-01f, -5.777439874e-02f }, - { -1.745943479e-02f, +2.994642291e-01f, +7.786940002e-01f, -5.778892569e-02f }, - { -1.743371222e-02f, +2.991496054e-01f, +7.789942195e-01f, -5.780340230e-02f }, - { -1.740800791e-02f, +2.988350837e-01f, +7.792943018e-01f, -5.781782849e-02f }, - { -1.738232187e-02f, +2.985206642e-01f, +7.795942469e-01f, -5.783220417e-02f }, - { -1.735665412e-02f, +2.982063468e-01f, +7.798940546e-01f, -5.784652927e-02f }, - { -1.733100467e-02f, +2.978921319e-01f, +7.801937247e-01f, -5.786080371e-02f }, - { -1.730537353e-02f, +2.975780194e-01f, +7.804932570e-01f, -5.787502741e-02f }, - { -1.727976072e-02f, +2.972640094e-01f, +7.807926515e-01f, -5.788920029e-02f }, - { -1.725416625e-02f, +2.969501022e-01f, +7.810919079e-01f, -5.790332228e-02f }, - { -1.722859012e-02f, +2.966362979e-01f, +7.813910260e-01f, -5.791739329e-02f }, - { -1.720303237e-02f, +2.963225964e-01f, +7.816900056e-01f, -5.793141324e-02f }, - { -1.717749299e-02f, +2.960089980e-01f, +7.819888466e-01f, -5.794538205e-02f }, - { -1.715197200e-02f, +2.956955028e-01f, +7.822875489e-01f, -5.795929965e-02f }, - { -1.712646941e-02f, +2.953821109e-01f, +7.825861121e-01f, -5.797316596e-02f }, - { -1.710098524e-02f, +2.950688223e-01f, +7.828845363e-01f, -5.798698089e-02f }, - { -1.707551950e-02f, +2.947556373e-01f, +7.831828211e-01f, -5.800074437e-02f }, - { -1.705007220e-02f, +2.944425560e-01f, +7.834809664e-01f, -5.801445632e-02f }, - { -1.702464336e-02f, +2.941295783e-01f, +7.837789720e-01f, -5.802811666e-02f }, - { -1.699923298e-02f, +2.938167045e-01f, +7.840768378e-01f, -5.804172530e-02f }, - { -1.697384108e-02f, +2.935039348e-01f, +7.843745636e-01f, -5.805528218e-02f }, - { -1.694846768e-02f, +2.931912691e-01f, +7.846721491e-01f, -5.806878721e-02f }, - { -1.692311278e-02f, +2.928787076e-01f, +7.849695943e-01f, -5.808224030e-02f }, - { -1.689777639e-02f, +2.925662504e-01f, +7.852668990e-01f, -5.809564139e-02f }, - { -1.687245854e-02f, +2.922538976e-01f, +7.855640629e-01f, -5.810899039e-02f }, - { -1.684715923e-02f, +2.919416495e-01f, +7.858610859e-01f, -5.812228722e-02f }, - { -1.682187847e-02f, +2.916295059e-01f, +7.861579679e-01f, -5.813553181e-02f }, - { -1.679661628e-02f, +2.913174672e-01f, +7.864547086e-01f, -5.814872407e-02f }, - { -1.677137267e-02f, +2.910055333e-01f, +7.867513079e-01f, -5.816186392e-02f }, - { -1.674614765e-02f, +2.906937045e-01f, +7.870477656e-01f, -5.817495128e-02f }, - { -1.672094124e-02f, +2.903819808e-01f, +7.873440816e-01f, -5.818798608e-02f }, - { -1.669575344e-02f, +2.900703623e-01f, +7.876402556e-01f, -5.820096823e-02f }, - { -1.667058426e-02f, +2.897588491e-01f, +7.879362875e-01f, -5.821389766e-02f }, - { -1.664543373e-02f, +2.894474415e-01f, +7.882321771e-01f, -5.822677428e-02f }, - { -1.662030185e-02f, +2.891361394e-01f, +7.885279242e-01f, -5.823959802e-02f }, - { -1.659518863e-02f, +2.888249429e-01f, +7.888235287e-01f, -5.825236880e-02f }, - { -1.657009409e-02f, +2.885138523e-01f, +7.891189904e-01f, -5.826508653e-02f }, - { -1.654501824e-02f, +2.882028676e-01f, +7.894143091e-01f, -5.827775113e-02f }, - { -1.651996108e-02f, +2.878919890e-01f, +7.897094846e-01f, -5.829036253e-02f }, - { -1.649492264e-02f, +2.875812164e-01f, +7.900045168e-01f, -5.830292065e-02f }, - { -1.646990291e-02f, +2.872705501e-01f, +7.902994055e-01f, -5.831542540e-02f }, - { -1.644490193e-02f, +2.869599902e-01f, +7.905941505e-01f, -5.832787671e-02f }, - { -1.641991969e-02f, +2.866495368e-01f, +7.908887516e-01f, -5.834027449e-02f }, - { -1.639495620e-02f, +2.863391899e-01f, +7.911832088e-01f, -5.835261867e-02f }, - { -1.637001149e-02f, +2.860289498e-01f, +7.914775217e-01f, -5.836490917e-02f }, - { -1.634508556e-02f, +2.857188164e-01f, +7.917716902e-01f, -5.837714590e-02f }, - { -1.632017842e-02f, +2.854087900e-01f, +7.920657142e-01f, -5.838932879e-02f }, - { -1.629529008e-02f, +2.850988707e-01f, +7.923595935e-01f, -5.840145776e-02f }, - { -1.627042056e-02f, +2.847890584e-01f, +7.926533279e-01f, -5.841353272e-02f }, - { -1.624556986e-02f, +2.844793535e-01f, +7.929469172e-01f, -5.842555359e-02f }, - { -1.622073801e-02f, +2.841697559e-01f, +7.932403612e-01f, -5.843752031e-02f }, - { -1.619592500e-02f, +2.838602658e-01f, +7.935336599e-01f, -5.844943277e-02f }, - { -1.617113085e-02f, +2.835508833e-01f, +7.938268129e-01f, -5.846129092e-02f }, - { -1.614635558e-02f, +2.832416085e-01f, +7.941198202e-01f, -5.847309465e-02f }, - { -1.612159918e-02f, +2.829324415e-01f, +7.944126816e-01f, -5.848484391e-02f }, - { -1.609686168e-02f, +2.826233824e-01f, +7.947053969e-01f, -5.849653859e-02f }, - { -1.607214309e-02f, +2.823144314e-01f, +7.949979658e-01f, -5.850817864e-02f }, - { -1.604744341e-02f, +2.820055885e-01f, +7.952903884e-01f, -5.851976395e-02f }, - { -1.602276266e-02f, +2.816968539e-01f, +7.955826642e-01f, -5.853129446e-02f }, - { -1.599810084e-02f, +2.813882276e-01f, +7.958747933e-01f, -5.854277008e-02f }, - { -1.597345798e-02f, +2.810797098e-01f, +7.961667755e-01f, -5.855419074e-02f }, - { -1.594883407e-02f, +2.807713007e-01f, +7.964586105e-01f, -5.856555634e-02f }, - { -1.592422914e-02f, +2.804630002e-01f, +7.967502981e-01f, -5.857686682e-02f }, - { -1.589964318e-02f, +2.801548085e-01f, +7.970418383e-01f, -5.858812209e-02f }, - { -1.587507622e-02f, +2.798467258e-01f, +7.973332308e-01f, -5.859932207e-02f }, - { -1.585052826e-02f, +2.795387520e-01f, +7.976244755e-01f, -5.861046669e-02f }, - { -1.582599931e-02f, +2.792308874e-01f, +7.979155722e-01f, -5.862155585e-02f }, - { -1.580148939e-02f, +2.789231321e-01f, +7.982065207e-01f, -5.863258948e-02f }, - { -1.577699850e-02f, +2.786154861e-01f, +7.984973209e-01f, -5.864356750e-02f }, - { -1.575252665e-02f, +2.783079496e-01f, +7.987879725e-01f, -5.865448983e-02f }, - { -1.572807386e-02f, +2.780005227e-01f, +7.990784754e-01f, -5.866535639e-02f }, - { -1.570364014e-02f, +2.776932054e-01f, +7.993688295e-01f, -5.867616710e-02f }, - { -1.567922549e-02f, +2.773859980e-01f, +7.996590346e-01f, -5.868692187e-02f }, - { -1.565482993e-02f, +2.770789004e-01f, +7.999490904e-01f, -5.869762062e-02f }, - { -1.563045347e-02f, +2.767719129e-01f, +8.002389969e-01f, -5.870826329e-02f }, - { -1.560609611e-02f, +2.764650354e-01f, +8.005287538e-01f, -5.871884977e-02f }, - { -1.558175787e-02f, +2.761582682e-01f, +8.008183610e-01f, -5.872938000e-02f }, - { -1.555743875e-02f, +2.758516114e-01f, +8.011078183e-01f, -5.873985390e-02f }, - { -1.553313878e-02f, +2.755450649e-01f, +8.013971255e-01f, -5.875027137e-02f }, - { -1.550885795e-02f, +2.752386291e-01f, +8.016862825e-01f, -5.876063235e-02f }, - { -1.548459628e-02f, +2.749323038e-01f, +8.019752891e-01f, -5.877093675e-02f }, - { -1.546035377e-02f, +2.746260894e-01f, +8.022641451e-01f, -5.878118449e-02f }, - { -1.543613045e-02f, +2.743199858e-01f, +8.025528503e-01f, -5.879137549e-02f }, - { -1.541192631e-02f, +2.740139932e-01f, +8.028414047e-01f, -5.880150966e-02f }, - { -1.538774137e-02f, +2.737081117e-01f, +8.031298079e-01f, -5.881158693e-02f }, - { -1.536357563e-02f, +2.734023414e-01f, +8.034180599e-01f, -5.882160722e-02f }, - { -1.533942912e-02f, +2.730966824e-01f, +8.037061604e-01f, -5.883157045e-02f }, - { -1.531530183e-02f, +2.727911348e-01f, +8.039941094e-01f, -5.884147653e-02f }, - { -1.529119377e-02f, +2.724856987e-01f, +8.042819066e-01f, -5.885132538e-02f }, - { -1.526710496e-02f, +2.721803743e-01f, +8.045695518e-01f, -5.886111692e-02f }, - { -1.524303541e-02f, +2.718751616e-01f, +8.048570449e-01f, -5.887085108e-02f }, - { -1.521898512e-02f, +2.715700607e-01f, +8.051443857e-01f, -5.888052777e-02f }, - { -1.519495411e-02f, +2.712650718e-01f, +8.054315741e-01f, -5.889014690e-02f }, - { -1.517094238e-02f, +2.709601949e-01f, +8.057186098e-01f, -5.889970841e-02f }, - { -1.514694995e-02f, +2.706554301e-01f, +8.060054928e-01f, -5.890921220e-02f }, - { -1.512297682e-02f, +2.703507777e-01f, +8.062922227e-01f, -5.891865819e-02f }, - { -1.509902300e-02f, +2.700462376e-01f, +8.065787996e-01f, -5.892804632e-02f }, - { -1.507508850e-02f, +2.697418099e-01f, +8.068652231e-01f, -5.893737648e-02f }, - { -1.505117334e-02f, +2.694374949e-01f, +8.071514932e-01f, -5.894664861e-02f }, - { -1.502727751e-02f, +2.691332925e-01f, +8.074376096e-01f, -5.895586262e-02f }, - { -1.500340104e-02f, +2.688292029e-01f, +8.077235722e-01f, -5.896501843e-02f }, - { -1.497954392e-02f, +2.685252263e-01f, +8.080093808e-01f, -5.897411596e-02f }, - { -1.495570618e-02f, +2.682213626e-01f, +8.082950352e-01f, -5.898315513e-02f }, - { -1.493188780e-02f, +2.679176120e-01f, +8.085805354e-01f, -5.899213585e-02f }, - { -1.490808882e-02f, +2.676139746e-01f, +8.088658810e-01f, -5.900105805e-02f }, - { -1.488430923e-02f, +2.673104506e-01f, +8.091510719e-01f, -5.900992164e-02f }, - { -1.486054904e-02f, +2.670070400e-01f, +8.094361081e-01f, -5.901872654e-02f }, - { -1.483680827e-02f, +2.667037429e-01f, +8.097209892e-01f, -5.902747268e-02f }, - { -1.481308692e-02f, +2.664005594e-01f, +8.100057151e-01f, -5.903615996e-02f }, - { -1.478938500e-02f, +2.660974897e-01f, +8.102902857e-01f, -5.904478831e-02f }, - { -1.476570252e-02f, +2.657945338e-01f, +8.105747008e-01f, -5.905335765e-02f }, - { -1.474203949e-02f, +2.654916918e-01f, +8.108589603e-01f, -5.906186790e-02f }, - { -1.471839591e-02f, +2.651889639e-01f, +8.111430638e-01f, -5.907031897e-02f }, - { -1.469477181e-02f, +2.648863501e-01f, +8.114270114e-01f, -5.907871078e-02f }, - { -1.467116717e-02f, +2.645838506e-01f, +8.117108027e-01f, -5.908704325e-02f }, - { -1.464758202e-02f, +2.642814655e-01f, +8.119944377e-01f, -5.909531630e-02f }, - { -1.462401636e-02f, +2.639791948e-01f, +8.122779162e-01f, -5.910352985e-02f }, - { -1.460047020e-02f, +2.636770386e-01f, +8.125612380e-01f, -5.911168382e-02f }, - { -1.457694355e-02f, +2.633749972e-01f, +8.128444029e-01f, -5.911977812e-02f }, - { -1.455343641e-02f, +2.630730705e-01f, +8.131274108e-01f, -5.912781267e-02f }, - { -1.452994881e-02f, +2.627712587e-01f, +8.134102615e-01f, -5.913578740e-02f }, - { -1.450648073e-02f, +2.624695618e-01f, +8.136929549e-01f, -5.914370221e-02f }, - { -1.448303220e-02f, +2.621679801e-01f, +8.139754907e-01f, -5.915155704e-02f }, - { -1.445960321e-02f, +2.618665135e-01f, +8.142578688e-01f, -5.915935179e-02f }, - { -1.443619379e-02f, +2.615651622e-01f, +8.145400890e-01f, -5.916708638e-02f }, - { -1.441280393e-02f, +2.612639263e-01f, +8.148221512e-01f, -5.917476074e-02f }, - { -1.438943365e-02f, +2.609628058e-01f, +8.151040551e-01f, -5.918237478e-02f }, - { -1.436608295e-02f, +2.606618010e-01f, +8.153858007e-01f, -5.918992842e-02f }, - { -1.434275184e-02f, +2.603609118e-01f, +8.156673878e-01f, -5.919742158e-02f }, - { -1.431944033e-02f, +2.600601385e-01f, +8.159488162e-01f, -5.920485418e-02f }, - { -1.429614843e-02f, +2.597594810e-01f, +8.162300856e-01f, -5.921222613e-02f }, - { -1.427287614e-02f, +2.594589396e-01f, +8.165111960e-01f, -5.921953735e-02f }, - { -1.424962348e-02f, +2.591585142e-01f, +8.167921473e-01f, -5.922678777e-02f }, - { -1.422639045e-02f, +2.588582051e-01f, +8.170729391e-01f, -5.923397729e-02f }, - { -1.420317705e-02f, +2.585580122e-01f, +8.173535714e-01f, -5.924110584e-02f }, - { -1.417998331e-02f, +2.582579358e-01f, +8.176340439e-01f, -5.924817333e-02f }, - { -1.415680921e-02f, +2.579579758e-01f, +8.179143566e-01f, -5.925517969e-02f }, - { -1.413365478e-02f, +2.576581325e-01f, +8.181945092e-01f, -5.926212483e-02f }, - { -1.411052002e-02f, +2.573584058e-01f, +8.184745017e-01f, -5.926900867e-02f }, - { -1.408740493e-02f, +2.570587960e-01f, +8.187543337e-01f, -5.927583113e-02f }, - { -1.406430953e-02f, +2.567593031e-01f, +8.190340052e-01f, -5.928259213e-02f }, - { -1.404123383e-02f, +2.564599271e-01f, +8.193135159e-01f, -5.928929157e-02f }, - { -1.401817782e-02f, +2.561606683e-01f, +8.195928658e-01f, -5.929592939e-02f }, - { -1.399514152e-02f, +2.558615267e-01f, +8.198720547e-01f, -5.930250550e-02f }, - { -1.397212493e-02f, +2.555625024e-01f, +8.201510823e-01f, -5.930901982e-02f }, - { -1.394912807e-02f, +2.552635955e-01f, +8.204299485e-01f, -5.931547226e-02f }, - { -1.392615094e-02f, +2.549648062e-01f, +8.207086532e-01f, -5.932186275e-02f }, - { -1.390319354e-02f, +2.546661344e-01f, +8.209871961e-01f, -5.932819120e-02f }, - { -1.388025589e-02f, +2.543675803e-01f, +8.212655772e-01f, -5.933445753e-02f }, - { -1.385733799e-02f, +2.540691440e-01f, +8.215437962e-01f, -5.934066165e-02f }, - { -1.383443984e-02f, +2.537708257e-01f, +8.218218531e-01f, -5.934680349e-02f }, - { -1.381156147e-02f, +2.534726253e-01f, +8.220997475e-01f, -5.935288297e-02f }, - { -1.378870286e-02f, +2.531745431e-01f, +8.223774794e-01f, -5.935889999e-02f }, - { -1.376586404e-02f, +2.528765790e-01f, +8.226550485e-01f, -5.936485448e-02f }, - { -1.374304500e-02f, +2.525787333e-01f, +8.229324548e-01f, -5.937074636e-02f }, - { -1.372024576e-02f, +2.522810059e-01f, +8.232096981e-01f, -5.937657555e-02f }, - { -1.369746632e-02f, +2.519833971e-01f, +8.234867781e-01f, -5.938234196e-02f }, - { -1.367470668e-02f, +2.516859068e-01f, +8.237636948e-01f, -5.938804550e-02f }, - { -1.365196686e-02f, +2.513885353e-01f, +8.240404479e-01f, -5.939368611e-02f }, - { -1.362924687e-02f, +2.510912825e-01f, +8.243170373e-01f, -5.939926369e-02f }, - { -1.360654670e-02f, +2.507941486e-01f, +8.245934629e-01f, -5.940477816e-02f }, - { -1.358386636e-02f, +2.504971337e-01f, +8.248697244e-01f, -5.941022944e-02f }, - { -1.356120587e-02f, +2.502002379e-01f, +8.251458217e-01f, -5.941561746e-02f }, - { -1.353856523e-02f, +2.499034613e-01f, +8.254217546e-01f, -5.942094212e-02f }, - { -1.351594444e-02f, +2.496068040e-01f, +8.256975230e-01f, -5.942620334e-02f }, - { -1.349334351e-02f, +2.493102660e-01f, +8.259731267e-01f, -5.943140104e-02f }, - { -1.347076245e-02f, +2.490138475e-01f, +8.262485655e-01f, -5.943653515e-02f }, - { -1.344820127e-02f, +2.487175486e-01f, +8.265238393e-01f, -5.944160557e-02f }, - { -1.342565996e-02f, +2.484213694e-01f, +8.267989479e-01f, -5.944661222e-02f }, - { -1.340313855e-02f, +2.481253099e-01f, +8.270738912e-01f, -5.945155503e-02f }, - { -1.338063703e-02f, +2.478293703e-01f, +8.273486689e-01f, -5.945643390e-02f }, - { -1.335815541e-02f, +2.475335507e-01f, +8.276232810e-01f, -5.946124877e-02f }, - { -1.333569370e-02f, +2.472378511e-01f, +8.278977272e-01f, -5.946599953e-02f }, - { -1.331325190e-02f, +2.469422717e-01f, +8.281720074e-01f, -5.947068612e-02f }, - { -1.329083001e-02f, +2.466468125e-01f, +8.284461214e-01f, -5.947530845e-02f }, - { -1.326842806e-02f, +2.463514737e-01f, +8.287200691e-01f, -5.947986644e-02f }, - { -1.324604604e-02f, +2.460562553e-01f, +8.289938502e-01f, -5.948436000e-02f }, - { -1.322368395e-02f, +2.457611574e-01f, +8.292674647e-01f, -5.948878905e-02f }, - { -1.320134181e-02f, +2.454661802e-01f, +8.295409124e-01f, -5.949315351e-02f }, - { -1.317901962e-02f, +2.451713237e-01f, +8.298141930e-01f, -5.949745330e-02f }, - { -1.315671739e-02f, +2.448765881e-01f, +8.300873065e-01f, -5.950168834e-02f }, - { -1.313443511e-02f, +2.445819733e-01f, +8.303602527e-01f, -5.950585853e-02f }, - { -1.311217281e-02f, +2.442874796e-01f, +8.306330313e-01f, -5.950996381e-02f }, - { -1.308993048e-02f, +2.439931070e-01f, +8.309056424e-01f, -5.951400408e-02f }, - { -1.306770813e-02f, +2.436988556e-01f, +8.311780856e-01f, -5.951797926e-02f }, - { -1.304550576e-02f, +2.434047255e-01f, +8.314503608e-01f, -5.952188928e-02f }, - { -1.302332339e-02f, +2.431107168e-01f, +8.317224679e-01f, -5.952573404e-02f }, - { -1.300116101e-02f, +2.428168296e-01f, +8.319944067e-01f, -5.952951347e-02f }, - { -1.297901864e-02f, +2.425230639e-01f, +8.322661770e-01f, -5.953322748e-02f }, - { -1.295689627e-02f, +2.422294200e-01f, +8.325377786e-01f, -5.953687600e-02f }, - { -1.293479392e-02f, +2.419358978e-01f, +8.328092115e-01f, -5.954045893e-02f }, - { -1.291271159e-02f, +2.416424975e-01f, +8.330804754e-01f, -5.954397620e-02f }, - { -1.289064929e-02f, +2.413492191e-01f, +8.333515702e-01f, -5.954742771e-02f }, - { -1.286860701e-02f, +2.410560629e-01f, +8.336224957e-01f, -5.955081340e-02f }, - { -1.284658477e-02f, +2.407630287e-01f, +8.338932518e-01f, -5.955413318e-02f }, - { -1.282458258e-02f, +2.404701168e-01f, +8.341638383e-01f, -5.955738696e-02f }, - { -1.280260043e-02f, +2.401773273e-01f, +8.344342550e-01f, -5.956057466e-02f }, - { -1.278063833e-02f, +2.398846601e-01f, +8.347045017e-01f, -5.956369619e-02f }, - { -1.275869629e-02f, +2.395921155e-01f, +8.349745784e-01f, -5.956675149e-02f }, - { -1.273677432e-02f, +2.392996936e-01f, +8.352444848e-01f, -5.956974045e-02f }, - { -1.271487241e-02f, +2.390073943e-01f, +8.355142207e-01f, -5.957266301e-02f }, - { -1.269299057e-02f, +2.387152178e-01f, +8.357837861e-01f, -5.957551907e-02f }, - { -1.267112882e-02f, +2.384231642e-01f, +8.360531808e-01f, -5.957830856e-02f }, - { -1.264928715e-02f, +2.381312337e-01f, +8.363224045e-01f, -5.958103139e-02f }, - { -1.262746557e-02f, +2.378394262e-01f, +8.365914572e-01f, -5.958368747e-02f }, - { -1.260566408e-02f, +2.375477418e-01f, +8.368603387e-01f, -5.958627674e-02f }, - { -1.258388269e-02f, +2.372561808e-01f, +8.371290487e-01f, -5.958879909e-02f }, - { -1.256212141e-02f, +2.369647431e-01f, +8.373975872e-01f, -5.959125445e-02f }, - { -1.254038023e-02f, +2.366734288e-01f, +8.376659540e-01f, -5.959364274e-02f }, - { -1.251865917e-02f, +2.363822381e-01f, +8.379341490e-01f, -5.959596388e-02f }, - { -1.249695823e-02f, +2.360911710e-01f, +8.382021718e-01f, -5.959821777e-02f }, - { -1.247527741e-02f, +2.358002277e-01f, +8.384700225e-01f, -5.960040434e-02f }, - { -1.245361672e-02f, +2.355094081e-01f, +8.387377009e-01f, -5.960252351e-02f }, - { -1.243197617e-02f, +2.352187125e-01f, +8.390052067e-01f, -5.960457519e-02f }, - { -1.241035575e-02f, +2.349281409e-01f, +8.392725398e-01f, -5.960655929e-02f }, - { -1.238875548e-02f, +2.346376934e-01f, +8.395397001e-01f, -5.960847575e-02f }, - { -1.236717535e-02f, +2.343473700e-01f, +8.398066874e-01f, -5.961032446e-02f }, - { -1.234561537e-02f, +2.340571709e-01f, +8.400735015e-01f, -5.961210535e-02f }, - { -1.232407555e-02f, +2.337670962e-01f, +8.403401423e-01f, -5.961381834e-02f }, - { -1.230255589e-02f, +2.334771460e-01f, +8.406066096e-01f, -5.961546335e-02f }, - { -1.228105640e-02f, +2.331873202e-01f, +8.408729033e-01f, -5.961704028e-02f }, - { -1.225957708e-02f, +2.328976192e-01f, +8.411390231e-01f, -5.961854906e-02f }, - { -1.223811793e-02f, +2.326080428e-01f, +8.414049690e-01f, -5.961998961e-02f }, - { -1.221667896e-02f, +2.323185913e-01f, +8.416707408e-01f, -5.962136183e-02f }, - { -1.219526018e-02f, +2.320292646e-01f, +8.419363383e-01f, -5.962266566e-02f }, - { -1.217386158e-02f, +2.317400630e-01f, +8.422017613e-01f, -5.962390099e-02f }, - { -1.215248317e-02f, +2.314509865e-01f, +8.424670098e-01f, -5.962506776e-02f }, - { -1.213112496e-02f, +2.311620351e-01f, +8.427320835e-01f, -5.962616588e-02f }, - { -1.210978695e-02f, +2.308732090e-01f, +8.429969822e-01f, -5.962719526e-02f }, - { -1.208846914e-02f, +2.305845082e-01f, +8.432617059e-01f, -5.962815583e-02f }, - { -1.206717155e-02f, +2.302959329e-01f, +8.435262543e-01f, -5.962904749e-02f }, - { -1.204589416e-02f, +2.300074831e-01f, +8.437906274e-01f, -5.962987017e-02f }, - { -1.202463700e-02f, +2.297191590e-01f, +8.440548248e-01f, -5.963062378e-02f }, - { -1.200340005e-02f, +2.294309606e-01f, +8.443188466e-01f, -5.963130824e-02f }, - { -1.198218333e-02f, +2.291428879e-01f, +8.445826924e-01f, -5.963192347e-02f }, - { -1.196098683e-02f, +2.288549412e-01f, +8.448463623e-01f, -5.963246938e-02f }, - { -1.193981057e-02f, +2.285671204e-01f, +8.451098559e-01f, -5.963294588e-02f }, - { -1.191865455e-02f, +2.282794257e-01f, +8.453731732e-01f, -5.963335291e-02f }, - { -1.189751876e-02f, +2.279918571e-01f, +8.456363139e-01f, -5.963369036e-02f }, - { -1.187640322e-02f, +2.277044148e-01f, +8.458992780e-01f, -5.963395817e-02f }, - { -1.185530793e-02f, +2.274170988e-01f, +8.461620653e-01f, -5.963415624e-02f }, - { -1.183423289e-02f, +2.271299092e-01f, +8.464246755e-01f, -5.963428449e-02f }, - { -1.181317810e-02f, +2.268428462e-01f, +8.466871086e-01f, -5.963434285e-02f }, - { -1.179214358e-02f, +2.265559097e-01f, +8.469493644e-01f, -5.963433122e-02f }, - { -1.177112931e-02f, +2.262690999e-01f, +8.472114428e-01f, -5.963424952e-02f }, - { -1.175013531e-02f, +2.259824169e-01f, +8.474733435e-01f, -5.963409767e-02f }, - { -1.172916159e-02f, +2.256958607e-01f, +8.477350664e-01f, -5.963387559e-02f }, - { -1.170820813e-02f, +2.254094315e-01f, +8.479966114e-01f, -5.963358319e-02f }, - { -1.168727495e-02f, +2.251231293e-01f, +8.482579783e-01f, -5.963322039e-02f }, - { -1.166636205e-02f, +2.248369542e-01f, +8.485191669e-01f, -5.963278711e-02f }, - { -1.164546944e-02f, +2.245509063e-01f, +8.487801771e-01f, -5.963228326e-02f }, - { -1.162459711e-02f, +2.242649857e-01f, +8.490410088e-01f, -5.963170876e-02f }, - { -1.160374507e-02f, +2.239791925e-01f, +8.493016617e-01f, -5.963106352e-02f }, - { -1.158291333e-02f, +2.236935267e-01f, +8.495621358e-01f, -5.963034747e-02f }, - { -1.156210188e-02f, +2.234079885e-01f, +8.498224307e-01f, -5.962956051e-02f }, - { -1.154131073e-02f, +2.231225780e-01f, +8.500825465e-01f, -5.962870257e-02f }, - { -1.152053989e-02f, +2.228372951e-01f, +8.503424830e-01f, -5.962777357e-02f }, - { -1.149978935e-02f, +2.225521401e-01f, +8.506022399e-01f, -5.962677341e-02f }, - { -1.147905912e-02f, +2.222671129e-01f, +8.508618171e-01f, -5.962570201e-02f }, - { -1.145834920e-02f, +2.219822138e-01f, +8.511212145e-01f, -5.962455930e-02f }, - { -1.143765960e-02f, +2.216974426e-01f, +8.513804320e-01f, -5.962334519e-02f }, - { -1.141699032e-02f, +2.214127997e-01f, +8.516394693e-01f, -5.962205959e-02f }, - { -1.139634135e-02f, +2.211282850e-01f, +8.518983262e-01f, -5.962070242e-02f }, - { -1.137571272e-02f, +2.208438986e-01f, +8.521570028e-01f, -5.961927360e-02f }, - { -1.135510441e-02f, +2.205596406e-01f, +8.524154987e-01f, -5.961777305e-02f }, - { -1.133451643e-02f, +2.202755110e-01f, +8.526738139e-01f, -5.961620067e-02f }, - { -1.131394878e-02f, +2.199915101e-01f, +8.529319481e-01f, -5.961455639e-02f }, - { -1.129340147e-02f, +2.197076378e-01f, +8.531899012e-01f, -5.961284013e-02f }, - { -1.127287449e-02f, +2.194238943e-01f, +8.534476731e-01f, -5.961105179e-02f }, - { -1.125236786e-02f, +2.191402796e-01f, +8.537052637e-01f, -5.960919130e-02f }, - { -1.123188157e-02f, +2.188567938e-01f, +8.539626726e-01f, -5.960725858e-02f }, - { -1.121141563e-02f, +2.185734369e-01f, +8.542198999e-01f, -5.960525353e-02f }, - { -1.119097004e-02f, +2.182902092e-01f, +8.544769453e-01f, -5.960317608e-02f }, - { -1.117054480e-02f, +2.180071107e-01f, +8.547338087e-01f, -5.960102614e-02f }, - { -1.115013991e-02f, +2.177241413e-01f, +8.549904899e-01f, -5.959880364e-02f }, - { -1.112975538e-02f, +2.174413013e-01f, +8.552469888e-01f, -5.959650847e-02f }, - { -1.110939121e-02f, +2.171585908e-01f, +8.555033052e-01f, -5.959414057e-02f }, - { -1.108904740e-02f, +2.168760097e-01f, +8.557594390e-01f, -5.959169984e-02f }, - { -1.106872396e-02f, +2.165935582e-01f, +8.560153900e-01f, -5.958918621e-02f }, - { -1.104842088e-02f, +2.163112364e-01f, +8.562711580e-01f, -5.958659959e-02f }, - { -1.102813817e-02f, +2.160290443e-01f, +8.565267430e-01f, -5.958393990e-02f }, - { -1.100787583e-02f, +2.157469820e-01f, +8.567821446e-01f, -5.958120705e-02f }, - { -1.098763386e-02f, +2.154650497e-01f, +8.570373629e-01f, -5.957840096e-02f }, - { -1.096741227e-02f, +2.151832473e-01f, +8.572923976e-01f, -5.957552154e-02f }, - { -1.094721106e-02f, +2.149015750e-01f, +8.575472486e-01f, -5.957256872e-02f }, - { -1.092703022e-02f, +2.146200329e-01f, +8.578019157e-01f, -5.956954241e-02f }, - { -1.090686977e-02f, +2.143386210e-01f, +8.580563988e-01f, -5.956644252e-02f }, - { -1.088672970e-02f, +2.140573395e-01f, +8.583106977e-01f, -5.956326897e-02f }, - { -1.086661002e-02f, +2.137761883e-01f, +8.585648123e-01f, -5.956002168e-02f }, - { -1.084651073e-02f, +2.134951677e-01f, +8.588187423e-01f, -5.955670057e-02f }, - { -1.082643182e-02f, +2.132142776e-01f, +8.590724878e-01f, -5.955330554e-02f }, - { -1.080637331e-02f, +2.129335181e-01f, +8.593260484e-01f, -5.954983652e-02f }, - { -1.078633519e-02f, +2.126528894e-01f, +8.595794240e-01f, -5.954629343e-02f }, - { -1.076631747e-02f, +2.123723915e-01f, +8.598326146e-01f, -5.954267617e-02f }, - { -1.074632015e-02f, +2.120920245e-01f, +8.600856199e-01f, -5.953898467e-02f }, - { -1.072634322e-02f, +2.118117885e-01f, +8.603384398e-01f, -5.953521884e-02f }, - { -1.070638669e-02f, +2.115316835e-01f, +8.605910741e-01f, -5.953137860e-02f }, - { -1.068645057e-02f, +2.112517097e-01f, +8.608435227e-01f, -5.952746386e-02f }, - { -1.066653486e-02f, +2.109718671e-01f, +8.610957855e-01f, -5.952347454e-02f }, - { -1.064663954e-02f, +2.106921557e-01f, +8.613478622e-01f, -5.951941056e-02f }, - { -1.062676464e-02f, +2.104125758e-01f, +8.615997527e-01f, -5.951527184e-02f }, - { -1.060691015e-02f, +2.101331273e-01f, +8.618514569e-01f, -5.951105828e-02f }, - { -1.058707606e-02f, +2.098538103e-01f, +8.621029746e-01f, -5.950676981e-02f }, - { -1.056726239e-02f, +2.095746250e-01f, +8.623543057e-01f, -5.950240634e-02f }, - { -1.054746914e-02f, +2.092955714e-01f, +8.626054500e-01f, -5.949796779e-02f }, - { -1.052769630e-02f, +2.090166495e-01f, +8.628564073e-01f, -5.949345407e-02f }, - { -1.050794387e-02f, +2.087378595e-01f, +8.631071776e-01f, -5.948886510e-02f }, - { -1.048821187e-02f, +2.084592015e-01f, +8.633577606e-01f, -5.948420080e-02f }, - { -1.046850028e-02f, +2.081806754e-01f, +8.636081562e-01f, -5.947946108e-02f }, - { -1.044880911e-02f, +2.079022815e-01f, +8.638583642e-01f, -5.947464586e-02f }, - { -1.042913837e-02f, +2.076240197e-01f, +8.641083845e-01f, -5.946975506e-02f }, - { -1.040948805e-02f, +2.073458902e-01f, +8.643582170e-01f, -5.946478859e-02f }, - { -1.038985815e-02f, +2.070678930e-01f, +8.646078615e-01f, -5.945974637e-02f }, - { -1.037024868e-02f, +2.067900282e-01f, +8.648573178e-01f, -5.945462831e-02f }, - { -1.035065964e-02f, +2.065122959e-01f, +8.651065858e-01f, -5.944943433e-02f }, - { -1.033109103e-02f, +2.062346962e-01f, +8.653556654e-01f, -5.944416434e-02f }, - { -1.031154284e-02f, +2.059572292e-01f, +8.656045563e-01f, -5.943881827e-02f }, - { -1.029201508e-02f, +2.056798948e-01f, +8.658532585e-01f, -5.943339603e-02f }, - { -1.027250776e-02f, +2.054026933e-01f, +8.661017718e-01f, -5.942789753e-02f }, - { -1.025302087e-02f, +2.051256246e-01f, +8.663500959e-01f, -5.942232269e-02f }, - { -1.023355441e-02f, +2.048486889e-01f, +8.665982309e-01f, -5.941667144e-02f }, - { -1.021410838e-02f, +2.045718862e-01f, +8.668461765e-01f, -5.941094367e-02f }, - { -1.019468279e-02f, +2.042952167e-01f, +8.670939326e-01f, -5.940513931e-02f }, - { -1.017527764e-02f, +2.040186803e-01f, +8.673414990e-01f, -5.939925828e-02f }, - { -1.015589292e-02f, +2.037422772e-01f, +8.675888756e-01f, -5.939330049e-02f }, - { -1.013652864e-02f, +2.034660075e-01f, +8.678360622e-01f, -5.938726586e-02f }, - { -1.011718480e-02f, +2.031898712e-01f, +8.680830587e-01f, -5.938115430e-02f }, - { -1.009786140e-02f, +2.029138683e-01f, +8.683298650e-01f, -5.937496574e-02f }, - { -1.007855843e-02f, +2.026379991e-01f, +8.685764808e-01f, -5.936870008e-02f }, - { -1.005927591e-02f, +2.023622635e-01f, +8.688229060e-01f, -5.936235724e-02f }, - { -1.004001383e-02f, +2.020866616e-01f, +8.690691405e-01f, -5.935593714e-02f }, - { -1.002077218e-02f, +2.018111936e-01f, +8.693151841e-01f, -5.934943969e-02f }, - { -1.000155098e-02f, +2.015358594e-01f, +8.695610368e-01f, -5.934286482e-02f }, - { -9.982350225e-03f, +2.012606592e-01f, +8.698066982e-01f, -5.933621243e-02f }, - { -9.963169910e-03f, +2.009855930e-01f, +8.700521683e-01f, -5.932948245e-02f }, - { -9.944010038e-03f, +2.007106609e-01f, +8.702974470e-01f, -5.932267479e-02f }, - { -9.924870610e-03f, +2.004358631e-01f, +8.705425340e-01f, -5.931578936e-02f }, - { -9.905751626e-03f, +2.001611994e-01f, +8.707874293e-01f, -5.930882608e-02f }, - { -9.886653086e-03f, +1.998866701e-01f, +8.710321326e-01f, -5.930178487e-02f }, - { -9.867574990e-03f, +1.996122753e-01f, +8.712766439e-01f, -5.929466565e-02f }, - { -9.848517340e-03f, +1.993380149e-01f, +8.715209630e-01f, -5.928746832e-02f }, - { -9.829480135e-03f, +1.990638891e-01f, +8.717650897e-01f, -5.928019281e-02f }, - { -9.810463375e-03f, +1.987898979e-01f, +8.720090239e-01f, -5.927283903e-02f }, - { -9.791467061e-03f, +1.985160414e-01f, +8.722527654e-01f, -5.926540690e-02f }, - { -9.772491192e-03f, +1.982423197e-01f, +8.724963141e-01f, -5.925789634e-02f }, - { -9.753535770e-03f, +1.979687329e-01f, +8.727396699e-01f, -5.925030726e-02f }, - { -9.734600793e-03f, +1.976952810e-01f, +8.729828325e-01f, -5.924263957e-02f }, - { -9.715686262e-03f, +1.974219642e-01f, +8.732258019e-01f, -5.923489319e-02f }, - { -9.696792177e-03f, +1.971487824e-01f, +8.734685779e-01f, -5.922706804e-02f }, - { -9.677918538e-03f, +1.968757357e-01f, +8.737111603e-01f, -5.921916404e-02f }, - { -9.659065344e-03f, +1.966028244e-01f, +8.739535491e-01f, -5.921118110e-02f }, - { -9.640232597e-03f, +1.963300483e-01f, +8.741957439e-01f, -5.920311914e-02f }, - { -9.621420295e-03f, +1.960574076e-01f, +8.744377448e-01f, -5.919497807e-02f }, - { -9.602628439e-03f, +1.957849023e-01f, +8.746795516e-01f, -5.918675781e-02f }, - { -9.583857028e-03f, +1.955125326e-01f, +8.749211640e-01f, -5.917845827e-02f }, - { -9.565106062e-03f, +1.952402985e-01f, +8.751625821e-01f, -5.917007938e-02f }, - { -9.546375540e-03f, +1.949682000e-01f, +8.754038055e-01f, -5.916162104e-02f }, - { -9.527665464e-03f, +1.946962373e-01f, +8.756448342e-01f, -5.915308317e-02f }, - { -9.508975831e-03f, +1.944244105e-01f, +8.758856680e-01f, -5.914446570e-02f }, - { -9.490306643e-03f, +1.941527195e-01f, +8.761263068e-01f, -5.913576853e-02f }, - { -9.471657898e-03f, +1.938811645e-01f, +8.763667504e-01f, -5.912699159e-02f }, - { -9.453029596e-03f, +1.936097455e-01f, +8.766069987e-01f, -5.911813478e-02f }, - { -9.434421737e-03f, +1.933384626e-01f, +8.768470516e-01f, -5.910919802e-02f }, - { -9.415834320e-03f, +1.930673159e-01f, +8.770869088e-01f, -5.910018124e-02f }, - { -9.397267344e-03f, +1.927963055e-01f, +8.773265703e-01f, -5.909108434e-02f }, - { -9.378720810e-03f, +1.925254314e-01f, +8.775660358e-01f, -5.908190725e-02f }, - { -9.360194716e-03f, +1.922546937e-01f, +8.778053053e-01f, -5.907264987e-02f }, - { -9.341689062e-03f, +1.919840925e-01f, +8.780443786e-01f, -5.906331213e-02f }, - { -9.323203848e-03f, +1.917136278e-01f, +8.782832556e-01f, -5.905389393e-02f }, - { -9.304739072e-03f, +1.914432997e-01f, +8.785219361e-01f, -5.904439521e-02f }, - { -9.286294734e-03f, +1.911731083e-01f, +8.787604199e-01f, -5.903481587e-02f }, - { -9.267870833e-03f, +1.909030537e-01f, +8.789987070e-01f, -5.902515582e-02f }, - { -9.249467369e-03f, +1.906331359e-01f, +8.792367971e-01f, -5.901541499e-02f }, - { -9.231084340e-03f, +1.903633550e-01f, +8.794746902e-01f, -5.900559330e-02f }, - { -9.212721746e-03f, +1.900937110e-01f, +8.797123860e-01f, -5.899569065e-02f }, - { -9.194379586e-03f, +1.898242041e-01f, +8.799498845e-01f, -5.898570696e-02f }, - { -9.176057859e-03f, +1.895548343e-01f, +8.801871854e-01f, -5.897564215e-02f }, - { -9.157756564e-03f, +1.892856017e-01f, +8.804242888e-01f, -5.896549614e-02f }, - { -9.139475700e-03f, +1.890165064e-01f, +8.806611943e-01f, -5.895526884e-02f }, - { -9.121215266e-03f, +1.887475484e-01f, +8.808979018e-01f, -5.894496016e-02f }, - { -9.102975262e-03f, +1.884787277e-01f, +8.811344113e-01f, -5.893457003e-02f }, - { -9.084755685e-03f, +1.882100446e-01f, +8.813707226e-01f, -5.892409837e-02f }, - { -9.066556536e-03f, +1.879414989e-01f, +8.816068354e-01f, -5.891354507e-02f }, - { -9.048377812e-03f, +1.876730909e-01f, +8.818427498e-01f, -5.890291007e-02f }, - { -9.030219514e-03f, +1.874048205e-01f, +8.820784655e-01f, -5.889219328e-02f }, - { -9.012081638e-03f, +1.871366879e-01f, +8.823139824e-01f, -5.888139461e-02f }, - { -8.993964185e-03f, +1.868686931e-01f, +8.825493003e-01f, -5.887051398e-02f }, - { -8.975867154e-03f, +1.866008361e-01f, +8.827844191e-01f, -5.885955131e-02f }, - { -8.957790542e-03f, +1.863331172e-01f, +8.830193387e-01f, -5.884850651e-02f }, - { -8.939734348e-03f, +1.860655362e-01f, +8.832540589e-01f, -5.883737950e-02f }, - { -8.921698572e-03f, +1.857980933e-01f, +8.834885795e-01f, -5.882617019e-02f }, - { -8.903683211e-03f, +1.855307886e-01f, +8.837229005e-01f, -5.881487851e-02f }, - { -8.885688265e-03f, +1.852636221e-01f, +8.839570217e-01f, -5.880350436e-02f }, - { -8.867713732e-03f, +1.849965939e-01f, +8.841909429e-01f, -5.879204767e-02f }, - { -8.849759611e-03f, +1.847297040e-01f, +8.844246640e-01f, -5.878050834e-02f }, - { -8.831825899e-03f, +1.844629526e-01f, +8.846581849e-01f, -5.876888630e-02f }, - { -8.813912596e-03f, +1.841963397e-01f, +8.848915054e-01f, -5.875718146e-02f }, - { -8.796019700e-03f, +1.839298653e-01f, +8.851246253e-01f, -5.874539374e-02f }, - { -8.778147210e-03f, +1.836635296e-01f, +8.853575446e-01f, -5.873352306e-02f }, - { -8.760295123e-03f, +1.833973325e-01f, +8.855902631e-01f, -5.872156932e-02f }, - { -8.742463438e-03f, +1.831312743e-01f, +8.858227806e-01f, -5.870953245e-02f }, - { -8.724652154e-03f, +1.828653548e-01f, +8.860550970e-01f, -5.869741236e-02f }, - { -8.706861268e-03f, +1.825995743e-01f, +8.862872121e-01f, -5.868520898e-02f }, - { -8.689090780e-03f, +1.823339328e-01f, +8.865191259e-01f, -5.867292220e-02f }, - { -8.671340686e-03f, +1.820684302e-01f, +8.867508381e-01f, -5.866055196e-02f }, - { -8.653610986e-03f, +1.818030668e-01f, +8.869823487e-01f, -5.864809816e-02f }, - { -8.635901678e-03f, +1.815378426e-01f, +8.872136574e-01f, -5.863556073e-02f }, - { -8.618212759e-03f, +1.812727576e-01f, +8.874447642e-01f, -5.862293958e-02f }, - { -8.600544229e-03f, +1.810078118e-01f, +8.876756689e-01f, -5.861023462e-02f }, - { -8.582896084e-03f, +1.807430055e-01f, +8.879063714e-01f, -5.859744577e-02f }, - { -8.565268323e-03f, +1.804783386e-01f, +8.881368715e-01f, -5.858457295e-02f }, - { -8.547660944e-03f, +1.802138112e-01f, +8.883671691e-01f, -5.857161608e-02f }, - { -8.530073945e-03f, +1.799494234e-01f, +8.885972640e-01f, -5.855857506e-02f }, - { -8.512507324e-03f, +1.796851751e-01f, +8.888271561e-01f, -5.854544983e-02f }, - { -8.494961078e-03f, +1.794210666e-01f, +8.890568452e-01f, -5.853224028e-02f }, - { -8.477435207e-03f, +1.791570979e-01f, +8.892863313e-01f, -5.851894634e-02f }, - { -8.459929707e-03f, +1.788932690e-01f, +8.895156142e-01f, -5.850556793e-02f }, - { -8.442444576e-03f, +1.786295800e-01f, +8.897446936e-01f, -5.849210496e-02f }, - { -8.424979813e-03f, +1.783660309e-01f, +8.899735696e-01f, -5.847855735e-02f }, - { -8.407535414e-03f, +1.781026219e-01f, +8.902022419e-01f, -5.846492501e-02f }, - { -8.390111379e-03f, +1.778393529e-01f, +8.904307105e-01f, -5.845120786e-02f }, - { -8.372707704e-03f, +1.775762242e-01f, +8.906589751e-01f, -5.843740582e-02f }, - { -8.355324387e-03f, +1.773132356e-01f, +8.908870357e-01f, -5.842351880e-02f }, - { -8.337961425e-03f, +1.770503873e-01f, +8.911148920e-01f, -5.840954672e-02f }, - { -8.320618817e-03f, +1.767876794e-01f, +8.913425440e-01f, -5.839548949e-02f }, - { -8.303296561e-03f, +1.765251119e-01f, +8.915699915e-01f, -5.838134704e-02f }, - { -8.285994652e-03f, +1.762626848e-01f, +8.917972344e-01f, -5.836711927e-02f }, - { -8.268713090e-03f, +1.760003983e-01f, +8.920242725e-01f, -5.835280610e-02f }, - { -8.251451871e-03f, +1.757382524e-01f, +8.922511057e-01f, -5.833840746e-02f }, - { -8.234210994e-03f, +1.754762472e-01f, +8.924777339e-01f, -5.832392325e-02f }, - { -8.216990455e-03f, +1.752143827e-01f, +8.927041569e-01f, -5.830935339e-02f }, - { -8.199790252e-03f, +1.749526590e-01f, +8.929303746e-01f, -5.829469780e-02f }, - { -8.182610382e-03f, +1.746910762e-01f, +8.931563868e-01f, -5.827995640e-02f }, - { -8.165450843e-03f, +1.744296343e-01f, +8.933821934e-01f, -5.826512910e-02f }, - { -8.148311631e-03f, +1.741683333e-01f, +8.936077942e-01f, -5.825021582e-02f }, - { -8.131192745e-03f, +1.739071734e-01f, +8.938331892e-01f, -5.823521647e-02f }, - { -8.114094182e-03f, +1.736461547e-01f, +8.940583782e-01f, -5.822013097e-02f }, - { -8.097015938e-03f, +1.733852771e-01f, +8.942833610e-01f, -5.820495924e-02f }, - { -8.079958012e-03f, +1.731245407e-01f, +8.945081375e-01f, -5.818970119e-02f }, - { -8.062920399e-03f, +1.728639457e-01f, +8.947327076e-01f, -5.817435673e-02f }, - { -8.045903098e-03f, +1.726034920e-01f, +8.949570711e-01f, -5.815892580e-02f }, - { -8.028906105e-03f, +1.723431797e-01f, +8.951812279e-01f, -5.814340830e-02f }, - { -8.011929418e-03f, +1.720830089e-01f, +8.954051779e-01f, -5.812780414e-02f }, - { -7.994973033e-03f, +1.718229797e-01f, +8.956289209e-01f, -5.811211325e-02f }, - { -7.978036948e-03f, +1.715630920e-01f, +8.958524568e-01f, -5.809633554e-02f }, - { -7.961121159e-03f, +1.713033461e-01f, +8.960757854e-01f, -5.808047093e-02f }, - { -7.944225664e-03f, +1.710437419e-01f, +8.962989066e-01f, -5.806451933e-02f }, - { -7.927350459e-03f, +1.707842794e-01f, +8.965218203e-01f, -5.804848066e-02f }, - { -7.910495542e-03f, +1.705249588e-01f, +8.967445263e-01f, -5.803235484e-02f }, - { -7.893660909e-03f, +1.702657802e-01f, +8.969670245e-01f, -5.801614178e-02f }, - { -7.876846558e-03f, +1.700067435e-01f, +8.971893148e-01f, -5.799984140e-02f }, - { -7.860052484e-03f, +1.697478489e-01f, +8.974113969e-01f, -5.798345361e-02f }, - { -7.843278685e-03f, +1.694890963e-01f, +8.976332709e-01f, -5.796697834e-02f }, - { -7.826525157e-03f, +1.692304860e-01f, +8.978549365e-01f, -5.795041550e-02f }, - { -7.809791898e-03f, +1.689720178e-01f, +8.980763937e-01f, -5.793376500e-02f }, - { -7.793078904e-03f, +1.687136919e-01f, +8.982976422e-01f, -5.791702676e-02f }, - { -7.776386171e-03f, +1.684555084e-01f, +8.985186819e-01f, -5.790020070e-02f }, - { -7.759713697e-03f, +1.681974672e-01f, +8.987395128e-01f, -5.788328673e-02f }, - { -7.743061477e-03f, +1.679395686e-01f, +8.989601346e-01f, -5.786628478e-02f }, - { -7.726429509e-03f, +1.676818124e-01f, +8.991805472e-01f, -5.784919475e-02f }, - { -7.709817790e-03f, +1.674241988e-01f, +8.994007506e-01f, -5.783201657e-02f }, - { -7.693226314e-03f, +1.671667279e-01f, +8.996207445e-01f, -5.781475014e-02f }, - { -7.676655080e-03f, +1.669093997e-01f, +8.998405288e-01f, -5.779739540e-02f }, - { -7.660104084e-03f, +1.666522142e-01f, +9.000601034e-01f, -5.777995224e-02f }, - { -7.643573321e-03f, +1.663951716e-01f, +9.002794682e-01f, -5.776242060e-02f }, - { -7.627062789e-03f, +1.661382718e-01f, +9.004986230e-01f, -5.774480038e-02f }, - { -7.610572484e-03f, +1.658815150e-01f, +9.007175676e-01f, -5.772709151e-02f }, - { -7.594102403e-03f, +1.656249011e-01f, +9.009363021e-01f, -5.770929389e-02f }, - { -7.577652540e-03f, +1.653684303e-01f, +9.011548261e-01f, -5.769140745e-02f }, - { -7.561222894e-03f, +1.651121027e-01f, +9.013731396e-01f, -5.767343210e-02f }, - { -7.544813460e-03f, +1.648559182e-01f, +9.015912425e-01f, -5.765536777e-02f }, - { -7.528424234e-03f, +1.645998769e-01f, +9.018091345e-01f, -5.763721435e-02f }, - { -7.512055213e-03f, +1.643439789e-01f, +9.020268157e-01f, -5.761897178e-02f }, - { -7.495706392e-03f, +1.640882243e-01f, +9.022442858e-01f, -5.760063997e-02f }, - { -7.479377769e-03f, +1.638326131e-01f, +9.024615447e-01f, -5.758221883e-02f }, - { -7.463069339e-03f, +1.635771453e-01f, +9.026785922e-01f, -5.756370829e-02f }, - { -7.446781098e-03f, +1.633218211e-01f, +9.028954283e-01f, -5.754510825e-02f }, - { -7.430513042e-03f, +1.630666404e-01f, +9.031120528e-01f, -5.752641864e-02f }, - { -7.414265167e-03f, +1.628116034e-01f, +9.033284656e-01f, -5.750763937e-02f }, - { -7.398037471e-03f, +1.625567100e-01f, +9.035446666e-01f, -5.748877036e-02f }, - { -7.381829947e-03f, +1.623019604e-01f, +9.037606555e-01f, -5.746981153e-02f }, - { -7.365642593e-03f, +1.620473546e-01f, +9.039764323e-01f, -5.745076279e-02f }, - { -7.349475404e-03f, +1.617928927e-01f, +9.041919969e-01f, -5.743162405e-02f }, - { -7.333328376e-03f, +1.615385747e-01f, +9.044073490e-01f, -5.741239524e-02f }, - { -7.317201506e-03f, +1.612844007e-01f, +9.046224887e-01f, -5.739307627e-02f }, - { -7.301094788e-03f, +1.610303707e-01f, +9.048374156e-01f, -5.737366706e-02f }, - { -7.285008220e-03f, +1.607764848e-01f, +9.050521298e-01f, -5.735416753e-02f }, - { -7.268941796e-03f, +1.605227430e-01f, +9.052666311e-01f, -5.733457759e-02f }, - { -7.252895512e-03f, +1.602691455e-01f, +9.054809193e-01f, -5.731489716e-02f }, - { -7.236869364e-03f, +1.600156922e-01f, +9.056949943e-01f, -5.729512615e-02f }, - { -7.220863348e-03f, +1.597623832e-01f, +9.059088560e-01f, -5.727526448e-02f }, - { -7.204877460e-03f, +1.595092186e-01f, +9.061225043e-01f, -5.725531208e-02f }, - { -7.188911695e-03f, +1.592561984e-01f, +9.063359389e-01f, -5.723526885e-02f }, - { -7.172966049e-03f, +1.590033227e-01f, +9.065491599e-01f, -5.721513471e-02f }, - { -7.157040517e-03f, +1.587505915e-01f, +9.067621670e-01f, -5.719490958e-02f }, - { -7.141135096e-03f, +1.584980049e-01f, +9.069749601e-01f, -5.717459338e-02f }, - { -7.125249780e-03f, +1.582455630e-01f, +9.071875391e-01f, -5.715418602e-02f }, - { -7.109384565e-03f, +1.579932657e-01f, +9.073999039e-01f, -5.713368743e-02f }, - { -7.093539446e-03f, +1.577411133e-01f, +9.076120543e-01f, -5.711309750e-02f }, - { -7.077714420e-03f, +1.574891056e-01f, +9.078239902e-01f, -5.709241618e-02f }, - { -7.061909482e-03f, +1.572372428e-01f, +9.080357115e-01f, -5.707164336e-02f }, - { -7.046124626e-03f, +1.569855249e-01f, +9.082472180e-01f, -5.705077897e-02f }, - { -7.030359849e-03f, +1.567339520e-01f, +9.084585096e-01f, -5.702982292e-02f }, - { -7.014615145e-03f, +1.564825241e-01f, +9.086695861e-01f, -5.700877514e-02f }, - { -6.998890510e-03f, +1.562312413e-01f, +9.088804476e-01f, -5.698763554e-02f }, - { -6.983185940e-03f, +1.559801037e-01f, +9.090910937e-01f, -5.696640402e-02f }, - { -6.967501430e-03f, +1.557291112e-01f, +9.093015244e-01f, -5.694508053e-02f }, - { -6.951836974e-03f, +1.554782640e-01f, +9.095117396e-01f, -5.692366496e-02f }, - { -6.936192569e-03f, +1.552275620e-01f, +9.097217391e-01f, -5.690215723e-02f }, - { -6.920568209e-03f, +1.549770055e-01f, +9.099315228e-01f, -5.688055727e-02f }, - { -6.904963889e-03f, +1.547265943e-01f, +9.101410905e-01f, -5.685886499e-02f }, - { -6.889379605e-03f, +1.544763286e-01f, +9.103504422e-01f, -5.683708031e-02f }, - { -6.873815352e-03f, +1.542262084e-01f, +9.105595777e-01f, -5.681520314e-02f }, - { -6.858271125e-03f, +1.539762337e-01f, +9.107684969e-01f, -5.679323340e-02f }, - { -6.842746919e-03f, +1.537264047e-01f, +9.109771996e-01f, -5.677117101e-02f }, - { -6.827242728e-03f, +1.534767213e-01f, +9.111856858e-01f, -5.674901589e-02f }, - { -6.811758549e-03f, +1.532271837e-01f, +9.113939552e-01f, -5.672676795e-02f }, - { -6.796294376e-03f, +1.529777918e-01f, +9.116020078e-01f, -5.670442710e-02f }, - { -6.780850204e-03f, +1.527285458e-01f, +9.118098434e-01f, -5.668199328e-02f }, - { -6.765426027e-03f, +1.524794457e-01f, +9.120174619e-01f, -5.665946638e-02f }, - { -6.750021842e-03f, +1.522304914e-01f, +9.122248632e-01f, -5.663684634e-02f }, - { -6.734637642e-03f, +1.519816832e-01f, +9.124320471e-01f, -5.661413307e-02f }, - { -6.719273423e-03f, +1.517330210e-01f, +9.126390136e-01f, -5.659132648e-02f }, - { -6.703929179e-03f, +1.514845048e-01f, +9.128457625e-01f, -5.656842649e-02f }, - { -6.688604905e-03f, +1.512361348e-01f, +9.130522936e-01f, -5.654543302e-02f }, - { -6.673300597e-03f, +1.509879110e-01f, +9.132586068e-01f, -5.652234599e-02f }, - { -6.658016248e-03f, +1.507398335e-01f, +9.134647021e-01f, -5.649916531e-02f }, - { -6.642751853e-03f, +1.504919022e-01f, +9.136705792e-01f, -5.647589090e-02f }, - { -6.627507408e-03f, +1.502441173e-01f, +9.138762381e-01f, -5.645252268e-02f }, - { -6.612282907e-03f, +1.499964787e-01f, +9.140816786e-01f, -5.642906057e-02f }, - { -6.597078344e-03f, +1.497489866e-01f, +9.142869006e-01f, -5.640550448e-02f }, - { -6.581893714e-03f, +1.495016410e-01f, +9.144919040e-01f, -5.638185433e-02f }, - { -6.566729012e-03f, +1.492544420e-01f, +9.146966886e-01f, -5.635811004e-02f }, - { -6.551584232e-03f, +1.490073895e-01f, +9.149012543e-01f, -5.633427152e-02f }, - { -6.536459369e-03f, +1.487604837e-01f, +9.151056011e-01f, -5.631033869e-02f }, - { -6.521354417e-03f, +1.485137245e-01f, +9.153097287e-01f, -5.628631147e-02f }, - { -6.506269371e-03f, +1.482671122e-01f, +9.155136370e-01f, -5.626218978e-02f }, - { -6.491204225e-03f, +1.480206466e-01f, +9.157173259e-01f, -5.623797353e-02f }, - { -6.476158974e-03f, +1.477743278e-01f, +9.159207954e-01f, -5.621366265e-02f }, - { -6.461133612e-03f, +1.475281560e-01f, +9.161240451e-01f, -5.618925704e-02f }, - { -6.446128134e-03f, +1.472821311e-01f, +9.163270752e-01f, -5.616475663e-02f }, - { -6.431142534e-03f, +1.470362531e-01f, +9.165298853e-01f, -5.614016133e-02f }, - { -6.416176806e-03f, +1.467905223e-01f, +9.167324754e-01f, -5.611547107e-02f }, - { -6.401230944e-03f, +1.465449385e-01f, +9.169348454e-01f, -5.609068575e-02f }, - { -6.386304943e-03f, +1.462995018e-01f, +9.171369950e-01f, -5.606580530e-02f }, - { -6.371398797e-03f, +1.460542124e-01f, +9.173389243e-01f, -5.604082963e-02f }, - { -6.356512501e-03f, +1.458090702e-01f, +9.175406331e-01f, -5.601575866e-02f }, - { -6.341646048e-03f, +1.455640752e-01f, +9.177421213e-01f, -5.599059231e-02f }, - { -6.326799433e-03f, +1.453192276e-01f, +9.179433886e-01f, -5.596533050e-02f }, - { -6.311972650e-03f, +1.450745274e-01f, +9.181444351e-01f, -5.593997314e-02f }, - { -6.297165693e-03f, +1.448299746e-01f, +9.183452606e-01f, -5.591452015e-02f }, - { -6.282378556e-03f, +1.445855693e-01f, +9.185458649e-01f, -5.588897145e-02f }, - { -6.267611233e-03f, +1.443413115e-01f, +9.187462479e-01f, -5.586332696e-02f }, - { -6.252863718e-03f, +1.440972013e-01f, +9.189464096e-01f, -5.583758659e-02f }, - { -6.238136006e-03f, +1.438532387e-01f, +9.191463497e-01f, -5.581175026e-02f }, - { -6.223428090e-03f, +1.436094238e-01f, +9.193460682e-01f, -5.578581789e-02f }, - { -6.208739964e-03f, +1.433657566e-01f, +9.195455649e-01f, -5.575978940e-02f }, - { -6.194071622e-03f, +1.431222371e-01f, +9.197448398e-01f, -5.573366470e-02f }, - { -6.179423059e-03f, +1.428788655e-01f, +9.199438926e-01f, -5.570744371e-02f }, - { -6.164794268e-03f, +1.426356417e-01f, +9.201427233e-01f, -5.568112636e-02f }, - { -6.150185242e-03f, +1.423925658e-01f, +9.203413317e-01f, -5.565471255e-02f }, - { -6.135595977e-03f, +1.421496379e-01f, +9.205397178e-01f, -5.562820221e-02f }, - { -6.121026465e-03f, +1.419068580e-01f, +9.207378813e-01f, -5.560159525e-02f }, - { -6.106476701e-03f, +1.416642261e-01f, +9.209358223e-01f, -5.557489159e-02f }, - { -6.091946678e-03f, +1.414217423e-01f, +9.211335405e-01f, -5.554809115e-02f }, - { -6.077436389e-03f, +1.411794066e-01f, +9.213310358e-01f, -5.552119385e-02f }, - { -6.062945830e-03f, +1.409372192e-01f, +9.215283081e-01f, -5.549419960e-02f }, - { -6.048474993e-03f, +1.406951799e-01f, +9.217253573e-01f, -5.546710832e-02f }, - { -6.034023872e-03f, +1.404532889e-01f, +9.219221832e-01f, -5.543991994e-02f }, - { -6.019592461e-03f, +1.402115463e-01f, +9.221187858e-01f, -5.541263436e-02f }, - { -6.005180754e-03f, +1.399699520e-01f, +9.223151649e-01f, -5.538525151e-02f }, - { -5.990788743e-03f, +1.397285061e-01f, +9.225113204e-01f, -5.535777130e-02f }, - { -5.976416423e-03f, +1.394872087e-01f, +9.227072522e-01f, -5.533019365e-02f }, - { -5.962063788e-03f, +1.392460598e-01f, +9.229029601e-01f, -5.530251848e-02f }, - { -5.947730830e-03f, +1.390050594e-01f, +9.230984441e-01f, -5.527474572e-02f }, - { -5.933417543e-03f, +1.387642076e-01f, +9.232937039e-01f, -5.524687526e-02f }, - { -5.919123921e-03f, +1.385235045e-01f, +9.234887396e-01f, -5.521890704e-02f }, - { -5.904849957e-03f, +1.382829500e-01f, +9.236835509e-01f, -5.519084097e-02f }, - { -5.890595645e-03f, +1.380425443e-01f, +9.238781378e-01f, -5.516267698e-02f }, - { -5.876360977e-03f, +1.378022873e-01f, +9.240725001e-01f, -5.513441497e-02f }, - { -5.862145949e-03f, +1.375621792e-01f, +9.242666377e-01f, -5.510605486e-02f }, - { -5.847950552e-03f, +1.373222199e-01f, +9.244605504e-01f, -5.507759658e-02f }, - { -5.833774780e-03f, +1.370824095e-01f, +9.246542383e-01f, -5.504904005e-02f }, - { -5.819618626e-03f, +1.368427480e-01f, +9.248477010e-01f, -5.502038517e-02f }, - { -5.805482085e-03f, +1.366032356e-01f, +9.250409386e-01f, -5.499163187e-02f }, - { -5.791365148e-03f, +1.363638722e-01f, +9.252339509e-01f, -5.496278007e-02f }, - { -5.777267810e-03f, +1.361246578e-01f, +9.254267378e-01f, -5.493382968e-02f }, - { -5.763190063e-03f, +1.358855926e-01f, +9.256192991e-01f, -5.490478063e-02f }, - { -5.749131901e-03f, +1.356466765e-01f, +9.258116348e-01f, -5.487563282e-02f }, - { -5.735093317e-03f, +1.354079097e-01f, +9.260037447e-01f, -5.484638619e-02f }, - { -5.721074303e-03f, +1.351692920e-01f, +9.261956287e-01f, -5.481704064e-02f }, - { -5.707074854e-03f, +1.349308237e-01f, +9.263872867e-01f, -5.478759611e-02f }, - { -5.693094963e-03f, +1.346925048e-01f, +9.265787186e-01f, -5.475805249e-02f }, - { -5.679134621e-03f, +1.344543351e-01f, +9.267699242e-01f, -5.472840972e-02f }, - { -5.665193823e-03f, +1.342163150e-01f, +9.269609034e-01f, -5.469866771e-02f }, - { -5.651272561e-03f, +1.339784442e-01f, +9.271516562e-01f, -5.466882638e-02f }, - { -5.637370829e-03f, +1.337407230e-01f, +9.273421823e-01f, -5.463888565e-02f }, - { -5.623488619e-03f, +1.335031514e-01f, +9.275324817e-01f, -5.460884543e-02f }, - { -5.609625925e-03f, +1.332657293e-01f, +9.277225543e-01f, -5.457870565e-02f }, - { -5.595782739e-03f, +1.330284568e-01f, +9.279123998e-01f, -5.454846622e-02f }, - { -5.581959054e-03f, +1.327913341e-01f, +9.281020184e-01f, -5.451812706e-02f }, - { -5.568154863e-03f, +1.325543610e-01f, +9.282914097e-01f, -5.448768810e-02f }, - { -5.554370159e-03f, +1.323175377e-01f, +9.284805736e-01f, -5.445714924e-02f }, - { -5.540604935e-03f, +1.320808642e-01f, +9.286695102e-01f, -5.442651041e-02f }, - { -5.526859184e-03f, +1.318443405e-01f, +9.288582192e-01f, -5.439577153e-02f }, - { -5.513132898e-03f, +1.316079667e-01f, +9.290467005e-01f, -5.436493251e-02f }, - { -5.499426070e-03f, +1.313717428e-01f, +9.292349540e-01f, -5.433399327e-02f }, - { -5.485738694e-03f, +1.311356689e-01f, +9.294229797e-01f, -5.430295374e-02f }, - { -5.472070761e-03f, +1.308997450e-01f, +9.296107773e-01f, -5.427181382e-02f }, - { -5.458422264e-03f, +1.306639711e-01f, +9.297983467e-01f, -5.424057345e-02f }, - { -5.444793197e-03f, +1.304283474e-01f, +9.299856879e-01f, -5.420923253e-02f }, - { -5.431183551e-03f, +1.301928737e-01f, +9.301728008e-01f, -5.417779099e-02f }, - { -5.417593320e-03f, +1.299575502e-01f, +9.303596851e-01f, -5.414624875e-02f }, - { -5.404022496e-03f, +1.297223769e-01f, +9.305463408e-01f, -5.411460571e-02f }, - { -5.390471071e-03f, +1.294873538e-01f, +9.307327679e-01f, -5.408286181e-02f }, - { -5.376939039e-03f, +1.292524811e-01f, +9.309189660e-01f, -5.405101697e-02f }, - { -5.363426391e-03f, +1.290177586e-01f, +9.311049353e-01f, -5.401907109e-02f }, - { -5.349933121e-03f, +1.287831865e-01f, +9.312906754e-01f, -5.398702410e-02f }, - { -5.336459220e-03f, +1.285487648e-01f, +9.314761864e-01f, -5.395487592e-02f }, - { -5.323004682e-03f, +1.283144936e-01f, +9.316614680e-01f, -5.392262647e-02f }, - { -5.309569498e-03f, +1.280803728e-01f, +9.318465203e-01f, -5.389027566e-02f }, - { -5.296153661e-03f, +1.278464026e-01f, +9.320313430e-01f, -5.385782342e-02f }, - { -5.282757164e-03f, +1.276125829e-01f, +9.322159361e-01f, -5.382526966e-02f }, - { -5.269379998e-03f, +1.273789138e-01f, +9.324002994e-01f, -5.379261431e-02f }, - { -5.256022157e-03f, +1.271453953e-01f, +9.325844328e-01f, -5.375985728e-02f }, - { -5.242683633e-03f, +1.269120275e-01f, +9.327683363e-01f, -5.372699848e-02f }, - { -5.229364417e-03f, +1.266788105e-01f, +9.329520096e-01f, -5.369403785e-02f }, - { -5.216064503e-03f, +1.264457441e-01f, +9.331354527e-01f, -5.366097530e-02f }, - { -5.202783882e-03f, +1.262128286e-01f, +9.333186655e-01f, -5.362781074e-02f }, - { -5.189522547e-03f, +1.259800639e-01f, +9.335016478e-01f, -5.359454410e-02f }, - { -5.176280490e-03f, +1.257474501e-01f, +9.336843996e-01f, -5.356117530e-02f }, - { -5.163057703e-03f, +1.255149871e-01f, +9.338669207e-01f, -5.352770425e-02f }, - { -5.149854178e-03f, +1.252826751e-01f, +9.340492110e-01f, -5.349413088e-02f }, - { -5.136669908e-03f, +1.250505141e-01f, +9.342312704e-01f, -5.346045510e-02f }, - { -5.123504885e-03f, +1.248185041e-01f, +9.344130987e-01f, -5.342667683e-02f }, - { -5.110359100e-03f, +1.245866451e-01f, +9.345946960e-01f, -5.339279600e-02f }, - { -5.097232546e-03f, +1.243549372e-01f, +9.347760620e-01f, -5.335881251e-02f }, - { -5.084125216e-03f, +1.241233805e-01f, +9.349571966e-01f, -5.332472630e-02f }, - { -5.071037100e-03f, +1.238919749e-01f, +9.351380998e-01f, -5.329053728e-02f }, - { -5.057968191e-03f, +1.236607205e-01f, +9.353187714e-01f, -5.325624537e-02f }, - { -5.044918481e-03f, +1.234296174e-01f, +9.354992113e-01f, -5.322185049e-02f }, - { -5.031887963e-03f, +1.231986655e-01f, +9.356794194e-01f, -5.318735255e-02f }, - { -5.018876627e-03f, +1.229678649e-01f, +9.358593955e-01f, -5.315275148e-02f }, - { -5.005884466e-03f, +1.227372157e-01f, +9.360391397e-01f, -5.311804720e-02f }, - { -4.992911472e-03f, +1.225067179e-01f, +9.362186517e-01f, -5.308323963e-02f }, - { -4.979957637e-03f, +1.222763714e-01f, +9.363979314e-01f, -5.304832868e-02f }, - { -4.967022953e-03f, +1.220461765e-01f, +9.365769788e-01f, -5.301331428e-02f }, - { -4.954107411e-03f, +1.218161330e-01f, +9.367557936e-01f, -5.297819635e-02f }, - { -4.941211003e-03f, +1.215862410e-01f, +9.369343759e-01f, -5.294297479e-02f }, - { -4.928333721e-03f, +1.213565006e-01f, +9.371127255e-01f, -5.290764955e-02f }, - { -4.915475558e-03f, +1.211269118e-01f, +9.372908423e-01f, -5.287222052e-02f }, - { -4.902636504e-03f, +1.208974746e-01f, +9.374687261e-01f, -5.283668764e-02f }, - { -4.889816551e-03f, +1.206681891e-01f, +9.376463769e-01f, -5.280105083e-02f }, - { -4.877015692e-03f, +1.204390553e-01f, +9.378237946e-01f, -5.276531000e-02f }, - { -4.864233917e-03f, +1.202100732e-01f, +9.380009790e-01f, -5.272946506e-02f }, - { -4.851471219e-03f, +1.199812429e-01f, +9.381779301e-01f, -5.269351596e-02f }, - { -4.838727590e-03f, +1.197525644e-01f, +9.383546476e-01f, -5.265746259e-02f }, - { -4.826003020e-03f, +1.195240378e-01f, +9.385311316e-01f, -5.262130489e-02f }, - { -4.813297501e-03f, +1.192956630e-01f, +9.387073818e-01f, -5.258504277e-02f }, - { -4.800611026e-03f, +1.190674401e-01f, +9.388833983e-01f, -5.254867615e-02f }, - { -4.787943585e-03f, +1.188393692e-01f, +9.390591808e-01f, -5.251220495e-02f }, - { -4.775295171e-03f, +1.186114502e-01f, +9.392347294e-01f, -5.247562909e-02f }, - { -4.762665774e-03f, +1.183836832e-01f, +9.394100437e-01f, -5.243894849e-02f }, - { -4.750055387e-03f, +1.181560683e-01f, +9.395851238e-01f, -5.240216308e-02f }, - { -4.737464000e-03f, +1.179286055e-01f, +9.397599696e-01f, -5.236527277e-02f }, - { -4.724891606e-03f, +1.177012947e-01f, +9.399345809e-01f, -5.232827748e-02f }, - { -4.712338195e-03f, +1.174741362e-01f, +9.401089576e-01f, -5.229117713e-02f }, - { -4.699803759e-03f, +1.172471298e-01f, +9.402830997e-01f, -5.225397164e-02f }, - { -4.687288290e-03f, +1.170202755e-01f, +9.404570069e-01f, -5.221666093e-02f }, - { -4.674791779e-03f, +1.167935736e-01f, +9.406306792e-01f, -5.217924493e-02f }, - { -4.662314217e-03f, +1.165670239e-01f, +9.408041166e-01f, -5.214172354e-02f }, - { -4.649855595e-03f, +1.163406265e-01f, +9.409773188e-01f, -5.210409670e-02f }, - { -4.637415906e-03f, +1.161143815e-01f, +9.411502858e-01f, -5.206636432e-02f }, - { -4.624995140e-03f, +1.158882888e-01f, +9.413230174e-01f, -5.202852632e-02f }, - { -4.612593288e-03f, +1.156623486e-01f, +9.414955136e-01f, -5.199058263e-02f }, - { -4.600210342e-03f, +1.154365607e-01f, +9.416677743e-01f, -5.195253316e-02f }, - { -4.587846293e-03f, +1.152109254e-01f, +9.418397993e-01f, -5.191437783e-02f }, - { -4.575501133e-03f, +1.149854425e-01f, +9.420115885e-01f, -5.187611657e-02f }, - { -4.563174852e-03f, +1.147601122e-01f, +9.421831418e-01f, -5.183774929e-02f }, - { -4.550867441e-03f, +1.145349345e-01f, +9.423544592e-01f, -5.179927591e-02f }, - { -4.538578892e-03f, +1.143099093e-01f, +9.425255405e-01f, -5.176069636e-02f }, - { -4.526309197e-03f, +1.140850368e-01f, +9.426963856e-01f, -5.172201055e-02f }, - { -4.514058345e-03f, +1.138603169e-01f, +9.428669944e-01f, -5.168321841e-02f }, - { -4.501826329e-03f, +1.136357497e-01f, +9.430373667e-01f, -5.164431986e-02f }, - { -4.489613138e-03f, +1.134113352e-01f, +9.432075026e-01f, -5.160531481e-02f }, - { -4.477418765e-03f, +1.131870735e-01f, +9.433774019e-01f, -5.156620319e-02f }, - { -4.465243201e-03f, +1.129629646e-01f, +9.435470644e-01f, -5.152698491e-02f }, - { -4.453086436e-03f, +1.127390085e-01f, +9.437164901e-01f, -5.148765991e-02f }, - { -4.440948461e-03f, +1.125152052e-01f, +9.438856788e-01f, -5.144822810e-02f }, - { -4.428829267e-03f, +1.122915548e-01f, +9.440546305e-01f, -5.140868939e-02f }, - { -4.416728846e-03f, +1.120680573e-01f, +9.442233450e-01f, -5.136904371e-02f }, - { -4.404647188e-03f, +1.118447128e-01f, +9.443918223e-01f, -5.132929099e-02f }, - { -4.392584284e-03f, +1.116215212e-01f, +9.445600623e-01f, -5.128943114e-02f }, - { -4.380540125e-03f, +1.113984826e-01f, +9.447280647e-01f, -5.124946408e-02f }, - { -4.368514702e-03f, +1.111755970e-01f, +9.448958296e-01f, -5.120938973e-02f }, - { -4.356508006e-03f, +1.109528645e-01f, +9.450633568e-01f, -5.116920802e-02f }, - { -4.344520028e-03f, +1.107302850e-01f, +9.452306462e-01f, -5.112891887e-02f }, - { -4.332550758e-03f, +1.105078587e-01f, +9.453976978e-01f, -5.108852219e-02f }, - { -4.320600187e-03f, +1.102855855e-01f, +9.455645113e-01f, -5.104801790e-02f }, - { -4.308668306e-03f, +1.100634655e-01f, +9.457310868e-01f, -5.100740594e-02f }, - { -4.296755107e-03f, +1.098414987e-01f, +9.458974241e-01f, -5.096668621e-02f }, - { -4.284860578e-03f, +1.096196851e-01f, +9.460635230e-01f, -5.092585865e-02f }, - { -4.272984712e-03f, +1.093980247e-01f, +9.462293836e-01f, -5.088492316e-02f }, - { -4.261127499e-03f, +1.091765177e-01f, +9.463950056e-01f, -5.084387968e-02f }, - { -4.249288929e-03f, +1.089551640e-01f, +9.465603890e-01f, -5.080272812e-02f }, - { -4.237468994e-03f, +1.087339636e-01f, +9.467255337e-01f, -5.076146841e-02f }, - { -4.225667684e-03f, +1.085129166e-01f, +9.468904396e-01f, -5.072010046e-02f }, - { -4.213884989e-03f, +1.082920229e-01f, +9.470551065e-01f, -5.067862420e-02f }, - { -4.202120901e-03f, +1.080712828e-01f, +9.472195345e-01f, -5.063703954e-02f }, - { -4.190375409e-03f, +1.078506960e-01f, +9.473837233e-01f, -5.059534642e-02f }, - { -4.178648505e-03f, +1.076302628e-01f, +9.475476728e-01f, -5.055354474e-02f }, - { -4.166940178e-03f, +1.074099830e-01f, +9.477113830e-01f, -5.051163444e-02f }, - { -4.155250420e-03f, +1.071898568e-01f, +9.478748538e-01f, -5.046961543e-02f }, - { -4.143579220e-03f, +1.069698842e-01f, +9.480380851e-01f, -5.042748764e-02f }, - { -4.131926571e-03f, +1.067500652e-01f, +9.482010767e-01f, -5.038525098e-02f }, - { -4.120292461e-03f, +1.065303997e-01f, +9.483638285e-01f, -5.034290538e-02f }, - { -4.108676881e-03f, +1.063108880e-01f, +9.485263405e-01f, -5.030045076e-02f }, - { -4.097079822e-03f, +1.060915299e-01f, +9.486886126e-01f, -5.025788704e-02f }, - { -4.085501274e-03f, +1.058723254e-01f, +9.488506446e-01f, -5.021521414e-02f }, - { -4.073941228e-03f, +1.056532748e-01f, +9.490124364e-01f, -5.017243198e-02f }, - { -4.062399673e-03f, +1.054343779e-01f, +9.491739880e-01f, -5.012954049e-02f }, - { -4.050876601e-03f, +1.052156347e-01f, +9.493352993e-01f, -5.008653959e-02f }, - { -4.039372002e-03f, +1.049970454e-01f, +9.494963700e-01f, -5.004342920e-02f }, - { -4.027885865e-03f, +1.047786099e-01f, +9.496572003e-01f, -5.000020923e-02f }, - { -4.016418182e-03f, +1.045603282e-01f, +9.498177898e-01f, -4.995687962e-02f }, - { -4.004968942e-03f, +1.043422005e-01f, +9.499781386e-01f, -4.991344028e-02f }, - { -3.993538136e-03f, +1.041242266e-01f, +9.501382466e-01f, -4.986989114e-02f }, - { -3.982125754e-03f, +1.039064067e-01f, +9.502981136e-01f, -4.982623211e-02f }, - { -3.970731786e-03f, +1.036887408e-01f, +9.504577395e-01f, -4.978246313e-02f }, - { -3.959356223e-03f, +1.034712288e-01f, +9.506171243e-01f, -4.973858410e-02f }, - { -3.947999054e-03f, +1.032538708e-01f, +9.507762678e-01f, -4.969459496e-02f }, - { -3.936660271e-03f, +1.030366669e-01f, +9.509351700e-01f, -4.965049562e-02f }, - { -3.925339862e-03f, +1.028196171e-01f, +9.510938306e-01f, -4.960628601e-02f }, - { -3.914037818e-03f, +1.026027213e-01f, +9.512522498e-01f, -4.956196605e-02f }, - { -3.902754129e-03f, +1.023859797e-01f, +9.514104273e-01f, -4.951753566e-02f }, - { -3.891488786e-03f, +1.021693921e-01f, +9.515683630e-01f, -4.947299476e-02f }, - { -3.880241778e-03f, +1.019529588e-01f, +9.517260568e-01f, -4.942834328e-02f }, - { -3.869013095e-03f, +1.017366796e-01f, +9.518835087e-01f, -4.938358114e-02f }, - { -3.857802728e-03f, +1.015205546e-01f, +9.520407186e-01f, -4.933870825e-02f }, - { -3.846610666e-03f, +1.013045839e-01f, +9.521976863e-01f, -4.929372455e-02f }, - { -3.835436900e-03f, +1.010887674e-01f, +9.523544118e-01f, -4.924862995e-02f }, - { -3.824281419e-03f, +1.008731053e-01f, +9.525108949e-01f, -4.920342438e-02f }, - { -3.813144214e-03f, +1.006575974e-01f, +9.526671355e-01f, -4.915810776e-02f }, - { -3.802025274e-03f, +1.004422438e-01f, +9.528231336e-01f, -4.911268001e-02f }, - { -3.790924590e-03f, +1.002270446e-01f, +9.529788891e-01f, -4.906714105e-02f }, - { -3.779842151e-03f, +1.000119998e-01f, +9.531344018e-01f, -4.902149080e-02f }, - { -3.768777946e-03f, +9.979710935e-02f, +9.532896717e-01f, -4.897572920e-02f }, - { -3.757731967e-03f, +9.958237334e-02f, +9.534446987e-01f, -4.892985616e-02f }, - { -3.746704203e-03f, +9.936779178e-02f, +9.535994826e-01f, -4.888387160e-02f }, - { -3.735694643e-03f, +9.915336469e-02f, +9.537540234e-01f, -4.883777544e-02f }, - { -3.724703278e-03f, +9.893909208e-02f, +9.539083209e-01f, -4.879156762e-02f }, - { -3.713730097e-03f, +9.872497399e-02f, +9.540623752e-01f, -4.874524804e-02f }, - { -3.702775091e-03f, +9.851101044e-02f, +9.542161860e-01f, -4.869881664e-02f }, - { -3.691838248e-03f, +9.829720144e-02f, +9.543697533e-01f, -4.865227334e-02f }, - { -3.680919559e-03f, +9.808354703e-02f, +9.545230770e-01f, -4.860561805e-02f }, - { -3.670019013e-03f, +9.787004721e-02f, +9.546761570e-01f, -4.855885071e-02f }, - { -3.659136601e-03f, +9.765670203e-02f, +9.548289931e-01f, -4.851197123e-02f }, - { -3.648272311e-03f, +9.744351149e-02f, +9.549815854e-01f, -4.846497954e-02f }, - { -3.637426133e-03f, +9.723047561e-02f, +9.551339337e-01f, -4.841787556e-02f }, - { -3.626598058e-03f, +9.701759443e-02f, +9.552860379e-01f, -4.837065921e-02f }, - { -3.615788075e-03f, +9.680486796e-02f, +9.554378979e-01f, -4.832333042e-02f }, - { -3.604996173e-03f, +9.659229622e-02f, +9.555895136e-01f, -4.827588911e-02f }, - { -3.594222342e-03f, +9.637987924e-02f, +9.557408849e-01f, -4.822833521e-02f }, - { -3.583466571e-03f, +9.616761703e-02f, +9.558920118e-01f, -4.818066862e-02f }, - { -3.572728851e-03f, +9.595550962e-02f, +9.560428941e-01f, -4.813288929e-02f }, - { -3.562009171e-03f, +9.574355703e-02f, +9.561935317e-01f, -4.808499713e-02f }, - { -3.551307520e-03f, +9.553175927e-02f, +9.563439245e-01f, -4.803699206e-02f }, - { -3.540623888e-03f, +9.532011637e-02f, +9.564940726e-01f, -4.798887401e-02f }, - { -3.529958264e-03f, +9.510862835e-02f, +9.566439756e-01f, -4.794064290e-02f }, - { -3.519310638e-03f, +9.489729524e-02f, +9.567936336e-01f, -4.789229866e-02f }, - { -3.508680999e-03f, +9.468611704e-02f, +9.569430465e-01f, -4.784384120e-02f }, - { -3.498069337e-03f, +9.447509378e-02f, +9.570922142e-01f, -4.779527045e-02f }, - { -3.487475641e-03f, +9.426422548e-02f, +9.572411365e-01f, -4.774658634e-02f }, - { -3.476899901e-03f, +9.405351217e-02f, +9.573898135e-01f, -4.769778879e-02f }, - { -3.466342106e-03f, +9.384295385e-02f, +9.575382449e-01f, -4.764887772e-02f }, - { -3.455802245e-03f, +9.363255055e-02f, +9.576864307e-01f, -4.759985305e-02f }, - { -3.445280308e-03f, +9.342230229e-02f, +9.578343708e-01f, -4.755071471e-02f }, - { -3.434776284e-03f, +9.321220909e-02f, +9.579820651e-01f, -4.750146263e-02f }, - { -3.424290163e-03f, +9.300227097e-02f, +9.581295136e-01f, -4.745209672e-02f }, - { -3.413821934e-03f, +9.279248795e-02f, +9.582767160e-01f, -4.740261690e-02f }, - { -3.403371585e-03f, +9.258286004e-02f, +9.584236724e-01f, -4.735302311e-02f }, - { -3.392939107e-03f, +9.237338726e-02f, +9.585703827e-01f, -4.730331527e-02f }, - { -3.382524489e-03f, +9.216406964e-02f, +9.587168467e-01f, -4.725349330e-02f }, - { -3.372127720e-03f, +9.195490720e-02f, +9.588630643e-01f, -4.720355712e-02f }, - { -3.361748789e-03f, +9.174589994e-02f, +9.590090355e-01f, -4.715350666e-02f }, - { -3.351387685e-03f, +9.153704790e-02f, +9.591547602e-01f, -4.710334184e-02f }, - { -3.341044398e-03f, +9.132835108e-02f, +9.593002383e-01f, -4.705306259e-02f }, - { -3.330718916e-03f, +9.111980950e-02f, +9.594454696e-01f, -4.700266883e-02f }, - { -3.320411230e-03f, +9.091142320e-02f, +9.595904542e-01f, -4.695216048e-02f }, - { -3.310121328e-03f, +9.070319217e-02f, +9.597351919e-01f, -4.690153746e-02f }, - { -3.299849199e-03f, +9.049511645e-02f, +9.598796825e-01f, -4.685079971e-02f }, - { -3.289594832e-03f, +9.028719604e-02f, +9.600239261e-01f, -4.679994715e-02f }, - { -3.279358217e-03f, +9.007943096e-02f, +9.601679226e-01f, -4.674897969e-02f }, - { -3.269139342e-03f, +8.987182124e-02f, +9.603116718e-01f, -4.669789727e-02f }, - { -3.258938197e-03f, +8.966436689e-02f, +9.604551736e-01f, -4.664669981e-02f }, - { -3.248754771e-03f, +8.945706793e-02f, +9.605984280e-01f, -4.659538723e-02f }, - { -3.238589053e-03f, +8.924992437e-02f, +9.607414349e-01f, -4.654395945e-02f }, - { -3.228441031e-03f, +8.904293624e-02f, +9.608841941e-01f, -4.649241641e-02f }, - { -3.218310696e-03f, +8.883610354e-02f, +9.610267057e-01f, -4.644075802e-02f }, - { -3.208198035e-03f, +8.862942629e-02f, +9.611689695e-01f, -4.638898421e-02f }, - { -3.198103037e-03f, +8.842290452e-02f, +9.613109853e-01f, -4.633709491e-02f }, - { -3.188025693e-03f, +8.821653824e-02f, +9.614527532e-01f, -4.628509003e-02f }, - { -3.177965990e-03f, +8.801032746e-02f, +9.615942731e-01f, -4.623296951e-02f }, - { -3.167923918e-03f, +8.780427220e-02f, +9.617355447e-01f, -4.618073326e-02f }, - { -3.157899465e-03f, +8.759837247e-02f, +9.618765682e-01f, -4.612838122e-02f }, - { -3.147892621e-03f, +8.739262830e-02f, +9.620173433e-01f, -4.607591330e-02f }, - { -3.137903374e-03f, +8.718703970e-02f, +9.621578700e-01f, -4.602332944e-02f }, - { -3.127931713e-03f, +8.698160668e-02f, +9.622981482e-01f, -4.597062955e-02f }, - { -3.117977628e-03f, +8.677632927e-02f, +9.624381778e-01f, -4.591781356e-02f }, - { -3.108041106e-03f, +8.657120747e-02f, +9.625779587e-01f, -4.586488140e-02f }, - { -3.098122137e-03f, +8.636624129e-02f, +9.627174908e-01f, -4.581183299e-02f }, - { -3.088220709e-03f, +8.616143077e-02f, +9.628567741e-01f, -4.575866826e-02f }, - { -3.078336812e-03f, +8.595677591e-02f, +9.629958084e-01f, -4.570538712e-02f }, - { -3.068470433e-03f, +8.575227672e-02f, +9.631345937e-01f, -4.565198951e-02f }, - { -3.058621563e-03f, +8.554793322e-02f, +9.632731298e-01f, -4.559847535e-02f }, - { -3.048790189e-03f, +8.534374543e-02f, +9.634114168e-01f, -4.554484457e-02f }, - { -3.038976300e-03f, +8.513971336e-02f, +9.635494545e-01f, -4.549109708e-02f }, - { -3.029179886e-03f, +8.493583703e-02f, +9.636872427e-01f, -4.543723283e-02f }, - { -3.019400934e-03f, +8.473211644e-02f, +9.638247816e-01f, -4.538325172e-02f }, - { -3.009639433e-03f, +8.452855162e-02f, +9.639620708e-01f, -4.532915369e-02f }, - { -2.999895373e-03f, +8.432514258e-02f, +9.640991104e-01f, -4.527493866e-02f }, - { -2.990168741e-03f, +8.412188933e-02f, +9.642359003e-01f, -4.522060655e-02f }, - { -2.980459527e-03f, +8.391879188e-02f, +9.643724404e-01f, -4.516615730e-02f }, - { -2.970767718e-03f, +8.371585026e-02f, +9.645087305e-01f, -4.511159083e-02f }, - { -2.961093304e-03f, +8.351306447e-02f, +9.646447707e-01f, -4.505690705e-02f }, - { -2.951436274e-03f, +8.331043452e-02f, +9.647805608e-01f, -4.500210591e-02f }, - { -2.941796615e-03f, +8.310796044e-02f, +9.649161008e-01f, -4.494718732e-02f }, - { -2.932174316e-03f, +8.290564223e-02f, +9.650513905e-01f, -4.489215120e-02f }, - { -2.922569366e-03f, +8.270347990e-02f, +9.651864298e-01f, -4.483699749e-02f }, - { -2.912981754e-03f, +8.250147348e-02f, +9.653212188e-01f, -4.478172612e-02f }, - { -2.903411467e-03f, +8.229962297e-02f, +9.654557573e-01f, -4.472633699e-02f }, - { -2.893858495e-03f, +8.209792838e-02f, +9.655900451e-01f, -4.467083005e-02f }, - { -2.884322825e-03f, +8.189638974e-02f, +9.657240824e-01f, -4.461520522e-02f }, - { -2.874804447e-03f, +8.169500704e-02f, +9.658578688e-01f, -4.455946242e-02f }, - { -2.865303349e-03f, +8.149378031e-02f, +9.659914044e-01f, -4.450360157e-02f }, - { -2.855819519e-03f, +8.129270955e-02f, +9.661246891e-01f, -4.444762262e-02f }, - { -2.846352946e-03f, +8.109179479e-02f, +9.662577228e-01f, -4.439152547e-02f }, - { -2.836903618e-03f, +8.089103602e-02f, +9.663905054e-01f, -4.433531006e-02f }, - { -2.827471523e-03f, +8.069043326e-02f, +9.665230369e-01f, -4.427897631e-02f }, - { -2.818056650e-03f, +8.048998653e-02f, +9.666553170e-01f, -4.422252415e-02f }, - { -2.808658988e-03f, +8.028969584e-02f, +9.667873459e-01f, -4.416595350e-02f }, - { -2.799278524e-03f, +8.008956119e-02f, +9.669191233e-01f, -4.410926430e-02f }, - { -2.789915247e-03f, +7.988958260e-02f, +9.670506492e-01f, -4.405245646e-02f }, - { -2.780569145e-03f, +7.968976008e-02f, +9.671819235e-01f, -4.399552991e-02f }, - { -2.771240206e-03f, +7.949009365e-02f, +9.673129462e-01f, -4.393848458e-02f }, - { -2.761928420e-03f, +7.929058330e-02f, +9.674437171e-01f, -4.388132040e-02f }, - { -2.752633774e-03f, +7.909122907e-02f, +9.675742361e-01f, -4.382403729e-02f }, - { -2.743356256e-03f, +7.889203094e-02f, +9.677045033e-01f, -4.376663518e-02f }, - { -2.734095855e-03f, +7.869298894e-02f, +9.678345184e-01f, -4.370911400e-02f }, - { -2.724852558e-03f, +7.849410308e-02f, +9.679642815e-01f, -4.365147366e-02f }, - { -2.715626355e-03f, +7.829537336e-02f, +9.680937924e-01f, -4.359371410e-02f }, - { -2.706417234e-03f, +7.809679980e-02f, +9.682230510e-01f, -4.353583525e-02f }, - { -2.697225181e-03f, +7.789838241e-02f, +9.683520574e-01f, -4.347783703e-02f }, - { -2.688050187e-03f, +7.770012120e-02f, +9.684808113e-01f, -4.341971936e-02f }, - { -2.678892238e-03f, +7.750201617e-02f, +9.686093127e-01f, -4.336148218e-02f }, - { -2.669751324e-03f, +7.730406734e-02f, +9.687375615e-01f, -4.330312541e-02f }, - { -2.660627431e-03f, +7.710627472e-02f, +9.688655578e-01f, -4.324464897e-02f }, - { -2.651520549e-03f, +7.690863832e-02f, +9.689933012e-01f, -4.318605280e-02f }, - { -2.642430666e-03f, +7.671115814e-02f, +9.691207919e-01f, -4.312733682e-02f }, - { -2.633357769e-03f, +7.651383420e-02f, +9.692480296e-01f, -4.306850096e-02f }, - { -2.624301846e-03f, +7.631666650e-02f, +9.693750144e-01f, -4.300954515e-02f }, - { -2.615262886e-03f, +7.611965506e-02f, +9.695017462e-01f, -4.295046931e-02f }, - { -2.606240877e-03f, +7.592279989e-02f, +9.696282248e-01f, -4.289127336e-02f }, - { -2.597235807e-03f, +7.572610098e-02f, +9.697544501e-01f, -4.283195724e-02f }, - { -2.588247664e-03f, +7.552955836e-02f, +9.698804222e-01f, -4.277252088e-02f }, - { -2.579276435e-03f, +7.533317203e-02f, +9.700061410e-01f, -4.271296420e-02f }, - { -2.570322110e-03f, +7.513694200e-02f, +9.701316062e-01f, -4.265328712e-02f }, - { -2.561384675e-03f, +7.494086827e-02f, +9.702568180e-01f, -4.259348958e-02f }, - { -2.552464119e-03f, +7.474495086e-02f, +9.703817761e-01f, -4.253357150e-02f }, - { -2.543560430e-03f, +7.454918978e-02f, +9.705064805e-01f, -4.247353281e-02f }, - { -2.534673595e-03f, +7.435358503e-02f, +9.706309312e-01f, -4.241337343e-02f }, - { -2.525803603e-03f, +7.415813662e-02f, +9.707551280e-01f, -4.235309331e-02f }, - { -2.516950442e-03f, +7.396284455e-02f, +9.708790709e-01f, -4.229269235e-02f }, - { -2.508114099e-03f, +7.376770885e-02f, +9.710027598e-01f, -4.223217049e-02f }, - { -2.499294563e-03f, +7.357272950e-02f, +9.711261947e-01f, -4.217152766e-02f }, - { -2.490491821e-03f, +7.337790653e-02f, +9.712493753e-01f, -4.211076378e-02f }, - { -2.481705861e-03f, +7.318323994e-02f, +9.713723017e-01f, -4.204987879e-02f }, - { -2.472936671e-03f, +7.298872973e-02f, +9.714949738e-01f, -4.198887261e-02f }, - { -2.464184239e-03f, +7.279437592e-02f, +9.716173916e-01f, -4.192774516e-02f }, - { -2.455448552e-03f, +7.260017851e-02f, +9.717395548e-01f, -4.186649638e-02f }, - { -2.446729599e-03f, +7.240613750e-02f, +9.718614635e-01f, -4.180512620e-02f }, - { -2.438027368e-03f, +7.221225291e-02f, +9.719831176e-01f, -4.174363453e-02f }, - { -2.429341845e-03f, +7.201852474e-02f, +9.721045170e-01f, -4.168202131e-02f }, - { -2.420673020e-03f, +7.182495300e-02f, +9.722256616e-01f, -4.162028648e-02f }, - { -2.412020878e-03f, +7.163153769e-02f, +9.723465513e-01f, -4.155842994e-02f }, - { -2.403385410e-03f, +7.143827882e-02f, +9.724671862e-01f, -4.149645164e-02f }, - { -2.394766601e-03f, +7.124517640e-02f, +9.725875660e-01f, -4.143435151e-02f }, - { -2.386164441e-03f, +7.105223044e-02f, +9.727076907e-01f, -4.137212946e-02f }, - { -2.377578915e-03f, +7.085944093e-02f, +9.728275603e-01f, -4.130978543e-02f }, - { -2.369010014e-03f, +7.066680788e-02f, +9.729471746e-01f, -4.124731934e-02f }, - { -2.360457723e-03f, +7.047433131e-02f, +9.730665337e-01f, -4.118473113e-02f }, - { -2.351922030e-03f, +7.028201121e-02f, +9.731856373e-01f, -4.112202073e-02f }, - { -2.343402924e-03f, +7.008984759e-02f, +9.733044855e-01f, -4.105918805e-02f }, - { -2.334900392e-03f, +6.989784046e-02f, +9.734230782e-01f, -4.099623304e-02f }, - { -2.326414422e-03f, +6.970598983e-02f, +9.735414153e-01f, -4.093315561e-02f }, - { -2.317945001e-03f, +6.951429569e-02f, +9.736594966e-01f, -4.086995570e-02f }, - { -2.309492116e-03f, +6.932275805e-02f, +9.737773222e-01f, -4.080663324e-02f }, - { -2.301055756e-03f, +6.913137692e-02f, +9.738948920e-01f, -4.074318815e-02f }, - { -2.292635908e-03f, +6.894015231e-02f, +9.740122059e-01f, -4.067962036e-02f }, - { -2.284232560e-03f, +6.874908421e-02f, +9.741292638e-01f, -4.061592981e-02f }, - { -2.275845698e-03f, +6.855817263e-02f, +9.742460656e-01f, -4.055211641e-02f }, - { -2.267475312e-03f, +6.836741758e-02f, +9.743626113e-01f, -4.048818011e-02f }, - { -2.259121387e-03f, +6.817681906e-02f, +9.744789009e-01f, -4.042412082e-02f }, - { -2.250783913e-03f, +6.798637707e-02f, +9.745949341e-01f, -4.035993848e-02f }, - { -2.242462875e-03f, +6.779609163e-02f, +9.747107110e-01f, -4.029563302e-02f }, - { -2.234158263e-03f, +6.760596272e-02f, +9.748262314e-01f, -4.023120436e-02f }, - { -2.225870062e-03f, +6.741599037e-02f, +9.749414954e-01f, -4.016665244e-02f }, - { -2.217598262e-03f, +6.722617456e-02f, +9.750565028e-01f, -4.010197718e-02f }, - { -2.209342848e-03f, +6.703651531e-02f, +9.751712536e-01f, -4.003717851e-02f }, - { -2.201103809e-03f, +6.684701262e-02f, +9.752857476e-01f, -3.997225637e-02f }, - { -2.192881133e-03f, +6.665766648e-02f, +9.753999849e-01f, -3.990721068e-02f }, - { -2.184674805e-03f, +6.646847692e-02f, +9.755139653e-01f, -3.984204137e-02f }, - { -2.176484815e-03f, +6.627944392e-02f, +9.756276888e-01f, -3.977674836e-02f }, - { -2.168311149e-03f, +6.609056749e-02f, +9.757411552e-01f, -3.971133160e-02f }, - { -2.160153795e-03f, +6.590184763e-02f, +9.758543646e-01f, -3.964579101e-02f }, - { -2.152012740e-03f, +6.571328435e-02f, +9.759673169e-01f, -3.958012651e-02f }, - { -2.143887971e-03f, +6.552487765e-02f, +9.760800119e-01f, -3.951433805e-02f }, - { -2.135779477e-03f, +6.533662753e-02f, +9.761924497e-01f, -3.944842554e-02f }, - { -2.127687243e-03f, +6.514853400e-02f, +9.763046301e-01f, -3.938238892e-02f }, - { -2.119611258e-03f, +6.496059705e-02f, +9.764165530e-01f, -3.931622812e-02f }, - { -2.111551509e-03f, +6.477281670e-02f, +9.765282185e-01f, -3.924994306e-02f }, - { -2.103507983e-03f, +6.458519293e-02f, +9.766396264e-01f, -3.918353368e-02f }, - { -2.095480667e-03f, +6.439772576e-02f, +9.767507766e-01f, -3.911699991e-02f }, - { -2.087469549e-03f, +6.421041518e-02f, +9.768616692e-01f, -3.905034167e-02f }, - { -2.079474617e-03f, +6.402326120e-02f, +9.769723040e-01f, -3.898355890e-02f }, - { -2.071495856e-03f, +6.383626381e-02f, +9.770826809e-01f, -3.891665153e-02f }, - { -2.063533255e-03f, +6.364942303e-02f, +9.771927998e-01f, -3.884961949e-02f }, - { -2.055586801e-03f, +6.346273885e-02f, +9.773026608e-01f, -3.878246270e-02f }, - { -2.047656480e-03f, +6.327621127e-02f, +9.774122638e-01f, -3.871518110e-02f }, - { -2.039742281e-03f, +6.308984030e-02f, +9.775216086e-01f, -3.864777462e-02f }, - { -2.031844191e-03f, +6.290362593e-02f, +9.776306952e-01f, -3.858024318e-02f }, - { -2.023962196e-03f, +6.271756817e-02f, +9.777395235e-01f, -3.851258673e-02f }, - { -2.016096283e-03f, +6.253166701e-02f, +9.778480935e-01f, -3.844480518e-02f }, - { -2.008246441e-03f, +6.234592246e-02f, +9.779564051e-01f, -3.837689847e-02f }, - { -2.000412656e-03f, +6.216033452e-02f, +9.780644583e-01f, -3.830886653e-02f }, - { -1.992594915e-03f, +6.197490319e-02f, +9.781722528e-01f, -3.824070929e-02f }, - { -1.984793206e-03f, +6.178962847e-02f, +9.782797888e-01f, -3.817242668e-02f }, - { -1.977007515e-03f, +6.160451036e-02f, +9.783870661e-01f, -3.810401864e-02f }, - { -1.969237830e-03f, +6.141954886e-02f, +9.784940847e-01f, -3.803548508e-02f }, - { -1.961484138e-03f, +6.123474396e-02f, +9.786008444e-01f, -3.796682595e-02f }, - { -1.953746425e-03f, +6.105009568e-02f, +9.787073453e-01f, -3.789804118e-02f }, - { -1.946024680e-03f, +6.086560401e-02f, +9.788135872e-01f, -3.782913069e-02f }, - { -1.938318888e-03f, +6.068126894e-02f, +9.789195701e-01f, -3.776009441e-02f }, - { -1.930629038e-03f, +6.049709048e-02f, +9.790252939e-01f, -3.769093228e-02f }, - { -1.922955116e-03f, +6.031306864e-02f, +9.791307585e-01f, -3.762164423e-02f }, - { -1.915297108e-03f, +6.012920340e-02f, +9.792359640e-01f, -3.755223018e-02f }, - { -1.907655004e-03f, +5.994549476e-02f, +9.793409101e-01f, -3.748269008e-02f }, - { -1.900028788e-03f, +5.976194274e-02f, +9.794455969e-01f, -3.741302385e-02f }, - { -1.892418449e-03f, +5.957854731e-02f, +9.795500243e-01f, -3.734323142e-02f }, - { -1.884823973e-03f, +5.939530849e-02f, +9.796541922e-01f, -3.727331272e-02f }, - { -1.877245347e-03f, +5.921222628e-02f, +9.797581006e-01f, -3.720326769e-02f }, - { -1.869682558e-03f, +5.902930066e-02f, +9.798617493e-01f, -3.713309626e-02f }, - { -1.862135594e-03f, +5.884653165e-02f, +9.799651384e-01f, -3.706279835e-02f }, - { -1.854604440e-03f, +5.866391923e-02f, +9.800682677e-01f, -3.699237391e-02f }, - { -1.847089085e-03f, +5.848146341e-02f, +9.801711372e-01f, -3.692182285e-02f }, - { -1.839589515e-03f, +5.829916418e-02f, +9.802737469e-01f, -3.685114512e-02f }, - { -1.832105717e-03f, +5.811702155e-02f, +9.803760966e-01f, -3.678034064e-02f }, - { -1.824637677e-03f, +5.793503550e-02f, +9.804781863e-01f, -3.670940934e-02f }, - { -1.817185384e-03f, +5.775320605e-02f, +9.805800159e-01f, -3.663835117e-02f }, - { -1.809748823e-03f, +5.757153318e-02f, +9.806815854e-01f, -3.656716604e-02f }, - { -1.802327981e-03f, +5.739001690e-02f, +9.807828947e-01f, -3.649585390e-02f }, - { -1.794922846e-03f, +5.720865720e-02f, +9.808839437e-01f, -3.642441467e-02f }, - { -1.787533404e-03f, +5.702745407e-02f, +9.809847324e-01f, -3.635284829e-02f }, - { -1.780159642e-03f, +5.684640752e-02f, +9.810852607e-01f, -3.628115468e-02f }, - { -1.772801548e-03f, +5.666551755e-02f, +9.811855286e-01f, -3.620933378e-02f }, - { -1.765459107e-03f, +5.648478415e-02f, +9.812855360e-01f, -3.613738552e-02f }, - { -1.758132306e-03f, +5.630420731e-02f, +9.813852827e-01f, -3.606530984e-02f }, - { -1.750821133e-03f, +5.612378704e-02f, +9.814847688e-01f, -3.599310667e-02f }, - { -1.743525575e-03f, +5.594352333e-02f, +9.815839943e-01f, -3.592077593e-02f }, - { -1.736245617e-03f, +5.576341617e-02f, +9.816829589e-01f, -3.584831757e-02f }, - { -1.728981247e-03f, +5.558346557e-02f, +9.817816627e-01f, -3.577573150e-02f }, - { -1.721732452e-03f, +5.540367152e-02f, +9.818801056e-01f, -3.570301768e-02f }, - { -1.714499218e-03f, +5.522403402e-02f, +9.819782876e-01f, -3.563017602e-02f }, - { -1.707281532e-03f, +5.504455306e-02f, +9.820762086e-01f, -3.555720646e-02f }, - { -1.700079381e-03f, +5.486522863e-02f, +9.821738684e-01f, -3.548410894e-02f }, - { -1.692892751e-03f, +5.468606075e-02f, +9.822712671e-01f, -3.541088338e-02f }, - { -1.685721630e-03f, +5.450704939e-02f, +9.823684047e-01f, -3.533752973e-02f }, - { -1.678566004e-03f, +5.432819456e-02f, +9.824652809e-01f, -3.526404790e-02f }, - { -1.671425859e-03f, +5.414949625e-02f, +9.825618958e-01f, -3.519043784e-02f }, - { -1.664301183e-03f, +5.397095446e-02f, +9.826582494e-01f, -3.511669948e-02f }, - { -1.657191962e-03f, +5.379256918e-02f, +9.827543414e-01f, -3.504283275e-02f }, - { -1.650098183e-03f, +5.361434040e-02f, +9.828501720e-01f, -3.496883758e-02f }, - { -1.643019832e-03f, +5.343626813e-02f, +9.829457410e-01f, -3.489471391e-02f }, - { -1.635956896e-03f, +5.325835236e-02f, +9.830410484e-01f, -3.482046167e-02f }, - { -1.628909362e-03f, +5.308059308e-02f, +9.831360941e-01f, -3.474608080e-02f }, - { -1.621877216e-03f, +5.290299029e-02f, +9.832308780e-01f, -3.467157122e-02f }, - { -1.614860445e-03f, +5.272554398e-02f, +9.833254001e-01f, -3.459693287e-02f }, - { -1.607859036e-03f, +5.254825415e-02f, +9.834196603e-01f, -3.452216568e-02f }, - { -1.600872975e-03f, +5.237112079e-02f, +9.835136587e-01f, -3.444726959e-02f }, - { -1.593902249e-03f, +5.219414389e-02f, +9.836073950e-01f, -3.437224453e-02f }, - { -1.586946844e-03f, +5.201732345e-02f, +9.837008692e-01f, -3.429709044e-02f }, - { -1.580006747e-03f, +5.184065947e-02f, +9.837940814e-01f, -3.422180724e-02f }, - { -1.573081945e-03f, +5.166415193e-02f, +9.838870314e-01f, -3.414639488e-02f }, - { -1.566172424e-03f, +5.148780084e-02f, +9.839797191e-01f, -3.407085327e-02f }, - { -1.559278170e-03f, +5.131160618e-02f, +9.840721446e-01f, -3.399518237e-02f }, - { -1.552399171e-03f, +5.113556795e-02f, +9.841643077e-01f, -3.391938210e-02f }, - { -1.545535412e-03f, +5.095968615e-02f, +9.842562085e-01f, -3.384345240e-02f }, - { -1.538686881e-03f, +5.078396076e-02f, +9.843478467e-01f, -3.376739320e-02f }, - { -1.531853564e-03f, +5.060839177e-02f, +9.844392225e-01f, -3.369120443e-02f }, - { -1.525035446e-03f, +5.043297919e-02f, +9.845303356e-01f, -3.361488603e-02f }, - { -1.518232516e-03f, +5.025772301e-02f, +9.846211862e-01f, -3.353843793e-02f }, - { -1.511444759e-03f, +5.008262322e-02f, +9.847117740e-01f, -3.346186007e-02f }, - { -1.504672161e-03f, +4.990767980e-02f, +9.848020991e-01f, -3.338515239e-02f }, - { -1.497914710e-03f, +4.973289276e-02f, +9.848921614e-01f, -3.330831480e-02f }, - { -1.491172391e-03f, +4.955826209e-02f, +9.849819608e-01f, -3.323134726e-02f }, - { -1.484445192e-03f, +4.938378778e-02f, +9.850714973e-01f, -3.315424969e-02f }, - { -1.477733098e-03f, +4.920946982e-02f, +9.851607708e-01f, -3.307702203e-02f }, - { -1.471036096e-03f, +4.903530820e-02f, +9.852497812e-01f, -3.299966421e-02f }, - { -1.464354173e-03f, +4.886130292e-02f, +9.853385286e-01f, -3.292217617e-02f }, - { -1.457687314e-03f, +4.868745396e-02f, +9.854270129e-01f, -3.284455785e-02f }, - { -1.451035507e-03f, +4.851376133e-02f, +9.855152339e-01f, -3.276680917e-02f }, - { -1.444398738e-03f, +4.834022501e-02f, +9.856031917e-01f, -3.268893007e-02f }, - { -1.437776992e-03f, +4.816684499e-02f, +9.856908861e-01f, -3.261092049e-02f }, - { -1.431170257e-03f, +4.799362127e-02f, +9.857783172e-01f, -3.253278036e-02f }, - { -1.424578519e-03f, +4.782055384e-02f, +9.858654848e-01f, -3.245450962e-02f }, - { -1.418001764e-03f, +4.764764268e-02f, +9.859523890e-01f, -3.237610820e-02f }, - { -1.411439979e-03f, +4.747488779e-02f, +9.860390297e-01f, -3.229757604e-02f }, - { -1.404893149e-03f, +4.730228917e-02f, +9.861254067e-01f, -3.221891307e-02f }, - { -1.398361262e-03f, +4.712984679e-02f, +9.862115201e-01f, -3.214011922e-02f }, - { -1.391844303e-03f, +4.695756066e-02f, +9.862973698e-01f, -3.206119444e-02f }, - { -1.385342260e-03f, +4.678543077e-02f, +9.863829557e-01f, -3.198213866e-02f }, - { -1.378855117e-03f, +4.661345709e-02f, +9.864682779e-01f, -3.190295181e-02f }, - { -1.372382862e-03f, +4.644163964e-02f, +9.865533361e-01f, -3.182363382e-02f }, - { -1.365925481e-03f, +4.626997838e-02f, +9.866381305e-01f, -3.174418465e-02f }, - { -1.359482960e-03f, +4.609847333e-02f, +9.867226608e-01f, -3.166460421e-02f }, - { -1.353055286e-03f, +4.592712446e-02f, +9.868069272e-01f, -3.158489244e-02f }, - { -1.346642444e-03f, +4.575593177e-02f, +9.868909295e-01f, -3.150504929e-02f }, - { -1.340244422e-03f, +4.558489524e-02f, +9.869746676e-01f, -3.142507468e-02f }, - { -1.333861204e-03f, +4.541401487e-02f, +9.870581415e-01f, -3.134496856e-02f }, - { -1.327492778e-03f, +4.524329065e-02f, +9.871413513e-01f, -3.126473085e-02f }, - { -1.321139130e-03f, +4.507272256e-02f, +9.872242967e-01f, -3.118436150e-02f }, - { -1.314800245e-03f, +4.490231060e-02f, +9.873069778e-01f, -3.110386044e-02f }, - { -1.308476111e-03f, +4.473205475e-02f, +9.873893944e-01f, -3.102322761e-02f }, - { -1.302166714e-03f, +4.456195501e-02f, +9.874715467e-01f, -3.094246293e-02f }, - { -1.295872038e-03f, +4.439201136e-02f, +9.875534344e-01f, -3.086156636e-02f }, - { -1.289592072e-03f, +4.422222380e-02f, +9.876350576e-01f, -3.078053782e-02f }, - { -1.283326801e-03f, +4.405259231e-02f, +9.877164161e-01f, -3.069937725e-02f }, - { -1.277076211e-03f, +4.388311688e-02f, +9.877975101e-01f, -3.061808459e-02f }, - { -1.270840289e-03f, +4.371379750e-02f, +9.878783393e-01f, -3.053665977e-02f }, - { -1.264619020e-03f, +4.354463416e-02f, +9.879589037e-01f, -3.045510273e-02f }, - { -1.258412391e-03f, +4.337562684e-02f, +9.880392034e-01f, -3.037341341e-02f }, - { -1.252220388e-03f, +4.320677555e-02f, +9.881192381e-01f, -3.029159174e-02f }, - { -1.246042996e-03f, +4.303808025e-02f, +9.881990080e-01f, -3.020963766e-02f }, - { -1.239880203e-03f, +4.286954095e-02f, +9.882785129e-01f, -3.012755111e-02f }, - { -1.233731995e-03f, +4.270115763e-02f, +9.883577528e-01f, -3.004533202e-02f }, - { -1.227598357e-03f, +4.253293028e-02f, +9.884367276e-01f, -2.996298034e-02f }, - { -1.221479275e-03f, +4.236485889e-02f, +9.885154374e-01f, -2.988049599e-02f }, - { -1.215374737e-03f, +4.219694344e-02f, +9.885938819e-01f, -2.979787891e-02f }, - { -1.209284727e-03f, +4.202918393e-02f, +9.886720613e-01f, -2.971512904e-02f }, - { -1.203209232e-03f, +4.186158033e-02f, +9.887499753e-01f, -2.963224632e-02f }, - { -1.197148238e-03f, +4.169413264e-02f, +9.888276241e-01f, -2.954923069e-02f }, - { -1.191101731e-03f, +4.152684085e-02f, +9.889050075e-01f, -2.946608208e-02f }, - { -1.185069698e-03f, +4.135970494e-02f, +9.889821255e-01f, -2.938280043e-02f }, - { -1.179052123e-03f, +4.119272490e-02f, +9.890589780e-01f, -2.929938568e-02f }, - { -1.173048994e-03f, +4.102590072e-02f, +9.891355651e-01f, -2.921583776e-02f }, - { -1.167060297e-03f, +4.085923238e-02f, +9.892118865e-01f, -2.913215661e-02f }, - { -1.161086016e-03f, +4.069271988e-02f, +9.892879424e-01f, -2.904834218e-02f }, - { -1.155126140e-03f, +4.052636319e-02f, +9.893637326e-01f, -2.896439439e-02f }, - { -1.149180652e-03f, +4.036016230e-02f, +9.894392571e-01f, -2.888031318e-02f }, - { -1.143249541e-03f, +4.019411721e-02f, +9.895145159e-01f, -2.879609850e-02f }, - { -1.137332791e-03f, +4.002822789e-02f, +9.895895088e-01f, -2.871175028e-02f }, - { -1.131430388e-03f, +3.986249434e-02f, +9.896642360e-01f, -2.862726845e-02f }, - { -1.125542319e-03f, +3.969691653e-02f, +9.897386972e-01f, -2.854265296e-02f }, - { -1.119668570e-03f, +3.953149447e-02f, +9.898128925e-01f, -2.845790375e-02f }, - { -1.113809126e-03f, +3.936622812e-02f, +9.898868218e-01f, -2.837302075e-02f }, - { -1.107963974e-03f, +3.920111748e-02f, +9.899604850e-01f, -2.828800389e-02f }, - { -1.102133100e-03f, +3.903616254e-02f, +9.900338822e-01f, -2.820285313e-02f }, - { -1.096316489e-03f, +3.887136328e-02f, +9.901070133e-01f, -2.811756839e-02f }, - { -1.090514127e-03f, +3.870671968e-02f, +9.901798782e-01f, -2.803214962e-02f }, - { -1.084726001e-03f, +3.854223173e-02f, +9.902524768e-01f, -2.794659675e-02f }, - { -1.078952096e-03f, +3.837789942e-02f, +9.903248092e-01f, -2.786090972e-02f }, - { -1.073192399e-03f, +3.821372273e-02f, +9.903968753e-01f, -2.777508847e-02f }, - { -1.067446895e-03f, +3.804970164e-02f, +9.904686751e-01f, -2.768913294e-02f }, - { -1.061715570e-03f, +3.788583615e-02f, +9.905402084e-01f, -2.760304307e-02f }, - { -1.055998411e-03f, +3.772212623e-02f, +9.906114753e-01f, -2.751681879e-02f }, - { -1.050295402e-03f, +3.755857188e-02f, +9.906824756e-01f, -2.743046005e-02f }, - { -1.044606531e-03f, +3.739517307e-02f, +9.907532095e-01f, -2.734396678e-02f }, - { -1.038931782e-03f, +3.723192979e-02f, +9.908236768e-01f, -2.725733893e-02f }, - { -1.033271142e-03f, +3.706884203e-02f, +9.908938774e-01f, -2.717057642e-02f }, - { -1.027624597e-03f, +3.690590976e-02f, +9.909638114e-01f, -2.708367921e-02f }, - { -1.021992133e-03f, +3.674313298e-02f, +9.910334786e-01f, -2.699664722e-02f }, - { -1.016373735e-03f, +3.658051167e-02f, +9.911028791e-01f, -2.690948040e-02f }, - { -1.010769389e-03f, +3.641804581e-02f, +9.911720128e-01f, -2.682217869e-02f }, - { -1.005179082e-03f, +3.625573538e-02f, +9.912408796e-01f, -2.673474203e-02f }, - { -9.996027983e-04f, +3.609358038e-02f, +9.913094795e-01f, -2.664717035e-02f }, - { -9.940405249e-04f, +3.593158078e-02f, +9.913778125e-01f, -2.655946360e-02f }, - { -9.884922474e-04f, +3.576973656e-02f, +9.914458785e-01f, -2.647162171e-02f }, - { -9.829579515e-04f, +3.560804772e-02f, +9.915136775e-01f, -2.638364463e-02f }, - { -9.774376231e-04f, +3.544651423e-02f, +9.915812094e-01f, -2.629553230e-02f }, - { -9.719312480e-04f, +3.528513608e-02f, +9.916484743e-01f, -2.620728464e-02f }, - { -9.664388120e-04f, +3.512391325e-02f, +9.917154719e-01f, -2.611890161e-02f }, - { -9.609603011e-04f, +3.496284573e-02f, +9.917822024e-01f, -2.603038315e-02f }, - { -9.554957009e-04f, +3.480193349e-02f, +9.918486656e-01f, -2.594172918e-02f }, - { -9.500449974e-04f, +3.464117652e-02f, +9.919148616e-01f, -2.585293966e-02f }, - { -9.446081762e-04f, +3.448057480e-02f, +9.919807902e-01f, -2.576401452e-02f }, - { -9.391852233e-04f, +3.432012832e-02f, +9.920464515e-01f, -2.567495371e-02f }, - { -9.337761243e-04f, +3.415983706e-02f, +9.921118453e-01f, -2.558575716e-02f }, - { -9.283808652e-04f, +3.399970099e-02f, +9.921769718e-01f, -2.549642481e-02f }, - { -9.229994316e-04f, +3.383972011e-02f, +9.922418307e-01f, -2.540695661e-02f }, - { -9.176318093e-04f, +3.367989440e-02f, +9.923064221e-01f, -2.531735249e-02f }, - { -9.122779842e-04f, +3.352022383e-02f, +9.923707459e-01f, -2.522761239e-02f }, - { -9.069379419e-04f, +3.336070839e-02f, +9.924348021e-01f, -2.513773626e-02f }, - { -9.016116683e-04f, +3.320134807e-02f, +9.924985907e-01f, -2.504772404e-02f }, - { -8.962991490e-04f, +3.304214283e-02f, +9.925621116e-01f, -2.495757566e-02f }, - { -8.910003699e-04f, +3.288309267e-02f, +9.926253647e-01f, -2.486729107e-02f }, - { -8.857153167e-04f, +3.272419757e-02f, +9.926883501e-01f, -2.477687020e-02f }, - { -8.804439750e-04f, +3.256545750e-02f, +9.927510676e-01f, -2.468631300e-02f }, - { -8.751863308e-04f, +3.240687246e-02f, +9.928135173e-01f, -2.459561942e-02f }, - { -8.699423695e-04f, +3.224844242e-02f, +9.928756991e-01f, -2.450478938e-02f }, - { -8.647120771e-04f, +3.209016735e-02f, +9.929376130e-01f, -2.441382283e-02f }, - { -8.594954392e-04f, +3.193204725e-02f, +9.929992589e-01f, -2.432271972e-02f }, - { -8.542924415e-04f, +3.177408210e-02f, +9.930606368e-01f, -2.423147998e-02f }, - { -8.491030697e-04f, +3.161627187e-02f, +9.931217466e-01f, -2.414010355e-02f }, - { -8.439273095e-04f, +3.145861654e-02f, +9.931825884e-01f, -2.404859038e-02f }, - { -8.387651466e-04f, +3.130111610e-02f, +9.932431620e-01f, -2.395694040e-02f }, - { -8.336165668e-04f, +3.114377053e-02f, +9.933034675e-01f, -2.386515357e-02f }, - { -8.284815556e-04f, +3.098657981e-02f, +9.933635047e-01f, -2.377322981e-02f }, - { -8.233600987e-04f, +3.082954391e-02f, +9.934232738e-01f, -2.368116908e-02f }, - { -8.182521819e-04f, +3.067266283e-02f, +9.934827745e-01f, -2.358897131e-02f }, - { -8.131577908e-04f, +3.051593653e-02f, +9.935420069e-01f, -2.349663644e-02f }, - { -8.080769110e-04f, +3.035936500e-02f, +9.936009710e-01f, -2.340416442e-02f }, - { -8.030095283e-04f, +3.020294821e-02f, +9.936596666e-01f, -2.331155519e-02f }, - { -7.979556282e-04f, +3.004668616e-02f, +9.937180939e-01f, -2.321880869e-02f }, - { -7.929151965e-04f, +2.989057881e-02f, +9.937762527e-01f, -2.312592486e-02f }, - { -7.878882187e-04f, +2.973462615e-02f, +9.938341429e-01f, -2.303290364e-02f }, - { -7.828746805e-04f, +2.957882816e-02f, +9.938917647e-01f, -2.293974499e-02f }, - { -7.778745675e-04f, +2.942318481e-02f, +9.939491178e-01f, -2.284644883e-02f }, - { -7.728878654e-04f, +2.926769610e-02f, +9.940062023e-01f, -2.275301511e-02f }, - { -7.679145598e-04f, +2.911236198e-02f, +9.940630182e-01f, -2.265944377e-02f }, - { -7.629546363e-04f, +2.895718245e-02f, +9.941195654e-01f, -2.256573476e-02f }, - { -7.580080805e-04f, +2.880215748e-02f, +9.941758439e-01f, -2.247188802e-02f }, - { -7.530748780e-04f, +2.864728706e-02f, +9.942318536e-01f, -2.237790348e-02f }, - { -7.481550144e-04f, +2.849257115e-02f, +9.942875945e-01f, -2.228378110e-02f }, - { -7.432484754e-04f, +2.833800975e-02f, +9.943430666e-01f, -2.218952082e-02f }, - { -7.383552465e-04f, +2.818360282e-02f, +9.943982699e-01f, -2.209512257e-02f }, - { -7.334753133e-04f, +2.802935035e-02f, +9.944532042e-01f, -2.200058631e-02f }, - { -7.286086614e-04f, +2.787525232e-02f, +9.945078696e-01f, -2.190591197e-02f }, - { -7.237552763e-04f, +2.772130869e-02f, +9.945622660e-01f, -2.181109950e-02f }, - { -7.189151437e-04f, +2.756751946e-02f, +9.946163934e-01f, -2.171614883e-02f }, - { -7.140882492e-04f, +2.741388460e-02f, +9.946702518e-01f, -2.162105992e-02f }, - { -7.092745782e-04f, +2.726040409e-02f, +9.947238411e-01f, -2.152583271e-02f }, - { -7.044741164e-04f, +2.710707790e-02f, +9.947771613e-01f, -2.143046713e-02f }, - { -6.996868493e-04f, +2.695390602e-02f, +9.948302124e-01f, -2.133496314e-02f }, - { -6.949127625e-04f, +2.680088842e-02f, +9.948829943e-01f, -2.123932068e-02f }, - { -6.901518415e-04f, +2.664802507e-02f, +9.949355069e-01f, -2.114353968e-02f }, - { -6.854040719e-04f, +2.649531596e-02f, +9.949877504e-01f, -2.104762010e-02f }, - { -6.806694392e-04f, +2.634276107e-02f, +9.950397245e-01f, -2.095156187e-02f }, - { -6.759479289e-04f, +2.619036036e-02f, +9.950914294e-01f, -2.085536494e-02f }, - { -6.712395266e-04f, +2.603811383e-02f, +9.951428649e-01f, -2.075902926e-02f }, - { -6.665442179e-04f, +2.588602143e-02f, +9.951940310e-01f, -2.066255477e-02f }, - { -6.618619881e-04f, +2.573408316e-02f, +9.952449278e-01f, -2.056594140e-02f }, - { -6.571928229e-04f, +2.558229899e-02f, +9.952955551e-01f, -2.046918912e-02f }, - { -6.525367078e-04f, +2.543066889e-02f, +9.953459129e-01f, -2.037229785e-02f }, - { -6.478936283e-04f, +2.527919285e-02f, +9.953960012e-01f, -2.027526754e-02f }, - { -6.432635698e-04f, +2.512787083e-02f, +9.954458200e-01f, -2.017809815e-02f }, - { -6.386465180e-04f, +2.497670282e-02f, +9.954953692e-01f, -2.008078960e-02f }, - { -6.340424582e-04f, +2.482568879e-02f, +9.955446489e-01f, -1.998334185e-02f }, - { -6.294513760e-04f, +2.467482872e-02f, +9.955936589e-01f, -1.988575485e-02f }, - { -6.248732570e-04f, +2.452412258e-02f, +9.956423992e-01f, -1.978802853e-02f }, - { -6.203080865e-04f, +2.437357035e-02f, +9.956908698e-01f, -1.969016283e-02f }, - { -6.157558500e-04f, +2.422317200e-02f, +9.957390708e-01f, -1.959215772e-02f }, - { -6.112165332e-04f, +2.407292752e-02f, +9.957870019e-01f, -1.949401312e-02f }, - { -6.066901213e-04f, +2.392283688e-02f, +9.958346633e-01f, -1.939572898e-02f }, - { -6.021765999e-04f, +2.377290004e-02f, +9.958820549e-01f, -1.929730525e-02f }, - { -5.976759545e-04f, +2.362311700e-02f, +9.959291766e-01f, -1.919874188e-02f }, - { -5.931881705e-04f, +2.347348772e-02f, +9.959760285e-01f, -1.910003880e-02f }, - { -5.887132334e-04f, +2.332401218e-02f, +9.960226105e-01f, -1.900119597e-02f }, - { -5.842511287e-04f, +2.317469035e-02f, +9.960689225e-01f, -1.890221333e-02f }, - { -5.798018418e-04f, +2.302552221e-02f, +9.961149645e-01f, -1.880309082e-02f }, - { -5.753653581e-04f, +2.287650774e-02f, +9.961607366e-01f, -1.870382839e-02f }, - { -5.709416631e-04f, +2.272764690e-02f, +9.962062387e-01f, -1.860442598e-02f }, - { -5.665307423e-04f, +2.257893968e-02f, +9.962514707e-01f, -1.850488354e-02f }, - { -5.621325811e-04f, +2.243038605e-02f, +9.962964326e-01f, -1.840520102e-02f }, - { -5.577471650e-04f, +2.228198598e-02f, +9.963411244e-01f, -1.830537836e-02f }, - { -5.533744792e-04f, +2.213373945e-02f, +9.963855461e-01f, -1.820541550e-02f }, - { -5.490145094e-04f, +2.198564643e-02f, +9.964296976e-01f, -1.810531240e-02f }, - { -5.446672410e-04f, +2.183770690e-02f, +9.964735789e-01f, -1.800506899e-02f }, - { -5.403326592e-04f, +2.168992083e-02f, +9.965171900e-01f, -1.790468523e-02f }, - { -5.360107497e-04f, +2.154228819e-02f, +9.965605309e-01f, -1.780416106e-02f }, - { -5.317014977e-04f, +2.139480896e-02f, +9.966036014e-01f, -1.770349642e-02f }, - { -5.274048887e-04f, +2.124748312e-02f, +9.966464017e-01f, -1.760269126e-02f }, - { -5.231209082e-04f, +2.110031063e-02f, +9.966889317e-01f, -1.750174553e-02f }, - { -5.188495414e-04f, +2.095329147e-02f, +9.967311913e-01f, -1.740065918e-02f }, - { -5.145907739e-04f, +2.080642562e-02f, +9.967731805e-01f, -1.729943214e-02f }, - { -5.103445911e-04f, +2.065971304e-02f, +9.968148993e-01f, -1.719806437e-02f }, - { -5.061109782e-04f, +2.051315372e-02f, +9.968563476e-01f, -1.709655581e-02f }, - { -5.018899208e-04f, +2.036674762e-02f, +9.968975255e-01f, -1.699490642e-02f }, - { -4.976814042e-04f, +2.022049471e-02f, +9.969384329e-01f, -1.689311613e-02f }, - { -4.934854139e-04f, +2.007439498e-02f, +9.969790698e-01f, -1.679118489e-02f }, - { -4.893019351e-04f, +1.992844839e-02f, +9.970194362e-01f, -1.668911265e-02f }, - { -4.851309533e-04f, +1.978265492e-02f, +9.970595319e-01f, -1.658689935e-02f }, - { -4.809724538e-04f, +1.963701453e-02f, +9.970993571e-01f, -1.648454495e-02f }, - { -4.768264221e-04f, +1.949152721e-02f, +9.971389117e-01f, -1.638204939e-02f }, - { -4.726928435e-04f, +1.934619292e-02f, +9.971781956e-01f, -1.627941262e-02f }, - { -4.685717034e-04f, +1.920101164e-02f, +9.972172089e-01f, -1.617663458e-02f }, - { -4.644629872e-04f, +1.905598334e-02f, +9.972559515e-01f, -1.607371522e-02f }, - { -4.603666801e-04f, +1.891110799e-02f, +9.972944233e-01f, -1.597065449e-02f }, - { -4.562827677e-04f, +1.876638556e-02f, +9.973326244e-01f, -1.586745234e-02f }, - { -4.522112352e-04f, +1.862181603e-02f, +9.973705548e-01f, -1.576410871e-02f }, - { -4.481520680e-04f, +1.847739937e-02f, +9.974082143e-01f, -1.566062355e-02f }, - { -4.441052515e-04f, +1.833313554e-02f, +9.974456031e-01f, -1.555699680e-02f }, - { -4.400707710e-04f, +1.818902453e-02f, +9.974827210e-01f, -1.545322843e-02f }, - { -4.360486119e-04f, +1.804506631e-02f, +9.975195680e-01f, -1.534931837e-02f }, - { -4.320387594e-04f, +1.790126083e-02f, +9.975561442e-01f, -1.524526657e-02f }, - { -4.280411991e-04f, +1.775760809e-02f, +9.975924494e-01f, -1.514107297e-02f }, - { -4.240559161e-04f, +1.761410804e-02f, +9.976284837e-01f, -1.503673754e-02f }, - { -4.200828959e-04f, +1.747076066e-02f, +9.976642471e-01f, -1.493226021e-02f }, - { -4.161221238e-04f, +1.732756592e-02f, +9.976997395e-01f, -1.482764093e-02f }, - { -4.121735850e-04f, +1.718452380e-02f, +9.977349608e-01f, -1.472287966e-02f }, - { -4.082372651e-04f, +1.704163425e-02f, +9.977699112e-01f, -1.461797634e-02f }, - { -4.043131492e-04f, +1.689889726e-02f, +9.978045905e-01f, -1.451293091e-02f }, - { -4.004012227e-04f, +1.675631280e-02f, +9.978389988e-01f, -1.440774333e-02f }, - { -3.965014710e-04f, +1.661388082e-02f, +9.978731359e-01f, -1.430241355e-02f }, - { -3.926138794e-04f, +1.647160132e-02f, +9.979070020e-01f, -1.419694151e-02f }, - { -3.887384331e-04f, +1.632947425e-02f, +9.979405969e-01f, -1.409132716e-02f }, - { -3.848751175e-04f, +1.618749959e-02f, +9.979739207e-01f, -1.398557045e-02f }, - { -3.810239179e-04f, +1.604567730e-02f, +9.980069732e-01f, -1.387967133e-02f }, - { -3.771848197e-04f, +1.590400737e-02f, +9.980397546e-01f, -1.377362975e-02f }, - { -3.733578082e-04f, +1.576248975e-02f, +9.980722648e-01f, -1.366744566e-02f }, - { -3.695428686e-04f, +1.562112441e-02f, +9.981045038e-01f, -1.356111900e-02f }, - { -3.657399862e-04f, +1.547991134e-02f, +9.981364714e-01f, -1.345464973e-02f }, - { -3.619491465e-04f, +1.533885049e-02f, +9.981681678e-01f, -1.334803780e-02f }, - { -3.581703346e-04f, +1.519794184e-02f, +9.981995929e-01f, -1.324128315e-02f }, - { -3.544035359e-04f, +1.505718535e-02f, +9.982307467e-01f, -1.313438573e-02f }, - { -3.506487357e-04f, +1.491658101e-02f, +9.982616292e-01f, -1.302734550e-02f }, - { -3.469059193e-04f, +1.477612876e-02f, +9.982922403e-01f, -1.292016240e-02f }, - { -3.431750720e-04f, +1.463582860e-02f, +9.983225800e-01f, -1.281283638e-02f }, - { -3.394561791e-04f, +1.449568047e-02f, +9.983526483e-01f, -1.270536739e-02f }, - { -3.357492258e-04f, +1.435568436e-02f, +9.983824452e-01f, -1.259775538e-02f }, - { -3.320541975e-04f, +1.421584024e-02f, +9.984119707e-01f, -1.249000030e-02f }, - { -3.283710794e-04f, +1.407614806e-02f, +9.984412247e-01f, -1.238210211e-02f }, - { -3.246998569e-04f, +1.393660781e-02f, +9.984702072e-01f, -1.227406075e-02f }, - { -3.210405152e-04f, +1.379721944e-02f, +9.984989183e-01f, -1.216587616e-02f }, - { -3.173930397e-04f, +1.365798293e-02f, +9.985273578e-01f, -1.205754831e-02f }, - { -3.137574155e-04f, +1.351889825e-02f, +9.985555259e-01f, -1.194907714e-02f }, - { -3.101336280e-04f, +1.337996537e-02f, +9.985834223e-01f, -1.184046260e-02f }, - { -3.065216624e-04f, +1.324118424e-02f, +9.986110473e-01f, -1.173170465e-02f }, - { -3.029215041e-04f, +1.310255485e-02f, +9.986384006e-01f, -1.162280322e-02f }, - { -2.993331383e-04f, +1.296407716e-02f, +9.986654823e-01f, -1.151375828e-02f }, - { -2.957565503e-04f, +1.282575114e-02f, +9.986922924e-01f, -1.140456977e-02f }, - { -2.921917254e-04f, +1.268757675e-02f, +9.987188309e-01f, -1.129523765e-02f }, - { -2.886386488e-04f, +1.254955397e-02f, +9.987450978e-01f, -1.118576186e-02f }, - { -2.850973058e-04f, +1.241168275e-02f, +9.987710929e-01f, -1.107614236e-02f }, - { -2.815676816e-04f, +1.227396308e-02f, +9.987968164e-01f, -1.096637910e-02f }, - { -2.780497616e-04f, +1.213639492e-02f, +9.988222682e-01f, -1.085647202e-02f }, - { -2.745435310e-04f, +1.199897823e-02f, +9.988474483e-01f, -1.074642108e-02f }, - { -2.710489751e-04f, +1.186171298e-02f, +9.988723567e-01f, -1.063622623e-02f }, - { -2.675660791e-04f, +1.172459914e-02f, +9.988969933e-01f, -1.052588743e-02f }, - { -2.640948284e-04f, +1.158763668e-02f, +9.989213581e-01f, -1.041540461e-02f }, - { -2.606352080e-04f, +1.145082556e-02f, +9.989454512e-01f, -1.030477774e-02f }, - { -2.571872034e-04f, +1.131416575e-02f, +9.989692724e-01f, -1.019400677e-02f }, - { -2.537507998e-04f, +1.117765722e-02f, +9.989928219e-01f, -1.008309164e-02f }, - { -2.503259824e-04f, +1.104129994e-02f, +9.990160995e-01f, -9.972032308e-03f }, - { -2.469127365e-04f, +1.090509386e-02f, +9.990391053e-01f, -9.860828729e-03f }, - { -2.435110474e-04f, +1.076903897e-02f, +9.990618393e-01f, -9.749480853e-03f }, - { -2.401209002e-04f, +1.063313522e-02f, +9.990843014e-01f, -9.637988631e-03f }, - { -2.367422804e-04f, +1.049738258e-02f, +9.991064916e-01f, -9.526352014e-03f }, - { -2.333751730e-04f, +1.036178102e-02f, +9.991284099e-01f, -9.414570956e-03f }, - { -2.300195634e-04f, +1.022633050e-02f, +9.991500563e-01f, -9.302645409e-03f }, - { -2.266754367e-04f, +1.009103099e-02f, +9.991714307e-01f, -9.190575323e-03f }, - { -2.233427784e-04f, +9.955882461e-03f, +9.991925333e-01f, -9.078360653e-03f }, - { -2.200215735e-04f, +9.820884872e-03f, +9.992133639e-01f, -8.966001349e-03f }, - { -2.167118075e-04f, +9.686038192e-03f, +9.992339225e-01f, -8.853497366e-03f }, - { -2.134134654e-04f, +9.551342385e-03f, +9.992542091e-01f, -8.740848654e-03f }, - { -2.101265325e-04f, +9.416797418e-03f, +9.992742238e-01f, -8.628055168e-03f }, - { -2.068509942e-04f, +9.282403256e-03f, +9.992939664e-01f, -8.515116858e-03f }, - { -2.035868356e-04f, +9.148159865e-03f, +9.993134371e-01f, -8.402033679e-03f }, - { -2.003340419e-04f, +9.014067211e-03f, +9.993326357e-01f, -8.288805583e-03f }, - { -1.970925985e-04f, +8.880125258e-03f, +9.993515622e-01f, -8.175432524e-03f }, - { -1.938624906e-04f, +8.746333973e-03f, +9.993702168e-01f, -8.061914453e-03f }, - { -1.906437034e-04f, +8.612693320e-03f, +9.993885992e-01f, -7.948251325e-03f }, - { -1.874362221e-04f, +8.479203263e-03f, +9.994067096e-01f, -7.834443092e-03f }, - { -1.842400320e-04f, +8.345863769e-03f, +9.994245479e-01f, -7.720489707e-03f }, - { -1.810551183e-04f, +8.212674803e-03f, +9.994421141e-01f, -7.606391125e-03f }, - { -1.778814663e-04f, +8.079636328e-03f, +9.994594082e-01f, -7.492147298e-03f }, - { -1.747190612e-04f, +7.946748310e-03f, +9.994764302e-01f, -7.377758181e-03f }, - { -1.715678882e-04f, +7.814010713e-03f, +9.994931800e-01f, -7.263223725e-03f }, - { -1.684279326e-04f, +7.681423501e-03f, +9.995096577e-01f, -7.148543887e-03f }, - { -1.652991797e-04f, +7.548986640e-03f, +9.995258632e-01f, -7.033718618e-03f }, - { -1.621816145e-04f, +7.416700094e-03f, +9.995417966e-01f, -6.918747873e-03f }, - { -1.590752225e-04f, +7.284563826e-03f, +9.995574578e-01f, -6.803631606e-03f }, - { -1.559799888e-04f, +7.152577801e-03f, +9.995728468e-01f, -6.688369772e-03f }, - { -1.528958987e-04f, +7.020741983e-03f, +9.995879637e-01f, -6.572962323e-03f }, - { -1.498229373e-04f, +6.889056337e-03f, +9.996028083e-01f, -6.457409214e-03f }, - { -1.467610900e-04f, +6.757520824e-03f, +9.996173807e-01f, -6.341710400e-03f }, - { -1.437103420e-04f, +6.626135411e-03f, +9.996316809e-01f, -6.225865834e-03f }, - { -1.406706784e-04f, +6.494900059e-03f, +9.996457089e-01f, -6.109875472e-03f }, - { -1.376420846e-04f, +6.363814734e-03f, +9.996594646e-01f, -5.993739268e-03f }, - { -1.346245458e-04f, +6.232879398e-03f, +9.996729481e-01f, -5.877457176e-03f }, - { -1.316180471e-04f, +6.102094014e-03f, +9.996861593e-01f, -5.761029151e-03f }, - { -1.286225739e-04f, +5.971458547e-03f, +9.996990983e-01f, -5.644455148e-03f }, - { -1.256381113e-04f, +5.840972959e-03f, +9.997117650e-01f, -5.527735122e-03f }, - { -1.226646447e-04f, +5.710637213e-03f, +9.997241594e-01f, -5.410869028e-03f }, - { -1.197021592e-04f, +5.580451273e-03f, +9.997362815e-01f, -5.293856820e-03f }, - { -1.167506400e-04f, +5.450415101e-03f, +9.997481313e-01f, -5.176698454e-03f }, - { -1.138100725e-04f, +5.320528660e-03f, +9.997597089e-01f, -5.059393885e-03f }, - { -1.108804418e-04f, +5.190791913e-03f, +9.997710141e-01f, -4.941943068e-03f }, - { -1.079617332e-04f, +5.061204824e-03f, +9.997820469e-01f, -4.824345959e-03f }, - { -1.050539318e-04f, +4.931767353e-03f, +9.997928075e-01f, -4.706602513e-03f }, - { -1.021570230e-04f, +4.802479464e-03f, +9.998032957e-01f, -4.588712686e-03f }, - { -9.927099199e-05f, +4.673341119e-03f, +9.998135116e-01f, -4.470676433e-03f }, - { -9.639582397e-05f, +4.544352281e-03f, +9.998234552e-01f, -4.352493710e-03f }, - { -9.353150418e-05f, +4.415512912e-03f, +9.998331264e-01f, -4.234164473e-03f }, - { -9.067801786e-05f, +4.286822973e-03f, +9.998425252e-01f, -4.115688677e-03f }, - { -8.783535025e-05f, +4.158282427e-03f, +9.998516517e-01f, -3.997066279e-03f }, - { -8.500348659e-05f, +4.029891236e-03f, +9.998605058e-01f, -3.878297235e-03f }, - { -8.218241209e-05f, +3.901649361e-03f, +9.998690875e-01f, -3.759381500e-03f }, - { -7.937211202e-05f, +3.773556765e-03f, +9.998773969e-01f, -3.640319031e-03f }, - { -7.657257158e-05f, +3.645613409e-03f, +9.998854338e-01f, -3.521109785e-03f }, - { -7.378377604e-05f, +3.517819255e-03f, +9.998931984e-01f, -3.401753717e-03f }, - { -7.100571061e-05f, +3.390174264e-03f, +9.999006906e-01f, -3.282250785e-03f }, - { -6.823836055e-05f, +3.262678397e-03f, +9.999079103e-01f, -3.162600944e-03f }, - { -6.548171107e-05f, +3.135331617e-03f, +9.999148577e-01f, -3.042804151e-03f }, - { -6.273574744e-05f, +3.008133883e-03f, +9.999215326e-01f, -2.922860364e-03f }, - { -6.000045487e-05f, +2.881085158e-03f, +9.999279352e-01f, -2.802769538e-03f }, - { -5.727581862e-05f, +2.754185402e-03f, +9.999340653e-01f, -2.682531632e-03f }, - { -5.456182391e-05f, +2.627434576e-03f, +9.999399230e-01f, -2.562146601e-03f }, - { -5.185845600e-05f, +2.500832641e-03f, +9.999455083e-01f, -2.441614402e-03f }, - { -4.916570012e-05f, +2.374379558e-03f, +9.999508211e-01f, -2.320934994e-03f }, - { -4.648354151e-05f, +2.248075287e-03f, +9.999558615e-01f, -2.200108333e-03f }, - { -4.381196542e-05f, +2.121919790e-03f, +9.999606295e-01f, -2.079134377e-03f }, - { -4.115095708e-05f, +1.995913026e-03f, +9.999651250e-01f, -1.958013083e-03f }, - { -3.850050175e-05f, +1.870054956e-03f, +9.999693481e-01f, -1.836744408e-03f }, - { -3.586058466e-05f, +1.744345541e-03f, +9.999732988e-01f, -1.715328311e-03f }, - { -3.323119106e-05f, +1.618784740e-03f, +9.999769770e-01f, -1.593764748e-03f }, - { -3.061230620e-05f, +1.493372514e-03f, +9.999803827e-01f, -1.472053677e-03f }, - { -2.800391533e-05f, +1.368108822e-03f, +9.999835160e-01f, -1.350195058e-03f }, - { -2.540600368e-05f, +1.242993626e-03f, +9.999863768e-01f, -1.228188846e-03f }, - { -2.281855651e-05f, +1.118026884e-03f, +9.999889652e-01f, -1.106035001e-03f }, - { -2.024155907e-05f, +9.932085563e-04f, +9.999912812e-01f, -9.837334803e-04f }, - { -1.767499661e-05f, +8.685386028e-04f, +9.999933246e-01f, -8.612842424e-04f }, - { -1.511885438e-05f, +7.440169831e-04f, +9.999950956e-01f, -7.386872455e-04f }, - { -1.257311763e-05f, +6.196436566e-04f, +9.999965942e-01f, -6.159424479e-04f }, - { -1.003777162e-05f, +4.954185828e-04f, +9.999978203e-01f, -4.930498082e-04f }, - { -7.512801591e-06f, +3.713417210e-04f, +9.999987739e-01f, -3.700092848e-04f }, - { -4.998192808e-06f, +2.474130305e-04f, +9.999994551e-01f, -2.468208365e-04f }, - { -2.493930525e-06f, +1.236324705e-04f, +9.999998638e-01f, -1.234844220e-04f }, -}; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/chorus.c b/love/src/jni/openal-soft-1.18.2/Alc/effects/chorus.c deleted file mode 100644 index f4383aa5..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/chorus.c +++ /dev/null @@ -1,410 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2013 by Mike Gorchak - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alFilter.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" - - -enum ChorusWaveForm { - CWF_Triangle = AL_CHORUS_WAVEFORM_TRIANGLE, - CWF_Sinusoid = AL_CHORUS_WAVEFORM_SINUSOID -}; - -typedef struct ALchorusState { - DERIVE_FROM_TYPE(ALeffectState); - - ALfloat *SampleBuffer[2]; - ALsizei BufferLength; - ALsizei offset; - ALsizei lfo_range; - ALfloat lfo_scale; - ALint lfo_disp; - - /* Gains for left and right sides */ - ALfloat Gain[2][MAX_OUTPUT_CHANNELS]; - - /* effect parameters */ - enum ChorusWaveForm waveform; - ALint delay; - ALfloat depth; - ALfloat feedback; -} ALchorusState; - -static ALvoid ALchorusState_Destruct(ALchorusState *state); -static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device); -static ALvoid ALchorusState_update(ALchorusState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); -static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALchorusState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALchorusState); - - -static void ALchorusState_Construct(ALchorusState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALchorusState, ALeffectState, state); - - state->BufferLength = 0; - state->SampleBuffer[0] = NULL; - state->SampleBuffer[1] = NULL; - state->offset = 0; - state->lfo_range = 1; - state->waveform = CWF_Triangle; -} - -static ALvoid ALchorusState_Destruct(ALchorusState *state) -{ - al_free(state->SampleBuffer[0]); - state->SampleBuffer[0] = NULL; - state->SampleBuffer[1] = NULL; - - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device) -{ - ALsizei maxlen; - ALsizei it; - - maxlen = fastf2i(AL_CHORUS_MAX_DELAY * 2.0f * Device->Frequency) + 1; - maxlen = NextPowerOf2(maxlen); - - if(maxlen != state->BufferLength) - { - void *temp = al_calloc(16, maxlen * sizeof(ALfloat) * 2); - if(!temp) return AL_FALSE; - - al_free(state->SampleBuffer[0]); - state->SampleBuffer[0] = temp; - state->SampleBuffer[1] = state->SampleBuffer[0] + maxlen; - - state->BufferLength = maxlen; - } - - for(it = 0;it < state->BufferLength;it++) - { - state->SampleBuffer[0][it] = 0.0f; - state->SampleBuffer[1][it] = 0.0f; - } - - return AL_TRUE; -} - -static ALvoid ALchorusState_update(ALchorusState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) -{ - ALfloat frequency = (ALfloat)Device->Frequency; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat rate; - ALint phase; - - switch(props->Chorus.Waveform) - { - case AL_CHORUS_WAVEFORM_TRIANGLE: - state->waveform = CWF_Triangle; - break; - case AL_CHORUS_WAVEFORM_SINUSOID: - state->waveform = CWF_Sinusoid; - break; - } - state->feedback = props->Chorus.Feedback; - state->delay = fastf2i(props->Chorus.Delay * frequency); - /* The LFO depth is scaled to be relative to the sample delay. */ - state->depth = props->Chorus.Depth * state->delay; - - /* Gains for left and right sides */ - CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs); - ComputePanningGains(Device->Dry, coeffs, Slot->Params.Gain, state->Gain[0]); - CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs); - ComputePanningGains(Device->Dry, coeffs, Slot->Params.Gain, state->Gain[1]); - - phase = props->Chorus.Phase; - rate = props->Chorus.Rate; - if(!(rate > 0.0f)) - { - state->lfo_scale = 0.0f; - state->lfo_range = 1; - state->lfo_disp = 0; - } - else - { - /* Calculate LFO coefficient */ - state->lfo_range = fastf2i(frequency/rate + 0.5f); - switch(state->waveform) - { - case CWF_Triangle: - state->lfo_scale = 4.0f / state->lfo_range; - break; - case CWF_Sinusoid: - state->lfo_scale = F_TAU / state->lfo_range; - break; - } - - /* Calculate lfo phase displacement */ - if(phase >= 0) - state->lfo_disp = fastf2i(state->lfo_range * (phase/360.0f)); - else - state->lfo_disp = fastf2i(state->lfo_range * ((360+phase)/360.0f)); - } -} - -static void GetTriangleDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i((1.0f - fabsf(2.0f - lfo_scale*offset)) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - -static void GetSinusoidDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i(sinf(lfo_scale*offset) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - - -static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALfloat *restrict leftbuf = state->SampleBuffer[0]; - ALfloat *restrict rightbuf = state->SampleBuffer[1]; - const ALsizei bufmask = state->BufferLength-1; - const ALfloat feedback = state->feedback; - ALsizei offset = state->offset; - ALsizei i, c; - ALsizei base; - - for(base = 0;base < SamplesToDo;) - { - const ALsizei todo = mini(128, SamplesToDo-base); - ALfloat temps[128][2]; - ALint moddelays[2][128]; - - switch(state->waveform) - { - case CWF_Triangle: - GetTriangleDelays(moddelays[0], offset%state->lfo_range, state->lfo_range, - state->lfo_scale, state->depth, state->delay, todo); - GetTriangleDelays(moddelays[1], (offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - break; - case CWF_Sinusoid: - GetSinusoidDelays(moddelays[0], offset%state->lfo_range, state->lfo_range, - state->lfo_scale, state->depth, state->delay, todo); - GetSinusoidDelays(moddelays[1], (offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - break; - } - - for(i = 0;i < todo;i++) - { - leftbuf[offset&bufmask] = SamplesIn[0][base+i]; - temps[i][0] = leftbuf[(offset-moddelays[0][i])&bufmask] * feedback; - leftbuf[offset&bufmask] += temps[i][0]; - - rightbuf[offset&bufmask] = SamplesIn[0][base+i]; - temps[i][1] = rightbuf[(offset-moddelays[1][i])&bufmask] * feedback; - rightbuf[offset&bufmask] += temps[i][1]; - - offset++; - } - - for(c = 0;c < NumChannels;c++) - { - ALfloat gain = state->Gain[0][c]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < todo;i++) - SamplesOut[c][i+base] += temps[i][0] * gain; - } - - gain = state->Gain[1][c]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < todo;i++) - SamplesOut[c][i+base] += temps[i][1] * gain; - } - } - - base += todo; - } - - state->offset = offset; -} - - -typedef struct ALchorusStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALchorusStateFactory; - -static ALeffectState *ALchorusStateFactory_create(ALchorusStateFactory *UNUSED(factory)) -{ - ALchorusState *state; - - NEW_OBJ0(state, ALchorusState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALchorusStateFactory); - - -ALeffectStateFactory *ALchorusStateFactory_getFactory(void) -{ - static ALchorusStateFactory ChorusFactory = { { GET_VTABLE2(ALchorusStateFactory, ALeffectStateFactory) } }; - - return STATIC_CAST(ALeffectStateFactory, &ChorusFactory); -} - - -void ALchorus_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_WAVEFORM: - if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Waveform = val; - break; - - case AL_CHORUS_PHASE: - if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Phase = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALchorus_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALchorus_setParami(effect, context, param, vals[0]); -} -void ALchorus_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_RATE: - if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Rate = val; - break; - - case AL_CHORUS_DEPTH: - if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Depth = val; - break; - - case AL_CHORUS_FEEDBACK: - if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Feedback = val; - break; - - case AL_CHORUS_DELAY: - if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Chorus.Delay = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALchorus_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALchorus_setParamf(effect, context, param, vals[0]); -} - -void ALchorus_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_WAVEFORM: - *val = props->Chorus.Waveform; - break; - - case AL_CHORUS_PHASE: - *val = props->Chorus.Phase; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALchorus_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALchorus_getParami(effect, context, param, vals); -} -void ALchorus_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_CHORUS_RATE: - *val = props->Chorus.Rate; - break; - - case AL_CHORUS_DEPTH: - *val = props->Chorus.Depth; - break; - - case AL_CHORUS_FEEDBACK: - *val = props->Chorus.Feedback; - break; - - case AL_CHORUS_DELAY: - *val = props->Chorus.Delay; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALchorus_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALchorus_getParamf(effect, context, param, vals); -} - -DEFINE_ALEFFECT_VTABLE(ALchorus); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/flanger.c b/love/src/jni/openal-soft-1.18.2/Alc/effects/flanger.c deleted file mode 100644 index b25b95cc..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/flanger.c +++ /dev/null @@ -1,408 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2013 by Mike Gorchak - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include - -#include "alMain.h" -#include "alFilter.h" -#include "alAuxEffectSlot.h" -#include "alError.h" -#include "alu.h" - - -enum FlangerWaveForm { - FWF_Triangle = AL_FLANGER_WAVEFORM_TRIANGLE, - FWF_Sinusoid = AL_FLANGER_WAVEFORM_SINUSOID -}; - -typedef struct ALflangerState { - DERIVE_FROM_TYPE(ALeffectState); - - ALfloat *SampleBuffer[2]; - ALsizei BufferLength; - ALsizei offset; - ALsizei lfo_range; - ALfloat lfo_scale; - ALint lfo_disp; - - /* Gains for left and right sides */ - ALfloat Gain[2][MAX_OUTPUT_CHANNELS]; - - /* effect parameters */ - enum FlangerWaveForm waveform; - ALint delay; - ALfloat depth; - ALfloat feedback; -} ALflangerState; - -static ALvoid ALflangerState_Destruct(ALflangerState *state); -static ALboolean ALflangerState_deviceUpdate(ALflangerState *state, ALCdevice *Device); -static ALvoid ALflangerState_update(ALflangerState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); -static ALvoid ALflangerState_process(ALflangerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALflangerState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALflangerState); - - -static void ALflangerState_Construct(ALflangerState *state) -{ - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALflangerState, ALeffectState, state); - - state->BufferLength = 0; - state->SampleBuffer[0] = NULL; - state->SampleBuffer[1] = NULL; - state->offset = 0; - state->lfo_range = 1; - state->waveform = FWF_Triangle; -} - -static ALvoid ALflangerState_Destruct(ALflangerState *state) -{ - al_free(state->SampleBuffer[0]); - state->SampleBuffer[0] = NULL; - state->SampleBuffer[1] = NULL; - - ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); -} - -static ALboolean ALflangerState_deviceUpdate(ALflangerState *state, ALCdevice *Device) -{ - ALsizei maxlen; - ALsizei it; - - maxlen = fastf2i(AL_FLANGER_MAX_DELAY * 2.0f * Device->Frequency) + 1; - maxlen = NextPowerOf2(maxlen); - - if(maxlen != state->BufferLength) - { - void *temp = al_calloc(16, maxlen * sizeof(ALfloat) * 2); - if(!temp) return AL_FALSE; - - al_free(state->SampleBuffer[0]); - state->SampleBuffer[0] = temp; - state->SampleBuffer[1] = state->SampleBuffer[0] + maxlen; - - state->BufferLength = maxlen; - } - - for(it = 0;it < state->BufferLength;it++) - { - state->SampleBuffer[0][it] = 0.0f; - state->SampleBuffer[1][it] = 0.0f; - } - - return AL_TRUE; -} - -static ALvoid ALflangerState_update(ALflangerState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) -{ - ALfloat frequency = (ALfloat)Device->Frequency; - ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat rate; - ALint phase; - - switch(props->Flanger.Waveform) - { - case AL_FLANGER_WAVEFORM_TRIANGLE: - state->waveform = FWF_Triangle; - break; - case AL_FLANGER_WAVEFORM_SINUSOID: - state->waveform = FWF_Sinusoid; - break; - } - state->feedback = props->Flanger.Feedback; - state->delay = fastf2i(props->Flanger.Delay * frequency); - /* The LFO depth is scaled to be relative to the sample delay. */ - state->depth = props->Flanger.Depth * state->delay; - - /* Gains for left and right sides */ - CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs); - ComputePanningGains(Device->Dry, coeffs, Slot->Params.Gain, state->Gain[0]); - CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs); - ComputePanningGains(Device->Dry, coeffs, Slot->Params.Gain, state->Gain[1]); - - phase = props->Flanger.Phase; - rate = props->Flanger.Rate; - if(!(rate > 0.0f)) - { - state->lfo_scale = 0.0f; - state->lfo_range = 1; - state->lfo_disp = 0; - } - else - { - /* Calculate LFO coefficient */ - state->lfo_range = fastf2i(frequency/rate + 0.5f); - switch(state->waveform) - { - case FWF_Triangle: - state->lfo_scale = 4.0f / state->lfo_range; - break; - case FWF_Sinusoid: - state->lfo_scale = F_TAU / state->lfo_range; - break; - } - - /* Calculate lfo phase displacement */ - if(phase >= 0) - state->lfo_disp = fastf2i(state->lfo_range * (phase/360.0f)); - else - state->lfo_disp = fastf2i(state->lfo_range * ((360+phase)/360.0f)); - } -} - -static void GetTriangleDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i((1.0f - fabsf(2.0f - lfo_scale*offset)) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - -static void GetSinusoidDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, - const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, - const ALsizei todo) -{ - ALsizei i; - for(i = 0;i < todo;i++) - { - delays[i] = fastf2i(sinf(lfo_scale*offset) * depth) + delay; - offset = (offset+1)%lfo_range; - } -} - -static ALvoid ALflangerState_process(ALflangerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ALfloat *restrict leftbuf = state->SampleBuffer[0]; - ALfloat *restrict rightbuf = state->SampleBuffer[1]; - const ALsizei bufmask = state->BufferLength-1; - const ALfloat feedback = state->feedback; - ALsizei offset = state->offset; - ALsizei i, c; - ALsizei base; - - for(base = 0;base < SamplesToDo;) - { - const ALsizei todo = mini(128, SamplesToDo-base); - ALfloat temps[128][2]; - ALint moddelays[2][128]; - - switch(state->waveform) - { - case FWF_Triangle: - GetTriangleDelays(moddelays[0], offset%state->lfo_range, state->lfo_range, - state->lfo_scale, state->depth, state->delay, todo); - GetTriangleDelays(moddelays[1], (offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - break; - case FWF_Sinusoid: - GetSinusoidDelays(moddelays[0], offset%state->lfo_range, state->lfo_range, - state->lfo_scale, state->depth, state->delay, todo); - GetSinusoidDelays(moddelays[1], (offset+state->lfo_disp)%state->lfo_range, - state->lfo_range, state->lfo_scale, state->depth, state->delay, - todo); - break; - } - - for(i = 0;i < todo;i++) - { - leftbuf[offset&bufmask] = SamplesIn[0][base+i]; - temps[i][0] = leftbuf[(offset-moddelays[0][i])&bufmask] * feedback; - leftbuf[offset&bufmask] += temps[i][0]; - - rightbuf[offset&bufmask] = SamplesIn[0][base+i]; - temps[i][1] = rightbuf[(offset-moddelays[1][i])&bufmask] * feedback; - rightbuf[offset&bufmask] += temps[i][1]; - - offset++; - } - - for(c = 0;c < NumChannels;c++) - { - ALfloat gain = state->Gain[0][c]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < todo;i++) - SamplesOut[c][i+base] += temps[i][0] * gain; - } - - gain = state->Gain[1][c]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < todo;i++) - SamplesOut[c][i+base] += temps[i][1] * gain; - } - } - - base += todo; - } - - state->offset = offset; -} - - -typedef struct ALflangerStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALflangerStateFactory; - -ALeffectState *ALflangerStateFactory_create(ALflangerStateFactory *UNUSED(factory)) -{ - ALflangerState *state; - - NEW_OBJ0(state, ALflangerState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALflangerStateFactory); - -ALeffectStateFactory *ALflangerStateFactory_getFactory(void) -{ - static ALflangerStateFactory FlangerFactory = { { GET_VTABLE2(ALflangerStateFactory, ALeffectStateFactory) } }; - - return STATIC_CAST(ALeffectStateFactory, &FlangerFactory); -} - - -void ALflanger_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_WAVEFORM: - if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Waveform = val; - break; - - case AL_FLANGER_PHASE: - if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Phase = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALflanger_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALflanger_setParami(effect, context, param, vals[0]); -} -void ALflanger_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_RATE: - if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Rate = val; - break; - - case AL_FLANGER_DEPTH: - if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Depth = val; - break; - - case AL_FLANGER_FEEDBACK: - if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Feedback = val; - break; - - case AL_FLANGER_DELAY: - if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Flanger.Delay = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALflanger_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALflanger_setParamf(effect, context, param, vals[0]); -} - -void ALflanger_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_WAVEFORM: - *val = props->Flanger.Waveform; - break; - - case AL_FLANGER_PHASE: - *val = props->Flanger.Phase; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALflanger_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALflanger_getParami(effect, context, param, vals); -} -void ALflanger_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_FLANGER_RATE: - *val = props->Flanger.Rate; - break; - - case AL_FLANGER_DEPTH: - *val = props->Flanger.Depth; - break; - - case AL_FLANGER_FEEDBACK: - *val = props->Flanger.Feedback; - break; - - case AL_FLANGER_DELAY: - *val = props->Flanger.Delay; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALflanger_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALflanger_getParamf(effect, context, param, vals); -} - -DEFINE_ALEFFECT_VTABLE(ALflanger); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/reverb.c b/love/src/jni/openal-soft-1.18.2/Alc/effects/reverb.c deleted file mode 100644 index 867abbcc..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/reverb.c +++ /dev/null @@ -1,2407 +0,0 @@ -/** - * Ambisonic reverb engine for the OpenAL cross platform audio library - * Copyright (C) 2008-2017 by Chris Robinson and Christopher Fitzgerald. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alMain.h" -#include "alu.h" -#include "alAuxEffectSlot.h" -#include "alEffect.h" -#include "alFilter.h" -#include "alError.h" -#include "mixer_defs.h" - -/* This is the maximum number of samples processed for each inner loop - * iteration. */ -#define MAX_UPDATE_SAMPLES 256 - -/* The number of samples used for cross-faded delay lines. This can be used - * to balance the compensation for abrupt line changes and attenuation due to - * minimally lengthed recursive lines. Try to keep this below the device - * update size. - */ -#define FADE_SAMPLES 128 - -#ifdef __GNUC__ -#define UNEXPECTED(x) __builtin_expect((bool)(x), 0) -#else -#define UNEXPECTED(x) (x) -#endif - -static MixerFunc MixSamples = Mix_C; -static RowMixerFunc MixRowSamples = MixRow_C; - -static alonce_flag mixfunc_inited = AL_ONCE_FLAG_INIT; -static void init_mixfunc(void) -{ - MixSamples = SelectMixer(); - MixRowSamples = SelectRowMixer(); -} - -typedef struct DelayLineI { - /* The delay lines use interleaved samples, with the lengths being powers - * of 2 to allow the use of bit-masking instead of a modulus for wrapping. - */ - ALsizei Mask; - ALfloat (*Line)[4]; -} DelayLineI; - -typedef struct VecAllpass { - DelayLineI Delay; - ALsizei Offset[4][2]; -} VecAllpass; - -typedef struct ALreverbState { - DERIVE_FROM_TYPE(ALeffectState); - - ALboolean IsEax; - - /* All delay lines are allocated as a single buffer to reduce memory - * fragmentation and management code. - */ - ALfloat *SampleBuffer; - ALuint TotalSamples; - - /* Master effect filters */ - struct { - ALfilterState Lp; - ALfilterState Hp; /* EAX only */ - } Filter[4]; - - /* Core delay line (early reflections and late reverb tap from this). */ - DelayLineI Delay; - - /* Tap points for early reflection delay. */ - ALsizei EarlyDelayTap[4][2]; - ALfloat EarlyDelayCoeff[4]; - - /* Tap points for late reverb feed and delay. */ - ALsizei LateFeedTap; - ALsizei LateDelayTap[4][2]; - - /* The feed-back and feed-forward all-pass coefficient. */ - ALfloat ApFeedCoeff; - - /* Coefficients for the all-pass and line scattering matrices. */ - ALfloat MixX; - ALfloat MixY; - - struct { - /* A Gerzon vector all-pass filter is used to simulate initial - * diffusion. The spread from this filter also helps smooth out the - * reverb tail. - */ - VecAllpass VecAp; - - /* An echo line is used to complete the second half of the early - * reflections. - */ - DelayLineI Delay; - ALsizei Offset[4][2]; - ALfloat Coeff[4]; - - /* The gain for each output channel based on 3D panning. */ - ALfloat CurrentGain[4][MAX_OUTPUT_CHANNELS]; - ALfloat PanGain[4][MAX_OUTPUT_CHANNELS]; - } Early; - - struct { - /* The vibrato time is tracked with an index over a modulus-wrapped - * range (in samples). - */ - ALuint Index; - ALuint Range; - - /* The depth of frequency change (also in samples) and its filter. */ - ALfloat Depth; - ALfloat Coeff; - ALfloat Filter; - } Mod; /* EAX only */ - - struct { - /* Attenuation to compensate for the modal density and decay rate of - * the late lines. - */ - ALfloat DensityGain; - - /* A recursive delay line is used fill in the reverb tail. */ - DelayLineI Delay; - ALsizei Offset[4][2]; - - /* T60 decay filters are used to simulate absorption. */ - struct { - ALfloat LFCoeffs[3]; - ALfloat HFCoeffs[3]; - ALfloat MidCoeff; - /* The LF and HF filters keep a state of the last input and last - * output sample. - */ - ALfloat States[2][2]; - } Filters[4]; - - /* A Gerzon vector all-pass filter is used to simulate diffusion. */ - VecAllpass VecAp; - - /* The gain for each output channel based on 3D panning. */ - ALfloat CurrentGain[4][MAX_OUTPUT_CHANNELS]; - ALfloat PanGain[4][MAX_OUTPUT_CHANNELS]; - } Late; - - /* Indicates the cross-fade point for delay line reads [0,FADE_SAMPLES]. */ - ALsizei FadeCount; - - /* The current write offset for all delay lines. */ - ALsizei Offset; - - /* Temporary storage used when processing. */ - alignas(16) ALfloat AFormatSamples[4][MAX_UPDATE_SAMPLES]; - alignas(16) ALfloat ReverbSamples[4][MAX_UPDATE_SAMPLES]; - alignas(16) ALfloat EarlySamples[4][MAX_UPDATE_SAMPLES]; -} ALreverbState; - -static ALvoid ALreverbState_Destruct(ALreverbState *State); -static ALboolean ALreverbState_deviceUpdate(ALreverbState *State, ALCdevice *Device); -static ALvoid ALreverbState_update(ALreverbState *State, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); -static ALvoid ALreverbState_process(ALreverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); -DECLARE_DEFAULT_ALLOCATORS(ALreverbState) - -DEFINE_ALEFFECTSTATE_VTABLE(ALreverbState); - -static void ALreverbState_Construct(ALreverbState *state) -{ - ALsizei i, j; - - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); - SET_VTABLE2(ALreverbState, ALeffectState, state); - - state->IsEax = AL_FALSE; - - state->TotalSamples = 0; - state->SampleBuffer = NULL; - - for(i = 0;i < 4;i++) - { - ALfilterState_clear(&state->Filter[i].Lp); - ALfilterState_clear(&state->Filter[i].Hp); - } - - state->Delay.Mask = 0; - state->Delay.Line = NULL; - - for(i = 0;i < 4;i++) - { - state->EarlyDelayTap[i][0] = 0; - state->EarlyDelayTap[i][1] = 0; - state->EarlyDelayCoeff[i] = 0.0f; - } - - state->LateFeedTap = 0; - - for(i = 0;i < 4;i++) - { - state->LateDelayTap[i][0] = 0; - state->LateDelayTap[i][1] = 0; - } - - state->ApFeedCoeff = 0.0f; - state->MixX = 0.0f; - state->MixY = 0.0f; - - state->Early.VecAp.Delay.Mask = 0; - state->Early.VecAp.Delay.Line = NULL; - state->Early.Delay.Mask = 0; - state->Early.Delay.Line = NULL; - for(i = 0;i < 4;i++) - { - state->Early.VecAp.Offset[i][0] = 0; - state->Early.VecAp.Offset[i][1] = 0; - state->Early.Offset[i][0] = 0; - state->Early.Offset[i][1] = 0; - state->Early.Coeff[i] = 0.0f; - } - - state->Mod.Index = 0; - state->Mod.Range = 1; - state->Mod.Depth = 0.0f; - state->Mod.Coeff = 0.0f; - state->Mod.Filter = 0.0f; - - state->Late.DensityGain = 0.0f; - - state->Late.Delay.Mask = 0; - state->Late.Delay.Line = NULL; - state->Late.VecAp.Delay.Mask = 0; - state->Late.VecAp.Delay.Line = NULL; - for(i = 0;i < 4;i++) - { - state->Late.Offset[i][0] = 0; - state->Late.Offset[i][1] = 0; - - state->Late.VecAp.Offset[i][0] = 0; - state->Late.VecAp.Offset[i][1] = 0; - - for(j = 0;j < 3;j++) - { - state->Late.Filters[i].LFCoeffs[j] = 0.0f; - state->Late.Filters[i].HFCoeffs[j] = 0.0f; - } - state->Late.Filters[i].MidCoeff = 0.0f; - - state->Late.Filters[i].States[0][0] = 0.0f; - state->Late.Filters[i].States[0][1] = 0.0f; - state->Late.Filters[i].States[1][0] = 0.0f; - state->Late.Filters[i].States[1][1] = 0.0f; - } - - for(i = 0;i < 4;i++) - { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - { - state->Early.CurrentGain[i][j] = 0.0f; - state->Early.PanGain[i][j] = 0.0f; - state->Late.CurrentGain[i][j] = 0.0f; - state->Late.PanGain[i][j] = 0.0f; - } - } - - state->FadeCount = 0; - state->Offset = 0; -} - -static ALvoid ALreverbState_Destruct(ALreverbState *State) -{ - al_free(State->SampleBuffer); - State->SampleBuffer = NULL; - - ALeffectState_Destruct(STATIC_CAST(ALeffectState,State)); -} - -/* The B-Format to A-Format conversion matrix. The arrangement of rows is - * deliberately chosen to align the resulting lines to their spatial opposites - * (0:above front left <-> 3:above back right, 1:below front right <-> 2:below - * back left). It's not quite opposite, since the A-Format results in a - * tetrahedron, but it's close enough. Should the model be extended to 8-lines - * in the future, true opposites can be used. - */ -static const aluMatrixf B2A = {{ - { 0.288675134595f, 0.288675134595f, 0.288675134595f, 0.288675134595f }, - { 0.288675134595f, -0.288675134595f, -0.288675134595f, 0.288675134595f }, - { 0.288675134595f, 0.288675134595f, -0.288675134595f, -0.288675134595f }, - { 0.288675134595f, -0.288675134595f, 0.288675134595f, -0.288675134595f } -}}; - -/* Converts A-Format to B-Format. */ -static const aluMatrixf A2B = {{ - { 0.866025403785f, 0.866025403785f, 0.866025403785f, 0.866025403785f }, - { 0.866025403785f, -0.866025403785f, 0.866025403785f, -0.866025403785f }, - { 0.866025403785f, -0.866025403785f, -0.866025403785f, 0.866025403785f }, - { 0.866025403785f, 0.866025403785f, -0.866025403785f, -0.866025403785f } -}}; - -static const ALfloat FadeStep = 1.0f / FADE_SAMPLES; - -/* This is a user config option for modifying the overall output of the reverb - * effect. - */ -ALfloat ReverbBoost = 1.0f; - -/* Specifies whether to use a standard reverb effect in place of EAX reverb (no - * high-pass, modulation, or echo). - */ -ALboolean EmulateEAXReverb = AL_FALSE; - -/* The all-pass and delay lines have a variable length dependent on the - * effect's density parameter. The resulting density multiplier is: - * - * multiplier = 1 + (density * LINE_MULTIPLIER) - * - * Thus the line multiplier below will result in a maximum density multiplier - * of 10. - */ -static const ALfloat LINE_MULTIPLIER = 9.0f; - -/* All delay line lengths are specified in seconds. - * - * To approximate early reflections, we break them up into primary (those - * arriving from the same direction as the source) and secondary (those - * arriving from the opposite direction). - * - * The early taps decorrelate the 4-channel signal to approximate an average - * room response for the primary reflections after the initial early delay. - * - * Given an average room dimension (d_a) and the speed of sound (c) we can - * calculate the average reflection delay (r_a) regardless of listener and - * source positions as: - * - * r_a = d_a / c - * c = 343.3 - * - * This can extended to finding the average difference (r_d) between the - * maximum (r_1) and minimum (r_0) reflection delays: - * - * r_0 = 2 / 3 r_a - * = r_a - r_d / 2 - * = r_d - * r_1 = 4 / 3 r_a - * = r_a + r_d / 2 - * = 2 r_d - * r_d = 2 / 3 r_a - * = r_1 - r_0 - * - * As can be determined by integrating the 1D model with a source (s) and - * listener (l) positioned across the dimension of length (d_a): - * - * r_d = int_(l=0)^d_a (int_(s=0)^d_a |2 d_a - 2 (l + s)| ds) dl / c - * - * The initial taps (T_(i=0)^N) are then specified by taking a power series - * that ranges between r_0 and half of r_1 less r_0: - * - * R_i = 2^(i / (2 N - 1)) r_d - * = r_0 + (2^(i / (2 N - 1)) - 1) r_d - * = r_0 + T_i - * T_i = R_i - r_0 - * = (2^(i / (2 N - 1)) - 1) r_d - * - * Assuming an average of 5m (up to 50m with the density multiplier), we get - * the following taps: - */ -static const ALfloat EARLY_TAP_LENGTHS[4] = -{ - 0.000000e+0f, 1.010676e-3f, 2.126553e-3f, 3.358580e-3f -}; - -/* The early all-pass filter lengths are based on the early tap lengths: - * - * A_i = R_i / a - * - * Where a is the approximate maximum all-pass cycle limit (20). - */ -static const ALfloat EARLY_ALLPASS_LENGTHS[4] = -{ - 4.854840e-4f, 5.360178e-4f, 5.918117e-4f, 6.534130e-4f -}; - -/* The early delay lines are used to transform the primary reflections into - * the secondary reflections. The A-format is arranged in such a way that - * the channels/lines are spatially opposite: - * - * C_i is opposite C_(N-i-1) - * - * The delays of the two opposing reflections (R_i and O_i) from a source - * anywhere along a particular dimension always sum to twice its full delay: - * - * 2 r_a = R_i + O_i - * - * With that in mind we can determine the delay between the two reflections - * and thus specify our early line lengths (L_(i=0)^N) using: - * - * O_i = 2 r_a - R_(N-i-1) - * L_i = O_i - R_(N-i-1) - * = 2 (r_a - R_(N-i-1)) - * = 2 (r_a - T_(N-i-1) - r_0) - * = 2 r_a (1 - (2 / 3) 2^((N - i - 1) / (2 N - 1))) - * - * Using an average dimension of 5m, we get: - */ -static const ALfloat EARLY_LINE_LENGTHS[4] = -{ - 2.992520e-3f, 5.456575e-3f, 7.688329e-3f, 9.709681e-3f -}; - -/* The late all-pass filter lengths are based on the late line lengths: - * - * A_i = (5 / 3) L_i / r_1 - */ -static const ALfloat LATE_ALLPASS_LENGTHS[4] = -{ - 8.091400e-4f, 1.019453e-3f, 1.407968e-3f, 1.618280e-3f -}; - -/* The late lines are used to approximate the decaying cycle of recursive - * late reflections. - * - * Splitting the lines in half, we start with the shortest reflection paths - * (L_(i=0)^(N/2)): - * - * L_i = 2^(i / (N - 1)) r_d - * - * Then for the opposite (longest) reflection paths (L_(i=N/2)^N): - * - * L_i = 2 r_a - L_(i-N/2) - * = 2 r_a - 2^((i - N / 2) / (N - 1)) r_d - * - * For our 5m average room, we get: - */ -static const ALfloat LATE_LINE_LENGTHS[4] = -{ - 9.709681e-3f, 1.223343e-2f, 1.689561e-2f, 1.941936e-2f -}; - -/* This coefficient is used to define the sinus depth according to the - * modulation depth property. This value must be below half the shortest late - * line length (0.0097/2 = ~0.0048), otherwise with certain parameters (high - * mod time, low density) the downswing can sample before the input. - */ -static const ALfloat MODULATION_DEPTH_COEFF = 1.0f / 4096.0f; - -/* A filter is used to avoid the terrible distortion caused by changing - * modulation time and/or depth. To be consistent across different sample - * rates, the coefficient must be raised to a constant divided by the sample - * rate: coeff^(constant / rate). - */ -static const ALfloat MODULATION_FILTER_COEFF = 0.048f; -static const ALfloat MODULATION_FILTER_CONST = 100000.0f; - - -/* Prior to VS2013, MSVC lacks the round() family of functions. */ -#if defined(_MSC_VER) && _MSC_VER < 1800 -static inline long lroundf(float val) -{ - if(val < 0.0) - return fastf2i(ceilf(val-0.5f)); - return fastf2i(floorf(val+0.5f)); -} -#endif - - -/************************************** - * Device Update * - **************************************/ - -/* Given the allocated sample buffer, this function updates each delay line - * offset. - */ -static inline ALvoid RealizeLineOffset(ALfloat *sampleBuffer, DelayLineI *Delay) -{ - union { - ALfloat *f; - ALfloat (*f4)[4]; - } u; - u.f = &sampleBuffer[(ptrdiff_t)Delay->Line * 4]; - Delay->Line = u.f4; -} - -/* Calculate the length of a delay line and store its mask and offset. */ -static ALuint CalcLineLength(const ALfloat length, const ptrdiff_t offset, const ALuint frequency, - const ALuint extra, DelayLineI *Delay) -{ - ALuint samples; - - /* All line lengths are powers of 2, calculated from their lengths in - * seconds, rounded up. - */ - samples = fastf2i(ceilf(length*frequency)); - samples = NextPowerOf2(samples + extra); - - /* All lines share a single sample buffer. */ - Delay->Mask = samples - 1; - Delay->Line = (ALfloat(*)[4])offset; - - /* Return the sample count for accumulation. */ - return samples; -} - -/* Calculates the delay line metrics and allocates the shared sample buffer - * for all lines given the sample rate (frequency). If an allocation failure - * occurs, it returns AL_FALSE. - */ -static ALboolean AllocLines(const ALuint frequency, ALreverbState *State) -{ - ALuint totalSamples, i; - ALfloat multiplier, length; - - /* All delay line lengths are calculated to accomodate the full range of - * lengths given their respective paramters. - */ - totalSamples = 0; - - /* Multiplier for the maximum density value, i.e. density=1, which is - * actually the least density... - */ - multiplier = 1.0f + LINE_MULTIPLIER; - - /* The main delay length includes the maximum early reflection delay, the - * largest early tap width, the maximum late reverb delay, and the - * largest late tap width. Finally, it must also be extended by the - * update size (MAX_UPDATE_SAMPLES) for block processing. - */ - length = AL_EAXREVERB_MAX_REFLECTIONS_DELAY + - EARLY_TAP_LENGTHS[3]*multiplier + - AL_EAXREVERB_MAX_LATE_REVERB_DELAY + - (LATE_LINE_LENGTHS[3] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, MAX_UPDATE_SAMPLES, - &State->Delay); - - /* The early vector all-pass line. */ - length = EARLY_ALLPASS_LENGTHS[3] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Early.VecAp.Delay); - - /* The early reflection line. */ - length = EARLY_LINE_LENGTHS[3] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Early.Delay); - - /* The late vector all-pass line. */ - length = LATE_ALLPASS_LENGTHS[3] * multiplier; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Late.VecAp.Delay); - - /* The late delay lines are calculated from the larger of the maximum - * density line length or the maximum echo time, and includes the maximum - * modulation-related delay. The modulator's delay is calculated from the - * maximum modulation time and depth coefficient, and halved for the low- - * to-high frequency swing. - */ - length = maxf(AL_EAXREVERB_MAX_ECHO_TIME, LATE_LINE_LENGTHS[3]*multiplier) + - AL_EAXREVERB_MAX_MODULATION_TIME*MODULATION_DEPTH_COEFF/2.0f; - totalSamples += CalcLineLength(length, totalSamples, frequency, 0, - &State->Late.Delay); - - if(totalSamples != State->TotalSamples) - { - ALfloat *newBuffer; - - TRACE("New reverb buffer length: %ux4 samples\n", totalSamples); - newBuffer = al_calloc(16, sizeof(ALfloat[4]) * totalSamples); - if(!newBuffer) return AL_FALSE; - - al_free(State->SampleBuffer); - State->SampleBuffer = newBuffer; - State->TotalSamples = totalSamples; - } - - /* Update all delays to reflect the new sample buffer. */ - RealizeLineOffset(State->SampleBuffer, &State->Delay); - RealizeLineOffset(State->SampleBuffer, &State->Early.VecAp.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Early.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Late.VecAp.Delay); - RealizeLineOffset(State->SampleBuffer, &State->Late.Delay); - - /* Clear the sample buffer. */ - for(i = 0;i < State->TotalSamples;i++) - State->SampleBuffer[i] = 0.0f; - - return AL_TRUE; -} - -static ALboolean ALreverbState_deviceUpdate(ALreverbState *State, ALCdevice *Device) -{ - ALuint frequency = Device->Frequency, i; - ALfloat multiplier; - - /* Allocate the delay lines. */ - if(!AllocLines(frequency, State)) - return AL_FALSE; - - /* Calculate the modulation filter coefficient. Notice that the exponent - * is calculated given the current sample rate. This ensures that the - * resulting filter response over time is consistent across all sample - * rates. - */ - State->Mod.Coeff = powf(MODULATION_FILTER_COEFF, - MODULATION_FILTER_CONST / frequency); - - multiplier = 1.0f + LINE_MULTIPLIER; - - /* The late feed taps are set a fixed position past the latest delay tap. */ - for(i = 0;i < 4;i++) - State->LateFeedTap = fastf2i((AL_EAXREVERB_MAX_REFLECTIONS_DELAY + - EARLY_TAP_LENGTHS[3]*multiplier) * - frequency); - - return AL_TRUE; -} - -/************************************** - * Effect Update * - **************************************/ - -/* Calculate a decay coefficient given the length of each cycle and the time - * until the decay reaches -60 dB. - */ -static inline ALfloat CalcDecayCoeff(const ALfloat length, const ALfloat decayTime) -{ - return powf(REVERB_DECAY_GAIN, length/decayTime); -} - -/* Calculate a decay length from a coefficient and the time until the decay - * reaches -60 dB. - */ -static inline ALfloat CalcDecayLength(const ALfloat coeff, const ALfloat decayTime) -{ - return log10f(coeff) * decayTime / log10f(REVERB_DECAY_GAIN); -} - -/* Calculate an attenuation to be applied to the input of any echo models to - * compensate for modal density and decay time. - */ -static inline ALfloat CalcDensityGain(const ALfloat a) -{ - /* The energy of a signal can be obtained by finding the area under the - * squared signal. This takes the form of Sum(x_n^2), where x is the - * amplitude for the sample n. - * - * Decaying feedback matches exponential decay of the form Sum(a^n), - * where a is the attenuation coefficient, and n is the sample. The area - * under this decay curve can be calculated as: 1 / (1 - a). - * - * Modifying the above equation to find the area under the squared curve - * (for energy) yields: 1 / (1 - a^2). Input attenuation can then be - * calculated by inverting the square root of this approximation, - * yielding: 1 / sqrt(1 / (1 - a^2)), simplified to: sqrt(1 - a^2). - */ - return sqrtf(1.0f - a*a); -} - -/* Calculate the scattering matrix coefficients given a diffusion factor. */ -static inline ALvoid CalcMatrixCoeffs(const ALfloat diffusion, ALfloat *x, ALfloat *y) -{ - ALfloat n, t; - - /* The matrix is of order 4, so n is sqrt(4 - 1). */ - n = sqrtf(3.0f); - t = diffusion * atanf(n); - - /* Calculate the first mixing matrix coefficient. */ - *x = cosf(t); - /* Calculate the second mixing matrix coefficient. */ - *y = sinf(t) / n; -} - -/* Calculate the limited HF ratio for use with the late reverb low-pass - * filters. - */ -static ALfloat CalcLimitedHfRatio(const ALfloat hfRatio, const ALfloat airAbsorptionGainHF, - const ALfloat decayTime) -{ - ALfloat limitRatio; - - /* Find the attenuation due to air absorption in dB (converting delay - * time to meters using the speed of sound). Then reversing the decay - * equation, solve for HF ratio. The delay length is cancelled out of - * the equation, so it can be calculated once for all lines. - */ - limitRatio = 1.0f / (CalcDecayLength(airAbsorptionGainHF, decayTime) * - SPEEDOFSOUNDMETRESPERSEC); - /* Using the limit calculated above, apply the upper bound to the HF - * ratio. Also need to limit the result to a minimum of 0.1, just like - * the HF ratio parameter. - */ - return clampf(limitRatio, 0.1f, hfRatio); -} - -/* Calculates the first-order high-pass coefficients following the I3DL2 - * reference model. This is the transfer function: - * - * 1 - z^-1 - * H(z) = p ------------ - * 1 - p z^-1 - * - * And this is the I3DL2 coefficient calculation given gain (g) and reference - * angular frequency (w): - * - * g - * p = ------------------------------------------------------ - * g cos(w) + sqrt((cos(w) - 1) (g^2 cos(w) + g^2 - 2)) - * - * The coefficient is applied to the partial differential filter equation as: - * - * c_0 = p - * c_1 = -p - * c_2 = p - * y_i = c_0 x_i + c_1 x_(i-1) + c_2 y_(i-1) - * - */ -static inline void CalcHighpassCoeffs(const ALfloat gain, const ALfloat w, ALfloat coeffs[3]) -{ - ALfloat g, g2, cw, p; - - if(gain >= 1.0f) - { - coeffs[0] = 1.0f; - coeffs[1] = 0.0f; - coeffs[2] = 0.0f; - - return; - } - - g = maxf(0.001f, gain); - g2 = g * g; - cw = cosf(w); - p = g / (g*cw + sqrtf((cw - 1.0f) * (g2*cw + g2 - 2.0f))); - - coeffs[0] = p; - coeffs[1] = -p; - coeffs[2] = p; -} - -/* Calculates the first-order low-pass coefficients following the I3DL2 - * reference model. This is the transfer function: - * - * (1 - a) z^0 - * H(z) = ---------------- - * 1 z^0 - a z^-1 - * - * And this is the I3DL2 coefficient calculation given gain (g) and reference - * angular frequency (w): - * - * 1 - g^2 cos(w) - sqrt(2 g^2 (1 - cos(w)) - g^4 (1 - cos(w)^2)) - * a = ---------------------------------------------------------------- - * 1 - g^2 - * - * The coefficient is applied to the partial differential filter equation as: - * - * c_0 = 1 - a - * c_1 = 0 - * c_2 = a - * y_i = c_0 x_i + c_1 x_(i-1) + c_2 y_(i-1) - * - */ -static inline void CalcLowpassCoeffs(const ALfloat gain, const ALfloat w, ALfloat coeffs[3]) -{ - ALfloat g, g2, cw, a; - - if(gain >= 1.0f) - { - coeffs[0] = 1.0f; - coeffs[1] = 0.0f; - coeffs[2] = 0.0f; - - return; - } - - /* Be careful with gains < 0.001, as that causes the coefficient - * to head towards 1, which will flatten the signal. */ - g = maxf(0.001f, gain); - g2 = g * g; - cw = cosf(w); - a = (1.0f - g2*cw - sqrtf((2.0f*g2*(1.0f - cw)) - g2*g2*(1.0f - cw*cw))) / - (1.0f - g2); - - coeffs[0] = 1.0f - a; - coeffs[1] = 0.0f; - coeffs[2] = a; -} - -/* Calculates the first-order low-shelf coefficients. The shelf filters are - * used in place of low/high-pass filters to preserve the mid-band. This is - * the transfer function: - * - * a_0 + a_1 z^-1 - * H(z) = ---------------- - * 1 + b_1 z^-1 - * - * And these are the coefficient calculations given cut gain (g) and a center - * angular frequency (w): - * - * sin(0.5 (pi - w) - 0.25 pi) - * p = ----------------------------- - * sin(0.5 (pi - w) + 0.25 pi) - * - * g + 1 g + 1 - * a = ------- + sqrt((-------)^2 - 1) - * g - 1 g - 1 - * - * 1 + g + (1 - g) a - * b_0 = ------------------- - * 2 - * - * 1 - g + (1 + g) a - * b_1 = ------------------- - * 2 - * - * The coefficients are applied to the partial differential filter equation - * as: - * - * b_0 + p b_1 - * c_0 = ------------- - * 1 + p a - * - * -(b_1 + p b_0) - * c_1 = ---------------- - * 1 + p a - * - * p + a - * c_2 = --------- - * 1 + p a - * - * y_i = c_0 x_i + c_1 x_(i-1) + c_2 y_(i-1) - * - */ -static inline void CalcLowShelfCoeffs(const ALfloat gain, const ALfloat w, ALfloat coeffs[3]) -{ - ALfloat g, rw, p, n; - ALfloat alpha, beta0, beta1; - - if(gain >= 1.0f) - { - coeffs[0] = 1.0f; - coeffs[1] = 0.0f; - coeffs[2] = 0.0f; - - return; - } - - g = maxf(0.001f, gain); - rw = F_PI - w; - p = sinf(0.5f*rw - 0.25f*F_PI) / sinf(0.5f*rw + 0.25f*F_PI); - n = (g + 1.0f) / (g - 1.0f); - alpha = n + sqrtf(n*n - 1.0f); - beta0 = (1.0f + g + (1.0f - g)*alpha) / 2.0f; - beta1 = (1.0f - g + (1.0f + g)*alpha) / 2.0f; - - coeffs[0] = (beta0 + p*beta1) / (1.0f + p*alpha); - coeffs[1] = -(beta1 + p*beta0) / (1.0f + p*alpha); - coeffs[2] = (p + alpha) / (1.0f + p*alpha); -} - -/* Calculates the first-order high-shelf coefficients. The shelf filters are - * used in place of low/high-pass filters to preserve the mid-band. This is - * the transfer function: - * - * a_0 + a_1 z^-1 - * H(z) = ---------------- - * 1 + b_1 z^-1 - * - * And these are the coefficient calculations given cut gain (g) and a center - * angular frequency (w): - * - * sin(0.5 w - 0.25 pi) - * p = ---------------------- - * sin(0.5 w + 0.25 pi) - * - * g + 1 g + 1 - * a = ------- + sqrt((-------)^2 - 1) - * g - 1 g - 1 - * - * 1 + g + (1 - g) a - * b_0 = ------------------- - * 2 - * - * 1 - g + (1 + g) a - * b_1 = ------------------- - * 2 - * - * The coefficients are applied to the partial differential filter equation - * as: - * - * b_0 + p b_1 - * c_0 = ------------- - * 1 + p a - * - * b_1 + p b_0 - * c_1 = ------------- - * 1 + p a - * - * -(p + a) - * c_2 = ---------- - * 1 + p a - * - * y_i = c_0 x_i + c_1 x_(i-1) + c_2 y_(i-1) - * - */ -static inline void CalcHighShelfCoeffs(const ALfloat gain, const ALfloat w, ALfloat coeffs[3]) -{ - ALfloat g, p, n; - ALfloat alpha, beta0, beta1; - - if(gain >= 1.0f) - { - coeffs[0] = 1.0f; - coeffs[1] = 0.0f; - coeffs[2] = 0.0f; - - return; - } - - g = maxf(0.001f, gain); - p = sinf(0.5f*w - 0.25f*F_PI) / sinf(0.5f*w + 0.25f*F_PI); - n = (g + 1.0f) / (g - 1.0f); - alpha = n + sqrtf(n*n - 1.0f); - beta0 = (1.0f + g + (1.0f - g)*alpha) / 2.0f; - beta1 = (1.0f - g + (1.0f + g)*alpha) / 2.0f; - - coeffs[0] = (beta0 + p*beta1) / (1.0f + p*alpha); - coeffs[1] = (beta1 + p*beta0) / (1.0f + p*alpha); - coeffs[2] = -(p + alpha) / (1.0f + p*alpha); -} - -/* Calculates the 3-band T60 damping coefficients for a particular delay line - * of specified length using a combination of two low/high-pass/shelf or - * pass-through filter sections (producing 3 coefficients each) and a general - * gain (7th coefficient) given decay times for each band split at two (LF/ - * HF) reference frequencies (w). - */ -static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime, - const ALfloat mfDecayTime, const ALfloat hfDecayTime, - const ALfloat lfW, const ALfloat hfW, ALfloat lfcoeffs[3], - ALfloat hfcoeffs[3], ALfloat *midcoeff) -{ - ALfloat lfGain = CalcDecayCoeff(length, lfDecayTime); - ALfloat mfGain = CalcDecayCoeff(length, mfDecayTime); - ALfloat hfGain = CalcDecayCoeff(length, hfDecayTime); - - if(lfGain < mfGain) - { - if(mfGain < hfGain) - { - CalcLowShelfCoeffs(mfGain / hfGain, hfW, lfcoeffs); - CalcHighpassCoeffs(lfGain / mfGain, lfW, hfcoeffs); - *midcoeff = hfGain; - } - else if(mfGain > hfGain) - { - CalcHighpassCoeffs(lfGain / mfGain, lfW, lfcoeffs); - CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = mfGain; - } - else - { - lfcoeffs[0] = 1.0f; - lfcoeffs[1] = 0.0f; - lfcoeffs[2] = 0.0f; - CalcHighpassCoeffs(lfGain / mfGain, lfW, hfcoeffs); - *midcoeff = mfGain; - } - } - else if(lfGain > mfGain) - { - if(mfGain < hfGain) - { - ALfloat hg = mfGain / lfGain; - ALfloat lg = mfGain / hfGain; - - CalcHighShelfCoeffs(hg, lfW, lfcoeffs); - CalcLowShelfCoeffs(lg, hfW, hfcoeffs); - *midcoeff = maxf(lfGain, hfGain) / maxf(hg, lg); - } - else if(mfGain > hfGain) - { - CalcHighShelfCoeffs(mfGain / lfGain, lfW, lfcoeffs); - CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = lfGain; - } - else - { - lfcoeffs[0] = 1.0f; - lfcoeffs[1] = 0.0f; - lfcoeffs[2] = 0.0f; - CalcHighShelfCoeffs(mfGain / lfGain, lfW, hfcoeffs); - *midcoeff = lfGain; - } - } - else - { - lfcoeffs[0] = 1.0f; - lfcoeffs[1] = 0.0f; - lfcoeffs[2] = 0.0f; - - if(mfGain < hfGain) - { - CalcLowShelfCoeffs(mfGain / hfGain, hfW, hfcoeffs); - *midcoeff = hfGain; - } - else if(mfGain > hfGain) - { - CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = mfGain; - } - else - { - hfcoeffs[3] = 1.0f; - hfcoeffs[4] = 0.0f; - hfcoeffs[5] = 0.0f; - *midcoeff = mfGain; - } - } -} - -/* Update the EAX modulation index, range, and depth. Keep in mind that this - * kind of vibrato is additive and not multiplicative as one may expect. The - * downswing will sound stronger than the upswing. - */ -static ALvoid UpdateModulator(const ALfloat modTime, const ALfloat modDepth, - const ALuint frequency, ALreverbState *State) -{ - ALuint range; - - /* Modulation is calculated in two parts. - * - * The modulation time effects the speed of the sinus. An index out of the - * current range (both in samples) is incremented each sample, so a longer - * time implies a larger range. The range is bound to a reasonable minimum - * (1 sample) and when the timing changes, the index is rescaled to the new - * range to keep the sinus consistent. - */ - range = maxi(fastf2i(modTime*frequency), 1); - State->Mod.Index = (ALuint)(State->Mod.Index * (ALuint64)range / - State->Mod.Range); - State->Mod.Range = range; - - /* The modulation depth effects the scale of the sinus, which changes how - * much extra delay is added to the delay line. This delay changing over - * time changes the pitch, creating the modulation effect. The scale needs - * to be multiplied by the modulation time so that a given depth produces a - * consistent shift in frequency over all ranges of time. Since the depth - * is applied to a sinus value, it needs to be halved for the sinus swing - * in time (half of it is spent decreasing the frequency, half is spent - * increasing it). - */ - State->Mod.Depth = modDepth * MODULATION_DEPTH_COEFF * modTime / 2.0f * - frequency; -} - -/* Update the offsets for the main effect delay line. */ -static ALvoid UpdateDelayLine(const ALfloat earlyDelay, const ALfloat lateDelay, const ALfloat density, const ALfloat decayTime, const ALuint frequency, ALreverbState *State) -{ - ALfloat multiplier, length; - ALuint i; - - multiplier = 1.0f + density*LINE_MULTIPLIER; - - /* Early reflection taps are decorrelated by means of an average room - * reflection approximation described above the definition of the taps. - * This approximation is linear and so the above density multiplier can - * be applied to adjust the width of the taps. A single-band decay - * coefficient is applied to simulate initial attenuation and absorption. - * - * Late reverb taps are based on the late line lengths to allow a zero- - * delay path and offsets that would continue the propagation naturally - * into the late lines. - */ - for(i = 0;i < 4;i++) - { - length = earlyDelay + EARLY_TAP_LENGTHS[i]*multiplier; - State->EarlyDelayTap[i][1] = fastf2i(length * frequency); - - length = EARLY_TAP_LENGTHS[i]*multiplier; - State->EarlyDelayCoeff[i] = CalcDecayCoeff(length, decayTime); - - length = lateDelay + (LATE_LINE_LENGTHS[i] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; - State->LateDelayTap[i][1] = State->LateFeedTap + fastf2i(length * frequency); - } -} - -/* Update the early reflection line lengths and gain coefficients. */ -static ALvoid UpdateEarlyLines(const ALfloat density, const ALfloat decayTime, const ALuint frequency, ALreverbState *State) -{ - ALfloat multiplier, length; - ALsizei i; - - multiplier = 1.0f + density*LINE_MULTIPLIER; - - for(i = 0;i < 4;i++) - { - /* Calculate the length (in seconds) of each all-pass line. */ - length = EARLY_ALLPASS_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each all-pass line. */ - State->Early.VecAp.Offset[i][1] = fastf2i(length * frequency); - - /* Calculate the length (in seconds) of each delay line. */ - length = EARLY_LINE_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each delay line. */ - State->Early.Offset[i][1] = fastf2i(length * frequency); - - /* Calculate the gain (coefficient) for each line. */ - State->Early.Coeff[i] = CalcDecayCoeff(length, decayTime); - } -} - -/* Update the late reverb line lengths and T60 coefficients. */ -static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, const ALfloat lfDecayTime, const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lfW, const ALfloat hfW, const ALfloat echoTime, const ALfloat echoDepth, const ALuint frequency, ALreverbState *State) -{ - ALfloat multiplier, length, bandWeights[3]; - ALsizei i; - - /* To compensate for changes in modal density and decay time of the late - * reverb signal, the input is attenuated based on the maximal energy of - * the outgoing signal. This approximation is used to keep the apparent - * energy of the signal equal for all ranges of density and decay time. - * - * The average length of the delay lines is used to calculate the - * attenuation coefficient. - */ - multiplier = 1.0f + density*LINE_MULTIPLIER; - length = (LATE_LINE_LENGTHS[0] + LATE_LINE_LENGTHS[1] + - LATE_LINE_LENGTHS[2] + LATE_LINE_LENGTHS[3]) / 4.0f * multiplier; - /* Include the echo transformation (see below). */ - length = lerp(length, echoTime, echoDepth); - length += (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + - LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f * multiplier; - /* The density gain calculation uses an average decay time weighted by - * approximate bandwidth. This attempts to compensate for losses of - * energy that reduce decay time due to scattering into highly attenuated - * bands. - */ - bandWeights[0] = lfW; - bandWeights[1] = hfW - lfW; - bandWeights[2] = F_TAU - hfW; - State->Late.DensityGain = CalcDensityGain( - CalcDecayCoeff(length, (bandWeights[0]*lfDecayTime + bandWeights[1]*mfDecayTime + - bandWeights[2]*hfDecayTime) / F_TAU) - ); - - for(i = 0;i < 4;i++) - { - /* Calculate the length (in seconds) of each all-pass line. */ - length = LATE_ALLPASS_LENGTHS[i] * multiplier; - - /* Calculate the delay offset for each all-pass line. */ - State->Late.VecAp.Offset[i][1] = fastf2i(length * frequency); - - /* Calculate the length (in seconds) of each delay line. This also - * applies the echo transformation. As the EAX echo depth approaches - * 1, the line lengths approach a length equal to the echoTime. This - * helps to produce distinct echoes along the tail. - */ - length = lerp(LATE_LINE_LENGTHS[i] * multiplier, echoTime, echoDepth); - - /* Calculate the delay offset for each delay line. */ - State->Late.Offset[i][1] = fastf2i(length * frequency); - - /* Approximate the absorption that the vector all-pass would exhibit - * given the current diffusion so we don't have to process a full T60 - * filter for each of its four lines. - */ - length += lerp(LATE_ALLPASS_LENGTHS[i], - (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + - LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f, - diffusion) * multiplier; - - /* Calculate the T60 damping coefficients for each line. */ - CalcT60DampingCoeffs(length, lfDecayTime, mfDecayTime, hfDecayTime, - lfW, hfW, State->Late.Filters[i].LFCoeffs, - State->Late.Filters[i].HFCoeffs, - &State->Late.Filters[i].MidCoeff); - } -} - -/* Creates a transform matrix given a reverb vector. This works by creating a - * Z-focus transform, then a rotate transform around X, then Y, to place the - * focal point in the direction of the vector, using the vector length as a - * focus strength. - * - * This isn't technically correct since the vector is supposed to define the - * aperture and not rotate the perceived soundfield, but in practice it's - * probably good enough. - */ -static aluMatrixf GetTransformFromVector(const ALfloat *vec) -{ - aluMatrixf zfocus, xrot, yrot; - aluMatrixf tmp1, tmp2; - ALfloat length; - ALfloat sa, a; - - length = sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); - - /* Define a Z-focus (X in Ambisonics) transform, given the panning vector - * length. - */ - sa = sinf(minf(length, 1.0f) * (F_PI/4.0f)); - aluMatrixfSet(&zfocus, - 1.0f/(1.0f+sa), 0.0f, 0.0f, (sa/(1.0f+sa))/1.732050808f, - 0.0f, sqrtf((1.0f-sa)/(1.0f+sa)), 0.0f, 0.0f, - 0.0f, 0.0f, sqrtf((1.0f-sa)/(1.0f+sa)), 0.0f, - (sa/(1.0f+sa))*1.732050808f, 0.0f, 0.0f, 1.0f/(1.0f+sa) - ); - - /* Define rotation around X (Y in Ambisonics) */ - a = atan2f(vec[1], sqrtf(vec[0]*vec[0] + vec[2]*vec[2])); - aluMatrixfSet(&xrot, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, cosf(a), sinf(a), - 0.0f, 0.0f, -sinf(a), cosf(a) - ); - - /* Define rotation around Y (Z in Ambisonics). NOTE: EFX's reverb vectors - * use a right-handled coordinate system, compared to the rest of OpenAL - * which uses left-handed. This is fixed by negating Z, however it would - * need to also be negated to get a proper Ambisonics angle, thus - * cancelling it out. - */ - a = atan2f(-vec[0], vec[2]); - aluMatrixfSet(&yrot, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, cosf(a), 0.0f, sinf(a), - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, -sinf(a), 0.0f, cosf(a) - ); - -#define MATRIX_MULT(_res, _m1, _m2) do { \ - int row, col; \ - for(col = 0;col < 4;col++) \ - { \ - for(row = 0;row < 4;row++) \ - _res.m[row][col] = _m1.m[row][0]*_m2.m[0][col] + _m1.m[row][1]*_m2.m[1][col] + \ - _m1.m[row][2]*_m2.m[2][col] + _m1.m[row][3]*_m2.m[3][col]; \ - } \ -} while(0) - /* Define a matrix that first focuses on Z, then rotates around X then Y to - * focus the output in the direction of the vector. - */ - MATRIX_MULT(tmp1, xrot, zfocus); - MATRIX_MULT(tmp2, yrot, tmp1); -#undef MATRIX_MULT - - return tmp2; -} - -/* Update the early and late 3D panning gains. */ -static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, const ALfloat gain, const ALfloat earlyGain, const ALfloat lateGain, ALreverbState *State) -{ - aluMatrixf transform, rot; - ALsizei i; - - STATIC_CAST(ALeffectState,State)->OutBuffer = Device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,State)->OutChannels = Device->FOAOut.NumChannels; - - /* Note: _res is transposed. */ -#define MATRIX_MULT(_res, _m1, _m2) do { \ - int row, col; \ - for(col = 0;col < 4;col++) \ - { \ - for(row = 0;row < 4;row++) \ - _res.m[col][row] = _m1.m[row][0]*_m2.m[0][col] + _m1.m[row][1]*_m2.m[1][col] + \ - _m1.m[row][2]*_m2.m[2][col] + _m1.m[row][3]*_m2.m[3][col]; \ - } \ -} while(0) - /* Create a matrix that first converts A-Format to B-Format, then rotates - * the B-Format soundfield according to the panning vector. - */ - rot = GetTransformFromVector(ReflectionsPan); - MATRIX_MULT(transform, rot, A2B); - memset(&State->Early.PanGain, 0, sizeof(State->Early.PanGain)); - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(Device->FOAOut, transform.m[i], gain*earlyGain, State->Early.PanGain[i]); - - rot = GetTransformFromVector(LateReverbPan); - MATRIX_MULT(transform, rot, A2B); - memset(&State->Late.PanGain, 0, sizeof(State->Late.PanGain)); - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(Device->FOAOut, transform.m[i], gain*lateGain, State->Late.PanGain[i]); -#undef MATRIX_MULT -} - -static ALvoid ALreverbState_update(ALreverbState *State, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) -{ - ALuint frequency = Device->Frequency; - ALfloat lfScale, hfScale, hfRatio; - ALfloat lfDecayTime, hfDecayTime; - ALfloat gain, gainlf, gainhf; - ALsizei i; - - if(Slot->Params.EffectType == AL_EFFECT_EAXREVERB && !EmulateEAXReverb) - State->IsEax = AL_TRUE; - else if(Slot->Params.EffectType == AL_EFFECT_REVERB || EmulateEAXReverb) - State->IsEax = AL_FALSE; - - /* Calculate the master filters */ - hfScale = props->Reverb.HFReference / frequency; - /* Restrict the filter gains from going below -60dB to keep the filter from - * killing most of the signal. - */ - gainhf = maxf(props->Reverb.GainHF, 0.001f); - ALfilterState_setParams(&State->Filter[0].Lp, ALfilterType_HighShelf, - gainhf, hfScale, calc_rcpQ_from_slope(gainhf, 1.0f)); - lfScale = props->Reverb.LFReference / frequency; - gainlf = maxf(props->Reverb.GainLF, 0.001f); - ALfilterState_setParams(&State->Filter[0].Hp, ALfilterType_LowShelf, - gainlf, lfScale, calc_rcpQ_from_slope(gainlf, 1.0f)); - for(i = 1;i < 4;i++) - { - ALfilterState_copyParams(&State->Filter[i].Lp, &State->Filter[0].Lp); - ALfilterState_copyParams(&State->Filter[i].Hp, &State->Filter[0].Hp); - } - - /* Update the main effect delay and associated taps. */ - UpdateDelayLine(props->Reverb.ReflectionsDelay, props->Reverb.LateReverbDelay, - props->Reverb.Density, props->Reverb.DecayTime, frequency, - State); - - /* Calculate the all-pass feed-back/forward coefficient. */ - State->ApFeedCoeff = sqrtf(0.5f) * powf(props->Reverb.Diffusion, 2.0f); - - /* Update the early lines. */ - UpdateEarlyLines(props->Reverb.Density, props->Reverb.DecayTime, - frequency, State); - - /* Get the mixing matrix coefficients. */ - CalcMatrixCoeffs(props->Reverb.Diffusion, &State->MixX, &State->MixY); - - /* If the HF limit parameter is flagged, calculate an appropriate limit - * based on the air absorption parameter. - */ - hfRatio = props->Reverb.DecayHFRatio; - if(props->Reverb.DecayHFLimit && props->Reverb.AirAbsorptionGainHF < 1.0f) - hfRatio = CalcLimitedHfRatio(hfRatio, props->Reverb.AirAbsorptionGainHF, - props->Reverb.DecayTime); - - /* Calculate the LF/HF decay times. */ - lfDecayTime = clampf(props->Reverb.DecayTime * props->Reverb.DecayLFRatio, - AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); - hfDecayTime = clampf(props->Reverb.DecayTime * hfRatio, - AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); - - /* Update the modulator line. */ - UpdateModulator(props->Reverb.ModulationTime, props->Reverb.ModulationDepth, - frequency, State); - - /* Update the late lines. */ - UpdateLateLines(props->Reverb.Density, props->Reverb.Diffusion, - lfDecayTime, props->Reverb.DecayTime, hfDecayTime, - F_TAU * lfScale, F_TAU * hfScale, - props->Reverb.EchoTime, props->Reverb.EchoDepth, - frequency, State); - - /* Update early and late 3D panning. */ - gain = props->Reverb.Gain * Slot->Params.Gain * ReverbBoost; - Update3DPanning(Device, props->Reverb.ReflectionsPan, - props->Reverb.LateReverbPan, gain, - props->Reverb.ReflectionsGain, - props->Reverb.LateReverbGain, State); - - /* Determine if delay-line cross-fading is required. */ - for(i = 0;i < 4;i++) - { - if((State->EarlyDelayTap[i][1] != State->EarlyDelayTap[i][0]) || - (State->Early.VecAp.Offset[i][1] != State->Early.VecAp.Offset[i][0]) || - (State->Early.Offset[i][1] != State->Early.Offset[i][0]) || - (State->LateDelayTap[i][1] != State->LateDelayTap[i][0]) || - (State->Late.VecAp.Offset[i][1] != State->Late.VecAp.Offset[i][0]) || - (State->Late.Offset[i][1] != State->Late.Offset[i][0])) - { - State->FadeCount = 0; - break; - } - } -} - - -/************************************** - * Effect Processing * - **************************************/ - -/* Basic delay line input/output routines. */ -static inline ALfloat DelayLineOut(const DelayLineI *Delay, const ALsizei offset, const ALsizei c) -{ - return Delay->Line[offset&Delay->Mask][c]; -} - -/* Cross-faded delay line output routine. Instead of interpolating the - * offsets, this interpolates (cross-fades) the outputs at each offset. - */ -static inline ALfloat FadedDelayLineOut(const DelayLineI *Delay, const ALsizei off0, - const ALsizei off1, const ALsizei c, const ALfloat mu) -{ - return lerp(Delay->Line[off0&Delay->Mask][c], Delay->Line[off1&Delay->Mask][c], mu); -} -#define DELAY_OUT_Faded(d, o0, o1, c, mu) FadedDelayLineOut(d, o0, o1, c, mu) -#define DELAY_OUT_Unfaded(d, o0, o1, c, mu) DelayLineOut(d, o0, c) - -static inline ALvoid DelayLineIn(DelayLineI *Delay, const ALsizei offset, const ALsizei c, const ALfloat in) -{ - Delay->Line[offset&Delay->Mask][c] = in; -} - -static inline ALvoid DelayLineIn4(DelayLineI *Delay, ALsizei offset, const ALfloat in[4]) -{ - ALsizei i; - offset &= Delay->Mask; - for(i = 0;i < 4;i++) - Delay->Line[offset][i] = in[i]; -} - -static inline ALvoid DelayLineIn4Rev(DelayLineI *Delay, ALsizei offset, const ALfloat in[4]) -{ - ALsizei i; - offset &= Delay->Mask; - for(i = 0;i < 4;i++) - Delay->Line[offset][i] = in[3-i]; -} - -static void CalcModulationDelays(ALreverbState *State, ALint *restrict delays, const ALsizei todo) -{ - ALfloat sinus, range; - ALsizei index, i; - - index = State->Mod.Index; - range = State->Mod.Filter; - for(i = 0;i < todo;i++) - { - /* Calculate the sinus rhythm (dependent on modulation time and the - * sampling rate). - */ - sinus = sinf(F_TAU * index / State->Mod.Range); - - /* Step the modulation index forward, keeping it bound to its range. */ - index = (index+1) % State->Mod.Range; - - /* The depth determines the range over which to read the input samples - * from, so it must be filtered to reduce the distortion caused by even - * small parameter changes. - */ - range = lerp(range, State->Mod.Depth, State->Mod.Coeff); - - /* Calculate the read offset. */ - delays[i] = lroundf(range*sinus); - } - State->Mod.Index = index; - State->Mod.Filter = range; -} - -/* Applies a scattering matrix to the 4-line (vector) input. This is used - * for both the below vector all-pass model and to perform modal feed-back - * delay network (FDN) mixing. - * - * The matrix is derived from a skew-symmetric matrix to form a 4D rotation - * matrix with a single unitary rotational parameter: - * - * [ d, a, b, c ] 1 = a^2 + b^2 + c^2 + d^2 - * [ -a, d, c, -b ] - * [ -b, -c, d, a ] - * [ -c, b, -a, d ] - * - * The rotation is constructed from the effect's diffusion parameter, - * yielding: - * - * 1 = x^2 + 3 y^2 - * - * Where a, b, and c are the coefficient y with differing signs, and d is the - * coefficient x. The final matrix is thus: - * - * [ x, y, -y, y ] n = sqrt(matrix_order - 1) - * [ -y, x, y, y ] t = diffusion_parameter * atan(n) - * [ y, -y, x, y ] x = cos(t) - * [ -y, -y, -y, x ] y = sin(t) / n - * - * Any square orthogonal matrix with an order that is a power of two will - * work (where ^T is transpose, ^-1 is inverse): - * - * M^T = M^-1 - * - * Using that knowledge, finding an appropriate matrix can be accomplished - * naively by searching all combinations of: - * - * M = D + S - S^T - * - * Where D is a diagonal matrix (of x), and S is a triangular matrix (of y) - * whose combination of signs are being iterated. - */ -static inline void VectorPartialScatter(ALfloat *restrict vec, const ALfloat xCoeff, const ALfloat yCoeff) -{ - const ALfloat f[4] = { vec[0], vec[1], vec[2], vec[3] }; - - vec[0] = xCoeff*f[0] + yCoeff*( f[1] + -f[2] + f[3]); - vec[1] = xCoeff*f[1] + yCoeff*(-f[0] + f[2] + f[3]); - vec[2] = xCoeff*f[2] + yCoeff*( f[0] + -f[1] + f[3]); - vec[3] = xCoeff*f[3] + yCoeff*(-f[0] + -f[1] + -f[2] ); -} - -/* This applies a Gerzon multiple-in/multiple-out (MIMO) vector all-pass - * filter to the 4-line input. - * - * It works by vectorizing a regular all-pass filter and replacing the delay - * element with a scattering matrix (like the one above) and a diagonal - * matrix of delay elements. - * - * Two static specializations are used for transitional (cross-faded) delay - * line processing and non-transitional processing. - */ -#define DECL_TEMPLATE(T) \ -static void VectorAllpass_##T(ALfloat *restrict vec, const ALsizei offset, \ - const ALfloat feedCoeff, const ALfloat xCoeff, \ - const ALfloat yCoeff, const ALfloat mu, \ - VecAllpass *Vap) \ -{ \ - ALfloat input; \ - ALfloat f[4]; \ - ALsizei i; \ - \ - (void)mu; /* Ignore for Unfaded. */ \ - \ - for(i = 0;i < 4;i++) \ - { \ - input = vec[i]; \ - vec[i] = DELAY_OUT_##T(&Vap->Delay, offset-Vap->Offset[i][0], \ - offset-Vap->Offset[i][1], i, mu) - \ - feedCoeff*input; \ - f[i] = input + feedCoeff*vec[i]; \ - } \ - \ - VectorPartialScatter(f, xCoeff, yCoeff); \ - \ - DelayLineIn4(&Vap->Delay, offset, f); \ -} -DECL_TEMPLATE(Unfaded) -DECL_TEMPLATE(Faded) -#undef DECL_TEMPLATE - -/* A helper to reverse vector components. */ -static inline void VectorReverse(ALfloat vec[4]) -{ - const ALfloat f[4] = { vec[0], vec[1], vec[2], vec[3] }; - - vec[0] = f[3]; - vec[1] = f[2]; - vec[2] = f[1]; - vec[3] = f[0]; -} - -/* This generates early reflections. - * - * This is done by obtaining the primary reflections (those arriving from the - * same direction as the source) from the main delay line. These are - * attenuated and all-pass filtered (based on the diffusion parameter). - * - * The early lines are then fed in reverse (according to the approximately - * opposite spatial location of the A-Format lines) to create the secondary - * reflections (those arriving from the opposite direction as the source). - * - * The early response is then completed by combining the primary reflections - * with the delayed and attenuated output from the early lines. - * - * Finally, the early response is reversed, scattered (based on diffusion), - * and fed into the late reverb section of the main delay line. - * - * Two static specializations are used for transitional (cross-faded) delay - * line processing and non-transitional processing. - */ -#define DECL_TEMPLATE(T) \ -static ALvoid EarlyReflection_##T(ALreverbState *State, const ALsizei todo, \ - ALfloat fade, \ - ALfloat (*restrict out)[MAX_UPDATE_SAMPLES])\ -{ \ - ALsizei offset = State->Offset; \ - const ALfloat apFeedCoeff = State->ApFeedCoeff; \ - const ALfloat mixX = State->MixX; \ - const ALfloat mixY = State->MixY; \ - ALfloat f[4]; \ - ALsizei i, j; \ - \ - for(i = 0;i < todo;i++) \ - { \ - for(j = 0;j < 4;j++) \ - f[j] = DELAY_OUT_##T(&State->Delay, \ - offset-State->EarlyDelayTap[j][0], \ - offset-State->EarlyDelayTap[j][1], j, fade \ - ) * State->EarlyDelayCoeff[j]; \ - \ - VectorAllpass_##T(f, offset, apFeedCoeff, mixX, mixY, fade, \ - &State->Early.VecAp); \ - \ - DelayLineIn4Rev(&State->Early.Delay, offset, f); \ - \ - for(j = 0;j < 4;j++) \ - f[j] += DELAY_OUT_##T(&State->Early.Delay, \ - offset-State->Early.Offset[j][0], \ - offset-State->Early.Offset[j][1], j, fade \ - ) * State->Early.Coeff[j]; \ - \ - for(j = 0;j < 4;j++) \ - out[j][i] = f[j]; \ - \ - VectorReverse(f); \ - \ - VectorPartialScatter(f, mixX, mixY); \ - \ - DelayLineIn4(&State->Delay, offset-State->LateFeedTap, f); \ - \ - offset++; \ - fade += FadeStep; \ - } \ -} -DECL_TEMPLATE(Unfaded) -DECL_TEMPLATE(Faded) -#undef DECL_TEMPLATE - -/* Applies a first order filter section. */ -static inline ALfloat FirstOrderFilter(const ALfloat in, const ALfloat coeffs[3], ALfloat state[2]) -{ - ALfloat out = coeffs[0]*in + coeffs[1]*state[0] + coeffs[2]*state[1]; - - state[0] = in; - state[1] = out; - - return out; -} - -/* Applies the two T60 damping filter sections. */ -static inline ALfloat LateT60Filter(const ALsizei index, const ALfloat in, ALreverbState *State) -{ - ALfloat out = FirstOrderFilter(in, State->Late.Filters[index].LFCoeffs, - State->Late.Filters[index].States[0]); - - return State->Late.Filters[index].MidCoeff * - FirstOrderFilter(out, State->Late.Filters[index].HFCoeffs, - State->Late.Filters[index].States[1]); -} - -/* This generates the reverb tail using a modified feed-back delay network - * (FDN). - * - * Results from the early reflections are attenuated by the density gain and - * mixed with the output from the late delay lines. - * - * The late response is then completed by T60 and all-pass filtering the mix. - * - * Finally, the lines are reversed (so they feed their opposite directions) - * and scattered with the FDN matrix before re-feeding the delay lines. - * - * Two static specializations are used for transitional (cross-faded) delay - * line processing and non-transitional processing. - */ -#define DECL_TEMPLATE(T) \ -static ALvoid LateReverb_##T(ALreverbState *State, const ALsizei todo, \ - ALfloat fade, \ - ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) \ -{ \ - const ALfloat apFeedCoeff = State->ApFeedCoeff; \ - const ALfloat mixX = State->MixX; \ - const ALfloat mixY = State->MixY; \ - ALint moddelay[MAX_UPDATE_SAMPLES]; \ - ALsizei delay; \ - ALsizei offset; \ - ALsizei i, j; \ - ALfloat f[4]; \ - \ - CalcModulationDelays(State, moddelay, todo); \ - \ - offset = State->Offset; \ - for(i = 0;i < todo;i++) \ - { \ - for(j = 0;j < 4;j++) \ - f[j] = DELAY_OUT_##T(&State->Delay, \ - offset-State->LateDelayTap[j][0], \ - offset-State->LateDelayTap[j][1], j, fade \ - ) * State->Late.DensityGain; \ - \ - delay = offset - moddelay[i]; \ - for(j = 0;j < 4;j++) \ - f[j] += DELAY_OUT_##T(&State->Late.Delay, \ - delay-State->Late.Offset[j][0], \ - delay-State->Late.Offset[j][1], j, fade \ - ); \ - \ - for(j = 0;j < 4;j++) \ - f[j] = LateT60Filter(j, f[j], State); \ - \ - VectorAllpass_##T(f, offset, apFeedCoeff, mixX, mixY, fade, \ - &State->Late.VecAp); \ - \ - for(j = 0;j < 4;j++) \ - out[j][i] = f[j]; \ - \ - VectorReverse(f); \ - \ - VectorPartialScatter(f, mixX, mixY); \ - \ - DelayLineIn4(&State->Late.Delay, offset, f); \ - \ - offset++; \ - fade += FadeStep; \ - } \ -} -DECL_TEMPLATE(Unfaded) -DECL_TEMPLATE(Faded) -#undef DECL_TEMPLATE - -typedef ALfloat (*ProcMethodType)(ALreverbState *State, const ALsizei todo, ALfloat fade, - const ALfloat (*restrict input)[MAX_UPDATE_SAMPLES], - ALfloat (*restrict early)[MAX_UPDATE_SAMPLES], ALfloat (*restrict late)[MAX_UPDATE_SAMPLES]); - -/* Perform the non-EAX reverb pass on a given input sample, resulting in - * four-channel output. - */ -static ALfloat VerbPass(ALreverbState *State, const ALsizei todo, ALfloat fade, - const ALfloat (*restrict input)[MAX_UPDATE_SAMPLES], - ALfloat (*restrict early)[MAX_UPDATE_SAMPLES], - ALfloat (*restrict late)[MAX_UPDATE_SAMPLES]) -{ - ALsizei i, c; - - for(c = 0;c < 4;c++) - { - /* Low-pass filter the incoming samples (use the early buffer as temp - * storage). - */ - ALfilterState_process(&State->Filter[c].Lp, &early[0][0], input[c], todo); - - /* Feed the initial delay line. */ - for(i = 0;i < todo;i++) - DelayLineIn(&State->Delay, State->Offset+i, c, early[0][i]); - } - - if(fade < 1.0f) - { - /* Generate early reflections. */ - EarlyReflection_Faded(State, todo, fade, early); - - /* Generate late reverb. */ - LateReverb_Faded(State, todo, fade, late); - fade = minf(1.0f, fade + todo*FadeStep); - } - else - { - /* Generate early reflections. */ - EarlyReflection_Unfaded(State, todo, fade, early); - - /* Generate late reverb. */ - LateReverb_Unfaded(State, todo, fade, late); - } - - /* Step all delays forward one sample. */ - State->Offset += todo; - - return fade; -} - -/* Perform the EAX reverb pass on a given input sample, resulting in four- - * channel output. - */ -static ALfloat EAXVerbPass(ALreverbState *State, const ALsizei todo, ALfloat fade, - const ALfloat (*restrict input)[MAX_UPDATE_SAMPLES], - ALfloat (*restrict early)[MAX_UPDATE_SAMPLES], - ALfloat (*restrict late)[MAX_UPDATE_SAMPLES]) -{ - ALsizei i, c; - - for(c = 0;c < 4;c++) - { - /* Band-pass the incoming samples. Use the early output lines for temp - * storage. - */ - ALfilterState_process(&State->Filter[c].Lp, early[0], input[c], todo); - ALfilterState_process(&State->Filter[c].Hp, early[1], early[0], todo); - - /* Feed the initial delay line. */ - for(i = 0;i < todo;i++) - DelayLineIn(&State->Delay, State->Offset+i, c, early[1][i]); - } - - if(fade < 1.0f) - { - /* Generate early reflections. */ - EarlyReflection_Faded(State, todo, fade, early); - - /* Generate late reverb. */ - LateReverb_Faded(State, todo, fade, late); - fade = minf(1.0f, fade + todo*FadeStep); - } - else - { - /* Generate early reflections. */ - EarlyReflection_Unfaded(State, todo, fade, early); - - /* Generate late reverb. */ - LateReverb_Unfaded(State, todo, fade, late); - } - - /* Step all delays forward. */ - State->Offset += todo; - - return fade; -} - -static ALvoid ALreverbState_process(ALreverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) -{ - ProcMethodType ReverbProc = State->IsEax ? EAXVerbPass : VerbPass; - ALfloat (*restrict afmt)[MAX_UPDATE_SAMPLES] = State->AFormatSamples; - ALfloat (*restrict early)[MAX_UPDATE_SAMPLES] = State->EarlySamples; - ALfloat (*restrict late)[MAX_UPDATE_SAMPLES] = State->ReverbSamples; - ALsizei fadeCount = State->FadeCount; - ALfloat fade = (ALfloat)fadeCount / FADE_SAMPLES; - ALsizei base, c; - - /* Process reverb for these samples. */ - for(base = 0;base < SamplesToDo;) - { - ALsizei todo = mini(SamplesToDo-base, MAX_UPDATE_SAMPLES); - /* If cross-fading, don't do more samples than there are to fade. */ - if(FADE_SAMPLES-fadeCount > 0) - todo = mini(todo, FADE_SAMPLES-fadeCount); - - /* Convert B-Format to A-Format for processing. */ - memset(afmt, 0, sizeof(*afmt)*4); - for(c = 0;c < 4;c++) - MixRowSamples(afmt[c], B2A.m[c], - SamplesIn, MAX_EFFECT_CHANNELS, base, todo - ); - - /* Process the samples for reverb. */ - fade = ReverbProc(State, todo, fade, afmt, early, late); - if(UNEXPECTED(fadeCount < FADE_SAMPLES) && (fadeCount += todo) >= FADE_SAMPLES) - { - /* Update the cross-fading delay line taps. */ - fadeCount = FADE_SAMPLES; - fade = 1.0f; - for(c = 0;c < 4;c++) - { - State->EarlyDelayTap[c][0] = State->EarlyDelayTap[c][1]; - State->Early.VecAp.Offset[c][0] = State->Early.VecAp.Offset[c][1]; - State->Early.Offset[c][0] = State->Early.Offset[c][1]; - State->LateDelayTap[c][0] = State->LateDelayTap[c][1]; - State->Late.VecAp.Offset[c][0] = State->Late.VecAp.Offset[c][1]; - State->Late.Offset[c][0] = State->Late.Offset[c][1]; - } - } - - /* Mix the A-Format results to output, implicitly converting back to - * B-Format. - */ - for(c = 0;c < 4;c++) - MixSamples(early[c], NumChannels, SamplesOut, - State->Early.CurrentGain[c], State->Early.PanGain[c], - SamplesToDo-base, base, todo - ); - for(c = 0;c < 4;c++) - MixSamples(late[c], NumChannels, SamplesOut, - State->Late.CurrentGain[c], State->Late.PanGain[c], - SamplesToDo-base, base, todo - ); - - base += todo; - } - State->FadeCount = fadeCount; -} - - -typedef struct ALreverbStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALreverbStateFactory; - -static ALeffectState *ALreverbStateFactory_create(ALreverbStateFactory* UNUSED(factory)) -{ - ALreverbState *state; - - alcall_once(&mixfunc_inited, init_mixfunc); - - NEW_OBJ0(state, ALreverbState)(); - if(!state) return NULL; - - return STATIC_CAST(ALeffectState, state); -} - -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALreverbStateFactory); - -ALeffectStateFactory *ALreverbStateFactory_getFactory(void) -{ - static ALreverbStateFactory ReverbFactory = { { GET_VTABLE2(ALreverbStateFactory, ALeffectStateFactory) } }; - - return STATIC_CAST(ALeffectStateFactory, &ReverbFactory); -} - - -void ALeaxreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DECAY_HFLIMIT: - if(!(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayHFLimit = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALeaxreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALeaxreverb_setParami(effect, context, param, vals[0]); -} -void ALeaxreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DENSITY: - if(!(val >= AL_EAXREVERB_MIN_DENSITY && val <= AL_EAXREVERB_MAX_DENSITY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Density = val; - break; - - case AL_EAXREVERB_DIFFUSION: - if(!(val >= AL_EAXREVERB_MIN_DIFFUSION && val <= AL_EAXREVERB_MAX_DIFFUSION)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Diffusion = val; - break; - - case AL_EAXREVERB_GAIN: - if(!(val >= AL_EAXREVERB_MIN_GAIN && val <= AL_EAXREVERB_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Gain = val; - break; - - case AL_EAXREVERB_GAINHF: - if(!(val >= AL_EAXREVERB_MIN_GAINHF && val <= AL_EAXREVERB_MAX_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.GainHF = val; - break; - - case AL_EAXREVERB_GAINLF: - if(!(val >= AL_EAXREVERB_MIN_GAINLF && val <= AL_EAXREVERB_MAX_GAINLF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.GainLF = val; - break; - - case AL_EAXREVERB_DECAY_TIME: - if(!(val >= AL_EAXREVERB_MIN_DECAY_TIME && val <= AL_EAXREVERB_MAX_DECAY_TIME)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayTime = val; - break; - - case AL_EAXREVERB_DECAY_HFRATIO: - if(!(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO && val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayHFRatio = val; - break; - - case AL_EAXREVERB_DECAY_LFRATIO: - if(!(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO && val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayLFRatio = val; - break; - - case AL_EAXREVERB_REFLECTIONS_GAIN: - if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ReflectionsGain = val; - break; - - case AL_EAXREVERB_REFLECTIONS_DELAY: - if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ReflectionsDelay = val; - break; - - case AL_EAXREVERB_LATE_REVERB_GAIN: - if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LateReverbGain = val; - break; - - case AL_EAXREVERB_LATE_REVERB_DELAY: - if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LateReverbDelay = val; - break; - - case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: - if(!(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.AirAbsorptionGainHF = val; - break; - - case AL_EAXREVERB_ECHO_TIME: - if(!(val >= AL_EAXREVERB_MIN_ECHO_TIME && val <= AL_EAXREVERB_MAX_ECHO_TIME)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.EchoTime = val; - break; - - case AL_EAXREVERB_ECHO_DEPTH: - if(!(val >= AL_EAXREVERB_MIN_ECHO_DEPTH && val <= AL_EAXREVERB_MAX_ECHO_DEPTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.EchoDepth = val; - break; - - case AL_EAXREVERB_MODULATION_TIME: - if(!(val >= AL_EAXREVERB_MIN_MODULATION_TIME && val <= AL_EAXREVERB_MAX_MODULATION_TIME)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ModulationTime = val; - break; - - case AL_EAXREVERB_MODULATION_DEPTH: - if(!(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH && val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ModulationDepth = val; - break; - - case AL_EAXREVERB_HFREFERENCE: - if(!(val >= AL_EAXREVERB_MIN_HFREFERENCE && val <= AL_EAXREVERB_MAX_HFREFERENCE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.HFReference = val; - break; - - case AL_EAXREVERB_LFREFERENCE: - if(!(val >= AL_EAXREVERB_MIN_LFREFERENCE && val <= AL_EAXREVERB_MAX_LFREFERENCE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LFReference = val; - break; - - case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: - if(!(val >= AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.RoomRolloffFactor = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALeaxreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_REFLECTIONS_PAN: - if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ReflectionsPan[0] = vals[0]; - props->Reverb.ReflectionsPan[1] = vals[1]; - props->Reverb.ReflectionsPan[2] = vals[2]; - break; - case AL_EAXREVERB_LATE_REVERB_PAN: - if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LateReverbPan[0] = vals[0]; - props->Reverb.LateReverbPan[1] = vals[1]; - props->Reverb.LateReverbPan[2] = vals[2]; - break; - - default: - ALeaxreverb_setParamf(effect, context, param, vals[0]); - break; - } -} - -void ALeaxreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DECAY_HFLIMIT: - *val = props->Reverb.DecayHFLimit; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALeaxreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALeaxreverb_getParami(effect, context, param, vals); -} -void ALeaxreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_DENSITY: - *val = props->Reverb.Density; - break; - - case AL_EAXREVERB_DIFFUSION: - *val = props->Reverb.Diffusion; - break; - - case AL_EAXREVERB_GAIN: - *val = props->Reverb.Gain; - break; - - case AL_EAXREVERB_GAINHF: - *val = props->Reverb.GainHF; - break; - - case AL_EAXREVERB_GAINLF: - *val = props->Reverb.GainLF; - break; - - case AL_EAXREVERB_DECAY_TIME: - *val = props->Reverb.DecayTime; - break; - - case AL_EAXREVERB_DECAY_HFRATIO: - *val = props->Reverb.DecayHFRatio; - break; - - case AL_EAXREVERB_DECAY_LFRATIO: - *val = props->Reverb.DecayLFRatio; - break; - - case AL_EAXREVERB_REFLECTIONS_GAIN: - *val = props->Reverb.ReflectionsGain; - break; - - case AL_EAXREVERB_REFLECTIONS_DELAY: - *val = props->Reverb.ReflectionsDelay; - break; - - case AL_EAXREVERB_LATE_REVERB_GAIN: - *val = props->Reverb.LateReverbGain; - break; - - case AL_EAXREVERB_LATE_REVERB_DELAY: - *val = props->Reverb.LateReverbDelay; - break; - - case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: - *val = props->Reverb.AirAbsorptionGainHF; - break; - - case AL_EAXREVERB_ECHO_TIME: - *val = props->Reverb.EchoTime; - break; - - case AL_EAXREVERB_ECHO_DEPTH: - *val = props->Reverb.EchoDepth; - break; - - case AL_EAXREVERB_MODULATION_TIME: - *val = props->Reverb.ModulationTime; - break; - - case AL_EAXREVERB_MODULATION_DEPTH: - *val = props->Reverb.ModulationDepth; - break; - - case AL_EAXREVERB_HFREFERENCE: - *val = props->Reverb.HFReference; - break; - - case AL_EAXREVERB_LFREFERENCE: - *val = props->Reverb.LFReference; - break; - - case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: - *val = props->Reverb.RoomRolloffFactor; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALeaxreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_EAXREVERB_REFLECTIONS_PAN: - vals[0] = props->Reverb.ReflectionsPan[0]; - vals[1] = props->Reverb.ReflectionsPan[1]; - vals[2] = props->Reverb.ReflectionsPan[2]; - break; - case AL_EAXREVERB_LATE_REVERB_PAN: - vals[0] = props->Reverb.LateReverbPan[0]; - vals[1] = props->Reverb.LateReverbPan[1]; - vals[2] = props->Reverb.LateReverbPan[2]; - break; - - default: - ALeaxreverb_getParamf(effect, context, param, vals); - break; - } -} - -DEFINE_ALEFFECT_VTABLE(ALeaxreverb); - -void ALreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DECAY_HFLIMIT: - if(!(val >= AL_REVERB_MIN_DECAY_HFLIMIT && val <= AL_REVERB_MAX_DECAY_HFLIMIT)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayHFLimit = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALreverb_setParami(effect, context, param, vals[0]); -} -void ALreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) -{ - ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DENSITY: - if(!(val >= AL_REVERB_MIN_DENSITY && val <= AL_REVERB_MAX_DENSITY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Density = val; - break; - - case AL_REVERB_DIFFUSION: - if(!(val >= AL_REVERB_MIN_DIFFUSION && val <= AL_REVERB_MAX_DIFFUSION)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Diffusion = val; - break; - - case AL_REVERB_GAIN: - if(!(val >= AL_REVERB_MIN_GAIN && val <= AL_REVERB_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.Gain = val; - break; - - case AL_REVERB_GAINHF: - if(!(val >= AL_REVERB_MIN_GAINHF && val <= AL_REVERB_MAX_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.GainHF = val; - break; - - case AL_REVERB_DECAY_TIME: - if(!(val >= AL_REVERB_MIN_DECAY_TIME && val <= AL_REVERB_MAX_DECAY_TIME)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayTime = val; - break; - - case AL_REVERB_DECAY_HFRATIO: - if(!(val >= AL_REVERB_MIN_DECAY_HFRATIO && val <= AL_REVERB_MAX_DECAY_HFRATIO)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.DecayHFRatio = val; - break; - - case AL_REVERB_REFLECTIONS_GAIN: - if(!(val >= AL_REVERB_MIN_REFLECTIONS_GAIN && val <= AL_REVERB_MAX_REFLECTIONS_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ReflectionsGain = val; - break; - - case AL_REVERB_REFLECTIONS_DELAY: - if(!(val >= AL_REVERB_MIN_REFLECTIONS_DELAY && val <= AL_REVERB_MAX_REFLECTIONS_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.ReflectionsDelay = val; - break; - - case AL_REVERB_LATE_REVERB_GAIN: - if(!(val >= AL_REVERB_MIN_LATE_REVERB_GAIN && val <= AL_REVERB_MAX_LATE_REVERB_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LateReverbGain = val; - break; - - case AL_REVERB_LATE_REVERB_DELAY: - if(!(val >= AL_REVERB_MIN_LATE_REVERB_DELAY && val <= AL_REVERB_MAX_LATE_REVERB_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.LateReverbDelay = val; - break; - - case AL_REVERB_AIR_ABSORPTION_GAINHF: - if(!(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.AirAbsorptionGainHF = val; - break; - - case AL_REVERB_ROOM_ROLLOFF_FACTOR: - if(!(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - props->Reverb.RoomRolloffFactor = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALreverb_setParamf(effect, context, param, vals[0]); -} - -void ALreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DECAY_HFLIMIT: - *val = props->Reverb.DecayHFLimit; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALreverb_getParami(effect, context, param, vals); -} -void ALreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) -{ - const ALeffectProps *props = &effect->Props; - switch(param) - { - case AL_REVERB_DENSITY: - *val = props->Reverb.Density; - break; - - case AL_REVERB_DIFFUSION: - *val = props->Reverb.Diffusion; - break; - - case AL_REVERB_GAIN: - *val = props->Reverb.Gain; - break; - - case AL_REVERB_GAINHF: - *val = props->Reverb.GainHF; - break; - - case AL_REVERB_DECAY_TIME: - *val = props->Reverb.DecayTime; - break; - - case AL_REVERB_DECAY_HFRATIO: - *val = props->Reverb.DecayHFRatio; - break; - - case AL_REVERB_REFLECTIONS_GAIN: - *val = props->Reverb.ReflectionsGain; - break; - - case AL_REVERB_REFLECTIONS_DELAY: - *val = props->Reverb.ReflectionsDelay; - break; - - case AL_REVERB_LATE_REVERB_GAIN: - *val = props->Reverb.LateReverbGain; - break; - - case AL_REVERB_LATE_REVERB_DELAY: - *val = props->Reverb.LateReverbDelay; - break; - - case AL_REVERB_AIR_ABSORPTION_GAINHF: - *val = props->Reverb.AirAbsorptionGainHF; - break; - - case AL_REVERB_ROOM_ROLLOFF_FACTOR: - *val = props->Reverb.RoomRolloffFactor; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -void ALreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALreverb_getParamf(effect, context, param, vals); -} - -DEFINE_ALEFFECT_VTABLE(ALreverb); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/hrtf.h b/love/src/jni/openal-soft-1.18.2/Alc/hrtf.h deleted file mode 100644 index 5de28f90..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/hrtf.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef ALC_HRTF_H -#define ALC_HRTF_H - -#include "AL/al.h" -#include "AL/alc.h" - -#include "alMain.h" -#include "alstring.h" -#include "atomic.h" - - -/* The maximum number of virtual speakers used to generate HRTF coefficients - * for decoding B-Format. - */ -#define HRTF_AMBI_MAX_CHANNELS 16 - - -struct HrtfEntry; - -struct Hrtf { - RefCount ref; - - ALuint sampleRate; - ALsizei irSize; - ALubyte evCount; - - const ALubyte *azCount; - const ALushort *evOffset; - const ALfloat (*coeffs)[2]; - const ALubyte (*delays)[2]; -}; - - -void FreeHrtfs(void); - -vector_EnumeratedHrtf EnumerateHrtf(const_al_string devname); -void FreeHrtfList(vector_EnumeratedHrtf *list); -struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry); -void Hrtf_IncRef(struct Hrtf *hrtf); -void Hrtf_DecRef(struct Hrtf *hrtf); - -void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat spread, ALfloat (*coeffs)[2], ALsizei *delays); - -/** - * Produces HRTF filter coefficients for decoding B-Format, given a set of - * virtual speaker positions and HF/LF matrices for decoding to them. The - * returned coefficients are ordered and scaled according to the matrices. - * Returns the maximum impulse-response length of the generated coefficients. - */ -ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsizei NumChannels, const ALfloat (*restrict AmbiPoints)[2], const ALfloat (*restrict AmbiMatrix)[2][MAX_AMBI_COEFFS], ALsizei AmbiCount); - -#endif /* ALC_HRTF_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mastering.c b/love/src/jni/openal-soft-1.18.2/Alc/mastering.c deleted file mode 100644 index 9de5fd5f..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/mastering.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "config.h" - -#include - -#include "alu.h" -#include "almalloc.h" - -#define RMS_WINDOW_SIZE (1<<7) -#define RMS_WINDOW_MASK (RMS_WINDOW_SIZE-1) -#define RMS_VALUE_MAX (1<<24) - -#define LOOKAHEAD_SIZE (1<<13) -#define LOOKAHEAD_MASK (LOOKAHEAD_SIZE-1) - -static_assert(RMS_VALUE_MAX < (UINT_MAX / RMS_WINDOW_SIZE), "RMS_VALUE_MAX is too big"); - -typedef struct Compressor { - ALfloat PreGain; - ALfloat PostGain; - ALboolean SummedLink; - ALfloat AttackMin; - ALfloat AttackMax; - ALfloat ReleaseMin; - ALfloat ReleaseMax; - ALfloat Ratio; - ALfloat Threshold; - ALfloat Knee; - ALuint SampleRate; - - ALuint RmsSum; - ALuint *RmsWindow; - ALsizei RmsIndex; - ALfloat Envelope[BUFFERSIZE]; - ALfloat EnvLast; -} Compressor; - -/* Multichannel compression is linked via one of two modes: - * - * Summed - Absolute sum of all channels. - * Maxed - Absolute maximum of any channel. - */ -static void SumChannels(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = 0.0f; - - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] += OutBuffer[c][i]; - } - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = fabsf(Comp->Envelope[i]); -} - -static void MaxChannels(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = 0.0f; - - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] = maxf(Comp->Envelope[i], fabsf(OutBuffer[c][i])); - } -} - -/* Envelope detection/sensing can be done via: - * - * RMS - Rectangular windowed root mean square of linking stage. - * Peak - Implicit output from linking stage. - */ -static void RmsDetection(Compressor *Comp, const ALsizei SamplesToDo) -{ - ALuint sum = Comp->RmsSum; - ALuint *window = Comp->RmsWindow; - ALsizei index = Comp->RmsIndex; - ALsizei i; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat sig = Comp->Envelope[i]; - - sum -= window[index]; - window[index] = fastf2i(minf(sig * sig * 65536.0f, RMS_VALUE_MAX)); - sum += window[index]; - index = (index + 1) & RMS_WINDOW_MASK; - - Comp->Envelope[i] = sqrtf(sum / 65536.0f / RMS_WINDOW_SIZE); - } - - Comp->RmsSum = sum; - Comp->RmsIndex = index; -} - -/* This isn't a very sophisticated envelope follower, but it gets the job - * done. First, it operates at logarithmic scales to keep transitions - * appropriate for human hearing. Second, it can apply adaptive (automated) - * attack/release adjustments based on the signal. - */ -static void FollowEnvelope(Compressor *Comp, const ALsizei SamplesToDo) -{ - ALfloat attackMin = Comp->AttackMin; - ALfloat attackMax = Comp->AttackMax; - ALfloat releaseMin = Comp->ReleaseMin; - ALfloat releaseMax = Comp->ReleaseMax; - ALfloat last = Comp->EnvLast; - ALsizei i; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat env = maxf(-6.0f, log10f(Comp->Envelope[i])); - ALfloat slope = minf(1.0f, fabsf(env - last) / 4.5f); - - if(env > last) - last = minf(env, last + lerp(attackMin, attackMax, 1.0f - (slope * slope))); - else - last = maxf(env, last + lerp(releaseMin, releaseMax, 1.0f - (slope * slope))); - - Comp->Envelope[i] = last; - } - - Comp->EnvLast = last; -} - -/* The envelope is converted to control gain with an optional soft knee. */ -static void EnvelopeGain(Compressor *Comp, const ALsizei SamplesToDo, const ALfloat Slope) -{ - const ALfloat threshold = Comp->Threshold; - const ALfloat knee = Comp->Knee; - ALsizei i; - - if(!(knee > 0.0f)) - { - for(i = 0;i < SamplesToDo;i++) - { - ALfloat gain = Slope * (threshold - Comp->Envelope[i]); - Comp->Envelope[i] = powf(10.0f, minf(0.0f, gain)); - } - } - else - { - const ALfloat lower = threshold - (0.5f * knee); - const ALfloat upper = threshold + (0.5f * knee); - const ALfloat m = 0.5f * Slope / knee; - - for(i = 0;i < SamplesToDo;i++) - { - ALfloat env = Comp->Envelope[i]; - ALfloat gain; - - if(env > lower && env < upper) - gain = m * (env - lower) * (lower - env); - else - gain = Slope * (threshold - env); - - Comp->Envelope[i] = powf(10.0f, minf(0.0f, gain)); - } - } -} - - -Compressor *CompressorInit(const ALfloat PreGainDb, const ALfloat PostGainDb, - const ALboolean SummedLink, const ALboolean RmsSensing, - const ALfloat AttackTimeMin, const ALfloat AttackTimeMax, - const ALfloat ReleaseTimeMin, const ALfloat ReleaseTimeMax, - const ALfloat Ratio, const ALfloat ThresholdDb, - const ALfloat KneeDb, const ALuint SampleRate) -{ - Compressor *Comp; - size_t size; - ALsizei i; - - size = sizeof(*Comp); - if(RmsSensing) - size += sizeof(Comp->RmsWindow[0]) * RMS_WINDOW_SIZE; - Comp = al_calloc(16, size); - - Comp->PreGain = powf(10.0f, PreGainDb / 20.0f); - Comp->PostGain = powf(10.0f, PostGainDb / 20.0f); - Comp->SummedLink = SummedLink; - Comp->AttackMin = 1.0f / maxf(0.000001f, AttackTimeMin * SampleRate * logf(10.0f)); - Comp->AttackMax = 1.0f / maxf(0.000001f, AttackTimeMax * SampleRate * logf(10.0f)); - Comp->ReleaseMin = -1.0f / maxf(0.000001f, ReleaseTimeMin * SampleRate * logf(10.0f)); - Comp->ReleaseMax = -1.0f / maxf(0.000001f, ReleaseTimeMax * SampleRate * logf(10.0f)); - Comp->Ratio = Ratio; - Comp->Threshold = ThresholdDb / 20.0f; - Comp->Knee = maxf(0.0f, KneeDb / 20.0f); - Comp->SampleRate = SampleRate; - - Comp->RmsSum = 0; - if(RmsSensing) - Comp->RmsWindow = (ALuint*)(Comp+1); - else - Comp->RmsWindow = NULL; - Comp->RmsIndex = 0; - - for(i = 0;i < BUFFERSIZE;i++) - Comp->Envelope[i] = 0.0f; - Comp->EnvLast = -6.0f; - - return Comp; -} - -ALuint GetCompressorSampleRate(const Compressor *Comp) -{ - return Comp->SampleRate; -} - -void ApplyCompression(Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]) -{ - ALsizei c, i; - - if(Comp->PreGain != 1.0f) - { - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - OutBuffer[c][i] *= Comp->PreGain; - } - } - - if(Comp->SummedLink) - SumChannels(Comp, NumChans, SamplesToDo, OutBuffer); - else - MaxChannels(Comp, NumChans, SamplesToDo, OutBuffer); - - if(Comp->RmsWindow) - RmsDetection(Comp, SamplesToDo); - FollowEnvelope(Comp, SamplesToDo); - - if(Comp->Ratio > 0.0f) - EnvelopeGain(Comp, SamplesToDo, 1.0f - (1.0f / Comp->Ratio)); - else - EnvelopeGain(Comp, SamplesToDo, 1.0f); - - if(Comp->PostGain != 1.0f) - { - for(i = 0;i < SamplesToDo;i++) - Comp->Envelope[i] *= Comp->PostGain; - } - for(c = 0;c < NumChans;c++) - { - for(i = 0;i < SamplesToDo;i++) - OutBuffer[c][i] *= Comp->Envelope[i]; - } -} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_neon.c b/love/src/jni/openal-soft-1.18.2/Alc/mixer_neon.c deleted file mode 100644 index 51191783..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_neon.c +++ /dev/null @@ -1,331 +0,0 @@ -#include "config.h" - -#include - -#include "AL/al.h" -#include "AL/alc.h" -#include "alMain.h" -#include "alu.h" -#include "hrtf.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_lerp32_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); - const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALsizei frac_[4]; - int32x4_t pos4; - int32x4_t frac4; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - - frac4 = vld1q_s32(frac_); - pos4 = vld1q_s32(pos_); - - for(i = 0;numsamples-i > 3;i += 4) - { - const float32x4_t val1 = (float32x4_t){src[pos_[0]], src[pos_[1]], src[pos_[2]], src[pos_[3]]}; - const float32x4_t val2 = (float32x4_t){src[pos_[0]+1], src[pos_[1]+1], src[pos_[2]+1], src[pos_[3]+1]}; - - /* val1 + (val2-val1)*mu */ - const float32x4_t r0 = vsubq_f32(val2, val1); - const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); - const float32x4_t out = vmlaq_f32(val1, mu, r0); - - vst1q_f32(&dst[i], out); - - frac4 = vaddq_s32(frac4, increment4); - pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); - frac4 = vandq_s32(frac4, fracMask4); - - vst1q_s32(pos_, pos4); - } - - if(i < numsamples) - { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - ALint pos = pos_[0]; - frac = vgetq_lane_s32(frac4, 0); - do { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); - } - return dst; -} - -const ALfloat *Resample_fir4_32_Neon(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const int32x4_t increment4 = vdupq_n_s32(increment*4); - const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); - alignas(16) ALint pos_[4]; - alignas(16) ALsizei frac_[4]; - int32x4_t pos4; - int32x4_t frac4; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_, pos_, 4); - - frac4 = vld1q_s32(frac_); - pos4 = vld1q_s32(pos_); - - --src; - for(i = 0;numsamples-i > 3;i += 4) - { - const float32x4_t val0 = vld1q_f32(&src[pos_[0]]); - const float32x4_t val1 = vld1q_f32(&src[pos_[1]]); - const float32x4_t val2 = vld1q_f32(&src[pos_[2]]); - const float32x4_t val3 = vld1q_f32(&src[pos_[3]]); - float32x4_t k0 = vld1q_f32(sinc4Tab[frac_[0]]); - float32x4_t k1 = vld1q_f32(sinc4Tab[frac_[1]]); - float32x4_t k2 = vld1q_f32(sinc4Tab[frac_[2]]); - float32x4_t k3 = vld1q_f32(sinc4Tab[frac_[3]]); - float32x4_t out; - - k0 = vmulq_f32(k0, val0); - k1 = vmulq_f32(k1, val1); - k2 = vmulq_f32(k2, val2); - k3 = vmulq_f32(k3, val3); - k0 = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k1), vget_high_f32(k1))); - k2 = vcombine_f32(vpadd_f32(vget_low_f32(k2), vget_high_f32(k2)), - vpadd_f32(vget_low_f32(k3), vget_high_f32(k3))); - out = vcombine_f32(vpadd_f32(vget_low_f32(k0), vget_high_f32(k0)), - vpadd_f32(vget_low_f32(k2), vget_high_f32(k2))); - - vst1q_f32(&dst[i], out); - - frac4 = vaddq_s32(frac4, increment4); - pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); - frac4 = vandq_s32(frac4, fracMask4); - - vst1q_s32(pos_, pos4); - vst1q_s32(frac_, frac4); - } - - if(i < numsamples) - { - /* NOTE: These four elements represent the position *after* the last - * four samples, so the lowest element is the next position to - * resample. - */ - ALint pos = pos_[0]; - frac = frac_[0]; - do { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } while(++i < numsamples); - } - return dst; -} - -const ALfloat *Resample_bsinc32_Neon(const InterpState *state, - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei dstlen) -{ - const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); - const ALsizei m = state->bsinc.m; - const ALfloat *fil, *scd, *phd, *spd; - ALsizei pi, i, j; - float32x4_t r4; - ALfloat pf; - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<bsinc.coeffs[pi].filter, 16); - scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); - phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); - spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); - - // Apply the scale and phase interpolated filter. - r4 = vdupq_n_f32(0.0f); - { - const float32x4_t pf4 = vdupq_n_f32(pf); - for(j = 0;j < m;j+=4) - { - /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ - const float32x4_t f4 = vmlaq_f32(vmlaq_f32(vld1q_f32(&fil[j]), - sf4, vld1q_f32(&scd[j])), - pf4, vmlaq_f32(vld1q_f32(&phd[j]), - sf4, vld1q_f32(&spd[j]) - ) - ); - /* r += f*src */ - r4 = vmlaq_f32(r4, f4, vld1q_f32(&src[j])); - } - } - r4 = vaddq_f32(r4, vcombine_f32(vrev64_f32(vget_high_f32(r4)), - vrev64_f32(vget_low_f32(r4)))); - dst[i] = vget_lane_f32(vadd_f32(vget_low_f32(r4), vget_high_f32(r4)), 0); - - frac += increment; - src += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], - const ALsizei IrSize, - const ALfloat (*restrict Coeffs)[2], - ALfloat left, ALfloat right) -{ - ALsizei c; - float32x4_t leftright4; - { - float32x2_t leftright2 = vdup_n_f32(0.0); - leftright2 = vset_lane_f32(left, leftright2, 0); - leftright2 = vset_lane_f32(right, leftright2, 1); - leftright4 = vcombine_f32(leftright2, leftright2); - } - Values = ASSUME_ALIGNED(Values, 16); - Coeffs = ASSUME_ALIGNED(Coeffs, 16); - for(c = 0;c < IrSize;c += 2) - { - const ALsizei o0 = (Offset+c)&HRIR_MASK; - const ALsizei o1 = (o0+1)&HRIR_MASK; - float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), - vld1_f32((float32_t*)&Values[o1][0])); - float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); - - vals = vmlaq_f32(vals, coefs, leftright4); - - vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); - vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); - } -} - -#define MixHrtf MixHrtf_Neon -#define MixHrtfBlend MixHrtfBlend_Neon -#define MixDirectHrtf MixDirectHrtf_Neon -#include "mixer_inc.c" -#undef MixHrtf - - -void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, - ALsizei BufferSize) -{ - ALfloat gain, delta, step; - float32x4_t gain4; - ALsizei c; - - data = ASSUME_ALIGNED(data, 16); - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; - - for(c = 0;c < OutChans;c++) - { - ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) - { - ALsizei minsize = mini(BufferSize, Counter); - /* Mix with applying gain steps in aligned multiples of 4. */ - if(minsize-pos > 3) - { - float32x4_t step4; - gain4 = vsetq_lane_f32(gain, gain4, 0); - gain4 = vsetq_lane_f32(gain + step, gain4, 1); - gain4 = vsetq_lane_f32(gain + step + step, gain4, 2); - gain4 = vsetq_lane_f32(gain + step + step + step, gain4, 3); - step4 = vdupq_n_f32(step + step + step + step); - do { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - gain4 = vaddq_f32(gain4, step4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - pos += 4; - } while(minsize-pos > 3); - /* NOTE: gain4 now represents the next four gains after the - * last four mixed samples, so the lowest element represents - * the next gain to apply. - */ - gain = vgetq_lane_f32(gain4, 0); - } - /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ - for(;pos < minsize;pos++) - { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; - } - if(pos == Counter) - gain = TargetGains[c]; - CurrentGains[c] = gain; - - /* Mix until pos is aligned with 4 or the mix is done. */ - minsize = mini(BufferSize, (pos+3)&~3); - for(;pos < minsize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } - - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - gain4 = vdupq_n_f32(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const float32x4_t val4 = vld1q_f32(&data[pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[c][OutPos+pos] += data[pos]*gain; - } -} - -void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) -{ - float32x4_t gain4; - ALsizei c; - - data = ASSUME_ALIGNED(data, 16); - OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); - - for(c = 0;c < InChans;c++) - { - ALsizei pos = 0; - ALfloat gain = Gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - gain4 = vdupq_n_f32(gain); - for(;BufferSize-pos > 3;pos += 4) - { - const float32x4_t val4 = vld1q_f32(&data[c][InPos+pos]); - float32x4_t dry4 = vld1q_f32(&OutBuffer[pos]); - dry4 = vmlaq_f32(dry4, val4, gain4); - vst1q_f32(&OutBuffer[pos], dry4); - } - for(;pos < BufferSize;pos++) - OutBuffer[pos] += data[c][InPos+pos]*gain; - } -} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse41.c b/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse41.c deleted file mode 100644 index 613a89ff..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse41.c +++ /dev/null @@ -1,154 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 2014 by Timothy Arceri . - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include - -#include "alu.h" -#include "mixer_defs.h" - - -const ALfloat *Resample_lerp32_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); - const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); - - /* val1 + (val2-val1)*mu */ - const __m128 r0 = _mm_sub_ps(val2, val1); - const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); - const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - pos_.i[0] = _mm_extract_epi32(pos4, 0); - pos_.i[1] = _mm_extract_epi32(pos4, 1); - pos_.i[2] = _mm_extract_epi32(pos4, 2); - pos_.i[3] = _mm_extract_epi32(pos4, 3); - } - - /* NOTE: These four elements represent the position *after* the last four - * samples, so the lowest element is the next position to resample. - */ - pos = pos_.i[0]; - frac = _mm_cvtsi128_si32(frac4); - - for(;i < numsamples;i++) - { - dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - -const ALfloat *Resample_fir4_32_SSE41(const InterpState* UNUSED(state), - const ALfloat *restrict src, ALsizei frac, ALint increment, - ALfloat *restrict dst, ALsizei numsamples) -{ - const __m128i increment4 = _mm_set1_epi32(increment*4); - const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; - __m128i frac4, pos4; - ALint pos; - ALsizei i; - - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); - - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); - - --src; - for(i = 0;numsamples-i > 3;i += 4) - { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); - __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); - __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); - __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); - __m128 out; - - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out = _mm_hadd_ps(k0, k2); - - _mm_store_ps(&dst[i], out); - - frac4 = _mm_add_epi32(frac4, increment4); - pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); - frac4 = _mm_and_si128(frac4, fracMask4); - - pos_.i[0] = _mm_extract_epi32(pos4, 0); - pos_.i[1] = _mm_extract_epi32(pos4, 1); - pos_.i[2] = _mm_extract_epi32(pos4, 2); - pos_.i[3] = _mm_extract_epi32(pos4, 3); - frac_.i[0] = _mm_extract_epi32(frac4, 0); - frac_.i[1] = _mm_extract_epi32(frac4, 1); - frac_.i[2] = _mm_extract_epi32(frac4, 2); - frac_.i[3] = _mm_extract_epi32(frac4, 3); - } - - pos = pos_.i[0]; - frac = frac_.i[0]; - - for(;i < numsamples;i++) - { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); - - frac += increment; - pos += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.h b/love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.h deleted file mode 100644 index 199849fb..00000000 --- a/love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef NFCFILTER_H -#define NFCFILTER_H - -#include "alMain.h" - -typedef struct NfcFilter { - float g; - float coeffs[MAX_AMBI_ORDER*2 + 1]; - float history[MAX_AMBI_ORDER]; -} NfcFilter; - -/* NOTE: - * w0 = speed_of_sound / (source_distance * sample_rate); - * w1 = speed_of_sound / (control_distance * sample_rate); - * - * Generally speaking, the control distance should be approximately the average - * speaker distance, or based on the reference delay if outputing NFC-HOA. It - * must not be negative, 0, or infinite. The source distance should not be too - * small relative to the control distance. - */ - -/* Near-field control filter for first-order ambisonic channels (1-3). */ -void NfcFilterCreate1(NfcFilter *nfc, const float w0, const float w1); -void NfcFilterAdjust1(NfcFilter *nfc, const float w0); -void NfcFilterUpdate1(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -/* Near-field control filter for second-order ambisonic channels (4-8). */ -void NfcFilterCreate2(NfcFilter *nfc, const float w0, const float w1); -void NfcFilterAdjust2(NfcFilter *nfc, const float w0); -void NfcFilterUpdate2(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -/* Near-field control filter for third-order ambisonic channels (9-15). */ -void NfcFilterCreate3(NfcFilter *nfc, const float w0, const float w1); -void NfcFilterAdjust3(NfcFilter *nfc, const float w0); -void NfcFilterUpdate3(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); - -#endif /* NFCFILTER_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Android.mk b/love/src/jni/openal-soft-1.18.2/Android.mk deleted file mode 100644 index 0354276e..00000000 --- a/love/src/jni/openal-soft-1.18.2/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -# libogg -include $(CLEAR_VARS) - -LOCAL_MODULE := libopenal -LOCAL_CFLAGS := -DAL_ALEXT_PROTOTYPES -DAL_BUILD_LIBRARY -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -std=c99 -Drestrict=__restrict - -LOCAL_CPPFLAGS := ${LOCAL_CFLAGS} - -LOCAL_C_INCLUDES := \ - ${LOCAL_PATH}/include \ - ${LOCAL_PATH}/common \ - ${LOCAL_PATH}/Alc \ - ${LOCAL_PATH}/OpenAL32/Include - -LOCAL_SRC_FILES := \ - $(filter-out \ - Alc/mixer_neon.c \ - Alc/mixer_inc.c \ - Alc/mixer_sse.c \ - Alc/mixer_sse2.c \ - Alc/mixer_sse3.c \ - Alc/mixer_sse41.c \ - , $(subst $(LOCAL_PATH)/,,\ - ${LOCAL_PATH}/Alc/backends/base.c \ - ${LOCAL_PATH}/Alc/backends/loopback.c \ - ${LOCAL_PATH}/Alc/backends/null.c \ - ${LOCAL_PATH}/Alc/backends/opensl.c \ - ${LOCAL_PATH}/Alc/backends/wave.c \ - $(wildcard ${LOCAL_PATH}/common/*.c) \ - $(wildcard ${LOCAL_PATH}/Alc/midi/*.c) \ - $(wildcard ${LOCAL_PATH}/Alc/effects/*.c) \ - $(wildcard ${LOCAL_PATH}/Alc/*.c) \ - $(wildcard ${LOCAL_PATH}/OpenAL32/*.c) \ - )) - -LOCAL_LDLIBS := -lOpenSLES - -ifeq ($(TARGET_ARCH_ABI),arm64-v8a) - # ARM64 have log2f function - LOCAL_CFLAGS += -DHAVE_LOG2F -else ifeq ($(NDK_R17),yes) - # NDK r17 and later always add log2f - LOCAL_CFLAGS += -DHAVE_LOG2F - # Also make sure to link with android_support - LOCAL_LDLIBS += -landroid_support -endif - -include $(BUILD_SHARED_LIBRARY) diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alBuffer.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alBuffer.h deleted file mode 100644 index b13e1231..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alBuffer.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef _AL_BUFFER_H_ -#define _AL_BUFFER_H_ - -#include "alMain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* User formats */ -enum UserFmtType { - UserFmtByte = AL_BYTE_SOFT, - UserFmtUByte = AL_UNSIGNED_BYTE_SOFT, - UserFmtShort = AL_SHORT_SOFT, - UserFmtUShort = AL_UNSIGNED_SHORT_SOFT, - UserFmtInt = AL_INT_SOFT, - UserFmtUInt = AL_UNSIGNED_INT_SOFT, - UserFmtFloat = AL_FLOAT_SOFT, - UserFmtDouble = AL_DOUBLE_SOFT, - UserFmtMulaw = AL_MULAW_SOFT, - UserFmtAlaw = 0x10000000, - UserFmtIMA4, - UserFmtMSADPCM, -}; -enum UserFmtChannels { - UserFmtMono = AL_MONO_SOFT, - UserFmtStereo = AL_STEREO_SOFT, - UserFmtRear = AL_REAR_SOFT, - UserFmtQuad = AL_QUAD_SOFT, - UserFmtX51 = AL_5POINT1_SOFT, /* (WFX order) */ - UserFmtX61 = AL_6POINT1_SOFT, /* (WFX order) */ - UserFmtX71 = AL_7POINT1_SOFT, /* (WFX order) */ - UserFmtBFormat2D = AL_BFORMAT2D_SOFT, /* WXY */ - UserFmtBFormat3D = AL_BFORMAT3D_SOFT, /* WXYZ */ -}; - -ALsizei BytesFromUserFmt(enum UserFmtType type); -ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans); -inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type) -{ - return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); -} - - -/* Storable formats */ -enum FmtType { - FmtByte = UserFmtByte, - FmtShort = UserFmtShort, - FmtFloat = UserFmtFloat, -}; -enum FmtChannels { - FmtMono = UserFmtMono, - FmtStereo = UserFmtStereo, - FmtRear = UserFmtRear, - FmtQuad = UserFmtQuad, - FmtX51 = UserFmtX51, - FmtX61 = UserFmtX61, - FmtX71 = UserFmtX71, - FmtBFormat2D = UserFmtBFormat2D, - FmtBFormat3D = UserFmtBFormat3D, -}; -#define MAX_INPUT_CHANNELS (8) - -ALsizei BytesFromFmt(enum FmtType type); -ALsizei ChannelsFromFmt(enum FmtChannels chans); -inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type) -{ - return ChannelsFromFmt(chans) * BytesFromFmt(type); -} - - -typedef struct ALbuffer { - ALvoid *data; - - ALsizei Frequency; - ALenum Format; - ALsizei SampleLen; - - enum FmtChannels FmtChannels; - enum FmtType FmtType; - ALuint BytesAlloc; - - enum UserFmtChannels OriginalChannels; - enum UserFmtType OriginalType; - ALsizei OriginalSize; - ALsizei OriginalAlign; - - ALsizei LoopStart; - ALsizei LoopEnd; - - ATOMIC(ALsizei) UnpackAlign; - ATOMIC(ALsizei) PackAlign; - - /* Number of times buffer was attached to a source (deletion can only occur when 0) */ - RefCount ref; - - RWLock lock; - - /* Self ID */ - ALuint id; -} ALbuffer; - -ALbuffer *NewBuffer(ALCcontext *context); -void DeleteBuffer(ALCdevice *device, ALbuffer *buffer); - -ALenum LoadData(ALbuffer *buffer, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALsizei align, ALboolean storesrc); - -inline void LockBuffersRead(ALCdevice *device) -{ LockUIntMapRead(&device->BufferMap); } -inline void UnlockBuffersRead(ALCdevice *device) -{ UnlockUIntMapRead(&device->BufferMap); } -inline void LockBuffersWrite(ALCdevice *device) -{ LockUIntMapWrite(&device->BufferMap); } -inline void UnlockBuffersWrite(ALCdevice *device) -{ UnlockUIntMapWrite(&device->BufferMap); } - -inline struct ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) -{ return (struct ALbuffer*)LookupUIntMapKeyNoLock(&device->BufferMap, id); } -inline struct ALbuffer *RemoveBuffer(ALCdevice *device, ALuint id) -{ return (struct ALbuffer*)RemoveUIntMapKeyNoLock(&device->BufferMap, id); } - -ALvoid ReleaseALBuffers(ALCdevice *device); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alError.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alError.h deleted file mode 100644 index ab91d27b..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alError.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _AL_ERROR_H_ -#define _AL_ERROR_H_ - -#include "alMain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern ALboolean TrapALError; - -ALvoid alSetError(ALCcontext *Context, ALenum errorCode); - -#define SET_ERROR_AND_RETURN(ctx, err) do { \ - alSetError((ctx), (err)); \ - return; \ -} while(0) - -#define SET_ERROR_AND_RETURN_VALUE(ctx, err, val) do { \ - alSetError((ctx), (err)); \ - return (val); \ -} while(0) - -#define SET_ERROR_AND_GOTO(ctx, err, lbl) do { \ - alSetError((ctx), (err)); \ - goto lbl; \ -} while(0) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alFilter.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alFilter.h deleted file mode 100644 index 227d50cf..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alFilter.h +++ /dev/null @@ -1,164 +0,0 @@ -#ifndef _AL_FILTER_H_ -#define _AL_FILTER_H_ - -#include "alMain.h" - -#include "math_defs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define LOWPASSFREQREF (5000.0f) -#define HIGHPASSFREQREF (250.0f) - - -/* Filters implementation is based on the "Cookbook formulae for audio - * EQ biquad filter coefficients" by Robert Bristow-Johnson - * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt - */ -/* Implementation note: For the shelf filters, the specified gain is for the - * reference frequency, which is the centerpoint of the transition band. This - * better matches EFX filter design. To set the gain for the shelf itself, use - * the square root of the desired linear gain (or halve the dB gain). - */ - -typedef enum ALfilterType { - /** EFX-style low-pass filter, specifying a gain and reference frequency. */ - ALfilterType_HighShelf, - /** EFX-style high-pass filter, specifying a gain and reference frequency. */ - ALfilterType_LowShelf, - /** Peaking filter, specifying a gain and reference frequency. */ - ALfilterType_Peaking, - - /** Low-pass cut-off filter, specifying a cut-off frequency. */ - ALfilterType_LowPass, - /** High-pass cut-off filter, specifying a cut-off frequency. */ - ALfilterType_HighPass, - /** Band-pass filter, specifying a center frequency. */ - ALfilterType_BandPass, -} ALfilterType; - -typedef struct ALfilterState { - ALfloat x[2]; /* History of two last input samples */ - ALfloat y[2]; /* History of two last output samples */ - ALfloat b0, b1, b2; /* Transfer function coefficients "b" */ - ALfloat a1, a2; /* Transfer function coefficients "a" (a0 is pre-applied) */ -} ALfilterState; -/* Currently only a C-based filter process method is implemented. */ -#define ALfilterState_process ALfilterState_processC - -/* Calculates the rcpQ (i.e. 1/Q) coefficient for shelving filters, using the - * reference gain and shelf slope parameter. - * 0 < gain - * 0 < slope <= 1 - */ -inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope) -{ - return sqrtf((gain + 1.0f/gain)*(1.0f/slope - 1.0f) + 2.0f); -} -/* Calculates the rcpQ (i.e. 1/Q) coefficient for filters, using the frequency - * multiple (i.e. ref_freq / sampling_freq) and bandwidth. - * 0 < freq_mult < 0.5. - */ -inline ALfloat calc_rcpQ_from_bandwidth(ALfloat freq_mult, ALfloat bandwidth) -{ - ALfloat w0 = F_TAU * freq_mult; - return 2.0f*sinhf(logf(2.0f)/2.0f*bandwidth*w0/sinf(w0)); -} - -inline void ALfilterState_clear(ALfilterState *filter) -{ - filter->x[0] = 0.0f; - filter->x[1] = 0.0f; - filter->y[0] = 0.0f; - filter->y[1] = 0.0f; -} - -void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat gain, ALfloat freq_mult, ALfloat rcpQ); - -inline void ALfilterState_copyParams(ALfilterState *restrict dst, const ALfilterState *restrict src) -{ - dst->b0 = src->b0; - dst->b1 = src->b1; - dst->b2 = src->b2; - dst->a1 = src->a1; - dst->a2 = src->a2; -} - -void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples); - -inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALsizei numsamples) -{ - if(numsamples >= 2) - { - filter->x[1] = src[numsamples-2]; - filter->x[0] = src[numsamples-1]; - filter->y[1] = src[numsamples-2]; - filter->y[0] = src[numsamples-1]; - } - else if(numsamples == 1) - { - filter->x[1] = filter->x[0]; - filter->x[0] = src[0]; - filter->y[1] = filter->y[0]; - filter->y[0] = src[0]; - } -} - - -typedef struct ALfilter { - // Filter type (AL_FILTER_NULL, ...) - ALenum type; - - ALfloat Gain; - ALfloat GainHF; - ALfloat HFReference; - ALfloat GainLF; - ALfloat LFReference; - - void (*SetParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint val); - void (*SetParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals); - void (*SetParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val); - void (*SetParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals); - - void (*GetParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *val); - void (*GetParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals); - void (*GetParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val); - void (*GetParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals); - - /* Self ID */ - ALuint id; -} ALfilter; - -#define ALfilter_SetParami(x, c, p, v) ((x)->SetParami((x),(c),(p),(v))) -#define ALfilter_SetParamiv(x, c, p, v) ((x)->SetParamiv((x),(c),(p),(v))) -#define ALfilter_SetParamf(x, c, p, v) ((x)->SetParamf((x),(c),(p),(v))) -#define ALfilter_SetParamfv(x, c, p, v) ((x)->SetParamfv((x),(c),(p),(v))) - -#define ALfilter_GetParami(x, c, p, v) ((x)->GetParami((x),(c),(p),(v))) -#define ALfilter_GetParamiv(x, c, p, v) ((x)->GetParamiv((x),(c),(p),(v))) -#define ALfilter_GetParamf(x, c, p, v) ((x)->GetParamf((x),(c),(p),(v))) -#define ALfilter_GetParamfv(x, c, p, v) ((x)->GetParamfv((x),(c),(p),(v))) - -inline void LockFiltersRead(ALCdevice *device) -{ LockUIntMapRead(&device->FilterMap); } -inline void UnlockFiltersRead(ALCdevice *device) -{ UnlockUIntMapRead(&device->FilterMap); } -inline void LockFiltersWrite(ALCdevice *device) -{ LockUIntMapWrite(&device->FilterMap); } -inline void UnlockFiltersWrite(ALCdevice *device) -{ UnlockUIntMapWrite(&device->FilterMap); } - -inline struct ALfilter *LookupFilter(ALCdevice *device, ALuint id) -{ return (struct ALfilter*)LookupUIntMapKeyNoLock(&device->FilterMap, id); } -inline struct ALfilter *RemoveFilter(ALCdevice *device, ALuint id) -{ return (struct ALfilter*)RemoveUIntMapKeyNoLock(&device->FilterMap, id); } - -ALvoid ReleaseALFilters(ALCdevice *device); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alMain.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alMain.h deleted file mode 100644 index b14d6747..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alMain.h +++ /dev/null @@ -1,1085 +0,0 @@ -#ifndef AL_MAIN_H -#define AL_MAIN_H - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_STRINGS_H -#include -#endif - -#ifdef HAVE_FENV_H -#include -#endif - -#include "AL/al.h" -#include "AL/alc.h" -#include "AL/alext.h" - -#include "static_assert.h" -#include "align.h" -#include "atomic.h" -#include "uintmap.h" -#include "vector.h" -#include "alstring.h" -#include "almalloc.h" -#include "threads.h" - -#ifndef ALC_SOFT_loopback2 -#define ALC_SOFT_loopback2 1 -#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997 -#define ALC_AMBISONIC_SCALING_SOFT 0x1998 -#define ALC_AMBISONIC_ORDER_SOFT 0x1999 - -#define ALC_BFORMAT3D_SOFT 0x1508 - -/* Ambisonic layouts */ -#define ALC_ACN_SOFT 0x1600 -#define ALC_FUMA_SOFT 0x1601 - -/* Ambisonic scalings (normalization) */ -/*#define ALC_FUMA_SOFT*/ -#define ALC_SN3D_SOFT 0x1602 -#define ALC_N3D_SOFT 0x1603 - -typedef ALCboolean (ALC_APIENTRY*LPALCISAMBISONICFORMATSUPPORTEDSOFT)(ALCdevice *device, ALCenum layout, ALCenum scaling, ALsizei order); -#ifdef AL_ALEXT_PROTOTYPES -ALC_API ALCboolean ALC_APIENTRY alcIsAmbisonicFormatSupportedSOFT(ALCdevice *device, ALCenum layout, ALCenum scaling, ALsizei order); -#endif -#endif - -#ifndef ALC_SOFT_device_clock -#define ALC_SOFT_device_clock 1 -typedef int64_t ALCint64SOFT; -typedef uint64_t ALCuint64SOFT; -#define ALC_DEVICE_CLOCK_SOFT 0x1600 -#define ALC_DEVICE_LATENCY_SOFT 0x1601 -#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602 -typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); -#ifdef AL_ALEXT_PROTOTYPES -ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); -#endif -#endif - -#ifndef AL_SOFT_buffer_samples2 -#define AL_SOFT_buffer_samples2 1 -/* Channel configurations */ -#define AL_MONO_SOFT 0x1500 -#define AL_STEREO_SOFT 0x1501 -#define AL_REAR_SOFT 0x1502 -#define AL_QUAD_SOFT 0x1503 -#define AL_5POINT1_SOFT 0x1504 -#define AL_6POINT1_SOFT 0x1505 -#define AL_7POINT1_SOFT 0x1506 -#define AL_BFORMAT2D_SOFT 0x1507 -#define AL_BFORMAT3D_SOFT 0x1508 - -/* Sample types */ -#define AL_BYTE_SOFT 0x1400 -#define AL_UNSIGNED_BYTE_SOFT 0x1401 -#define AL_SHORT_SOFT 0x1402 -#define AL_UNSIGNED_SHORT_SOFT 0x1403 -#define AL_INT_SOFT 0x1404 -#define AL_UNSIGNED_INT_SOFT 0x1405 -#define AL_FLOAT_SOFT 0x1406 -#define AL_DOUBLE_SOFT 0x1407 -#define AL_BYTE3_SOFT 0x1408 -#define AL_UNSIGNED_BYTE3_SOFT 0x1409 -#define AL_MULAW_SOFT 0x140A - -/* Storage formats */ -#define AL_MONO8_SOFT 0x1100 -#define AL_MONO16_SOFT 0x1101 -#define AL_MONO32F_SOFT 0x10010 -#define AL_STEREO8_SOFT 0x1102 -#define AL_STEREO16_SOFT 0x1103 -#define AL_STEREO32F_SOFT 0x10011 -#define AL_QUAD8_SOFT 0x1204 -#define AL_QUAD16_SOFT 0x1205 -#define AL_QUAD32F_SOFT 0x1206 -#define AL_REAR8_SOFT 0x1207 -#define AL_REAR16_SOFT 0x1208 -#define AL_REAR32F_SOFT 0x1209 -#define AL_5POINT1_8_SOFT 0x120A -#define AL_5POINT1_16_SOFT 0x120B -#define AL_5POINT1_32F_SOFT 0x120C -#define AL_6POINT1_8_SOFT 0x120D -#define AL_6POINT1_16_SOFT 0x120E -#define AL_6POINT1_32F_SOFT 0x120F -#define AL_7POINT1_8_SOFT 0x1210 -#define AL_7POINT1_16_SOFT 0x1211 -#define AL_7POINT1_32F_SOFT 0x1212 -#define AL_BFORMAT2D_8_SOFT 0x20021 -#define AL_BFORMAT2D_16_SOFT 0x20022 -#define AL_BFORMAT2D_32F_SOFT 0x20023 -#define AL_BFORMAT3D_8_SOFT 0x20031 -#define AL_BFORMAT3D_16_SOFT 0x20032 -#define AL_BFORMAT3D_32F_SOFT 0x20033 - -/* Buffer attributes */ -#define AL_INTERNAL_FORMAT_SOFT 0x2008 -#define AL_BYTE_LENGTH_SOFT 0x2009 -#define AL_SAMPLE_LENGTH_SOFT 0x200A -#define AL_SEC_LENGTH_SOFT 0x200B - -#if 0 -typedef void (AL_APIENTRY*LPALBUFFERSAMPLESSOFT)(ALuint,ALuint,ALenum,ALsizei,ALenum,ALenum,const ALvoid*); -typedef void (AL_APIENTRY*LPALGETBUFFERSAMPLESSOFT)(ALuint,ALsizei,ALsizei,ALenum,ALenum,ALvoid*); -typedef ALboolean (AL_APIENTRY*LPALISBUFFERFORMATSUPPORTEDSOFT)(ALenum); -#ifdef AL_ALEXT_PROTOTYPES -AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, ALuint samplerate, ALenum internalformat, ALsizei samples, ALenum channels, ALenum type, const ALvoid *data); -AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, ALsizei offset, ALsizei samples, ALenum channels, ALenum type, ALvoid *data); -AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format); -#endif -#endif -#endif - - -#if defined(_WIN64) -#define SZFMT "%I64u" -#elif defined(_WIN32) -#define SZFMT "%u" -#else -#define SZFMT "%zu" -#endif - - -#ifdef __GNUC__ -/* Because of a long-standing deficiency in C, you're not allowed to implicitly - * cast a pointer-to-type-array to a pointer-to-const-type-array. For example, - * - * int (*ptr)[10]; - * const int (*cptr)[10] = ptr; - * - * is not allowed and most compilers will generate noisy warnings about - * incompatible types, even though it just makes the array elements const. - * Clang will allow it if you make the array type a typedef, like this: - * - * typedef int int10[10]; - * int10 *ptr; - * const int10 *cptr = ptr; - * - * however GCC does not and still issues the incompatible type warning. The - * "proper" way to fix it is to add an explicit cast for the constified type, - * but that removes the vast majority of otherwise useful type-checking you'd - * get, and runs the risk of improper casts if types are later changed. Leaving - * it non-const can also be an issue if you use it as a function parameter, and - * happen to have a const type as input (and also reduce the capabilities of - * the compiler to better optimize the function). - * - * So to work around the problem, we use a macro. The macro first assigns the - * incoming variable to the specified non-const type to ensure it's the correct - * type, then casts the variable as the desired constified type. Very ugly, but - * I'd rather not have hundreds of lines of warnings because I want to tell the - * compiler that some array(s) can't be changed by the code, or have lots of - * error-prone casts. - */ -#define SAFE_CONST(T, var) __extension__({ \ - T _tmp = (var); \ - (const T)_tmp; \ -}) -#else -/* Non-GNU-compatible compilers have to use a straight cast with no extra - * checks, due to the lack of multi-statement expressions. - */ -#define SAFE_CONST(T, var) ((const T)(var)) -#endif - - -#ifdef __GNUC__ -/* This helps cast away the const-ness of a pointer without accidentally - * changing the pointer type. This is necessary due to Clang's inability to use - * atomic_load on a const _Atomic variable. - */ -#define CONST_CAST(T, V) __extension__({ \ - const T _tmp = (V); \ - (T)_tmp; \ -}) -#else -#define CONST_CAST(T, V) ((T)(V)) -#endif - - -typedef ALint64SOFT ALint64; -typedef ALuint64SOFT ALuint64; - -#ifndef U64 -#if defined(_MSC_VER) -#define U64(x) ((ALuint64)(x##ui64)) -#elif SIZEOF_LONG == 8 -#define U64(x) ((ALuint64)(x##ul)) -#elif SIZEOF_LONG_LONG == 8 -#define U64(x) ((ALuint64)(x##ull)) -#endif -#endif - -#ifndef UINT64_MAX -#define UINT64_MAX U64(18446744073709551615) -#endif - -#ifndef UNUSED -#if defined(__cplusplus) -#define UNUSED(x) -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_##x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif -#endif - -#ifdef __GNUC__ -#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z)))) -#else -#define DECL_FORMAT(x, y, z) -#endif - -/* Calculates the size of a struct with N elements of a flexible array member. - * GCC and Clang allow offsetof(Type, fam[N]) for this, but MSVC seems to have - * trouble, so a bit more verbose workaround is needed. - */ -#define FAM_SIZE(T, M, N) (offsetof(T, M) + sizeof(((T*)NULL)->M[0])*(N)) - -#if defined(__GNUC__) && defined(__i386__) -/* force_align_arg_pointer is required for proper function arguments aligning - * when SSE code is used. Some systems (Windows, QNX) do not guarantee our - * thread functions will be properly aligned on the stack, even though GCC may - * generate code with the assumption that it is. */ -#define FORCE_ALIGN __attribute__((force_align_arg_pointer)) -#else -#define FORCE_ALIGN -#endif - -#ifdef HAVE_C99_VLA -#define DECL_VLA(T, _name, _size) T _name[(_size)] -#else -#define DECL_VLA(T, _name, _size) T *_name = alloca((_size) * sizeof(T)) -#endif - -#ifndef PATH_MAX -#ifdef MAX_PATH -#define PATH_MAX MAX_PATH -#else -#define PATH_MAX 4096 -#endif -#endif - - -static const union { - ALuint u; - ALubyte b[sizeof(ALuint)]; -} EndianTest = { 1 }; -#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1) - -#define COUNTOF(x) (sizeof(x) / sizeof(0[x])) - - -#define DERIVE_FROM_TYPE(t) t t##_parent -#define STATIC_CAST(to, obj) (&(obj)->to##_parent) -#ifdef __GNUC__ -#define STATIC_UPCAST(to, from, obj) __extension__({ \ - static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \ - "Invalid upcast object from type"); \ - (to*)((char*)(obj) - offsetof(to, from##_parent)); \ -}) -#else -#define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent))) -#endif - -#define DECLARE_FORWARD(T1, T2, rettype, func) \ -rettype T1##_##func(T1 *obj) \ -{ return T2##_##func(STATIC_CAST(T2, obj)); } - -#define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \ -rettype T1##_##func(T1 *obj, argtype1 a) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a); } - -#define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \ -rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a, b); } - -#define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ -rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \ -{ return T2##_##func(STATIC_CAST(T2, obj), a, b, c); } - - -#define GET_VTABLE1(T1) (&(T1##_vtable)) -#define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable)) - -#define SET_VTABLE1(T1, obj) ((obj)->vtbl = GET_VTABLE1(T1)) -#define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2)) - -#define DECLARE_THUNK(T1, T2, rettype, func) \ -static rettype T1##_##T2##_##func(T2 *obj) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj)); } - -#define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); } - -#define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); } - -#define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); } - -#define DECLARE_THUNK4(T1, T2, rettype, func, argtype1, argtype2, argtype3, argtype4) \ -static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c, argtype4 d) \ -{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c, d); } - -#define DECLARE_DEFAULT_ALLOCATORS(T) \ -static void* T##_New(size_t size) { return al_malloc(16, size); } \ -static void T##_Delete(void *ptr) { al_free(ptr); } - -/* Helper to extract an argument list for VCALL. Not used directly. */ -#define EXTRACT_VCALL_ARGS(...) __VA_ARGS__)) - -/* Call a "virtual" method on an object, with arguments. */ -#define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS -/* Call a "virtual" method on an object, with no arguments. */ -#define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS - -#define DELETE_OBJ(obj) do { \ - if((obj) != NULL) \ - { \ - V0((obj),Destruct)(); \ - V0((obj),Delete)(); \ - } \ -} while(0) - - -#define EXTRACT_NEW_ARGS(...) __VA_ARGS__); \ - } \ -} while(0) - -#define NEW_OBJ(_res, T) do { \ - _res = T##_New(sizeof(T)); \ - if(_res) \ - { \ - memset(_res, 0, sizeof(T)); \ - T##_Construct(_res, EXTRACT_NEW_ARGS -#define NEW_OBJ0(_res, T) do { \ - _res = T##_New(sizeof(T)); \ - if(_res) \ - { \ - memset(_res, 0, sizeof(T)); \ - T##_Construct(_res EXTRACT_NEW_ARGS - - -#ifdef __cplusplus -extern "C" { -#endif - -struct Hrtf; -struct HrtfEntry; -struct Compressor; - - -#define DEFAULT_OUTPUT_RATE (44100) -#define MIN_OUTPUT_RATE (8000) - - -/* Find the next power-of-2 for non-power-of-2 numbers. */ -inline ALuint NextPowerOf2(ALuint value) -{ - if(value > 0) - { - value--; - value |= value>>1; - value |= value>>2; - value |= value>>4; - value |= value>>8; - value |= value>>16; - } - return value+1; -} - -/** Round up a value to the next multiple. */ -inline size_t RoundUp(size_t value, size_t r) -{ - value += r-1; - return value - (value%r); -} - -/* Scales the given value using 64-bit integer math, rounding the result. */ -inline ALuint64 ScaleRound(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale) -{ - return (val*new_scale + old_scale/2) / old_scale; -} - -/* Scales the given value using 64-bit integer math, flooring the result. */ -inline ALuint64 ScaleFloor(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale) -{ - return val * new_scale / old_scale; -} - -/* Scales the given value using 64-bit integer math, ceiling the result. */ -inline ALuint64 ScaleCeil(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale) -{ - return (val*new_scale + old_scale-1) / old_scale; -} - -/* Fast float-to-int conversion. Assumes the FPU is already in round-to-zero - * mode. */ -inline ALint fastf2i(ALfloat f) -{ -#ifdef HAVE_LRINTF - return lrintf(f); -#elif defined(_MSC_VER) && defined(_M_IX86) - ALint i; - __asm fld f - __asm fistp i - return i; -#else - return (ALint)f; -#endif -} - - -enum DevProbe { - ALL_DEVICE_PROBE, - CAPTURE_DEVICE_PROBE -}; - -struct ALCbackend; - - -enum DistanceModel { - InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED, - LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED, - ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED, - InverseDistance = AL_INVERSE_DISTANCE, - LinearDistance = AL_LINEAR_DISTANCE, - ExponentDistance = AL_EXPONENT_DISTANCE, - DisableDistance = AL_NONE, - - DefaultDistanceModel = InverseDistanceClamped -}; - -enum Channel { - FrontLeft = 0, - FrontRight, - FrontCenter, - LFE, - BackLeft, - BackRight, - BackCenter, - SideLeft, - SideRight, - - UpperFrontLeft, - UpperFrontRight, - UpperBackLeft, - UpperBackRight, - LowerFrontLeft, - LowerFrontRight, - LowerBackLeft, - LowerBackRight, - - Aux0, - Aux1, - Aux2, - Aux3, - Aux4, - Aux5, - Aux6, - Aux7, - Aux8, - Aux9, - Aux10, - Aux11, - Aux12, - Aux13, - Aux14, - Aux15, - - InvalidChannel -}; - - -/* Device formats */ -enum DevFmtType { - DevFmtByte = ALC_BYTE_SOFT, - DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT, - DevFmtShort = ALC_SHORT_SOFT, - DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT, - DevFmtInt = ALC_INT_SOFT, - DevFmtUInt = ALC_UNSIGNED_INT_SOFT, - DevFmtFloat = ALC_FLOAT_SOFT, - - DevFmtTypeDefault = DevFmtFloat -}; -enum DevFmtChannels { - DevFmtMono = ALC_MONO_SOFT, - DevFmtStereo = ALC_STEREO_SOFT, - DevFmtQuad = ALC_QUAD_SOFT, - DevFmtX51 = ALC_5POINT1_SOFT, - DevFmtX61 = ALC_6POINT1_SOFT, - DevFmtX71 = ALC_7POINT1_SOFT, - DevFmtAmbi3D = ALC_BFORMAT3D_SOFT, - - /* Similar to 5.1, except using rear channels instead of sides */ - DevFmtX51Rear = 0x80000000, - - DevFmtChannelsDefault = DevFmtStereo -}; -#define MAX_OUTPUT_CHANNELS (16) - -ALsizei BytesFromDevFmt(enum DevFmtType type); -ALsizei ChannelsFromDevFmt(enum DevFmtChannels chans, ALsizei ambiorder); -inline ALsizei FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type, ALsizei ambiorder) -{ - return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); -} - -enum AmbiLayout { - AmbiLayout_FuMa = ALC_FUMA_SOFT, /* FuMa channel order */ - AmbiLayout_ACN = ALC_ACN_SOFT, /* ACN channel order */ - - AmbiLayout_Default = AmbiLayout_ACN -}; - -enum AmbiNorm { - AmbiNorm_FuMa = ALC_FUMA_SOFT, /* FuMa normalization */ - AmbiNorm_SN3D = ALC_SN3D_SOFT, /* SN3D normalization */ - AmbiNorm_N3D = ALC_N3D_SOFT, /* N3D normalization */ - - AmbiNorm_Default = AmbiNorm_SN3D -}; - - -extern const struct EffectList { - const char *name; - int type; - const char *ename; - ALenum val; -} EffectList[]; - - -enum DeviceType { - Playback, - Capture, - Loopback -}; - - -enum RenderMode { - NormalRender, - StereoPair, - HrtfRender -}; - - -/* The maximum number of Ambisonics coefficients. For a given order (o), the - * size needed will be (o+1)**2, thus zero-order has 1, first-order has 4, - * second-order has 9, third-order has 16, and fourth-order has 25. - */ -#define MAX_AMBI_ORDER 3 -#define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1)) - -/* A bitmask of ambisonic channels with height information. If none of these - * channels are used/needed, there's no height (e.g. with most surround sound - * speaker setups). This only specifies up to 4th order, which is the highest - * order a 32-bit mask value can specify (a 64-bit mask could handle up to 7th - * order). This is ACN ordering, with bit 0 being ACN 0, etc. - */ -#define AMBI_PERIPHONIC_MASK (0xfe7ce4) - -/* The maximum number of Ambisonic coefficients for 2D (non-periphonic) - * representation. This is 2 per each order above zero-order, plus 1 for zero- - * order. Or simply, o*2 + 1. - */ -#define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1) - - -typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS]; -typedef struct BFChannelConfig { - ALfloat Scale; - ALsizei Index; -} BFChannelConfig; - -typedef union AmbiConfig { - /* Ambisonic coefficients for mixing to the dry buffer. */ - ChannelConfig Coeffs[MAX_OUTPUT_CHANNELS]; - /* Coefficient channel mapping for mixing to the dry buffer. */ - BFChannelConfig Map[MAX_OUTPUT_CHANNELS]; -} AmbiConfig; - - -#define HRTF_HISTORY_BITS (6) -#define HRTF_HISTORY_LENGTH (1< -#define LOG_ANDROID(T, MSG, ...) __android_log_print(T, "openal", "AL lib: %s: "MSG, __FUNCTION__ , ## __VA_ARGS__) -#else -#define LOG_ANDROID(T, MSG, ...) ((void)0) -#endif - -enum LogLevel { - NoLog, - LogError, - LogWarning, - LogTrace, - LogRef -}; -extern enum LogLevel LogLevel; - -#define TRACEREF(...) do { \ - if(LogLevel >= LogRef) \ - AL_PRINT("(--)", __VA_ARGS__); \ -} while(0) - -#define TRACE(...) do { \ - if(LogLevel >= LogTrace) \ - AL_PRINT("(II)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_DEBUG, __VA_ARGS__); \ -} while(0) - -#define WARN(...) do { \ - if(LogLevel >= LogWarning) \ - AL_PRINT("(WW)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_WARN, __VA_ARGS__); \ -} while(0) - -#define ERR(...) do { \ - if(LogLevel >= LogError) \ - AL_PRINT("(EE)", __VA_ARGS__); \ - LOG_ANDROID(ANDROID_LOG_ERROR, __VA_ARGS__); \ -} while(0) - - -extern ALint RTPrioLevel; - - -extern ALuint CPUCapFlags; -enum { - CPU_CAP_SSE = 1<<0, - CPU_CAP_SSE2 = 1<<1, - CPU_CAP_SSE3 = 1<<2, - CPU_CAP_SSE4_1 = 1<<3, - CPU_CAP_NEON = 1<<4, -}; - -void FillCPUCaps(ALuint capfilter); - -vector_al_string SearchDataFiles(const char *match, const char *subdir); - -/* Small hack to use a pointer-to-array types as a normal argument type. - * Shouldn't be used directly. - */ -typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE]; -typedef ALfloat ALfloat2[2]; - - -/* The compressor requires the following information for proper - * initialization: - * - * PreGainDb - Gain applied before detection (in dB). - * PostGainDb - Gain applied after compression (in dB). - * SummedLink - Whether to use summed (true) or maxed (false) linking. - * RmsSensing - Whether to use RMS (true) or Peak (false) sensing. - * AttackTimeMin - Minimum attack time (in seconds). - * AttackTimeMax - Maximum attack time. Automates when min != max. - * ReleaseTimeMin - Minimum release time (in seconds). - * ReleaseTimeMax - Maximum release time. Automates when min != max. - * Ratio - Compression ratio (x:1). Set to 0 for true limiter. - * ThresholdDb - Triggering threshold (in dB). - * KneeDb - Knee width (below threshold; in dB). - * SampleRate - Sample rate to process. - */ -struct Compressor *CompressorInit(const ALfloat PreGainDb, const ALfloat PostGainDb, - const ALboolean SummedLink, const ALboolean RmsSensing, const ALfloat AttackTimeMin, - const ALfloat AttackTimeMax, const ALfloat ReleaseTimeMin, const ALfloat ReleaseTimeMax, - const ALfloat Ratio, const ALfloat ThresholdDb, const ALfloat KneeDb, - const ALuint SampleRate); - -ALuint GetCompressorSampleRate(const struct Compressor *Comp); - -void ApplyCompression(struct Compressor *Comp, const ALsizei NumChans, const ALsizei SamplesToDo, - ALfloat (*restrict OutBuffer)[BUFFERSIZE]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alThunk.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alThunk.h deleted file mode 100644 index adc77dec..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alThunk.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef ALTHUNK_H -#define ALTHUNK_H - -#include "alMain.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void ThunkInit(void); -void ThunkExit(void); -ALenum NewThunkEntry(ALuint *index); -void FreeThunkEntry(ALuint index); - -#ifdef __cplusplus -} -#endif - -#endif //ALTHUNK_H - diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/sample_cvt.h b/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/sample_cvt.h deleted file mode 100644 index 12bb1fa6..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/sample_cvt.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SAMPLE_CVT_H -#define SAMPLE_CVT_H - -#include "AL/al.h" -#include "alBuffer.h" - -void ConvertData(ALvoid *dst, enum UserFmtType dstType, const ALvoid *src, enum UserFmtType srcType, ALsizei numchans, ALsizei len, ALsizei align); - -#endif /* SAMPLE_CVT_H */ diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alBuffer.c b/love/src/jni/openal-soft-1.18.2/OpenAL32/alBuffer.c deleted file mode 100644 index 376741bd..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alBuffer.c +++ /dev/null @@ -1,1409 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include -#include -#include -#include -#ifdef HAVE_MALLOC_H -#include -#endif - -#include "alMain.h" -#include "alu.h" -#include "alError.h" -#include "alBuffer.h" -#include "alThunk.h" -#include "sample_cvt.h" - - -extern inline void LockBuffersRead(ALCdevice *device); -extern inline void UnlockBuffersRead(ALCdevice *device); -extern inline void LockBuffersWrite(ALCdevice *device); -extern inline void UnlockBuffersWrite(ALCdevice *device); -extern inline struct ALbuffer *LookupBuffer(ALCdevice *device, ALuint id); -extern inline struct ALbuffer *RemoveBuffer(ALCdevice *device, ALuint id); -extern inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type); -extern inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type); - -static ALboolean IsValidType(ALenum type); -static ALboolean IsValidChannels(ALenum channels); -static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, enum UserFmtType *type); -static ALboolean DecomposeFormat(ALenum format, enum FmtChannels *chans, enum FmtType *type); -static ALboolean SanitizeAlignment(enum UserFmtType type, ALsizei *align); - - -AL_API ALvoid AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers) -{ - ALCcontext *context; - ALsizei cur = 0; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - for(cur = 0;cur < n;cur++) - { - ALbuffer *buffer = NewBuffer(context); - if(!buffer) - { - alDeleteBuffers(cur, buffers); - break; - } - - buffers[cur] = buffer->id; - } - -done: - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *ALBuf; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - - LockBuffersWrite(device); - if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - for(i = 0;i < n;i++) - { - if(!buffers[i]) - continue; - - /* Check for valid Buffer ID */ - if((ALBuf=LookupBuffer(device, buffers[i])) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(ReadRef(&ALBuf->ref) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); - } - - for(i = 0;i < n;i++) - { - if((ALBuf=LookupBuffer(device, buffers[i])) != NULL) - DeleteBuffer(device, ALBuf); - } - -done: - UnlockBuffersWrite(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer) -{ - ALCcontext *context; - ALboolean ret; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - LockBuffersRead(context->Device); - ret = ((!buffer || LookupBuffer(context->Device, buffer)) ? - AL_TRUE : AL_FALSE); - UnlockBuffersRead(context->Device); - - ALCcontext_DecRef(context); - - return ret; -} - - -AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq) -{ - enum UserFmtChannels srcchannels = UserFmtMono; - enum UserFmtType srctype = UserFmtByte; - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - ALenum newformat = AL_NONE; - ALsizei framesize; - ALsizei align; - ALenum err; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(!(size >= 0 && freq > 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - - align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - if(SanitizeAlignment(srctype, &align) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(srctype) - { - case UserFmtByte: - case UserFmtUByte: - case UserFmtShort: - case UserFmtUShort: - case UserFmtFloat: - framesize = FrameSizeFromUserFmt(srcchannels, srctype) * align; - if((size%framesize) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - err = LoadData(albuf, freq, format, size/framesize*align, - srcchannels, srctype, data, align, AL_TRUE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - break; - - case UserFmtInt: - case UserFmtUInt: - case UserFmtDouble: - framesize = FrameSizeFromUserFmt(srcchannels, srctype) * align; - if((size%framesize) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - switch(srcchannels) - { - case UserFmtMono: newformat = AL_FORMAT_MONO_FLOAT32; break; - case UserFmtStereo: newformat = AL_FORMAT_STEREO_FLOAT32; break; - case UserFmtRear: newformat = AL_FORMAT_REAR32; break; - case UserFmtQuad: newformat = AL_FORMAT_QUAD32; break; - case UserFmtX51: newformat = AL_FORMAT_51CHN32; break; - case UserFmtX61: newformat = AL_FORMAT_61CHN32; break; - case UserFmtX71: newformat = AL_FORMAT_71CHN32; break; - case UserFmtBFormat2D: newformat = AL_FORMAT_BFORMAT2D_FLOAT32; break; - case UserFmtBFormat3D: newformat = AL_FORMAT_BFORMAT3D_FLOAT32; break; - } - err = LoadData(albuf, freq, newformat, size/framesize*align, - srcchannels, srctype, data, align, AL_TRUE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - break; - - case UserFmtMulaw: - case UserFmtAlaw: - framesize = FrameSizeFromUserFmt(srcchannels, srctype) * align; - if((size%framesize) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - switch(srcchannels) - { - case UserFmtMono: newformat = AL_FORMAT_MONO16; break; - case UserFmtStereo: newformat = AL_FORMAT_STEREO16; break; - case UserFmtRear: newformat = AL_FORMAT_REAR16; break; - case UserFmtQuad: newformat = AL_FORMAT_QUAD16; break; - case UserFmtX51: newformat = AL_FORMAT_51CHN16; break; - case UserFmtX61: newformat = AL_FORMAT_61CHN16; break; - case UserFmtX71: newformat = AL_FORMAT_71CHN16; break; - case UserFmtBFormat2D: newformat = AL_FORMAT_BFORMAT2D_16; break; - case UserFmtBFormat3D: newformat = AL_FORMAT_BFORMAT3D_16; break; - } - err = LoadData(albuf, freq, newformat, size/framesize*align, - srcchannels, srctype, data, align, AL_TRUE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - break; - - case UserFmtIMA4: - framesize = (align-1)/2 + 4; - framesize *= ChannelsFromUserFmt(srcchannels); - if((size%framesize) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - switch(srcchannels) - { - case UserFmtMono: newformat = AL_FORMAT_MONO16; break; - case UserFmtStereo: newformat = AL_FORMAT_STEREO16; break; - case UserFmtRear: newformat = AL_FORMAT_REAR16; break; - case UserFmtQuad: newformat = AL_FORMAT_QUAD16; break; - case UserFmtX51: newformat = AL_FORMAT_51CHN16; break; - case UserFmtX61: newformat = AL_FORMAT_61CHN16; break; - case UserFmtX71: newformat = AL_FORMAT_71CHN16; break; - case UserFmtBFormat2D: newformat = AL_FORMAT_BFORMAT2D_16; break; - case UserFmtBFormat3D: newformat = AL_FORMAT_BFORMAT3D_16; break; - } - err = LoadData(albuf, freq, newformat, size/framesize*align, - srcchannels, srctype, data, align, AL_TRUE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - break; - - case UserFmtMSADPCM: - framesize = (align-2)/2 + 7; - framesize *= ChannelsFromUserFmt(srcchannels); - if((size%framesize) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - switch(srcchannels) - { - case UserFmtMono: newformat = AL_FORMAT_MONO16; break; - case UserFmtStereo: newformat = AL_FORMAT_STEREO16; break; - case UserFmtRear: newformat = AL_FORMAT_REAR16; break; - case UserFmtQuad: newformat = AL_FORMAT_QUAD16; break; - case UserFmtX51: newformat = AL_FORMAT_51CHN16; break; - case UserFmtX61: newformat = AL_FORMAT_61CHN16; break; - case UserFmtX71: newformat = AL_FORMAT_71CHN16; break; - case UserFmtBFormat2D: newformat = AL_FORMAT_BFORMAT2D_16; break; - case UserFmtBFormat3D: newformat = AL_FORMAT_BFORMAT3D_16; break; - } - err = LoadData(albuf, freq, newformat, size/framesize*align, - srcchannels, srctype, data, align, AL_TRUE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - break; - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) -{ - enum UserFmtChannels srcchannels = UserFmtMono; - enum UserFmtType srctype = UserFmtByte; - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - ALsizei byte_align; - ALsizei channels; - ALsizei bytes; - ALsizei align; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(!(length >= 0 && offset >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - - WriteLock(&albuf->lock); - align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - if(SanitizeAlignment(srctype, &align) == AL_FALSE) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - if(srcchannels != albuf->OriginalChannels || srctype != albuf->OriginalType) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - if(align != albuf->OriginalAlign) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - - if(albuf->OriginalType == UserFmtIMA4) - { - byte_align = (albuf->OriginalAlign-1)/2 + 4; - byte_align *= ChannelsFromUserFmt(albuf->OriginalChannels); - } - else if(albuf->OriginalType == UserFmtMSADPCM) - { - byte_align = (albuf->OriginalAlign-2)/2 + 7; - byte_align *= ChannelsFromUserFmt(albuf->OriginalChannels); - } - else - { - byte_align = albuf->OriginalAlign; - byte_align *= FrameSizeFromUserFmt(albuf->OriginalChannels, - albuf->OriginalType); - } - - if(offset > albuf->OriginalSize || length > albuf->OriginalSize-offset || - (offset%byte_align) != 0 || (length%byte_align) != 0) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - - channels = ChannelsFromFmt(albuf->FmtChannels); - bytes = BytesFromFmt(albuf->FmtType); - /* offset -> byte offset, length -> sample count */ - offset = offset/byte_align * channels*bytes; - length = length/byte_align * albuf->OriginalAlign; - - ConvertData((char*)albuf->data+offset, (enum UserFmtType)albuf->FmtType, - data, srctype, channels, length, align); - WriteUnlock(&albuf->lock); - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint buffer, - ALuint samplerate, ALenum internalformat, ALsizei samples, - ALenum channels, ALenum type, const ALvoid *data) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - ALsizei align; - ALenum err; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(!(samples >= 0 && samplerate != 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if(IsValidType(type) == AL_FALSE || IsValidChannels(channels) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - - align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - if(SanitizeAlignment(type, &align) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if((samples%align) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - err = LoadData(albuf, samplerate, internalformat, samples, - channels, type, data, align, AL_FALSE); - if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint buffer, - ALsizei offset, ALsizei samples, - ALenum channels, ALenum type, const ALvoid *data) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - ALsizei align; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(!(samples >= 0 && offset >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if(IsValidType(type) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - - WriteLock(&albuf->lock); - align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - if(SanitizeAlignment(type, &align) == AL_FALSE) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - if(channels != (ALenum)albuf->FmtChannels) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - if(offset > albuf->SampleLen || samples > albuf->SampleLen-offset) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - if((samples%align) != 0) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - - /* offset -> byte offset */ - offset *= FrameSizeFromFmt(albuf->FmtChannels, albuf->FmtType); - ConvertData((char*)albuf->data+offset, (enum UserFmtType)albuf->FmtType, - data, type, ChannelsFromFmt(albuf->FmtChannels), samples, align); - WriteUnlock(&albuf->lock); - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - -AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint buffer, - ALsizei offset, ALsizei samples, - ALenum channels, ALenum type, ALvoid *data) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - ALsizei align; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(!(samples >= 0 && offset >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - if(IsValidType(type) == AL_FALSE) - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - - ReadLock(&albuf->lock); - align = ATOMIC_LOAD_SEQ(&albuf->PackAlign); - if(SanitizeAlignment(type, &align) == AL_FALSE) - { - ReadUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - if(channels != (ALenum)albuf->FmtChannels) - { - ReadUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - if(offset > albuf->SampleLen || samples > albuf->SampleLen-offset) - { - ReadUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - if((samples%align) != 0) - { - ReadUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - - /* offset -> byte offset */ - offset *= FrameSizeFromFmt(albuf->FmtChannels, albuf->FmtType); - ConvertData(data, type, (char*)albuf->data+offset, (enum UserFmtType)albuf->FmtType, - ChannelsFromFmt(albuf->FmtChannels), samples, align); - ReadUnlock(&albuf->lock); - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum format) -{ - enum FmtChannels dstchannels; - enum FmtType dsttype; - ALCcontext *context; - ALboolean ret; - - context = GetContextRef(); - if(!context) return AL_FALSE; - - ret = DecomposeFormat(format, &dstchannels, &dsttype); - - ALCcontext_DecRef(context); - - return ret; -} - - -AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat UNUSED(value)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat UNUSED(value1), ALfloat UNUSED(value2), ALfloat UNUSED(value3)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - switch(param) - { - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - if(!(value >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - ATOMIC_STORE_SEQ(&albuf->UnpackAlign, value); - break; - - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - if(!(value >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - ATOMIC_STORE_SEQ(&albuf->PackAlign, value); - break; - - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint UNUSED(value1), ALint UNUSED(value2), ALint UNUSED(value3)) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - if(values) - { - switch(param) - { - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - alBufferi(buffer, param, values[0]); - return; - } - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - case AL_LOOP_POINTS_SOFT: - WriteLock(&albuf->lock); - if(ReadRef(&albuf->ref) != 0) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); - } - if(values[0] >= values[1] || values[0] < 0 || - values[1] > albuf->SampleLen) - { - WriteUnlock(&albuf->lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } - - albuf->LoopStart = values[0]; - albuf->LoopEnd = values[1]; - WriteUnlock(&albuf->lock); - break; - - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(value)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - case AL_SEC_LENGTH_SOFT: - ReadLock(&albuf->lock); - if(albuf->SampleLen != 0) - *value = albuf->SampleLen / (ALfloat)albuf->Frequency; - else - *value = 0.0f; - ReadUnlock(&albuf->lock); - break; - - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(value1 && value2 && value3)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values) -{ - ALCdevice *device; - ALCcontext *context; - - switch(param) - { - case AL_SEC_LENGTH_SOFT: - alGetBufferf(buffer, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API ALvoid AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(value)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - case AL_FREQUENCY: - *value = albuf->Frequency; - break; - - case AL_BITS: - *value = BytesFromFmt(albuf->FmtType) * 8; - break; - - case AL_CHANNELS: - *value = ChannelsFromFmt(albuf->FmtChannels); - break; - - case AL_SIZE: - ReadLock(&albuf->lock); - *value = albuf->SampleLen * FrameSizeFromFmt(albuf->FmtChannels, - albuf->FmtType); - ReadUnlock(&albuf->lock); - break; - - case AL_INTERNAL_FORMAT_SOFT: - *value = albuf->Format; - break; - - case AL_BYTE_LENGTH_SOFT: - *value = albuf->OriginalSize; - break; - - case AL_SAMPLE_LENGTH_SOFT: - *value = albuf->SampleLen; - break; - - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - *value = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); - break; - - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - *value = ATOMIC_LOAD_SEQ(&albuf->PackAlign); - break; - - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) -{ - ALCdevice *device; - ALCcontext *context; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if(LookupBuffer(device, buffer) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(value1 && value2 && value3)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values) -{ - ALCdevice *device; - ALCcontext *context; - ALbuffer *albuf; - - switch(param) - { - case AL_FREQUENCY: - case AL_BITS: - case AL_CHANNELS: - case AL_SIZE: - case AL_INTERNAL_FORMAT_SOFT: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: - case AL_PACK_BLOCK_ALIGNMENT_SOFT: - alGetBufferi(buffer, param, values); - return; - } - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockBuffersRead(device); - if((albuf=LookupBuffer(device, buffer)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) - { - case AL_LOOP_POINTS_SOFT: - ReadLock(&albuf->lock); - values[0] = albuf->LoopStart; - values[1] = albuf->LoopEnd; - ReadUnlock(&albuf->lock); - break; - - default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); - } - -done: - UnlockBuffersRead(device); - ALCcontext_DecRef(context); -} - - -/* - * LoadData - * - * Loads the specified data into the buffer, using the specified formats. - * Currently, the new format must have the same channel configuration as the - * original format. - */ -ALenum LoadData(ALbuffer *ALBuf, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALsizei align, ALboolean storesrc) -{ - enum FmtChannels DstChannels = FmtMono; - enum FmtType DstType = FmtByte; - ALuint NewChannels, NewBytes; - ALuint64 newsize; - - if(DecomposeFormat(NewFormat, &DstChannels, &DstType) == AL_FALSE) - return AL_INVALID_ENUM; - if((long)SrcChannels != (long)DstChannels) - return AL_INVALID_ENUM; - - NewChannels = ChannelsFromFmt(DstChannels); - NewBytes = BytesFromFmt(DstType); - - newsize = frames; - newsize *= NewBytes; - newsize *= NewChannels; - if(newsize > INT_MAX) - return AL_OUT_OF_MEMORY; - - WriteLock(&ALBuf->lock); - if(ReadRef(&ALBuf->ref) != 0) - { - WriteUnlock(&ALBuf->lock); - return AL_INVALID_OPERATION; - } - - /* Round up to the next 16-byte multiple. This could reallocate only when - * increasing or the new size is less than half the current, but then the - * buffer's AL_SIZE would not be very reliable for accounting buffer memory - * usage, and reporting the real size could cause problems for apps that - * use AL_SIZE to try to get the buffer's play length. - */ - newsize = (newsize+15) & ~0xf; - if(newsize != ALBuf->BytesAlloc) - { - void *temp = al_calloc(16, (size_t)newsize); - if(!temp && newsize) - { - WriteUnlock(&ALBuf->lock); - return AL_OUT_OF_MEMORY; - } - al_free(ALBuf->data); - ALBuf->data = temp; - ALBuf->BytesAlloc = (ALuint)newsize; - } - - if(data != NULL) - ConvertData(ALBuf->data, (enum UserFmtType)DstType, data, SrcType, NewChannels, frames, align); - - if(storesrc) - { - ALBuf->OriginalChannels = SrcChannels; - ALBuf->OriginalType = SrcType; - if(SrcType == UserFmtIMA4) - { - ALsizei byte_align = ((align-1)/2 + 4) * ChannelsFromUserFmt(SrcChannels); - ALBuf->OriginalSize = frames / align * byte_align; - ALBuf->OriginalAlign = align; - } - else if(SrcType == UserFmtMSADPCM) - { - ALsizei byte_align = ((align-2)/2 + 7) * ChannelsFromUserFmt(SrcChannels); - ALBuf->OriginalSize = frames / align * byte_align; - ALBuf->OriginalAlign = align; - } - else - { - ALBuf->OriginalSize = frames * FrameSizeFromUserFmt(SrcChannels, SrcType); - ALBuf->OriginalAlign = 1; - } - } - else - { - ALBuf->OriginalChannels = (enum UserFmtChannels)DstChannels; - ALBuf->OriginalType = (enum UserFmtType)DstType; - ALBuf->OriginalSize = frames * NewBytes * NewChannels; - ALBuf->OriginalAlign = 1; - } - - ALBuf->Frequency = freq; - ALBuf->FmtChannels = DstChannels; - ALBuf->FmtType = DstType; - ALBuf->Format = NewFormat; - - ALBuf->SampleLen = frames; - ALBuf->LoopStart = 0; - ALBuf->LoopEnd = ALBuf->SampleLen; - - WriteUnlock(&ALBuf->lock); - return AL_NO_ERROR; -} - - -ALsizei BytesFromUserFmt(enum UserFmtType type) -{ - switch(type) - { - case UserFmtByte: return sizeof(ALbyte); - case UserFmtUByte: return sizeof(ALubyte); - case UserFmtShort: return sizeof(ALshort); - case UserFmtUShort: return sizeof(ALushort); - case UserFmtInt: return sizeof(ALint); - case UserFmtUInt: return sizeof(ALuint); - case UserFmtFloat: return sizeof(ALfloat); - case UserFmtDouble: return sizeof(ALdouble); - case UserFmtMulaw: return sizeof(ALubyte); - case UserFmtAlaw: return sizeof(ALubyte); - case UserFmtIMA4: break; /* not handled here */ - case UserFmtMSADPCM: break; /* not handled here */ - } - return 0; -} -ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans) -{ - switch(chans) - { - case UserFmtMono: return 1; - case UserFmtStereo: return 2; - case UserFmtRear: return 2; - case UserFmtQuad: return 4; - case UserFmtX51: return 6; - case UserFmtX61: return 7; - case UserFmtX71: return 8; - case UserFmtBFormat2D: return 3; - case UserFmtBFormat3D: return 4; - } - return 0; -} -static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, - enum UserFmtType *type) -{ - static const struct { - ALenum format; - enum UserFmtChannels channels; - enum UserFmtType type; - } list[] = { - { AL_FORMAT_MONO8, UserFmtMono, UserFmtUByte }, - { AL_FORMAT_MONO16, UserFmtMono, UserFmtShort }, - { AL_FORMAT_MONO_FLOAT32, UserFmtMono, UserFmtFloat }, - { AL_FORMAT_MONO_DOUBLE_EXT, UserFmtMono, UserFmtDouble }, - { AL_FORMAT_MONO_IMA4, UserFmtMono, UserFmtIMA4 }, - { AL_FORMAT_MONO_MSADPCM_SOFT, UserFmtMono, UserFmtMSADPCM }, - { AL_FORMAT_MONO_MULAW, UserFmtMono, UserFmtMulaw }, - { AL_FORMAT_MONO_ALAW_EXT, UserFmtMono, UserFmtAlaw }, - - { AL_FORMAT_STEREO8, UserFmtStereo, UserFmtUByte }, - { AL_FORMAT_STEREO16, UserFmtStereo, UserFmtShort }, - { AL_FORMAT_STEREO_FLOAT32, UserFmtStereo, UserFmtFloat }, - { AL_FORMAT_STEREO_DOUBLE_EXT, UserFmtStereo, UserFmtDouble }, - { AL_FORMAT_STEREO_IMA4, UserFmtStereo, UserFmtIMA4 }, - { AL_FORMAT_STEREO_MSADPCM_SOFT, UserFmtStereo, UserFmtMSADPCM }, - { AL_FORMAT_STEREO_MULAW, UserFmtStereo, UserFmtMulaw }, - { AL_FORMAT_STEREO_ALAW_EXT, UserFmtStereo, UserFmtAlaw }, - - { AL_FORMAT_REAR8, UserFmtRear, UserFmtUByte }, - { AL_FORMAT_REAR16, UserFmtRear, UserFmtShort }, - { AL_FORMAT_REAR32, UserFmtRear, UserFmtFloat }, - { AL_FORMAT_REAR_MULAW, UserFmtRear, UserFmtMulaw }, - - { AL_FORMAT_QUAD8_LOKI, UserFmtQuad, UserFmtUByte }, - { AL_FORMAT_QUAD16_LOKI, UserFmtQuad, UserFmtShort }, - - { AL_FORMAT_QUAD8, UserFmtQuad, UserFmtUByte }, - { AL_FORMAT_QUAD16, UserFmtQuad, UserFmtShort }, - { AL_FORMAT_QUAD32, UserFmtQuad, UserFmtFloat }, - { AL_FORMAT_QUAD_MULAW, UserFmtQuad, UserFmtMulaw }, - - { AL_FORMAT_51CHN8, UserFmtX51, UserFmtUByte }, - { AL_FORMAT_51CHN16, UserFmtX51, UserFmtShort }, - { AL_FORMAT_51CHN32, UserFmtX51, UserFmtFloat }, - { AL_FORMAT_51CHN_MULAW, UserFmtX51, UserFmtMulaw }, - - { AL_FORMAT_61CHN8, UserFmtX61, UserFmtUByte }, - { AL_FORMAT_61CHN16, UserFmtX61, UserFmtShort }, - { AL_FORMAT_61CHN32, UserFmtX61, UserFmtFloat }, - { AL_FORMAT_61CHN_MULAW, UserFmtX61, UserFmtMulaw }, - - { AL_FORMAT_71CHN8, UserFmtX71, UserFmtUByte }, - { AL_FORMAT_71CHN16, UserFmtX71, UserFmtShort }, - { AL_FORMAT_71CHN32, UserFmtX71, UserFmtFloat }, - { AL_FORMAT_71CHN_MULAW, UserFmtX71, UserFmtMulaw }, - - { AL_FORMAT_BFORMAT2D_8, UserFmtBFormat2D, UserFmtUByte }, - { AL_FORMAT_BFORMAT2D_16, UserFmtBFormat2D, UserFmtShort }, - { AL_FORMAT_BFORMAT2D_FLOAT32, UserFmtBFormat2D, UserFmtFloat }, - { AL_FORMAT_BFORMAT2D_MULAW, UserFmtBFormat2D, UserFmtMulaw }, - - { AL_FORMAT_BFORMAT3D_8, UserFmtBFormat3D, UserFmtUByte }, - { AL_FORMAT_BFORMAT3D_16, UserFmtBFormat3D, UserFmtShort }, - { AL_FORMAT_BFORMAT3D_FLOAT32, UserFmtBFormat3D, UserFmtFloat }, - { AL_FORMAT_BFORMAT3D_MULAW, UserFmtBFormat3D, UserFmtMulaw }, - }; - ALuint i; - - for(i = 0;i < COUNTOF(list);i++) - { - if(list[i].format == format) - { - *chans = list[i].channels; - *type = list[i].type; - return AL_TRUE; - } - } - - return AL_FALSE; -} - -ALsizei BytesFromFmt(enum FmtType type) -{ - switch(type) - { - case FmtByte: return sizeof(ALbyte); - case FmtShort: return sizeof(ALshort); - case FmtFloat: return sizeof(ALfloat); - } - return 0; -} -ALsizei ChannelsFromFmt(enum FmtChannels chans) -{ - switch(chans) - { - case FmtMono: return 1; - case FmtStereo: return 2; - case FmtRear: return 2; - case FmtQuad: return 4; - case FmtX51: return 6; - case FmtX61: return 7; - case FmtX71: return 8; - case FmtBFormat2D: return 3; - case FmtBFormat3D: return 4; - } - return 0; -} -static ALboolean DecomposeFormat(ALenum format, enum FmtChannels *chans, enum FmtType *type) -{ - static const struct { - ALenum format; - enum FmtChannels channels; - enum FmtType type; - } list[] = { - { AL_MONO8_SOFT, FmtMono, FmtByte }, - { AL_MONO16_SOFT, FmtMono, FmtShort }, - { AL_MONO32F_SOFT, FmtMono, FmtFloat }, - - { AL_STEREO8_SOFT, FmtStereo, FmtByte }, - { AL_STEREO16_SOFT, FmtStereo, FmtShort }, - { AL_STEREO32F_SOFT, FmtStereo, FmtFloat }, - - { AL_REAR8_SOFT, FmtRear, FmtByte }, - { AL_REAR16_SOFT, FmtRear, FmtShort }, - { AL_REAR32F_SOFT, FmtRear, FmtFloat }, - - { AL_FORMAT_QUAD8_LOKI, FmtQuad, FmtByte }, - { AL_FORMAT_QUAD16_LOKI, FmtQuad, FmtShort }, - - { AL_QUAD8_SOFT, FmtQuad, FmtByte }, - { AL_QUAD16_SOFT, FmtQuad, FmtShort }, - { AL_QUAD32F_SOFT, FmtQuad, FmtFloat }, - - { AL_5POINT1_8_SOFT, FmtX51, FmtByte }, - { AL_5POINT1_16_SOFT, FmtX51, FmtShort }, - { AL_5POINT1_32F_SOFT, FmtX51, FmtFloat }, - - { AL_6POINT1_8_SOFT, FmtX61, FmtByte }, - { AL_6POINT1_16_SOFT, FmtX61, FmtShort }, - { AL_6POINT1_32F_SOFT, FmtX61, FmtFloat }, - - { AL_7POINT1_8_SOFT, FmtX71, FmtByte }, - { AL_7POINT1_16_SOFT, FmtX71, FmtShort }, - { AL_7POINT1_32F_SOFT, FmtX71, FmtFloat }, - - { AL_BFORMAT2D_8_SOFT, FmtBFormat2D, FmtByte }, - { AL_BFORMAT2D_16_SOFT, FmtBFormat2D, FmtShort }, - { AL_BFORMAT2D_32F_SOFT, FmtBFormat2D, FmtFloat }, - - { AL_BFORMAT3D_8_SOFT, FmtBFormat3D, FmtByte }, - { AL_BFORMAT3D_16_SOFT, FmtBFormat3D, FmtShort }, - { AL_BFORMAT3D_32F_SOFT, FmtBFormat3D, FmtFloat }, - }; - ALuint i; - - for(i = 0;i < COUNTOF(list);i++) - { - if(list[i].format == format) - { - *chans = list[i].channels; - *type = list[i].type; - return AL_TRUE; - } - } - - return AL_FALSE; -} - -static ALboolean SanitizeAlignment(enum UserFmtType type, ALsizei *align) -{ - if(*align < 0) - return AL_FALSE; - - if(*align == 0) - { - if(type == UserFmtIMA4) - { - /* Here is where things vary: - * nVidia and Apple use 64+1 sample frames per block -> block_size=36 bytes per channel - * Most PC sound software uses 2040+1 sample frames per block -> block_size=1024 bytes per channel - */ - *align = 65; - } - else if(type == UserFmtMSADPCM) - *align = 64; - else - *align = 1; - return AL_TRUE; - } - - if(type == UserFmtIMA4) - { - /* IMA4 block alignment must be a multiple of 8, plus 1. */ - return ((*align)&7) == 1; - } - if(type == UserFmtMSADPCM) - { - /* MSADPCM block alignment must be a multiple of 2. */ - /* FIXME: Too strict? Might only require align*channels to be a - * multiple of 2. */ - return ((*align)&1) == 0; - } - - return AL_TRUE; -} - - -static ALboolean IsValidType(ALenum type) -{ - switch(type) - { - case AL_BYTE_SOFT: - case AL_UNSIGNED_BYTE_SOFT: - case AL_SHORT_SOFT: - case AL_UNSIGNED_SHORT_SOFT: - case AL_INT_SOFT: - case AL_UNSIGNED_INT_SOFT: - case AL_FLOAT_SOFT: - case AL_DOUBLE_SOFT: - case AL_MULAW_SOFT: - return AL_TRUE; - } - return AL_FALSE; -} - -static ALboolean IsValidChannels(ALenum channels) -{ - switch(channels) - { - case AL_MONO_SOFT: - case AL_STEREO_SOFT: - case AL_REAR_SOFT: - case AL_QUAD_SOFT: - case AL_5POINT1_SOFT: - case AL_6POINT1_SOFT: - case AL_7POINT1_SOFT: - case AL_BFORMAT2D_SOFT: - case AL_BFORMAT3D_SOFT: - return AL_TRUE; - } - return AL_FALSE; -} - - -ALbuffer *NewBuffer(ALCcontext *context) -{ - ALCdevice *device = context->Device; - ALbuffer *buffer; - ALenum err; - - buffer = al_calloc(16, sizeof(ALbuffer)); - if(!buffer) - SET_ERROR_AND_RETURN_VALUE(context, AL_OUT_OF_MEMORY, NULL); - RWLockInit(&buffer->lock); - - err = NewThunkEntry(&buffer->id); - if(err == AL_NO_ERROR) - err = InsertUIntMapEntry(&device->BufferMap, buffer->id, buffer); - if(err != AL_NO_ERROR) - { - FreeThunkEntry(buffer->id); - memset(buffer, 0, sizeof(ALbuffer)); - al_free(buffer); - - SET_ERROR_AND_RETURN_VALUE(context, err, NULL); - } - - return buffer; -} - -void DeleteBuffer(ALCdevice *device, ALbuffer *buffer) -{ - RemoveBuffer(device, buffer->id); - FreeThunkEntry(buffer->id); - - al_free(buffer->data); - - memset(buffer, 0, sizeof(*buffer)); - al_free(buffer); -} - - -/* - * ReleaseALBuffers() - * - * INTERNAL: Called to destroy any buffers that still exist on the device - */ -ALvoid ReleaseALBuffers(ALCdevice *device) -{ - ALsizei i; - for(i = 0;i < device->BufferMap.size;i++) - { - ALbuffer *temp = device->BufferMap.values[i]; - device->BufferMap.values[i] = NULL; - - al_free(temp->data); - - FreeThunkEntry(temp->id); - memset(temp, 0, sizeof(ALbuffer)); - al_free(temp); - } -} diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alFilter.c b/love/src/jni/openal-soft-1.18.2/OpenAL32/alFilter.c deleted file mode 100644 index 2a2b9621..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alFilter.c +++ /dev/null @@ -1,719 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alu.h" -#include "alFilter.h" -#include "alThunk.h" -#include "alError.h" - - -extern inline void LockFiltersRead(ALCdevice *device); -extern inline void UnlockFiltersRead(ALCdevice *device); -extern inline void LockFiltersWrite(ALCdevice *device); -extern inline void UnlockFiltersWrite(ALCdevice *device); -extern inline struct ALfilter *LookupFilter(ALCdevice *device, ALuint id); -extern inline struct ALfilter *RemoveFilter(ALCdevice *device, ALuint id); -extern inline void ALfilterState_clear(ALfilterState *filter); -extern inline void ALfilterState_copyParams(ALfilterState *restrict dst, const ALfilterState *restrict src); -extern inline void ALfilterState_processPassthru(ALfilterState *filter, const ALfloat *restrict src, ALsizei numsamples); -extern inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope); -extern inline ALfloat calc_rcpQ_from_bandwidth(ALfloat freq_mult, ALfloat bandwidth); - -static void InitFilterParams(ALfilter *filter, ALenum type); - - -AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) -{ - ALCdevice *device; - ALCcontext *context; - ALsizei cur = 0; - ALenum err; - - context = GetContextRef(); - if(!context) return; - - if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - device = context->Device; - for(cur = 0;cur < n;cur++) - { - ALfilter *filter = al_calloc(16, sizeof(ALfilter)); - if(!filter) - { - alDeleteFilters(cur, filters); - SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done); - } - InitFilterParams(filter, AL_FILTER_NULL); - - err = NewThunkEntry(&filter->id); - if(err == AL_NO_ERROR) - err = InsertUIntMapEntry(&device->FilterMap, filter->id, filter); - if(err != AL_NO_ERROR) - { - FreeThunkEntry(filter->id); - memset(filter, 0, sizeof(ALfilter)); - al_free(filter); - - alDeleteFilters(cur, filters); - SET_ERROR_AND_GOTO(context, err, done); - } - - filters[cur] = filter->id; - } - -done: - ALCcontext_DecRef(context); -} - -AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters) -{ - ALCdevice *device; - ALCcontext *context; - ALfilter *filter; - ALsizei i; - - context = GetContextRef(); - if(!context) return; - - device = context->Device; - LockFiltersWrite(device); - if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - for(i = 0;i < n;i++) - { - if(filters[i] && LookupFilter(device, filters[i]) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - } - for(i = 0;i < n;i++) - { - if((filter=RemoveFilter(device, filters[i])) == NULL) - continue; - FreeThunkEntry(filter->id); - - memset(filter, 0, sizeof(*filter)); - al_free(filter); - } - -done: - UnlockFiltersWrite(device); - ALCcontext_DecRef(context); -} - -AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter) -{ - ALCcontext *Context; - ALboolean result; - - Context = GetContextRef(); - if(!Context) return AL_FALSE; - - LockFiltersRead(Context->Device); - result = ((!filter || LookupFilter(Context->Device, filter)) ? - AL_TRUE : AL_FALSE); - UnlockFiltersRead(Context->Device); - - ALCcontext_DecRef(Context); - - return result; -} - -AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersWrite(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - if(param == AL_FILTER_TYPE) - { - if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS || - value == AL_FILTER_HIGHPASS || value == AL_FILTER_BANDPASS) - InitFilterParams(ALFilter, value); - else - alSetError(Context, AL_INVALID_VALUE); - } - else - { - /* Call the appropriate handler */ - ALfilter_SetParami(ALFilter, Context, param, value); - } - } - UnlockFiltersWrite(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - switch(param) - { - case AL_FILTER_TYPE: - alFilteri(filter, param, values[0]); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersWrite(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_SetParamiv(ALFilter, Context, param, values); - } - UnlockFiltersWrite(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersWrite(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_SetParamf(ALFilter, Context, param, value); - } - UnlockFiltersWrite(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersWrite(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_SetParamfv(ALFilter, Context, param, values); - } - UnlockFiltersWrite(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersRead(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - if(param == AL_FILTER_TYPE) - *value = ALFilter->type; - else - { - /* Call the appropriate handler */ - ALfilter_GetParami(ALFilter, Context, param, value); - } - } - UnlockFiltersRead(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - switch(param) - { - case AL_FILTER_TYPE: - alGetFilteri(filter, param, values); - return; - } - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersRead(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_GetParamiv(ALFilter, Context, param, values); - } - UnlockFiltersRead(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersRead(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_GetParamf(ALFilter, Context, param, value); - } - UnlockFiltersRead(Device); - - ALCcontext_DecRef(Context); -} - -AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values) -{ - ALCcontext *Context; - ALCdevice *Device; - ALfilter *ALFilter; - - Context = GetContextRef(); - if(!Context) return; - - Device = Context->Device; - LockFiltersRead(Device); - if((ALFilter=LookupFilter(Device, filter)) == NULL) - alSetError(Context, AL_INVALID_NAME); - else - { - /* Call the appropriate handler */ - ALfilter_GetParamfv(ALFilter, Context, param, values); - } - UnlockFiltersRead(Device); - - ALCcontext_DecRef(Context); -} - - -void ALfilterState_setParams(ALfilterState *filter, ALfilterType type, ALfloat gain, ALfloat freq_mult, ALfloat rcpQ) -{ - ALfloat alpha, sqrtgain_alpha_2; - ALfloat w0, sin_w0, cos_w0; - ALfloat a[3] = { 1.0f, 0.0f, 0.0f }; - ALfloat b[3] = { 1.0f, 0.0f, 0.0f }; - - // Limit gain to -100dB - assert(gain > 0.00001f); - - w0 = F_TAU * freq_mult; - sin_w0 = sinf(w0); - cos_w0 = cosf(w0); - alpha = sin_w0/2.0f * rcpQ; - - /* Calculate filter coefficients depending on filter type */ - switch(type) - { - case ALfilterType_HighShelf: - sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; - b[0] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); - b[1] = -2.0f*gain*((gain-1.0f) + (gain+1.0f)*cos_w0 ); - b[2] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); - a[0] = (gain+1.0f) - (gain-1.0f)*cos_w0 + sqrtgain_alpha_2; - a[1] = 2.0f* ((gain-1.0f) - (gain+1.0f)*cos_w0 ); - a[2] = (gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; - break; - case ALfilterType_LowShelf: - sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; - b[0] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); - b[1] = 2.0f*gain*((gain-1.0f) - (gain+1.0f)*cos_w0 ); - b[2] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); - a[0] = (gain+1.0f) + (gain-1.0f)*cos_w0 + sqrtgain_alpha_2; - a[1] = -2.0f* ((gain-1.0f) + (gain+1.0f)*cos_w0 ); - a[2] = (gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; - break; - case ALfilterType_Peaking: - gain = sqrtf(gain); - b[0] = 1.0f + alpha * gain; - b[1] = -2.0f * cos_w0; - b[2] = 1.0f - alpha * gain; - a[0] = 1.0f + alpha / gain; - a[1] = -2.0f * cos_w0; - a[2] = 1.0f - alpha / gain; - break; - - case ALfilterType_LowPass: - b[0] = (1.0f - cos_w0) / 2.0f; - b[1] = 1.0f - cos_w0; - b[2] = (1.0f - cos_w0) / 2.0f; - a[0] = 1.0f + alpha; - a[1] = -2.0f * cos_w0; - a[2] = 1.0f - alpha; - break; - case ALfilterType_HighPass: - b[0] = (1.0f + cos_w0) / 2.0f; - b[1] = -(1.0f + cos_w0); - b[2] = (1.0f + cos_w0) / 2.0f; - a[0] = 1.0f + alpha; - a[1] = -2.0f * cos_w0; - a[2] = 1.0f - alpha; - break; - case ALfilterType_BandPass: - b[0] = alpha; - b[1] = 0; - b[2] = -alpha; - a[0] = 1.0f + alpha; - a[1] = -2.0f * cos_w0; - a[2] = 1.0f - alpha; - break; - } - - filter->a1 = a[1] / a[0]; - filter->a2 = a[2] / a[0]; - filter->b0 = b[0] / a[0]; - filter->b1 = b[1] / a[0]; - filter->b2 = b[2] / a[0]; -} - - -static void lp_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void lp_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void lp_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_LOWPASS_GAIN: - if(!(val >= AL_LOWPASS_MIN_GAIN && val <= AL_LOWPASS_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->Gain = val; - break; - - case AL_LOWPASS_GAINHF: - if(!(val >= AL_LOWPASS_MIN_GAINHF && val <= AL_LOWPASS_MAX_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->GainHF = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void lp_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - lp_SetParamf(filter, context, param, vals[0]); -} - -static void lp_GetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void lp_GetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void lp_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_LOWPASS_GAIN: - *val = filter->Gain; - break; - - case AL_LOWPASS_GAINHF: - *val = filter->GainHF; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void lp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ - lp_GetParamf(filter, context, param, vals); -} - - -static void hp_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void hp_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void hp_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_HIGHPASS_GAIN: - if(!(val >= AL_HIGHPASS_MIN_GAIN && val <= AL_HIGHPASS_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->Gain = val; - break; - - case AL_HIGHPASS_GAINLF: - if(!(val >= AL_HIGHPASS_MIN_GAINLF && val <= AL_HIGHPASS_MAX_GAINLF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->GainLF = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void hp_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - hp_SetParamf(filter, context, param, vals[0]); -} - -static void hp_GetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void hp_GetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void hp_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_HIGHPASS_GAIN: - *val = filter->Gain; - break; - - case AL_HIGHPASS_GAINLF: - *val = filter->GainLF; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void hp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ - hp_GetParamf(filter, context, param, vals); -} - - -static void bp_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void bp_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void bp_SetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) -{ - switch(param) - { - case AL_BANDPASS_GAIN: - if(!(val >= AL_BANDPASS_MIN_GAIN && val <= AL_BANDPASS_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->Gain = val; - break; - - case AL_BANDPASS_GAINHF: - if(!(val >= AL_BANDPASS_MIN_GAINHF && val <= AL_BANDPASS_MAX_GAINHF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->GainHF = val; - break; - - case AL_BANDPASS_GAINLF: - if(!(val >= AL_BANDPASS_MIN_GAINLF && val <= AL_BANDPASS_MAX_GAINLF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); - filter->GainLF = val; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void bp_SetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - bp_SetParamf(filter, context, param, vals[0]); -} - -static void bp_GetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void bp_GetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void bp_GetParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) -{ - switch(param) - { - case AL_BANDPASS_GAIN: - *val = filter->Gain; - break; - - case AL_BANDPASS_GAINHF: - *val = filter->GainHF; - break; - - case AL_BANDPASS_GAINLF: - *val = filter->GainLF; - break; - - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); - } -} -static void bp_GetParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) -{ - bp_GetParamf(filter, context, param, vals); -} - - -static void null_SetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_SetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_SetParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALfloat UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_SetParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), const ALfloat *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } - -static void null_GetParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_GetParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_GetParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALfloat *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -static void null_GetParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum UNUSED(param), ALfloat *UNUSED(vals)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } - - -ALvoid ReleaseALFilters(ALCdevice *device) -{ - ALsizei i; - for(i = 0;i < device->FilterMap.size;i++) - { - ALfilter *temp = device->FilterMap.values[i]; - device->FilterMap.values[i] = NULL; - - // Release filter structure - FreeThunkEntry(temp->id); - memset(temp, 0, sizeof(ALfilter)); - al_free(temp); - } -} - - -static void InitFilterParams(ALfilter *filter, ALenum type) -{ - if(type == AL_FILTER_LOWPASS) - { - filter->Gain = AL_LOWPASS_DEFAULT_GAIN; - filter->GainHF = AL_LOWPASS_DEFAULT_GAINHF; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = 1.0f; - filter->LFReference = HIGHPASSFREQREF; - - filter->SetParami = lp_SetParami; - filter->SetParamiv = lp_SetParamiv; - filter->SetParamf = lp_SetParamf; - filter->SetParamfv = lp_SetParamfv; - filter->GetParami = lp_GetParami; - filter->GetParamiv = lp_GetParamiv; - filter->GetParamf = lp_GetParamf; - filter->GetParamfv = lp_GetParamfv; - } - else if(type == AL_FILTER_HIGHPASS) - { - filter->Gain = AL_HIGHPASS_DEFAULT_GAIN; - filter->GainHF = 1.0f; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = AL_HIGHPASS_DEFAULT_GAINLF; - filter->LFReference = HIGHPASSFREQREF; - - filter->SetParami = hp_SetParami; - filter->SetParamiv = hp_SetParamiv; - filter->SetParamf = hp_SetParamf; - filter->SetParamfv = hp_SetParamfv; - filter->GetParami = hp_GetParami; - filter->GetParamiv = hp_GetParamiv; - filter->GetParamf = hp_GetParamf; - filter->GetParamfv = hp_GetParamfv; - } - else if(type == AL_FILTER_BANDPASS) - { - filter->Gain = AL_BANDPASS_DEFAULT_GAIN; - filter->GainHF = AL_BANDPASS_DEFAULT_GAINHF; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = AL_BANDPASS_DEFAULT_GAINLF; - filter->LFReference = HIGHPASSFREQREF; - - filter->SetParami = bp_SetParami; - filter->SetParamiv = bp_SetParamiv; - filter->SetParamf = bp_SetParamf; - filter->SetParamfv = bp_SetParamfv; - filter->GetParami = bp_GetParami; - filter->GetParamiv = bp_GetParamiv; - filter->GetParamf = bp_GetParamf; - filter->GetParamfv = bp_GetParamfv; - } - else - { - filter->Gain = 1.0f; - filter->GainHF = 1.0f; - filter->HFReference = LOWPASSFREQREF; - filter->GainLF = 1.0f; - filter->LFReference = HIGHPASSFREQREF; - - filter->SetParami = null_SetParami; - filter->SetParamiv = null_SetParamiv; - filter->SetParamf = null_SetParamf; - filter->SetParamfv = null_SetParamfv; - filter->GetParami = null_GetParami; - filter->GetParamiv = null_GetParamiv; - filter->GetParamf = null_GetParamf; - filter->GetParamfv = null_GetParamfv; - } - filter->type = type; -} diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alThunk.c b/love/src/jni/openal-soft-1.18.2/OpenAL32/alThunk.c deleted file mode 100644 index 0d90760a..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alThunk.c +++ /dev/null @@ -1,108 +0,0 @@ -/** - * OpenAL cross platform audio library - * Copyright (C) 1999-2007 by authors. - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * Or go to http://www.gnu.org/copyleft/lgpl.html - */ - -#include "config.h" - -#include - -#include "alMain.h" -#include "alThunk.h" - -#include "almalloc.h" - - -static ATOMIC_FLAG *ThunkArray; -static ALsizei ThunkArraySize; -static RWLock ThunkLock; - -void ThunkInit(void) -{ - RWLockInit(&ThunkLock); - ThunkArraySize = 1024; - ThunkArray = al_calloc(16, ThunkArraySize * sizeof(*ThunkArray)); -} - -void ThunkExit(void) -{ - al_free(ThunkArray); - ThunkArray = NULL; - ThunkArraySize = 0; -} - -ALenum NewThunkEntry(ALuint *index) -{ - void *NewList; - ALsizei i; - - ReadLock(&ThunkLock); - for(i = 0;i < ThunkArraySize;i++) - { - if(!ATOMIC_FLAG_TEST_AND_SET(&ThunkArray[i], almemory_order_acq_rel)) - { - ReadUnlock(&ThunkLock); - *index = i+1; - return AL_NO_ERROR; - } - } - ReadUnlock(&ThunkLock); - - WriteLock(&ThunkLock); - /* Double-check that there's still no free entries, in case another - * invocation just came through and increased the size of the array. - */ - for(;i < ThunkArraySize;i++) - { - if(!ATOMIC_FLAG_TEST_AND_SET(&ThunkArray[i], almemory_order_acq_rel)) - { - WriteUnlock(&ThunkLock); - *index = i+1; - return AL_NO_ERROR; - } - } - - NewList = al_calloc(16, ThunkArraySize*2 * sizeof(*ThunkArray)); - if(!NewList) - { - WriteUnlock(&ThunkLock); - ERR("Realloc failed to increase to %u entries!\n", ThunkArraySize*2); - return AL_OUT_OF_MEMORY; - } - memcpy(NewList, ThunkArray, ThunkArraySize*sizeof(*ThunkArray)); - al_free(ThunkArray); - ThunkArray = NewList; - ThunkArraySize *= 2; - - ATOMIC_FLAG_TEST_AND_SET(&ThunkArray[i], almemory_order_seq_cst); - *index = ++i; - - for(;i < ThunkArraySize;i++) - ATOMIC_FLAG_CLEAR(&ThunkArray[i], almemory_order_relaxed); - WriteUnlock(&ThunkLock); - - return AL_NO_ERROR; -} - -void FreeThunkEntry(ALuint index) -{ - ReadLock(&ThunkLock); - if(index > 0 && (ALsizei)index <= ThunkArraySize) - ATOMIC_FLAG_CLEAR(&ThunkArray[index-1], almemory_order_release); - ReadUnlock(&ThunkLock); -} diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/sample_cvt.c b/love/src/jni/openal-soft-1.18.2/OpenAL32/sample_cvt.c deleted file mode 100644 index 89c2a408..00000000 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/sample_cvt.c +++ /dev/null @@ -1,1004 +0,0 @@ - -#include "config.h" - -#include "sample_cvt.h" - -#ifdef HAVE_ALLOCA_H -#include -#endif -#ifdef HAVE_MALLOC_H -#include -#endif - -#include "AL/al.h" -#include "alu.h" -#include "alBuffer.h" - - -/* IMA ADPCM Stepsize table */ -static const int IMAStep_size[89] = { - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, - 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, - 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, - 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, - 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, - 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, - 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442, - 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794, - 32767 -}; - -/* IMA4 ADPCM Codeword decode table */ -static const int IMA4Codeword[16] = { - 1, 3, 5, 7, 9, 11, 13, 15, - -1,-3,-5,-7,-9,-11,-13,-15, -}; - -/* IMA4 ADPCM Step index adjust decode table */ -static const int IMA4Index_adjust[16] = { - -1,-1,-1,-1, 2, 4, 6, 8, - -1,-1,-1,-1, 2, 4, 6, 8 -}; - - -/* MSADPCM Adaption table */ -static const int MSADPCMAdaption[16] = { - 230, 230, 230, 230, 307, 409, 512, 614, - 768, 614, 512, 409, 307, 230, 230, 230 -}; - -/* MSADPCM Adaption Coefficient tables */ -static const int MSADPCMAdaptionCoeff[7][2] = { - { 256, 0 }, - { 512, -256 }, - { 0, 0 }, - { 192, 64 }, - { 240, 0 }, - { 460, -208 }, - { 392, -232 } -}; - - -/* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a - * signed 16-bit sample */ -static const ALshort muLawDecompressionTable[256] = { - -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956, - -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764, - -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412, - -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316, - -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, - -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, - -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, - -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, - -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, - -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, - -876, -844, -812, -780, -748, -716, -684, -652, - -620, -588, -556, -524, -492, -460, -428, -396, - -372, -356, -340, -324, -308, -292, -276, -260, - -244, -228, -212, -196, -180, -164, -148, -132, - -120, -112, -104, -96, -88, -80, -72, -64, - -56, -48, -40, -32, -24, -16, -8, 0, - 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, - 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, - 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, - 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, - 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, - 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, - 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, - 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, - 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, - 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, - 876, 844, 812, 780, 748, 716, 684, 652, - 620, 588, 556, 524, 492, 460, 428, 396, - 372, 356, 340, 324, 308, 292, 276, 260, - 244, 228, 212, 196, 180, 164, 148, 132, - 120, 112, 104, 96, 88, 80, 72, 64, - 56, 48, 40, 32, 24, 16, 8, 0 -}; - -/* Values used when encoding a muLaw sample */ -static const int muLawBias = 0x84; -static const int muLawClip = 32635; -static const char muLawCompressTable[256] = { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -}; - - -/* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a - * signed 16-bit sample */ -static const ALshort aLawDecompressionTable[256] = { - -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, - -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, - -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, - -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, - -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, - -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, - -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, - -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, - -344, -328, -376, -360, -280, -264, -312, -296, - -472, -456, -504, -488, -408, -392, -440, -424, - -88, -72, -120, -104, -24, -8, -56, -40, - -216, -200, -248, -232, -152, -136, -184, -168, - -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, - -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, - -688, -656, -752, -720, -560, -528, -624, -592, - -944, -912, -1008, -976, -816, -784, -880, -848, - 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, - 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, - 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, - 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, - 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, - 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, - 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, - 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, - 344, 328, 376, 360, 280, 264, 312, 296, - 472, 456, 504, 488, 408, 392, 440, 424, - 88, 72, 120, 104, 24, 8, 56, 40, - 216, 200, 248, 232, 152, 136, 184, 168, - 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, - 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, - 688, 656, 752, 720, 560, 528, 624, 592, - 944, 912, 1008, 976, 816, 784, 880, 848 -}; - -/* Values used when encoding an aLaw sample */ -static const int aLawClip = 32635; -static const char aLawCompressTable[128] = { - 1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -}; - - -typedef ALubyte ALmulaw; -typedef ALubyte ALalaw; -typedef ALubyte ALima4; -typedef ALubyte ALmsadpcm; - -static inline ALshort DecodeMuLaw(ALmulaw val) -{ return muLawDecompressionTable[val]; } - -static ALmulaw EncodeMuLaw(ALshort val) -{ - ALint mant, exp, sign; - - sign = (val>>8) & 0x80; - if(sign) - { - /* -32768 doesn't properly negate on a short; it results in itself. - * So clamp to -32767 */ - val = maxi(val, -32767); - val = -val; - } - - val = mini(val, muLawClip); - val += muLawBias; - - exp = muLawCompressTable[(val>>7) & 0xff]; - mant = (val >> (exp+3)) & 0x0f; - - return ~(sign | (exp<<4) | mant); -} - -static inline ALshort DecodeALaw(ALalaw val) -{ return aLawDecompressionTable[val]; } - -static ALalaw EncodeALaw(ALshort val) -{ - ALint mant, exp, sign; - - sign = ((~val) >> 8) & 0x80; - if(!sign) - { - val = maxi(val, -32767); - val = -val; - } - val = mini(val, aLawClip); - - if(val >= 256) - { - exp = aLawCompressTable[(val>>8) & 0x7f]; - mant = (val >> (exp+3)) & 0x0f; - } - else - { - exp = 0; - mant = val >> 4; - } - - return ((exp<<4) | mant) ^ (sign^0x55); -} - -static void DecodeIMA4Block(ALshort *dst, const ALima4 *src, ALint numchans, ALsizei align) -{ - ALint sample[MAX_INPUT_CHANNELS], index[MAX_INPUT_CHANNELS]; - ALuint code[MAX_INPUT_CHANNELS]; - ALsizei j,k,c; - - for(c = 0;c < numchans;c++) - { - sample[c] = *(src++); - sample[c] |= *(src++) << 8; - sample[c] = (sample[c]^0x8000) - 32768; - index[c] = *(src++); - index[c] |= *(src++) << 8; - index[c] = (index[c]^0x8000) - 32768; - - index[c] = clampi(index[c], 0, 88); - - dst[c] = sample[c]; - } - - for(j = 1;j < align;j += 8) - { - for(c = 0;c < numchans;c++) - { - code[c] = *(src++); - code[c] |= *(src++) << 8; - code[c] |= *(src++) << 16; - code[c] |= *(src++) << 24; - } - - for(k = 0;k < 8;k++) - { - for(c = 0;c < numchans;c++) - { - int nibble = code[c]&0xf; - code[c] >>= 4; - - sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8; - sample[c] = clampi(sample[c], -32768, 32767); - - index[c] += IMA4Index_adjust[nibble]; - index[c] = clampi(index[c], 0, 88); - - dst[(j+k)*numchans + c] = sample[c]; - } - } - } -} - -static void EncodeIMA4Block(ALima4 *dst, const ALshort *src, ALint *sample, ALint *index, ALint numchans, ALsizei align) -{ - ALsizei j,k,c; - - for(c = 0;c < numchans;c++) - { - int diff = src[c] - sample[c]; - int step = IMAStep_size[index[c]]; - int nibble; - - nibble = 0; - if(diff < 0) - { - nibble = 0x8; - diff = -diff; - } - - diff = mini(step*2, diff); - nibble |= (diff*8/step - 1) / 2; - - sample[c] += IMA4Codeword[nibble] * step / 8; - sample[c] = clampi(sample[c], -32768, 32767); - - index[c] += IMA4Index_adjust[nibble]; - index[c] = clampi(index[c], 0, 88); - - *(dst++) = sample[c] & 0xff; - *(dst++) = (sample[c]>>8) & 0xff; - *(dst++) = index[c] & 0xff; - *(dst++) = (index[c]>>8) & 0xff; - } - - for(j = 1;j < align;j += 8) - { - for(c = 0;c < numchans;c++) - { - for(k = 0;k < 8;k++) - { - int diff = src[(j+k)*numchans + c] - sample[c]; - int step = IMAStep_size[index[c]]; - int nibble; - - nibble = 0; - if(diff < 0) - { - nibble = 0x8; - diff = -diff; - } - - diff = mini(step*2, diff); - nibble |= (diff*8/step - 1) / 2; - - sample[c] += IMA4Codeword[nibble] * step / 8; - sample[c] = clampi(sample[c], -32768, 32767); - - index[c] += IMA4Index_adjust[nibble]; - index[c] = clampi(index[c], 0, 88); - - if(!(k&1)) *dst = nibble; - else *(dst++) |= nibble<<4; - } - } - } -} - - -static void DecodeMSADPCMBlock(ALshort *dst, const ALmsadpcm *src, ALint numchans, ALsizei align) -{ - ALubyte blockpred[MAX_INPUT_CHANNELS]; - ALint delta[MAX_INPUT_CHANNELS]; - ALshort samples[MAX_INPUT_CHANNELS][2]; - ALint i, j; - - for(i = 0;i < numchans;i++) - { - blockpred[i] = *(src++); - blockpred[i] = minu(blockpred[i], 6); - } - for(i = 0;i < numchans;i++) - { - delta[i] = *(src++); - delta[i] |= *(src++) << 8; - delta[i] = (delta[i]^0x8000) - 0x8000; - } - for(i = 0;i < numchans;i++) - { - samples[i][0] = *(src++); - samples[i][0] |= *(src++) << 8; - samples[i][0] = (samples[i][0]^0x8000) - 0x8000; - } - for(i = 0;i < numchans;i++) - { - samples[i][1] = *(src++); - samples[i][1] |= *(src++) << 8; - samples[i][1] = (samples[i][1]^0x8000) - 0x8000; - } - - /* Second sample is written first. */ - for(i = 0;i < numchans;i++) - *(dst++) = samples[i][1]; - for(i = 0;i < numchans;i++) - *(dst++) = samples[i][0]; - - for(j = 2;j < align;j++) - { - for(i = 0;i < numchans;i++) - { - const ALint num = (j*numchans) + i; - ALint nibble, pred; - - /* Read the nibble (first is in the upper bits). */ - if(!(num&1)) - nibble = (*src>>4)&0x0f; - else - nibble = (*(src++))&0x0f; - - pred = (samples[i][0]*MSADPCMAdaptionCoeff[blockpred[i]][0] + - samples[i][1]*MSADPCMAdaptionCoeff[blockpred[i]][1]) / 256; - pred += ((nibble^0x08) - 0x08) * delta[i]; - pred = clampi(pred, -32768, 32767); - - samples[i][1] = samples[i][0]; - samples[i][0] = pred; - - delta[i] = (MSADPCMAdaption[nibble] * delta[i]) / 256; - delta[i] = maxi(16, delta[i]); - - *(dst++) = pred; - } - } -} - -/* NOTE: This encoder is pretty dumb/simplistic. Some kind of pre-processing - * that tries to find the optimal block predictors would be nice, at least. A - * multi-pass method that can generate better deltas would be good, too. */ -static void EncodeMSADPCMBlock(ALmsadpcm *dst, const ALshort *src, ALint *sample, ALint numchans, ALsizei align) -{ - ALubyte blockpred[MAX_INPUT_CHANNELS]; - ALint delta[MAX_INPUT_CHANNELS]; - ALshort samples[MAX_INPUT_CHANNELS][2]; - ALint i, j; - - /* Block predictor */ - for(i = 0;i < numchans;i++) - { - /* FIXME: Calculate something better. */ - blockpred[i] = 0; - *(dst++) = blockpred[i]; - } - /* Initial delta */ - for(i = 0;i < numchans;i++) - { - delta[i] = 16; - *(dst++) = (delta[i] ) & 0xff; - *(dst++) = (delta[i]>>8) & 0xff; - } - /* Initial sample 1 */ - for(i = 0;i < numchans;i++) - { - samples[i][0] = src[1*numchans + i]; - *(dst++) = (samples[i][0] ) & 0xff; - *(dst++) = (samples[i][0]>>8) & 0xff; - } - /* Initial sample 2 */ - for(i = 0;i < numchans;i++) - { - samples[i][1] = src[i]; - *(dst++) = (samples[i][1] ) & 0xff; - *(dst++) = (samples[i][1]>>8) & 0xff; - } - - for(j = 2;j < align;j++) - { - for(i = 0;i < numchans;i++) - { - const ALint num = (j*numchans) + i; - ALint nibble = 0; - ALint bias; - - sample[i] = (samples[i][0]*MSADPCMAdaptionCoeff[blockpred[i]][0] + - samples[i][1]*MSADPCMAdaptionCoeff[blockpred[i]][1]) / 256; - - nibble = src[num] - sample[i]; - if(nibble >= 0) - bias = delta[i] / 2; - else - bias = -delta[i] / 2; - - nibble = (nibble + bias) / delta[i]; - nibble = clampi(nibble, -8, 7)&0x0f; - - sample[i] += ((nibble^0x08)-0x08) * delta[i]; - sample[i] = clampi(sample[i], -32768, 32767); - - samples[i][1] = samples[i][0]; - samples[i][0] = sample[i]; - - delta[i] = (MSADPCMAdaption[nibble] * delta[i]) / 256; - delta[i] = maxi(16, delta[i]); - - if(!(num&1)) - *dst = nibble << 4; - else - { - *dst |= nibble; - dst++; - } - } - } -} - - -/* Define same-type pass-through sample conversion functions (excludes ADPCM, - * which are block-based). */ -#define DECL_TEMPLATE(T) \ -static inline T Conv_##T##_##T(T val) { return val; } - -DECL_TEMPLATE(ALbyte); -DECL_TEMPLATE(ALubyte); -DECL_TEMPLATE(ALshort); -DECL_TEMPLATE(ALushort); -DECL_TEMPLATE(ALint); -DECL_TEMPLATE(ALuint); -DECL_TEMPLATE(ALalaw); -DECL_TEMPLATE(ALmulaw); - -/* Slightly special handling for floats and doubles (converts NaN to 0, and - * allows float<->double pass-through). - */ -static inline ALfloat Conv_ALfloat_ALfloat(ALfloat val) -{ return (val==val) ? val : 0.0f; } -static inline ALfloat Conv_ALfloat_ALdouble(ALdouble val) -{ return (val==val) ? (ALfloat)val : 0.0f; } -static inline ALdouble Conv_ALdouble_ALfloat(ALfloat val) -{ return (val==val) ? (ALdouble)val : 0.0; } -static inline ALdouble Conv_ALdouble_ALdouble(ALdouble val) -{ return (val==val) ? val : 0.0; } - -#undef DECL_TEMPLATE - -/* Define alternate-sign functions. */ -#define DECL_TEMPLATE(T1, T2, O) \ -static inline T1 Conv_##T1##_##T2(T2 val) { return (T1)val - O; } \ -static inline T2 Conv_##T2##_##T1(T1 val) { return (T2)val + O; } - -DECL_TEMPLATE(ALbyte, ALubyte, 128); -DECL_TEMPLATE(ALshort, ALushort, 32768); -DECL_TEMPLATE(ALint, ALuint, 2147483648u); - -#undef DECL_TEMPLATE - -/* Define int-type to int-type functions */ -#define DECL_TEMPLATE(T, ST, UT, SH) \ -static inline T Conv_##T##_##ST(ST val){ return val >> SH; } \ -static inline T Conv_##T##_##UT(UT val){ return Conv_##ST##_##UT(val) >> SH; }\ -static inline ST Conv_##ST##_##T(T val){ return val << SH; } \ -static inline UT Conv_##UT##_##T(T val){ return Conv_##UT##_##ST(val << SH); } - -#define DECL_TEMPLATE2(T1, T2, SH) \ -DECL_TEMPLATE(AL##T1, AL##T2, ALu##T2, SH) \ -DECL_TEMPLATE(ALu##T1, ALu##T2, AL##T2, SH) - -DECL_TEMPLATE2(byte, short, 8) -DECL_TEMPLATE2(short, int, 16) -DECL_TEMPLATE2(byte, int, 24) - -#undef DECL_TEMPLATE2 -#undef DECL_TEMPLATE - -/* Define int-type to fp functions */ -#define DECL_TEMPLATE(T, ST, UT, OP) \ -static inline T Conv_##T##_##ST(ST val) { return (T)val * OP; } \ -static inline T Conv_##T##_##UT(UT val) { return (T)Conv_##ST##_##UT(val) * OP; } - -#define DECL_TEMPLATE2(T1, T2, OP) \ -DECL_TEMPLATE(T1, AL##T2, ALu##T2, OP) - -DECL_TEMPLATE2(ALfloat, byte, (1.0f/128.0f)) -DECL_TEMPLATE2(ALdouble, byte, (1.0/128.0)) -DECL_TEMPLATE2(ALfloat, short, (1.0f/32768.0f)) -DECL_TEMPLATE2(ALdouble, short, (1.0/32768.0)) -DECL_TEMPLATE2(ALdouble, int, (1.0/2147483648.0)) - -/* Special handling for int32 to float32, since it would overflow. */ -static inline ALfloat Conv_ALfloat_ALint(ALint val) -{ return (ALfloat)(val>>7) * (1.0f/16777216.0f); } -static inline ALfloat Conv_ALfloat_ALuint(ALuint val) -{ return (ALfloat)(Conv_ALint_ALuint(val)>>7) * (1.0f/16777216.0f); } - -#undef DECL_TEMPLATE2 -#undef DECL_TEMPLATE - -/* Define fp to int-type functions */ -#define DECL_TEMPLATE(FT, T, smin, smax) \ -static inline AL##T Conv_AL##T##_##FT(FT val) \ -{ \ - val *= (FT)smax + 1; \ - if(val >= (FT)smax) return smax; \ - if(val <= (FT)smin) return smin; \ - return (AL##T)val; \ -} \ -static inline ALu##T Conv_ALu##T##_##FT(FT val) \ -{ return Conv_ALu##T##_AL##T(Conv_AL##T##_##FT(val)); } - -DECL_TEMPLATE(ALfloat, byte, -128, 127) -DECL_TEMPLATE(ALdouble, byte, -128, 127) -DECL_TEMPLATE(ALfloat, short, -32768, 32767) -DECL_TEMPLATE(ALdouble, short, -32768, 32767) -DECL_TEMPLATE(ALdouble, int, -2147483647-1, 2147483647) - -/* Special handling for float32 to int32, since it would overflow. */ -static inline ALint Conv_ALint_ALfloat(ALfloat val) -{ - val *= 16777216.0f; - if(val >= 16777215.0f) return 0x7fffff80/*16777215 << 7*/; - if(val <= -16777216.0f) return 0x80000000/*-16777216 << 7*/; - return (ALint)val << 7; -} -static inline ALuint Conv_ALuint_ALfloat(ALfloat val) -{ return Conv_ALuint_ALint(Conv_ALint_ALfloat(val)); } - -#undef DECL_TEMPLATE - -/* Define muLaw and aLaw functions (goes through short functions). */ -#define DECL_TEMPLATE(T) \ -static inline ALmulaw Conv_ALmulaw_##T(T val) \ -{ return EncodeMuLaw(Conv_ALshort_##T(val)); } \ -static inline T Conv_##T##_ALmulaw(ALmulaw val) \ -{ return Conv_##T##_ALshort(DecodeMuLaw(val)); } \ - \ -static inline ALalaw Conv_ALalaw_##T(T val) \ -{ return EncodeALaw(Conv_ALshort_##T(val)); } \ -static inline T Conv_##T##_ALalaw(ALalaw val) \ -{ return Conv_##T##_ALshort(DecodeALaw(val)); } - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) - -#undef DECL_TEMPLATE - -/* Define muLaw <-> aLaw functions. */ -static inline ALalaw Conv_ALalaw_ALmulaw(ALmulaw val) -{ return EncodeALaw(DecodeMuLaw(val)); } -static inline ALmulaw Conv_ALmulaw_ALalaw(ALalaw val) -{ return EncodeMuLaw(DecodeALaw(val)); } - - -#define DECL_TEMPLATE(T1, T2) \ -static void Convert_##T1##_##T2(T1 *dst, const T2 *src, ALuint numchans, \ - ALuint len, ALsizei UNUSED(align)) \ -{ \ - ALuint i, j; \ - for(i = 0;i < len;i++) \ - { \ - for(j = 0;j < numchans;j++) \ - *(dst++) = Conv_##T1##_##T2(*(src++)); \ - } \ -} - -#define DECL_TEMPLATE2(T) \ -DECL_TEMPLATE(T, ALbyte) \ -DECL_TEMPLATE(T, ALubyte) \ -DECL_TEMPLATE(T, ALshort) \ -DECL_TEMPLATE(T, ALushort) \ -DECL_TEMPLATE(T, ALint) \ -DECL_TEMPLATE(T, ALuint) \ -DECL_TEMPLATE(T, ALfloat) \ -DECL_TEMPLATE(T, ALdouble) \ -DECL_TEMPLATE(T, ALmulaw) \ -DECL_TEMPLATE(T, ALalaw) - -DECL_TEMPLATE2(ALbyte) -DECL_TEMPLATE2(ALubyte) -DECL_TEMPLATE2(ALshort) -DECL_TEMPLATE2(ALushort) -DECL_TEMPLATE2(ALint) -DECL_TEMPLATE2(ALuint) -DECL_TEMPLATE2(ALfloat) -DECL_TEMPLATE2(ALdouble) -DECL_TEMPLATE2(ALmulaw) -DECL_TEMPLATE2(ALalaw) - -#undef DECL_TEMPLATE2 -#undef DECL_TEMPLATE - -#define DECL_TEMPLATE(T) \ -static void Convert_##T##_ALima4(T *dst, const ALima4 *src, ALuint numchans, \ - ALuint len, ALuint align) \ -{ \ - ALsizei byte_align = ((align-1)/2 + 4) * numchans; \ - DECL_VLA(ALshort, tmp, align*numchans); \ - ALuint i, j, k; \ - \ - assert(align > 0 && (len%align) == 0); \ - for(i = 0;i < len;i += align) \ - { \ - DecodeIMA4Block(tmp, src, numchans, align); \ - src += byte_align; \ - \ - for(j = 0;j < align;j++) \ - { \ - for(k = 0;k < numchans;k++) \ - *(dst++) = Conv_##T##_ALshort(tmp[j*numchans + k]); \ - } \ - } \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -static void Convert_ALshort_ALima4(ALshort *dst, const ALima4 *src, ALuint numchans, - ALuint len, ALuint align) -{ - ALsizei byte_align = ((align-1)/2 + 4) * numchans; - ALuint i; - - assert(align > 0 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - DecodeIMA4Block(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - -#define DECL_TEMPLATE(T) \ -static void Convert_ALima4_##T(ALima4 *dst, const T *src, ALuint numchans, \ - ALuint len, ALuint align) \ -{ \ - ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \ - ALint index[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \ - ALsizei byte_align = ((align-1)/2 + 4) * numchans; \ - DECL_VLA(ALshort, tmp, align*numchans); \ - ALuint i, j, k; \ - \ - assert(align > 0 && (len%align) == 0); \ - for(i = 0;i < len;i += align) \ - { \ - for(j = 0;j < align;j++) \ - { \ - for(k = 0;k < numchans;k++) \ - tmp[j*numchans + k] = Conv_ALshort_##T(*(src++)); \ - } \ - EncodeIMA4Block(dst, tmp, sample, index, numchans, align); \ - dst += byte_align; \ - } \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -static void Convert_ALima4_ALshort(ALima4 *dst, const ALshort *src, - ALuint numchans, ALuint len, ALuint align) -{ - ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; - ALint index[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; - ALsizei byte_align = ((align-1)/2 + 4) * numchans; - ALuint i; - - assert(align > 0 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - EncodeIMA4Block(dst, src, sample, index, numchans, align); - src += align*numchans; - dst += byte_align; - } -} -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - - -#define DECL_TEMPLATE(T) \ -static void Convert_##T##_ALmsadpcm(T *dst, const ALmsadpcm *src, \ - ALuint numchans, ALuint len, \ - ALuint align) \ -{ \ - ALsizei byte_align = ((align-2)/2 + 7) * numchans; \ - DECL_VLA(ALshort, tmp, align*numchans); \ - ALuint i, j, k; \ - \ - assert(align > 1 && (len%align) == 0); \ - for(i = 0;i < len;i += align) \ - { \ - DecodeMSADPCMBlock(tmp, src, numchans, align); \ - src += byte_align; \ - \ - for(j = 0;j < align;j++) \ - { \ - for(k = 0;k < numchans;k++) \ - *(dst++) = Conv_##T##_ALshort(tmp[j*numchans + k]); \ - } \ - } \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -static void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALmsadpcm *src, - ALuint numchans, ALuint len, - ALuint align) -{ - ALsizei byte_align = ((align-2)/2 + 7) * numchans; - ALuint i; - - assert(align > 1 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - DecodeMSADPCMBlock(dst, src, numchans, align); - src += byte_align; - dst += align*numchans; - } -} -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - -#define DECL_TEMPLATE(T) \ -static void Convert_ALmsadpcm_##T(ALmsadpcm *dst, const T *src, \ - ALuint numchans, ALuint len, ALuint align) \ -{ \ - ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; \ - ALsizei byte_align = ((align-2)/2 + 7) * numchans; \ - DECL_VLA(ALshort, tmp, align*numchans); \ - ALuint i, j, k; \ - \ - assert(align > 1 && (len%align) == 0); \ - for(i = 0;i < len;i += align) \ - { \ - for(j = 0;j < align;j++) \ - { \ - for(k = 0;k < numchans;k++) \ - tmp[j*numchans + k] = Conv_ALshort_##T(*(src++)); \ - } \ - EncodeMSADPCMBlock(dst, tmp, sample, numchans, align); \ - dst += byte_align; \ - } \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -static void Convert_ALmsadpcm_ALshort(ALmsadpcm *dst, const ALshort *src, - ALuint numchans, ALuint len, ALuint align) -{ - ALint sample[MAX_INPUT_CHANNELS] = {0,0,0,0,0,0,0,0}; - ALsizei byte_align = ((align-2)/2 + 7) * numchans; - ALuint i; - - assert(align > 1 && (len%align) == 0); - for(i = 0;i < len;i += align) - { - EncodeMSADPCMBlock(dst, src, sample, numchans, align); - src += align*numchans; - dst += byte_align; - } -} -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) - -#undef DECL_TEMPLATE - -/* NOTE: We don't store compressed samples internally, so these conversions - * should never happen. */ -static void Convert_ALima4_ALima4(ALima4* UNUSED(dst), const ALima4* UNUSED(src), - ALuint UNUSED(numchans), ALuint UNUSED(len), - ALuint UNUSED(align)) -{ - ERR("Unexpected IMA4-to-IMA4 conversion!\n"); -} - -static void Convert_ALmsadpcm_ALmsadpcm(ALmsadpcm* UNUSED(dst), const ALmsadpcm* UNUSED(src), - ALuint UNUSED(numchans), ALuint UNUSED(len), - ALuint UNUSED(align)) -{ - ERR("Unexpected MSADPCM-to-MSADPCM conversion!\n"); -} - -static void Convert_ALmsadpcm_ALima4(ALmsadpcm* UNUSED(dst), const ALima4* UNUSED(src), - ALuint UNUSED(numchans), ALuint UNUSED(len), - ALuint UNUSED(align)) -{ - ERR("Unexpected IMA4-to-MSADPCM conversion!\n"); -} - -static void Convert_ALima4_ALmsadpcm(ALima4* UNUSED(dst), const ALmsadpcm* UNUSED(src), - ALuint UNUSED(numchans), ALuint UNUSED(len), - ALuint UNUSED(align)) -{ - ERR("Unexpected MSADPCM-to-IMA4 conversion!\n"); -} - - -#define DECL_TEMPLATE(T) \ -static void Convert_##T(T *dst, const ALvoid *src, enum UserFmtType srcType, \ - ALsizei numchans, ALsizei len, ALsizei align) \ -{ \ - switch(srcType) \ - { \ - case UserFmtByte: \ - Convert_##T##_ALbyte(dst, src, numchans, len, align); \ - break; \ - case UserFmtUByte: \ - Convert_##T##_ALubyte(dst, src, numchans, len, align); \ - break; \ - case UserFmtShort: \ - Convert_##T##_ALshort(dst, src, numchans, len, align); \ - break; \ - case UserFmtUShort: \ - Convert_##T##_ALushort(dst, src, numchans, len, align); \ - break; \ - case UserFmtInt: \ - Convert_##T##_ALint(dst, src, numchans, len, align); \ - break; \ - case UserFmtUInt: \ - Convert_##T##_ALuint(dst, src, numchans, len, align); \ - break; \ - case UserFmtFloat: \ - Convert_##T##_ALfloat(dst, src, numchans, len, align); \ - break; \ - case UserFmtDouble: \ - Convert_##T##_ALdouble(dst, src, numchans, len, align); \ - break; \ - case UserFmtMulaw: \ - Convert_##T##_ALmulaw(dst, src, numchans, len, align); \ - break; \ - case UserFmtAlaw: \ - Convert_##T##_ALalaw(dst, src, numchans, len, align); \ - break; \ - case UserFmtIMA4: \ - Convert_##T##_ALima4(dst, src, numchans, len, align); \ - break; \ - case UserFmtMSADPCM: \ - Convert_##T##_ALmsadpcm(dst, src, numchans, len, align); \ - break; \ - } \ -} - -DECL_TEMPLATE(ALbyte) -DECL_TEMPLATE(ALubyte) -DECL_TEMPLATE(ALshort) -DECL_TEMPLATE(ALushort) -DECL_TEMPLATE(ALint) -DECL_TEMPLATE(ALuint) -DECL_TEMPLATE(ALfloat) -DECL_TEMPLATE(ALdouble) -DECL_TEMPLATE(ALmulaw) -DECL_TEMPLATE(ALalaw) -DECL_TEMPLATE(ALima4) -DECL_TEMPLATE(ALmsadpcm) - -#undef DECL_TEMPLATE - - -void ConvertData(ALvoid *dst, enum UserFmtType dstType, const ALvoid *src, enum UserFmtType srcType, ALsizei numchans, ALsizei len, ALsizei align) -{ - switch(dstType) - { - case UserFmtByte: - Convert_ALbyte(dst, src, srcType, numchans, len, align); - break; - case UserFmtUByte: - Convert_ALubyte(dst, src, srcType, numchans, len, align); - break; - case UserFmtShort: - Convert_ALshort(dst, src, srcType, numchans, len, align); - break; - case UserFmtUShort: - Convert_ALushort(dst, src, srcType, numchans, len, align); - break; - case UserFmtInt: - Convert_ALint(dst, src, srcType, numchans, len, align); - break; - case UserFmtUInt: - Convert_ALuint(dst, src, srcType, numchans, len, align); - break; - case UserFmtFloat: - Convert_ALfloat(dst, src, srcType, numchans, len, align); - break; - case UserFmtDouble: - Convert_ALdouble(dst, src, srcType, numchans, len, align); - break; - case UserFmtMulaw: - Convert_ALmulaw(dst, src, srcType, numchans, len, align); - break; - case UserFmtAlaw: - Convert_ALalaw(dst, src, srcType, numchans, len, align); - break; - case UserFmtIMA4: - Convert_ALima4(dst, src, srcType, numchans, len, align); - break; - case UserFmtMSADPCM: - Convert_ALmsadpcm(dst, src, srcType, numchans, len, align); - break; - } -} diff --git a/love/src/jni/openal-soft-1.18.2/README b/love/src/jni/openal-soft-1.18.2/README deleted file mode 100644 index a0178ae5..00000000 --- a/love/src/jni/openal-soft-1.18.2/README +++ /dev/null @@ -1,55 +0,0 @@ -Source Install -============== - -To install OpenAL Soft, use your favorite shell to go into the build/ -directory, and run: - -cmake .. - -Assuming configuration went well, you can then build it, typically using GNU -Make (KDevelop, MSVC, and others are possible depending on your system setup -and CMake configuration). - -Please Note: Double check that the appropriate backends were detected. Often, -complaints of no sound, crashing, and missing devices can be solved by making -sure the correct backends are being used. CMake's output will identify which -backends were enabled. - -For most systems, you will likely want to make sure ALSA, OSS, and PulseAudio -were detected (if your target system uses them). For Windows, make sure -DirectSound was detected. - - -Utilities -========= - -The source package comes with an informational utility, openal-info, and is -built by default. It prints out information provided by the ALC and AL sub- -systems, including discovered devices, version information, and extensions. - - -Configuration -============= - -OpenAL Soft can be configured on a per-user and per-system basis. This allows -users and sysadmins to control information provided to applications, as well -as application-agnostic behavior of the library. See alsoftrc.sample for -available settings. - - -Acknowledgements -================ - -Special thanks go to: - -Creative Labs for the original source code this is based off of. - -Christopher Fitzgerald for the current reverb effect implementation, and -helping with the low-pass and HRTF filters. - -Christian Borss for the 3D panning code previous versions used as a base. - -Ben Davis for the idea behind a previous version of the click-removal code. - -Richard Furse for helping with my understanding of Ambisonics that is used by -the various parts of the library. diff --git a/love/src/jni/openal-soft-1.18.2/common/math_defs.h b/love/src/jni/openal-soft-1.18.2/common/math_defs.h deleted file mode 100644 index cbe9091f..00000000 --- a/love/src/jni/openal-soft-1.18.2/common/math_defs.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef AL_MATH_DEFS_H -#define AL_MATH_DEFS_H - -#include -#ifdef HAVE_FLOAT_H -#include -#endif - -#define F_PI (3.14159265358979323846f) -#define F_PI_2 (1.57079632679489661923f) -#define F_TAU (6.28318530717958647692f) - -#ifndef FLT_EPSILON -#define FLT_EPSILON (1.19209290e-07f) -#endif - -#ifndef HUGE_VALF -static const union msvc_inf_hack { - unsigned char b[4]; - float f; -} msvc_inf_union = {{ 0x00, 0x00, 0x80, 0x7F }}; -#define HUGE_VALF (msvc_inf_union.f) -#endif - -#ifndef HAVE_LOG2F -static inline float log2f(float f) -{ - return logf(f) / logf(2.0f); -} -#endif - -#define DEG2RAD(x) ((float)(x) * (F_PI/180.0f)) -#define RAD2DEG(x) ((float)(x) * (180.0f/F_PI)) - -#endif /* AL_MATH_DEFS_H */ diff --git a/love/src/jni/openal-soft-1.18.2/config.h b/love/src/jni/openal-soft-1.18.2/config.h deleted file mode 100644 index d05a7c72..00000000 --- a/love/src/jni/openal-soft-1.18.2/config.h +++ /dev/null @@ -1,207 +0,0 @@ -/* API declaration export attribute */ -#define AL_API __attribute__((visibility("protected"))) -#define ALC_API __attribute__((visibility("protected"))) - -/* Define any available alignment declaration */ -#define ALIGN(x) __attribute__((aligned(x))) - -/* Define a built-in call indicating an aligned data pointer */ -#define ASSUME_ALIGNED(x, y) __builtin_assume_aligned(x, y) - -/* Define if HRTF data is embedded in the library */ -/* #undef ALSOFT_EMBED_HRTF_DATA */ - -/* Define if we have the C11 aligned_alloc function */ -/* #undef HAVE_ALIGNED_ALLOC */ - -/* Define if we have the posix_memalign function */ -/* #undef HAVE_POSIX_MEMALIGN */ - -/* Define if we have the _aligned_malloc function */ -/* #undef HAVE__ALIGNED_MALLOC */ - -/* Define if we have SSE CPU extensions */ -/* #undef HAVE_SSE */ -/* #undef HAVE_SSE2 */ -/* #undef HAVE_SSE3 */ -/* #undef HAVE_SSE4_1 */ - -/* Define if we have ARM Neon CPU extensions */ -/* #undef HAVE_NEON */ - -/* Define if we have the ALSA backend */ -/* #undef HAVE_ALSA */ - -/* Define if we have the OSS backend */ -/* #undef HAVE_OSS */ - -/* Define if we have the Solaris backend */ -/* #undef HAVE_SOLARIS */ - -/* Define if we have the SndIO backend */ -/* #undef HAVE_SNDIO */ - -/* Define if we have the QSA backend */ -/* #undef HAVE_QSA */ - -/* Define if we have the MMDevApi backend */ -/* #undef HAVE_MMDEVAPI */ - -/* Define if we have the DSound backend */ -/* #undef HAVE_DSOUND */ - -/* Define if we have the Windows Multimedia backend */ -/* #undef HAVE_WINMM */ - -/* Define if we have the PortAudio backend */ -/* #undef HAVE_PORTAUDIO */ - -/* Define if we have the PulseAudio backend */ -/* #undef HAVE_PULSEAUDIO */ - -/* Define if we have the JACK backend */ -/* #undef HAVE_JACK */ - -/* Define if we have the CoreAudio backend */ -/* #undef HAVE_COREAUDIO */ - -/* Define if we have the OpenSL backend */ -#define HAVE_OPENSL - -/* Define if we have the Wave Writer backend */ -#define HAVE_WAVE - -/* Define if we have the stat function */ -#define HAVE_STAT - -/* Define if we have the lrintf function */ -#define HAVE_LRINTF - -/* Define if we have the modff function */ -#define HAVE_MODFF - -/* Define if we have the log2f function */ -/* #undef HAVE_LOG2F */ - -/* Define if we have the strtof function */ -/* #undef HAVE_STRTOF */ - -/* Define if we have the strnlen function */ -#define HAVE_STRNLEN - -/* Define if we have the __int64 type */ -/* #undef HAVE___INT64 */ - -/* Define to the size of a long int type */ -#define SIZEOF_LONG 4 - -/* Define to the size of a long long int type */ -#define SIZEOF_LONG_LONG 8 - -/* Define if we have C99 variable-length array support */ -#define HAVE_C99_VLA - -/* Define if we have C99 _Bool support */ -#define HAVE_C99_BOOL - -/* Define if we have C11 _Static_assert support */ -#define HAVE_C11_STATIC_ASSERT - -/* Define if we have C11 _Alignas support */ -#define HAVE_C11_ALIGNAS - -/* Define if we have C11 _Atomic support */ -/* #undef HAVE_C11_ATOMIC */ - -/* Define if we have GCC's destructor attribute */ -#define HAVE_GCC_DESTRUCTOR - -/* Define if we have GCC's format attribute */ -#define HAVE_GCC_FORMAT - -/* Define if we have stdint.h */ -#define HAVE_STDINT_H - -/* Define if we have stdbool.h */ -#define HAVE_STDBOOL_H - -/* Define if we have stdalign.h */ -#define HAVE_STDALIGN_H - -/* Define if we have windows.h */ -/* #undef HAVE_WINDOWS_H */ - -/* Define if we have dlfcn.h */ -#define HAVE_DLFCN_H - -/* Define if we have pthread_np.h */ -/* #undef HAVE_PTHREAD_NP_H */ - -/* Define if we have alloca.h */ -/* #undef HAVE_ALLOCA_H */ - -/* Define if we have malloc.h */ -#define HAVE_MALLOC_H - -/* Define if we have dirent.h */ -#define HAVE_DIRENT_H - -/* Define if we have strings.h */ -#define HAVE_STRINGS_H - -/* Define if we have cpuid.h */ -/* #undef HAVE_CPUID_H */ - -/* Define if we have intrin.h */ -/* #undef HAVE_INTRIN_H */ - -/* Define if we have sys/sysconf.h */ -#define HAVE_SYS_SYSCONF_H - -/* Define if we have guiddef.h */ -/* #undef HAVE_GUIDDEF_H */ - -/* Define if we have initguid.h */ -/* #undef HAVE_INITGUID_H */ - -/* Define if we have ieeefp.h */ -/* #undef HAVE_IEEEFP_H */ - -/* Define if we have float.h */ -#define HAVE_FLOAT_H - -/* Define if we have fenv.h */ -#define HAVE_FENV_H - -/* Define if we have GCC's __get_cpuid() */ -/* #undef HAVE_GCC_GET_CPUID */ - -/* Define if we have the __cpuid() intrinsic */ -/* #undef HAVE_CPUID_INTRINSIC */ - -/* Define if we have _controlfp() */ -/* #undef HAVE__CONTROLFP */ - -/* Define if we have __control87_2() */ -/* #undef HAVE___CONTROL87_2 */ - -/* Define if we have pthread_setschedparam() */ -#define HAVE_PTHREAD_SETSCHEDPARAM - -/* Define if we have pthread_setname_np() */ -#define HAVE_PTHREAD_SETNAME_NP - -/* Define if pthread_setname_np() only accepts one parameter */ -/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */ - -/* Define if pthread_setname_np() accepts three parameters */ -/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */ - -/* Define if we have pthread_set_name_np() */ -/* #undef HAVE_PTHREAD_SET_NAME_NP */ - -/* Define if we have pthread_mutexattr_setkind_np() */ -/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ - -/* Define if we have pthread_mutex_timedlock() */ -/* #undef HAVE_PTHREAD_MUTEX_TIMEDLOCK */ diff --git a/love/src/jni/openal-soft-1.18.2/docs/hrtf.txt b/love/src/jni/openal-soft-1.18.2/docs/hrtf.txt deleted file mode 100644 index 37a329d2..00000000 --- a/love/src/jni/openal-soft-1.18.2/docs/hrtf.txt +++ /dev/null @@ -1,74 +0,0 @@ -HRTF Support -============ - -Starting with OpenAL Soft 1.14, HRTFs can be used to enable enhanced -spatialization for both 3D (mono) and multi-channel sources, when used with -headphones/stereo output. This can be enabled using the 'hrtf' config option. - -For multi-channel sources this creates a virtual speaker effect, making it -sound as if speakers provide a discrete position for each channel around the -listener. For mono sources this provides much more versatility in the perceived -placement of sounds, making it seem as though they are coming from all around, -including above and below the listener, instead of just to the front, back, and -sides. - -The default data set is based on the KEMAR HRTF data provided by MIT, which can -be found at . It's only -available when using 44100hz or 48000hz playback. - - -Custom HRTF Data Sets -===================== - -OpenAL Soft also provides an option to use user-specified data sets, in -addition to or in place of the default set. This allows users to provide their -own data sets, which could be better suited for their heads, or to work with -stereo speakers instead of headphones, or to support more playback sample -rates, for example. - -The file format is specified below. It uses little-endian byte order. - -== -ALchar magic[8] = "MinPHR01"; -ALuint sampleRate; - -ALubyte hrirSize; /* Can be 8 to 128 in steps of 8. */ -ALubyte evCount; /* Can be 5 to 128. */ - -ALubyte azCount[evCount]; /* Each can be 1 to 128. */ - -/* NOTE: hrirCount is the sum of all azCounts */ -ALshort coefficients[hrirCount][hrirSize]; -ALubyte delays[hrirCount]; /* Each can be 0 to 63. */ -== - -The data is described as thus: - -The file first starts with the 8-byte marker, "MinPHR01", to identify it as an -HRTF data set. This is followed by an unsigned 32-bit integer, specifying the -sample rate the data set is designed for (OpenAL Soft will not use it if the -output device's playback rate doesn't match). - -Afterward, an unsigned 8-bit integer specifies how many sample points (or -finite impulse response filter coefficients) make up each HRIR. - -The following unsigned 8-bit integer specifies the number of elevations used -by the data set. The elevations start at the bottom (-90 degrees), and -increment upwards. Following this is an array of unsigned 8-bit integers, one -for each elevation which specifies the number of azimuths (and thus HRIRs) that -make up each elevation. Azimuths start clockwise from the front, constructing -a full circle for the left ear only. The right ear uses the same HRIRs but in -reverse (ie, left = angle, right = 360-angle). - -The actual coefficients follow. Each coefficient is a signed 16-bit sample, -with each HRIR being a consecutive number of sample points. The HRIRs must be -minimum-phase. This allows the use of a smaller filter length, reducing -computation. For reference, the built-in data set uses a 32-point filter while -even the smallest data set provided by MIT used a 128-sample filter (a 4x -reduction by applying minimum-phase reconstruction). Theoretically, one could -further reduce the minimum-phase version down to a 16-point filter with only a -small reduction in quality. - -After the coefficients is an array of unsigned 8-bit delay values, one for -each HRIR. This is the propagation delay (in samples) a signal must wait before -being convolved with the corresponding minimum-phase HRIR filter. diff --git a/love/src/jni/openal-soft-1.18.2/examples/alffplay.cpp b/love/src/jni/openal-soft-1.18.2/examples/alffplay.cpp deleted file mode 100644 index 10c00553..00000000 --- a/love/src/jni/openal-soft-1.18.2/examples/alffplay.cpp +++ /dev/null @@ -1,1570 +0,0 @@ -/* - * An example showing how to play a stream sync'd to video, using ffmpeg. - * - * Requires C++11. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" { -#include "libavcodec/avcodec.h" -#include "libavformat/avformat.h" -#include "libavformat/avio.h" -#include "libavutil/time.h" -#include "libavutil/pixfmt.h" -#include "libavutil/avstring.h" -#include "libavutil/channel_layout.h" -#include "libswscale/swscale.h" -#include "libswresample/swresample.h" -} - -#include "SDL.h" - -#include "AL/alc.h" -#include "AL/al.h" -#include "AL/alext.h" - -namespace -{ - -static const std::string AppName("alffplay"); - -static bool do_direct_out = false; -static bool has_latency_check = false; -static LPALGETSOURCEDVSOFT alGetSourcedvSOFT; - -#define AUDIO_BUFFER_TIME 100 /* In milliseconds, per-buffer */ -#define AUDIO_BUFFER_QUEUE_SIZE 8 /* Number of buffers to queue */ -#define MAX_QUEUE_SIZE (15 * 1024 * 1024) /* Bytes of compressed data to keep queued */ -#define AV_SYNC_THRESHOLD 0.01 -#define AV_NOSYNC_THRESHOLD 10.0 -#define SAMPLE_CORRECTION_MAX_DIFF 0.05 -#define AUDIO_DIFF_AVG_NB 20 -#define VIDEO_PICTURE_QUEUE_SIZE 16 - -enum { - FF_UPDATE_EVENT = SDL_USEREVENT, - FF_REFRESH_EVENT, - FF_MOVIE_DONE_EVENT -}; - -enum { - AV_SYNC_AUDIO_MASTER, - AV_SYNC_VIDEO_MASTER, - AV_SYNC_EXTERNAL_MASTER, - - DEFAULT_AV_SYNC_TYPE = AV_SYNC_EXTERNAL_MASTER -}; - - -struct PacketQueue { - std::deque mPackets; - std::atomic mTotalSize; - std::atomic mFinished; - std::mutex mMutex; - std::condition_variable mCond; - - PacketQueue() : mTotalSize(0), mFinished(false) - { } - ~PacketQueue() - { clear(); } - - int put(const AVPacket *pkt); - int peek(AVPacket *pkt, std::atomic &quit_var); - void pop(); - - void clear(); - void finish(); -}; - - -struct MovieState; - -struct AudioState { - MovieState *mMovie; - - AVStream *mStream; - AVCodecContext *mCodecCtx; - - PacketQueue mQueue; - - /* Used for clock difference average computation */ - struct { - std::atomic Clocks; /* In microseconds */ - double Accum; - double AvgCoeff; - double Threshold; - int AvgCount; - } mDiff; - - /* Time (in seconds) of the next sample to be buffered */ - double mCurrentPts; - - /* Decompressed sample frame, and swresample context for conversion */ - AVFrame *mDecodedFrame; - struct SwrContext *mSwresCtx; - - /* Conversion format, for what gets fed to Alure */ - int mDstChanLayout; - enum AVSampleFormat mDstSampleFmt; - - /* Storage of converted samples */ - uint8_t *mSamples; - int mSamplesLen; /* In samples */ - int mSamplesPos; - int mSamplesMax; - - /* OpenAL format */ - ALenum mFormat; - ALsizei mFrameSize; - - std::recursive_mutex mSrcMutex; - ALuint mSource; - ALuint mBuffers[AUDIO_BUFFER_QUEUE_SIZE]; - ALsizei mBufferIdx; - - AudioState(MovieState *movie) - : mMovie(movie), mStream(nullptr), mCodecCtx(nullptr) - , mDiff{{0}, 0.0, 0.0, 0.0, 0}, mCurrentPts(0.0), mDecodedFrame(nullptr) - , mSwresCtx(nullptr), mDstChanLayout(0), mDstSampleFmt(AV_SAMPLE_FMT_NONE) - , mSamples(nullptr), mSamplesLen(0), mSamplesPos(0), mSamplesMax(0) - , mFormat(AL_NONE), mFrameSize(0), mSource(0), mBufferIdx(0) - { - for(auto &buf : mBuffers) - buf = 0; - } - ~AudioState() - { - if(mSource) - alDeleteSources(1, &mSource); - alDeleteBuffers(AUDIO_BUFFER_QUEUE_SIZE, mBuffers); - - av_frame_free(&mDecodedFrame); - swr_free(&mSwresCtx); - - av_freep(&mSamples); - - avcodec_free_context(&mCodecCtx); - } - - double getClock(); - - int getSync(); - int decodeFrame(); - int readAudio(uint8_t *samples, int length); - - int handler(); -}; - -struct VideoState { - MovieState *mMovie; - - AVStream *mStream; - AVCodecContext *mCodecCtx; - - PacketQueue mQueue; - - double mClock; - double mFrameTimer; - double mFrameLastPts; - double mFrameLastDelay; - double mCurrentPts; - /* time (av_gettime) at which we updated mCurrentPts - used to have running video pts */ - int64_t mCurrentPtsTime; - - /* Decompressed video frame, and swscale context for conversion */ - AVFrame *mDecodedFrame; - struct SwsContext *mSwscaleCtx; - - struct Picture { - SDL_Texture *mImage; - int mWidth, mHeight; /* Logical image size (actual size may be larger) */ - std::atomic mUpdated; - double mPts; - - Picture() - : mImage(nullptr), mWidth(0), mHeight(0), mUpdated(false), mPts(0.0) - { } - ~Picture() - { - if(mImage) - SDL_DestroyTexture(mImage); - mImage = nullptr; - } - }; - std::array mPictQ; - size_t mPictQSize, mPictQRead, mPictQWrite; - std::mutex mPictQMutex; - std::condition_variable mPictQCond; - bool mFirstUpdate; - std::atomic mEOS; - std::atomic mFinalUpdate; - - VideoState(MovieState *movie) - : mMovie(movie), mStream(nullptr), mCodecCtx(nullptr), mClock(0.0) - , mFrameTimer(0.0), mFrameLastPts(0.0), mFrameLastDelay(0.0) - , mCurrentPts(0.0), mCurrentPtsTime(0), mDecodedFrame(nullptr) - , mSwscaleCtx(nullptr), mPictQSize(0), mPictQRead(0), mPictQWrite(0) - , mFirstUpdate(true), mEOS(false), mFinalUpdate(false) - { } - ~VideoState() - { - sws_freeContext(mSwscaleCtx); - mSwscaleCtx = nullptr; - av_frame_free(&mDecodedFrame); - avcodec_free_context(&mCodecCtx); - } - - double getClock(); - - static Uint32 SDLCALL sdl_refresh_timer_cb(Uint32 interval, void *opaque); - void schedRefresh(int delay); - void display(SDL_Window *screen, SDL_Renderer *renderer); - void refreshTimer(SDL_Window *screen, SDL_Renderer *renderer); - void updatePicture(SDL_Window *screen, SDL_Renderer *renderer); - int queuePicture(double pts); - double synchronize(double pts); - int handler(); -}; - -struct MovieState { - AVFormatContext *mFormatCtx; - int mVideoStream, mAudioStream; - - int mAVSyncType; - - int64_t mExternalClockBase; - - std::atomic mQuit; - - AudioState mAudio; - VideoState mVideo; - - std::thread mParseThread; - std::thread mAudioThread; - std::thread mVideoThread; - - std::string mFilename; - - MovieState(std::string fname) - : mFormatCtx(nullptr), mVideoStream(0), mAudioStream(0) - , mAVSyncType(DEFAULT_AV_SYNC_TYPE), mExternalClockBase(0), mQuit(false) - , mAudio(this), mVideo(this), mFilename(std::move(fname)) - { } - ~MovieState() - { - mQuit = true; - if(mParseThread.joinable()) - mParseThread.join(); - avformat_close_input(&mFormatCtx); - } - - static int decode_interrupt_cb(void *ctx); - bool prepare(); - void setTitle(SDL_Window *window); - - double getClock(); - - double getMasterClock(); - - int streamComponentOpen(int stream_index); - int parse_handler(); -}; - - -int PacketQueue::put(const AVPacket *pkt) -{ - std::unique_lock lock(mMutex); - mPackets.push_back(AVPacket{}); - if(av_packet_ref(&mPackets.back(), pkt) != 0) - { - mPackets.pop_back(); - return -1; - } - mTotalSize += mPackets.back().size; - lock.unlock(); - - mCond.notify_one(); - return 0; -} - -int PacketQueue::peek(AVPacket *pkt, std::atomic &quit_var) -{ - std::unique_lock lock(mMutex); - while(!quit_var.load()) - { - if(!mPackets.empty()) - { - if(av_packet_ref(pkt, &mPackets.front()) != 0) - return -1; - return 1; - } - - if(mFinished.load()) - return 0; - mCond.wait(lock); - } - return -1; -} - -void PacketQueue::pop() -{ - std::unique_lock lock(mMutex); - AVPacket *pkt = &mPackets.front(); - mTotalSize -= pkt->size; - av_packet_unref(pkt); - mPackets.pop_front(); -} - -void PacketQueue::clear() -{ - std::unique_lock lock(mMutex); - std::for_each(mPackets.begin(), mPackets.end(), - [](AVPacket &pkt) { av_packet_unref(&pkt); } - ); - mPackets.clear(); - mTotalSize = 0; -} -void PacketQueue::finish() -{ - std::unique_lock lock(mMutex); - mFinished = true; - lock.unlock(); - mCond.notify_all(); -} - - -double AudioState::getClock() -{ - double pts; - - std::unique_lock lock(mSrcMutex); - /* The audio clock is the timestamp of the sample currently being heard. - * It's based on 4 components: - * 1 - The timestamp of the next sample to buffer (state->current_pts) - * 2 - The length of the source's buffer queue - * 3 - The offset OpenAL is currently at in the source (the first value - * from AL_SEC_OFFSET_LATENCY_SOFT) - * 4 - The latency between OpenAL and the DAC (the second value from - * AL_SEC_OFFSET_LATENCY_SOFT) - * - * Subtracting the length of the source queue from the next sample's - * timestamp gives the timestamp of the sample at start of the source - * queue. Adding the source offset to that results in the timestamp for - * OpenAL's current position, and subtracting the source latency from that - * gives the timestamp of the sample currently at the DAC. - */ - pts = mCurrentPts; - if(mSource) - { - ALdouble offset[2]; - ALint queue_size; - ALint status; - - /* NOTE: The source state must be checked last, in case an underrun - * occurs and the source stops between retrieving the offset+latency - * and getting the state. */ - if(has_latency_check) - { - alGetSourcedvSOFT(mSource, AL_SEC_OFFSET_LATENCY_SOFT, offset); - alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queue_size); - } - else - { - ALint ioffset; - alGetSourcei(mSource, AL_SAMPLE_OFFSET, &ioffset); - alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queue_size); - offset[0] = (double)ioffset / (double)mCodecCtx->sample_rate; - offset[1] = 0.0f; - } - alGetSourcei(mSource, AL_SOURCE_STATE, &status); - - /* If the source is AL_STOPPED, then there was an underrun and all - * buffers are processed, so ignore the source queue. The audio thread - * will put the source into an AL_INITIAL state and clear the queue - * when it starts recovery. */ - if(status != AL_STOPPED) - pts -= queue_size*((double)AUDIO_BUFFER_TIME/1000.0) - offset[0]; - if(status == AL_PLAYING) - pts -= offset[1]; - } - lock.unlock(); - - return std::max(pts, 0.0); -} - -int AudioState::getSync() -{ - double diff, avg_diff, ref_clock; - - if(mMovie->mAVSyncType == AV_SYNC_AUDIO_MASTER) - return 0; - - ref_clock = mMovie->getMasterClock(); - diff = ref_clock - getClock(); - - if(!(fabs(diff) < AV_NOSYNC_THRESHOLD)) - { - /* Difference is TOO big; reset diff stuff */ - mDiff.Accum = 0.0; - return 0; - } - - /* Accumulate the diffs */ - mDiff.Accum = mDiff.Accum*mDiff.AvgCoeff + diff; - avg_diff = mDiff.Accum*(1.0 - mDiff.AvgCoeff); - if(fabs(avg_diff) < mDiff.Threshold) - return 0; - - /* Constrain the per-update difference to avoid exceedingly large skips */ - if(!(diff <= SAMPLE_CORRECTION_MAX_DIFF)) - diff = SAMPLE_CORRECTION_MAX_DIFF; - else if(!(diff >= -SAMPLE_CORRECTION_MAX_DIFF)) - diff = -SAMPLE_CORRECTION_MAX_DIFF; - return (int)(diff*mCodecCtx->sample_rate); -} - -int AudioState::decodeFrame() -{ - while(!mMovie->mQuit.load()) - { - while(!mMovie->mQuit.load()) - { - /* Get the next packet */ - AVPacket pkt{}; - if(mQueue.peek(&pkt, mMovie->mQuit) <= 0) - return -1; - - int ret = avcodec_send_packet(mCodecCtx, &pkt); - if(ret != AVERROR(EAGAIN)) - { - if(ret < 0) - std::cerr<< "Failed to send encoded packet: 0x"<nb_samples <= 0) - { - av_frame_unref(mDecodedFrame); - continue; - } - - /* If provided, update w/ pts */ - int64_t pts = av_frame_get_best_effort_timestamp(mDecodedFrame); - if(pts != AV_NOPTS_VALUE) - mCurrentPts = av_q2d(mStream->time_base)*pts; - - if(mDecodedFrame->nb_samples > mSamplesMax) - { - av_freep(&mSamples); - av_samples_alloc( - &mSamples, nullptr, mCodecCtx->channels, - mDecodedFrame->nb_samples, mDstSampleFmt, 0 - ); - mSamplesMax = mDecodedFrame->nb_samples; - } - /* Return the amount of sample frames converted */ - int data_size = swr_convert(mSwresCtx, &mSamples, mDecodedFrame->nb_samples, - (const uint8_t**)mDecodedFrame->data, mDecodedFrame->nb_samples - ); - - av_frame_unref(mDecodedFrame); - return data_size; - } - - return 0; -} - -/* Duplicates the sample at in to out, count times. The frame size is a - * multiple of the template type size. - */ -template -static void sample_dup(uint8_t *out, const uint8_t *in, int count, int frame_size) -{ - const T *sample = reinterpret_cast(in); - T *dst = reinterpret_cast(out); - if(frame_size == sizeof(T)) - std::fill_n(dst, count, *sample); - else - { - /* NOTE: frame_size is a multiple of sizeof(T). */ - int type_mult = frame_size / sizeof(T); - int i = 0; - std::generate_n(dst, count*type_mult, - [sample,type_mult,&i]() -> T - { - T ret = sample[i]; - i = (i+1)%type_mult; - return ret; - } - ); - } -} - - -int AudioState::readAudio(uint8_t *samples, int length) -{ - int sample_skip = getSync(); - int audio_size = 0; - - /* Read the next chunk of data, refill the buffer, and queue it - * on the source */ - length /= mFrameSize; - while(audio_size < length) - { - if(mSamplesLen <= 0 || mSamplesPos >= mSamplesLen) - { - int frame_len = decodeFrame(); - if(frame_len <= 0) break; - - mSamplesLen = frame_len; - mSamplesPos = std::min(mSamplesLen, sample_skip); - sample_skip -= mSamplesPos; - - mCurrentPts += (double)mSamplesPos / (double)mCodecCtx->sample_rate; - continue; - } - - int rem = length - audio_size; - if(mSamplesPos >= 0) - { - int len = mSamplesLen - mSamplesPos; - if(rem > len) rem = len; - memcpy(samples, mSamples + mSamplesPos*mFrameSize, rem*mFrameSize); - } - else - { - rem = std::min(rem, -mSamplesPos); - - /* Add samples by copying the first sample */ - if((mFrameSize&7) == 0) - sample_dup(samples, mSamples, rem, mFrameSize); - else if((mFrameSize&3) == 0) - sample_dup(samples, mSamples, rem, mFrameSize); - else if((mFrameSize&1) == 0) - sample_dup(samples, mSamples, rem, mFrameSize); - else - sample_dup(samples, mSamples, rem, mFrameSize); - } - - mSamplesPos += rem; - mCurrentPts += (double)rem / mCodecCtx->sample_rate; - samples += rem*mFrameSize; - audio_size += rem; - } - - if(audio_size < length && audio_size > 0) - { - int rem = length - audio_size; - std::fill_n(samples, rem*mFrameSize, - (mDstSampleFmt == AV_SAMPLE_FMT_U8) ? 0x80 : 0x00); - mCurrentPts += (double)rem / mCodecCtx->sample_rate; - audio_size += rem; - } - - return audio_size * mFrameSize; -} - - -int AudioState::handler() -{ - std::unique_lock lock(mSrcMutex); - ALenum fmt; - - /* Find a suitable format for Alure. */ - mDstChanLayout = 0; - if(mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8 || mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8P) - { - mDstSampleFmt = AV_SAMPLE_FMT_U8; - mFrameSize = 1; - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_71CHN8")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 8; - mFormat = fmt; - } - if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || - mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_51CHN8")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 6; - mFormat = fmt; - } - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 1; - mFormat = AL_FORMAT_MONO8; - } - if(!mDstChanLayout) - { - mDstChanLayout = AV_CH_LAYOUT_STEREO; - mFrameSize *= 2; - mFormat = AL_FORMAT_STEREO8; - } - } - if((mCodecCtx->sample_fmt == AV_SAMPLE_FMT_FLT || mCodecCtx->sample_fmt == AV_SAMPLE_FMT_FLTP) && - alIsExtensionPresent("AL_EXT_FLOAT32")) - { - mDstSampleFmt = AV_SAMPLE_FMT_FLT; - mFrameSize = 4; - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_71CHN32")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 8; - mFormat = fmt; - } - if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || - mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_51CHN32")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 6; - mFormat = fmt; - } - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 1; - mFormat = AL_FORMAT_MONO_FLOAT32; - } - if(!mDstChanLayout) - { - mDstChanLayout = AV_CH_LAYOUT_STEREO; - mFrameSize *= 2; - mFormat = AL_FORMAT_STEREO_FLOAT32; - } - } - if(!mDstChanLayout) - { - mDstSampleFmt = AV_SAMPLE_FMT_S16; - mFrameSize = 2; - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_71CHN16")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 8; - mFormat = fmt; - } - if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || - mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && - alIsExtensionPresent("AL_EXT_MCFORMATS") && - (fmt=alGetEnumValue("AL_FORMAT_51CHN16")) != AL_NONE && fmt != -1) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 6; - mFormat = fmt; - } - if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) - { - mDstChanLayout = mCodecCtx->channel_layout; - mFrameSize *= 1; - mFormat = AL_FORMAT_MONO16; - } - if(!mDstChanLayout) - { - mDstChanLayout = AV_CH_LAYOUT_STEREO; - mFrameSize *= 2; - mFormat = AL_FORMAT_STEREO16; - } - } - ALsizei buffer_len = mCodecCtx->sample_rate * AUDIO_BUFFER_TIME / 1000 * - mFrameSize; - void *samples = av_malloc(buffer_len); - - mSamples = NULL; - mSamplesMax = 0; - mSamplesPos = 0; - mSamplesLen = 0; - - if(!(mDecodedFrame=av_frame_alloc())) - { - std::cerr<< "Failed to allocate audio frame" <sample_rate, - mCodecCtx->channel_layout ? mCodecCtx->channel_layout : - (uint64_t)av_get_default_channel_layout(mCodecCtx->channels), - mCodecCtx->sample_fmt, mCodecCtx->sample_rate, - 0, nullptr - ); - if(!mSwresCtx || swr_init(mSwresCtx) != 0) - { - std::cerr<< "Failed to initialize audio converter" <mQuit.load()) - { - /* First remove any processed buffers. */ - ALint processed; - alGetSourcei(mSource, AL_BUFFERS_PROCESSED, &processed); - if(processed > 0) - { - std::array tmp; - alSourceUnqueueBuffers(mSource, processed, tmp.data()); - } - - /* Refill the buffer queue. */ - ALint queued; - alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued); - while(queued < AUDIO_BUFFER_QUEUE_SIZE) - { - int audio_size; - - /* Read the next chunk of data, fill the buffer, and queue it on - * the source */ - audio_size = readAudio(reinterpret_cast(samples), buffer_len); - if(audio_size <= 0) break; - - ALuint bufid = mBuffers[mBufferIdx++]; - mBufferIdx %= AUDIO_BUFFER_QUEUE_SIZE; - - alBufferData(bufid, mFormat, samples, audio_size, mCodecCtx->sample_rate); - alSourceQueueBuffers(mSource, 1, &bufid); - queued++; - } - if(queued == 0) - break; - - /* Check that the source is playing. */ - ALint state; - alGetSourcei(mSource, AL_SOURCE_STATE, &state); - if(state == AL_STOPPED) - { - /* AL_STOPPED means there was an underrun. Rewind the source to get - * it back into an AL_INITIAL state. - */ - alSourceRewind(mSource); - continue; - } - - lock.unlock(); - - /* (re)start the source if needed, and wait for a buffer to finish */ - if(state != AL_PLAYING && state != AL_PAUSED) - alSourcePlay(mSource); - SDL_Delay(AUDIO_BUFFER_TIME / 3); - - lock.lock(); - } - -finish: - alSourceRewind(mSource); - alSourcei(mSource, AL_BUFFER, 0); - - av_frame_free(&mDecodedFrame); - swr_free(&mSwresCtx); - - av_freep(&mSamples); - - return 0; -} - - -double VideoState::getClock() -{ - double delta = (av_gettime() - mCurrentPtsTime) / 1000000.0; - return mCurrentPts + delta; -} - -Uint32 SDLCALL VideoState::sdl_refresh_timer_cb(Uint32 /*interval*/, void *opaque) -{ - SDL_Event evt{}; - evt.user.type = FF_REFRESH_EVENT; - evt.user.data1 = opaque; - SDL_PushEvent(&evt); - return 0; /* 0 means stop timer */ -} - -/* Schedules an FF_REFRESH_EVENT event to occur in 'delay' ms. */ -void VideoState::schedRefresh(int delay) -{ - SDL_AddTimer(delay, sdl_refresh_timer_cb, this); -} - -/* Called by VideoState::refreshTimer to display the next video frame. */ -void VideoState::display(SDL_Window *screen, SDL_Renderer *renderer) -{ - Picture *vp = &mPictQ[mPictQRead]; - - if(!vp->mImage) - return; - - float aspect_ratio; - int win_w, win_h; - int w, h, x, y; - - if(mCodecCtx->sample_aspect_ratio.num == 0) - aspect_ratio = 0.0f; - else - { - aspect_ratio = av_q2d(mCodecCtx->sample_aspect_ratio) * mCodecCtx->width / - mCodecCtx->height; - } - if(aspect_ratio <= 0.0f) - aspect_ratio = (float)mCodecCtx->width / (float)mCodecCtx->height; - - SDL_GetWindowSize(screen, &win_w, &win_h); - h = win_h; - w = ((int)rint(h * aspect_ratio) + 3) & ~3; - if(w > win_w) - { - w = win_w; - h = ((int)rint(w / aspect_ratio) + 3) & ~3; - } - x = (win_w - w) / 2; - y = (win_h - h) / 2; - - SDL_Rect src_rect{ 0, 0, vp->mWidth, vp->mHeight }; - SDL_Rect dst_rect{ x, y, w, h }; - SDL_RenderCopy(renderer, vp->mImage, &src_rect, &dst_rect); - SDL_RenderPresent(renderer); -} - -/* FF_REFRESH_EVENT handler called on the main thread where the SDL_Renderer - * was created. It handles the display of the next decoded video frame (if not - * falling behind), and sets up the timer for the following video frame. - */ -void VideoState::refreshTimer(SDL_Window *screen, SDL_Renderer *renderer) -{ - if(!mStream) - { - if(mEOS) - { - mFinalUpdate = true; - std::unique_lock(mPictQMutex).unlock(); - mPictQCond.notify_all(); - return; - } - schedRefresh(100); - return; - } - - std::unique_lock lock(mPictQMutex); -retry: - if(mPictQSize == 0) - { - if(mEOS) - mFinalUpdate = true; - else - schedRefresh(1); - lock.unlock(); - mPictQCond.notify_all(); - return; - } - - Picture *vp = &mPictQ[mPictQRead]; - mCurrentPts = vp->mPts; - mCurrentPtsTime = av_gettime(); - - /* Get delay using the frame pts and the pts from last frame. */ - double delay = vp->mPts - mFrameLastPts; - if(delay <= 0 || delay >= 1.0) - { - /* If incorrect delay, use previous one. */ - delay = mFrameLastDelay; - } - /* Save for next frame. */ - mFrameLastDelay = delay; - mFrameLastPts = vp->mPts; - - /* Update delay to sync to clock if not master source. */ - if(mMovie->mAVSyncType != AV_SYNC_VIDEO_MASTER) - { - double ref_clock = mMovie->getMasterClock(); - double diff = vp->mPts - ref_clock; - - /* Skip or repeat the frame. Take delay into account. */ - double sync_threshold = std::min(delay, AV_SYNC_THRESHOLD); - if(fabs(diff) < AV_NOSYNC_THRESHOLD) - { - if(diff <= -sync_threshold) - delay = 0; - else if(diff >= sync_threshold) - delay *= 2.0; - } - } - - mFrameTimer += delay; - /* Compute the REAL delay. */ - double actual_delay = mFrameTimer - (av_gettime() / 1000000.0); - if(!(actual_delay >= 0.010)) - { - /* We don't have time to handle this picture, just skip to the next one. */ - mPictQRead = (mPictQRead+1)%mPictQ.size(); - mPictQSize--; - goto retry; - } - schedRefresh((int)(actual_delay*1000.0 + 0.5)); - - /* Show the picture! */ - display(screen, renderer); - - /* Update queue for next picture. */ - mPictQRead = (mPictQRead+1)%mPictQ.size(); - mPictQSize--; - lock.unlock(); - mPictQCond.notify_all(); -} - -/* FF_UPDATE_EVENT handler, updates the picture's texture. It's called on the - * main thread where the renderer was created. - */ -void VideoState::updatePicture(SDL_Window *screen, SDL_Renderer *renderer) -{ - Picture *vp = &mPictQ[mPictQWrite]; - bool fmt_updated = false; - - /* allocate or resize the buffer! */ - if(!vp->mImage || vp->mWidth != mCodecCtx->width || vp->mHeight != mCodecCtx->height) - { - fmt_updated = true; - if(vp->mImage) - SDL_DestroyTexture(vp->mImage); - vp->mImage = SDL_CreateTexture( - renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, - mCodecCtx->coded_width, mCodecCtx->coded_height - ); - if(!vp->mImage) - std::cerr<< "Failed to create YV12 texture!" <mWidth = mCodecCtx->width; - vp->mHeight = mCodecCtx->height; - - if(mFirstUpdate && vp->mWidth > 0 && vp->mHeight > 0) - { - /* For the first update, set the window size to the video size. */ - mFirstUpdate = false; - - int w = vp->mWidth; - int h = vp->mHeight; - if(mCodecCtx->sample_aspect_ratio.den != 0) - { - double aspect_ratio = av_q2d(mCodecCtx->sample_aspect_ratio); - if(aspect_ratio >= 1.0) - w = (int)(w*aspect_ratio + 0.5); - else if(aspect_ratio > 0.0) - h = (int)(h/aspect_ratio + 0.5); - } - SDL_SetWindowSize(screen, w, h); - } - } - - if(vp->mImage) - { - AVFrame *frame = mDecodedFrame; - void *pixels = nullptr; - int pitch = 0; - - if(mCodecCtx->pix_fmt == AV_PIX_FMT_YUV420P) - SDL_UpdateYUVTexture(vp->mImage, nullptr, - frame->data[0], frame->linesize[0], - frame->data[1], frame->linesize[1], - frame->data[2], frame->linesize[2] - ); - else if(SDL_LockTexture(vp->mImage, nullptr, &pixels, &pitch) != 0) - std::cerr<< "Failed to lock texture" <coded_width; - int coded_h = mCodecCtx->coded_height; - int w = mCodecCtx->width; - int h = mCodecCtx->height; - if(!mSwscaleCtx || fmt_updated) - { - sws_freeContext(mSwscaleCtx); - mSwscaleCtx = sws_getContext( - w, h, mCodecCtx->pix_fmt, - w, h, AV_PIX_FMT_YUV420P, 0, - nullptr, nullptr, nullptr - ); - } - - /* point pict at the queue */ - uint8_t *pict_data[3]; - pict_data[0] = reinterpret_cast(pixels); - pict_data[1] = pict_data[0] + coded_w*coded_h; - pict_data[2] = pict_data[1] + coded_w*coded_h/4; - - int pict_linesize[3]; - pict_linesize[0] = pitch; - pict_linesize[1] = pitch / 2; - pict_linesize[2] = pitch / 2; - - sws_scale(mSwscaleCtx, (const uint8_t**)frame->data, - frame->linesize, 0, h, pict_data, pict_linesize); - SDL_UnlockTexture(vp->mImage); - } - } - - std::unique_lock lock(mPictQMutex); - vp->mUpdated = true; - lock.unlock(); - mPictQCond.notify_one(); -} - -int VideoState::queuePicture(double pts) -{ - /* Wait until we have space for a new pic */ - std::unique_lock lock(mPictQMutex); - while(mPictQSize >= mPictQ.size() && !mMovie->mQuit.load()) - mPictQCond.wait(lock); - lock.unlock(); - - if(mMovie->mQuit.load()) - return -1; - - Picture *vp = &mPictQ[mPictQWrite]; - - /* We have to create/update the picture in the main thread */ - vp->mUpdated = false; - SDL_Event evt{}; - evt.user.type = FF_UPDATE_EVENT; - evt.user.data1 = this; - SDL_PushEvent(&evt); - - /* Wait until the picture is updated. */ - lock.lock(); - while(!vp->mUpdated && !mMovie->mQuit.load()) - mPictQCond.wait(lock); - if(mMovie->mQuit.load()) - return -1; - vp->mPts = pts; - - mPictQWrite = (mPictQWrite+1)%mPictQ.size(); - mPictQSize++; - lock.unlock(); - - return 0; -} - -double VideoState::synchronize(double pts) -{ - double frame_delay; - - if(pts == 0.0) /* if we aren't given a pts, set it to the clock */ - pts = mClock; - else /* if we have pts, set video clock to it */ - mClock = pts; - - /* update the video clock */ - frame_delay = av_q2d(mCodecCtx->time_base); - /* if we are repeating a frame, adjust clock accordingly */ - frame_delay += mDecodedFrame->repeat_pict * (frame_delay * 0.5); - mClock += frame_delay; - return pts; -} - -int VideoState::handler() -{ - mDecodedFrame = av_frame_alloc(); - while(!mMovie->mQuit) - { - while(!mMovie->mQuit) - { - AVPacket packet{}; - if(mQueue.peek(&packet, mMovie->mQuit) <= 0) - goto finish; - - int ret = avcodec_send_packet(mCodecCtx, &packet); - if(ret != AVERROR(EAGAIN)) - { - if(ret < 0) - std::cerr<< "Failed to send encoded packet: 0x"<time_base) * av_frame_get_best_effort_timestamp(mDecodedFrame) - ); - if(queuePicture(pts) < 0) - break; - av_frame_unref(mDecodedFrame); - } -finish: - mEOS = true; - av_frame_free(&mDecodedFrame); - - std::unique_lock lock(mPictQMutex); - if(mMovie->mQuit) - { - mPictQRead = 0; - mPictQWrite = 0; - mPictQSize = 0; - } - while(!mFinalUpdate) - mPictQCond.wait(lock); - - return 0; -} - - -int MovieState::decode_interrupt_cb(void *ctx) -{ - return reinterpret_cast(ctx)->mQuit; -} - -bool MovieState::prepare() -{ - mFormatCtx = avformat_alloc_context(); - mFormatCtx->interrupt_callback.callback = decode_interrupt_cb; - mFormatCtx->interrupt_callback.opaque = this; - if(avio_open2(&mFormatCtx->pb, mFilename.c_str(), AVIO_FLAG_READ, - &mFormatCtx->interrupt_callback, nullptr)) - { - std::cerr<< "Failed to open "<= mFormatCtx->nb_streams) - return -1; - - /* Get a pointer to the codec context for the stream, and open the - * associated codec. - */ - AVCodecContext *avctx = avcodec_alloc_context3(nullptr); - if(!avctx) return -1; - - if(avcodec_parameters_to_context(avctx, mFormatCtx->streams[stream_index]->codecpar)) - { - avcodec_free_context(&avctx); - return -1; - } - - AVCodec *codec = avcodec_find_decoder(avctx->codec_id); - if(!codec || avcodec_open2(avctx, codec, nullptr) < 0) - { - std::cerr<< "Unsupported codec: "<codec_id) - << " (0x"<codec_id<codec_type) - { - case AVMEDIA_TYPE_AUDIO: - mAudioStream = stream_index; - mAudio.mStream = mFormatCtx->streams[stream_index]; - mAudio.mCodecCtx = avctx; - - /* Averaging filter for audio sync */ - mAudio.mDiff.AvgCoeff = exp(log(0.01) / AUDIO_DIFF_AVG_NB); - /* Correct audio only if larger error than this */ - mAudio.mDiff.Threshold = 0.050/* 50 ms */; - - mAudioThread = std::thread(std::mem_fn(&AudioState::handler), &mAudio); - break; - - case AVMEDIA_TYPE_VIDEO: - mVideoStream = stream_index; - mVideo.mStream = mFormatCtx->streams[stream_index]; - mVideo.mCodecCtx = avctx; - - mVideo.mCurrentPtsTime = av_gettime(); - mVideo.mFrameTimer = (double)mVideo.mCurrentPtsTime / 1000000.0; - mVideo.mFrameLastDelay = 40e-3; - - mVideoThread = std::thread(std::mem_fn(&VideoState::handler), &mVideo); - break; - - default: - avcodec_free_context(&avctx); - break; - } - - return 0; -} - -int MovieState::parse_handler() -{ - int video_index = -1; - int audio_index = -1; - - mVideoStream = -1; - mAudioStream = -1; - - /* Dump information about file onto standard error */ - av_dump_format(mFormatCtx, 0, mFilename.c_str(), 0); - - /* Find the first video and audio streams */ - for(unsigned int i = 0;i < mFormatCtx->nb_streams;i++) - { - if(mFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && video_index < 0) - video_index = i; - else if(mFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_index < 0) - audio_index = i; - } - /* Start the external clock in 50ms, to give the audio and video - * components time to start without needing to skip ahead. - */ - mExternalClockBase = av_gettime() + 50000; - if(audio_index >= 0) - streamComponentOpen(audio_index); - if(video_index >= 0) - streamComponentOpen(video_index); - - if(mVideoStream < 0 && mAudioStream < 0) - { - std::cerr<< mFilename<<": could not open codecs" <= MAX_QUEUE_SIZE) - { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - continue; - } - - AVPacket packet; - if(av_read_frame(mFormatCtx, &packet) < 0) - break; - - /* Copy the packet in the queue it's meant for. */ - if(packet.stream_index == mVideoStream) - mVideo.mQueue.put(&packet); - else if(packet.stream_index == mAudioStream) - mAudio.mQueue.put(&packet); - av_packet_unref(&packet); - } - mVideo.mQueue.finish(); - mAudio.mQueue.finish(); - - /* all done - wait for it */ - if(mVideoThread.joinable()) - mVideoThread.join(); - if(mAudioThread.joinable()) - mAudioThread.join(); - - mVideo.mEOS = true; - std::unique_lock lock(mVideo.mPictQMutex); - while(!mVideo.mFinalUpdate) - mVideo.mPictQCond.wait(lock); - lock.unlock(); - - SDL_Event evt{}; - evt.user.type = FF_MOVIE_DONE_EVENT; - SDL_PushEvent(&evt); - - return 0; -} - -} // namespace - - -int main(int argc, char *argv[]) -{ - std::unique_ptr movState; - - if(argc < 2) - { - std::cerr<< "Usage: "<] [-direct] " < ALCdevice* - { - ALCdevice *dev = NULL; - if(argc > 3 && strcmp(argv[1], "-device") == 0) - { - fileidx = 3; - dev = alcOpenDevice(argv[2]); - if(dev) return dev; - std::cerr<< "Failed to open \""<(new MovieState(argv[fileidx++])); - if(!movState->prepare()) movState = nullptr; - } - if(!movState) - { - std::cerr<< "Could not start a video" <setTitle(screen); - - /* Default to going to the next movie at the end of one. */ - enum class EomAction { - Next, Quit - } eom_action = EomAction::Next; - SDL_Event event; - while(SDL_WaitEvent(&event) == 1) - { - switch(event.type) - { - case SDL_KEYDOWN: - switch(event.key.keysym.sym) - { - case SDLK_ESCAPE: - movState->mQuit = true; - eom_action = EomAction::Quit; - break; - - case SDLK_n: - movState->mQuit = true; - eom_action = EomAction::Next; - break; - - default: - break; - } - break; - - case SDL_WINDOWEVENT: - switch(event.window.event) - { - case SDL_WINDOWEVENT_RESIZED: - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); - SDL_RenderFillRect(renderer, nullptr); - break; - - default: - break; - } - break; - - case SDL_QUIT: - movState->mQuit = true; - eom_action = EomAction::Quit; - break; - - case FF_UPDATE_EVENT: - reinterpret_cast(event.user.data1)->updatePicture( - screen, renderer - ); - break; - - case FF_REFRESH_EVENT: - reinterpret_cast(event.user.data1)->refreshTimer( - screen, renderer - ); - break; - - case FF_MOVIE_DONE_EVENT: - if(eom_action != EomAction::Quit) - { - movState = nullptr; - while(fileidx < argc && !movState) - { - movState = std::unique_ptr(new MovieState(argv[fileidx++])); - if(!movState->prepare()) movState = nullptr; - } - if(movState) - { - movState->setTitle(screen); - break; - } - } - - /* Nothing more to play. Shut everything down and quit. */ - movState = nullptr; - - alcMakeContextCurrent(nullptr); - alcDestroyContext(context); - alcCloseDevice(device); - - SDL_DestroyRenderer(renderer); - renderer = nullptr; - SDL_DestroyWindow(screen); - screen = nullptr; - - SDL_Quit(); - exit(0); - - default: - break; - } - } - - std::cerr<< "SDL_WaitEvent error - "< if [[ "${TRAVIS_OS_NAME}" == "linux" && -z "${BUILD_ANDROID}" ]]; then @@ -27,18 +24,17 @@ install: fi - > if [[ "${TRAVIS_OS_NAME}" == "linux" && "${BUILD_ANDROID}" == "true" ]]; then - if [[ ! -d ~/android-ndk-r14 || -z "$(ls -A ~/android-ndk-r14)" ]]; then - curl -o ~/android-ndk.zip https://dl.google.com/android/repository/android-ndk-r14-linux-x86_64.zip - unzip -q ~/android-ndk.zip -d ~ \ - 'android-ndk-r14/build/cmake/*' \ - 'android-ndk-r14/platforms/android-9/arch-arm/*' \ - 'android-ndk-r14/source.properties' \ - 'android-ndk-r14/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/*' \ - 'android-ndk-r14/sysroot/*' \ - 'android-ndk-r14/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/*' \ - 'android-ndk-r14/toolchains/llvm/prebuilt/linux-x86_64/*' - sed -i -e 's/VERSION 3.6.0/VERSION 3.2/' ~/android-ndk-r14/build/cmake/android.toolchain.cmake - fi + curl -o ~/android-ndk.zip https://dl.google.com/android/repository/android-ndk-r15-linux-x86_64.zip + unzip -q ~/android-ndk.zip -d ~ \ + 'android-ndk-r15/build/cmake/*' \ + 'android-ndk-r15/build/core/toolchains/arm-linux-androideabi-*/*' \ + 'android-ndk-r15/platforms/android-14/arch-arm/*' \ + 'android-ndk-r15/source.properties' \ + 'android-ndk-r15/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/*' \ + 'android-ndk-r15/sources/cxx-stl/gnu-libstdc++/4.9/include/*' \ + 'android-ndk-r15/sysroot/*' \ + 'android-ndk-r15/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/*' \ + 'android-ndk-r15/toolchains/llvm/prebuilt/linux-x86_64/*' fi script: - > @@ -55,7 +51,7 @@ script: - > if [[ "${TRAVIS_OS_NAME}" == "linux" && "${BUILD_ANDROID}" == "true" ]]; then cmake \ - -DCMAKE_TOOLCHAIN_FILE=~/android-ndk-r14/build/cmake/android.toolchain.cmake \ + -DCMAKE_TOOLCHAIN_FILE=~/android-ndk-r15/build/cmake/android.toolchain.cmake \ -DALSOFT_REQUIRE_OPENSL=ON \ -DALSOFT_EMBED_HRTF_DATA=YES \ . diff --git a/love/src/jni/openal-soft-1.18.2/Alc/ALc.c b/love/src/jni/openal-soft-1.19.1/Alc/ALc.c similarity index 85% rename from love/src/jni/openal-soft-1.18.2/Alc/ALc.c rename to love/src/jni/openal-soft-1.19.1/Alc/ALc.c index 8c032ddf..8bf2e1da 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/ALc.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/ALc.c @@ -32,14 +32,20 @@ #include "alMain.h" #include "alSource.h" #include "alListener.h" -#include "alThunk.h" #include "alSource.h" #include "alBuffer.h" +#include "alFilter.h" +#include "alEffect.h" #include "alAuxEffectSlot.h" #include "alError.h" +#include "mastering.h" #include "bformatdec.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" +#include "fpu_modes.h" +#include "cpu_caps.h" #include "compat.h" #include "threads.h" #include "alstring.h" @@ -69,20 +75,20 @@ static struct BackendInfo BackendList[] = { #ifdef HAVE_COREAUDIO { "core", ALCcoreAudioBackendFactory_getFactory }, #endif -#ifdef HAVE_OSS - { "oss", ALCossBackendFactory_getFactory }, -#endif #ifdef HAVE_SOLARIS { "solaris", ALCsolarisBackendFactory_getFactory }, #endif #ifdef HAVE_SNDIO - { "sndio", ALCsndioBackendFactory_getFactory }, + { "sndio", SndioBackendFactory_getFactory }, +#endif +#ifdef HAVE_OSS + { "oss", ALCossBackendFactory_getFactory }, #endif #ifdef HAVE_QSA { "qsa", ALCqsaBackendFactory_getFactory }, #endif -#ifdef HAVE_MMDEVAPI - { "mmdevapi", ALCmmdevBackendFactory_getFactory }, +#ifdef HAVE_WASAPI + { "wasapi", ALCwasapiBackendFactory_getFactory }, #endif #ifdef HAVE_DSOUND { "dsound", ALCdsoundBackendFactory_getFactory }, @@ -96,6 +102,9 @@ static struct BackendInfo BackendList[] = { #ifdef HAVE_OPENSL { "opensl", ALCopenslBackendFactory_getFactory }, #endif +#ifdef HAVE_SDL2 + { "sdl2", ALCsdl2BackendFactory_getFactory }, +#endif { "null", ALCnullBackendFactory_getFactory }, #ifdef HAVE_WAVE @@ -145,8 +154,6 @@ static const struct { DECL(alcIsRenderFormatSupportedSOFT), DECL(alcRenderSamplesSOFT), - DECL(alcIsAmbisonicFormatSupportedSOFT), - DECL(alcDevicePauseSOFT), DECL(alcDeviceResumeSOFT), @@ -279,11 +286,17 @@ static const struct { DECL(alGetSource3i64SOFT), DECL(alGetSourcei64vSOFT), - DECL(alBufferSamplesSOFT), - DECL(alGetBufferSamplesSOFT), - DECL(alIsBufferFormatSupportedSOFT), - DECL(alGetStringiSOFT), + + DECL(alBufferStorageSOFT), + DECL(alMapBufferSOFT), + DECL(alUnmapBufferSOFT), + DECL(alFlushMappedBufferSOFT), + + DECL(alEventControlSOFT), + DECL(alEventCallbackSOFT), + DECL(alGetPointerSOFT), + DECL(alGetPointervSOFT), }; #undef DECL @@ -470,64 +483,10 @@ static const struct { DECL(AL_FORMAT_BFORMAT3D_FLOAT32), DECL(AL_FORMAT_BFORMAT3D_MULAW), - DECL(AL_MONO8_SOFT), - DECL(AL_MONO16_SOFT), - DECL(AL_MONO32F_SOFT), - DECL(AL_STEREO8_SOFT), - DECL(AL_STEREO16_SOFT), - DECL(AL_STEREO32F_SOFT), - DECL(AL_QUAD8_SOFT), - DECL(AL_QUAD16_SOFT), - DECL(AL_QUAD32F_SOFT), - DECL(AL_REAR8_SOFT), - DECL(AL_REAR16_SOFT), - DECL(AL_REAR32F_SOFT), - DECL(AL_5POINT1_8_SOFT), - DECL(AL_5POINT1_16_SOFT), - DECL(AL_5POINT1_32F_SOFT), - DECL(AL_6POINT1_8_SOFT), - DECL(AL_6POINT1_16_SOFT), - DECL(AL_6POINT1_32F_SOFT), - DECL(AL_7POINT1_8_SOFT), - DECL(AL_7POINT1_16_SOFT), - DECL(AL_7POINT1_32F_SOFT), - DECL(AL_BFORMAT2D_8_SOFT), - DECL(AL_BFORMAT2D_16_SOFT), - DECL(AL_BFORMAT2D_32F_SOFT), - DECL(AL_BFORMAT3D_8_SOFT), - DECL(AL_BFORMAT3D_16_SOFT), - DECL(AL_BFORMAT3D_32F_SOFT), - - DECL(AL_MONO_SOFT), - DECL(AL_STEREO_SOFT), - DECL(AL_QUAD_SOFT), - DECL(AL_REAR_SOFT), - DECL(AL_5POINT1_SOFT), - DECL(AL_6POINT1_SOFT), - DECL(AL_7POINT1_SOFT), - DECL(AL_BFORMAT2D_SOFT), - DECL(AL_BFORMAT3D_SOFT), - - DECL(AL_BYTE_SOFT), - DECL(AL_UNSIGNED_BYTE_SOFT), - DECL(AL_SHORT_SOFT), - DECL(AL_UNSIGNED_SHORT_SOFT), - DECL(AL_INT_SOFT), - DECL(AL_UNSIGNED_INT_SOFT), - DECL(AL_FLOAT_SOFT), - DECL(AL_DOUBLE_SOFT), - DECL(AL_BYTE3_SOFT), - DECL(AL_UNSIGNED_BYTE3_SOFT), - DECL(AL_MULAW_SOFT), - DECL(AL_FREQUENCY), DECL(AL_BITS), DECL(AL_CHANNELS), DECL(AL_SIZE), - DECL(AL_INTERNAL_FORMAT_SOFT), - DECL(AL_BYTE_LENGTH_SOFT), - DECL(AL_SAMPLE_LENGTH_SOFT), - DECL(AL_SEC_LENGTH_SOFT), DECL(AL_UNPACK_BLOCK_ALIGNMENT_SOFT), DECL(AL_PACK_BLOCK_ALIGNMENT_SOFT), @@ -590,15 +549,13 @@ static const struct { DECL(AL_EFFECT_DISTORTION), DECL(AL_EFFECT_ECHO), DECL(AL_EFFECT_FLANGER), -#if 0 - DECL(AL_EFFECT_FREQUENCY_SHIFTER), - DECL(AL_EFFECT_VOCAL_MORPHER), DECL(AL_EFFECT_PITCH_SHIFTER), + DECL(AL_EFFECT_FREQUENCY_SHIFTER), +#if 0 + DECL(AL_EFFECT_VOCAL_MORPHER), #endif DECL(AL_EFFECT_RING_MODULATOR), -#if 0 DECL(AL_EFFECT_AUTOWAH), -#endif DECL(AL_EFFECT_COMPRESSOR), DECL(AL_EFFECT_EQUALIZER), DECL(AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT), @@ -673,10 +630,17 @@ static const struct { DECL(AL_FLANGER_FEEDBACK), DECL(AL_FLANGER_DELAY), + DECL(AL_FREQUENCY_SHIFTER_FREQUENCY), + DECL(AL_FREQUENCY_SHIFTER_LEFT_DIRECTION), + DECL(AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION), + DECL(AL_RING_MODULATOR_FREQUENCY), DECL(AL_RING_MODULATOR_HIGHPASS_CUTOFF), DECL(AL_RING_MODULATOR_WAVEFORM), + DECL(AL_PITCH_SHIFTER_COARSE_TUNE), + DECL(AL_PITCH_SHIFTER_FINE_TUNE), + DECL(AL_COMPRESSOR_ONOFF), DECL(AL_EQUALIZER_LOW_GAIN), @@ -692,6 +656,11 @@ static const struct { DECL(AL_DEDICATED_GAIN), + DECL(AL_AUTOWAH_ATTACK_TIME), + DECL(AL_AUTOWAH_RELEASE_TIME), + DECL(AL_AUTOWAH_RESONANCE), + DECL(AL_AUTOWAH_PEAK_GAIN), + DECL(AL_NUM_RESAMPLERS_SOFT), DECL(AL_DEFAULT_RESAMPLER_SOFT), DECL(AL_SOURCE_RESAMPLER_SOFT), @@ -699,6 +668,19 @@ static const struct { DECL(AL_SOURCE_SPATIALIZE_SOFT), DECL(AL_AUTO_SOFT), + + DECL(AL_MAP_READ_BIT_SOFT), + DECL(AL_MAP_WRITE_BIT_SOFT), + DECL(AL_MAP_PERSISTENT_BIT_SOFT), + DECL(AL_PRESERVE_DATA_BIT_SOFT), + + DECL(AL_EVENT_CALLBACK_FUNCTION_SOFT), + DECL(AL_EVENT_CALLBACK_USER_PARAM_SOFT), + DECL(AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT), + DECL(AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT), + DECL(AL_EVENT_TYPE_ERROR_SOFT), + DECL(AL_EVENT_TYPE_PERFORMANCE_SOFT), + DECL(AL_EVENT_TYPE_DEPRECATED_SOFT), }; #undef DECL @@ -726,14 +708,35 @@ static ALCchar *alcCaptureDefaultDeviceSpecifier; /* Default context extensions */ static const ALchar alExtList[] = - "AL_EXT_ALAW AL_EXT_BFORMAT AL_EXT_DOUBLE AL_EXT_EXPONENT_DISTANCE " - "AL_EXT_FLOAT32 AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS " - "AL_EXT_MULAW AL_EXT_MULAW_BFORMAT AL_EXT_MULAW_MCFORMATS AL_EXT_OFFSET " - "AL_EXT_source_distance_model AL_EXT_SOURCE_RADIUS AL_EXT_STEREO_ANGLES " - "AL_LOKI_quadriphonic AL_SOFT_block_alignment AL_SOFT_deferred_updates " - "AL_SOFT_direct_channels AL_SOFT_gain_clamp_ex AL_SOFT_loop_points " - "AL_SOFT_MSADPCM AL_SOFT_source_latency AL_SOFT_source_length " - "AL_SOFT_source_resampler AL_SOFT_source_spatialize"; + "AL_EXT_ALAW " + "AL_EXT_BFORMAT " + "AL_EXT_DOUBLE " + "AL_EXT_EXPONENT_DISTANCE " + "AL_EXT_FLOAT32 " + "AL_EXT_IMA4 " + "AL_EXT_LINEAR_DISTANCE " + "AL_EXT_MCFORMATS " + "AL_EXT_MULAW " + "AL_EXT_MULAW_BFORMAT " + "AL_EXT_MULAW_MCFORMATS " + "AL_EXT_OFFSET " + "AL_EXT_source_distance_model " + "AL_EXT_SOURCE_RADIUS " + "AL_EXT_STEREO_ANGLES " + "AL_LOKI_quadriphonic " + "AL_SOFT_block_alignment " + "AL_SOFT_deferred_updates " + "AL_SOFT_direct_channels " + "AL_SOFTX_events " + "AL_SOFTX_filter_gain_ex " + "AL_SOFT_gain_clamp_ex " + "AL_SOFT_loop_points " + "AL_SOFTX_map_buffer " + "AL_SOFT_MSADPCM " + "AL_SOFT_source_latency " + "AL_SOFT_source_length " + "AL_SOFT_source_resampler " + "AL_SOFT_source_spatialize"; static ATOMIC(ALCenum) LastNullDeviceError = ATOMIC_INIT_STATIC(ALC_NO_ERROR); @@ -776,7 +779,7 @@ static const ALCchar alcNoDeviceExtList[] = static const ALCchar alcExtensionList[] = "ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE " "ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX " - "ALC_EXT_thread_local_context ALC_SOFTX_device_clock ALC_SOFT_HRTF " + "ALC_EXT_thread_local_context ALC_SOFT_device_clock ALC_SOFT_HRTF " "ALC_SOFT_loopback ALC_SOFT_output_limiter ALC_SOFT_pause_device"; static const ALCint alcMajorVersion = 1; static const ALCint alcMinorVersion = 1; @@ -823,6 +826,7 @@ BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved) break; case DLL_THREAD_DETACH: + althrd_thread_detach(); break; case DLL_PROCESS_DETACH: @@ -885,19 +889,21 @@ static void alc_init(void) if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) ZScale *= -1.0f; + str = getenv("__ALSOFT_REVERB_IGNORES_SOUND_SPEED"); + if(str && (strcasecmp(str, "true") == 0 || strtol(str, NULL, 0) == 1)) + OverrideReverbSpeedOfSound = AL_TRUE; + ret = altss_create(&LocalContext, ReleaseThreadCtx); assert(ret == althrd_success); ret = almtx_init(&ListLock, almtx_recursive); assert(ret == althrd_success); - - ThunkInit(); } static void alc_initconfig(void) { const char *devs, *str; - ALuint capfilter; + int capfilter; float valf; int i, n; @@ -1001,6 +1007,7 @@ static void alc_initconfig(void) #endif ConfigValueInt(NULL, NULL, "rt-prio", &RTPrioLevel); + aluInit(); aluInitMixer(); str = getenv("ALSOFT_TRAP_ERROR"); @@ -1025,8 +1032,6 @@ static void alc_initconfig(void) if(ConfigValueFloat(NULL, "reverb", "boost", &valf)) ReverbBoost *= powf(10.0f, valf / 20.0f); - EmulateEAXReverb = GetConfigValueBool(NULL, "reverb", "emulate-eax", AL_FALSE); - if(((devs=getenv("ALSOFT_DRIVERS")) && devs[0]) || ConfigValueStr(NULL, NULL, "drivers", &devs)) { @@ -1055,6 +1060,16 @@ static void alc_initconfig(void) len = (next ? ((size_t)(next-devs)) : strlen(devs)); while(len > 0 && isspace(devs[len-1])) len--; +#ifdef HAVE_WASAPI + /* HACK: For backwards compatibility, convert backend references of + * mmdevapi to wasapi. This should eventually be removed. + */ + if(len == 8 && strncmp(devs, "mmdevapi", len) == 0) + { + devs = "wasapi"; + len = 6; + } +#endif for(n = i;n < BackendListSize;n++) { if(len == strlen(BackendList[n].name) && @@ -1084,27 +1099,33 @@ static void alc_initconfig(void) BackendListSize = i; } - for(i = 0;i < BackendListSize && (!PlaybackBackend.name || !CaptureBackend.name);i++) + for(n = i = 0;i < BackendListSize && (!PlaybackBackend.name || !CaptureBackend.name);i++) { - ALCbackendFactory *factory = BackendList[i].getFactory(); + ALCbackendFactory *factory; + BackendList[n] = BackendList[i]; + + factory = BackendList[n].getFactory(); if(!V0(factory,init)()) { - WARN("Failed to initialize backend \"%s\"\n", BackendList[i].name); + WARN("Failed to initialize backend \"%s\"\n", BackendList[n].name); continue; } - TRACE("Initialized backend \"%s\"\n", BackendList[i].name); + TRACE("Initialized backend \"%s\"\n", BackendList[n].name); if(!PlaybackBackend.name && V(factory,querySupport)(ALCbackend_Playback)) { - PlaybackBackend = BackendList[i]; + PlaybackBackend = BackendList[n]; TRACE("Added \"%s\" for playback\n", PlaybackBackend.name); } if(!CaptureBackend.name && V(factory,querySupport)(ALCbackend_Capture)) { - CaptureBackend = BackendList[i]; + CaptureBackend = BackendList[n]; TRACE("Added \"%s\" for capture\n", CaptureBackend.name); } + n++; } + BackendListSize = n; + { ALCbackendFactory *factory = ALCloopbackFactory_getFactory(); V0(factory,init)(); @@ -1128,7 +1149,7 @@ static void alc_initconfig(void) continue; len = (next ? ((size_t)(next-str)) : strlen(str)); - for(n = 0;EffectList[n].name;n++) + for(n = 0;n < EFFECTLIST_SIZE;n++) { if(len == strlen(EffectList[n].name) && strncmp(EffectList[n].name, str, len) == 0) @@ -1137,8 +1158,6 @@ static void alc_initconfig(void) } while(next++); } - InitEffectFactoryMap(); - InitEffect(&DefaultEffect); str = getenv("ALSOFT_DEFAULT_REVERB"); if((str && str[0]) || ConfigValueStr(NULL, NULL, "default-reverb", &str)) @@ -1146,75 +1165,6 @@ static void alc_initconfig(void) } #define DO_INITCONFIG() alcall_once(&alc_config_once, alc_initconfig) -#ifdef __ANDROID__ -#include - -static JavaVM *gJavaVM; -static pthread_key_t gJVMThreadKey; - -static void CleanupJNIEnv(void* UNUSED(ptr)) -{ - JCALL0(gJavaVM,DetachCurrentThread)(); -} - -void *Android_GetJNIEnv(void) -{ - if(!gJavaVM) - { - WARN("gJavaVM is NULL!\n"); - return NULL; - } - - /* http://developer.android.com/guide/practices/jni.html - * - * All threads are Linux threads, scheduled by the kernel. They're usually - * started from managed code (using Thread.start), but they can also be - * created elsewhere and then attached to the JavaVM. For example, a thread - * started with pthread_create can be attached with the JNI - * AttachCurrentThread or AttachCurrentThreadAsDaemon functions. Until a - * thread is attached, it has no JNIEnv, and cannot make JNI calls. - * Attaching a natively-created thread causes a java.lang.Thread object to - * be constructed and added to the "main" ThreadGroup, making it visible to - * the debugger. Calling AttachCurrentThread on an already-attached thread - * is a no-op. - */ - JNIEnv *env = pthread_getspecific(gJVMThreadKey); - if(!env) - { - int status = JCALL(gJavaVM,AttachCurrentThread)(&env, NULL); - if(status < 0) - { - ERR("Failed to attach current thread\n"); - return NULL; - } - pthread_setspecific(gJVMThreadKey, env); - } - return env; -} - -/* Automatically called by JNI. */ -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void* UNUSED(reserved)) -{ - void *env; - int err; - - gJavaVM = jvm; - if(JCALL(gJavaVM,GetEnv)(&env, JNI_VERSION_1_4) != JNI_OK) - { - ERR("Failed to get JNIEnv with JNI_VERSION_1_4\n"); - return JNI_ERR; - } - - /* Create gJVMThreadKey so we can keep track of the JNIEnv assigned to each - * thread. The JNIEnv *must* be detached before the thread is destroyed. - */ - if((err=pthread_key_create(&gJVMThreadKey, CleanupJNIEnv)) != 0) - ERR("pthread_key_create failed: %d\n", err); - pthread_setspecific(gJVMThreadKey, env); - return JNI_VERSION_1_4; -} -#endif - /************************************************ * Library deinitialization @@ -1236,11 +1186,10 @@ static void alc_cleanup(void) ALCuint num = 0; do { num++; - } while((dev=dev->next) != NULL); + dev = ATOMIC_LOAD(&dev->next, almemory_order_relaxed); + } while(dev != NULL); ERR("%u device%s not closed\n", num, (num>1)?"s":""); } - - DeinitEffectFactoryMap(); } static void alc_deinit_safe(void) @@ -1250,13 +1199,14 @@ static void alc_deinit_safe(void) FreeHrtfs(); FreeALConfig(); - ThunkExit(); almtx_destroy(&ListLock); altss_delete(LocalContext); if(LogFile != stderr) fclose(LogFile); LogFile = NULL; + + althrd_deinit(); } static void alc_deinit(void) @@ -1287,15 +1237,16 @@ static void alc_deinit(void) ************************************************/ static void ProbeDevices(al_string *list, struct BackendInfo *backendinfo, enum DevProbe type) { - ALCbackendFactory *factory; - DO_INITCONFIG(); LockLists(); alstr_clear(list); - factory = backendinfo->getFactory(); - V(factory,probe)(type); + if(backendinfo->getFactory) + { + ALCbackendFactory *factory = backendinfo->getFactory(); + V(factory,probe)(type, list); + } UnlockLists(); } @@ -1304,17 +1255,6 @@ static void ProbeAllDevicesList(void) static void ProbeCaptureDeviceList(void) { ProbeDevices(&alcCaptureDeviceList, &CaptureBackend, CAPTURE_DEVICE_PROBE); } -static void AppendDevice(const ALCchar *name, al_string *devnames) -{ - size_t len = strlen(name); - if(len > 0) - alstr_append_range(devnames, name, name+len+1); -} -void AppendAllDevicesList(const ALCchar *name) -{ AppendDevice(name, &alcAllDevicesList); } -void AppendCaptureDeviceList(const ALCchar *name) -{ AppendDevice(name, &alcCaptureDeviceList); } - /************************************************ * Device format information @@ -1488,17 +1428,6 @@ static ALCboolean IsValidAmbiScaling(ALCenum scaling) * Miscellaneous ALC helpers ************************************************/ -void ALCdevice_Lock(ALCdevice *device) -{ - V0(device->Backend,lock)(); -} - -void ALCdevice_Unlock(ALCdevice *device) -{ - V0(device->Backend,unlock)(); -} - - /* SetDefaultWFXChannelOrder * * Sets the default channel order used by WaveFormatEx. @@ -1635,6 +1564,7 @@ void SetDefaultChannelOrder(ALCdevice *device) } extern inline ALint GetChannelIndex(const enum Channel names[MAX_OUTPUT_CHANNELS], enum Channel chan); +extern inline ALint GetChannelIdxByName(const RealMixParams *real, enum Channel chan); /* ALCcontext_DeferUpdates @@ -1654,7 +1584,7 @@ void ALCcontext_DeferUpdates(ALCcontext *context) */ void ALCcontext_ProcessUpdates(ALCcontext *context) { - ReadLock(&context->PropLock); + almtx_lock(&context->PropLock); if(ATOMIC_EXCHANGE_SEQ(&context->DeferUpdates, AL_FALSE)) { /* Tell the mixer to stop applying updates, then wait for any active @@ -1664,7 +1594,10 @@ void ALCcontext_ProcessUpdates(ALCcontext *context) while((ATOMIC_LOAD(&context->UpdateCount, almemory_order_acquire)&1) != 0) althrd_yield(); - UpdateListenerProps(context); + if(!ATOMIC_FLAG_TEST_AND_SET(&context->PropsClean, almemory_order_acq_rel)) + UpdateContextProps(context); + if(!ATOMIC_FLAG_TEST_AND_SET(&context->Listener->PropsClean, almemory_order_acq_rel)) + UpdateListenerProps(context); UpdateAllEffectSlotProps(context); UpdateAllSourceProps(context); @@ -1673,7 +1606,7 @@ void ALCcontext_ProcessUpdates(ALCcontext *context) */ ATOMIC_STORE_SEQ(&context->HoldUpdates, AL_FALSE); } - ReadUnlock(&context->PropLock); + almtx_unlock(&context->PropLock); } @@ -1702,10 +1635,11 @@ static void alcSetError(ALCdevice *device, ALCenum errorCode) } -struct Compressor *CreateDeviceLimiter(const ALCdevice *device) +static struct Compressor *CreateDeviceLimiter(const ALCdevice *device, const ALfloat threshold) { - return CompressorInit(0.0f, 0.0f, AL_FALSE, AL_TRUE, 0.0f, 0.0f, 0.5f, 2.0f, - 0.0f, -3.0f, 3.0f, device->Frequency); + return CompressorInit(device->RealOut.NumChannels, device->Frequency, + AL_TRUE, AL_TRUE, AL_TRUE, AL_TRUE, AL_TRUE, 0.001f, 0.002f, + 0.0f, 0.0f, threshold, INFINITY, 0.0f, 0.020f, 0.200f); } /* UpdateClockBase @@ -1732,7 +1666,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) { enum HrtfRequestMode hrtf_userreq = Hrtf_Default; enum HrtfRequestMode hrtf_appreq = Hrtf_Default; - ALCenum gainLimiter = device->Limiter ? ALC_TRUE : ALC_FALSE; + ALCenum gainLimiter = device->LimiterState; const ALsizei old_sends = device->NumAuxSends; ALsizei new_sends = device->NumAuxSends; enum DevFmtChannels oldChans; @@ -2048,6 +1982,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) device->RealOut.NumChannels = 0; UpdateClockBase(device); + device->FixedLatency = 0; device->DitherSeed = DITHER_RNG_SEED; @@ -2208,9 +2143,12 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) break; } } - else if(depth > 24) - depth = 24; - device->DitherDepth = (depth > 0) ? powf(2.0f, (ALfloat)(depth-1)) : 0.0f; + + if(depth > 0) + { + depth = clampi(depth, 2, 24); + device->DitherDepth = powf(2.0f, (ALfloat)(depth-1)); + } } if(!(device->DitherDepth > 0.0f)) TRACE("Dithering disabled\n"); @@ -2218,19 +2156,57 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) TRACE("Dithering enabled (%g-bit, %g)\n", log2f(device->DitherDepth)+1.0f, device->DitherDepth); + device->LimiterState = gainLimiter; if(ConfigValueBool(alstr_get_cstr(device->DeviceName), NULL, "output-limiter", &val)) gainLimiter = val ? ALC_TRUE : ALC_FALSE; + /* Valid values for gainLimiter are ALC_DONT_CARE_SOFT, ALC_TRUE, and - * ALC_FALSE. We default to on, so ALC_DONT_CARE_SOFT is the same as - * ALC_TRUE. + * ALC_FALSE. For ALC_DONT_CARE_SOFT, use the limiter for integer-based + * output (where samples must be clamped), and don't for floating-point + * (which can take unclamped samples). */ + if(gainLimiter == ALC_DONT_CARE_SOFT) + { + switch(device->FmtType) + { + case DevFmtByte: + case DevFmtUByte: + case DevFmtShort: + case DevFmtUShort: + case DevFmtInt: + case DevFmtUInt: + gainLimiter = ALC_TRUE; + break; + case DevFmtFloat: + gainLimiter = ALC_FALSE; + break; + } + } if(gainLimiter != ALC_FALSE) { - if(!device->Limiter || device->Frequency != GetCompressorSampleRate(device->Limiter)) + ALfloat thrshld = 1.0f; + switch(device->FmtType) { - al_free(device->Limiter); - device->Limiter = CreateDeviceLimiter(device); + case DevFmtByte: + case DevFmtUByte: + thrshld = 127.0f / 128.0f; + break; + case DevFmtShort: + case DevFmtUShort: + thrshld = 32767.0f / 32768.0f; + break; + case DevFmtInt: + case DevFmtUInt: + case DevFmtFloat: + break; } + if(device->DitherDepth > 0.0f) + thrshld -= 1.0f / device->DitherDepth; + + al_free(device->Limiter); + device->Limiter = CreateDeviceLimiter(device, log10f(thrshld) * 20.0f); + device->FixedLatency += (ALuint)(GetCompressorLookAhead(device->Limiter) * + DEVICE_CLOCK_RES / device->Frequency); } else { @@ -2239,6 +2215,10 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) } TRACE("Output limiter %s\n", device->Limiter ? "enabled" : "disabled"); + aluSelectPostProcess(device); + + TRACE("Fixed device latency: %uns\n", device->FixedLatency); + /* Need to delay returning failure until replacement Send arrays have been * allocated with the appropriate size. */ @@ -2247,6 +2227,8 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) context = ATOMIC_LOAD_SEQ(&device->ContextList); while(context) { + SourceSubList *sublist, *subend; + struct ALvoiceProps *vprops; ALsizei pos; if(context->DefaultSlot) @@ -2259,14 +2241,14 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) if(V(state,deviceUpdate)(device) == AL_FALSE) update_failed = AL_TRUE; else - UpdateEffectSlotProps(slot); + UpdateEffectSlotProps(slot, context); } - WriteLock(&context->PropLock); - LockUIntMapRead(&context->EffectSlotMap); - for(pos = 0;pos < context->EffectSlotMap.size;pos++) + almtx_lock(&context->PropLock); + almtx_lock(&context->EffectSlotLock); + for(pos = 0;pos < (ALsizei)VECTOR_SIZE(context->EffectSlotList);pos++) { - ALeffectslot *slot = context->EffectSlotMap.values[pos]; + ALeffectslot *slot = VECTOR_ELEM(context->EffectSlotList, pos); ALeffectState *state = slot->Effect.State; state->OutBuffer = device->Dry.Buffer; @@ -2274,65 +2256,72 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) if(V(state,deviceUpdate)(device) == AL_FALSE) update_failed = AL_TRUE; else - UpdateEffectSlotProps(slot); + UpdateEffectSlotProps(slot, context); } - UnlockUIntMapRead(&context->EffectSlotMap); + almtx_unlock(&context->EffectSlotLock); - LockUIntMapRead(&context->SourceMap); - RelimitUIntMapNoLock(&context->SourceMap, device->SourcesMax); - for(pos = 0;pos < context->SourceMap.size;pos++) + almtx_lock(&context->SourceLock); + sublist = VECTOR_BEGIN(context->SourceList); + subend = VECTOR_END(context->SourceList); + for(;sublist != subend;++sublist) { - ALsource *source = context->SourceMap.values[pos]; - - if(old_sends != device->NumAuxSends) + ALuint64 usemask = ~sublist->FreeMask; + while(usemask) { - ALvoid *sends = al_calloc(16, device->NumAuxSends*sizeof(source->Send[0])); - ALsizei s; + ALsizei idx = CTZ64(usemask); + ALsource *source = sublist->Sources + idx; - memcpy(sends, source->Send, - mini(device->NumAuxSends, old_sends)*sizeof(source->Send[0]) - ); - for(s = device->NumAuxSends;s < old_sends;s++) + usemask &= ~(U64(1) << idx); + + if(old_sends != device->NumAuxSends) { - if(source->Send[s].Slot) - DecrementRef(&source->Send[s].Slot->ref); - source->Send[s].Slot = NULL; - } - al_free(source->Send); - source->Send = sends; - for(s = old_sends;s < device->NumAuxSends;s++) - { - source->Send[s].Slot = NULL; - source->Send[s].Gain = 1.0f; - source->Send[s].GainHF = 1.0f; - source->Send[s].HFReference = LOWPASSFREQREF; - source->Send[s].GainLF = 1.0f; - source->Send[s].LFReference = HIGHPASSFREQREF; + ALvoid *sends = al_calloc(16, device->NumAuxSends*sizeof(source->Send[0])); + ALsizei s; + + memcpy(sends, source->Send, + mini(device->NumAuxSends, old_sends)*sizeof(source->Send[0]) + ); + for(s = device->NumAuxSends;s < old_sends;s++) + { + if(source->Send[s].Slot) + DecrementRef(&source->Send[s].Slot->ref); + source->Send[s].Slot = NULL; + } + al_free(source->Send); + source->Send = sends; + for(s = old_sends;s < device->NumAuxSends;s++) + { + source->Send[s].Slot = NULL; + source->Send[s].Gain = 1.0f; + source->Send[s].GainHF = 1.0f; + source->Send[s].HFReference = LOWPASSFREQREF; + source->Send[s].GainLF = 1.0f; + source->Send[s].LFReference = HIGHPASSFREQREF; + } } + + ATOMIC_FLAG_CLEAR(&source->PropsClean, almemory_order_release); } - - ATOMIC_FLAG_CLEAR(&source->PropsClean, almemory_order_release); } + + /* Clear any pre-existing voice property structs, in case the number of + * auxiliary sends is changing. Active sources will have updates + * respecified in UpdateAllSourceProps. + */ + vprops = ATOMIC_EXCHANGE_PTR(&context->FreeVoiceProps, NULL, almemory_order_acq_rel); + while(vprops) + { + struct ALvoiceProps *next = ATOMIC_LOAD(&vprops->next, almemory_order_relaxed); + al_free(vprops); + vprops = next; + } + AllocateVoices(context, context->MaxVoices, old_sends); for(pos = 0;pos < context->VoiceCount;pos++) { ALvoice *voice = context->Voices[pos]; - struct ALvoiceProps *props; - /* Clear any pre-existing voice property structs, in case the - * number of auxiliary sends changed. Active sources will have - * updates respecified in UpdateAllSourceProps. - */ - props = ATOMIC_EXCHANGE_PTR(&voice->Update, NULL, almemory_order_relaxed); - al_free(props); - - props = ATOMIC_EXCHANGE_PTR(&voice->FreeList, NULL, almemory_order_relaxed); - while(props) - { - struct ALvoiceProps *next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - al_free(props); - props = next; - } + al_free(ATOMIC_EXCHANGE_PTR(&voice->Update, NULL, almemory_order_acq_rel)); if(ATOMIC_LOAD(&voice->Source, almemory_order_acquire) == NULL) continue; @@ -2343,20 +2332,19 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / (device->AvgSpeakerDist * device->Frequency); for(i = 0;i < voice->NumChannels;i++) - { - NfcFilterCreate1(&voice->Direct.Params[i].NFCtrlFilter[0], 0.0f, w1); - NfcFilterCreate2(&voice->Direct.Params[i].NFCtrlFilter[1], 0.0f, w1); - NfcFilterCreate3(&voice->Direct.Params[i].NFCtrlFilter[2], 0.0f, w1); - } + NfcFilterCreate(&voice->Direct.Params[i].NFCtrlFilter, 0.0f, w1); } } - UnlockUIntMapRead(&context->SourceMap); + almtx_unlock(&context->SourceLock); + ATOMIC_FLAG_TEST_AND_SET(&context->PropsClean, almemory_order_release); + UpdateContextProps(context); + ATOMIC_FLAG_TEST_AND_SET(&context->Listener->PropsClean, almemory_order_release); UpdateListenerProps(context); UpdateAllSourceProps(context); - WriteUnlock(&context->PropLock); + almtx_unlock(&context->PropLock); - context = context->next; + context = ATOMIC_LOAD(&context->next, almemory_order_relaxed); } END_MIXER_MODE(); if(update_failed) @@ -2372,6 +2360,73 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList) return ALC_NO_ERROR; } + +static void InitDevice(ALCdevice *device, enum DeviceType type) +{ + ALsizei i; + + InitRef(&device->ref, 1); + ATOMIC_INIT(&device->Connected, ALC_TRUE); + device->Type = type; + ATOMIC_INIT(&device->LastError, ALC_NO_ERROR); + + device->Flags = 0; + device->Render_Mode = NormalRender; + device->AvgSpeakerDist = 0.0f; + device->LimiterState = ALC_DONT_CARE_SOFT; + + ATOMIC_INIT(&device->ContextList, NULL); + + device->ClockBase = 0; + device->SamplesDone = 0; + device->FixedLatency = 0; + + device->SourcesMax = 0; + device->AuxiliaryEffectSlotMax = 0; + device->NumAuxSends = 0; + + device->Dry.Buffer = NULL; + device->Dry.NumChannels = 0; + device->FOAOut.Buffer = NULL; + device->FOAOut.NumChannels = 0; + device->RealOut.Buffer = NULL; + device->RealOut.NumChannels = 0; + + AL_STRING_INIT(device->DeviceName); + + for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) + { + device->ChannelDelay[i].Gain = 1.0f; + device->ChannelDelay[i].Length = 0; + device->ChannelDelay[i].Buffer = NULL; + } + + AL_STRING_INIT(device->HrtfName); + VECTOR_INIT(device->HrtfList); + device->HrtfHandle = NULL; + device->Hrtf = NULL; + device->Bs2b = NULL; + device->Uhj_Encoder = NULL; + device->AmbiDecoder = NULL; + device->AmbiUp = NULL; + device->Stablizer = NULL; + device->Limiter = NULL; + + VECTOR_INIT(device->BufferList); + almtx_init(&device->BufferLock, almtx_plain); + + VECTOR_INIT(device->EffectList); + almtx_init(&device->EffectLock, almtx_plain); + + VECTOR_INIT(device->FilterList); + almtx_init(&device->FilterLock, almtx_plain); + + almtx_init(&device->BackendLock, almtx_plain); + device->Backend = NULL; + + ATOMIC_INIT(&device->next, NULL); +} + /* FreeDevice * * Frees the device structure, and destroys any objects the app failed to @@ -2383,35 +2438,32 @@ static ALCvoid FreeDevice(ALCdevice *device) TRACE("%p\n", device); - V0(device->Backend,close)(); - DELETE_OBJ(device->Backend); + if(device->Backend) + DELETE_OBJ(device->Backend); device->Backend = NULL; almtx_destroy(&device->BackendLock); - if(device->BufferMap.size > 0) - { - WARN("(%p) Deleting %d Buffer%s\n", device, device->BufferMap.size, - (device->BufferMap.size==1)?"":"s"); - ReleaseALBuffers(device); - } - ResetUIntMap(&device->BufferMap); + ReleaseALBuffers(device); +#define FREE_BUFFERSUBLIST(x) al_free((x)->Buffers) + VECTOR_FOR_EACH(BufferSubList, device->BufferList, FREE_BUFFERSUBLIST); +#undef FREE_BUFFERSUBLIST + VECTOR_DEINIT(device->BufferList); + almtx_destroy(&device->BufferLock); - if(device->EffectMap.size > 0) - { - WARN("(%p) Deleting %d Effect%s\n", device, device->EffectMap.size, - (device->EffectMap.size==1)?"":"s"); - ReleaseALEffects(device); - } - ResetUIntMap(&device->EffectMap); + ReleaseALEffects(device); +#define FREE_EFFECTSUBLIST(x) al_free((x)->Effects) + VECTOR_FOR_EACH(EffectSubList, device->EffectList, FREE_EFFECTSUBLIST); +#undef FREE_EFFECTSUBLIST + VECTOR_DEINIT(device->EffectList); + almtx_destroy(&device->EffectLock); - if(device->FilterMap.size > 0) - { - WARN("(%p) Deleting %d Filter%s\n", device, device->FilterMap.size, - (device->FilterMap.size==1)?"":"s"); - ReleaseALFilters(device); - } - ResetUIntMap(&device->FilterMap); + ReleaseALFilters(device); +#define FREE_FILTERSUBLIST(x) al_free((x)->Filters) + VECTOR_FOR_EACH(FilterSubList, device->FilterList, FREE_FILTERSUBLIST); +#undef FREE_FILTERSUBLIST + VECTOR_DEINIT(device->FilterList); + almtx_destroy(&device->FilterLock); AL_STRING_DEINIT(device->HrtfName); FreeHrtfList(&device->HrtfList); @@ -2427,11 +2479,11 @@ static ALCvoid FreeDevice(ALCdevice *device) al_free(device->Uhj_Encoder); device->Uhj_Encoder = NULL; - bformatdec_free(device->AmbiDecoder); - device->AmbiDecoder = NULL; + bformatdec_free(&device->AmbiDecoder); + ambiup_free(&device->AmbiUp); - ambiup_free(device->AmbiUp); - device->AmbiUp = NULL; + al_free(device->Stablizer); + device->Stablizer = NULL; al_free(device->Limiter); device->Limiter = NULL; @@ -2491,7 +2543,7 @@ static ALCboolean VerifyDevice(ALCdevice **device) UnlockLists(); return ALC_TRUE; } - tmpDevice = tmpDevice->next; + tmpDevice = ATOMIC_LOAD(&tmpDevice->next, almemory_order_relaxed); } UnlockLists(); @@ -2511,7 +2563,6 @@ static ALvoid InitContext(ALCcontext *Context) //Initialise listener listener->Gain = 1.0f; - listener->MetersPerUnit = 1.0f; listener->Position[0] = 0.0f; listener->Position[1] = 0.0f; listener->Position[2] = 0.0f; @@ -2524,30 +2575,21 @@ static ALvoid InitContext(ALCcontext *Context) listener->Up[0] = 0.0f; listener->Up[1] = 1.0f; listener->Up[2] = 0.0f; - - aluMatrixfSet(&listener->Params.Matrix, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - ); - aluVectorSet(&listener->Params.Velocity, 0.0f, 0.0f, 0.0f, 0.0f); - listener->Params.Gain = 1.0f; - listener->Params.MetersPerUnit = 1.0f; - listener->Params.DopplerFactor = 1.0f; - listener->Params.SpeedOfSound = SPEEDOFSOUNDMETRESPERSEC; + ATOMIC_FLAG_TEST_AND_SET(&listener->PropsClean, almemory_order_relaxed); ATOMIC_INIT(&listener->Update, NULL); - ATOMIC_INIT(&listener->FreeList, NULL); //Validate Context InitRef(&Context->UpdateCount, 0); ATOMIC_INIT(&Context->HoldUpdates, AL_FALSE); Context->GainBoost = 1.0f; - RWLockInit(&Context->PropLock); + almtx_init(&Context->PropLock, almtx_plain); ATOMIC_INIT(&Context->LastError, AL_NO_ERROR); - InitUIntMap(&Context->SourceMap, Context->Device->SourcesMax); - InitUIntMap(&Context->EffectSlotMap, Context->Device->AuxiliaryEffectSlotMax); + VECTOR_INIT(Context->SourceList); + Context->NumSources = 0; + almtx_init(&Context->SourceLock, almtx_plain); + VECTOR_INIT(Context->EffectSlotList); + almtx_init(&Context->EffectSlotLock, almtx_plain); if(Context->DefaultSlot) { @@ -2568,9 +2610,40 @@ static ALvoid InitContext(ALCcontext *Context) Context->DopplerFactor = 1.0f; Context->DopplerVelocity = 1.0f; Context->SpeedOfSound = SPEEDOFSOUNDMETRESPERSEC; + Context->MetersPerUnit = AL_DEFAULT_METERS_PER_UNIT; + ATOMIC_FLAG_TEST_AND_SET(&Context->PropsClean, almemory_order_relaxed); ATOMIC_INIT(&Context->DeferUpdates, AL_FALSE); + alsem_init(&Context->EventSem, 0); + Context->AsyncEvents = NULL; + ATOMIC_INIT(&Context->EnabledEvts, 0); + almtx_init(&Context->EventCbLock, almtx_plain); + Context->EventCb = NULL; + Context->EventParam = NULL; + + ATOMIC_INIT(&Context->Update, NULL); + ATOMIC_INIT(&Context->FreeContextProps, NULL); + ATOMIC_INIT(&Context->FreeListenerProps, NULL); + ATOMIC_INIT(&Context->FreeVoiceProps, NULL); + ATOMIC_INIT(&Context->FreeEffectslotProps, NULL); Context->ExtensionList = alExtList; + + + listener->Params.Matrix = IdentityMatrixf; + aluVectorSet(&listener->Params.Velocity, 0.0f, 0.0f, 0.0f, 0.0f); + listener->Params.Gain = listener->Gain; + listener->Params.MetersPerUnit = Context->MetersPerUnit; + listener->Params.DopplerFactor = Context->DopplerFactor; + listener->Params.SpeedOfSound = Context->SpeedOfSound * Context->DopplerVelocity; + listener->Params.ReverbSpeedOfSound = listener->Params.SpeedOfSound * + listener->Params.MetersPerUnit; + listener->Params.SourceDistanceModel = Context->SourceDistanceModel; + listener->Params.DistanceModel = Context->DistanceModel; + + + Context->AsyncEvents = ll_ringbuffer_create(63, sizeof(AsyncEvent), false); + if(althrd_create(&Context->EventThread, EventThread, Context) != althrd_success) + ERR("Failed to start event thread! Expect problems.\n"); } @@ -2583,12 +2656,32 @@ static void FreeContext(ALCcontext *context) { ALlistener *listener = context->Listener; struct ALeffectslotArray *auxslots; + struct ALeffectslotProps *eprops; struct ALlistenerProps *lprops; + struct ALcontextProps *cprops; + struct ALvoiceProps *vprops; size_t count; ALsizei i; TRACE("%p\n", context); + if((cprops=ATOMIC_LOAD(&context->Update, almemory_order_acquire)) != NULL) + { + TRACE("Freed unapplied context update %p\n", cprops); + al_free(cprops); + } + + count = 0; + cprops = ATOMIC_LOAD(&context->FreeContextProps, almemory_order_acquire); + while(cprops) + { + struct ALcontextProps *next = ATOMIC_LOAD(&cprops->next, almemory_order_acquire); + al_free(cprops); + cprops = next; + ++count; + } + TRACE("Freed "SZFMT" context property object%s\n", count, (count==1)?"":"s"); + if(context->DefaultSlot) { DeinitEffectSlot(context->DefaultSlot); @@ -2598,21 +2691,43 @@ static void FreeContext(ALCcontext *context) auxslots = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, NULL, almemory_order_relaxed); al_free(auxslots); - if(context->SourceMap.size > 0) - { - WARN("(%p) Deleting %d Source%s\n", context, context->SourceMap.size, - (context->SourceMap.size==1)?"":"s"); - ReleaseALSources(context); - } - ResetUIntMap(&context->SourceMap); + ReleaseALSources(context); +#define FREE_SOURCESUBLIST(x) al_free((x)->Sources) + VECTOR_FOR_EACH(SourceSubList, context->SourceList, FREE_SOURCESUBLIST); +#undef FREE_SOURCESUBLIST + VECTOR_DEINIT(context->SourceList); + context->NumSources = 0; + almtx_destroy(&context->SourceLock); - if(context->EffectSlotMap.size > 0) + count = 0; + eprops = ATOMIC_LOAD(&context->FreeEffectslotProps, almemory_order_relaxed); + while(eprops) { - WARN("(%p) Deleting %d AuxiliaryEffectSlot%s\n", context, context->EffectSlotMap.size, - (context->EffectSlotMap.size==1)?"":"s"); - ReleaseALAuxiliaryEffectSlots(context); + struct ALeffectslotProps *next = ATOMIC_LOAD(&eprops->next, almemory_order_relaxed); + if(eprops->State) ALeffectState_DecRef(eprops->State); + al_free(eprops); + eprops = next; + ++count; } - ResetUIntMap(&context->EffectSlotMap); + TRACE("Freed "SZFMT" AuxiliaryEffectSlot property object%s\n", count, (count==1)?"":"s"); + + ReleaseALAuxiliaryEffectSlots(context); +#define FREE_EFFECTSLOTPTR(x) al_free(*(x)) + VECTOR_FOR_EACH(ALeffectslotPtr, context->EffectSlotList, FREE_EFFECTSLOTPTR); +#undef FREE_EFFECTSLOTPTR + VECTOR_DEINIT(context->EffectSlotList); + almtx_destroy(&context->EffectSlotLock); + + count = 0; + vprops = ATOMIC_LOAD(&context->FreeVoiceProps, almemory_order_relaxed); + while(vprops) + { + struct ALvoiceProps *next = ATOMIC_LOAD(&vprops->next, almemory_order_relaxed); + al_free(vprops); + vprops = next; + ++count; + } + TRACE("Freed "SZFMT" voice property object%s\n", count, (count==1)?"":"s"); for(i = 0;i < context->VoiceCount;i++) DeinitVoice(context->Voices[i]); @@ -2627,7 +2742,7 @@ static void FreeContext(ALCcontext *context) al_free(lprops); } count = 0; - lprops = ATOMIC_LOAD(&listener->FreeList, almemory_order_acquire); + lprops = ATOMIC_LOAD(&context->FreeListenerProps, almemory_order_acquire); while(lprops) { struct ALlistenerProps *next = ATOMIC_LOAD(&lprops->next, almemory_order_acquire); @@ -2637,6 +2752,14 @@ static void FreeContext(ALCcontext *context) } TRACE("Freed "SZFMT" listener property object%s\n", count, (count==1)?"":"s"); + almtx_destroy(&context->EventCbLock); + alsem_destroy(&context->EventSem); + + ll_ringbuffer_free(context->AsyncEvents); + context->AsyncEvents = NULL; + + almtx_destroy(&context->PropLock); + ALCdevice_DecRef(context->Device); context->Device = NULL; @@ -2653,6 +2776,7 @@ static void FreeContext(ALCcontext *context) */ static bool ReleaseContext(ALCcontext *context, ALCdevice *device) { + static const AsyncEvent kill_evt = ASYNC_EVENT(EventType_KillThread); ALCcontext *origctx, *newhead; bool ret = true; @@ -2667,31 +2791,39 @@ static bool ReleaseContext(ALCcontext *context, ALCdevice *device) if(ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&GlobalContext, &origctx, NULL)) ALCcontext_DecRef(context); - ALCdevice_Lock(device); + V0(device->Backend,lock)(); origctx = context; - newhead = context->next; + newhead = ATOMIC_LOAD(&context->next, almemory_order_relaxed); if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&device->ContextList, &origctx, newhead)) { - ALCcontext *volatile*list = &origctx->next; - while(*list) - { - if(*list == context) - { - *list = (*list)->next; - break; - } - list = &(*list)->next; - } + ALCcontext *list; + do { + /* origctx is what the desired context failed to match. Try + * swapping out the next one in the list. + */ + list = origctx; + origctx = context; + } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origctx, newhead)); } else ret = !!newhead; - ALCdevice_Unlock(device); + V0(device->Backend,unlock)(); + + /* Make sure the context is finished and no longer processing in the mixer + * before sending the message queue kill event. The backend's lock does + * this, although waiting for a non-odd mix count would work too. + */ + + while(ll_ringbuffer_write(context->AsyncEvents, (const char*)&kill_evt, 1) == 0) + althrd_yield(); + alsem_post(&context->EventSem); + althrd_join(context->EventThread, NULL); ALCcontext_DecRef(context); return ret; } -void ALCcontext_IncRef(ALCcontext *context) +static void ALCcontext_IncRef(ALCcontext *context) { uint ref = IncrementRef(&context->ref); TRACEREF("%p increasing refcount to %u\n", context, ref); @@ -2733,9 +2865,9 @@ static ALCboolean VerifyContext(ALCcontext **context) UnlockLists(); return ALC_TRUE; } - ctx = ctx->next; + ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); } - dev = dev->next; + dev = ATOMIC_LOAD(&dev->next, almemory_order_relaxed); } UnlockLists(); @@ -2839,7 +2971,6 @@ void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends) for(;v < num_voices;v++) { ATOMIC_INIT(&voice->Update, NULL); - ATOMIC_INIT(&voice->FreeList, NULL); voice->Props = props; voices[v] = voice; @@ -3050,9 +3181,11 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *Device, ALCenum para static inline ALCsizei NumAttrsForDevice(ALCdevice *device) { - if(device->Type == Loopback && device->FmtChans == DevFmtAmbi3D) - return 25; - return 19; + if(device->Type == Capture) return 9; + if(device->Type != Loopback) return 29; + if(device->FmtChans == DevFmtAmbi3D) + return 35; + return 29; } static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values) @@ -3089,6 +3222,7 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC case ALC_AMBISONIC_LAYOUT_SOFT: case ALC_AMBISONIC_SCALING_SOFT: case ALC_AMBISONIC_ORDER_SOFT: + case ALC_MAX_AMBISONIC_ORDER_SOFT: alcSetError(NULL, ALC_INVALID_DEVICE); return 0; @@ -3103,6 +3237,39 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC { switch(param) { + case ALC_ATTRIBUTES_SIZE: + values[0] = NumAttrsForDevice(device); + return 1; + + case ALC_ALL_ATTRIBUTES: + if(size < NumAttrsForDevice(device)) + { + alcSetError(device, ALC_INVALID_VALUE); + return 0; + } + + i = 0; + almtx_lock(&device->BackendLock); + values[i++] = ALC_MAJOR_VERSION; + values[i++] = alcMajorVersion; + values[i++] = ALC_MINOR_VERSION; + values[i++] = alcMinorVersion; + values[i++] = ALC_CAPTURE_SAMPLES; + values[i++] = V0(device->Backend,availableSamples)(); + values[i++] = ALC_CONNECTED; + values[i++] = ATOMIC_LOAD(&device->Connected, almemory_order_relaxed); + almtx_unlock(&device->BackendLock); + + values[i++] = 0; + return i; + + case ALC_MAJOR_VERSION: + values[0] = alcMajorVersion; + return 1; + case ALC_MINOR_VERSION: + values[0] = alcMinorVersion; + return 1; + case ALC_CAPTURE_SAMPLES: almtx_lock(&device->BackendLock); values[0] = V0(device->Backend,availableSamples)(); @@ -3110,7 +3277,7 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC return 1; case ALC_CONNECTED: - values[0] = device->Connected; + values[0] = ATOMIC_LOAD(&device->Connected, almemory_order_acquire); return 1; default: @@ -3123,22 +3290,6 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC /* render device */ switch(param) { - case ALC_MAJOR_VERSION: - values[0] = alcMajorVersion; - return 1; - - case ALC_MINOR_VERSION: - values[0] = alcMinorVersion; - return 1; - - case ALC_EFX_MAJOR_VERSION: - values[0] = alcEFXMajorVersion; - return 1; - - case ALC_EFX_MINOR_VERSION: - values[0] = alcEFXMinorVersion; - return 1; - case ALC_ATTRIBUTES_SIZE: values[0] = NumAttrsForDevice(device); return 1; @@ -3152,9 +3303,17 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC i = 0; almtx_lock(&device->BackendLock); + values[i++] = ALC_MAJOR_VERSION; + values[i++] = alcMajorVersion; + values[i++] = ALC_MINOR_VERSION; + values[i++] = alcMinorVersion; + values[i++] = ALC_EFX_MAJOR_VERSION; + values[i++] = alcEFXMajorVersion; + values[i++] = ALC_EFX_MINOR_VERSION; + values[i++] = alcEFXMinorVersion; + values[i++] = ALC_FREQUENCY; values[i++] = device->Frequency; - if(device->Type != Loopback) { values[i++] = ALC_REFRESH; @@ -3201,11 +3360,30 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC values[i++] = ALC_OUTPUT_LIMITER_SOFT; values[i++] = device->Limiter ? ALC_TRUE : ALC_FALSE; + + values[i++] = ALC_MAX_AMBISONIC_ORDER_SOFT; + values[i++] = MAX_AMBI_ORDER; almtx_unlock(&device->BackendLock); values[i++] = 0; return i; + case ALC_MAJOR_VERSION: + values[0] = alcMajorVersion; + return 1; + + case ALC_MINOR_VERSION: + values[0] = alcMinorVersion; + return 1; + + case ALC_EFX_MAJOR_VERSION: + values[0] = alcEFXMajorVersion; + return 1; + + case ALC_EFX_MINOR_VERSION: + values[0] = alcEFXMinorVersion; + return 1; + case ALC_FREQUENCY: values[0] = device->Frequency; return 1; @@ -3288,7 +3466,7 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC return 1; case ALC_CONNECTED: - values[0] = device->Connected; + values[0] = ATOMIC_LOAD(&device->Connected, almemory_order_acquire); return 1; case ALC_HRTF_SOFT: @@ -3311,6 +3489,10 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC values[0] = device->Limiter ? ALC_TRUE : ALC_FALSE; return 1; + case ALC_MAX_AMBISONIC_ORDER_SOFT: + values[0] = MAX_AMBI_ORDER; + return 1; + default: alcSetError(device, ALC_INVALID_ENUM); return 0; @@ -3418,7 +3600,7 @@ ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, values[i++] = ALC_OUTPUT_LIMITER_SOFT; values[i++] = device->Limiter ? ALC_TRUE : ALC_FALSE; - clock = V0(device->Backend,getClockLatency)(); + clock = GetClockLatency(device); values[i++] = ALC_DEVICE_CLOCK_SOFT; values[i++] = clock.ClockTime; @@ -3444,7 +3626,7 @@ ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, case ALC_DEVICE_LATENCY_SOFT: almtx_lock(&device->BackendLock); - clock = V0(device->Backend,getClockLatency)(); + clock = GetClockLatency(device); almtx_unlock(&device->BackendLock); *values = clock.Latency; break; @@ -3455,7 +3637,7 @@ ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, else { almtx_lock(&device->BackendLock); - clock = V0(device->Backend,getClockLatency)(); + clock = GetClockLatency(device); almtx_unlock(&device->BackendLock); values[0] = clock.ClockTime; values[1] = clock.Latency; @@ -3591,7 +3773,8 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin * properly cleaned up after being made. */ LockLists(); - if(!VerifyDevice(&device) || device->Type == Capture || !device->Connected) + if(!VerifyDevice(&device) || device->Type == Capture || + !ATOMIC_LOAD(&device->Connected, almemory_order_relaxed)) { UnlockLists(); alcSetError(device, ALC_INVALID_DEVICE); @@ -3625,6 +3808,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin ALContext->MaxVoices = 0; ATOMIC_INIT(&ALContext->ActiveAuxSlots, NULL); ALContext->Device = device; + ATOMIC_INIT(&ALContext->next, NULL); if((err=UpdateDeviceParams(device, attrList)) != ALC_NO_ERROR) { @@ -3637,7 +3821,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin if(err == ALC_INVALID_DEVICE) { V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Device update failure"); V0(device->Backend,unlock)(); } ALCdevice_DecRef(device); @@ -3678,7 +3862,7 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin { ALCcontext *head = ATOMIC_LOAD_SEQ(&device->ContextList); do { - ALContext->next = head; + ATOMIC_STORE(&ALContext->next, head, almemory_order_relaxed); } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&device->ContextList, &head, ALContext) == 0); } @@ -3686,8 +3870,8 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin if(ALContext->DefaultSlot) { - if(InitializeEffect(device, ALContext->DefaultSlot, &DefaultEffect) == AL_NO_ERROR) - UpdateEffectSlotProps(ALContext->DefaultSlot); + if(InitializeEffect(ALContext, ALContext->DefaultSlot, &DefaultEffect) == AL_NO_ERROR) + UpdateEffectSlotProps(ALContext->DefaultSlot, ALContext); else ERR("Failed to initialize the default effect\n"); } @@ -3831,7 +4015,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) const ALCchar *fmt; ALCdevice *device; ALCenum err; - ALCsizei i; DO_INITCONFIG(); @@ -3861,48 +4044,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) } //Validate device - InitRef(&device->ref, 1); - device->Connected = ALC_TRUE; - device->Type = Playback; - ATOMIC_INIT(&device->LastError, ALC_NO_ERROR); - - device->Flags = 0; - device->Bs2b = NULL; - device->Uhj_Encoder = NULL; - device->Hrtf = NULL; - device->HrtfHandle = NULL; - VECTOR_INIT(device->HrtfList); - AL_STRING_INIT(device->HrtfName); - device->Render_Mode = NormalRender; - AL_STRING_INIT(device->DeviceName); - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - device->Limiter = NULL; - device->AvgSpeakerDist = 0.0f; - - ATOMIC_INIT(&device->ContextList, NULL); - - device->ClockBase = 0; - device->SamplesDone = 0; - - device->SourcesMax = 256; - device->AuxiliaryEffectSlotMax = 64; - device->NumAuxSends = DEFAULT_SENDS; - - InitUIntMap(&device->BufferMap, INT_MAX); - InitUIntMap(&device->EffectMap, INT_MAX); - InitUIntMap(&device->FilterMap, INT_MAX); - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } + InitDevice(device, Playback); //Set output format device->FmtChans = DevFmtChannelsDefault; @@ -3911,18 +4053,13 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) device->IsHeadphones = AL_FALSE; device->AmbiLayout = AmbiLayout_Default; device->AmbiScale = AmbiNorm_Default; + device->LimiterState = ALC_TRUE; device->NumUpdates = 3; device->UpdateSize = 1024; - factory = PlaybackBackend.getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Playback); - if(!device->Backend) - { - al_free(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - + device->SourcesMax = 256; + device->AuxiliaryEffectSlotMax = 64; + device->NumAuxSends = DEFAULT_SENDS; if(ConfigValueStr(deviceName, NULL, "channels", &fmt)) { @@ -4007,6 +4144,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) ConfigValueUInt(deviceName, NULL, "slots", &device->AuxiliaryEffectSlotMax); if(device->AuxiliaryEffectSlotMax == 0) device->AuxiliaryEffectSlotMax = 64; + else device->AuxiliaryEffectSlotMax = minu(device->AuxiliaryEffectSlotMax, INT_MAX); if(ConfigValueInt(deviceName, NULL, "sends", &device->NumAuxSends)) device->NumAuxSends = clampi( @@ -4016,15 +4154,22 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) device->NumStereoSources = 1; device->NumMonoSources = device->SourcesMax - device->NumStereoSources; + factory = PlaybackBackend.getFactory(); + device->Backend = V(factory,createBackend)(device, ALCbackend_Playback); + if(!device->Backend) + { + FreeDevice(device); + alcSetError(NULL, ALC_OUT_OF_MEMORY); + return NULL; + } + // Find a playback device to open if((err=V(device->Backend,open)(deviceName)) != ALC_NO_ERROR) { - DELETE_OBJ(device->Backend); - al_free(device); + FreeDevice(device); alcSetError(NULL, err); return NULL; } - almtx_init(&device->BackendLock, almtx_plain); if(ConfigValueStr(alstr_get_cstr(device->DeviceName), NULL, "ambi-format", &fmt)) { @@ -4047,12 +4192,10 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) ERR("Unsupported ambi-format: %s\n", fmt); } - device->Limiter = CreateDeviceLimiter(device); - { ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); do { - device->next = head; + ATOMIC_STORE(&device->next, head, almemory_order_relaxed); } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); } @@ -4066,7 +4209,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName) */ ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) { - ALCdevice *iter, *origdev; + ALCdevice *iter, *origdev, *nextdev; ALCcontext *ctx; LockLists(); @@ -4074,7 +4217,8 @@ ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) do { if(iter == device) break; - } while((iter=iter->next) != NULL); + iter = ATOMIC_LOAD(&iter->next, almemory_order_relaxed); + } while(iter != NULL); if(!iter || iter->Type == Capture) { alcSetError(iter, ALC_INVALID_DEVICE); @@ -4084,25 +4228,21 @@ ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device) almtx_lock(&device->BackendLock); origdev = device; - if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, device->next)) + nextdev = ATOMIC_LOAD(&device->next, almemory_order_relaxed); + if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, nextdev)) { - ALCdevice *volatile*list = &origdev->next; - while(*list) - { - if(*list == device) - { - *list = (*list)->next; - break; - } - list = &(*list)->next; - } + ALCdevice *list; + do { + list = origdev; + origdev = device; + } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origdev, nextdev)); } UnlockLists(); ctx = ATOMIC_LOAD_SEQ(&device->ContextList); while(ctx != NULL) { - ALCcontext *next = ctx->next; + ALCcontext *next = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); WARN("Releasing context %p\n", ctx); ReleaseContext(ctx, device); ctx = next; @@ -4126,7 +4266,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, ALCbackendFactory *factory; ALCdevice *device = NULL; ALCenum err; - ALCsizei i; DO_INITCONFIG(); @@ -4153,53 +4292,18 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, } //Validate device - InitRef(&device->ref, 1); - device->Connected = ALC_TRUE; - device->Type = Capture; + InitDevice(device, Capture); - device->Hrtf = NULL; - device->HrtfHandle = NULL; - VECTOR_INIT(device->HrtfList); - AL_STRING_INIT(device->HrtfName); - - AL_STRING_INIT(device->DeviceName); - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - - InitUIntMap(&device->BufferMap, INT_MAX); - InitUIntMap(&device->EffectMap, INT_MAX); - InitUIntMap(&device->FilterMap, INT_MAX); - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } - - factory = CaptureBackend.getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Capture); - if(!device->Backend) - { - al_free(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - - device->Flags |= DEVICE_FREQUENCY_REQUEST; device->Frequency = frequency; + device->Flags |= DEVICE_FREQUENCY_REQUEST; - device->Flags |= DEVICE_CHANNELS_REQUEST | DEVICE_SAMPLE_TYPE_REQUEST; if(DecomposeDevFormat(format, &device->FmtChans, &device->FmtType) == AL_FALSE) { - al_free(device); + FreeDevice(device); alcSetError(NULL, ALC_INVALID_ENUM); return NULL; } + device->Flags |= DEVICE_CHANNELS_REQUEST | DEVICE_SAMPLE_TYPE_REQUEST; device->IsHeadphones = AL_FALSE; device->AmbiOrder = 0; device->AmbiLayout = AmbiLayout_Default; @@ -4208,22 +4312,30 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, device->UpdateSize = samples; device->NumUpdates = 1; + factory = CaptureBackend.getFactory(); + device->Backend = V(factory,createBackend)(device, ALCbackend_Capture); + if(!device->Backend) + { + FreeDevice(device); + alcSetError(NULL, ALC_OUT_OF_MEMORY); + return NULL; + } + TRACE("Capture format: %s, %s, %uhz, %u update size x%d\n", DevFmtChannelsString(device->FmtChans), DevFmtTypeString(device->FmtType), device->Frequency, device->UpdateSize, device->NumUpdates ); if((err=V(device->Backend,open)(deviceName)) != ALC_NO_ERROR) { - al_free(device); + FreeDevice(device); alcSetError(NULL, err); return NULL; } - almtx_init(&device->BackendLock, almtx_plain); { ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); do { - device->next = head; + ATOMIC_STORE(&device->next, head, almemory_order_relaxed); } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); } @@ -4233,14 +4345,15 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName, ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) { - ALCdevice *iter, *origdev; + ALCdevice *iter, *origdev, *nextdev; LockLists(); iter = ATOMIC_LOAD_SEQ(&DeviceList); do { if(iter == device) break; - } while((iter=iter->next) != NULL); + iter = ATOMIC_LOAD(&iter->next, almemory_order_relaxed); + } while(iter != NULL); if(!iter || iter->Type != Capture) { alcSetError(iter, ALC_INVALID_DEVICE); @@ -4249,21 +4362,23 @@ ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device) } origdev = device; - if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, device->next)) + nextdev = ATOMIC_LOAD(&device->next, almemory_order_relaxed); + if(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&DeviceList, &origdev, nextdev)) { - ALCdevice *volatile*list = &origdev->next; - while(*list) - { - if(*list == device) - { - *list = (*list)->next; - break; - } - list = &(*list)->next; - } + ALCdevice *list; + do { + list = origdev; + origdev = device; + } while(!ATOMIC_COMPARE_EXCHANGE_PTR_STRONG_SEQ(&list->next, &origdev, nextdev)); } UnlockLists(); + almtx_lock(&device->BackendLock); + if((device->Flags&DEVICE_RUNNING)) + V0(device->Backend,stop)(); + device->Flags &= ~DEVICE_RUNNING; + almtx_unlock(&device->BackendLock); + ALCdevice_DecRef(device); return ALC_TRUE; @@ -4276,7 +4391,7 @@ ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) else { almtx_lock(&device->BackendLock); - if(!device->Connected) + if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) alcSetError(device, ALC_INVALID_DEVICE); else if(!(device->Flags&DEVICE_RUNNING)) { @@ -4284,7 +4399,7 @@ ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device) device->Flags |= DEVICE_RUNNING; else { - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Device start failure"); alcSetError(device, ALC_INVALID_DEVICE); } } @@ -4342,7 +4457,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN { ALCbackendFactory *factory; ALCdevice *device; - ALCsizei i; DO_INITCONFIG(); @@ -4361,59 +4475,12 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN } //Validate device - InitRef(&device->ref, 1); - device->Connected = ALC_TRUE; - device->Type = Loopback; - ATOMIC_INIT(&device->LastError, ALC_NO_ERROR); - - device->Flags = 0; - device->Hrtf = NULL; - device->HrtfHandle = NULL; - VECTOR_INIT(device->HrtfList); - AL_STRING_INIT(device->HrtfName); - device->Bs2b = NULL; - device->Uhj_Encoder = NULL; - device->Render_Mode = NormalRender; - AL_STRING_INIT(device->DeviceName); - device->Dry.Buffer = NULL; - device->Dry.NumChannels = 0; - device->FOAOut.Buffer = NULL; - device->FOAOut.NumChannels = 0; - device->RealOut.Buffer = NULL; - device->RealOut.NumChannels = 0; - device->Limiter = NULL; - device->AvgSpeakerDist = 0.0f; - - ATOMIC_INIT(&device->ContextList, NULL); - - device->ClockBase = 0; - device->SamplesDone = 0; + InitDevice(device, Loopback); device->SourcesMax = 256; device->AuxiliaryEffectSlotMax = 64; device->NumAuxSends = DEFAULT_SENDS; - InitUIntMap(&device->BufferMap, INT_MAX); - InitUIntMap(&device->EffectMap, INT_MAX); - InitUIntMap(&device->FilterMap, INT_MAX); - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - device->ChannelDelay[i].Gain = 1.0f; - device->ChannelDelay[i].Length = 0; - device->ChannelDelay[i].Buffer = NULL; - } - - factory = ALCloopbackFactory_getFactory(); - device->Backend = V(factory,createBackend)(device, ALCbackend_Loopback); - if(!device->Backend) - { - al_free(device); - alcSetError(NULL, ALC_OUT_OF_MEMORY); - return NULL; - } - almtx_init(&device->BackendLock, almtx_plain); - //Set output format device->NumUpdates = 0; device->UpdateSize = 0; @@ -4430,6 +4497,7 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN ConfigValueUInt(NULL, NULL, "slots", &device->AuxiliaryEffectSlotMax); if(device->AuxiliaryEffectSlotMax == 0) device->AuxiliaryEffectSlotMax = 64; + else device->AuxiliaryEffectSlotMax = minu(device->AuxiliaryEffectSlotMax, INT_MAX); if(ConfigValueInt(NULL, NULL, "sends", &device->NumAuxSends)) device->NumAuxSends = clampi( @@ -4439,15 +4507,22 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN device->NumStereoSources = 1; device->NumMonoSources = device->SourcesMax - device->NumStereoSources; + factory = ALCloopbackFactory_getFactory(); + device->Backend = V(factory,createBackend)(device, ALCbackend_Loopback); + if(!device->Backend) + { + al_free(device); + alcSetError(NULL, ALC_OUT_OF_MEMORY); + return NULL; + } + // Open the "backend" V(device->Backend,open)("Loopback"); - device->Limiter = CreateDeviceLimiter(device); - { ALCdevice *head = ATOMIC_LOAD_SEQ(&DeviceList); do { - device->next = head; + ATOMIC_STORE(&device->next, head, almemory_order_relaxed); } while(!ATOMIC_COMPARE_EXCHANGE_PTR_WEAK_SEQ(&DeviceList, &head, device)); } @@ -4498,28 +4573,6 @@ FORCE_ALIGN ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, AL } -/************************************************ - * ALC loopback2 functions - ************************************************/ - -ALC_API ALCboolean ALC_APIENTRY alcIsAmbisonicFormatSupportedSOFT(ALCdevice *device, ALCenum layout, ALCenum scaling, ALsizei order) -{ - ALCboolean ret = ALC_FALSE; - - if(!VerifyDevice(&device) || device->Type != Loopback) - alcSetError(device, ALC_INVALID_DEVICE); - else if(order <= 0) - alcSetError(device, ALC_INVALID_VALUE); - else - { - if(IsValidAmbiLayout(layout) && IsValidAmbiScaling(scaling) && order <= MAX_AMBI_ORDER) - ret = ALC_TRUE; - } - if(device) ALCdevice_DecRef(device); - - return ret; -} - /************************************************ * ALC DSP pause/resume functions ************************************************/ @@ -4564,10 +4617,10 @@ ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device) device->Flags |= DEVICE_RUNNING; else { - alcSetError(device, ALC_INVALID_DEVICE); V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Device start failure"); V0(device->Backend,unlock)(); + alcSetError(device, ALC_INVALID_DEVICE); } } } @@ -4618,7 +4671,8 @@ ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCi ALCenum err; LockLists(); - if(!VerifyDevice(&device) || device->Type == Capture || !device->Connected) + if(!VerifyDevice(&device) || device->Type == Capture || + !ATOMIC_LOAD(&device->Connected, almemory_order_relaxed)) { UnlockLists(); alcSetError(device, ALC_INVALID_DEVICE); @@ -4637,7 +4691,7 @@ ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCi if(err == ALC_INVALID_DEVICE) { V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Device start failure"); V0(device->Backend,unlock)(); } ALCdevice_DecRef(device); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/ALu.c b/love/src/jni/openal-soft-1.19.1/Alc/ALu.c similarity index 67% rename from love/src/jni/openal-soft-1.18.2/Alc/ALu.c rename to love/src/jni/openal-soft-1.19.1/Alc/ALu.c index fa9634b8..03abb116 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/ALu.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/ALu.c @@ -34,27 +34,21 @@ #include "alu.h" #include "bs2b.h" #include "hrtf.h" +#include "mastering.h" #include "uhjfilter.h" #include "bformatdec.h" #include "static_assert.h" +#include "ringbuffer.h" +#include "filters/splitter.h" -#include "mixer_defs.h" +#include "mixer/defs.h" +#include "fpu_modes.h" +#include "cpu_caps.h" +#include "bsinc_inc.h" #include "backends/base.h" -struct ChanMap { - enum Channel channel; - ALfloat angle; - ALfloat elevation; -}; - -/* Cone scalar */ -ALfloat ConeScale = 1.0f; - -/* Localized Z scalar for mono sources */ -ALfloat ZScale = 1.0f; - extern inline ALfloat minf(ALfloat a, ALfloat b); extern inline ALfloat maxf(ALfloat a, ALfloat b); extern inline ALfloat clampf(ALfloat val, ALfloat min, ALfloat max); @@ -79,8 +73,12 @@ extern inline ALuint64 minu64(ALuint64 a, ALuint64 b); extern inline ALuint64 maxu64(ALuint64 a, ALuint64 b); extern inline ALuint64 clampu64(ALuint64 val, ALuint64 min, ALuint64 max); +extern inline size_t minz(size_t a, size_t b); +extern inline size_t maxz(size_t a, size_t b); +extern inline size_t clampz(size_t val, size_t min, size_t max); + extern inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu); -extern inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALsizei frac); +extern inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu); extern inline void aluVectorSet(aluVector *restrict vector, ALfloat x, ALfloat y, ALfloat z, ALfloat w); @@ -92,6 +90,16 @@ extern inline void aluMatrixfSet(aluMatrixf *matrix, ALfloat m20, ALfloat m21, ALfloat m22, ALfloat m23, ALfloat m30, ALfloat m31, ALfloat m32, ALfloat m33); + +/* Cone scalar */ +ALfloat ConeScale = 1.0f; + +/* Localized Z scalar for mono sources */ +ALfloat ZScale = 1.0f; + +/* Force default speed of sound for distance-related reverb decay. */ +ALboolean OverrideReverbSpeedOfSound = AL_FALSE; + const aluMatrixf IdentityMatrixf = {{ { 1.0f, 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f, 0.0f }, @@ -100,28 +108,25 @@ const aluMatrixf IdentityMatrixf = {{ }}; +static void ClearArray(ALfloat f[MAX_OUTPUT_CHANNELS]) +{ + size_t i; + for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) + f[i] = 0.0f; +} + +struct ChanMap { + enum Channel channel; + ALfloat angle; + ALfloat elevation; +}; + +static HrtfDirectMixerFunc MixDirectHrtf = MixDirectHrtf_C; + + void DeinitVoice(ALvoice *voice) { - struct ALvoiceProps *props; - size_t count = 0; - - props = ATOMIC_EXCHANGE_PTR_SEQ(&voice->Update, NULL); - if(props) al_free(props); - - props = ATOMIC_EXCHANGE_PTR(&voice->FreeList, NULL, almemory_order_relaxed); - while(props) - { - struct ALvoiceProps *next; - next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - al_free(props); - props = next; - ++count; - } - /* This is excessively spammy if it traces every voice destruction, so just - * warn if it was unexpectedly large. - */ - if(count > 3) - WARN("Freed "SZFMT" voice property objects\n", count); + al_free(ATOMIC_EXCHANGE_PTR_SEQ(&voice->Update, NULL)); } @@ -140,16 +145,6 @@ static inline HrtfDirectMixerFunc SelectHrtfMixer(void) } -/* Prior to VS2013, MSVC lacks the round() family of functions. */ -#if defined(_MSC_VER) && _MSC_VER < 1800 -static float roundf(float val) -{ - if(val < 0.0f) - return ceilf(val-0.5f); - return floorf(val+0.5f); -} -#endif - /* This RNG method was created based on the math found in opusdec. It's quick, * and starting with a seed value of 22222, is suitable for generating * whitenoise. @@ -176,14 +171,16 @@ static inline ALfloat aluDotproduct(const aluVector *vec1, const aluVector *vec2 static ALfloat aluNormalize(ALfloat *vec) { ALfloat length = sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); - if(length > 0.0f) + if(length > FLT_EPSILON) { ALfloat inv_length = 1.0f/length; vec[0] *= inv_length; vec[1] *= inv_length; vec[2] *= inv_length; + return length; } - return length; + vec[0] = vec[1] = vec[2] = 0.0f; + return 0.0f; } static void aluMatrixfFloat3(ALfloat *vec, ALfloat w, const aluMatrixf *mtx) @@ -206,81 +203,188 @@ static aluVector aluMatrixfVector(const aluMatrixf *mtx, const aluVector *vec) } -/* Prepares the interpolator for a given rate (determined by increment). A - * result of AL_FALSE indicates that the filter output will completely cut - * the input signal. +void aluInit(void) +{ + MixDirectHrtf = SelectHrtfMixer(); +} + + +static void SendSourceStoppedEvent(ALCcontext *context, ALuint id) +{ + AsyncEvent evt = ASYNC_EVENT(EventType_SourceStateChange); + ALbitfieldSOFT enabledevt; + size_t strpos; + ALuint scale; + + enabledevt = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); + if(!(enabledevt&EventType_SourceStateChange)) return; + + evt.u.user.type = AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT; + evt.u.user.id = id; + evt.u.user.param = AL_STOPPED; + + /* Normally snprintf would be used, but this is called from the mixer and + * that function's not real-time safe, so we have to construct it manually. + */ + strcpy(evt.u.user.msg, "Source ID "); strpos = 10; + scale = 1000000000; + while(scale > 0 && scale > id) + scale /= 10; + while(scale > 0) + { + evt.u.user.msg[strpos++] = '0' + ((id/scale)%10); + scale /= 10; + } + strcpy(evt.u.user.msg+strpos, " state changed to AL_STOPPED"); + + if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) + alsem_post(&context->EventSem); +} + + +static void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo) +{ + DirectHrtfState *state; + int lidx, ridx; + ALsizei c; + + if(device->AmbiUp) + ambiup_process(device->AmbiUp, + device->Dry.Buffer, device->Dry.NumChannels, device->FOAOut.Buffer, + SamplesToDo + ); + + lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); + ridx = GetChannelIdxByName(&device->RealOut, FrontRight); + assert(lidx != -1 && ridx != -1); + + state = device->Hrtf; + for(c = 0;c < device->Dry.NumChannels;c++) + { + MixDirectHrtf(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], + device->Dry.Buffer[c], state->Offset, state->IrSize, + state->Chan[c].Coeffs, state->Chan[c].Values, SamplesToDo + ); + } + state->Offset += SamplesToDo; +} + +static void ProcessAmbiDec(ALCdevice *device, ALsizei SamplesToDo) +{ + if(device->Dry.Buffer != device->FOAOut.Buffer) + bformatdec_upSample(device->AmbiDecoder, + device->Dry.Buffer, device->FOAOut.Buffer, device->FOAOut.NumChannels, + SamplesToDo + ); + bformatdec_process(device->AmbiDecoder, + device->RealOut.Buffer, device->RealOut.NumChannels, device->Dry.Buffer, + SamplesToDo + ); +} + +static void ProcessAmbiUp(ALCdevice *device, ALsizei SamplesToDo) +{ + ambiup_process(device->AmbiUp, + device->RealOut.Buffer, device->RealOut.NumChannels, device->FOAOut.Buffer, + SamplesToDo + ); +} + +static void ProcessUhj(ALCdevice *device, ALsizei SamplesToDo) +{ + int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); + int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); + assert(lidx != -1 && ridx != -1); + + /* Encode to stereo-compatible 2-channel UHJ output. */ + EncodeUhj2(device->Uhj_Encoder, + device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], + device->Dry.Buffer, SamplesToDo + ); +} + +static void ProcessBs2b(ALCdevice *device, ALsizei SamplesToDo) +{ + int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); + int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); + assert(lidx != -1 && ridx != -1); + + /* Apply binaural/crossfeed filter */ + bs2b_cross_feed(device->Bs2b, device->RealOut.Buffer[lidx], + device->RealOut.Buffer[ridx], SamplesToDo); +} + +void aluSelectPostProcess(ALCdevice *device) +{ + if(device->HrtfHandle) + device->PostProcess = ProcessHrtf; + else if(device->AmbiDecoder) + device->PostProcess = ProcessAmbiDec; + else if(device->AmbiUp) + device->PostProcess = ProcessAmbiUp; + else if(device->Uhj_Encoder) + device->PostProcess = ProcessUhj; + else if(device->Bs2b) + device->PostProcess = ProcessBs2b; + else + device->PostProcess = NULL; +} + + +/* Prepares the interpolator for a given rate (determined by increment). * * With a bit of work, and a trade of memory for CPU cost, this could be * modified for use with an interpolated increment for buttery-smooth pitch * changes. */ -ALboolean BsincPrepare(const ALuint increment, BsincState *state) +void BsincPrepare(const ALuint increment, BsincState *state, const BSincTable *table) { - static const ALfloat scaleBase = 1.510578918e-01f, scaleRange = 1.177936623e+00f; - static const ALuint m[BSINC_SCALE_COUNT] = { 24, 24, 24, 24, 24, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 12 }; - static const ALuint to[4][BSINC_SCALE_COUNT] = - { - { 0, 24, 408, 792, 1176, 1560, 1944, 2328, 2648, 2968, 3288, 3544, 3800, 4056, 4248, 4440 }, - { 4632, 5016, 5400, 5784, 6168, 6552, 6936, 7320, 7640, 7960, 8280, 8536, 8792, 9048, 9240, 0 }, - { 0, 9432, 9816, 10200, 10584, 10968, 11352, 11736, 12056, 12376, 12696, 12952, 13208, 13464, 13656, 13848 }, - { 14040, 14424, 14808, 15192, 15576, 15960, 16344, 16728, 17048, 17368, 17688, 17944, 18200, 18456, 18648, 0 } - }; - static const ALuint tm[2][BSINC_SCALE_COUNT] = - { - { 0, 24, 24, 24, 24, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 12 }, - { 24, 24, 24, 24, 24, 24, 24, 20, 20, 20, 16, 16, 16, 12, 12, 0 } - }; - ALfloat sf; - ALsizei si, pi; - ALboolean uncut = AL_TRUE; + ALfloat sf = 0.0f; + ALsizei si = BSINC_SCALE_COUNT-1; if(increment > FRACTIONONE) { sf = (ALfloat)FRACTIONONE / increment; - if(sf < scaleBase) - { - /* Signal has been completely cut. The return result can be used - * to skip the filter (and output zeros) as an optimization. - */ - sf = 0.0f; - si = 0; - uncut = AL_FALSE; - } - else - { - sf = (BSINC_SCALE_COUNT - 1) * (sf - scaleBase) * scaleRange; - si = fastf2i(sf); - /* The interpolation factor is fit to this diagonally-symmetric - * curve to reduce the transition ripple caused by interpolating - * different scales of the sinc function. - */ - sf = 1.0f - cosf(asinf(sf - si)); - } - } - else - { - sf = 0.0f; - si = BSINC_SCALE_COUNT - 1; + sf = maxf(0.0f, (BSINC_SCALE_COUNT-1) * (sf-table->scaleBase) * table->scaleRange); + si = float2int(sf); + /* The interpolation factor is fit to this diagonally-symmetric curve + * to reduce the transition ripple caused by interpolating different + * scales of the sinc function. + */ + sf = 1.0f - cosf(asinf(sf - si)); } state->sf = sf; - state->m = m[si]; - state->l = -(ALint)((m[si] / 2) - 1); - /* The CPU cost of this table re-mapping could be traded for the memory - * cost of a complete table map (1024 elements large). - */ - for(pi = 0;pi < BSINC_PHASE_COUNT;pi++) - { - state->coeffs[pi].filter = &bsincTab[to[0][si] + tm[0][si]*pi]; - state->coeffs[pi].scDelta = &bsincTab[to[1][si] + tm[1][si]*pi]; - state->coeffs[pi].phDelta = &bsincTab[to[2][si] + tm[0][si]*pi]; - state->coeffs[pi].spDelta = &bsincTab[to[3][si] + tm[1][si]*pi]; - } - return uncut; + state->m = table->m[si]; + state->l = (state->m/2) - 1; + state->filter = table->Tab + table->filterOffset[si]; } -static ALboolean CalcListenerParams(ALCcontext *Context) +static bool CalcContextParams(ALCcontext *Context) +{ + ALlistener *Listener = Context->Listener; + struct ALcontextProps *props; + + props = ATOMIC_EXCHANGE_PTR(&Context->Update, NULL, almemory_order_acq_rel); + if(!props) return false; + + Listener->Params.MetersPerUnit = props->MetersPerUnit; + + Listener->Params.DopplerFactor = props->DopplerFactor; + Listener->Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity; + if(!OverrideReverbSpeedOfSound) + Listener->Params.ReverbSpeedOfSound = Listener->Params.SpeedOfSound * + Listener->Params.MetersPerUnit; + + Listener->Params.SourceDistanceModel = props->SourceDistanceModel; + Listener->Params.DistanceModel = props->DistanceModel; + + ATOMIC_REPLACE_HEAD(struct ALcontextProps*, &Context->FreeContextProps, props); + return true; +} + +static bool CalcListenerParams(ALCcontext *Context) { ALlistener *Listener = Context->Listener; ALfloat N[3], V[3], U[3], P[3]; @@ -288,7 +392,7 @@ static ALboolean CalcListenerParams(ALCcontext *Context) aluVector vel; props = ATOMIC_EXCHANGE_PTR(&Listener->Update, NULL, almemory_order_acq_rel); - if(!props) return AL_FALSE; + if(!props) return false; /* AT then UP */ N[0] = props->Forward[0]; @@ -320,57 +424,86 @@ static ALboolean CalcListenerParams(ALCcontext *Context) Listener->Params.Velocity = aluMatrixfVector(&Listener->Params.Matrix, &vel); Listener->Params.Gain = props->Gain * Context->GainBoost; - Listener->Params.MetersPerUnit = props->MetersPerUnit; - Listener->Params.DopplerFactor = props->DopplerFactor; - Listener->Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity; - - Listener->Params.SourceDistanceModel = props->SourceDistanceModel; - Listener->Params.DistanceModel = props->DistanceModel; - - ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &Listener->FreeList, props); - return AL_TRUE; + ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &Context->FreeListenerProps, props); + return true; } -static ALboolean CalcEffectSlotParams(ALeffectslot *slot, ALCdevice *device) +static bool CalcEffectSlotParams(ALeffectslot *slot, ALCcontext *context, bool force) { struct ALeffectslotProps *props; ALeffectState *state; props = ATOMIC_EXCHANGE_PTR(&slot->Update, NULL, almemory_order_acq_rel); - if(!props) return AL_FALSE; + if(!props && !force) return false; - slot->Params.Gain = props->Gain; - slot->Params.AuxSendAuto = props->AuxSendAuto; - slot->Params.EffectType = props->Type; - if(IsReverbEffect(slot->Params.EffectType)) + if(props) { - slot->Params.RoomRolloff = props->Props.Reverb.RoomRolloffFactor; - slot->Params.DecayTime = props->Props.Reverb.DecayTime; - slot->Params.DecayHFRatio = props->Props.Reverb.DecayHFRatio; - slot->Params.DecayHFLimit = props->Props.Reverb.DecayHFLimit; - slot->Params.AirAbsorptionGainHF = props->Props.Reverb.AirAbsorptionGainHF; + slot->Params.Gain = props->Gain; + slot->Params.AuxSendAuto = props->AuxSendAuto; + slot->Params.EffectType = props->Type; + slot->Params.EffectProps = props->Props; + if(IsReverbEffect(props->Type)) + { + slot->Params.RoomRolloff = props->Props.Reverb.RoomRolloffFactor; + slot->Params.DecayTime = props->Props.Reverb.DecayTime; + slot->Params.DecayLFRatio = props->Props.Reverb.DecayLFRatio; + slot->Params.DecayHFRatio = props->Props.Reverb.DecayHFRatio; + slot->Params.DecayHFLimit = props->Props.Reverb.DecayHFLimit; + slot->Params.AirAbsorptionGainHF = props->Props.Reverb.AirAbsorptionGainHF; + } + else + { + slot->Params.RoomRolloff = 0.0f; + slot->Params.DecayTime = 0.0f; + slot->Params.DecayLFRatio = 0.0f; + slot->Params.DecayHFRatio = 0.0f; + slot->Params.DecayHFLimit = AL_FALSE; + slot->Params.AirAbsorptionGainHF = 1.0f; + } + + state = props->State; + + if(state == slot->Params.EffectState) + { + /* If the effect state is the same as current, we can decrement its + * count safely to remove it from the update object (it can't reach + * 0 refs since the current params also hold a reference). + */ + DecrementRef(&state->Ref); + props->State = NULL; + } + else + { + /* Otherwise, replace it and send off the old one with a release + * event. + */ + AsyncEvent evt = ASYNC_EVENT(EventType_ReleaseEffectState); + evt.u.EffectState = slot->Params.EffectState; + + slot->Params.EffectState = state; + props->State = NULL; + + if(LIKELY(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) != 0)) + alsem_post(&context->EventSem); + else + { + /* If writing the event failed, the queue was probably full. + * Store the old state in the property object where it can + * eventually be cleaned up sometime later (not ideal, but + * better than blocking or leaking). + */ + props->State = evt.u.EffectState; + } + } + + ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &context->FreeEffectslotProps, props); } else - { - slot->Params.RoomRolloff = 0.0f; - slot->Params.DecayTime = 0.0f; - slot->Params.DecayHFRatio = 0.0f; - slot->Params.DecayHFLimit = AL_FALSE; - slot->Params.AirAbsorptionGainHF = 1.0f; - } + state = slot->Params.EffectState; - /* Swap effect states. No need to play with the ref counts since they keep - * the same number of refs. - */ - state = props->State; - props->State = slot->Params.EffectState; - slot->Params.EffectState = state; - - V(state,update)(device, slot, &props->Props); - - ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &slot->FreeList, props); - return AL_TRUE; + V(state,update)(context, slot, &slot->Params.EffectProps); + return true; } @@ -410,13 +543,14 @@ static const struct ChanMap MonoMap[1] = { { SideRight, DEG2RAD( 90.0f), DEG2RAD(0.0f) } }; -static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ALfloat *Dir, - const ALfloat Spread, const ALfloat DryGain, - const ALfloat DryGainHF, const ALfloat DryGainLF, - const ALfloat *WetGain, const ALfloat *WetGainLF, - const ALfloat *WetGainHF, ALeffectslot **SendSlots, - const ALbuffer *Buffer, const struct ALvoiceProps *props, - const ALlistener *Listener, const ALCdevice *Device) +static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev, + const ALfloat Distance, const ALfloat Spread, + const ALfloat DryGain, const ALfloat DryGainHF, + const ALfloat DryGainLF, const ALfloat *WetGain, + const ALfloat *WetGainLF, const ALfloat *WetGainHF, + ALeffectslot **SendSlots, const ALbuffer *Buffer, + const struct ALvoiceProps *props, const ALlistener *Listener, + const ALCdevice *Device) { struct ChanMap StereoMap[2] = { { FrontLeft, DEG2RAD(-30.0f), DEG2RAD(0.0f) }, @@ -429,7 +563,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ALsizei num_channels = 0; bool isbformat = false; ALfloat downmix_gain = 1.0f; - ALsizei c, i, j; + ALsizei c, i; switch(Buffer->FmtChannels) { @@ -496,6 +630,18 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const break; } + for(c = 0;c < num_channels;c++) + { + memset(&voice->Direct.Params[c].Hrtf.Target, 0, + sizeof(voice->Direct.Params[c].Hrtf.Target)); + ClearArray(voice->Direct.Params[c].Gains.Target); + } + for(i = 0;i < NumSends;i++) + { + for(c = 0;c < num_channels;c++) + ClearArray(voice->Send[i].Params[c].Gains.Target); + } + voice->Flags &= ~(VOICE_HAS_HRTF | VOICE_HAS_NFC); if(isbformat) { @@ -509,7 +655,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const */ ALfloat coeffs[MAX_AMBI_COEFFS]; - if(Device->AvgSpeakerDist > 0.0f && Listener->Params.MetersPerUnit > 0.0f) + if(Device->AvgSpeakerDist > 0.0f) { ALfloat mdist = Distance * Listener->Params.MetersPerUnit; ALfloat w0 = SPEEDOFSOUNDMETRESPERSEC / @@ -522,48 +668,30 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const w0 = minf(w0, w1*4.0f); /* Only need to adjust the first channel of a B-Format source. */ - NfcFilterAdjust1(&voice->Direct.Params[0].NFCtrlFilter[0], w0); - NfcFilterAdjust2(&voice->Direct.Params[0].NFCtrlFilter[1], w0); - NfcFilterAdjust3(&voice->Direct.Params[0].NFCtrlFilter[2], w0); + NfcFilterAdjust(&voice->Direct.Params[0].NFCtrlFilter, w0); for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; + voice->Direct.ChannelsPerOrder[i] = Device->NumChannelsPerOrder[i]; voice->Flags |= VOICE_HAS_NFC; } - if(Device->Render_Mode == StereoPair) - { - ALfloat ev = asinf(Dir[1]); - ALfloat az = atan2f(Dir[0], -Dir[2]); - CalcAnglePairwiseCoeffs(az, ev, Spread, coeffs); - } - else - CalcDirectionCoeffs(Dir, Spread, coeffs); + /* A scalar of 1.5 for plain stereo results in +/-60 degrees being + * moved to +/-90 degrees for direct right and left speaker + * responses. + */ + CalcAngleCoeffs((Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(Azi, 1.5f) : Azi, + Elev, Spread, coeffs); /* NOTE: W needs to be scaled by sqrt(2) due to FuMa normalization. */ - ComputePanningGains(Device->Dry, coeffs, DryGain*1.414213562f, - voice->Direct.Params[0].Gains.Target); - for(c = 1;c < num_channels;c++) - { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - voice->Direct.Params[c].Gains.Target[j] = 0.0f; - } - + ComputePanGains(&Device->Dry, coeffs, DryGain*SQRTF_2, + voice->Direct.Params[0].Gains.Target); for(i = 0;i < NumSends;i++) { const ALeffectslot *Slot = SendSlots[i]; if(Slot) - ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, - coeffs, WetGain[i]*1.414213562f, voice->Send[i].Params[0].Gains.Target + ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, + WetGain[i]*SQRTF_2, voice->Send[i].Params[0].Gains.Target ); - else - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[0].Gains.Target[j] = 0.0f; - for(c = 1;c < num_channels;c++) - { - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - } } } else @@ -573,7 +701,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const */ ALfloat N[3], V[3], U[3]; aluMatrixf matrix; - ALfloat scale; if(Device->AvgSpeakerDist > 0.0f) { @@ -581,14 +708,12 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const * is what we want for FOA input. The first channel may have * been previously re-adjusted if panned, so reset it. */ - NfcFilterAdjust1(&voice->Direct.Params[0].NFCtrlFilter[0], 0.0f); - NfcFilterAdjust2(&voice->Direct.Params[0].NFCtrlFilter[1], 0.0f); - NfcFilterAdjust3(&voice->Direct.Params[0].NFCtrlFilter[2], 0.0f); + NfcFilterAdjust(&voice->Direct.Params[0].NFCtrlFilter, 0.0f); voice->Direct.ChannelsPerOrder[0] = 1; voice->Direct.ChannelsPerOrder[1] = mini(voice->Direct.Channels-1, 3); for(i = 2;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[2] = 0; + voice->Direct.ChannelsPerOrder[i] = 0; voice->Flags |= VOICE_HAS_NFC; } @@ -611,36 +736,33 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const aluCrossproduct(N, V, U); aluNormalize(U); - /* Build a rotate + conversion matrix (FuMa -> ACN+N3D). */ - scale = 1.732050808f; + /* Build a rotate + conversion matrix (FuMa -> ACN+N3D). NOTE: This + * matrix is transposed, for the inputs to align on the rows and + * outputs on the columns. + */ aluMatrixfSet(&matrix, - 1.414213562f, 0.0f, 0.0f, 0.0f, - 0.0f, -N[0]*scale, N[1]*scale, -N[2]*scale, - 0.0f, U[0]*scale, -U[1]*scale, U[2]*scale, - 0.0f, -V[0]*scale, V[1]*scale, -V[2]*scale + // ACN0 ACN1 ACN2 ACN3 + SQRTF_2, 0.0f, 0.0f, 0.0f, // Ambi W + 0.0f, -N[0]*SQRTF_3, N[1]*SQRTF_3, -N[2]*SQRTF_3, // Ambi X + 0.0f, U[0]*SQRTF_3, -U[1]*SQRTF_3, U[2]*SQRTF_3, // Ambi Y + 0.0f, -V[0]*SQRTF_3, V[1]*SQRTF_3, -V[2]*SQRTF_3 // Ambi Z ); voice->Direct.Buffer = Device->FOAOut.Buffer; voice->Direct.Channels = Device->FOAOut.NumChannels; for(c = 0;c < num_channels;c++) - ComputeFirstOrderGains(Device->FOAOut, matrix.m[c], DryGain, - voice->Direct.Params[c].Gains.Target); + ComputePanGains(&Device->FOAOut, matrix.m[c], DryGain, + voice->Direct.Params[c].Gains.Target); for(i = 0;i < NumSends;i++) { const ALeffectslot *Slot = SendSlots[i]; if(Slot) { for(c = 0;c < num_channels;c++) - ComputeFirstOrderGainsBF(Slot->ChanMap, Slot->NumChannels, + ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, matrix.m[c], WetGain[i], voice->Send[i].Params[c].Gains.Target ); } - else - { - for(c = 0;c < num_channels;c++) - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - } } } } @@ -654,11 +776,8 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const for(c = 0;c < num_channels;c++) { - int idx; - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - voice->Direct.Params[c].Gains.Target[j] = 0.0f; - if((idx=GetChannelIdxByName(Device->RealOut, chans[c].channel)) != -1) - voice->Direct.Params[c].Gains.Target[idx] = DryGain; + int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); + if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; } /* Auxiliary sends still use normal channel panning since they mix to @@ -676,9 +795,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target ); - else - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; } } } @@ -693,15 +809,11 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const if(Distance > FLT_EPSILON) { ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat ev, az; - - ev = asinf(Dir[1]); - az = atan2f(Dir[0], -Dir[2]); /* Get the HRIR coefficients and delays just once, for the given * source direction. */ - GetHrtfCoeffs(Device->HrtfHandle, ev, az, Spread, + GetHrtfCoeffs(Device->HrtfHandle, Elev, Azi, Spread, voice->Direct.Params[0].Hrtf.Target.Coeffs, voice->Direct.Params[0].Hrtf.Target.Delay); voice->Direct.Params[0].Hrtf.Target.Gain = DryGain * downmix_gain; @@ -710,17 +822,14 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const for(c = 1;c < num_channels;c++) { /* Skip LFE */ - if(chans[c].channel == LFE) - memset(&voice->Direct.Params[c].Hrtf.Target, 0, - sizeof(voice->Direct.Params[c].Hrtf.Target)); - else + if(chans[c].channel != LFE) voice->Direct.Params[c].Hrtf.Target = voice->Direct.Params[0].Hrtf.Target; } /* Calculate the directional coefficients once, which apply to all * input channels of the source sends. */ - CalcDirectionCoeffs(Dir, Spread, coeffs); + CalcAngleCoeffs(Azi, Elev, Spread, coeffs); for(i = 0;i < NumSends;i++) { @@ -729,18 +838,12 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const for(c = 0;c < num_channels;c++) { /* Skip LFE */ - if(chans[c].channel == LFE) - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - else + if(chans[c].channel != LFE) ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, WetGain[i] * downmix_gain, voice->Send[i].Params[c].Gains.Target ); } - else - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; } } else @@ -756,13 +859,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const if(chans[c].channel == LFE) { /* Skip LFE */ - memset(&voice->Direct.Params[c].Hrtf.Target, 0, - sizeof(voice->Direct.Params[c].Hrtf.Target)); - for(i = 0;i < NumSends;i++) - { - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - } continue; } @@ -786,9 +882,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target ); - else - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; } } } @@ -805,7 +898,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ALfloat w0 = 0.0f; /* Calculate NFC filter coefficient if needed. */ - if(Device->AvgSpeakerDist > 0.0f && Listener->Params.MetersPerUnit > 0.0f) + if(Device->AvgSpeakerDist > 0.0f) { ALfloat mdist = Distance * Listener->Params.MetersPerUnit; ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / @@ -817,49 +910,36 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const */ w0 = minf(w0, w1*4.0f); + /* Adjust NFC filters. */ + for(c = 0;c < num_channels;c++) + NfcFilterAdjust(&voice->Direct.Params[c].NFCtrlFilter, w0); + for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; + voice->Direct.ChannelsPerOrder[i] = Device->NumChannelsPerOrder[i]; voice->Flags |= VOICE_HAS_NFC; } /* Calculate the directional coefficients once, which apply to all * input channels. */ - if(Device->Render_Mode == StereoPair) - { - ALfloat ev = asinf(Dir[1]); - ALfloat az = atan2f(Dir[0], -Dir[2]); - CalcAnglePairwiseCoeffs(az, ev, Spread, coeffs); - } - else - CalcDirectionCoeffs(Dir, Spread, coeffs); + CalcAngleCoeffs((Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(Azi, 1.5f) : Azi, + Elev, Spread, coeffs); for(c = 0;c < num_channels;c++) { - /* Adjust NFC filters if needed. */ - if((voice->Flags&VOICE_HAS_NFC)) - { - NfcFilterAdjust1(&voice->Direct.Params[c].NFCtrlFilter[0], w0); - NfcFilterAdjust2(&voice->Direct.Params[c].NFCtrlFilter[1], w0); - NfcFilterAdjust3(&voice->Direct.Params[c].NFCtrlFilter[2], w0); - } - /* Special-case LFE */ if(chans[c].channel == LFE) { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - voice->Direct.Params[c].Gains.Target[j] = 0.0f; if(Device->Dry.Buffer == Device->RealOut.Buffer) { - int idx = GetChannelIdxByName(Device->RealOut, chans[c].channel); + int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; } continue; } - ComputePanningGains(Device->Dry, - coeffs, DryGain * downmix_gain, voice->Direct.Params[c].Gains.Target - ); + ComputePanGains(&Device->Dry, coeffs, DryGain * downmix_gain, + voice->Direct.Params[c].Gains.Target); } for(i = 0;i < NumSends;i++) @@ -869,21 +949,12 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const for(c = 0;c < num_channels;c++) { /* Skip LFE */ - if(chans[c].channel == LFE) - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - else + if(chans[c].channel != LFE) ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, WetGain[i] * downmix_gain, voice->Send[i].Params[c].Gains.Target ); } - else - for(c = 0;c < num_channels;c++) - { - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - } } } else @@ -900,8 +971,11 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const w0 = SPEEDOFSOUNDMETRESPERSEC / (Device->AvgSpeakerDist * (ALfloat)Device->Frequency); + for(c = 0;c < num_channels;c++) + NfcFilterAdjust(&voice->Direct.Params[c].NFCtrlFilter, w0); + for(i = 0;i < MAX_AMBI_ORDER+1;i++) - voice->Direct.ChannelsPerOrder[i] = Device->Dry.NumChannelsPerOrder[i]; + voice->Direct.ChannelsPerOrder[i] = Device->NumChannelsPerOrder[i]; voice->Flags |= VOICE_HAS_NFC; } @@ -909,40 +983,25 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const { ALfloat coeffs[MAX_AMBI_COEFFS]; - if((voice->Flags&VOICE_HAS_NFC)) - { - NfcFilterAdjust1(&voice->Direct.Params[c].NFCtrlFilter[0], w0); - NfcFilterAdjust2(&voice->Direct.Params[c].NFCtrlFilter[1], w0); - NfcFilterAdjust3(&voice->Direct.Params[c].NFCtrlFilter[2], w0); - } - /* Special-case LFE */ if(chans[c].channel == LFE) { - for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) - voice->Direct.Params[c].Gains.Target[j] = 0.0f; if(Device->Dry.Buffer == Device->RealOut.Buffer) { - int idx = GetChannelIdxByName(Device->RealOut, chans[c].channel); + int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel); if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain; } - - for(i = 0;i < NumSends;i++) - { - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; - } continue; } - if(Device->Render_Mode == StereoPair) - CalcAnglePairwiseCoeffs(chans[c].angle, chans[c].elevation, Spread, coeffs); - else - CalcAngleCoeffs(chans[c].angle, chans[c].elevation, Spread, coeffs); - ComputePanningGains(Device->Dry, - coeffs, DryGain, voice->Direct.Params[c].Gains.Target + CalcAngleCoeffs( + (Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(chans[c].angle, 3.0f) + : chans[c].angle, + chans[c].elevation, Spread, coeffs ); + ComputePanGains(&Device->Dry, coeffs, DryGain, + voice->Direct.Params[c].Gains.Target); for(i = 0;i < NumSends;i++) { const ALeffectslot *Slot = SendSlots[i]; @@ -950,9 +1009,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target ); - else - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) - voice->Send[i].Params[c].Gains.Target[j] = 0.0f; } } } @@ -967,20 +1023,20 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const voice->Direct.FilterType = AF_None; if(gainHF != 1.0f) voice->Direct.FilterType |= AF_LowPass; if(gainLF != 1.0f) voice->Direct.FilterType |= AF_HighPass; - ALfilterState_setParams( - &voice->Direct.Params[0].LowPass, ALfilterType_HighShelf, + BiquadFilter_setParams( + &voice->Direct.Params[0].LowPass, BiquadType_HighShelf, gainHF, hfScale, calc_rcpQ_from_slope(gainHF, 1.0f) ); - ALfilterState_setParams( - &voice->Direct.Params[0].HighPass, ALfilterType_LowShelf, + BiquadFilter_setParams( + &voice->Direct.Params[0].HighPass, BiquadType_LowShelf, gainLF, lfScale, calc_rcpQ_from_slope(gainLF, 1.0f) ); for(c = 1;c < num_channels;c++) { - ALfilterState_copyParams(&voice->Direct.Params[c].LowPass, - &voice->Direct.Params[0].LowPass); - ALfilterState_copyParams(&voice->Direct.Params[c].HighPass, - &voice->Direct.Params[0].HighPass); + BiquadFilter_copyParams(&voice->Direct.Params[c].LowPass, + &voice->Direct.Params[0].LowPass); + BiquadFilter_copyParams(&voice->Direct.Params[c].HighPass, + &voice->Direct.Params[0].HighPass); } } for(i = 0;i < NumSends;i++) @@ -993,27 +1049,26 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const voice->Send[i].FilterType = AF_None; if(gainHF != 1.0f) voice->Send[i].FilterType |= AF_LowPass; if(gainLF != 1.0f) voice->Send[i].FilterType |= AF_HighPass; - ALfilterState_setParams( - &voice->Send[i].Params[0].LowPass, ALfilterType_HighShelf, + BiquadFilter_setParams( + &voice->Send[i].Params[0].LowPass, BiquadType_HighShelf, gainHF, hfScale, calc_rcpQ_from_slope(gainHF, 1.0f) ); - ALfilterState_setParams( - &voice->Send[i].Params[0].HighPass, ALfilterType_LowShelf, + BiquadFilter_setParams( + &voice->Send[i].Params[0].HighPass, BiquadType_LowShelf, gainLF, lfScale, calc_rcpQ_from_slope(gainLF, 1.0f) ); for(c = 1;c < num_channels;c++) { - ALfilterState_copyParams(&voice->Send[i].Params[c].LowPass, - &voice->Send[i].Params[0].LowPass); - ALfilterState_copyParams(&voice->Send[i].Params[c].HighPass, - &voice->Send[i].Params[0].HighPass); + BiquadFilter_copyParams(&voice->Send[i].Params[c].LowPass, + &voice->Send[i].Params[0].LowPass); + BiquadFilter_copyParams(&voice->Send[i].Params[c].HighPass, + &voice->Send[i].Params[0].HighPass); } } } static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext) { - static const ALfloat dir[3] = { 0.0f, 0.0f, -1.0f }; const ALCdevice *Device = ALContext->Device; const ALlistener *Listener = ALContext->Listener; ALfloat DryGain, DryGainHF, DryGainLF; @@ -1049,8 +1104,11 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p if(Pitch > (ALfloat)MAX_PITCH) voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + voice->Step = maxi(fastf2i(Pitch * FRACTIONONE), 1); + if(props->Resampler == BSinc24Resampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc24); + else if(props->Resampler == BSinc12Resampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc12); voice->Resampler = SelectResampler(props->Resampler); /* Calculate gains */ @@ -1068,7 +1126,7 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p WetGainLF[i] = props->Send[i].GainLF; } - CalcPanningAndFilters(voice, 0.0f, dir, 0.0f, DryGain, DryGainHF, DryGainLF, WetGain, + CalcPanningAndFilters(voice, 0.0f, 0.0f, 0.0f, 0.0f, DryGain, DryGainHF, DryGainLF, WetGain, WetGainLF, WetGainHF, SendSlots, ALBuffer, props, Listener, Device); } @@ -1082,13 +1140,14 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop ALeffectslot *SendSlots[MAX_SENDS]; ALfloat RoomRolloff[MAX_SENDS]; ALfloat DecayDistance[MAX_SENDS]; + ALfloat DecayLFDistance[MAX_SENDS]; ALfloat DecayHFDistance[MAX_SENDS]; ALfloat DryGain, DryGainHF, DryGainLF; ALfloat WetGain[MAX_SENDS]; ALfloat WetGainHF[MAX_SENDS]; ALfloat WetGainLF[MAX_SENDS]; bool directional; - ALfloat dir[3]; + ALfloat ev, az; ALfloat spread; ALfloat Pitch; ALint i; @@ -1106,20 +1165,31 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop SendSlots[i] = NULL; RoomRolloff[i] = 0.0f; DecayDistance[i] = 0.0f; + DecayLFDistance[i] = 0.0f; DecayHFDistance[i] = 0.0f; } else if(SendSlots[i]->Params.AuxSendAuto) { RoomRolloff[i] = SendSlots[i]->Params.RoomRolloff + props->RoomRolloffFactor; - DecayDistance[i] = SendSlots[i]->Params.DecayTime * SPEEDOFSOUNDMETRESPERSEC; + /* Calculate the distances to where this effect's decay reaches + * -60dB. + */ + DecayDistance[i] = SendSlots[i]->Params.DecayTime * + Listener->Params.ReverbSpeedOfSound; + DecayLFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayLFRatio; DecayHFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayHFRatio; if(SendSlots[i]->Params.DecayHFLimit) { ALfloat airAbsorption = SendSlots[i]->Params.AirAbsorptionGainHF; if(airAbsorption < 1.0f) { - ALfloat limitRatio = log10f(REVERB_DECAY_GAIN) / log10f(airAbsorption); - DecayHFDistance[i] = minf(limitRatio, DecayHFDistance[i]); + /* Calculate the distance to where this effect's air + * absorption reaches -60dB, and limit the effect's HF + * decay distance (so it doesn't take any longer to decay + * than the air would allow). + */ + ALfloat absorb_dist = log10f(REVERB_DECAY_GAIN) / log10f(airAbsorption); + DecayHFDistance[i] = minf(absorb_dist, DecayHFDistance[i]); } } } @@ -1129,6 +1199,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop * effect slot is the same as the dry path, sans filter effects */ RoomRolloff[i] = props->RolloffFactor; DecayDistance[i] = 0.0f; + DecayLFDistance[i] = 0.0f; DecayHFDistance[i] = 0.0f; } @@ -1165,7 +1236,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop Velocity.v[2] += lvelocity->v[2]; } - directional = aluNormalize(Direction.v) > FLT_EPSILON; + directional = aluNormalize(Direction.v) > 0.0f; SourceToListener.v[0] = -Position.v[0]; SourceToListener.v[1] = -Position.v[1]; SourceToListener.v[2] = -Position.v[2]; @@ -1252,46 +1323,6 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop break; } - /* Distance-based air absorption */ - if(ClampedDist > props->RefDistance && props->RolloffFactor > 0.0f) - { - ALfloat meters_base = (ClampedDist-props->RefDistance) * props->RolloffFactor * - Listener->Params.MetersPerUnit; - if(props->AirAbsorptionFactor > 0.0f) - { - ALfloat hfattn = powf(AIRABSORBGAINHF, meters_base * props->AirAbsorptionFactor); - DryGainHF *= hfattn; - for(i = 0;i < NumSends;i++) - WetGainHF[i] *= hfattn; - } - - if(props->WetGainAuto) - { - /* Apply a decay-time transformation to the wet path, based on the - * source distance in meters. The initial decay of the reverb - * effect is calculated and applied to the wet path. - */ - for(i = 0;i < NumSends;i++) - { - ALfloat gain; - - if(!(DecayDistance[i] > 0.0f)) - continue; - - gain = powf(REVERB_DECAY_GAIN, meters_base/DecayDistance[i]); - WetGain[i] *= gain; - /* Yes, the wet path's air absorption is applied with - * WetGainAuto on, rather than WetGainHFAuto. - */ - if(gain > 0.0f) - { - ALfloat gainhf = powf(REVERB_DECAY_GAIN, meters_base/DecayHFDistance[i]); - WetGainHF[i] *= minf(gainhf / gain, 1.0f); - } - } - } - } - /* Calculate directional soundcones */ if(directional && props->InnerAngle < 360.0f) { @@ -1347,6 +1378,48 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop WetGainLF[i] *= props->Send[i].GainLF; } + /* Distance-based air absorption and initial send decay. */ + if(ClampedDist > props->RefDistance && props->RolloffFactor > 0.0f) + { + ALfloat meters_base = (ClampedDist-props->RefDistance) * props->RolloffFactor * + Listener->Params.MetersPerUnit; + if(props->AirAbsorptionFactor > 0.0f) + { + ALfloat hfattn = powf(AIRABSORBGAINHF, meters_base * props->AirAbsorptionFactor); + DryGainHF *= hfattn; + for(i = 0;i < NumSends;i++) + WetGainHF[i] *= hfattn; + } + + if(props->WetGainAuto) + { + /* Apply a decay-time transformation to the wet path, based on the + * source distance in meters. The initial decay of the reverb + * effect is calculated and applied to the wet path. + */ + for(i = 0;i < NumSends;i++) + { + ALfloat gain, gainhf, gainlf; + + if(!(DecayDistance[i] > 0.0f)) + continue; + + gain = powf(REVERB_DECAY_GAIN, meters_base/DecayDistance[i]); + WetGain[i] *= gain; + /* Yes, the wet path's air absorption is applied with + * WetGainAuto on, rather than WetGainHFAuto. + */ + if(gain > 0.0f) + { + gainhf = powf(REVERB_DECAY_GAIN, meters_base/DecayHFDistance[i]); + WetGainHF[i] *= minf(gainhf / gain, 1.0f); + gainlf = powf(REVERB_DECAY_GAIN, meters_base/DecayLFDistance[i]); + WetGainLF[i] *= minf(gainlf / gain, 1.0f); + } + } + } + } + /* Initial source pitch */ Pitch = props->Pitch; @@ -1392,37 +1465,40 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop if(Pitch > (ALfloat)MAX_PITCH) voice->Step = MAX_PITCH<Step = maxi(fastf2i(Pitch*FRACTIONONE + 0.5f), 1); - BsincPrepare(voice->Step, &voice->ResampleState.bsinc); + voice->Step = maxi(fastf2i(Pitch * FRACTIONONE), 1); + if(props->Resampler == BSinc24Resampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc24); + else if(props->Resampler == BSinc12Resampler) + BsincPrepare(voice->Step, &voice->ResampleState.bsinc, &bsinc12); voice->Resampler = SelectResampler(props->Resampler); - if(Distance > FLT_EPSILON) + if(Distance > 0.0f) { - dir[0] = -SourceToListener.v[0]; /* Clamp Y, in case rounding errors caused it to end up outside of * -1...+1. */ - dir[1] = clampf(-SourceToListener.v[1], -1.0f, 1.0f); - dir[2] = -SourceToListener.v[2] * ZScale; + ev = asinf(clampf(-SourceToListener.v[1], -1.0f, 1.0f)); + /* Double negation on Z cancels out; negate once for changing source- + * to-listener to listener-to-source, and again for right-handed coords + * with -Z in front. + */ + az = atan2f(-SourceToListener.v[0], SourceToListener.v[2]*ZScale); } else - { - dir[0] = 0.0f; - dir[1] = 0.0f; - dir[2] = -1.0f; - } + ev = az = 0.0f; + if(props->Radius > Distance) spread = F_TAU - Distance/props->Radius*F_PI; - else if(Distance > FLT_EPSILON) + else if(Distance > 0.0f) spread = asinf(props->Radius / Distance) * 2.0f; else spread = 0.0f; - CalcPanningAndFilters(voice, Distance, dir, spread, DryGain, DryGainHF, DryGainLF, WetGain, + CalcPanningAndFilters(voice, az, ev, Distance, spread, DryGain, DryGainHF, DryGainLF, WetGain, WetGainLF, WetGainHF, SendSlots, ALBuffer, props, Listener, Device); } -static void CalcSourceParams(ALvoice *voice, ALCcontext *context, ALboolean force) +static void CalcSourceParams(ALvoice *voice, ALCcontext *context, bool force) { ALbufferlistitem *BufferListItem; struct ALvoiceProps *props; @@ -1436,15 +1512,18 @@ static void CalcSourceParams(ALvoice *voice, ALCcontext *context, ALboolean forc FAM_SIZE(struct ALvoiceProps, Send, context->Device->NumAuxSends) ); - ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &voice->FreeList, props); + ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &context->FreeVoiceProps, props); } props = voice->Props; BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); while(BufferListItem != NULL) { - const ALbuffer *buffer; - if((buffer=BufferListItem->buffer) != NULL) + const ALbuffer *buffer = NULL; + ALsizei i = 0; + while(!buffer && i < BufferListItem->num_buffers) + buffer = BufferListItem->buffers[i]; + if(LIKELY(buffer)) { if(props->SpatializeMode == SpatializeOn || (props->SpatializeMode == SpatializeAuto && buffer->FmtChannels == FmtMono)) @@ -1458,7 +1537,7 @@ static void CalcSourceParams(ALvoice *voice, ALCcontext *context, ALboolean forc } -static void UpdateContextSources(ALCcontext *ctx, const struct ALeffectslotArray *slots) +static void ProcessParamUpdates(ALCcontext *ctx, const struct ALeffectslotArray *slots) { ALvoice **voice, **voice_end; ALsource *source; @@ -1467,9 +1546,10 @@ static void UpdateContextSources(ALCcontext *ctx, const struct ALeffectslotArray IncrementRef(&ctx->UpdateCount); if(!ATOMIC_LOAD(&ctx->HoldUpdates, almemory_order_acquire)) { - ALboolean force = CalcListenerParams(ctx); + bool cforce = CalcContextParams(ctx); + bool force = CalcListenerParams(ctx) | cforce; for(i = 0;i < slots->count;i++) - force |= CalcEffectSlotParams(slots->slot[i], ctx->Device); + force |= CalcEffectSlotParams(slots->slot[i], ctx, cforce); voice = ctx->Voices; voice_end = voice + ctx->VoiceCount; @@ -1483,7 +1563,55 @@ static void UpdateContextSources(ALCcontext *ctx, const struct ALeffectslotArray } -static void ApplyDistanceComp(ALfloatBUFFERSIZE *restrict Samples, DistanceComp *distcomp, +static void ApplyStablizer(FrontStablizer *Stablizer, ALfloat (*restrict Buffer)[BUFFERSIZE], + int lidx, int ridx, int cidx, ALsizei SamplesToDo, + ALsizei NumChannels) +{ + ALfloat (*restrict lsplit)[BUFFERSIZE] = ASSUME_ALIGNED(Stablizer->LSplit, 16); + ALfloat (*restrict rsplit)[BUFFERSIZE] = ASSUME_ALIGNED(Stablizer->RSplit, 16); + ALsizei i; + + /* Apply an all-pass to all channels, except the front-left and front- + * right, so they maintain the same relative phase. + */ + for(i = 0;i < NumChannels;i++) + { + if(i == lidx || i == ridx) + continue; + splitterap_process(&Stablizer->APFilter[i], Buffer[i], SamplesToDo); + } + + bandsplit_process(&Stablizer->LFilter, lsplit[1], lsplit[0], Buffer[lidx], SamplesToDo); + bandsplit_process(&Stablizer->RFilter, rsplit[1], rsplit[0], Buffer[ridx], SamplesToDo); + + for(i = 0;i < SamplesToDo;i++) + { + ALfloat lfsum, hfsum; + ALfloat m, s, c; + + lfsum = lsplit[0][i] + rsplit[0][i]; + hfsum = lsplit[1][i] + rsplit[1][i]; + s = lsplit[0][i] + lsplit[1][i] - rsplit[0][i] - rsplit[1][i]; + + /* This pans the separate low- and high-frequency sums between being on + * the center channel and the left/right channels. The low-frequency + * sum is 1/3rd toward center (2/3rds on left/right) and the high- + * frequency sum is 1/4th toward center (3/4ths on left/right). These + * values can be tweaked. + */ + m = lfsum*cosf(1.0f/3.0f * F_PI_2) + hfsum*cosf(1.0f/4.0f * F_PI_2); + c = lfsum*sinf(1.0f/3.0f * F_PI_2) + hfsum*sinf(1.0f/4.0f * F_PI_2); + + /* The generated center channel signal adds to the existing signal, + * while the modified left and right channels replace. + */ + Buffer[lidx][i] = (m + s) * 0.5f; + Buffer[ridx][i] = (m - s) * 0.5f; + Buffer[cidx][i] += c * 0.5f; + } +} + +static void ApplyDistanceComp(ALfloat (*restrict Samples)[BUFFERSIZE], DistanceComp *distcomp, ALfloat *restrict Values, ALsizei SamplesToDo, ALsizei numchans) { ALsizei i, c; @@ -1506,7 +1634,7 @@ static void ApplyDistanceComp(ALfloatBUFFERSIZE *restrict Samples, DistanceComp continue; } - if(SamplesToDo >= base) + if(LIKELY(SamplesToDo >= base)) { for(i = 0;i < base;i++) Values[i] = distbuf[i]; @@ -1526,7 +1654,7 @@ static void ApplyDistanceComp(ALfloatBUFFERSIZE *restrict Samples, DistanceComp } } -static void ApplyDither(ALfloatBUFFERSIZE *restrict Samples, ALuint *dither_seed, +static void ApplyDither(ALfloat (*restrict Samples)[BUFFERSIZE], ALuint *dither_seed, const ALfloat quant_scale, const ALsizei SamplesToDo, const ALsizei numchans) { @@ -1534,6 +1662,9 @@ static void ApplyDither(ALfloatBUFFERSIZE *restrict Samples, ALuint *dither_seed ALuint seed = *dither_seed; ALsizei c, i; + ASSUME(numchans > 0); + ASSUME(SamplesToDo > 0); + /* Dithering. Step 1, generate whitenoise (uniform distribution of random * values between -1 and +1). Step 2 is to add the noise to the samples, * before rounding and after scaling up to the desired quantization depth. @@ -1547,7 +1678,7 @@ static void ApplyDither(ALfloatBUFFERSIZE *restrict Samples, ALuint *dither_seed ALuint rng0 = dither_rng(&seed); ALuint rng1 = dither_rng(&seed); val += (ALfloat)(rng0*(1.0/UINT_MAX) - rng1*(1.0/UINT_MAX)); - samples[i] = roundf(val) * invscale; + samples[i] = fast_roundf(val) * invscale; } } *dither_seed = seed; @@ -1558,9 +1689,10 @@ static inline ALfloat Conv_ALfloat(ALfloat val) { return val; } static inline ALint Conv_ALint(ALfloat val) { - /* Floats only have a 24-bit mantissa, so [-16777216, +16777216] is the max - * integer range normalized floats can be safely converted to (a bit of the - * exponent helps out, effectively giving 25 bits). + /* Floats have a 23-bit mantissa. There is an implied 1 bit in the mantissa + * along with the sign bit, giving 25 bits total, so [-16777216, +16777216] + * is the max value a normalized float can be scaled to before losing + * precision. */ return fastf2i(clampf(val*16777216.0f, -16777216.0f, 16777215.0f))<<7; } @@ -1580,10 +1712,15 @@ DECL_TEMPLATE(ALuint, Conv_ALint, 2147483648u) #undef DECL_TEMPLATE #define DECL_TEMPLATE(T, A) \ -static void Write##A(const ALfloatBUFFERSIZE *InBuffer, ALvoid *OutBuffer, \ - ALsizei Offset, ALsizei SamplesToDo, ALsizei numchans) \ +static void Write##A(const ALfloat (*restrict InBuffer)[BUFFERSIZE], \ + ALvoid *OutBuffer, ALsizei Offset, ALsizei SamplesToDo, \ + ALsizei numchans) \ { \ ALsizei i, j; \ + \ + ASSUME(numchans > 0); \ + ASSUME(SamplesToDo > 0); \ + \ for(j = 0;j < numchans;j++) \ { \ const ALfloat *restrict in = ASSUME_ALIGNED(InBuffer[j], 16); \ @@ -1633,7 +1770,7 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) const struct ALeffectslotArray *auxslots; auxslots = ATOMIC_LOAD(&ctx->ActiveAuxSlots, almemory_order_acquire); - UpdateContextSources(ctx, auxslots); + ProcessParamUpdates(ctx, auxslots); for(i = 0;i < auxslots->count;i++) { @@ -1650,10 +1787,11 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) if(source && ATOMIC_LOAD(&voice->Playing, almemory_order_relaxed) && voice->Step > 0) { - if(!MixSource(voice, source, device, SamplesToDo)) + if(!MixSource(voice, source->id, ctx, SamplesToDo)) { ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); ATOMIC_STORE(&voice->Playing, false, almemory_order_release); + SendSourceStoppedEvent(ctx, source->id); } } } @@ -1667,7 +1805,7 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) state->OutChannels); } - ctx = ctx->next; + ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); } /* Increment the clock time. Every second's worth of samples is @@ -1679,117 +1817,50 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) device->SamplesDone %= device->Frequency; IncrementRef(&device->MixCount); - if(device->HrtfHandle) - { - HrtfDirectMixerFunc HrtfMix; - DirectHrtfState *state; - int lidx, ridx; + /* Apply post-process for finalizing the Dry mix to the RealOut + * (Ambisonic decode, UHJ encode, etc). + */ + if(LIKELY(device->PostProcess)) + device->PostProcess(device, SamplesToDo); - if(device->AmbiUp) - ambiup_process(device->AmbiUp, - device->Dry.Buffer, device->Dry.NumChannels, - SAFE_CONST(ALfloatBUFFERSIZE*,device->FOAOut.Buffer), SamplesToDo - ); + if(device->Stablizer) + { + int lidx = GetChannelIdxByName(&device->RealOut, FrontLeft); + int ridx = GetChannelIdxByName(&device->RealOut, FrontRight); + int cidx = GetChannelIdxByName(&device->RealOut, FrontCenter); + assert(lidx >= 0 && ridx >= 0 && cidx >= 0); - lidx = GetChannelIdxByName(device->RealOut, FrontLeft); - ridx = GetChannelIdxByName(device->RealOut, FrontRight); - assert(lidx != -1 && ridx != -1); - - HrtfMix = SelectHrtfMixer(); - state = device->Hrtf; - for(c = 0;c < device->Dry.NumChannels;c++) - { - HrtfMix(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], - device->Dry.Buffer[c], state->Offset, state->IrSize, - SAFE_CONST(ALfloat2*,state->Chan[c].Coeffs), - state->Chan[c].Values, SamplesToDo - ); - } - state->Offset += SamplesToDo; - } - else if(device->AmbiDecoder) - { - if(device->Dry.Buffer != device->FOAOut.Buffer) - bformatdec_upSample(device->AmbiDecoder, - device->Dry.Buffer, SAFE_CONST(ALfloatBUFFERSIZE*,device->FOAOut.Buffer), - device->FOAOut.NumChannels, SamplesToDo - ); - bformatdec_process(device->AmbiDecoder, - device->RealOut.Buffer, device->RealOut.NumChannels, - SAFE_CONST(ALfloatBUFFERSIZE*,device->Dry.Buffer), SamplesToDo - ); - } - else if(device->AmbiUp) - { - ambiup_process(device->AmbiUp, - device->RealOut.Buffer, device->RealOut.NumChannels, - SAFE_CONST(ALfloatBUFFERSIZE*,device->FOAOut.Buffer), SamplesToDo - ); - } - else if(device->Uhj_Encoder) - { - int lidx = GetChannelIdxByName(device->RealOut, FrontLeft); - int ridx = GetChannelIdxByName(device->RealOut, FrontRight); - if(lidx != -1 && ridx != -1) - { - /* Encode to stereo-compatible 2-channel UHJ output. */ - EncodeUhj2(device->Uhj_Encoder, - device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], - device->Dry.Buffer, SamplesToDo - ); - } - } - else if(device->Bs2b) - { - int lidx = GetChannelIdxByName(device->RealOut, FrontLeft); - int ridx = GetChannelIdxByName(device->RealOut, FrontRight); - if(lidx != -1 && ridx != -1) - { - /* Apply binaural/crossfeed filter */ - bs2b_cross_feed(device->Bs2b, device->RealOut.Buffer[lidx], - device->RealOut.Buffer[ridx], SamplesToDo); - } + ApplyStablizer(device->Stablizer, device->RealOut.Buffer, lidx, ridx, cidx, + SamplesToDo, device->RealOut.NumChannels); } - if(OutBuffer) + ApplyDistanceComp(device->RealOut.Buffer, device->ChannelDelay, device->TempBuffer[0], + SamplesToDo, device->RealOut.NumChannels); + + if(device->Limiter) + ApplyCompression(device->Limiter, SamplesToDo, device->RealOut.Buffer); + + if(device->DitherDepth > 0.0f) + ApplyDither(device->RealOut.Buffer, &device->DitherSeed, device->DitherDepth, + SamplesToDo, device->RealOut.NumChannels); + + if(LIKELY(OutBuffer)) { ALfloat (*Buffer)[BUFFERSIZE] = device->RealOut.Buffer; ALsizei Channels = device->RealOut.NumChannels; - /* Use NFCtrlData for temp value storage. */ - ApplyDistanceComp(Buffer, device->ChannelDelay, device->NFCtrlData, - SamplesToDo, Channels); - - if(device->Limiter) - ApplyCompression(device->Limiter, Channels, SamplesToDo, Buffer); - - if(device->DitherDepth > 0.0f) - ApplyDither(Buffer, &device->DitherSeed, device->DitherDepth, SamplesToDo, - Channels); - switch(device->FmtType) { - case DevFmtByte: - WriteI8(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtUByte: - WriteUI8(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtShort: - WriteI16(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtUShort: - WriteUI16(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtInt: - WriteI32(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtUInt: - WriteUI32(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; - case DevFmtFloat: - WriteF32(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); - break; +#define HANDLE_WRITE(T, S) case T: \ + Write##S(Buffer, OutBuffer, SamplesDone, SamplesToDo, Channels); break; + HANDLE_WRITE(DevFmtByte, I8) + HANDLE_WRITE(DevFmtUByte, UI8) + HANDLE_WRITE(DevFmtShort, I16) + HANDLE_WRITE(DevFmtUShort, UI16) + HANDLE_WRITE(DevFmtInt, I32) + HANDLE_WRITE(DevFmtUInt, UI32) + HANDLE_WRITE(DevFmtFloat, F32) +#undef HANDLE_WRITE } } @@ -1799,32 +1870,54 @@ void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples) } -void aluHandleDisconnect(ALCdevice *device) +void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) { + AsyncEvent evt = ASYNC_EVENT(EventType_Disconnected); ALCcontext *ctx; + va_list args; + int msglen; - device->Connected = ALC_FALSE; + if(!ATOMIC_EXCHANGE(&device->Connected, AL_FALSE, almemory_order_acq_rel)) + return; + + evt.u.user.type = AL_EVENT_TYPE_DISCONNECTED_SOFT; + evt.u.user.id = 0; + evt.u.user.param = 0; + + va_start(args, msg); + msglen = vsnprintf(evt.u.user.msg, sizeof(evt.u.user.msg), msg, args); + va_end(args); + + if(msglen < 0 || (size_t)msglen >= sizeof(evt.u.user.msg)) + evt.u.user.msg[sizeof(evt.u.user.msg)-1] = 0; ctx = ATOMIC_LOAD_SEQ(&device->ContextList); while(ctx) { + ALbitfieldSOFT enabledevt = ATOMIC_LOAD(&ctx->EnabledEvts, almemory_order_acquire); ALsizei i; + + if((enabledevt&EventType_Disconnected) && + ll_ringbuffer_write(ctx->AsyncEvents, (const char*)&evt, 1) == 1) + alsem_post(&ctx->EventSem); + for(i = 0;i < ctx->VoiceCount;i++) { ALvoice *voice = ctx->Voices[i]; ALsource *source; - source = ATOMIC_EXCHANGE_PTR(&voice->Source, NULL, almemory_order_acq_rel); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - - if(source) + source = ATOMIC_EXCHANGE_PTR(&voice->Source, NULL, almemory_order_relaxed); + if(source && ATOMIC_LOAD(&voice->Playing, almemory_order_relaxed)) { - ALenum playing = AL_PLAYING; - (void)(ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&source->state, &playing, AL_STOPPED)); + /* If the source's voice was playing, it's now effectively + * stopped (the source state will be updated the next time it's + * checked). + */ + SendSourceStoppedEvent(ctx, source->id); } + ATOMIC_STORE(&voice->Playing, false, almemory_order_release); } - ctx->VoiceCount = 0; - ctx = ctx->next; + ctx = ATOMIC_LOAD(&ctx->next, almemory_order_relaxed); } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/alcConfig.c b/love/src/jni/openal-soft-1.19.1/Alc/alconfig.c similarity index 84% rename from love/src/jni/openal-soft-1.18.2/Alc/alcConfig.c rename to love/src/jni/openal-soft-1.19.1/Alc/alconfig.c index 6fd01746..3d0ed140 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/alcConfig.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/alconfig.c @@ -36,8 +36,12 @@ #include #include #endif +#ifdef __APPLE__ +#include +#endif #include "alMain.h" +#include "alconfig.h" #include "compat.h" #include "bool.h" @@ -365,9 +369,9 @@ static void LoadConfigFromFile(FILE *f) #ifdef _WIN32 void ReadALConfig(void) { - WCHAR buffer[PATH_MAX]; + al_string ppath = AL_STRING_INIT_STATIC(); + WCHAR buffer[MAX_PATH]; const WCHAR *str; - al_string ppath; FILE *f; if(SHGetSpecialFolderPathW(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE) @@ -386,7 +390,7 @@ void ReadALConfig(void) alstr_reset(&filepath); } - ppath = GetProcPath(); + GetProcBinary(&ppath, NULL); if(!alstr_empty(ppath)) { alstr_append_cstr(&ppath, "\\alsoft.ini"); @@ -419,9 +423,9 @@ void ReadALConfig(void) #else void ReadALConfig(void) { - char buffer[PATH_MAX]; + al_string confpaths = AL_STRING_INIT_STATIC(); + al_string fname = AL_STRING_INIT_STATIC(); const char *str; - al_string ppath; FILE *f; str = "/etc/openal/alsoft.conf"; @@ -436,45 +440,75 @@ void ReadALConfig(void) if(!(str=getenv("XDG_CONFIG_DIRS")) || str[0] == 0) str = "/etc/xdg"; - strncpy(buffer, str, sizeof(buffer)-1); - buffer[sizeof(buffer)-1] = 0; + alstr_copy_cstr(&confpaths, str); /* Go through the list in reverse, since "the order of base directories * denotes their importance; the first directory listed is the most * important". Ergo, we need to load the settings from the later dirs * first so that the settings in the earlier dirs override them. */ - while(1) + while(!alstr_empty(confpaths)) { - char *next = strrchr(buffer, ':'); - if(next) *(next++) = 0; - else next = buffer; - - if(next[0] != '/') - WARN("Ignoring XDG config dir: %s\n", next); + char *next = strrchr(alstr_get_cstr(confpaths), ':'); + if(next) + { + size_t len = next - alstr_get_cstr(confpaths); + alstr_copy_cstr(&fname, next+1); + VECTOR_RESIZE(confpaths, len, len+1); + VECTOR_ELEM(confpaths, len) = 0; + } else { - size_t len = strlen(next); - strncpy(next+len, "/alsoft.conf", buffer+sizeof(buffer)-next-len); - buffer[sizeof(buffer)-1] = 0; + alstr_reset(&fname); + fname = confpaths; + AL_STRING_INIT(confpaths); + } - TRACE("Loading config %s...\n", next); - f = al_fopen(next, "r"); + if(alstr_empty(fname) || VECTOR_FRONT(fname) != '/') + WARN("Ignoring XDG config dir: %s\n", alstr_get_cstr(fname)); + else + { + if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); + else alstr_append_cstr(&fname, "alsoft.conf"); + + TRACE("Loading config %s...\n", alstr_get_cstr(fname)); + f = al_fopen(alstr_get_cstr(fname), "r"); if(f) { LoadConfigFromFile(f); fclose(f); } } - if(next == buffer) - break; + alstr_clear(&fname); } +#ifdef __APPLE__ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + if(mainBundle) + { + unsigned char fileName[PATH_MAX]; + CFURLRef configURL; + + if((configURL=CFBundleCopyResourceURL(mainBundle, CFSTR(".alsoftrc"), CFSTR(""), NULL)) && + CFURLGetFileSystemRepresentation(configURL, true, fileName, sizeof(fileName))) + { + f = al_fopen((const char*)fileName, "r"); + if(f) + { + LoadConfigFromFile(f); + fclose(f); + } + } + } +#endif + if((str=getenv("HOME")) != NULL && *str) { - snprintf(buffer, sizeof(buffer), "%s/.alsoftrc", str); + alstr_copy_cstr(&fname, str); + if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/.alsoftrc"); + else alstr_append_cstr(&fname, ".alsoftrc"); - TRACE("Loading config %s...\n", buffer); - f = al_fopen(buffer, "r"); + TRACE("Loading config %s...\n", alstr_get_cstr(fname)); + f = al_fopen(alstr_get_cstr(fname), "r"); if(f) { LoadConfigFromFile(f); @@ -483,17 +517,25 @@ void ReadALConfig(void) } if((str=getenv("XDG_CONFIG_HOME")) != NULL && str[0] != 0) - snprintf(buffer, sizeof(buffer), "%s/%s", str, "alsoft.conf"); + { + alstr_copy_cstr(&fname, str); + if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); + else alstr_append_cstr(&fname, "alsoft.conf"); + } else { - buffer[0] = 0; + alstr_clear(&fname); if((str=getenv("HOME")) != NULL && str[0] != 0) - snprintf(buffer, sizeof(buffer), "%s/.config/%s", str, "alsoft.conf"); + { + alstr_copy_cstr(&fname, str); + if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/.config/alsoft.conf"); + else alstr_append_cstr(&fname, ".config/alsoft.conf"); + } } - if(buffer[0] != 0) + if(!alstr_empty(fname)) { - TRACE("Loading config %s...\n", buffer); - f = al_fopen(buffer, "r"); + TRACE("Loading config %s...\n", alstr_get_cstr(fname)); + f = al_fopen(alstr_get_cstr(fname), "r"); if(f) { LoadConfigFromFile(f); @@ -501,12 +543,15 @@ void ReadALConfig(void) } } - ppath = GetProcPath(); - if(!alstr_empty(ppath)) + alstr_clear(&fname); + GetProcBinary(&fname, NULL); + if(!alstr_empty(fname)) { - alstr_append_cstr(&ppath, "/alsoft.conf"); - TRACE("Loading config %s...\n", alstr_get_cstr(ppath)); - f = al_fopen(alstr_get_cstr(ppath), "r"); + if(VECTOR_BACK(fname) != '/') alstr_append_cstr(&fname, "/alsoft.conf"); + else alstr_append_cstr(&fname, "alsoft.conf"); + + TRACE("Loading config %s...\n", alstr_get_cstr(fname)); + f = al_fopen(alstr_get_cstr(fname), "r"); if(f) { LoadConfigFromFile(f); @@ -525,7 +570,8 @@ void ReadALConfig(void) } } - alstr_reset(&ppath); + alstr_reset(&fname); + alstr_reset(&confpaths); } #endif diff --git a/love/src/jni/openal-soft-1.19.1/Alc/alconfig.h b/love/src/jni/openal-soft-1.19.1/Alc/alconfig.h new file mode 100644 index 00000000..1e493e2e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/alconfig.h @@ -0,0 +1,17 @@ +#ifndef ALCONFIG_H +#define ALCONFIG_H + +void ReadALConfig(void); +void FreeALConfig(void); + +int ConfigValueExists(const char *devName, const char *blockName, const char *keyName); +const char *GetConfigValue(const char *devName, const char *blockName, const char *keyName, const char *def); +int GetConfigValueBool(const char *devName, const char *blockName, const char *keyName, int def); + +int ConfigValueStr(const char *devName, const char *blockName, const char *keyName, const char **ret); +int ConfigValueInt(const char *devName, const char *blockName, const char *keyName, int *ret); +int ConfigValueUInt(const char *devName, const char *blockName, const char *keyName, unsigned int *ret); +int ConfigValueFloat(const char *devName, const char *blockName, const char *keyName, float *ret); +int ConfigValueBool(const char *devName, const char *blockName, const char *keyName, int *ret); + +#endif /* ALCONFIG_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/alstring.h b/love/src/jni/openal-soft-1.19.1/Alc/alstring.h similarity index 91% rename from love/src/jni/openal-soft-1.18.2/Alc/alstring.h rename to love/src/jni/openal-soft-1.19.1/Alc/alstring.h index a7513516..923a5ea2 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/alstring.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/alstring.h @@ -6,6 +6,10 @@ #include "vector.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef char al_string_char_type; TYPEDEF_VECTOR(al_string_char_type, al_string) TYPEDEF_VECTOR(al_string, vector_al_string) @@ -43,7 +47,12 @@ void alstr_append_range(al_string *str, const al_string_char_type *from, const a /* Windows-only methods to deal with WideChar strings. */ void alstr_copy_wcstr(al_string *str, const wchar_t *from); void alstr_append_wcstr(al_string *str, const wchar_t *from); +void alstr_copy_wrange(al_string *str, const wchar_t *from, const wchar_t *to); void alstr_append_wrange(al_string *str, const wchar_t *from, const wchar_t *to); #endif +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* ALSTRING_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/ambdec.c b/love/src/jni/openal-soft-1.19.1/Alc/ambdec.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/Alc/ambdec.c rename to love/src/jni/openal-soft-1.19.1/Alc/ambdec.c diff --git a/love/src/jni/openal-soft-1.18.2/Alc/ambdec.h b/love/src/jni/openal-soft-1.19.1/Alc/ambdec.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/Alc/ambdec.h rename to love/src/jni/openal-soft-1.19.1/Alc/ambdec.h diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/alsa.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/alsa.c similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/alsa.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/alsa.c index 79f2795a..a967fff0 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/alsa.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/alsa.c @@ -26,6 +26,8 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" #include "threads.h" #include "compat.h" @@ -436,7 +438,7 @@ typedef struct ALCplaybackAlsa { ALvoid *buffer; ALsizei size; - volatile int killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCplaybackAlsa; @@ -444,9 +446,8 @@ static int ALCplaybackAlsa_mixerProc(void *ptr); static int ALCplaybackAlsa_mixerNoMMapProc(void *ptr); static void ALCplaybackAlsa_Construct(ALCplaybackAlsa *self, ALCdevice *device); -static DECLARE_FORWARD(ALCplaybackAlsa, ALCbackend, void, Destruct) +static void ALCplaybackAlsa_Destruct(ALCplaybackAlsa *self); static ALCenum ALCplaybackAlsa_open(ALCplaybackAlsa *self, const ALCchar *name); -static void ALCplaybackAlsa_close(ALCplaybackAlsa *self); static ALCboolean ALCplaybackAlsa_reset(ALCplaybackAlsa *self); static ALCboolean ALCplaybackAlsa_start(ALCplaybackAlsa *self); static void ALCplaybackAlsa_stop(ALCplaybackAlsa *self); @@ -464,6 +465,19 @@ static void ALCplaybackAlsa_Construct(ALCplaybackAlsa *self, ALCdevice *device) { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCplaybackAlsa, ALCbackend, self); + + self->pcmHandle = NULL; + self->buffer = NULL; + + ATOMIC_INIT(&self->killNow, AL_TRUE); +} + +void ALCplaybackAlsa_Destruct(ALCplaybackAlsa *self) +{ + if(self->pcmHandle) + snd_pcm_close(self->pcmHandle); + self->pcmHandle = NULL; + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -483,14 +497,14 @@ static int ALCplaybackAlsa_mixerProc(void *ptr) update_size = device->UpdateSize; num_updates = device->NumUpdates; - while(!self->killNow) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) { int state = verify_state(self->pcmHandle); if(state < 0) { ERR("Invalid state detected: %s\n", snd_strerror(state)); ALCplaybackAlsa_lock(self); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Bad state: %s", snd_strerror(state)); ALCplaybackAlsa_unlock(self); break; } @@ -573,14 +587,14 @@ static int ALCplaybackAlsa_mixerNoMMapProc(void *ptr) update_size = device->UpdateSize; num_updates = device->NumUpdates; - while(!self->killNow) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) { int state = verify_state(self->pcmHandle); if(state < 0) { ERR("Invalid state detected: %s\n", snd_strerror(state)); ALCplaybackAlsa_lock(self); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Bad state: %s", snd_strerror(state)); ALCplaybackAlsa_unlock(self); break; } @@ -700,11 +714,6 @@ static ALCenum ALCplaybackAlsa_open(ALCplaybackAlsa *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCplaybackAlsa_close(ALCplaybackAlsa *self) -{ - snd_pcm_close(self->pcmHandle); -} - static ALCboolean ALCplaybackAlsa_reset(ALCplaybackAlsa *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -903,7 +912,7 @@ static ALCboolean ALCplaybackAlsa_start(ALCplaybackAlsa *self) } thread_func = ALCplaybackAlsa_mixerProc; } - self->killNow = 0; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, thread_func, self) != althrd_success) { ERR("Could not create playback thread\n"); @@ -924,10 +933,8 @@ static void ALCplaybackAlsa_stop(ALCplaybackAlsa *self) { int res; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - self->killNow = 1; althrd_join(self->thread, &res); al_free(self->buffer); @@ -971,9 +978,8 @@ typedef struct ALCcaptureAlsa { } ALCcaptureAlsa; static void ALCcaptureAlsa_Construct(ALCcaptureAlsa *self, ALCdevice *device); -static DECLARE_FORWARD(ALCcaptureAlsa, ALCbackend, void, Destruct) +static void ALCcaptureAlsa_Destruct(ALCcaptureAlsa *self); static ALCenum ALCcaptureAlsa_open(ALCcaptureAlsa *self, const ALCchar *name); -static void ALCcaptureAlsa_close(ALCcaptureAlsa *self); static DECLARE_FORWARD(ALCcaptureAlsa, ALCbackend, ALCboolean, reset) static ALCboolean ALCcaptureAlsa_start(ALCcaptureAlsa *self); static void ALCcaptureAlsa_stop(ALCcaptureAlsa *self); @@ -991,6 +997,25 @@ static void ALCcaptureAlsa_Construct(ALCcaptureAlsa *self, ALCdevice *device) { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCcaptureAlsa, ALCbackend, self); + + self->pcmHandle = NULL; + self->buffer = NULL; + self->ring = NULL; +} + +void ALCcaptureAlsa_Destruct(ALCcaptureAlsa *self) +{ + if(self->pcmHandle) + snd_pcm_close(self->pcmHandle); + self->pcmHandle = NULL; + + al_free(self->buffer); + self->buffer = NULL; + + ll_ringbuffer_free(self->ring); + self->ring = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -1098,8 +1123,9 @@ static ALCenum ALCcaptureAlsa_open(ALCcaptureAlsa *self, const ALCchar *name) if(needring) { self->ring = ll_ringbuffer_create( - device->UpdateSize*device->NumUpdates + 1, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder) + device->UpdateSize*device->NumUpdates, + FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), + false ); if(!self->ring) { @@ -1120,26 +1146,26 @@ error2: ll_ringbuffer_free(self->ring); self->ring = NULL; snd_pcm_close(self->pcmHandle); + self->pcmHandle = NULL; return ALC_INVALID_VALUE; } -static void ALCcaptureAlsa_close(ALCcaptureAlsa *self) -{ - snd_pcm_close(self->pcmHandle); - ll_ringbuffer_free(self->ring); - - al_free(self->buffer); - self->buffer = NULL; -} - static ALCboolean ALCcaptureAlsa_start(ALCcaptureAlsa *self) { - int err = snd_pcm_start(self->pcmHandle); + int err = snd_pcm_prepare(self->pcmHandle); + if(err < 0) + ERR("prepare failed: %s\n", snd_strerror(err)); + else + { + err = snd_pcm_start(self->pcmHandle); + if(err < 0) + ERR("start failed: %s\n", snd_strerror(err)); + } if(err < 0) { - ERR("start failed: %s\n", snd_strerror(err)); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, "Capture state failure: %s", + snd_strerror(err)); return ALC_FALSE; } @@ -1190,7 +1216,7 @@ static ALCenum ALCcaptureAlsa_captureSamples(ALCcaptureAlsa *self, ALCvoid *buff } self->last_avail -= samples; - while(device->Connected && samples > 0) + while(ATOMIC_LOAD(&device->Connected, almemory_order_acquire) && samples > 0) { snd_pcm_sframes_t amt = 0; @@ -1233,7 +1259,7 @@ static ALCenum ALCcaptureAlsa_captureSamples(ALCcaptureAlsa *self, ALCvoid *buff if(amt < 0) { ERR("restore error: %s\n", snd_strerror(amt)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(amt)); break; } /* If the amount available is less than what's asked, we lost it @@ -1258,7 +1284,7 @@ static ALCuint ALCcaptureAlsa_availableSamples(ALCcaptureAlsa *self) ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; snd_pcm_sframes_t avail = 0; - if(device->Connected && self->doCapture) + if(ATOMIC_LOAD(&device->Connected, almemory_order_acquire) && self->doCapture) avail = snd_pcm_avail_update(self->pcmHandle); if(avail < 0) { @@ -1274,7 +1300,7 @@ static ALCuint ALCcaptureAlsa_availableSamples(ALCcaptureAlsa *self) if(avail < 0) { ERR("restore error: %s\n", snd_strerror(avail)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(avail)); } } @@ -1313,7 +1339,7 @@ static ALCuint ALCcaptureAlsa_availableSamples(ALCcaptureAlsa *self) if(amt < 0) { ERR("restore error: %s\n", snd_strerror(amt)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Capture recovery failure: %s", snd_strerror(amt)); break; } avail = amt; @@ -1349,11 +1375,6 @@ static ClockLatency ALCcaptureAlsa_getClockLatency(ALCcaptureAlsa *self) } -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - typedef struct ALCalsaBackendFactory { DERIVE_FROM_TYPE(ALCbackendFactory); } ALCalsaBackendFactory; @@ -1391,19 +1412,25 @@ static ALCboolean ALCalsaBackendFactory_querySupport(ALCalsaBackendFactory* UNUS return ALC_FALSE; } -static void ALCalsaBackendFactory_probe(ALCalsaBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCalsaBackendFactory_probe(ALCalsaBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { +#define APPEND_OUTNAME(i) do { \ + if(!alstr_empty((i)->name)) \ + alstr_append_range(outnames, VECTOR_BEGIN((i)->name), \ + VECTOR_END((i)->name)+1); \ +} while(0) case ALL_DEVICE_PROBE: probe_devices(SND_PCM_STREAM_PLAYBACK, &PlaybackDevices); - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); + VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: probe_devices(SND_PCM_STREAM_CAPTURE, &CaptureDevices); - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); + VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/base.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/base.c similarity index 91% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/base.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/base.c index 5f568d8e..9d8614b1 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/base.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/base.c @@ -10,6 +10,9 @@ extern inline ALuint64 GetDeviceClockTime(ALCdevice *device); +extern inline void ALCdevice_Lock(ALCdevice *device); +extern inline void ALCdevice_Unlock(ALCdevice *device); +extern inline ClockLatency GetClockLatency(ALCdevice *device); /* Base ALCbackend method implementations. */ void ALCbackend_Construct(ALCbackend *self, ALCdevice *device) diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/base.h b/love/src/jni/openal-soft-1.19.1/Alc/backends/base.h similarity index 89% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/base.h rename to love/src/jni/openal-soft-1.19.1/Alc/backends/base.h index 8464fdee..03db56e9 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/base.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/base.h @@ -3,8 +3,13 @@ #include "alMain.h" #include "threads.h" +#include "alstring.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct ClockLatency { ALint64 ClockTime; ALint64 Latency; @@ -43,7 +48,6 @@ struct ALCbackendVtable { void (*const Destruct)(ALCbackend*); ALCenum (*const open)(ALCbackend*, const ALCchar*); - void (*const close)(ALCbackend*); ALCboolean (*const reset)(ALCbackend*); ALCboolean (*const start)(ALCbackend*); @@ -63,7 +67,6 @@ struct ALCbackendVtable { #define DEFINE_ALCBACKEND_VTABLE(T) \ DECLARE_THUNK(T, ALCbackend, void, Destruct) \ DECLARE_THUNK1(T, ALCbackend, ALCenum, open, const ALCchar*) \ -DECLARE_THUNK(T, ALCbackend, void, close) \ DECLARE_THUNK(T, ALCbackend, ALCboolean, reset) \ DECLARE_THUNK(T, ALCbackend, ALCboolean, start) \ DECLARE_THUNK(T, ALCbackend, void, stop) \ @@ -79,7 +82,6 @@ static const struct ALCbackendVtable T##_ALCbackend_vtable = { \ T##_ALCbackend_Destruct, \ \ T##_ALCbackend_open, \ - T##_ALCbackend_close, \ T##_ALCbackend_reset, \ T##_ALCbackend_start, \ T##_ALCbackend_stop, \ @@ -114,7 +116,7 @@ struct ALCbackendFactoryVtable { ALCboolean (*const querySupport)(ALCbackendFactory *self, ALCbackend_Type type); - void (*const probe)(ALCbackendFactory *self, enum DevProbe type); + void (*const probe)(ALCbackendFactory *self, enum DevProbe type, al_string *outnames); ALCbackend* (*const createBackend)(ALCbackendFactory *self, ALCdevice *device, ALCbackend_Type type); }; @@ -123,7 +125,7 @@ struct ALCbackendFactoryVtable { DECLARE_THUNK(T, ALCbackendFactory, ALCboolean, init) \ DECLARE_THUNK(T, ALCbackendFactory, void, deinit) \ DECLARE_THUNK1(T, ALCbackendFactory, ALCboolean, querySupport, ALCbackend_Type) \ -DECLARE_THUNK1(T, ALCbackendFactory, void, probe, enum DevProbe) \ +DECLARE_THUNK2(T, ALCbackendFactory, void, probe, enum DevProbe, al_string*) \ DECLARE_THUNK2(T, ALCbackendFactory, ALCbackend*, createBackend, ALCdevice*, ALCbackend_Type) \ \ static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = { \ @@ -141,15 +143,36 @@ ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void); ALCbackendFactory *ALCossBackendFactory_getFactory(void); ALCbackendFactory *ALCjackBackendFactory_getFactory(void); ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void); -ALCbackendFactory *ALCsndioBackendFactory_getFactory(void); +ALCbackendFactory *SndioBackendFactory_getFactory(void); ALCbackendFactory *ALCqsaBackendFactory_getFactory(void); -ALCbackendFactory *ALCmmdevBackendFactory_getFactory(void); +ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void); ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void); ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void); ALCbackendFactory *ALCportBackendFactory_getFactory(void); ALCbackendFactory *ALCopenslBackendFactory_getFactory(void); ALCbackendFactory *ALCnullBackendFactory_getFactory(void); ALCbackendFactory *ALCwaveBackendFactory_getFactory(void); +ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void); ALCbackendFactory *ALCloopbackFactory_getFactory(void); + +inline void ALCdevice_Lock(ALCdevice *device) +{ V0(device->Backend,lock)(); } + +inline void ALCdevice_Unlock(ALCdevice *device) +{ V0(device->Backend,unlock)(); } + + +inline ClockLatency GetClockLatency(ALCdevice *device) +{ + ClockLatency ret = V0(device->Backend,getClockLatency)(); + ret.Latency += device->FixedLatency; + return ret; +} + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* AL_BACKENDS_BASE_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/coreaudio.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/coreaudio.c similarity index 91% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/coreaudio.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/coreaudio.c index ec926d3d..adb01fa6 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/coreaudio.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/coreaudio.c @@ -23,12 +23,11 @@ #include #include #include -#include #include "alMain.h" #include "alu.h" +#include "ringbuffer.h" -#include #include #include #include @@ -36,56 +35,9 @@ #include "backends/base.h" -typedef struct { - AudioUnit audioUnit; - - ALuint frameSize; - ALdouble sampleRateRatio; // Ratio of hardware sample rate / requested sample rate - AudioStreamBasicDescription format; // This is the OpenAL format as a CoreAudio ASBD - - AudioConverterRef audioConverter; // Sample rate converter if needed - AudioBufferList *bufferList; // Buffer for data coming from the input device - ALCvoid *resampleBuffer; // Buffer for returned RingBuffer data when resampling - - ll_ringbuffer_t *ring; -} ca_data; - static const ALCchar ca_device[] = "CoreAudio Default"; -static AudioBufferList* allocate_buffer_list(UInt32 channelCount, UInt32 byteSize) -{ - AudioBufferList *list; - - list = calloc(1, sizeof(AudioBufferList) + sizeof(AudioBuffer)); - if(list) - { - list->mNumberBuffers = 1; - - list->mBuffers[0].mNumberChannels = channelCount; - list->mBuffers[0].mDataByteSize = byteSize; - list->mBuffers[0].mData = malloc(byteSize); - if(list->mBuffers[0].mData == NULL) - { - free(list); - list = NULL; - } - } - return list; -} - -static void destroy_buffer_list(AudioBufferList* list) -{ - if(list) - { - UInt32 i; - for(i = 0;i < list->mNumberBuffers;i++) - free(list->mBuffers[i].mData); - free(list); - } -} - - typedef struct ALCcoreAudioPlayback { DERIVE_FROM_TYPE(ALCbackend); @@ -98,7 +50,6 @@ typedef struct ALCcoreAudioPlayback { static void ALCcoreAudioPlayback_Construct(ALCcoreAudioPlayback *self, ALCdevice *device); static void ALCcoreAudioPlayback_Destruct(ALCcoreAudioPlayback *self); static ALCenum ALCcoreAudioPlayback_open(ALCcoreAudioPlayback *self, const ALCchar *name); -static void ALCcoreAudioPlayback_close(ALCcoreAudioPlayback *self); static ALCboolean ALCcoreAudioPlayback_reset(ALCcoreAudioPlayback *self); static ALCboolean ALCcoreAudioPlayback_start(ALCcoreAudioPlayback *self); static void ALCcoreAudioPlayback_stop(ALCcoreAudioPlayback *self); @@ -123,6 +74,9 @@ static void ALCcoreAudioPlayback_Construct(ALCcoreAudioPlayback *self, ALCdevice static void ALCcoreAudioPlayback_Destruct(ALCcoreAudioPlayback *self) { + AudioUnitUninitialize(self->audioUnit); + AudioComponentInstanceDispose(self->audioUnit); + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -134,10 +88,10 @@ static OSStatus ALCcoreAudioPlayback_MixerProc(void *inRefCon, ALCcoreAudioPlayback *self = inRefCon; ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; - ALCdevice_Lock(device); + ALCcoreAudioPlayback_lock(self); aluMixData(device, ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize / self->frameSize); - ALCdevice_Unlock(device); + ALCcoreAudioPlayback_unlock(self); return noErr; } @@ -157,7 +111,11 @@ static ALCenum ALCcoreAudioPlayback_open(ALCcoreAudioPlayback *self, const ALCch /* open the default output unit */ desc.componentType = kAudioUnitType_Output; +#if TARGET_OS_IOS + desc.componentSubType = kAudioUnitSubType_RemoteIO; +#else desc.componentSubType = kAudioUnitSubType_DefaultOutput; +#endif desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; @@ -189,12 +147,6 @@ static ALCenum ALCcoreAudioPlayback_open(ALCcoreAudioPlayback *self, const ALCch return ALC_NO_ERROR; } -static void ALCcoreAudioPlayback_close(ALCcoreAudioPlayback *self) -{ - AudioUnitUninitialize(self->audioUnit); - AudioComponentInstanceDispose(self->audioUnit); -} - static ALCboolean ALCcoreAudioPlayback_reset(ALCcoreAudioPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; @@ -382,7 +334,6 @@ typedef struct ALCcoreAudioCapture { static void ALCcoreAudioCapture_Construct(ALCcoreAudioCapture *self, ALCdevice *device); static void ALCcoreAudioCapture_Destruct(ALCcoreAudioCapture *self); static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar *name); -static void ALCcoreAudioCapture_close(ALCcoreAudioCapture *self); static DECLARE_FORWARD(ALCcoreAudioCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCcoreAudioCapture_start(ALCcoreAudioCapture *self); static void ALCcoreAudioCapture_stop(ALCcoreAudioCapture *self); @@ -396,15 +347,59 @@ DECLARE_DEFAULT_ALLOCATORS(ALCcoreAudioCapture) DEFINE_ALCBACKEND_VTABLE(ALCcoreAudioCapture); +static AudioBufferList *allocate_buffer_list(UInt32 channelCount, UInt32 byteSize) +{ + AudioBufferList *list; + + list = calloc(1, FAM_SIZE(AudioBufferList, mBuffers, 1) + byteSize); + if(list) + { + list->mNumberBuffers = 1; + + list->mBuffers[0].mNumberChannels = channelCount; + list->mBuffers[0].mDataByteSize = byteSize; + list->mBuffers[0].mData = &list->mBuffers[1]; + } + return list; +} + +static void destroy_buffer_list(AudioBufferList *list) +{ + free(list); +} + + static void ALCcoreAudioCapture_Construct(ALCcoreAudioCapture *self, ALCdevice *device) { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCcoreAudioCapture, ALCbackend, self); + self->audioUnit = 0; + self->audioConverter = NULL; + self->bufferList = NULL; + self->resampleBuffer = NULL; + self->ring = NULL; } static void ALCcoreAudioCapture_Destruct(ALCcoreAudioCapture *self) { + ll_ringbuffer_free(self->ring); + self->ring = NULL; + + free(self->resampleBuffer); + self->resampleBuffer = NULL; + + destroy_buffer_list(self->bufferList); + self->bufferList = NULL; + + if(self->audioConverter) + AudioConverterDispose(self->audioConverter); + self->audioConverter = NULL; + + if(self->audioUnit) + AudioComponentInstanceDispose(self->audioUnit); + self->audioUnit = 0; + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -459,7 +454,6 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar AudioStreamBasicDescription outputFormat; // The AudioUnit output format AURenderCallbackStruct input; AudioComponentDescription desc; - AudioDeviceID inputDevice; UInt32 outputFrameCount; UInt32 propertySize; AudioObjectPropertyAddress propertyAddress; @@ -473,7 +467,11 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar return ALC_INVALID_VALUE; desc.componentType = kAudioUnitType_Output; +#if TARGET_OS_IOS + desc.componentSubType = kAudioUnitSubType_RemoteIO; +#else desc.componentSubType = kAudioUnitSubType_HALOutput; +#endif desc.componentManufacturer = kAudioUnitManufacturer_Apple; desc.componentFlags = 0; desc.componentFlagsMask = 0; @@ -512,7 +510,9 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar goto error; } +#if !TARGET_OS_IOS // Get the default input device + AudioDeviceID inputDevice = kAudioDeviceUnknown; propertySize = sizeof(AudioDeviceID); propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice; @@ -525,7 +525,6 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar ERR("AudioObjectGetPropertyData failed\n"); goto error; } - if(inputDevice == kAudioDeviceUnknown) { ERR("No input device found\n"); @@ -539,6 +538,7 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar ERR("AudioUnitSetProperty failed\n"); goto error; } +#endif // set capture callback input.inputProc = ALCcoreAudioCapture_RecordProc; @@ -667,8 +667,8 @@ static ALCenum ALCcoreAudioCapture_open(ALCcoreAudioCapture *self, const ALCchar goto error; self->ring = ll_ringbuffer_create( - device->UpdateSize*self->sampleRateRatio*device->NumUpdates + 1, - self->frameSize + (size_t)ceil(device->UpdateSize*self->sampleRateRatio*device->NumUpdates), + self->frameSize, false ); if(!self->ring) goto error; @@ -680,30 +680,21 @@ error: ll_ringbuffer_free(self->ring); self->ring = NULL; free(self->resampleBuffer); + self->resampleBuffer = NULL; destroy_buffer_list(self->bufferList); + self->bufferList = NULL; if(self->audioConverter) AudioConverterDispose(self->audioConverter); + self->audioConverter = NULL; if(self->audioUnit) AudioComponentInstanceDispose(self->audioUnit); + self->audioUnit = 0; return ALC_INVALID_VALUE; } -static void ALCcoreAudioCapture_close(ALCcoreAudioCapture *self) -{ - ll_ringbuffer_free(self->ring); - self->ring = NULL; - - free(self->resampleBuffer); - - destroy_buffer_list(self->bufferList); - - AudioConverterDispose(self->audioConverter); - AudioComponentInstanceDispose(self->audioUnit); -} - static ALCboolean ALCcoreAudioCapture_start(ALCcoreAudioCapture *self) { OSStatus err = AudioOutputUnitStart(self->audioUnit); @@ -724,27 +715,26 @@ static void ALCcoreAudioCapture_stop(ALCcoreAudioCapture *self) static ALCenum ALCcoreAudioCapture_captureSamples(ALCcoreAudioCapture *self, ALCvoid *buffer, ALCuint samples) { - AudioBufferList *list; + union { + ALbyte _[sizeof(AudioBufferList) + sizeof(AudioBuffer)]; + AudioBufferList list; + } audiobuf = { { 0 } }; UInt32 frameCount; OSStatus err; // If no samples are requested, just return - if(samples == 0) - return ALC_NO_ERROR; - - // Allocate a temporary AudioBufferList to use as the return resamples data - list = alloca(sizeof(AudioBufferList) + sizeof(AudioBuffer)); + if(samples == 0) return ALC_NO_ERROR; // Point the resampling buffer to the capture buffer - list->mNumberBuffers = 1; - list->mBuffers[0].mNumberChannels = self->format.mChannelsPerFrame; - list->mBuffers[0].mDataByteSize = samples * self->frameSize; - list->mBuffers[0].mData = buffer; + audiobuf.list.mNumberBuffers = 1; + audiobuf.list.mBuffers[0].mNumberChannels = self->format.mChannelsPerFrame; + audiobuf.list.mBuffers[0].mDataByteSize = samples * self->frameSize; + audiobuf.list.mBuffers[0].mData = buffer; // Resample into another AudioBufferList frameCount = samples; err = AudioConverterFillComplexBuffer(self->audioConverter, - ALCcoreAudioCapture_ConvertCallback, self, &frameCount, list, NULL + ALCcoreAudioCapture_ConvertCallback, self, &frameCount, &audiobuf.list, NULL ); if(err != noErr) { @@ -770,7 +760,7 @@ ALCbackendFactory *ALCcoreAudioBackendFactory_getFactory(void); static ALCboolean ALCcoreAudioBackendFactory_init(ALCcoreAudioBackendFactory *self); static DECLARE_FORWARD(ALCcoreAudioBackendFactory, ALCbackendFactory, void, deinit) static ALCboolean ALCcoreAudioBackendFactory_querySupport(ALCcoreAudioBackendFactory *self, ALCbackend_Type type); -static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory *self, enum DevProbe type); +static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCcoreAudioBackendFactory_createBackend(ALCcoreAudioBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCcoreAudioBackendFactory); @@ -794,15 +784,13 @@ static ALCboolean ALCcoreAudioBackendFactory_querySupport(ALCcoreAudioBackendFac return ALC_FALSE; } -static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCcoreAudioBackendFactory_probe(ALCcoreAudioBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(ca_device); - break; case CAPTURE_DEVICE_PROBE: - AppendCaptureDeviceList(ca_device); + alstr_append_range(outnames, ca_device, ca_device+sizeof(ca_device)); break; } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/dsound.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/dsound.c similarity index 93% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/dsound.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/dsound.c index f730dc95..c368cffb 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/dsound.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/dsound.c @@ -34,6 +34,7 @@ #include "alMain.h" #include "alu.h" +#include "ringbuffer.h" #include "threads.h" #include "compat.h" #include "alstring.h" @@ -184,16 +185,15 @@ typedef struct ALCdsoundPlayback { IDirectSoundNotify *Notifies; HANDLE NotifyEvent; - volatile int killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCdsoundPlayback; static int ALCdsoundPlayback_mixerProc(void *ptr); static void ALCdsoundPlayback_Construct(ALCdsoundPlayback *self, ALCdevice *device); -static DECLARE_FORWARD(ALCdsoundPlayback, ALCbackend, void, Destruct) +static void ALCdsoundPlayback_Destruct(ALCdsoundPlayback *self); static ALCenum ALCdsoundPlayback_open(ALCdsoundPlayback *self, const ALCchar *name); -static void ALCdsoundPlayback_close(ALCdsoundPlayback *self); static ALCboolean ALCdsoundPlayback_reset(ALCdsoundPlayback *self); static ALCboolean ALCdsoundPlayback_start(ALCdsoundPlayback *self); static void ALCdsoundPlayback_stop(ALCdsoundPlayback *self); @@ -211,6 +211,35 @@ static void ALCdsoundPlayback_Construct(ALCdsoundPlayback *self, ALCdevice *devi { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCdsoundPlayback, ALCbackend, self); + + self->DS = NULL; + self->PrimaryBuffer = NULL; + self->Buffer = NULL; + self->Notifies = NULL; + self->NotifyEvent = NULL; + ATOMIC_INIT(&self->killNow, AL_TRUE); +} + +static void ALCdsoundPlayback_Destruct(ALCdsoundPlayback *self) +{ + if(self->Notifies) + IDirectSoundNotify_Release(self->Notifies); + self->Notifies = NULL; + if(self->Buffer) + IDirectSoundBuffer_Release(self->Buffer); + self->Buffer = NULL; + if(self->PrimaryBuffer != NULL) + IDirectSoundBuffer_Release(self->PrimaryBuffer); + self->PrimaryBuffer = NULL; + + if(self->DS) + IDirectSound_Release(self->DS); + self->DS = NULL; + if(self->NotifyEvent) + CloseHandle(self->NotifyEvent); + self->NotifyEvent = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -239,7 +268,7 @@ FORCE_ALIGN static int ALCdsoundPlayback_mixerProc(void *ptr) { ERR("Failed to get buffer caps: 0x%lx\n", err); ALCdevice_Lock(device); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failure retrieving playback buffer info: 0x%lx", err); ALCdevice_Unlock(device); return 1; } @@ -248,7 +277,8 @@ FORCE_ALIGN static int ALCdsoundPlayback_mixerProc(void *ptr) FragSize = device->UpdateSize * FrameSize; IDirectSoundBuffer_GetCurrentPosition(self->Buffer, &LastCursor, NULL); - while(!self->killNow) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { // Get current play cursor IDirectSoundBuffer_GetCurrentPosition(self->Buffer, &PlayCursor, NULL); @@ -263,7 +293,7 @@ FORCE_ALIGN static int ALCdsoundPlayback_mixerProc(void *ptr) { ERR("Failed to play buffer: 0x%lx\n", err); ALCdevice_Lock(device); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failure starting playback: 0x%lx", err); ALCdevice_Unlock(device); return 1; } @@ -311,7 +341,7 @@ FORCE_ALIGN static int ALCdsoundPlayback_mixerProc(void *ptr) { ERR("Buffer lock error: %#lx\n", err); ALCdevice_Lock(device); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to lock output buffer: 0x%lx", err); ALCdevice_Unlock(device); return 1; } @@ -386,24 +416,6 @@ static ALCenum ALCdsoundPlayback_open(ALCdsoundPlayback *self, const ALCchar *de return ALC_NO_ERROR; } -static void ALCdsoundPlayback_close(ALCdsoundPlayback *self) -{ - if(self->Notifies) - IDirectSoundNotify_Release(self->Notifies); - self->Notifies = NULL; - if(self->Buffer) - IDirectSoundBuffer_Release(self->Buffer); - self->Buffer = NULL; - if(self->PrimaryBuffer != NULL) - IDirectSoundBuffer_Release(self->PrimaryBuffer); - self->PrimaryBuffer = NULL; - - IDirectSound_Release(self->DS); - self->DS = NULL; - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; -} - static ALCboolean ALCdsoundPlayback_reset(ALCdsoundPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -626,7 +638,7 @@ retry_open: static ALCboolean ALCdsoundPlayback_start(ALCdsoundPlayback *self) { - self->killNow = 0; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCdsoundPlayback_mixerProc, self) != althrd_success) return ALC_FALSE; @@ -637,10 +649,8 @@ static void ALCdsoundPlayback_stop(ALCdsoundPlayback *self) { int res; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - self->killNow = 1; althrd_join(self->thread, &res); IDirectSoundBuffer_Stop(self->Buffer); @@ -660,9 +670,8 @@ typedef struct ALCdsoundCapture { } ALCdsoundCapture; static void ALCdsoundCapture_Construct(ALCdsoundCapture *self, ALCdevice *device); -static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, void, Destruct) +static void ALCdsoundCapture_Destruct(ALCdsoundCapture *self); static ALCenum ALCdsoundCapture_open(ALCdsoundCapture *self, const ALCchar *name); -static void ALCdsoundCapture_close(ALCdsoundCapture *self); static DECLARE_FORWARD(ALCdsoundCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCdsoundCapture_start(ALCdsoundCapture *self); static void ALCdsoundCapture_stop(ALCdsoundCapture *self); @@ -679,6 +688,29 @@ static void ALCdsoundCapture_Construct(ALCdsoundCapture *self, ALCdevice *device { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCdsoundCapture, ALCbackend, self); + + self->DSC = NULL; + self->DSCbuffer = NULL; + self->Ring = NULL; +} + +static void ALCdsoundCapture_Destruct(ALCdsoundCapture *self) +{ + ll_ringbuffer_free(self->Ring); + self->Ring = NULL; + + if(self->DSCbuffer != NULL) + { + IDirectSoundCaptureBuffer_Stop(self->DSCbuffer); + IDirectSoundCaptureBuffer_Release(self->DSCbuffer); + self->DSCbuffer = NULL; + } + + if(self->DSC) + IDirectSoundCapture_Release(self->DSC); + self->DSC = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -824,8 +856,8 @@ static ALCenum ALCdsoundCapture_open(ALCdsoundCapture *self, const ALCchar *devi hr = IDirectSoundCapture_CreateCaptureBuffer(self->DSC, &DSCBDescription, &self->DSCbuffer, NULL); if(SUCCEEDED(hr)) { - self->Ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates + 1, - InputType.Format.nBlockAlign); + self->Ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates, + InputType.Format.nBlockAlign, false); if(self->Ring == NULL) hr = DSERR_OUTOFMEMORY; } @@ -854,22 +886,6 @@ static ALCenum ALCdsoundCapture_open(ALCdsoundCapture *self, const ALCchar *devi return ALC_NO_ERROR; } -static void ALCdsoundCapture_close(ALCdsoundCapture *self) -{ - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - if(self->DSCbuffer != NULL) - { - IDirectSoundCaptureBuffer_Stop(self->DSCbuffer); - IDirectSoundCaptureBuffer_Release(self->DSCbuffer); - self->DSCbuffer = NULL; - } - - IDirectSoundCapture_Release(self->DSC); - self->DSC = NULL; -} - static ALCboolean ALCdsoundCapture_start(ALCdsoundCapture *self) { HRESULT hr; @@ -878,7 +894,8 @@ static ALCboolean ALCdsoundCapture_start(ALCdsoundCapture *self) if(FAILED(hr)) { ERR("start failed: 0x%08lx\n", hr); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, + "Failure starting capture: 0x%lx", hr); return ALC_FALSE; } @@ -893,7 +910,8 @@ static void ALCdsoundCapture_stop(ALCdsoundCapture *self) if(FAILED(hr)) { ERR("stop failed: 0x%08lx\n", hr); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, + "Failure stopping capture: 0x%lx", hr); } } @@ -912,7 +930,7 @@ static ALCuint ALCdsoundCapture_availableSamples(ALCdsoundCapture *self) DWORD FrameSize; HRESULT hr; - if(!device->Connected) + if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) goto done; FrameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); @@ -943,19 +961,14 @@ static ALCuint ALCdsoundCapture_availableSamples(ALCdsoundCapture *self) if(FAILED(hr)) { ERR("update failed: 0x%08lx\n", hr); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failure retrieving capture data: 0x%lx", hr); } done: - return ll_ringbuffer_read_space(self->Ring); + return (ALCuint)ll_ringbuffer_read_space(self->Ring); } -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - typedef struct ALCdsoundBackendFactory { DERIVE_FROM_TYPE(ALCbackendFactory); } ALCdsoundBackendFactory; @@ -966,7 +979,7 @@ ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void); static ALCboolean ALCdsoundBackendFactory_init(ALCdsoundBackendFactory *self); static void ALCdsoundBackendFactory_deinit(ALCdsoundBackendFactory *self); static ALCboolean ALCdsoundBackendFactory_querySupport(ALCdsoundBackendFactory *self, ALCbackend_Type type); -static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory *self, enum DevProbe type); +static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCdsoundBackendFactory_createBackend(ALCdsoundBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCdsoundBackendFactory); @@ -1010,7 +1023,7 @@ static ALCboolean ALCdsoundBackendFactory_querySupport(ALCdsoundBackendFactory* return ALC_FALSE; } -static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { HRESULT hr, hrcom; @@ -1018,12 +1031,17 @@ static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory* UNUSED(self), hrcom = CoInitialize(NULL); switch(type) { +#define APPEND_OUTNAME(e) do { \ + if(!alstr_empty((e)->name)) \ + alstr_append_range(outnames, VECTOR_BEGIN((e)->name), \ + VECTOR_END((e)->name)+1); \ +} while(0) case ALL_DEVICE_PROBE: clear_devlist(&PlaybackDevices); hr = DirectSoundEnumerateW(DSoundEnumDevices, &PlaybackDevices); if(FAILED(hr)) ERR("Error enumerating DirectSound playback devices (0x%lx)!\n", hr); - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); + VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: @@ -1031,8 +1049,9 @@ static void ALCdsoundBackendFactory_probe(ALCdsoundBackendFactory* UNUSED(self), hr = DirectSoundCaptureEnumerateW(DSoundEnumDevices, &CaptureDevices); if(FAILED(hr)) ERR("Error enumerating DirectSound capture devices (0x%lx)!\n", hr); - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); + VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } if(SUCCEEDED(hrcom)) CoUninitialize(); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/jack.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/jack.c similarity index 86% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/jack.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/jack.c index ceff0b3a..fdbe93f2 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/jack.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/jack.c @@ -26,6 +26,8 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" #include "threads.h" #include "compat.h" @@ -148,9 +150,9 @@ typedef struct ALCjackPlayback { jack_port_t *Port[MAX_OUTPUT_CHANNELS]; ll_ringbuffer_t *Ring; - alcnd_t Cond; + alsem_t Sem; - volatile int killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCjackPlayback; @@ -162,7 +164,6 @@ static int ALCjackPlayback_mixerProc(void *arg); static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device); static void ALCjackPlayback_Destruct(ALCjackPlayback *self); static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name); -static void ALCjackPlayback_close(ALCjackPlayback *self); static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self); static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self); static void ALCjackPlayback_stop(ALCjackPlayback *self); @@ -183,14 +184,14 @@ static void ALCjackPlayback_Construct(ALCjackPlayback *self, ALCdevice *device) ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCjackPlayback, ALCbackend, self); - alcnd_init(&self->Cond); + alsem_init(&self->Sem, 0); self->Client = NULL; for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) self->Port[i] = NULL; self->Ring = NULL; - self->killNow = 1; + ATOMIC_INIT(&self->killNow, AL_TRUE); } static void ALCjackPlayback_Destruct(ALCjackPlayback *self) @@ -209,7 +210,7 @@ static void ALCjackPlayback_Destruct(ALCjackPlayback *self) self->Client = NULL; } - alcnd_destroy(&self->Cond); + alsem_destroy(&self->Sem); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -228,19 +229,19 @@ static int ALCjackPlayback_bufferSizeNotify(jack_nframes_t numframes, void *arg) bufsize = device->UpdateSize; if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize)) bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize); - bufsize += device->UpdateSize; - device->NumUpdates = bufsize / device->UpdateSize; + device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize; TRACE("%u update size x%u\n", device->UpdateSize, device->NumUpdates); ll_ringbuffer_free(self->Ring); self->Ring = ll_ringbuffer_create(bufsize, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder) + FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), + true ); if(!self->Ring) { ERR("Failed to reallocate ringbuffer\n"); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to reallocate %u-sample buffer", bufsize); } ALCjackPlayback_unlock(self); return 0; @@ -286,7 +287,7 @@ static int ALCjackPlayback_process(jack_nframes_t numframes, void *arg) } ll_ringbuffer_read_advance(self->Ring, total); - alcnd_signal(&self->Cond); + alsem_post(&self->Sem); if(numframes > total) { @@ -311,27 +312,16 @@ static int ALCjackPlayback_mixerProc(void *arg) althrd_setname(althrd_current(), MIXER_THREAD_NAME); ALCjackPlayback_lock(self); - while(!self->killNow && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { ALuint todo, len1, len2; - /* NOTE: Unfortunately, there is an unavoidable race condition here. - * It's possible for the process() method to run, updating the read - * pointer and signaling the condition variable, in between the mixer - * loop checking the write size and waiting for the condition variable. - * This will cause the mixer loop to wait until the *next* process() - * invocation, most likely writing silence for it. - * - * However, this should only happen if the mixer is running behind - * anyway (as ideally we'll be asleep in alcnd_wait by the time the - * process() method is invoked), so this behavior is not unwarranted. - * It's unfortunate since it'll be wasting time sleeping that could be - * used to catch up, but there's no way around it without blocking in - * the process() method. - */ if(ll_ringbuffer_write_space(self->Ring) < device->UpdateSize) { - alcnd_wait(&self->Cond, &STATIC_CAST(ALCbackend,self)->mMutex); + ALCjackPlayback_unlock(self); + alsem_wait(&self->Sem); + ALCjackPlayback_lock(self); continue; } @@ -386,20 +376,6 @@ static ALCenum ALCjackPlayback_open(ALCjackPlayback *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCjackPlayback_close(ALCjackPlayback *self) -{ - ALuint i; - - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - { - if(self->Port[i]) - jack_port_unregister(self->Client, self->Port[i]); - self->Port[i] = NULL; - } - jack_client_close(self->Client); - self->Client = NULL; -} - static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -414,9 +390,7 @@ static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self) } /* Ignore the requested buffer metrics and just keep one JACK-sized buffer - * ready for when requested. Note that one period's worth of audio in the - * ring buffer will always be left unfilled because one element of the ring - * buffer will not be writeable, and we only write in period-sized chunks. + * ready for when requested. */ device->Frequency = jack_get_sample_rate(self->Client); device->UpdateSize = jack_get_buffer_size(self->Client); @@ -425,8 +399,7 @@ static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self) bufsize = device->UpdateSize; if(ConfigValueUInt(alstr_get_cstr(device->DeviceName), "jack", "buffer-size", &bufsize)) bufsize = maxu(NextPowerOf2(bufsize), device->UpdateSize); - bufsize += device->UpdateSize; - device->NumUpdates = bufsize / device->UpdateSize; + device->NumUpdates = (bufsize+device->UpdateSize) / device->UpdateSize; /* Force 32-bit float output. */ device->FmtType = DevFmtFloat; @@ -461,7 +434,8 @@ static ALCboolean ALCjackPlayback_reset(ALCjackPlayback *self) ll_ringbuffer_free(self->Ring); self->Ring = ll_ringbuffer_create(bufsize, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder) + FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), + true ); if(!self->Ring) { @@ -504,7 +478,7 @@ static ALCboolean ALCjackPlayback_start(ALCjackPlayback *self) } jack_free(ports); - self->killNow = 0; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCjackPlayback_mixerProc, self) != althrd_success) { jack_deactivate(self->Client); @@ -518,17 +492,10 @@ static void ALCjackPlayback_stop(ALCjackPlayback *self) { int res; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - self->killNow = 1; - /* Lock the backend to ensure we don't flag the mixer to die and signal the - * mixer to wake up in between it checking the flag and going to sleep and - * wait for a wakeup (potentially leading to it never waking back up to see - * the flag). */ - ALCjackPlayback_lock(self); - ALCjackPlayback_unlock(self); - alcnd_signal(&self->Cond); + alsem_post(&self->Sem); althrd_join(self->thread, &res); jack_deactivate(self->Client); @@ -604,12 +571,12 @@ static ALCboolean ALCjackBackendFactory_querySupport(ALCjackBackendFactory* UNUS return ALC_FALSE; } -static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCjackBackendFactory_probe(ALCjackBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(jackDevice); + alstr_append_range(outnames, jackDevice, jackDevice+sizeof(jackDevice)); break; case CAPTURE_DEVICE_PROBE: diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/loopback.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/loopback.c similarity index 96% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/loopback.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/loopback.c index 8f23aad9..e9940086 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/loopback.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/loopback.c @@ -35,7 +35,6 @@ typedef struct ALCloopback { static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device); static DECLARE_FORWARD(ALCloopback, ALCbackend, void, Destruct) static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name); -static void ALCloopback_close(ALCloopback *self); static ALCboolean ALCloopback_reset(ALCloopback *self); static ALCboolean ALCloopback_start(ALCloopback *self); static void ALCloopback_stop(ALCloopback *self); @@ -63,10 +62,6 @@ static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCloopback_close(ALCloopback* UNUSED(self)) -{ -} - static ALCboolean ALCloopback_reset(ALCloopback *self) { SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); @@ -92,7 +87,7 @@ ALCbackendFactory *ALCloopbackFactory_getFactory(void); static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory *self); static DECLARE_FORWARD(ALCloopbackFactory, ALCbackendFactory, void, deinit) static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory *self, ALCbackend_Type type); -static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type); +static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCloopbackFactory); @@ -115,7 +110,7 @@ static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory* UNUSED(sel return ALC_FALSE; } -static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type)) +static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type), al_string* UNUSED(outnames)) { } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/null.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/null.c similarity index 92% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/null.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/null.c index e8c43782..d1c110e8 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/null.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/null.c @@ -36,7 +36,7 @@ typedef struct ALCnullBackend { DERIVE_FROM_TYPE(ALCbackend); - volatile int killNow; + ATOMIC(int) killNow; althrd_t thread; } ALCnullBackend; @@ -45,7 +45,6 @@ static int ALCnullBackend_mixerProc(void *ptr); static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device); static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, Destruct) static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name); -static void ALCnullBackend_close(ALCnullBackend *self); static ALCboolean ALCnullBackend_reset(ALCnullBackend *self); static ALCboolean ALCnullBackend_start(ALCnullBackend *self); static void ALCnullBackend_stop(ALCnullBackend *self); @@ -66,6 +65,8 @@ static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device) { ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCnullBackend, ALCbackend, self); + + ATOMIC_INIT(&self->killNow, AL_TRUE); } @@ -87,7 +88,8 @@ static int ALCnullBackend_mixerProc(void *ptr) ERR("Failed to get starting time\n"); return 1; } - while(!self->killNow && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { if(altimespec_get(&now, AL_TIME_UTC) != AL_TIME_UTC) { @@ -135,10 +137,6 @@ static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCnullBackend_close(ALCnullBackend* UNUSED(self)) -{ -} - static ALCboolean ALCnullBackend_reset(ALCnullBackend *self) { SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice); @@ -147,7 +145,7 @@ static ALCboolean ALCnullBackend_reset(ALCnullBackend *self) static ALCboolean ALCnullBackend_start(ALCnullBackend *self) { - self->killNow = 0; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCnullBackend_mixerProc, self) != althrd_success) return ALC_FALSE; return ALC_TRUE; @@ -157,10 +155,8 @@ static void ALCnullBackend_stop(ALCnullBackend *self) { int res; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - self->killNow = 1; althrd_join(self->thread, &res); } @@ -175,7 +171,7 @@ ALCbackendFactory *ALCnullBackendFactory_getFactory(void); static ALCboolean ALCnullBackendFactory_init(ALCnullBackendFactory *self); static DECLARE_FORWARD(ALCnullBackendFactory, ALCbackendFactory, void, deinit) static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory *self, ALCbackend_Type type); -static void ALCnullBackendFactory_probe(ALCnullBackendFactory *self, enum DevProbe type); +static void ALCnullBackendFactory_probe(ALCnullBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCnullBackendFactory_createBackend(ALCnullBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCnullBackendFactory); @@ -199,14 +195,13 @@ static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory* UNUS return ALC_FALSE; } -static void ALCnullBackendFactory_probe(ALCnullBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCnullBackendFactory_probe(ALCnullBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(nullDevice); - break; case CAPTURE_DEVICE_PROBE: + alstr_append_range(outnames, nullDevice, nullDevice+sizeof(nullDevice)); break; } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/opensl.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/opensl.c similarity index 86% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/opensl.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/opensl.c index aa1ff991..d8ae001b 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/opensl.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/opensl.c @@ -26,8 +26,9 @@ #include "alMain.h" #include "alu.h" -#include "compat.h" +#include "ringbuffer.h" #include "threads.h" +#include "compat.h" #include "backends/base.h" @@ -145,7 +146,7 @@ typedef struct ALCopenslPlayback { SLObjectItf mBufferQueueObj; ll_ringbuffer_t *mRing; - alcnd_t mCond; + alsem_t mSem; ALsizei mFrameSize; @@ -159,7 +160,6 @@ static int ALCopenslPlayback_mixerProc(void *arg); static void ALCopenslPlayback_Construct(ALCopenslPlayback *self, ALCdevice *device); static void ALCopenslPlayback_Destruct(ALCopenslPlayback *self); static ALCenum ALCopenslPlayback_open(ALCopenslPlayback *self, const ALCchar *name); -static void ALCopenslPlayback_close(ALCopenslPlayback *self); static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self); static ALCboolean ALCopenslPlayback_start(ALCopenslPlayback *self); static void ALCopenslPlayback_stop(ALCopenslPlayback *self); @@ -184,7 +184,7 @@ static void ALCopenslPlayback_Construct(ALCopenslPlayback *self, ALCdevice *devi self->mBufferQueueObj = NULL; self->mRing = NULL; - alcnd_init(&self->mCond); + alsem_init(&self->mSem, 0); self->mFrameSize = 0; @@ -197,11 +197,11 @@ static void ALCopenslPlayback_Destruct(ALCopenslPlayback* self) VCALL0(self->mBufferQueueObj,Destroy)(); self->mBufferQueueObj = NULL; - if(self->mOutputMix != NULL) + if(self->mOutputMix) VCALL0(self->mOutputMix,Destroy)(); self->mOutputMix = NULL; - if(self->mEngineObj != NULL) + if(self->mEngineObj) VCALL0(self->mEngineObj,Destroy)(); self->mEngineObj = NULL; self->mEngine = NULL; @@ -209,7 +209,7 @@ static void ALCopenslPlayback_Destruct(ALCopenslPlayback* self) ll_ringbuffer_free(self->mRing); self->mRing = NULL; - alcnd_destroy(&self->mCond); + alsem_destroy(&self->mSem); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -230,7 +230,7 @@ static void ALCopenslPlayback_process(SLAndroidSimpleBufferQueueItf UNUSED(bq), */ ll_ringbuffer_read_advance(self->mRing, 1); - alcnd_signal(&self->mCond); + alsem_post(&self->mSem); } @@ -242,7 +242,6 @@ static int ALCopenslPlayback_mixerProc(void *arg) ll_ringbuffer_data_t data[2]; SLPlayItf player; SLresult result; - size_t padding; SetRTPriority(); althrd_setname(althrd_current(), MIXER_THREAD_NAME); @@ -255,25 +254,18 @@ static int ALCopenslPlayback_mixerProc(void *arg) result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player); PRINTERR(result, "bufferQueue->GetInterface SL_IID_PLAY"); } - if(SL_RESULT_SUCCESS != result) - { - ALCopenslPlayback_lock(self); - aluHandleDisconnect(device); - ALCopenslPlayback_unlock(self); - return 1; - } - - /* NOTE: The ringbuffer will be larger than the desired buffer metrics. - * Calculate the amount of extra space so we know how much to keep unused. - */ - padding = ll_ringbuffer_write_space(self->mRing) - device->NumUpdates; ALCopenslPlayback_lock(self); - while(ATOMIC_LOAD_SEQ(&self->mKillNow) == AL_FALSE && device->Connected) - { - size_t todo, len0, len1; + if(SL_RESULT_SUCCESS != result) + aluHandleDisconnect(device, "Failed to get playback buffer: 0x%08x", result); - if(ll_ringbuffer_write_space(self->mRing) <= padding) + while(SL_RESULT_SUCCESS == result && + !ATOMIC_LOAD(&self->mKillNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) + { + size_t todo; + + if(ll_ringbuffer_write_space(self->mRing) == 0) { SLuint32 state = 0; @@ -286,61 +278,47 @@ static int ALCopenslPlayback_mixerProc(void *arg) } if(SL_RESULT_SUCCESS != result) { - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to start platback: 0x%08x", result); break; } - /* NOTE: Unfortunately, there is an unavoidable race condition - * here. It's possible for the process() method to run, updating - * the read pointer and signaling the condition variable, in - * between checking the write size and waiting for the condition - * variable here. This will cause alcnd_wait to wait until the - * *next* process() invocation signals the condition variable - * again. - * - * However, this should only happen if the mixer is running behind - * anyway (as ideally we'll be asleep in alcnd_wait by the time the - * process() method is invoked), so this behavior is not completely - * unwarranted. It's unfortunate since it'll be wasting time - * sleeping that could be used to catch up, but there's no way - * around it without blocking in the process() method. - */ - if(ll_ringbuffer_write_space(self->mRing) <= padding) + if(ll_ringbuffer_write_space(self->mRing) == 0) { - alcnd_wait(&self->mCond, &STATIC_CAST(ALCbackend,self)->mMutex); + ALCopenslPlayback_unlock(self); + alsem_wait(&self->mSem); + ALCopenslPlayback_lock(self); continue; } } ll_ringbuffer_get_write_vector(self->mRing, data); - todo = data[0].len+data[1].len - padding; - len0 = minu(todo, data[0].len); - len1 = minu(todo-len0, data[1].len); + aluMixData(device, data[0].buf, data[0].len*device->UpdateSize); + if(data[1].len > 0) + aluMixData(device, data[1].buf, data[1].len*device->UpdateSize); - aluMixData(device, data[0].buf, len0*device->UpdateSize); - for(size_t i = 0;i < len0;i++) + todo = data[0].len+data[1].len; + ll_ringbuffer_write_advance(self->mRing, todo); + + for(size_t i = 0;i < todo;i++) { + if(!data[0].len) + { + data[0] = data[1]; + data[1].buf = NULL; + data[1].len = 0; + } + result = VCALL(bufferQueue,Enqueue)(data[0].buf, device->UpdateSize*self->mFrameSize); PRINTERR(result, "bufferQueue->Enqueue"); - if(SL_RESULT_SUCCESS == result) - ll_ringbuffer_write_advance(self->mRing, 1); - - data[0].buf += device->UpdateSize*self->mFrameSize; - } - - if(len1 > 0) - { - aluMixData(device, data[1].buf, len1*device->UpdateSize); - for(size_t i = 0;i < len1;i++) + if(SL_RESULT_SUCCESS != result) { - result = VCALL(bufferQueue,Enqueue)(data[1].buf, device->UpdateSize*self->mFrameSize); - PRINTERR(result, "bufferQueue->Enqueue"); - if(SL_RESULT_SUCCESS == result) - ll_ringbuffer_write_advance(self->mRing, 1); - - data[1].buf += device->UpdateSize*self->mFrameSize; + aluHandleDisconnect(device, "Failed to queue audio: 0x%08x", result); + break; } + + data[0].len--; + data[0].buf += device->UpdateSize*self->mFrameSize; } } ALCopenslPlayback_unlock(self); @@ -402,20 +380,6 @@ static ALCenum ALCopenslPlayback_open(ALCopenslPlayback *self, const ALCchar *na return ALC_NO_ERROR; } -static void ALCopenslPlayback_close(ALCopenslPlayback *self) -{ - if(self->mBufferQueueObj != NULL) - VCALL0(self->mBufferQueueObj,Destroy)(); - self->mBufferQueueObj = NULL; - - VCALL0(self->mOutputMix,Destroy)(); - self->mOutputMix = NULL; - - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; -} - static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; @@ -427,19 +391,24 @@ static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) SLInterfaceID ids[2]; SLboolean reqs[2]; SLresult result; - JNIEnv *env; if(self->mBufferQueueObj != NULL) VCALL0(self->mBufferQueueObj,Destroy)(); self->mBufferQueueObj = NULL; + ll_ringbuffer_free(self->mRing); + self->mRing = NULL; + sampleRate = device->Frequency; - if(!(device->Flags&DEVICE_FREQUENCY_REQUEST) && (env=Android_GetJNIEnv()) != NULL) +#if 0 + if(!(device->Flags&DEVICE_FREQUENCY_REQUEST)) { /* FIXME: Disabled until I figure out how to get the Context needed for * the getSystemService call. */ -#if 0 + JNIEnv *env = Android_GetJNIEnv(); + jobject jctx = Android_GetContext(); + /* Get necessary stuff for using java.lang.Integer, * android.content.Context, and android.media.AudioManager. */ @@ -475,7 +444,7 @@ static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) /* Now make the calls. */ //AudioManager audMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); strobj = JCALL(env,GetStaticObjectField)(ctx_cls, ctx_audsvc); - jobject audMgr = JCALL(env,CallObjectMethod)(ctx_cls, ctx_getSysSvc, strobj); + jobject audMgr = JCALL(env,CallObjectMethod)(jctx, ctx_getSysSvc, strobj); strchars = JCALL(env,GetStringUTFChars)(strobj, NULL); TRACE("Context.getSystemService(%s) = %p\n", strchars, audMgr); JCALL(env,ReleaseStringUTFChars)(strobj, strchars); @@ -496,8 +465,8 @@ static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) if(!sampleRate) sampleRate = device->Frequency; else sampleRate = maxu(sampleRate, MIN_OUTPUT_RATE); -#endif } +#endif if(sampleRate != device->Frequency) { @@ -581,6 +550,18 @@ static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) result = VCALL(self->mBufferQueueObj,Realize)(SL_BOOLEAN_FALSE); PRINTERR(result, "bufferQueue->Realize"); } + if(SL_RESULT_SUCCESS == result) + { + self->mRing = ll_ringbuffer_create(device->NumUpdates, + self->mFrameSize*device->UpdateSize, true + ); + if(!self->mRing) + { + ERR("Out of memory allocating ring buffer %ux%u %u\n", device->UpdateSize, + device->NumUpdates, self->mFrameSize); + result = SL_RESULT_MEMORY_FAILURE; + } + } if(SL_RESULT_SUCCESS != result) { @@ -596,17 +577,10 @@ static ALCboolean ALCopenslPlayback_reset(ALCopenslPlayback *self) static ALCboolean ALCopenslPlayback_start(ALCopenslPlayback *self) { - ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; SLAndroidSimpleBufferQueueItf bufferQueue; SLresult result; - ll_ringbuffer_free(self->mRing); - /* NOTE: Add an extra update since one period's worth of audio in the ring - * buffer will always be left unfilled because one element of the ring - * buffer will not be writeable, and we only write in period-sized chunks. - */ - self->mRing = ll_ringbuffer_create(device->NumUpdates + 1, - self->mFrameSize*device->UpdateSize); + ll_ringbuffer_reset(self->mRing); result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bufferQueue); @@ -640,14 +614,7 @@ static void ALCopenslPlayback_stop(ALCopenslPlayback *self) if(ATOMIC_EXCHANGE_SEQ(&self->mKillNow, AL_TRUE)) return; - /* Lock the backend to ensure we don't flag the mixer to die and signal the - * mixer to wake up in between it checking the flag and going to sleep and - * wait for a wakeup (potentially leading to it never waking back up to see - * the flag). - */ - ALCopenslPlayback_lock(self); - ALCopenslPlayback_unlock(self); - alcnd_signal(&self->mCond); + alsem_post(&self->mSem); althrd_join(self->mThread, &res); result = VCALL(self->mBufferQueueObj,GetInterface)(SL_IID_PLAY, &player); @@ -680,9 +647,6 @@ static void ALCopenslPlayback_stop(ALCopenslPlayback *self) } while(SL_RESULT_SUCCESS == result && state.count > 0); PRINTERR(result, "bufferQueue->GetState"); } - - ll_ringbuffer_free(self->mRing); - self->mRing = NULL; } static ClockLatency ALCopenslPlayback_getClockLatency(ALCopenslPlayback *self) @@ -721,7 +685,6 @@ static void ALCopenslCapture_process(SLAndroidSimpleBufferQueueItf bq, void *con static void ALCopenslCapture_Construct(ALCopenslCapture *self, ALCdevice *device); static void ALCopenslCapture_Destruct(ALCopenslCapture *self); static ALCenum ALCopenslCapture_open(ALCopenslCapture *self, const ALCchar *name); -static void ALCopenslCapture_close(ALCopenslCapture *self); static DECLARE_FORWARD(ALCopenslCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCopenslCapture_start(ALCopenslCapture *self); static void ALCopenslCapture_stop(ALCopenslCapture *self); @@ -760,9 +723,6 @@ static void ALCopenslCapture_Construct(ALCopenslCapture *self, ALCdevice *device static void ALCopenslCapture_Destruct(ALCopenslCapture *self) { - ll_ringbuffer_free(self->mRing); - self->mRing = NULL; - if(self->mRecordObj != NULL) VCALL0(self->mRecordObj,Destroy)(); self->mRecordObj = NULL; @@ -772,6 +732,9 @@ static void ALCopenslCapture_Destruct(ALCopenslCapture *self) self->mEngineObj = NULL; self->mEngine = NULL; + ll_ringbuffer_free(self->mRing); + self->mRing = NULL; + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -890,8 +853,9 @@ static ALCenum ALCopenslCapture_open(ALCopenslCapture *self, const ALCchar *name if(SL_RESULT_SUCCESS == result) { - self->mRing = ll_ringbuffer_create(device->NumUpdates + 1, - device->UpdateSize * self->mFrameSize); + self->mRing = ll_ringbuffer_create(device->NumUpdates, + device->UpdateSize*self->mFrameSize, false + ); result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bufferQueue); @@ -940,21 +904,6 @@ static ALCenum ALCopenslCapture_open(ALCopenslCapture *self, const ALCchar *name return ALC_NO_ERROR; } -static void ALCopenslCapture_close(ALCopenslCapture *self) -{ - ll_ringbuffer_free(self->mRing); - self->mRing = NULL; - - if(self->mRecordObj != NULL) - VCALL0(self->mRecordObj,Destroy)(); - self->mRecordObj = NULL; - - if(self->mEngineObj != NULL) - VCALL0(self->mEngineObj,Destroy)(); - self->mEngineObj = NULL; - self->mEngine = NULL; -} - static ALCboolean ALCopenslCapture_start(ALCopenslCapture *self) { SLRecordItf record; @@ -972,7 +921,8 @@ static ALCboolean ALCopenslCapture_start(ALCopenslCapture *self) if(SL_RESULT_SUCCESS != result) { ALCopenslCapture_lock(self); - aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend, self)->mDevice, + "Failed to start capture: 0x%08x", result); ALCopenslCapture_unlock(self); return ALC_FALSE; } @@ -1002,14 +952,16 @@ static ALCenum ALCopenslCapture_captureSamples(ALCopenslCapture *self, ALCvoid * SLAndroidSimpleBufferQueueItf bufferQueue; ll_ringbuffer_data_t data[2]; SLresult result; - size_t advance; ALCuint i; + result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, + &bufferQueue); + PRINTERR(result, "recordObj->GetInterface"); + /* Read the desired samples from the ring buffer then advance its read * pointer. */ ll_ringbuffer_get_read_vector(self->mRing, data); - advance = 0; for(i = 0;i < samples;) { ALCuint rem = minu(samples - i, device->UpdateSize - self->mSplOffset); @@ -1022,7 +974,11 @@ static ALCenum ALCopenslCapture_captureSamples(ALCopenslCapture *self, ALCvoid * { /* Finished a chunk, reset the offset and advance the read pointer. */ self->mSplOffset = 0; - advance++; + + ll_ringbuffer_read_advance(self->mRing, 1); + result = VCALL(bufferQueue,Enqueue)(data[0].buf, chunk_size); + PRINTERR(result, "bufferQueue->Enqueue"); + if(SL_RESULT_SUCCESS != result) break; data[0].len--; if(!data[0].len) @@ -1033,29 +989,11 @@ static ALCenum ALCopenslCapture_captureSamples(ALCopenslCapture *self, ALCvoid * i += rem; } - ll_ringbuffer_read_advance(self->mRing, advance); - - result = VCALL(self->mRecordObj,GetInterface)(SL_IID_ANDROIDSIMPLEBUFFERQUEUE, - &bufferQueue); - PRINTERR(result, "recordObj->GetInterface"); - - /* Enqueue any newly-writable chunks in the ring buffer. */ - ll_ringbuffer_get_write_vector(self->mRing, data); - for(i = 0;i < data[0].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[0].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } - for(i = 0;i < data[1].len && SL_RESULT_SUCCESS == result;i++) - { - result = VCALL(bufferQueue,Enqueue)(data[1].buf + chunk_size*i, chunk_size); - PRINTERR(result, "bufferQueue->Enqueue"); - } if(SL_RESULT_SUCCESS != result) { ALCopenslCapture_lock(self); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to update capture buffer: 0x%08x", result); ALCopenslCapture_unlock(self); return ALC_INVALID_DEVICE; } @@ -1091,16 +1029,13 @@ static ALCboolean ALCopenslBackendFactory_querySupport(ALCopenslBackendFactory* return ALC_FALSE; } -static void ALCopenslBackendFactory_probe(ALCopenslBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCopenslBackendFactory_probe(ALCopenslBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(opensl_device); - break; - case CAPTURE_DEVICE_PROBE: - AppendAllDevicesList(opensl_device); + alstr_append_range(outnames, opensl_device, opensl_device+sizeof(opensl_device)); break; } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/oss.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/oss.c similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/oss.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/oss.c index 9c63d9d2..71faad25 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/oss.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/oss.c @@ -35,6 +35,8 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" #include "threads.h" #include "compat.h" @@ -250,9 +252,8 @@ typedef struct ALCplaybackOSS { static int ALCplaybackOSS_mixerProc(void *ptr); static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device); -static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, Destruct) +static void ALCplaybackOSS_Destruct(ALCplaybackOSS *self); static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name); -static void ALCplaybackOSS_close(ALCplaybackOSS *self); static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self); static ALCboolean ALCplaybackOSS_start(ALCplaybackOSS *self); static void ALCplaybackOSS_stop(ALCplaybackOSS *self); @@ -283,7 +284,8 @@ static int ALCplaybackOSS_mixerProc(void *ptr) frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); ALCplaybackOSS_lock(self); - while(!ATOMIC_LOAD_SEQ(&self->killNow) && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { FD_ZERO(&wfds); FD_SET(self->fd, &wfds); @@ -298,7 +300,7 @@ static int ALCplaybackOSS_mixerProc(void *ptr) if(errno == EINTR) continue; ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed waiting for playback buffer: %s", strerror(errno)); break; } else if(sret == 0) @@ -318,7 +320,8 @@ static int ALCplaybackOSS_mixerProc(void *ptr) if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) continue; ERR("write failed: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed writing playback samples: %s", + strerror(errno)); break; } @@ -337,9 +340,19 @@ static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device) ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCplaybackOSS, ALCbackend, self); + self->fd = -1; ATOMIC_INIT(&self->killNow, AL_FALSE); } +static void ALCplaybackOSS_Destruct(ALCplaybackOSS *self) +{ + if(self->fd != -1) + close(self->fd); + self->fd = -1; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name) { struct oss_device *dev = &oss_playback; @@ -379,12 +392,6 @@ static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCplaybackOSS_close(ALCplaybackOSS *self) -{ - close(self->fd); - self->fd = -1; -} - static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -517,9 +524,8 @@ typedef struct ALCcaptureOSS { static int ALCcaptureOSS_recordProc(void *ptr); static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device); -static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, Destruct) +static void ALCcaptureOSS_Destruct(ALCcaptureOSS *self); static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name); -static void ALCcaptureOSS_close(ALCcaptureOSS *self); static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, ALCboolean, reset) static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self); static void ALCcaptureOSS_stop(ALCcaptureOSS *self); @@ -562,7 +568,7 @@ static int ALCcaptureOSS_recordProc(void *ptr) if(errno == EINTR) continue; ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to check capture samples: %s", strerror(errno)); break; } else if(sret == 0) @@ -579,7 +585,7 @@ static int ALCcaptureOSS_recordProc(void *ptr) { ERR("read failed: %s\n", strerror(errno)); ALCcaptureOSS_lock(self); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed reading capture samples: %s", strerror(errno)); ALCcaptureOSS_unlock(self); break; } @@ -596,9 +602,22 @@ static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device) ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCcaptureOSS, ALCbackend, self); + self->fd = -1; + self->ring = NULL; ATOMIC_INIT(&self->killNow, AL_FALSE); } +static void ALCcaptureOSS_Destruct(ALCcaptureOSS *self) +{ + if(self->fd != -1) + close(self->fd); + self->fd = -1; + + ll_ringbuffer_free(self->ring); + self->ring = NULL; + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -710,7 +729,7 @@ static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name) return ALC_INVALID_VALUE; } - self->ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates + 1, frameSize); + self->ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates, frameSize, false); if(!self->ring) { ERR("Ring buffer create failed\n"); @@ -724,15 +743,6 @@ static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCcaptureOSS_close(ALCcaptureOSS *self) -{ - close(self->fd); - self->fd = -1; - - ll_ringbuffer_free(self->ring); - self->ring = NULL; -} - static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self) { ATOMIC_STORE_SEQ(&self->killNow, AL_FALSE); @@ -776,7 +786,7 @@ ALCbackendFactory *ALCossBackendFactory_getFactory(void); static ALCboolean ALCossBackendFactory_init(ALCossBackendFactory *self); static void ALCossBackendFactory_deinit(ALCossBackendFactory *self); static ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory *self, ALCbackend_Type type); -static void ALCossBackendFactory_probe(ALCossBackendFactory *self, enum DevProbe type); +static void ALCossBackendFactory_probe(ALCossBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCossBackendFactory); @@ -810,41 +820,32 @@ ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory* UNUSED(self), return ALC_FALSE; } -void ALCossBackendFactory_probe(ALCossBackendFactory* UNUSED(self), enum DevProbe type) +void ALCossBackendFactory_probe(ALCossBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { - struct oss_device *cur; + struct oss_device *cur = NULL; switch(type) { case ALL_DEVICE_PROBE: ALCossListFree(&oss_playback); ALCossListPopulate(&oss_playback, DSP_CAP_OUTPUT); cur = &oss_playback; - while(cur != NULL) - { -#ifdef HAVE_STAT - struct stat buf; - if(stat(cur->path, &buf) == 0) -#endif - AppendAllDevicesList(cur->handle); - cur = cur->next; - } break; case CAPTURE_DEVICE_PROBE: ALCossListFree(&oss_capture); ALCossListPopulate(&oss_capture, DSP_CAP_INPUT); cur = &oss_capture; - while(cur != NULL) - { -#ifdef HAVE_STAT - struct stat buf; - if(stat(cur->path, &buf) == 0) -#endif - AppendCaptureDeviceList(cur->handle); - cur = cur->next; - } break; } + while(cur != NULL) + { +#ifdef HAVE_STAT + struct stat buf; + if(stat(cur->path, &buf) == 0) +#endif + alstr_append_range(outnames, cur->handle, cur->handle+strlen(cur->handle)+1); + cur = cur->next; + } } ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/portaudio.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/portaudio.c similarity index 95% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/portaudio.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/portaudio.c index 807e8000..6a6cfa31 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/portaudio.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/portaudio.c @@ -26,6 +26,8 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" #include "compat.h" #include "backends/base.h" @@ -139,7 +141,6 @@ static int ALCportPlayback_WriteCallback(const void *inputBuffer, void *outputBu static void ALCportPlayback_Construct(ALCportPlayback *self, ALCdevice *device); static void ALCportPlayback_Destruct(ALCportPlayback *self); static ALCenum ALCportPlayback_open(ALCportPlayback *self, const ALCchar *name); -static void ALCportPlayback_close(ALCportPlayback *self); static ALCboolean ALCportPlayback_reset(ALCportPlayback *self); static ALCboolean ALCportPlayback_start(ALCportPlayback *self); static void ALCportPlayback_stop(ALCportPlayback *self); @@ -163,8 +164,9 @@ static void ALCportPlayback_Construct(ALCportPlayback *self, ALCdevice *device) static void ALCportPlayback_Destruct(ALCportPlayback *self) { - if(self->stream) - Pa_CloseStream(self->stream); + PaError err = self->stream ? Pa_CloseStream(self->stream) : paNoError; + if(err != paNoError) + ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); self->stream = NULL; ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); @@ -251,14 +253,6 @@ retry_open: } -static void ALCportPlayback_close(ALCportPlayback *self) -{ - PaError err = Pa_CloseStream(self->stream); - if(err != paNoError) - ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); - self->stream = NULL; -} - static ALCboolean ALCportPlayback_reset(ALCportPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -336,7 +330,6 @@ static int ALCportCapture_ReadCallback(const void *inputBuffer, void *outputBuff static void ALCportCapture_Construct(ALCportCapture *self, ALCdevice *device); static void ALCportCapture_Destruct(ALCportCapture *self); static ALCenum ALCportCapture_open(ALCportCapture *self, const ALCchar *name); -static void ALCportCapture_close(ALCportCapture *self); static DECLARE_FORWARD(ALCportCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCportCapture_start(ALCportCapture *self); static void ALCportCapture_stop(ALCportCapture *self); @@ -356,16 +349,17 @@ static void ALCportCapture_Construct(ALCportCapture *self, ALCdevice *device) SET_VTABLE2(ALCportCapture, ALCbackend, self); self->stream = NULL; + self->ring = NULL; } static void ALCportCapture_Destruct(ALCportCapture *self) { - if(self->stream) - Pa_CloseStream(self->stream); + PaError err = self->stream ? Pa_CloseStream(self->stream) : paNoError; + if(err != paNoError) + ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); self->stream = NULL; - if(self->ring) - ll_ringbuffer_free(self->ring); + ll_ringbuffer_free(self->ring); self->ring = NULL; ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); @@ -401,7 +395,7 @@ static ALCenum ALCportCapture_open(ALCportCapture *self, const ALCchar *name) samples = maxu(samples, 100 * device->Frequency / 1000); frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - self->ring = ll_ringbuffer_create(samples, frame_size); + self->ring = ll_ringbuffer_create(samples, frame_size, false); if(self->ring == NULL) return ALC_INVALID_VALUE; self->params.device = -1; @@ -450,17 +444,6 @@ static ALCenum ALCportCapture_open(ALCportCapture *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCportCapture_close(ALCportCapture *self) -{ - PaError err = Pa_CloseStream(self->stream); - if(err != paNoError) - ERR("Error closing stream: %s\n", Pa_GetErrorText(err)); - self->stream = NULL; - - ll_ringbuffer_free(self->ring); - self->ring = NULL; -} - static ALCboolean ALCportCapture_start(ALCportCapture *self) { @@ -501,9 +484,8 @@ typedef struct ALCportBackendFactory { static ALCboolean ALCportBackendFactory_init(ALCportBackendFactory *self); static void ALCportBackendFactory_deinit(ALCportBackendFactory *self); static ALCboolean ALCportBackendFactory_querySupport(ALCportBackendFactory *self, ALCbackend_Type type); -static void ALCportBackendFactory_probe(ALCportBackendFactory *self, enum DevProbe type); +static void ALCportBackendFactory_probe(ALCportBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCportBackendFactory_createBackend(ALCportBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - DEFINE_ALCBACKENDFACTORY_VTABLE(ALCportBackendFactory); @@ -535,15 +517,13 @@ static ALCboolean ALCportBackendFactory_querySupport(ALCportBackendFactory* UNUS return ALC_FALSE; } -static void ALCportBackendFactory_probe(ALCportBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCportBackendFactory_probe(ALCportBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(pa_device); - break; case CAPTURE_DEVICE_PROBE: - AppendCaptureDeviceList(pa_device); + alstr_append_range(outnames, pa_device, pa_device+sizeof(pa_device)); break; } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/pulseaudio.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/pulseaudio.c similarity index 95% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/pulseaudio.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/pulseaudio.c index 8c5469b2..b34d7abc 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/pulseaudio.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/pulseaudio.c @@ -25,6 +25,7 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" #include "threads.h" #include "compat.h" @@ -333,18 +334,20 @@ static void wait_for_operation(pa_operation *op, pa_threaded_mainloop *loop) static pa_context *connect_context(pa_threaded_mainloop *loop, ALboolean silent) { const char *name = "OpenAL Soft"; - char path_name[PATH_MAX]; + al_string binname = AL_STRING_INIT_STATIC(); pa_context_state_t state; pa_context *context; int err; - if(pa_get_binary_name(path_name, sizeof(path_name))) - name = pa_path_get_filename(path_name); + GetProcBinary(NULL, &binname); + if(!alstr_empty(binname)) + name = alstr_get_cstr(binname); context = pa_context_new(pa_threaded_mainloop_get_api(loop), name); if(!context) { ERR("pa_context_new() failed\n"); + alstr_reset(&binname); return NULL; } @@ -371,9 +374,10 @@ static pa_context *connect_context(pa_threaded_mainloop *loop, ALboolean silent) if(!silent) ERR("Context did not connect: %s\n", pa_strerror(err)); pa_context_unref(context); - return NULL; + context = NULL; } + alstr_reset(&binname); return context; } @@ -468,7 +472,7 @@ typedef struct ALCpulsePlayback { pa_stream *stream; pa_context *context; - volatile ALboolean killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCpulsePlayback; @@ -491,7 +495,6 @@ static int ALCpulsePlayback_mixerProc(void *ptr); static void ALCpulsePlayback_Construct(ALCpulsePlayback *self, ALCdevice *device); static void ALCpulsePlayback_Destruct(ALCpulsePlayback *self); static ALCenum ALCpulsePlayback_open(ALCpulsePlayback *self, const ALCchar *name); -static void ALCpulsePlayback_close(ALCpulsePlayback *self); static ALCboolean ALCpulsePlayback_reset(ALCpulsePlayback *self); static ALCboolean ALCpulsePlayback_start(ALCpulsePlayback *self); static void ALCpulsePlayback_stop(ALCpulsePlayback *self); @@ -510,11 +513,20 @@ static void ALCpulsePlayback_Construct(ALCpulsePlayback *self, ALCdevice *device ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCpulsePlayback, ALCbackend, self); + self->loop = NULL; AL_STRING_INIT(self->device_name); + ATOMIC_INIT(&self->killNow, AL_TRUE); } static void ALCpulsePlayback_Destruct(ALCpulsePlayback *self) { + if(self->loop) + { + pulse_close(self->loop, self->context, self->stream); + self->loop = NULL; + self->context = NULL; + self->stream = NULL; + } AL_STRING_DEINIT(self->device_name); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -639,7 +651,7 @@ static void ALCpulsePlayback_contextStateCallback(pa_context *context, void *pda if(pa_context_get_state(context) == PA_CONTEXT_FAILED) { ERR("Received context failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Playback state failure"); } pa_threaded_mainloop_signal(self->loop, 0); } @@ -650,7 +662,7 @@ static void ALCpulsePlayback_streamStateCallback(pa_stream *stream, void *pdata) if(pa_stream_get_state(stream) == PA_STREAM_FAILED) { ERR("Received stream failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Playback stream failure"); } pa_threaded_mainloop_signal(self->loop, 0); } @@ -818,13 +830,17 @@ static int ALCpulsePlayback_mixerProc(void *ptr) pa_threaded_mainloop_lock(self->loop); frame_size = pa_frame_size(&self->spec); - while(!self->killNow && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { + void *buf; + int ret; + len = pa_stream_writable_size(self->stream); if(len < 0) { ERR("Failed to get writable size: %ld", (long)len); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to get writable size: %ld", (long)len); break; } @@ -850,31 +866,16 @@ static int ALCpulsePlayback_mixerProc(void *ptr) pa_threaded_mainloop_wait(self->loop); continue; } + len -= len%self->attr.minreq; + len -= len%frame_size; - while(len > 0) - { - size_t newlen = len; - int ret; - void *buf; - pa_free_cb_t free_func = NULL; + buf = pa_xmalloc(len); - if(pa_stream_begin_write(self->stream, &buf, &newlen) < 0) - { - buf = pa_xmalloc(newlen); - free_func = pa_xfree; - } + aluMixData(device, buf, len/frame_size); - aluMixData(device, buf, newlen/frame_size); - - ret = pa_stream_write(self->stream, buf, newlen, free_func, 0, PA_SEEK_RELATIVE); - if(ret != PA_OK) - { - ERR("Failed to write to stream: %d, %s\n", ret, pa_strerror(ret)); - break; - } - len -= newlen; - } + ret = pa_stream_write(self->stream, buf, len, pa_xfree, 0, PA_SEEK_RELATIVE); + if(ret != PA_OK) ERR("Failed to write to stream: %d, %s\n", ret, pa_strerror(ret)); } pa_threaded_mainloop_unlock(self->loop); @@ -952,16 +953,6 @@ static ALCenum ALCpulsePlayback_open(ALCpulsePlayback *self, const ALCchar *name return ALC_NO_ERROR; } -static void ALCpulsePlayback_close(ALCpulsePlayback *self) -{ - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - self->stream = NULL; - - alstr_clear(&self->device_name); -} - static ALCboolean ALCpulsePlayback_reset(ALCpulsePlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; @@ -1138,7 +1129,7 @@ static ALCboolean ALCpulsePlayback_reset(ALCpulsePlayback *self) static ALCboolean ALCpulsePlayback_start(ALCpulsePlayback *self) { - self->killNow = AL_FALSE; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCpulsePlayback_mixerProc, self) != althrd_success) return ALC_FALSE; return ALC_TRUE; @@ -1149,10 +1140,9 @@ static void ALCpulsePlayback_stop(ALCpulsePlayback *self) pa_operation *o; int res; - if(!self->stream || self->killNow) + if(!self->stream || ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - self->killNow = AL_TRUE; /* Signal the main loop in case PulseAudio isn't sending us audio requests * (e.g. if the device is suspended). We need to lock the mainloop in case * the mixer is between checking the killNow flag but before waiting for @@ -1174,13 +1164,16 @@ static void ALCpulsePlayback_stop(ALCpulsePlayback *self) static ClockLatency ALCpulsePlayback_getClockLatency(ALCpulsePlayback *self) { - pa_usec_t latency = 0; ClockLatency ret; + pa_usec_t latency; int neg, err; pa_threaded_mainloop_lock(self->loop); ret.ClockTime = GetDeviceClockTime(STATIC_CAST(ALCbackend,self)->mDevice); - if((err=pa_stream_get_latency(self->stream, &latency, &neg)) != 0) + err = pa_stream_get_latency(self->stream, &latency, &neg); + pa_threaded_mainloop_unlock(self->loop); + + if(UNLIKELY(err != 0)) { /* FIXME: if err = -PA_ERR_NODATA, it means we were called too soon * after starting the stream and no timing info has been received from @@ -1191,9 +1184,9 @@ static ClockLatency ALCpulsePlayback_getClockLatency(ALCpulsePlayback *self) latency = 0; neg = 0; } - if(neg) latency = 0; - ret.Latency = minu64(latency, U64(0xffffffffffffffff)/1000) * 1000; - pa_threaded_mainloop_unlock(self->loop); + else if(UNLIKELY(neg)) + latency = 0; + ret.Latency = (ALint64)minu64(latency, U64(0x7fffffffffffffff)/1000) * 1000; return ret; } @@ -1245,7 +1238,6 @@ static pa_stream *ALCpulseCapture_connectStream(const char *device_name, static void ALCpulseCapture_Construct(ALCpulseCapture *self, ALCdevice *device); static void ALCpulseCapture_Destruct(ALCpulseCapture *self); static ALCenum ALCpulseCapture_open(ALCpulseCapture *self, const ALCchar *name); -static void ALCpulseCapture_close(ALCpulseCapture *self); static DECLARE_FORWARD(ALCpulseCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCpulseCapture_start(ALCpulseCapture *self); static void ALCpulseCapture_stop(ALCpulseCapture *self); @@ -1264,11 +1256,19 @@ static void ALCpulseCapture_Construct(ALCpulseCapture *self, ALCdevice *device) ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); SET_VTABLE2(ALCpulseCapture, ALCbackend, self); + self->loop = NULL; AL_STRING_INIT(self->device_name); } static void ALCpulseCapture_Destruct(ALCpulseCapture *self) { + if(self->loop) + { + pulse_close(self->loop, self->context, self->stream); + self->loop = NULL; + self->context = NULL; + self->stream = NULL; + } AL_STRING_DEINIT(self->device_name); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } @@ -1380,7 +1380,7 @@ static void ALCpulseCapture_contextStateCallback(pa_context *context, void *pdat if(pa_context_get_state(context) == PA_CONTEXT_FAILED) { ERR("Received context failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Capture state failure"); } pa_threaded_mainloop_signal(self->loop, 0); } @@ -1391,7 +1391,7 @@ static void ALCpulseCapture_streamStateCallback(pa_stream *stream, void *pdata) if(pa_stream_get_state(stream) == PA_STREAM_FAILED) { ERR("Received stream failure!\n"); - aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice); + aluHandleDisconnect(STATIC_CAST(ALCbackend,self)->mDevice, "Capture stream failure"); } pa_threaded_mainloop_signal(self->loop, 0); } @@ -1615,16 +1615,6 @@ fail: return ALC_INVALID_VALUE; } -static void ALCpulseCapture_close(ALCpulseCapture *self) -{ - pulse_close(self->loop, self->context, self->stream); - self->loop = NULL; - self->context = NULL; - self->stream = NULL; - - alstr_clear(&self->device_name); -} - static ALCboolean ALCpulseCapture_start(ALCpulseCapture *self) { pa_operation *o; @@ -1664,14 +1654,15 @@ static ALCenum ALCpulseCapture_captureSamples(ALCpulseCapture *self, ALCvoid *bu state = pa_stream_get_state(self->stream); if(!PA_STREAM_IS_GOOD(state)) { - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Bad capture state: %u", state); break; } if(pa_stream_peek(self->stream, &self->cap_store, &self->cap_len) < 0) { ERR("pa_stream_peek() failed: %s\n", pa_strerror(pa_context_errno(self->context))); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed retrieving capture samples: %s", + pa_strerror(pa_context_errno(self->context))); break; } self->cap_remain = self->cap_len; @@ -1704,7 +1695,7 @@ static ALCuint ALCpulseCapture_availableSamples(ALCpulseCapture *self) ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; size_t readable = self->cap_remain; - if(device->Connected) + if(ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { ssize_t got; pa_threaded_mainloop_lock(self->loop); @@ -1712,7 +1703,7 @@ static ALCuint ALCpulseCapture_availableSamples(ALCpulseCapture *self) if(got < 0) { ERR("pa_stream_readable_size() failed: %s\n", pa_strerror(got)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed getting readable size: %s", pa_strerror(got)); } else if((size_t)got > self->cap_len) readable += got - self->cap_len; @@ -1727,21 +1718,24 @@ static ALCuint ALCpulseCapture_availableSamples(ALCpulseCapture *self) static ClockLatency ALCpulseCapture_getClockLatency(ALCpulseCapture *self) { - pa_usec_t latency = 0; ClockLatency ret; + pa_usec_t latency; int neg, err; pa_threaded_mainloop_lock(self->loop); ret.ClockTime = GetDeviceClockTime(STATIC_CAST(ALCbackend,self)->mDevice); - if((err=pa_stream_get_latency(self->stream, &latency, &neg)) != 0) + err = pa_stream_get_latency(self->stream, &latency, &neg); + pa_threaded_mainloop_unlock(self->loop); + + if(UNLIKELY(err != 0)) { ERR("Failed to get stream latency: 0x%x\n", err); latency = 0; neg = 0; } - if(neg) latency = 0; - ret.Latency = minu64(latency, U64(0xffffffffffffffff)/1000) * 1000; - pa_threaded_mainloop_unlock(self->loop); + else if(UNLIKELY(neg)) + latency = 0; + ret.Latency = (ALint64)minu64(latency, U64(0x7fffffffffffffff)/1000) * 1000; return ret; } @@ -1766,9 +1760,8 @@ typedef struct ALCpulseBackendFactory { static ALCboolean ALCpulseBackendFactory_init(ALCpulseBackendFactory *self); static void ALCpulseBackendFactory_deinit(ALCpulseBackendFactory *self); static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory *self, ALCbackend_Type type); -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory *self, enum DevProbe type); +static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCpulseBackendFactory_createBackend(ALCpulseBackendFactory *self, ALCdevice *device, ALCbackend_Type type); - DEFINE_ALCBACKENDFACTORY_VTABLE(ALCpulseBackendFactory); @@ -1841,23 +1834,25 @@ static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory* UN return ALC_FALSE; } -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { +#define APPEND_OUTNAME(e) do { \ + if(!alstr_empty((e)->name)) \ + alstr_append_range(outnames, VECTOR_BEGIN((e)->name), \ + VECTOR_END((e)->name)+1); \ +} while(0) case ALL_DEVICE_PROBE: ALCpulsePlayback_probeDevices(); -#define APPEND_ALL_DEVICES_LIST(e) AppendAllDevicesList(alstr_get_cstr((e)->name)) - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_ALL_DEVICES_LIST); -#undef APPEND_ALL_DEVICES_LIST + VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: ALCpulseCapture_probeDevices(); -#define APPEND_CAPTURE_DEVICE_LIST(e) AppendCaptureDeviceList(alstr_get_cstr((e)->name)) - VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_CAPTURE_DEVICE_LIST); -#undef APPEND_CAPTURE_DEVICE_LIST + VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } } @@ -1905,7 +1900,7 @@ static ALCboolean ALCpulseBackendFactory_querySupport(ALCpulseBackendFactory* UN return ALC_FALSE; } -static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe UNUSED(type)) +static void ALCpulseBackendFactory_probe(ALCpulseBackendFactory* UNUSED(self), enum DevProbe UNUSED(type), al_string* UNUSED(outnames)) { } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/qsa.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/qsa.c similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/qsa.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/qsa.c index 58193c96..81645096 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/qsa.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/qsa.c @@ -46,7 +46,7 @@ typedef struct { ALvoid* buffer; ALsizei size; - volatile int killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } qsa_data; @@ -119,6 +119,9 @@ static void deviceList(int type, vector_DevMap *devmap) if(max_cards < 0) return; +#define FREE_NAME(iter) free((iter)->name) + VECTOR_FOR_EACH(DevMap, *devmap, FREE_NAME); +#undef FREE_NAME VECTOR_RESIZE(*devmap, 0, max_cards+1); entry.name = strdup(qsaDevice); @@ -166,9 +169,8 @@ typedef struct PlaybackWrapper { } PlaybackWrapper; static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device); -static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, Destruct) +static void PlaybackWrapper_Destruct(PlaybackWrapper *self); static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name); -static void PlaybackWrapper_close(PlaybackWrapper *self); static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self); static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self); static void PlaybackWrapper_stop(PlaybackWrapper *self); @@ -207,7 +209,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) ); V0(device->Backend,lock)(); - while(!data->killNow) + while(!ATOMIC_LOAD(&data->killNow, almemory_order_acquire)) { FD_ZERO(&wfds); FD_SET(data->audio_fd, &wfds); @@ -221,7 +223,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) if(sret == -1) { ERR("select error: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed waiting for playback buffer: %s", strerror(errno)); break; } if(sret == 0) @@ -233,7 +235,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) len = data->size; write_ptr = data->buffer; aluMixData(device, write_ptr, len/frame_size); - while(len>0 && !data->killNow) + while(len>0 && !ATOMIC_LOAD(&data->killNow, almemory_order_acquire)) { int wrote = snd_pcm_plugin_write(data->pcmHandle, write_ptr, len); if(wrote <= 0) @@ -252,7 +254,7 @@ FORCE_ALIGN static int qsa_proc_playback(void *ptr) { if(snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_PLAYBACK) < 0) { - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Playback recovery failed"); break; } } @@ -283,6 +285,7 @@ static ALCenum qsa_open_playback(PlaybackWrapper *self, const ALCchar* deviceNam data = (qsa_data*)calloc(1, sizeof(qsa_data)); if(data == NULL) return ALC_OUT_OF_MEMORY; + ATOMIC_INIT(&data->killNow, AL_TRUE); if(!deviceName) deviceName = qsaDevice; @@ -596,7 +599,7 @@ static ALCboolean qsa_start_playback(PlaybackWrapper *self) { qsa_data *data = self->ExtraData; - data->killNow = 0; + ATOMIC_STORE(&data->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&data->thread, qsa_proc_playback, self) != althrd_success) return ALC_FALSE; @@ -608,10 +611,8 @@ static void qsa_stop_playback(PlaybackWrapper *self) qsa_data *data = self->ExtraData; int res; - if(data->killNow) + if(ATOMIC_EXCHANGE(&data->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - data->killNow = 1; althrd_join(data->thread, &res); } @@ -624,16 +625,19 @@ static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device) self->ExtraData = NULL; } +static void PlaybackWrapper_Destruct(PlaybackWrapper *self) +{ + if(self->ExtraData) + qsa_close_playback(self); + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name) { return qsa_open_playback(self, name); } -static void PlaybackWrapper_close(PlaybackWrapper *self) -{ - qsa_close_playback(self); -} - static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self) { return qsa_reset_playback(self); @@ -661,9 +665,8 @@ typedef struct CaptureWrapper { } CaptureWrapper; static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device); -static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, Destruct) +static void CaptureWrapper_Destruct(CaptureWrapper *self); static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name); -static void CaptureWrapper_close(CaptureWrapper *self); static DECLARE_FORWARD(CaptureWrapper, ALCbackend, ALCboolean, reset) static ALCboolean CaptureWrapper_start(CaptureWrapper *self); static void CaptureWrapper_stop(CaptureWrapper *self); @@ -846,7 +849,7 @@ static ALCuint qsa_available_samples(CaptureWrapper *self) if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0) { ERR("capture prepare failed: %s\n", snd_strerror(rstatus)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed capture recovery: %s", snd_strerror(rstatus)); return 0; } @@ -889,7 +892,7 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin switch (selectret) { case -1: - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to check capture samples"); return ALC_INVALID_DEVICE; case 0: break; @@ -920,7 +923,8 @@ static ALCenum qsa_capture_samples(CaptureWrapper *self, ALCvoid *buffer, ALCuin if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0) { ERR("capture prepare failed: %s\n", snd_strerror(rstatus)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed capture recovery: %s", + snd_strerror(rstatus)); return ALC_INVALID_DEVICE; } snd_pcm_capture_go(data->pcmHandle); @@ -945,16 +949,19 @@ static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device) self->ExtraData = NULL; } +static void CaptureWrapper_Destruct(CaptureWrapper *self) +{ + if(self->ExtraData) + qsa_close_capture(self); + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name) { return qsa_open_capture(self, name); } -static void CaptureWrapper_close(CaptureWrapper *self) -{ - qsa_close_capture(self); -} - static ALCboolean CaptureWrapper_start(CaptureWrapper *self) { qsa_start_capture(self); @@ -985,7 +992,7 @@ typedef struct ALCqsaBackendFactory { static ALCboolean ALCqsaBackendFactory_init(ALCqsaBackendFactory* UNUSED(self)); static void ALCqsaBackendFactory_deinit(ALCqsaBackendFactory* UNUSED(self)); static ALCboolean ALCqsaBackendFactory_querySupport(ALCqsaBackendFactory* UNUSED(self), ALCbackend_Type type); -static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type); +static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames); static ALCbackend* ALCqsaBackendFactory_createBackend(ALCqsaBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCqsaBackendFactory); @@ -1012,33 +1019,25 @@ static ALCboolean ALCqsaBackendFactory_querySupport(ALCqsaBackendFactory* UNUSED return ALC_FALSE; } -static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCqsaBackendFactory_probe(ALCqsaBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch (type) { +#define APPEND_OUTNAME(e) do { \ + const char *n_ = (e)->name; \ + if(n_ && n_[0]) \ + alstr_append_range(outnames, n_, n_+strlen(n_)+1); \ +} while(0) case ALL_DEVICE_PROBE: -#define FREE_NAME(iter) free((iter)->name) - VECTOR_FOR_EACH(DevMap, DeviceNameMap, FREE_NAME); - VECTOR_RESIZE(DeviceNameMap, 0, 0); -#undef FREE_NAME - deviceList(SND_PCM_CHANNEL_PLAYBACK, &DeviceNameMap); -#define APPEND_DEVICE(iter) AppendAllDevicesList((iter)->name) - VECTOR_FOR_EACH(const DevMap, DeviceNameMap, APPEND_DEVICE); -#undef APPEND_DEVICE + VECTOR_FOR_EACH(const DevMap, DeviceNameMap, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: -#define FREE_NAME(iter) free((iter)->name) - VECTOR_FOR_EACH(DevMap, CaptureNameMap, FREE_NAME); - VECTOR_RESIZE(CaptureNameMap, 0, 0); -#undef FREE_NAME - deviceList(SND_PCM_CHANNEL_CAPTURE, &CaptureNameMap); -#define APPEND_DEVICE(iter) AppendCaptureDeviceList((iter)->name) - VECTOR_FOR_EACH(const DevMap, CaptureNameMap, APPEND_DEVICE); -#undef APPEND_DEVICE + VECTOR_FOR_EACH(const DevMap, CaptureNameMap, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } } diff --git a/love/src/jni/openal-soft-1.19.1/Alc/backends/sdl2.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/sdl2.c new file mode 100644 index 00000000..3495e6bf --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/sdl2.c @@ -0,0 +1,288 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alMain.h" +#include "alu.h" +#include "threads.h" +#include "compat.h" + +#include "backends/base.h" + + +#ifdef _WIN32 +#define DEVNAME_PREFIX "OpenAL Soft on " +#else +#define DEVNAME_PREFIX "" +#endif + +typedef struct ALCsdl2Backend { + DERIVE_FROM_TYPE(ALCbackend); + + SDL_AudioDeviceID deviceID; + ALsizei frameSize; + + ALuint Frequency; + enum DevFmtChannels FmtChans; + enum DevFmtType FmtType; + ALuint UpdateSize; +} ALCsdl2Backend; + +static void ALCsdl2Backend_Construct(ALCsdl2Backend *self, ALCdevice *device); +static void ALCsdl2Backend_Destruct(ALCsdl2Backend *self); +static ALCenum ALCsdl2Backend_open(ALCsdl2Backend *self, const ALCchar *name); +static ALCboolean ALCsdl2Backend_reset(ALCsdl2Backend *self); +static ALCboolean ALCsdl2Backend_start(ALCsdl2Backend *self); +static void ALCsdl2Backend_stop(ALCsdl2Backend *self); +static DECLARE_FORWARD2(ALCsdl2Backend, ALCbackend, ALCenum, captureSamples, void*, ALCuint) +static DECLARE_FORWARD(ALCsdl2Backend, ALCbackend, ALCuint, availableSamples) +static DECLARE_FORWARD(ALCsdl2Backend, ALCbackend, ClockLatency, getClockLatency) +static void ALCsdl2Backend_lock(ALCsdl2Backend *self); +static void ALCsdl2Backend_unlock(ALCsdl2Backend *self); +DECLARE_DEFAULT_ALLOCATORS(ALCsdl2Backend) + +DEFINE_ALCBACKEND_VTABLE(ALCsdl2Backend); + +static const ALCchar defaultDeviceName[] = DEVNAME_PREFIX "Default Device"; + +static void ALCsdl2Backend_Construct(ALCsdl2Backend *self, ALCdevice *device) +{ + ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); + SET_VTABLE2(ALCsdl2Backend, ALCbackend, self); + + self->deviceID = 0; + self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + self->Frequency = device->Frequency; + self->FmtChans = device->FmtChans; + self->FmtType = device->FmtType; + self->UpdateSize = device->UpdateSize; +} + +static void ALCsdl2Backend_Destruct(ALCsdl2Backend *self) +{ + if(self->deviceID) + SDL_CloseAudioDevice(self->deviceID); + self->deviceID = 0; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + + +static void ALCsdl2Backend_audioCallback(void *ptr, Uint8 *stream, int len) +{ + ALCsdl2Backend *self = (ALCsdl2Backend*)ptr; + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + + assert((len % self->frameSize) == 0); + aluMixData(device, stream, len / self->frameSize); +} + +static ALCenum ALCsdl2Backend_open(ALCsdl2Backend *self, const ALCchar *name) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + SDL_AudioSpec want, have; + + SDL_zero(want); + SDL_zero(have); + + want.freq = device->Frequency; + switch(device->FmtType) + { + case DevFmtUByte: want.format = AUDIO_U8; break; + case DevFmtByte: want.format = AUDIO_S8; break; + case DevFmtUShort: want.format = AUDIO_U16SYS; break; + case DevFmtShort: want.format = AUDIO_S16SYS; break; + case DevFmtUInt: /* fall-through */ + case DevFmtInt: want.format = AUDIO_S32SYS; break; + case DevFmtFloat: want.format = AUDIO_F32; break; + } + want.channels = (device->FmtChans == DevFmtMono) ? 1 : 2; + want.samples = device->UpdateSize; + want.callback = ALCsdl2Backend_audioCallback; + want.userdata = self; + + /* Passing NULL to SDL_OpenAudioDevice opens a default, which isn't + * necessarily the first in the list. + */ + if(!name || strcmp(name, defaultDeviceName) == 0) + self->deviceID = SDL_OpenAudioDevice(NULL, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + else + { + const size_t prefix_len = strlen(DEVNAME_PREFIX); + if(strncmp(name, DEVNAME_PREFIX, prefix_len) == 0) + self->deviceID = SDL_OpenAudioDevice(name+prefix_len, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + else + self->deviceID = SDL_OpenAudioDevice(name, SDL_FALSE, &want, &have, + SDL_AUDIO_ALLOW_ANY_CHANGE); + } + if(self->deviceID == 0) + return ALC_INVALID_VALUE; + + device->Frequency = have.freq; + if(have.channels == 1) + device->FmtChans = DevFmtMono; + else if(have.channels == 2) + device->FmtChans = DevFmtStereo; + else + { + ERR("Got unhandled SDL channel count: %d\n", (int)have.channels); + return ALC_INVALID_VALUE; + } + switch(have.format) + { + case AUDIO_U8: device->FmtType = DevFmtUByte; break; + case AUDIO_S8: device->FmtType = DevFmtByte; break; + case AUDIO_U16SYS: device->FmtType = DevFmtUShort; break; + case AUDIO_S16SYS: device->FmtType = DevFmtShort; break; + case AUDIO_S32SYS: device->FmtType = DevFmtInt; break; + case AUDIO_F32SYS: device->FmtType = DevFmtFloat; break; + default: + ERR("Got unsupported SDL format: 0x%04x\n", have.format); + return ALC_INVALID_VALUE; + } + device->UpdateSize = have.samples; + device->NumUpdates = 2; /* SDL always (tries to) use two periods. */ + + self->frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + self->Frequency = device->Frequency; + self->FmtChans = device->FmtChans; + self->FmtType = device->FmtType; + self->UpdateSize = device->UpdateSize; + + alstr_copy_cstr(&device->DeviceName, name ? name : defaultDeviceName); + + return ALC_NO_ERROR; +} + +static ALCboolean ALCsdl2Backend_reset(ALCsdl2Backend *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + device->Frequency = self->Frequency; + device->FmtChans = self->FmtChans; + device->FmtType = self->FmtType; + device->UpdateSize = self->UpdateSize; + device->NumUpdates = 2; + SetDefaultWFXChannelOrder(device); + return ALC_TRUE; +} + +static ALCboolean ALCsdl2Backend_start(ALCsdl2Backend *self) +{ + SDL_PauseAudioDevice(self->deviceID, 0); + return ALC_TRUE; +} + +static void ALCsdl2Backend_stop(ALCsdl2Backend *self) +{ + SDL_PauseAudioDevice(self->deviceID, 1); +} + +static void ALCsdl2Backend_lock(ALCsdl2Backend *self) +{ + SDL_LockAudioDevice(self->deviceID); +} + +static void ALCsdl2Backend_unlock(ALCsdl2Backend *self) +{ + SDL_UnlockAudioDevice(self->deviceID); +} + + +typedef struct ALCsdl2BackendFactory { + DERIVE_FROM_TYPE(ALCbackendFactory); +} ALCsdl2BackendFactory; +#define ALCsdl2BACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCsdl2BackendFactory, ALCbackendFactory) } } + +ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void); + +static ALCboolean ALCsdl2BackendFactory_init(ALCsdl2BackendFactory *self); +static void ALCsdl2BackendFactory_deinit(ALCsdl2BackendFactory *self); +static ALCboolean ALCsdl2BackendFactory_querySupport(ALCsdl2BackendFactory *self, ALCbackend_Type type); +static void ALCsdl2BackendFactory_probe(ALCsdl2BackendFactory *self, enum DevProbe type, al_string *outnames); +static ALCbackend* ALCsdl2BackendFactory_createBackend(ALCsdl2BackendFactory *self, ALCdevice *device, ALCbackend_Type type); +DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsdl2BackendFactory); + + +ALCbackendFactory *ALCsdl2BackendFactory_getFactory(void) +{ + static ALCsdl2BackendFactory factory = ALCsdl2BACKENDFACTORY_INITIALIZER; + return STATIC_CAST(ALCbackendFactory, &factory); +} + + +static ALCboolean ALCsdl2BackendFactory_init(ALCsdl2BackendFactory* UNUSED(self)) +{ + if(SDL_InitSubSystem(SDL_INIT_AUDIO) == 0) + return AL_TRUE; + return ALC_FALSE; +} + +static void ALCsdl2BackendFactory_deinit(ALCsdl2BackendFactory* UNUSED(self)) +{ + SDL_QuitSubSystem(SDL_INIT_AUDIO); +} + +static ALCboolean ALCsdl2BackendFactory_querySupport(ALCsdl2BackendFactory* UNUSED(self), ALCbackend_Type type) +{ + if(type == ALCbackend_Playback) + return ALC_TRUE; + return ALC_FALSE; +} + +static void ALCsdl2BackendFactory_probe(ALCsdl2BackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) +{ + int num_devices, i; + al_string name; + + if(type != ALL_DEVICE_PROBE) + return; + + AL_STRING_INIT(name); + num_devices = SDL_GetNumAudioDevices(SDL_FALSE); + + alstr_append_range(outnames, defaultDeviceName, defaultDeviceName+sizeof(defaultDeviceName)); + for(i = 0;i < num_devices;++i) + { + alstr_copy_cstr(&name, DEVNAME_PREFIX); + alstr_append_cstr(&name, SDL_GetAudioDeviceName(i, SDL_FALSE)); + if(!alstr_empty(name)) + alstr_append_range(outnames, VECTOR_BEGIN(name), VECTOR_END(name)+1); + } + alstr_reset(&name); +} + +static ALCbackend* ALCsdl2BackendFactory_createBackend(ALCsdl2BackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) +{ + if(type == ALCbackend_Playback) + { + ALCsdl2Backend *backend; + NEW_OBJ(backend, ALCsdl2Backend)(device); + if(!backend) return NULL; + return STATIC_CAST(ALCbackend, backend); + } + + return NULL; +} diff --git a/love/src/jni/openal-soft-1.19.1/Alc/backends/sndio.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/sndio.c new file mode 100644 index 00000000..dd174cba --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/sndio.c @@ -0,0 +1,600 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "alMain.h" +#include "alu.h" +#include "threads.h" +#include "ringbuffer.h" + +#include "backends/base.h" + +#include + + +static const ALCchar sndio_device[] = "SndIO Default"; + + +typedef struct SndioPlayback { + DERIVE_FROM_TYPE(ALCbackend); + + struct sio_hdl *sndHandle; + + ALvoid *mix_data; + ALsizei data_size; + + ATOMIC(int) killNow; + althrd_t thread; +} SndioPlayback; + +static int SndioPlayback_mixerProc(void *ptr); + +static void SndioPlayback_Construct(SndioPlayback *self, ALCdevice *device); +static void SndioPlayback_Destruct(SndioPlayback *self); +static ALCenum SndioPlayback_open(SndioPlayback *self, const ALCchar *name); +static ALCboolean SndioPlayback_reset(SndioPlayback *self); +static ALCboolean SndioPlayback_start(SndioPlayback *self); +static void SndioPlayback_stop(SndioPlayback *self); +static DECLARE_FORWARD2(SndioPlayback, ALCbackend, ALCenum, captureSamples, void*, ALCuint) +static DECLARE_FORWARD(SndioPlayback, ALCbackend, ALCuint, availableSamples) +static DECLARE_FORWARD(SndioPlayback, ALCbackend, ClockLatency, getClockLatency) +static DECLARE_FORWARD(SndioPlayback, ALCbackend, void, lock) +static DECLARE_FORWARD(SndioPlayback, ALCbackend, void, unlock) +DECLARE_DEFAULT_ALLOCATORS(SndioPlayback) + +DEFINE_ALCBACKEND_VTABLE(SndioPlayback); + + +static void SndioPlayback_Construct(SndioPlayback *self, ALCdevice *device) +{ + ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); + SET_VTABLE2(SndioPlayback, ALCbackend, self); + + self->sndHandle = NULL; + self->mix_data = NULL; + ATOMIC_INIT(&self->killNow, AL_TRUE); +} + +static void SndioPlayback_Destruct(SndioPlayback *self) +{ + if(self->sndHandle) + sio_close(self->sndHandle); + self->sndHandle = NULL; + + al_free(self->mix_data); + self->mix_data = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + + +static int SndioPlayback_mixerProc(void *ptr) +{ + SndioPlayback *self = (SndioPlayback*)ptr; + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + ALsizei frameSize; + size_t wrote; + + SetRTPriority(); + althrd_setname(althrd_current(), MIXER_THREAD_NAME); + + frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) + { + ALsizei len = self->data_size; + ALubyte *WritePtr = self->mix_data; + + SndioPlayback_lock(self); + aluMixData(device, WritePtr, len/frameSize); + SndioPlayback_unlock(self); + while(len > 0 && !ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) + { + wrote = sio_write(self->sndHandle, WritePtr, len); + if(wrote == 0) + { + ERR("sio_write failed\n"); + ALCdevice_Lock(device); + aluHandleDisconnect(device, "Failed to write playback samples"); + ALCdevice_Unlock(device); + break; + } + + len -= wrote; + WritePtr += wrote; + } + } + + return 0; +} + + +static ALCenum SndioPlayback_open(SndioPlayback *self, const ALCchar *name) +{ + ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; + + if(!name) + name = sndio_device; + else if(strcmp(name, sndio_device) != 0) + return ALC_INVALID_VALUE; + + self->sndHandle = sio_open(NULL, SIO_PLAY, 0); + if(self->sndHandle == NULL) + { + ERR("Could not open device\n"); + return ALC_INVALID_VALUE; + } + + alstr_copy_cstr(&device->DeviceName, name); + + return ALC_NO_ERROR; +} + +static ALCboolean SndioPlayback_reset(SndioPlayback *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; + struct sio_par par; + + sio_initpar(&par); + + par.rate = device->Frequency; + par.pchan = ((device->FmtChans != DevFmtMono) ? 2 : 1); + + switch(device->FmtType) + { + case DevFmtByte: + par.bits = 8; + par.sig = 1; + break; + case DevFmtUByte: + par.bits = 8; + par.sig = 0; + break; + case DevFmtFloat: + case DevFmtShort: + par.bits = 16; + par.sig = 1; + break; + case DevFmtUShort: + par.bits = 16; + par.sig = 0; + break; + case DevFmtInt: + par.bits = 32; + par.sig = 1; + break; + case DevFmtUInt: + par.bits = 32; + par.sig = 0; + break; + } + par.le = SIO_LE_NATIVE; + + par.round = device->UpdateSize; + par.appbufsz = device->UpdateSize * (device->NumUpdates-1); + if(!par.appbufsz) par.appbufsz = device->UpdateSize; + + if(!sio_setpar(self->sndHandle, &par) || !sio_getpar(self->sndHandle, &par)) + { + ERR("Failed to set device parameters\n"); + return ALC_FALSE; + } + + if(par.bits != par.bps*8) + { + ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8); + return ALC_FALSE; + } + + device->Frequency = par.rate; + device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo); + + if(par.bits == 8 && par.sig == 1) + device->FmtType = DevFmtByte; + else if(par.bits == 8 && par.sig == 0) + device->FmtType = DevFmtUByte; + else if(par.bits == 16 && par.sig == 1) + device->FmtType = DevFmtShort; + else if(par.bits == 16 && par.sig == 0) + device->FmtType = DevFmtUShort; + else if(par.bits == 32 && par.sig == 1) + device->FmtType = DevFmtInt; + else if(par.bits == 32 && par.sig == 0) + device->FmtType = DevFmtUInt; + else + { + ERR("Unhandled sample format: %s %u-bit\n", (par.sig?"signed":"unsigned"), par.bits); + return ALC_FALSE; + } + + device->UpdateSize = par.round; + device->NumUpdates = (par.bufsz/par.round) + 1; + + SetDefaultChannelOrder(device); + + return ALC_TRUE; +} + +static ALCboolean SndioPlayback_start(SndioPlayback *self) +{ + ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; + + self->data_size = device->UpdateSize * FrameSizeFromDevFmt( + device->FmtChans, device->FmtType, device->AmbiOrder + ); + al_free(self->mix_data); + self->mix_data = al_calloc(16, self->data_size); + + if(!sio_start(self->sndHandle)) + { + ERR("Error starting playback\n"); + return ALC_FALSE; + } + + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); + if(althrd_create(&self->thread, SndioPlayback_mixerProc, self) != althrd_success) + { + sio_stop(self->sndHandle); + return ALC_FALSE; + } + + return ALC_TRUE; +} + +static void SndioPlayback_stop(SndioPlayback *self) +{ + int res; + + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) + return; + althrd_join(self->thread, &res); + + if(!sio_stop(self->sndHandle)) + ERR("Error stopping device\n"); + + al_free(self->mix_data); + self->mix_data = NULL; +} + + +typedef struct SndioCapture { + DERIVE_FROM_TYPE(ALCbackend); + + struct sio_hdl *sndHandle; + + ll_ringbuffer_t *ring; + + ATOMIC(int) killNow; + althrd_t thread; +} SndioCapture; + +static int SndioCapture_recordProc(void *ptr); + +static void SndioCapture_Construct(SndioCapture *self, ALCdevice *device); +static void SndioCapture_Destruct(SndioCapture *self); +static ALCenum SndioCapture_open(SndioCapture *self, const ALCchar *name); +static DECLARE_FORWARD(SndioCapture, ALCbackend, ALCboolean, reset) +static ALCboolean SndioCapture_start(SndioCapture *self); +static void SndioCapture_stop(SndioCapture *self); +static ALCenum SndioCapture_captureSamples(SndioCapture *self, void *buffer, ALCuint samples); +static ALCuint SndioCapture_availableSamples(SndioCapture *self); +static DECLARE_FORWARD(SndioCapture, ALCbackend, ClockLatency, getClockLatency) +static DECLARE_FORWARD(SndioCapture, ALCbackend, void, lock) +static DECLARE_FORWARD(SndioCapture, ALCbackend, void, unlock) +DECLARE_DEFAULT_ALLOCATORS(SndioCapture) + +DEFINE_ALCBACKEND_VTABLE(SndioCapture); + + +static void SndioCapture_Construct(SndioCapture *self, ALCdevice *device) +{ + ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); + SET_VTABLE2(SndioCapture, ALCbackend, self); + + self->sndHandle = NULL; + self->ring = NULL; + ATOMIC_INIT(&self->killNow, AL_TRUE); +} + +static void SndioCapture_Destruct(SndioCapture *self) +{ + if(self->sndHandle) + sio_close(self->sndHandle); + self->sndHandle = NULL; + + ll_ringbuffer_free(self->ring); + self->ring = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} + + +static int SndioCapture_recordProc(void* ptr) +{ + SndioCapture *self = (SndioCapture*)ptr; + ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; + ALsizei frameSize; + + SetRTPriority(); + althrd_setname(althrd_current(), RECORD_THREAD_NAME); + + frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); + + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) + { + ll_ringbuffer_data_t data[2]; + size_t total, todo; + + ll_ringbuffer_get_write_vector(self->ring, data); + todo = data[0].len + data[1].len; + if(todo == 0) + { + static char junk[4096]; + sio_read(self->sndHandle, junk, minz(sizeof(junk)/frameSize, device->UpdateSize)*frameSize); + continue; + } + + total = 0; + data[0].len *= frameSize; + data[1].len *= frameSize; + todo = minz(todo, device->UpdateSize) * frameSize; + while(total < todo) + { + size_t got; + + if(!data[0].len) + data[0] = data[1]; + + got = sio_read(self->sndHandle, data[0].buf, minz(todo-total, data[0].len)); + if(!got) + { + SndioCapture_lock(self); + aluHandleDisconnect(device, "Failed to read capture samples"); + SndioCapture_unlock(self); + break; + } + + data[0].buf += got; + data[0].len -= got; + total += got; + } + ll_ringbuffer_write_advance(self->ring, total / frameSize); + } + + return 0; +} + + +static ALCenum SndioCapture_open(SndioCapture *self, const ALCchar *name) +{ + ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; + struct sio_par par; + + if(!name) + name = sndio_device; + else if(strcmp(name, sndio_device) != 0) + return ALC_INVALID_VALUE; + + self->sndHandle = sio_open(NULL, SIO_REC, 0); + if(self->sndHandle == NULL) + { + ERR("Could not open device\n"); + return ALC_INVALID_VALUE; + } + + sio_initpar(&par); + + switch(device->FmtType) + { + case DevFmtByte: + par.bps = 1; + par.sig = 1; + break; + case DevFmtUByte: + par.bps = 1; + par.sig = 0; + break; + case DevFmtShort: + par.bps = 2; + par.sig = 1; + break; + case DevFmtUShort: + par.bps = 2; + par.sig = 0; + break; + case DevFmtInt: + par.bps = 4; + par.sig = 1; + break; + case DevFmtUInt: + par.bps = 4; + par.sig = 0; + break; + case DevFmtFloat: + ERR("%s capture samples not supported\n", DevFmtTypeString(device->FmtType)); + return ALC_INVALID_VALUE; + } + par.bits = par.bps * 8; + par.le = SIO_LE_NATIVE; + par.msb = SIO_LE_NATIVE ? 0 : 1; + par.rchan = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); + par.rate = device->Frequency; + + par.appbufsz = maxu(device->UpdateSize*device->NumUpdates, (device->Frequency+9)/10); + par.round = clampu(par.appbufsz/device->NumUpdates, (device->Frequency+99)/100, + (device->Frequency+19)/20); + + device->UpdateSize = par.round; + device->NumUpdates = maxu(par.appbufsz/par.round, 1); + + if(!sio_setpar(self->sndHandle, &par) || !sio_getpar(self->sndHandle, &par)) + { + ERR("Failed to set device parameters\n"); + return ALC_INVALID_VALUE; + } + + if(par.bits != par.bps*8) + { + ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8); + return ALC_INVALID_VALUE; + } + + if(!((device->FmtType == DevFmtByte && par.bits == 8 && par.sig != 0) || + (device->FmtType == DevFmtUByte && par.bits == 8 && par.sig == 0) || + (device->FmtType == DevFmtShort && par.bits == 16 && par.sig != 0) || + (device->FmtType == DevFmtUShort && par.bits == 16 && par.sig == 0) || + (device->FmtType == DevFmtInt && par.bits == 32 && par.sig != 0) || + (device->FmtType == DevFmtUInt && par.bits == 32 && par.sig == 0)) || + ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder) != (ALsizei)par.rchan || + device->Frequency != par.rate) + { + ERR("Failed to set format %s %s %uhz, got %c%u %u-channel %uhz instead\n", + DevFmtTypeString(device->FmtType), DevFmtChannelsString(device->FmtChans), + device->Frequency, par.sig?'s':'u', par.bits, par.rchan, par.rate); + return ALC_INVALID_VALUE; + } + + self->ring = ll_ringbuffer_create(device->UpdateSize*device->NumUpdates, par.bps*par.rchan, 0); + if(!self->ring) + { + ERR("Failed to allocate %u-byte ringbuffer\n", + device->UpdateSize*device->NumUpdates*par.bps*par.rchan); + return ALC_OUT_OF_MEMORY; + } + + SetDefaultChannelOrder(device); + + alstr_copy_cstr(&device->DeviceName, name); + + return ALC_NO_ERROR; +} + +static ALCboolean SndioCapture_start(SndioCapture *self) +{ + if(!sio_start(self->sndHandle)) + { + ERR("Error starting playback\n"); + return ALC_FALSE; + } + + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); + if(althrd_create(&self->thread, SndioCapture_recordProc, self) != althrd_success) + { + sio_stop(self->sndHandle); + return ALC_FALSE; + } + + return ALC_TRUE; +} + +static void SndioCapture_stop(SndioCapture *self) +{ + int res; + + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) + return; + althrd_join(self->thread, &res); + + if(!sio_stop(self->sndHandle)) + ERR("Error stopping device\n"); +} + +static ALCenum SndioCapture_captureSamples(SndioCapture *self, void *buffer, ALCuint samples) +{ + ll_ringbuffer_read(self->ring, buffer, samples); + return ALC_NO_ERROR; +} + +static ALCuint SndioCapture_availableSamples(SndioCapture *self) +{ + return ll_ringbuffer_read_space(self->ring); +} + + +typedef struct SndioBackendFactory { + DERIVE_FROM_TYPE(ALCbackendFactory); +} SndioBackendFactory; +#define SNDIOBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(SndioBackendFactory, ALCbackendFactory) } } + +ALCbackendFactory *SndioBackendFactory_getFactory(void); + +static ALCboolean SndioBackendFactory_init(SndioBackendFactory *self); +static DECLARE_FORWARD(SndioBackendFactory, ALCbackendFactory, void, deinit) +static ALCboolean SndioBackendFactory_querySupport(SndioBackendFactory *self, ALCbackend_Type type); +static void SndioBackendFactory_probe(SndioBackendFactory *self, enum DevProbe type, al_string *outnames); +static ALCbackend* SndioBackendFactory_createBackend(SndioBackendFactory *self, ALCdevice *device, ALCbackend_Type type); +DEFINE_ALCBACKENDFACTORY_VTABLE(SndioBackendFactory); + +ALCbackendFactory *SndioBackendFactory_getFactory(void) +{ + static SndioBackendFactory factory = SNDIOBACKENDFACTORY_INITIALIZER; + return STATIC_CAST(ALCbackendFactory, &factory); +} + +static ALCboolean SndioBackendFactory_init(SndioBackendFactory* UNUSED(self)) +{ + /* No dynamic loading */ + return ALC_TRUE; +} + +static ALCboolean SndioBackendFactory_querySupport(SndioBackendFactory* UNUSED(self), ALCbackend_Type type) +{ + if(type == ALCbackend_Playback || type == ALCbackend_Capture) + return ALC_TRUE; + return ALC_FALSE; +} + +static void SndioBackendFactory_probe(SndioBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) +{ + switch(type) + { + case ALL_DEVICE_PROBE: + case CAPTURE_DEVICE_PROBE: + alstr_append_range(outnames, sndio_device, sndio_device+sizeof(sndio_device)); + break; + } +} + +static ALCbackend* SndioBackendFactory_createBackend(SndioBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) +{ + if(type == ALCbackend_Playback) + { + SndioPlayback *backend; + NEW_OBJ(backend, SndioPlayback)(device); + if(!backend) return NULL; + return STATIC_CAST(ALCbackend, backend); + } + if(type == ALCbackend_Capture) + { + SndioCapture *backend; + NEW_OBJ(backend, SndioCapture)(device); + if(!backend) return NULL; + return STATIC_CAST(ALCbackend, backend); + } + + return NULL; +} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/solaris.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/solaris.c similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/solaris.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/solaris.c index 5dfb5084..71282204 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/solaris.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/solaris.c @@ -34,6 +34,7 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" #include "threads.h" #include "compat.h" @@ -59,7 +60,6 @@ static int ALCsolarisBackend_mixerProc(void *ptr); static void ALCsolarisBackend_Construct(ALCsolarisBackend *self, ALCdevice *device); static void ALCsolarisBackend_Destruct(ALCsolarisBackend *self); static ALCenum ALCsolarisBackend_open(ALCsolarisBackend *self, const ALCchar *name); -static void ALCsolarisBackend_close(ALCsolarisBackend *self); static ALCboolean ALCsolarisBackend_reset(ALCsolarisBackend *self); static ALCboolean ALCsolarisBackend_start(ALCsolarisBackend *self); static void ALCsolarisBackend_stop(ALCsolarisBackend *self); @@ -84,6 +84,7 @@ static void ALCsolarisBackend_Construct(ALCsolarisBackend *self, ALCdevice *devi SET_VTABLE2(ALCsolarisBackend, ALCbackend, self); self->fd = -1; + self->mix_data = NULL; ATOMIC_INIT(&self->killNow, AL_FALSE); } @@ -119,7 +120,8 @@ static int ALCsolarisBackend_mixerProc(void *ptr) frame_size = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); ALCsolarisBackend_lock(self); - while(!ATOMIC_LOAD_SEQ(&self->killNow) && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { FD_ZERO(&wfds); FD_SET(self->fd, &wfds); @@ -134,7 +136,7 @@ static int ALCsolarisBackend_mixerProc(void *ptr) if(errno == EINTR) continue; ERR("select failed: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to wait for playback buffer: %s", strerror(errno)); break; } else if(sret == 0) @@ -154,7 +156,8 @@ static int ALCsolarisBackend_mixerProc(void *ptr) if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) continue; ERR("write failed: %s\n", strerror(errno)); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to write playback samples: %s", + strerror(errno)); break; } @@ -190,12 +193,6 @@ static ALCenum ALCsolarisBackend_open(ALCsolarisBackend *self, const ALCchar *na return ALC_NO_ERROR; } -static void ALCsolarisBackend_close(ALCsolarisBackend *self) -{ - close(self->fd); - self->fd = -1; -} - static ALCboolean ALCsolarisBackend_reset(ALCsolarisBackend *self) { ALCdevice *device = STATIC_CAST(ALCbackend,self)->mDevice; @@ -305,7 +302,7 @@ ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void); static ALCboolean ALCsolarisBackendFactory_init(ALCsolarisBackendFactory *self); static DECLARE_FORWARD(ALCsolarisBackendFactory, ALCbackendFactory, void, deinit) static ALCboolean ALCsolarisBackendFactory_querySupport(ALCsolarisBackendFactory *self, ALCbackend_Type type); -static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory *self, enum DevProbe type); +static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCsolarisBackendFactory_createBackend(ALCsolarisBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCsolarisBackendFactory); @@ -330,7 +327,7 @@ static ALCboolean ALCsolarisBackendFactory_querySupport(ALCsolarisBackendFactory return ALC_FALSE; } -static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { @@ -340,7 +337,7 @@ static void ALCsolarisBackendFactory_probe(ALCsolarisBackendFactory* UNUSED(self struct stat buf; if(stat(solaris_driver, &buf) == 0) #endif - AppendAllDevicesList(solaris_device); + alstr_append_range(outnames, solaris_device, solaris_device+sizeof(solaris_device)); } break; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/mmdevapi.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/wasapi.c similarity index 80% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/mmdevapi.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/wasapi.c index 9afb62f0..971a1f72 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/mmdevapi.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/wasapi.c @@ -41,6 +41,7 @@ #include "alMain.h" #include "alu.h" +#include "ringbuffer.h" #include "threads.h" #include "compat.h" #include "alstring.h" @@ -70,6 +71,13 @@ DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x #define DEVNAME_HEAD "OpenAL Soft on " +/* Scales the given value using 64-bit integer math, ceiling the result. */ +static inline ALuint64 ScaleCeil(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale) +{ + return (val*new_scale + old_scale-1) / old_scale; +} + + typedef struct { al_string name; al_string endpoint_guid; // obtained from PKEY_AudioEndpoint_GUID , set to "Unknown device GUID" if absent. @@ -336,51 +344,51 @@ static HRESULT probe_devices(IMMDeviceEnumerator *devenum, EDataFlow flowdir, ve /* Proxy interface used by the message handler. */ -struct ALCmmdevProxyVtable; +struct ALCwasapiProxyVtable; -typedef struct ALCmmdevProxy { - const struct ALCmmdevProxyVtable *vtbl; -} ALCmmdevProxy; +typedef struct ALCwasapiProxy { + const struct ALCwasapiProxyVtable *vtbl; +} ALCwasapiProxy; -struct ALCmmdevProxyVtable { - HRESULT (*const openProxy)(ALCmmdevProxy*); - void (*const closeProxy)(ALCmmdevProxy*); +struct ALCwasapiProxyVtable { + HRESULT (*const openProxy)(ALCwasapiProxy*); + void (*const closeProxy)(ALCwasapiProxy*); - HRESULT (*const resetProxy)(ALCmmdevProxy*); - HRESULT (*const startProxy)(ALCmmdevProxy*); - void (*const stopProxy)(ALCmmdevProxy*); + HRESULT (*const resetProxy)(ALCwasapiProxy*); + HRESULT (*const startProxy)(ALCwasapiProxy*); + void (*const stopProxy)(ALCwasapiProxy*); }; -#define DEFINE_ALCMMDEVPROXY_VTABLE(T) \ -DECLARE_THUNK(T, ALCmmdevProxy, HRESULT, openProxy) \ -DECLARE_THUNK(T, ALCmmdevProxy, void, closeProxy) \ -DECLARE_THUNK(T, ALCmmdevProxy, HRESULT, resetProxy) \ -DECLARE_THUNK(T, ALCmmdevProxy, HRESULT, startProxy) \ -DECLARE_THUNK(T, ALCmmdevProxy, void, stopProxy) \ +#define DEFINE_ALCWASAPIPROXY_VTABLE(T) \ +DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, openProxy) \ +DECLARE_THUNK(T, ALCwasapiProxy, void, closeProxy) \ +DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, resetProxy) \ +DECLARE_THUNK(T, ALCwasapiProxy, HRESULT, startProxy) \ +DECLARE_THUNK(T, ALCwasapiProxy, void, stopProxy) \ \ -static const struct ALCmmdevProxyVtable T##_ALCmmdevProxy_vtable = { \ - T##_ALCmmdevProxy_openProxy, \ - T##_ALCmmdevProxy_closeProxy, \ - T##_ALCmmdevProxy_resetProxy, \ - T##_ALCmmdevProxy_startProxy, \ - T##_ALCmmdevProxy_stopProxy, \ +static const struct ALCwasapiProxyVtable T##_ALCwasapiProxy_vtable = { \ + T##_ALCwasapiProxy_openProxy, \ + T##_ALCwasapiProxy_closeProxy, \ + T##_ALCwasapiProxy_resetProxy, \ + T##_ALCwasapiProxy_startProxy, \ + T##_ALCwasapiProxy_stopProxy, \ } -static void ALCmmdevProxy_Construct(ALCmmdevProxy* UNUSED(self)) { } -static void ALCmmdevProxy_Destruct(ALCmmdevProxy* UNUSED(self)) { } +static void ALCwasapiProxy_Construct(ALCwasapiProxy* UNUSED(self)) { } +static void ALCwasapiProxy_Destruct(ALCwasapiProxy* UNUSED(self)) { } -static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) +static DWORD CALLBACK ALCwasapiProxy_messageHandler(void *ptr) { ThreadRequest *req = ptr; IMMDeviceEnumerator *Enumerator; ALuint deviceCount = 0; - ALCmmdevProxy *proxy; + ALCwasapiProxy *proxy; HRESULT hr, cohr; MSG msg; TRACE("Starting message thread\n"); - cohr = CoInitialize(NULL); + cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(FAILED(cohr)) { WARN("Failed to initialize COM: 0x%08lx\n", cohr); @@ -423,11 +431,11 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) { case WM_USER_OpenDevice: req = (ThreadRequest*)msg.wParam; - proxy = (ALCmmdevProxy*)msg.lParam; + proxy = (ALCwasapiProxy*)msg.lParam; hr = cohr = S_OK; if(++deviceCount == 1) - hr = cohr = CoInitialize(NULL); + hr = cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(SUCCEEDED(hr)) hr = V0(proxy,openProxy)(); if(FAILED(hr)) @@ -441,7 +449,7 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) case WM_USER_ResetDevice: req = (ThreadRequest*)msg.wParam; - proxy = (ALCmmdevProxy*)msg.lParam; + proxy = (ALCwasapiProxy*)msg.lParam; hr = V0(proxy,resetProxy)(); ReturnMsgResponse(req, hr); @@ -449,7 +457,7 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) case WM_USER_StartDevice: req = (ThreadRequest*)msg.wParam; - proxy = (ALCmmdevProxy*)msg.lParam; + proxy = (ALCwasapiProxy*)msg.lParam; hr = V0(proxy,startProxy)(); ReturnMsgResponse(req, hr); @@ -457,7 +465,7 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) case WM_USER_StopDevice: req = (ThreadRequest*)msg.wParam; - proxy = (ALCmmdevProxy*)msg.lParam; + proxy = (ALCwasapiProxy*)msg.lParam; V0(proxy,stopProxy)(); ReturnMsgResponse(req, S_OK); @@ -465,7 +473,7 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) case WM_USER_CloseDevice: req = (ThreadRequest*)msg.wParam; - proxy = (ALCmmdevProxy*)msg.lParam; + proxy = (ALCwasapiProxy*)msg.lParam; V0(proxy,closeProxy)(); if(--deviceCount == 0) @@ -479,7 +487,7 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) hr = cohr = S_OK; if(++deviceCount == 1) - hr = cohr = CoInitialize(NULL); + hr = cohr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(SUCCEEDED(hr)) hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr); if(SUCCEEDED(hr)) @@ -512,9 +520,9 @@ static DWORD CALLBACK ALCmmdevProxy_messageHandler(void *ptr) } -typedef struct ALCmmdevPlayback { +typedef struct ALCwasapiPlayback { DERIVE_FROM_TYPE(ALCbackend); - DERIVE_FROM_TYPE(ALCmmdevProxy); + DERIVE_FROM_TYPE(ALCwasapiProxy); WCHAR *devid; @@ -525,43 +533,42 @@ typedef struct ALCmmdevPlayback { HANDLE MsgEvent; - volatile UINT32 Padding; + ATOMIC(UINT32) Padding; - volatile int killNow; + ATOMIC(int) killNow; althrd_t thread; -} ALCmmdevPlayback; +} ALCwasapiPlayback; -static int ALCmmdevPlayback_mixerProc(void *arg); +static int ALCwasapiPlayback_mixerProc(void *arg); -static void ALCmmdevPlayback_Construct(ALCmmdevPlayback *self, ALCdevice *device); -static void ALCmmdevPlayback_Destruct(ALCmmdevPlayback *self); -static ALCenum ALCmmdevPlayback_open(ALCmmdevPlayback *self, const ALCchar *name); -static HRESULT ALCmmdevPlayback_openProxy(ALCmmdevPlayback *self); -static void ALCmmdevPlayback_close(ALCmmdevPlayback *self); -static void ALCmmdevPlayback_closeProxy(ALCmmdevPlayback *self); -static ALCboolean ALCmmdevPlayback_reset(ALCmmdevPlayback *self); -static HRESULT ALCmmdevPlayback_resetProxy(ALCmmdevPlayback *self); -static ALCboolean ALCmmdevPlayback_start(ALCmmdevPlayback *self); -static HRESULT ALCmmdevPlayback_startProxy(ALCmmdevPlayback *self); -static void ALCmmdevPlayback_stop(ALCmmdevPlayback *self); -static void ALCmmdevPlayback_stopProxy(ALCmmdevPlayback *self); -static DECLARE_FORWARD2(ALCmmdevPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) -static DECLARE_FORWARD(ALCmmdevPlayback, ALCbackend, ALCuint, availableSamples) -static ClockLatency ALCmmdevPlayback_getClockLatency(ALCmmdevPlayback *self); -static DECLARE_FORWARD(ALCmmdevPlayback, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCmmdevPlayback, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCmmdevPlayback) +static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device); +static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self); +static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *name); +static HRESULT ALCwasapiPlayback_openProxy(ALCwasapiPlayback *self); +static void ALCwasapiPlayback_closeProxy(ALCwasapiPlayback *self); +static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self); +static HRESULT ALCwasapiPlayback_resetProxy(ALCwasapiPlayback *self); +static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self); +static HRESULT ALCwasapiPlayback_startProxy(ALCwasapiPlayback *self); +static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self); +static void ALCwasapiPlayback_stopProxy(ALCwasapiPlayback *self); +static DECLARE_FORWARD2(ALCwasapiPlayback, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint) +static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, ALCuint, availableSamples) +static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self); +static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, lock) +static DECLARE_FORWARD(ALCwasapiPlayback, ALCbackend, void, unlock) +DECLARE_DEFAULT_ALLOCATORS(ALCwasapiPlayback) -DEFINE_ALCMMDEVPROXY_VTABLE(ALCmmdevPlayback); -DEFINE_ALCBACKEND_VTABLE(ALCmmdevPlayback); +DEFINE_ALCWASAPIPROXY_VTABLE(ALCwasapiPlayback); +DEFINE_ALCBACKEND_VTABLE(ALCwasapiPlayback); -static void ALCmmdevPlayback_Construct(ALCmmdevPlayback *self, ALCdevice *device) +static void ALCwasapiPlayback_Construct(ALCwasapiPlayback *self, ALCdevice *device) { - SET_VTABLE2(ALCmmdevPlayback, ALCbackend, self); - SET_VTABLE2(ALCmmdevPlayback, ALCmmdevProxy, self); + SET_VTABLE2(ALCwasapiPlayback, ALCbackend, self); + SET_VTABLE2(ALCwasapiPlayback, ALCwasapiProxy, self); ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - ALCmmdevProxy_Construct(STATIC_CAST(ALCmmdevProxy, self)); + ALCwasapiProxy_Construct(STATIC_CAST(ALCwasapiProxy, self)); self->devid = NULL; @@ -572,13 +579,30 @@ static void ALCmmdevPlayback_Construct(ALCmmdevPlayback *self, ALCdevice *device self->MsgEvent = NULL; - self->Padding = 0; + ATOMIC_INIT(&self->Padding, 0); - self->killNow = 0; + ATOMIC_INIT(&self->killNow, 0); } -static void ALCmmdevPlayback_Destruct(ALCmmdevPlayback *self) +static void ALCwasapiPlayback_Destruct(ALCwasapiPlayback *self) { + if(self->MsgEvent) + { + ThreadRequest req = { self->MsgEvent, 0 }; + if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) + (void)WaitForResponse(&req); + + CloseHandle(self->MsgEvent); + self->MsgEvent = NULL; + } + + if(self->NotifyEvent) + CloseHandle(self->NotifyEvent); + self->NotifyEvent = NULL; + + free(self->devid); + self->devid = NULL; + if(self->NotifyEvent != NULL) CloseHandle(self->NotifyEvent); self->NotifyEvent = NULL; @@ -589,26 +613,26 @@ static void ALCmmdevPlayback_Destruct(ALCmmdevPlayback *self) free(self->devid); self->devid = NULL; - ALCmmdevProxy_Destruct(STATIC_CAST(ALCmmdevProxy, self)); + ALCwasapiProxy_Destruct(STATIC_CAST(ALCwasapiProxy, self)); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } -FORCE_ALIGN static int ALCmmdevPlayback_mixerProc(void *arg) +FORCE_ALIGN static int ALCwasapiPlayback_mixerProc(void *arg) { - ALCmmdevPlayback *self = arg; + ALCwasapiPlayback *self = arg; ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; UINT32 buffer_len, written; ALuint update_size, len; BYTE *buffer; HRESULT hr; - hr = CoInitialize(NULL); + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(FAILED(hr)) { - ERR("CoInitialize(NULL) failed: 0x%08lx\n", hr); + ERR("CoInitializeEx(NULL, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "COM init failed: 0x%08lx", hr); V0(device->Backend,unlock)(); return 1; } @@ -618,18 +642,18 @@ FORCE_ALIGN static int ALCmmdevPlayback_mixerProc(void *arg) update_size = device->UpdateSize; buffer_len = update_size * device->NumUpdates; - while(!self->killNow) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_relaxed)) { hr = IAudioClient_GetCurrentPadding(self->client, &written); if(FAILED(hr)) { ERR("Failed to get padding: 0x%08lx\n", hr); V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to retrieve buffer padding: 0x%08lx", hr); V0(device->Backend,unlock)(); break; } - self->Padding = written; + ATOMIC_STORE(&self->Padding, written, almemory_order_relaxed); len = buffer_len - written; if(len < update_size) @@ -645,22 +669,22 @@ FORCE_ALIGN static int ALCmmdevPlayback_mixerProc(void *arg) hr = IAudioRenderClient_GetBuffer(self->render, len, &buffer); if(SUCCEEDED(hr)) { - ALCmmdevPlayback_lock(self); + ALCwasapiPlayback_lock(self); aluMixData(device, buffer, len); - self->Padding = written + len; - ALCmmdevPlayback_unlock(self); + ATOMIC_STORE(&self->Padding, written + len, almemory_order_relaxed); + ALCwasapiPlayback_unlock(self); hr = IAudioRenderClient_ReleaseBuffer(self->render, len, 0); } if(FAILED(hr)) { ERR("Failed to buffer data: 0x%08lx\n", hr); V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to send playback samples: 0x%08lx", hr); V0(device->Backend,unlock)(); break; } } - self->Padding = 0; + ATOMIC_STORE(&self->Padding, 0, almemory_order_release); CoUninitialize(); return 0; @@ -706,7 +730,7 @@ static ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX * return ALC_TRUE; } -static ALCenum ALCmmdevPlayback_open(ALCmmdevPlayback *self, const ALCchar *deviceName) +static ALCenum ALCwasapiPlayback_open(ALCwasapiPlayback *self, const ALCchar *deviceName) { HRESULT hr = S_OK; @@ -766,7 +790,7 @@ static ALCenum ALCmmdevPlayback_open(ALCmmdevPlayback *self, const ALCchar *devi ThreadRequest req = { self->MsgEvent, 0 }; hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); else ERR("Failed to post thread message: %lu\n", GetLastError()); @@ -791,7 +815,7 @@ static ALCenum ALCmmdevPlayback_open(ALCmmdevPlayback *self, const ALCchar *devi return ALC_NO_ERROR; } -static HRESULT ALCmmdevPlayback_openProxy(ALCmmdevPlayback *self) +static HRESULT ALCwasapiPlayback_openProxy(ALCwasapiPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; void *ptr; @@ -828,24 +852,7 @@ static HRESULT ALCmmdevPlayback_openProxy(ALCmmdevPlayback *self) } -static void ALCmmdevPlayback_close(ALCmmdevPlayback *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - - if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) - (void)WaitForResponse(&req); - - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - free(self->devid); - self->devid = NULL; -} - -static void ALCmmdevPlayback_closeProxy(ALCmmdevPlayback *self) +static void ALCwasapiPlayback_closeProxy(ALCwasapiPlayback *self) { if(self->client) IAudioClient_Release(self->client); @@ -857,18 +864,18 @@ static void ALCmmdevPlayback_closeProxy(ALCmmdevPlayback *self) } -static ALCboolean ALCmmdevPlayback_reset(ALCmmdevPlayback *self) +static ALCboolean ALCwasapiPlayback_reset(ALCwasapiPlayback *self) { ThreadRequest req = { self->MsgEvent, 0 }; HRESULT hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; } -static HRESULT ALCmmdevPlayback_resetProxy(ALCmmdevPlayback *self) +static HRESULT ALCwasapiPlayback_resetProxy(ALCwasapiPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; EndpointFormFactor formfactor = UnknownFormFactor; @@ -1128,18 +1135,18 @@ static HRESULT ALCmmdevPlayback_resetProxy(ALCmmdevPlayback *self) } -static ALCboolean ALCmmdevPlayback_start(ALCmmdevPlayback *self) +static ALCboolean ALCwasapiPlayback_start(ALCwasapiPlayback *self) { ThreadRequest req = { self->MsgEvent, 0 }; HRESULT hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; } -static HRESULT ALCmmdevPlayback_startProxy(ALCmmdevPlayback *self) +static HRESULT ALCwasapiPlayback_startProxy(ALCwasapiPlayback *self) { HRESULT hr; void *ptr; @@ -1154,8 +1161,8 @@ static HRESULT ALCmmdevPlayback_startProxy(ALCmmdevPlayback *self) if(SUCCEEDED(hr)) { self->render = ptr; - self->killNow = 0; - if(althrd_create(&self->thread, ALCmmdevPlayback_mixerProc, self) != althrd_success) + ATOMIC_STORE(&self->killNow, 0, almemory_order_release); + if(althrd_create(&self->thread, ALCwasapiPlayback_mixerProc, self) != althrd_success) { if(self->render) IAudioRenderClient_Release(self->render); @@ -1170,21 +1177,21 @@ static HRESULT ALCmmdevPlayback_startProxy(ALCmmdevPlayback *self) } -static void ALCmmdevPlayback_stop(ALCmmdevPlayback *self) +static void ALCwasapiPlayback_stop(ALCwasapiPlayback *self) { ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) (void)WaitForResponse(&req); } -static void ALCmmdevPlayback_stopProxy(ALCmmdevPlayback *self) +static void ALCwasapiPlayback_stopProxy(ALCwasapiPlayback *self) { int res; if(!self->render) return; - self->killNow = 1; + ATOMIC_STORE_SEQ(&self->killNow, 1); althrd_join(self->thread, &res); IAudioRenderClient_Release(self->render); @@ -1193,23 +1200,24 @@ static void ALCmmdevPlayback_stopProxy(ALCmmdevPlayback *self) } -static ClockLatency ALCmmdevPlayback_getClockLatency(ALCmmdevPlayback *self) +static ClockLatency ALCwasapiPlayback_getClockLatency(ALCwasapiPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; ClockLatency ret; - ALCmmdevPlayback_lock(self); + ALCwasapiPlayback_lock(self); ret.ClockTime = GetDeviceClockTime(device); - ret.Latency = self->Padding * DEVICE_CLOCK_RES / device->Frequency; - ALCmmdevPlayback_unlock(self); + ret.Latency = ATOMIC_LOAD(&self->Padding, almemory_order_relaxed) * DEVICE_CLOCK_RES / + device->Frequency; + ALCwasapiPlayback_unlock(self); return ret; } -typedef struct ALCmmdevCapture { +typedef struct ALCwasapiCapture { DERIVE_FROM_TYPE(ALCbackend); - DERIVE_FROM_TYPE(ALCmmdevProxy); + DERIVE_FROM_TYPE(ALCwasapiProxy); WCHAR *devid; @@ -1224,41 +1232,40 @@ typedef struct ALCmmdevCapture { SampleConverter *SampleConv; ll_ringbuffer_t *Ring; - volatile int killNow; + ATOMIC(int) killNow; althrd_t thread; -} ALCmmdevCapture; +} ALCwasapiCapture; -static int ALCmmdevCapture_recordProc(void *arg); +static int ALCwasapiCapture_recordProc(void *arg); -static void ALCmmdevCapture_Construct(ALCmmdevCapture *self, ALCdevice *device); -static void ALCmmdevCapture_Destruct(ALCmmdevCapture *self); -static ALCenum ALCmmdevCapture_open(ALCmmdevCapture *self, const ALCchar *name); -static HRESULT ALCmmdevCapture_openProxy(ALCmmdevCapture *self); -static void ALCmmdevCapture_close(ALCmmdevCapture *self); -static void ALCmmdevCapture_closeProxy(ALCmmdevCapture *self); -static DECLARE_FORWARD(ALCmmdevCapture, ALCbackend, ALCboolean, reset) -static HRESULT ALCmmdevCapture_resetProxy(ALCmmdevCapture *self); -static ALCboolean ALCmmdevCapture_start(ALCmmdevCapture *self); -static HRESULT ALCmmdevCapture_startProxy(ALCmmdevCapture *self); -static void ALCmmdevCapture_stop(ALCmmdevCapture *self); -static void ALCmmdevCapture_stopProxy(ALCmmdevCapture *self); -static ALCenum ALCmmdevCapture_captureSamples(ALCmmdevCapture *self, ALCvoid *buffer, ALCuint samples); -static ALuint ALCmmdevCapture_availableSamples(ALCmmdevCapture *self); -static DECLARE_FORWARD(ALCmmdevCapture, ALCbackend, ClockLatency, getClockLatency) -static DECLARE_FORWARD(ALCmmdevCapture, ALCbackend, void, lock) -static DECLARE_FORWARD(ALCmmdevCapture, ALCbackend, void, unlock) -DECLARE_DEFAULT_ALLOCATORS(ALCmmdevCapture) +static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device); +static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self); +static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *name); +static HRESULT ALCwasapiCapture_openProxy(ALCwasapiCapture *self); +static void ALCwasapiCapture_closeProxy(ALCwasapiCapture *self); +static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ALCboolean, reset) +static HRESULT ALCwasapiCapture_resetProxy(ALCwasapiCapture *self); +static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self); +static HRESULT ALCwasapiCapture_startProxy(ALCwasapiCapture *self); +static void ALCwasapiCapture_stop(ALCwasapiCapture *self); +static void ALCwasapiCapture_stopProxy(ALCwasapiCapture *self); +static ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples); +static ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self); +static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, ClockLatency, getClockLatency) +static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, lock) +static DECLARE_FORWARD(ALCwasapiCapture, ALCbackend, void, unlock) +DECLARE_DEFAULT_ALLOCATORS(ALCwasapiCapture) -DEFINE_ALCMMDEVPROXY_VTABLE(ALCmmdevCapture); -DEFINE_ALCBACKEND_VTABLE(ALCmmdevCapture); +DEFINE_ALCWASAPIPROXY_VTABLE(ALCwasapiCapture); +DEFINE_ALCBACKEND_VTABLE(ALCwasapiCapture); -static void ALCmmdevCapture_Construct(ALCmmdevCapture *self, ALCdevice *device) +static void ALCwasapiCapture_Construct(ALCwasapiCapture *self, ALCdevice *device) { - SET_VTABLE2(ALCmmdevCapture, ALCbackend, self); - SET_VTABLE2(ALCmmdevCapture, ALCmmdevProxy, self); + SET_VTABLE2(ALCwasapiCapture, ALCbackend, self); + SET_VTABLE2(ALCwasapiCapture, ALCwasapiProxy, self); ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device); - ALCmmdevProxy_Construct(STATIC_CAST(ALCmmdevProxy, self)); + ALCwasapiProxy_Construct(STATIC_CAST(ALCwasapiProxy, self)); self->devid = NULL; @@ -1273,53 +1280,60 @@ static void ALCmmdevCapture_Construct(ALCmmdevCapture *self, ALCdevice *device) self->SampleConv = NULL; self->Ring = NULL; - self->killNow = 0; + ATOMIC_INIT(&self->killNow, 0); } -static void ALCmmdevCapture_Destruct(ALCmmdevCapture *self) +static void ALCwasapiCapture_Destruct(ALCwasapiCapture *self) { + if(self->MsgEvent) + { + ThreadRequest req = { self->MsgEvent, 0 }; + if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) + (void)WaitForResponse(&req); + + CloseHandle(self->MsgEvent); + self->MsgEvent = NULL; + } + + if(self->NotifyEvent != NULL) + CloseHandle(self->NotifyEvent); + self->NotifyEvent = NULL; + ll_ringbuffer_free(self->Ring); self->Ring = NULL; DestroySampleConverter(&self->SampleConv); DestroyChannelConverter(&self->ChannelConv); - if(self->NotifyEvent != NULL) - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - if(self->MsgEvent != NULL) - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - free(self->devid); self->devid = NULL; - ALCmmdevProxy_Destruct(STATIC_CAST(ALCmmdevProxy, self)); + ALCwasapiProxy_Destruct(STATIC_CAST(ALCwasapiProxy, self)); ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); } -FORCE_ALIGN int ALCmmdevCapture_recordProc(void *arg) +FORCE_ALIGN int ALCwasapiCapture_recordProc(void *arg) { - ALCmmdevCapture *self = arg; + ALCwasapiCapture *self = arg; ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; ALfloat *samples = NULL; size_t samplesmax = 0; HRESULT hr; - hr = CoInitialize(NULL); + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if(FAILED(hr)) { - ERR("CoInitialize(NULL) failed: 0x%08lx\n", hr); + ERR("CoInitializeEx(NULL, COINIT_MULTITHREADED) failed: 0x%08lx\n", hr); V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "COM init failed: 0x%08lx", hr); V0(device->Backend,unlock)(); return 1; } althrd_setname(althrd_current(), RECORD_THREAD_NAME); - while(!self->killNow) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_relaxed)) { UINT32 avail; DWORD res; @@ -1365,7 +1379,7 @@ FORCE_ALIGN int ALCmmdevCapture_recordProc(void *arg) ALsizei srcframes = numsamples; dstframes = SampleConverterInput(self->SampleConv, - &srcdata, &srcframes, data[0].buf, data[0].len + &srcdata, &srcframes, data[0].buf, (ALsizei)minz(data[0].len, INT_MAX) ); if(srcframes > 0 && dstframes == data[0].len && data[1].len > 0) { @@ -1374,16 +1388,16 @@ FORCE_ALIGN int ALCmmdevCapture_recordProc(void *arg) * dest block, do another run for the second block. */ dstframes += SampleConverterInput(self->SampleConv, - &srcdata, &srcframes, data[1].buf, data[1].len + &srcdata, &srcframes, data[1].buf, (ALsizei)minz(data[1].len, INT_MAX) ); } } else { - size_t framesize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, + ALuint framesize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder); - ALuint len1 = minu(data[0].len, numsamples); - ALuint len2 = minu(data[1].len, numsamples-len1); + size_t len1 = minz(data[0].len, numsamples); + size_t len2 = minz(data[1].len, numsamples-len1); memcpy(data[0].buf, rdata, len1*framesize); if(len2 > 0) @@ -1401,7 +1415,7 @@ FORCE_ALIGN int ALCmmdevCapture_recordProc(void *arg) if(FAILED(hr)) { V0(device->Backend,lock)(); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to capture samples: 0x%08lx", hr); V0(device->Backend,unlock)(); break; } @@ -1420,7 +1434,7 @@ FORCE_ALIGN int ALCmmdevCapture_recordProc(void *arg) } -static ALCenum ALCmmdevCapture_open(ALCmmdevCapture *self, const ALCchar *deviceName) +static ALCenum ALCwasapiCapture_open(ALCwasapiCapture *self, const ALCchar *deviceName) { HRESULT hr = S_OK; @@ -1480,7 +1494,7 @@ static ALCenum ALCmmdevCapture_open(ALCmmdevCapture *self, const ALCchar *device ThreadRequest req = { self->MsgEvent, 0 }; hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_OpenDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); else ERR("Failed to post thread message: %lu\n", GetLastError()); @@ -1506,14 +1520,13 @@ static ALCenum ALCmmdevCapture_open(ALCmmdevCapture *self, const ALCchar *device ThreadRequest req = { self->MsgEvent, 0 }; hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_ResetDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); else ERR("Failed to post thread message: %lu\n", GetLastError()); if(FAILED(hr)) { - ALCmmdevCapture_close(self); if(hr == E_OUTOFMEMORY) return ALC_OUT_OF_MEMORY; return ALC_INVALID_VALUE; @@ -1523,7 +1536,7 @@ static ALCenum ALCmmdevCapture_open(ALCmmdevCapture *self, const ALCchar *device return ALC_NO_ERROR; } -static HRESULT ALCmmdevCapture_openProxy(ALCmmdevCapture *self) +static HRESULT ALCwasapiCapture_openProxy(ALCwasapiCapture *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; void *ptr; @@ -1560,27 +1573,7 @@ static HRESULT ALCmmdevCapture_openProxy(ALCmmdevCapture *self) } -static void ALCmmdevCapture_close(ALCmmdevCapture *self) -{ - ThreadRequest req = { self->MsgEvent, 0 }; - - if(PostThreadMessage(ThreadID, WM_USER_CloseDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) - (void)WaitForResponse(&req); - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - CloseHandle(self->MsgEvent); - self->MsgEvent = NULL; - - CloseHandle(self->NotifyEvent); - self->NotifyEvent = NULL; - - free(self->devid); - self->devid = NULL; -} - -static void ALCmmdevCapture_closeProxy(ALCmmdevCapture *self) +static void ALCwasapiCapture_closeProxy(ALCwasapiCapture *self) { if(self->client) IAudioClient_Release(self->client); @@ -1592,7 +1585,7 @@ static void ALCmmdevCapture_closeProxy(ALCmmdevCapture *self) } -static HRESULT ALCmmdevCapture_resetProxy(ALCmmdevCapture *self) +static HRESULT ALCwasapiCapture_resetProxy(ALCwasapiCapture *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; WAVEFORMATEXTENSIBLE OutputType; @@ -1817,10 +1810,11 @@ static HRESULT ALCmmdevCapture_resetProxy(ALCmmdevCapture *self) return hr; } - buffer_len = maxu(device->UpdateSize*device->NumUpdates + 1, buffer_len); + buffer_len = maxu(device->UpdateSize*device->NumUpdates, buffer_len); ll_ringbuffer_free(self->Ring); self->Ring = ll_ringbuffer_create(buffer_len, - FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder) + FrameSizeFromDevFmt(device->FmtChans, device->FmtType, device->AmbiOrder), + false ); if(!self->Ring) { @@ -1839,18 +1833,18 @@ static HRESULT ALCmmdevCapture_resetProxy(ALCmmdevCapture *self) } -static ALCboolean ALCmmdevCapture_start(ALCmmdevCapture *self) +static ALCboolean ALCwasapiCapture_start(ALCwasapiCapture *self) { ThreadRequest req = { self->MsgEvent, 0 }; HRESULT hr = E_FAIL; - if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) hr = WaitForResponse(&req); return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE; } -static HRESULT ALCmmdevCapture_startProxy(ALCmmdevCapture *self) +static HRESULT ALCwasapiCapture_startProxy(ALCwasapiCapture *self) { HRESULT hr; void *ptr; @@ -1867,8 +1861,8 @@ static HRESULT ALCmmdevCapture_startProxy(ALCmmdevCapture *self) if(SUCCEEDED(hr)) { self->capture = ptr; - self->killNow = 0; - if(althrd_create(&self->thread, ALCmmdevCapture_recordProc, self) != althrd_success) + ATOMIC_STORE(&self->killNow, 0, almemory_order_release); + if(althrd_create(&self->thread, ALCwasapiCapture_recordProc, self) != althrd_success) { ERR("Failed to start thread\n"); IAudioCaptureClient_Release(self->capture); @@ -1887,21 +1881,21 @@ static HRESULT ALCmmdevCapture_startProxy(ALCmmdevCapture *self) } -static void ALCmmdevCapture_stop(ALCmmdevCapture *self) +static void ALCwasapiCapture_stop(ALCwasapiCapture *self) { ThreadRequest req = { self->MsgEvent, 0 }; - if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCmmdevProxy, self))) + if(PostThreadMessage(ThreadID, WM_USER_StopDevice, (WPARAM)&req, (LPARAM)STATIC_CAST(ALCwasapiProxy, self))) (void)WaitForResponse(&req); } -static void ALCmmdevCapture_stopProxy(ALCmmdevCapture *self) +static void ALCwasapiCapture_stopProxy(ALCwasapiCapture *self) { int res; if(!self->capture) return; - self->killNow = 1; + ATOMIC_STORE_SEQ(&self->killNow, 1); althrd_join(self->thread, &res); IAudioCaptureClient_Release(self->capture); @@ -1911,42 +1905,41 @@ static void ALCmmdevCapture_stopProxy(ALCmmdevCapture *self) } -ALuint ALCmmdevCapture_availableSamples(ALCmmdevCapture *self) +ALuint ALCwasapiCapture_availableSamples(ALCwasapiCapture *self) { return (ALuint)ll_ringbuffer_read_space(self->Ring); } -ALCenum ALCmmdevCapture_captureSamples(ALCmmdevCapture *self, ALCvoid *buffer, ALCuint samples) +ALCenum ALCwasapiCapture_captureSamples(ALCwasapiCapture *self, ALCvoid *buffer, ALCuint samples) { - if(ALCmmdevCapture_availableSamples(self) < samples) + if(ALCwasapiCapture_availableSamples(self) < samples) return ALC_INVALID_VALUE; ll_ringbuffer_read(self->Ring, buffer, samples); return ALC_NO_ERROR; } -static inline void AppendAllDevicesList2(const DevMap *entry) -{ AppendAllDevicesList(alstr_get_cstr(entry->name)); } -static inline void AppendCaptureDeviceList2(const DevMap *entry) -{ AppendCaptureDeviceList(alstr_get_cstr(entry->name)); } - -typedef struct ALCmmdevBackendFactory { +typedef struct ALCwasapiBackendFactory { DERIVE_FROM_TYPE(ALCbackendFactory); -} ALCmmdevBackendFactory; -#define ALCMMDEVBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCmmdevBackendFactory, ALCbackendFactory) } } +} ALCwasapiBackendFactory; +#define ALCWASAPIBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCwasapiBackendFactory, ALCbackendFactory) } } -static ALCboolean ALCmmdevBackendFactory_init(ALCmmdevBackendFactory *self); -static void ALCmmdevBackendFactory_deinit(ALCmmdevBackendFactory *self); -static ALCboolean ALCmmdevBackendFactory_querySupport(ALCmmdevBackendFactory *self, ALCbackend_Type type); -static void ALCmmdevBackendFactory_probe(ALCmmdevBackendFactory *self, enum DevProbe type); -static ALCbackend* ALCmmdevBackendFactory_createBackend(ALCmmdevBackendFactory *self, ALCdevice *device, ALCbackend_Type type); +static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory *self); +static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory *self); +static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory *self, ALCbackend_Type type); +static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory *self, enum DevProbe type, al_string *outnames); +static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory *self, ALCdevice *device, ALCbackend_Type type); -DEFINE_ALCBACKENDFACTORY_VTABLE(ALCmmdevBackendFactory); +DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwasapiBackendFactory); -static BOOL MMDevApiLoad(void) +static ALCboolean ALCwasapiBackendFactory_init(ALCwasapiBackendFactory* UNUSED(self)) { static HRESULT InitResult; + + VECTOR_INIT(PlaybackDevices); + VECTOR_INIT(CaptureDevices); + if(!ThreadHdl) { ThreadRequest req; @@ -1957,26 +1950,17 @@ static BOOL MMDevApiLoad(void) ERR("Failed to create event: %lu\n", GetLastError()); else { - ThreadHdl = CreateThread(NULL, 0, ALCmmdevProxy_messageHandler, &req, 0, &ThreadID); + ThreadHdl = CreateThread(NULL, 0, ALCwasapiProxy_messageHandler, &req, 0, &ThreadID); if(ThreadHdl != NULL) InitResult = WaitForResponse(&req); CloseHandle(req.FinishedEvt); } } - return SUCCEEDED(InitResult); + + return SUCCEEDED(InitResult) ? ALC_TRUE : ALC_FALSE; } -static ALCboolean ALCmmdevBackendFactory_init(ALCmmdevBackendFactory* UNUSED(self)) -{ - VECTOR_INIT(PlaybackDevices); - VECTOR_INIT(CaptureDevices); - - if(!MMDevApiLoad()) - return ALC_FALSE; - return ALC_TRUE; -} - -static void ALCmmdevBackendFactory_deinit(ALCmmdevBackendFactory* UNUSED(self)) +static void ALCwasapiBackendFactory_deinit(ALCwasapiBackendFactory* UNUSED(self)) { clear_devlist(&PlaybackDevices); VECTOR_DEINIT(PlaybackDevices); @@ -1993,19 +1977,14 @@ static void ALCmmdevBackendFactory_deinit(ALCmmdevBackendFactory* UNUSED(self)) } } -static ALCboolean ALCmmdevBackendFactory_querySupport(ALCmmdevBackendFactory* UNUSED(self), ALCbackend_Type type) +static ALCboolean ALCwasapiBackendFactory_querySupport(ALCwasapiBackendFactory* UNUSED(self), ALCbackend_Type type) { - /* TODO: Disable capture with mmdevapi for now, since it doesn't do any - * rechanneling or resampling; if the device is configured for 48000hz - * stereo input, for example, and the app asks for 22050hz mono, - * initialization will fail. - */ if(type == ALCbackend_Playback || type == ALCbackend_Capture) return ALC_TRUE; return ALC_FALSE; } -static void ALCmmdevBackendFactory_probe(ALCmmdevBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCwasapiBackendFactory_probe(ALCwasapiBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { ThreadRequest req = { NULL, 0 }; @@ -2019,32 +1998,38 @@ static void ALCmmdevBackendFactory_probe(ALCmmdevBackendFactory* UNUSED(self), e hr = WaitForResponse(&req); if(SUCCEEDED(hr)) switch(type) { +#define APPEND_OUTNAME(e) do { \ + if(!alstr_empty((e)->name)) \ + alstr_append_range(outnames, VECTOR_BEGIN((e)->name), \ + VECTOR_END((e)->name)+1); \ +} while(0) case ALL_DEVICE_PROBE: - VECTOR_FOR_EACH(const DevMap, PlaybackDevices, AppendAllDevicesList2); + VECTOR_FOR_EACH(const DevMap, PlaybackDevices, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: - VECTOR_FOR_EACH(const DevMap, CaptureDevices, AppendCaptureDeviceList2); + VECTOR_FOR_EACH(const DevMap, CaptureDevices, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } CloseHandle(req.FinishedEvt); req.FinishedEvt = NULL; } } -static ALCbackend* ALCmmdevBackendFactory_createBackend(ALCmmdevBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) +static ALCbackend* ALCwasapiBackendFactory_createBackend(ALCwasapiBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type) { if(type == ALCbackend_Playback) { - ALCmmdevPlayback *backend; - NEW_OBJ(backend, ALCmmdevPlayback)(device); + ALCwasapiPlayback *backend; + NEW_OBJ(backend, ALCwasapiPlayback)(device); if(!backend) return NULL; return STATIC_CAST(ALCbackend, backend); } if(type == ALCbackend_Capture) { - ALCmmdevCapture *backend; - NEW_OBJ(backend, ALCmmdevCapture)(device); + ALCwasapiCapture *backend; + NEW_OBJ(backend, ALCwasapiCapture)(device); if(!backend) return NULL; return STATIC_CAST(ALCbackend, backend); } @@ -2053,8 +2038,8 @@ static ALCbackend* ALCmmdevBackendFactory_createBackend(ALCmmdevBackendFactory* } -ALCbackendFactory *ALCmmdevBackendFactory_getFactory(void) +ALCbackendFactory *ALCwasapiBackendFactory_getFactory(void) { - static ALCmmdevBackendFactory factory = ALCMMDEVBACKENDFACTORY_INITIALIZER; + static ALCwasapiBackendFactory factory = ALCWASAPIBACKENDFACTORY_INITIALIZER; return STATIC_CAST(ALCbackendFactory, &factory); } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/wave.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/wave.c similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/wave.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/wave.c index bdf76edc..390b2a5f 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/wave.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/wave.c @@ -27,6 +27,7 @@ #include "alMain.h" #include "alu.h" +#include "alconfig.h" #include "threads.h" #include "compat.h" @@ -76,16 +77,15 @@ typedef struct ALCwaveBackend { ALvoid *mBuffer; ALuint mSize; - volatile int killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCwaveBackend; static int ALCwaveBackend_mixerProc(void *ptr); static void ALCwaveBackend_Construct(ALCwaveBackend *self, ALCdevice *device); -static DECLARE_FORWARD(ALCwaveBackend, ALCbackend, void, Destruct) +static void ALCwaveBackend_Destruct(ALCwaveBackend *self); static ALCenum ALCwaveBackend_open(ALCwaveBackend *self, const ALCchar *name); -static void ALCwaveBackend_close(ALCwaveBackend *self); static ALCboolean ALCwaveBackend_reset(ALCwaveBackend *self); static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self); static void ALCwaveBackend_stop(ALCwaveBackend *self); @@ -110,9 +110,17 @@ static void ALCwaveBackend_Construct(ALCwaveBackend *self, ALCdevice *device) self->mBuffer = NULL; self->mSize = 0; - self->killNow = 1; + ATOMIC_INIT(&self->killNow, AL_TRUE); } +static void ALCwaveBackend_Destruct(ALCwaveBackend *self) +{ + if(self->mFile) + fclose(self->mFile); + self->mFile = NULL; + + ALCbackend_Destruct(STATIC_CAST(ALCbackend, self)); +} static int ALCwaveBackend_mixerProc(void *ptr) { @@ -135,7 +143,8 @@ static int ALCwaveBackend_mixerProc(void *ptr) ERR("Failed to get starting time\n"); return 1; } - while(!self->killNow && device->Connected) + while(!ATOMIC_LOAD(&self->killNow, almemory_order_acquire) && + ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { if(altimespec_get(&now, AL_TIME_UTC) != AL_TIME_UTC) { @@ -196,7 +205,7 @@ static int ALCwaveBackend_mixerProc(void *ptr) { ERR("Error writing to file\n"); ALCdevice_Lock(device); - aluHandleDisconnect(device); + aluHandleDisconnect(device, "Failed to write playback samples"); ALCdevice_Unlock(device); break; } @@ -233,13 +242,6 @@ static ALCenum ALCwaveBackend_open(ALCwaveBackend *self, const ALCchar *name) return ALC_NO_ERROR; } -static void ALCwaveBackend_close(ALCwaveBackend *self) -{ - if(self->mFile) - fclose(self->mFile); - self->mFile = NULL; -} - static ALCboolean ALCwaveBackend_reset(ALCwaveBackend *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -354,7 +356,7 @@ static ALCboolean ALCwaveBackend_start(ALCwaveBackend *self) return ALC_FALSE; } - self->killNow = 0; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCwaveBackend_mixerProc, self) != althrd_success) { free(self->mBuffer); @@ -372,10 +374,8 @@ static void ALCwaveBackend_stop(ALCwaveBackend *self) long size; int res; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - self->killNow = 1; althrd_join(self->thread, &res); free(self->mBuffer); @@ -403,7 +403,7 @@ ALCbackendFactory *ALCwaveBackendFactory_getFactory(void); static ALCboolean ALCwaveBackendFactory_init(ALCwaveBackendFactory *self); static DECLARE_FORWARD(ALCwaveBackendFactory, ALCbackendFactory, void, deinit) static ALCboolean ALCwaveBackendFactory_querySupport(ALCwaveBackendFactory *self, ALCbackend_Type type); -static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory *self, enum DevProbe type); +static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCwaveBackendFactory_createBackend(ALCwaveBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwaveBackendFactory); @@ -427,12 +427,12 @@ static ALCboolean ALCwaveBackendFactory_querySupport(ALCwaveBackendFactory* UNUS return ALC_FALSE; } -static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCwaveBackendFactory_probe(ALCwaveBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { case ALL_DEVICE_PROBE: - AppendAllDevicesList(waveDevice); + alstr_append_range(outnames, waveDevice, waveDevice+sizeof(waveDevice)); break; case CAPTURE_DEVICE_PROBE: break; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/backends/winmm.c b/love/src/jni/openal-soft-1.19.1/Alc/backends/winmm.c similarity index 92% rename from love/src/jni/openal-soft-1.18.2/Alc/backends/winmm.c rename to love/src/jni/openal-soft-1.19.1/Alc/backends/winmm.c index b5b3cdb6..0d4a02b8 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/backends/winmm.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/backends/winmm.c @@ -29,6 +29,7 @@ #include "alMain.h" #include "alu.h" +#include "ringbuffer.h" #include "threads.h" #include "backends/base.h" @@ -147,7 +148,7 @@ typedef struct ALCwinmmPlayback { WAVEFORMATEX Format; - volatile ALboolean killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCwinmmPlayback; @@ -158,7 +159,6 @@ static void CALLBACK ALCwinmmPlayback_waveOutProc(HWAVEOUT device, UINT msg, DWO static int ALCwinmmPlayback_mixerProc(void *arg); static ALCenum ALCwinmmPlayback_open(ALCwinmmPlayback *self, const ALCchar *name); -static void ALCwinmmPlayback_close(ALCwinmmPlayback *self); static ALCboolean ALCwinmmPlayback_reset(ALCwinmmPlayback *self); static ALCboolean ALCwinmmPlayback_start(ALCwinmmPlayback *self); static void ALCwinmmPlayback_stop(ALCwinmmPlayback *self); @@ -180,7 +180,7 @@ static void ALCwinmmPlayback_Construct(ALCwinmmPlayback *self, ALCdevice *device InitRef(&self->WaveBuffersCommitted, 0); self->OutHdl = NULL; - self->killNow = AL_TRUE; + ATOMIC_INIT(&self->killNow, AL_TRUE); } static void ALCwinmmPlayback_Destruct(ALCwinmmPlayback *self) @@ -224,7 +224,7 @@ FORCE_ALIGN static int ALCwinmmPlayback_mixerProc(void *arg) if(msg.message != WOM_DONE) continue; - if(self->killNow) + if(ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) { if(ReadRef(&self->WaveBuffersCommitted) == 0) break; @@ -311,9 +311,6 @@ failure: return ALC_INVALID_VALUE; } -static void ALCwinmmPlayback_close(ALCwinmmPlayback* UNUSED(self)) -{ } - static ALCboolean ALCwinmmPlayback_reset(ALCwinmmPlayback *self) { ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice; @@ -374,7 +371,7 @@ static ALCboolean ALCwinmmPlayback_start(ALCwinmmPlayback *self) ALint BufferSize; ALuint i; - self->killNow = AL_FALSE; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCwinmmPlayback_mixerProc, self) != althrd_success) return ALC_FALSE; @@ -405,11 +402,8 @@ static void ALCwinmmPlayback_stop(ALCwinmmPlayback *self) void *buffer = NULL; int i; - if(self->killNow) + if(ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) return; - - // Set flag to stop processing headers - self->killNow = AL_TRUE; althrd_join(self->thread, &i); // Release the wave buffers @@ -436,7 +430,7 @@ typedef struct ALCwinmmCapture { WAVEFORMATEX Format; - volatile ALboolean killNow; + ATOMIC(ALenum) killNow; althrd_t thread; } ALCwinmmCapture; @@ -447,7 +441,6 @@ static void CALLBACK ALCwinmmCapture_waveInProc(HWAVEIN device, UINT msg, DWORD_ static int ALCwinmmCapture_captureProc(void *arg); static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name); -static void ALCwinmmCapture_close(ALCwinmmCapture *self); static DECLARE_FORWARD(ALCwinmmCapture, ALCbackend, ALCboolean, reset) static ALCboolean ALCwinmmCapture_start(ALCwinmmCapture *self); static void ALCwinmmCapture_stop(ALCwinmmCapture *self); @@ -469,11 +462,38 @@ static void ALCwinmmCapture_Construct(ALCwinmmCapture *self, ALCdevice *device) InitRef(&self->WaveBuffersCommitted, 0); self->InHdl = NULL; - self->killNow = AL_TRUE; + ATOMIC_INIT(&self->killNow, AL_TRUE); } static void ALCwinmmCapture_Destruct(ALCwinmmCapture *self) { + void *buffer = NULL; + int i; + + /* Tell the processing thread to quit and wait for it to do so. */ + if(!ATOMIC_EXCHANGE(&self->killNow, AL_TRUE, almemory_order_acq_rel)) + { + PostThreadMessage(self->thread, WM_QUIT, 0, 0); + + althrd_join(self->thread, &i); + + /* Make sure capture is stopped and all pending buffers are flushed. */ + waveInReset(self->InHdl); + + // Release the wave buffers + for(i = 0;i < 4;i++) + { + waveInUnprepareHeader(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); + if(i == 0) buffer = self->WaveBuffer[i].lpData; + self->WaveBuffer[i].lpData = NULL; + } + free(buffer); + } + + ll_ringbuffer_free(self->Ring); + self->Ring = NULL; + + // Close the Wave device if(self->InHdl) waveInClose(self->InHdl); self->InHdl = 0; @@ -512,7 +532,7 @@ static int ALCwinmmCapture_captureProc(void *arg) continue; /* Don't wait for other buffers to finish before quitting. We're * closing so we don't need them. */ - if(self->killNow) + if(ATOMIC_LOAD(&self->killNow, almemory_order_acquire)) break; WaveHdr = ((WAVEHDR*)msg.lParam); @@ -606,7 +626,7 @@ static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name) if(CapturedDataSize < (self->Format.nSamplesPerSec / 10)) CapturedDataSize = self->Format.nSamplesPerSec / 10; - self->Ring = ll_ringbuffer_create(CapturedDataSize+1, self->Format.nBlockAlign); + self->Ring = ll_ringbuffer_create(CapturedDataSize, self->Format.nBlockAlign, false); if(!self->Ring) goto failure; InitRef(&self->WaveBuffersCommitted, 0); @@ -632,7 +652,7 @@ static ALCenum ALCwinmmCapture_open(ALCwinmmCapture *self, const ALCchar *name) IncrementRef(&self->WaveBuffersCommitted); } - self->killNow = AL_FALSE; + ATOMIC_STORE(&self->killNow, AL_FALSE, almemory_order_release); if(althrd_create(&self->thread, ALCwinmmCapture_captureProc, self) != althrd_success) goto failure; @@ -657,37 +677,6 @@ failure: return ALC_INVALID_VALUE; } -static void ALCwinmmCapture_close(ALCwinmmCapture *self) -{ - void *buffer = NULL; - int i; - - /* Tell the processing thread to quit and wait for it to do so. */ - self->killNow = AL_TRUE; - PostThreadMessage(self->thread, WM_QUIT, 0, 0); - - althrd_join(self->thread, &i); - - /* Make sure capture is stopped and all pending buffers are flushed. */ - waveInReset(self->InHdl); - - // Release the wave buffers - for(i = 0;i < 4;i++) - { - waveInUnprepareHeader(self->InHdl, &self->WaveBuffer[i], sizeof(WAVEHDR)); - if(i == 0) buffer = self->WaveBuffer[i].lpData; - self->WaveBuffer[i].lpData = NULL; - } - free(buffer); - - ll_ringbuffer_free(self->Ring); - self->Ring = NULL; - - // Close the Wave device - waveInClose(self->InHdl); - self->InHdl = NULL; -} - static ALCboolean ALCwinmmCapture_start(ALCwinmmCapture *self) { waveInStart(self->InHdl); @@ -707,21 +696,10 @@ static ALCenum ALCwinmmCapture_captureSamples(ALCwinmmCapture *self, ALCvoid *bu static ALCuint ALCwinmmCapture_availableSamples(ALCwinmmCapture *self) { - return ll_ringbuffer_read_space(self->Ring); + return (ALCuint)ll_ringbuffer_read_space(self->Ring); } -static inline void AppendAllDevicesList2(const al_string *name) -{ - if(!alstr_empty(*name)) - AppendAllDevicesList(alstr_get_cstr(*name)); -} -static inline void AppendCaptureDeviceList2(const al_string *name) -{ - if(!alstr_empty(*name)) - AppendCaptureDeviceList(alstr_get_cstr(*name)); -} - typedef struct ALCwinmmBackendFactory { DERIVE_FROM_TYPE(ALCbackendFactory); } ALCwinmmBackendFactory; @@ -730,7 +708,7 @@ typedef struct ALCwinmmBackendFactory { static ALCboolean ALCwinmmBackendFactory_init(ALCwinmmBackendFactory *self); static void ALCwinmmBackendFactory_deinit(ALCwinmmBackendFactory *self); static ALCboolean ALCwinmmBackendFactory_querySupport(ALCwinmmBackendFactory *self, ALCbackend_Type type); -static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory *self, enum DevProbe type); +static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory *self, enum DevProbe type, al_string *outnames); static ALCbackend* ALCwinmmBackendFactory_createBackend(ALCwinmmBackendFactory *self, ALCdevice *device, ALCbackend_Type type); DEFINE_ALCBACKENDFACTORY_VTABLE(ALCwinmmBackendFactory); @@ -760,19 +738,24 @@ static ALCboolean ALCwinmmBackendFactory_querySupport(ALCwinmmBackendFactory* UN return ALC_FALSE; } -static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory* UNUSED(self), enum DevProbe type) +static void ALCwinmmBackendFactory_probe(ALCwinmmBackendFactory* UNUSED(self), enum DevProbe type, al_string *outnames) { switch(type) { +#define APPEND_OUTNAME(n) do { \ + if(!alstr_empty(*(n))) \ + alstr_append_range(outnames, VECTOR_BEGIN(*(n)), VECTOR_END(*(n))+1); \ +} while(0) case ALL_DEVICE_PROBE: ProbePlaybackDevices(); - VECTOR_FOR_EACH(const al_string, PlaybackDevices, AppendAllDevicesList2); + VECTOR_FOR_EACH(const al_string, PlaybackDevices, APPEND_OUTNAME); break; case CAPTURE_DEVICE_PROBE: ProbeCaptureDevices(); - VECTOR_FOR_EACH(const al_string, CaptureDevices, AppendCaptureDeviceList2); + VECTOR_FOR_EACH(const al_string, CaptureDevices, APPEND_OUTNAME); break; +#undef APPEND_OUTNAME } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/bformatdec.c b/love/src/jni/openal-soft-1.19.1/Alc/bformatdec.c similarity index 60% rename from love/src/jni/openal-soft-1.18.2/Alc/bformatdec.c rename to love/src/jni/openal-soft-1.19.1/Alc/bformatdec.c index ba6daac5..5233d06f 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/bformatdec.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/bformatdec.c @@ -3,7 +3,7 @@ #include "bformatdec.h" #include "ambdec.h" -#include "mixer_defs.h" +#include "filters/splitter.h" #include "alu.h" #include "bool.h" @@ -11,114 +11,14 @@ #include "almalloc.h" -void bandsplit_init(BandSplitter *splitter, ALfloat freq_mult) -{ - ALfloat w = freq_mult * F_TAU; - ALfloat cw = cosf(w); - if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; - else - splitter->coeff = cw * -0.5f; - - splitter->lp_z1 = 0.0f; - splitter->lp_z2 = 0.0f; - splitter->hp_z1 = 0.0f; -} - -void bandsplit_clear(BandSplitter *splitter) -{ - splitter->lp_z1 = 0.0f; - splitter->lp_z2 = 0.0f; - splitter->hp_z1 = 0.0f; -} - -void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, - const ALfloat *input, ALsizei count) -{ - ALfloat coeff, d, x; - ALfloat z1, z2; - ALsizei i; - - coeff = splitter->coeff*0.5f + 0.5f; - z1 = splitter->lp_z1; - z2 = splitter->lp_z2; - for(i = 0;i < count;i++) - { - x = input[i]; - - d = (x - z1) * coeff; - x = z1 + d; - z1 = x + d; - - d = (x - z2) * coeff; - x = z2 + d; - z2 = x + d; - - lpout[i] = x; - } - splitter->lp_z1 = z1; - splitter->lp_z2 = z2; - - coeff = splitter->coeff; - z1 = splitter->hp_z1; - for(i = 0;i < count;i++) - { - x = input[i]; - - d = x - coeff*z1; - x = z1 + coeff*d; - z1 = d; - - hpout[i] = x - lpout[i]; - } - splitter->hp_z1 = z1; -} - - -void splitterap_init(SplitterAllpass *splitter, ALfloat freq_mult) -{ - ALfloat w = freq_mult * F_TAU; - ALfloat cw = cosf(w); - if(cw > FLT_EPSILON) - splitter->coeff = (sinf(w) - 1.0f) / cw; - else - splitter->coeff = cw * -0.5f; - - splitter->z1 = 0.0f; -} - -void splitterap_clear(SplitterAllpass *splitter) -{ - splitter->z1 = 0.0f; -} - -void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count) -{ - ALfloat coeff, d, x; - ALfloat z1; - ALsizei i; - - coeff = splitter->coeff; - z1 = splitter->z1; - for(i = 0;i < count;i++) - { - x = samples[i]; - - d = x - coeff*z1; - x = z1 + coeff*d; - z1 = d; - - samples[i] = x; - } - splitter->z1 = z1; -} - - -static const ALfloat UnitScale[MAX_AMBI_COEFFS] = { +/* NOTE: These are scale factors as applied to Ambisonics content. Decoder + * coefficients should be divided by these values to get proper N3D scalings. + */ +const ALfloat N3D2N3DScale[MAX_AMBI_COEFFS] = { 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 }; -static const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS] = { +const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS] = { 1.000000000f, /* ACN 0 (W), sqrt(1) */ 1.732050808f, /* ACN 1 (Y), sqrt(3) */ 1.732050808f, /* ACN 2 (Z), sqrt(3) */ @@ -136,7 +36,7 @@ static const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS] = { 2.645751311f, /* ACN 14 (N), sqrt(7) */ 2.645751311f, /* ACN 15 (P), sqrt(7) */ }; -static const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS] = { +const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS] = { 1.414213562f, /* ACN 0 (W), sqrt(2) */ 1.732050808f, /* ACN 1 (Y), sqrt(3) */ 1.732050808f, /* ACN 2 (Z), sqrt(3) */ @@ -156,11 +56,9 @@ static const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS] = { }; -enum FreqBand { - FB_HighFreq, - FB_LowFreq, - FB_Max -}; +#define HF_BAND 0 +#define LF_BAND 1 +#define NUM_BANDS 2 /* These points are in AL coordinates! */ static const ALfloat Ambi3DPoints[8][3] = { @@ -173,35 +71,28 @@ static const ALfloat Ambi3DPoints[8][3] = { { -0.577350269f, -0.577350269f, 0.577350269f }, { 0.577350269f, -0.577350269f, 0.577350269f }, }; -static const ALfloat Ambi3DDecoder[8][FB_Max][MAX_AMBI_COEFFS] = { - { { 0.25f, 0.1443375672f, 0.1443375672f, 0.1443375672f }, { 0.125f, 0.125f, 0.125f, 0.125f } }, - { { 0.25f, -0.1443375672f, 0.1443375672f, 0.1443375672f }, { 0.125f, -0.125f, 0.125f, 0.125f } }, - { { 0.25f, 0.1443375672f, 0.1443375672f, -0.1443375672f }, { 0.125f, 0.125f, 0.125f, -0.125f } }, - { { 0.25f, -0.1443375672f, 0.1443375672f, -0.1443375672f }, { 0.125f, -0.125f, 0.125f, -0.125f } }, - { { 0.25f, 0.1443375672f, -0.1443375672f, 0.1443375672f }, { 0.125f, 0.125f, -0.125f, 0.125f } }, - { { 0.25f, -0.1443375672f, -0.1443375672f, 0.1443375672f }, { 0.125f, -0.125f, -0.125f, 0.125f } }, - { { 0.25f, 0.1443375672f, -0.1443375672f, -0.1443375672f }, { 0.125f, 0.125f, -0.125f, -0.125f } }, - { { 0.25f, -0.1443375672f, -0.1443375672f, -0.1443375672f }, { 0.125f, -0.125f, -0.125f, -0.125f } }, +static const ALfloat Ambi3DDecoder[8][MAX_AMBI_COEFFS] = { + { 0.125f, 0.125f, 0.125f, 0.125f }, + { 0.125f, -0.125f, 0.125f, 0.125f }, + { 0.125f, 0.125f, 0.125f, -0.125f }, + { 0.125f, -0.125f, 0.125f, -0.125f }, + { 0.125f, 0.125f, -0.125f, 0.125f }, + { 0.125f, -0.125f, -0.125f, 0.125f }, + { 0.125f, 0.125f, -0.125f, -0.125f }, + { 0.125f, -0.125f, -0.125f, -0.125f }, +}; +static const ALfloat Ambi3DDecoderHFScale[MAX_AMBI_COEFFS] = { + 2.0f, + 1.15470054f, 1.15470054f, 1.15470054f }; - - -static RowMixerFunc MixMatrixRow = MixRow_C; - - -static alonce_flag bformatdec_inited = AL_ONCE_FLAG_INIT; - -static void init_bformatdec(void) -{ - MixMatrixRow = SelectRowMixer(); -} /* NOTE: BandSplitter filters are unused with single-band decoding */ typedef struct BFormatDec { - ALboolean Enabled[MAX_OUTPUT_CHANNELS]; + ALuint Enabled; /* Bitfield of enabled channels. */ union { - alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][FB_Max][MAX_AMBI_COEFFS]; + alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][NUM_BANDS][MAX_AMBI_COEFFS]; alignas(16) ALfloat Single[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS]; } Matrix; @@ -216,7 +107,7 @@ typedef struct BFormatDec { struct { BandSplitter XOver; - ALfloat Gains[FB_Max]; + ALfloat Gains[NUM_BANDS]; } UpSampler[4]; ALsizei NumChannels; @@ -225,21 +116,20 @@ typedef struct BFormatDec { BFormatDec *bformatdec_alloc() { - alcall_once(&bformatdec_inited, init_bformatdec); return al_calloc(16, sizeof(BFormatDec)); } -void bformatdec_free(BFormatDec *dec) +void bformatdec_free(BFormatDec **dec) { - if(dec) + if(dec && *dec) { - al_free(dec->Samples); - dec->Samples = NULL; - dec->SamplesHF = NULL; - dec->SamplesLF = NULL; + al_free((*dec)->Samples); + (*dec)->Samples = NULL; + (*dec)->SamplesHF = NULL; + (*dec)->SamplesLF = NULL; - memset(dec, 0, sizeof(*dec)); - al_free(dec); + al_free(*dec); + *dec = NULL; } } @@ -248,7 +138,7 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount static const ALsizei map2DTo3D[MAX_AMBI2D_COEFFS] = { 0, 1, 3, 4, 8, 9, 15 }; - const ALfloat *coeff_scale = UnitScale; + const ALfloat *coeff_scale = N3D2N3DScale; bool periphonic; ALfloat ratio; ALsizei i; @@ -263,10 +153,9 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount dec->SamplesHF = dec->Samples; dec->SamplesLF = dec->SamplesHF + dec->NumChannels; - for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - dec->Enabled[i] = AL_FALSE; + dec->Enabled = 0; for(i = 0;i < conf->NumSpeakers;i++) - dec->Enabled[chanmap[i]] = AL_TRUE; + dec->Enabled |= 1 << chanmap[i]; if(conf->CoeffScale == ADS_SN3D) coeff_scale = SN3D2N3DScale; @@ -281,31 +170,31 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount { periphonic = true; - dec->UpSampler[0].Gains[FB_HighFreq] = (dec->NumChannels > 9) ? W_SCALE3D_THIRD : - (dec->NumChannels > 4) ? W_SCALE3D_SECOND : 1.0f; - dec->UpSampler[0].Gains[FB_LowFreq] = 1.0f; + dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H3P : + (conf->ChanMask > 0xf) ? W_SCALE_2H2P : 1.0f; + dec->UpSampler[0].Gains[LF_BAND] = 1.0f; for(i = 1;i < 4;i++) { - dec->UpSampler[i].Gains[FB_HighFreq] = (dec->NumChannels > 9) ? XYZ_SCALE3D_THIRD : - (dec->NumChannels > 4) ? XYZ_SCALE3D_SECOND : 1.0f; - dec->UpSampler[i].Gains[FB_LowFreq] = 1.0f; + dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H3P : + (conf->ChanMask > 0xf) ? XYZ_SCALE_2H2P : 1.0f; + dec->UpSampler[i].Gains[LF_BAND] = 1.0f; } } else { periphonic = false; - dec->UpSampler[0].Gains[FB_HighFreq] = (dec->NumChannels > 5) ? W_SCALE2D_THIRD : - (dec->NumChannels > 3) ? W_SCALE2D_SECOND : 1.0f; - dec->UpSampler[0].Gains[FB_LowFreq] = 1.0f; + dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H0P : + (conf->ChanMask > 0xf) ? W_SCALE_2H0P : 1.0f; + dec->UpSampler[0].Gains[LF_BAND] = 1.0f; for(i = 1;i < 3;i++) { - dec->UpSampler[i].Gains[FB_HighFreq] = (dec->NumChannels > 5) ? XYZ_SCALE2D_THIRD : - (dec->NumChannels > 3) ? XYZ_SCALE2D_SECOND : 1.0f; - dec->UpSampler[i].Gains[FB_LowFreq] = 1.0f; + dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H0P : + (conf->ChanMask > 0xf) ? XYZ_SCALE_2H0P : 1.0f; + dec->UpSampler[i].Gains[LF_BAND] = 1.0f; } - dec->UpSampler[3].Gains[FB_HighFreq] = 0.0f; - dec->UpSampler[3].Gains[FB_LowFreq] = 0.0f; + dec->UpSampler[3].Gains[HF_BAND] = 0.0f; + dec->UpSampler[3].Gains[LF_BAND] = 0.0f; } memset(&dec->Matrix, 0, sizeof(dec->Matrix)); @@ -372,8 +261,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount else if(j == 3) gain = conf->HFOrderGain[2] * ratio; else if(j == 5) gain = conf->HFOrderGain[3] * ratio; if((conf->ChanMask&(1<Matrix.Dual[chan][FB_HighFreq][j] = conf->HFMatrix[i][k++] / - coeff_scale[l] * gain; + dec->Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / + coeff_scale[l] * gain; } for(j = 0,k = 0;j < MAX_AMBI2D_COEFFS;j++) { @@ -383,8 +272,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount else if(j == 3) gain = conf->LFOrderGain[2] / ratio; else if(j == 5) gain = conf->LFOrderGain[3] / ratio; if((conf->ChanMask&(1<Matrix.Dual[chan][FB_LowFreq][j] = conf->LFMatrix[i][k++] / - coeff_scale[l] * gain; + dec->Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / + coeff_scale[l] * gain; } } else @@ -396,8 +285,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount else if(j == 4) gain = conf->HFOrderGain[2] * ratio; else if(j == 9) gain = conf->HFOrderGain[3] * ratio; if((conf->ChanMask&(1<Matrix.Dual[chan][FB_HighFreq][j] = conf->HFMatrix[i][k++] / - coeff_scale[j] * gain; + dec->Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / + coeff_scale[j] * gain; } for(j = 0,k = 0;j < MAX_AMBI_COEFFS;j++) { @@ -406,8 +295,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount else if(j == 4) gain = conf->LFOrderGain[2] / ratio; else if(j == 9) gain = conf->LFOrderGain[3] / ratio; if((conf->ChanMask&(1<Matrix.Dual[chan][FB_LowFreq][j] = conf->LFMatrix[i][k++] / - coeff_scale[j] * gain; + dec->Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / + coeff_scale[j] * gain; } } } @@ -428,17 +317,15 @@ void bformatdec_process(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BU for(chan = 0;chan < OutChannels;chan++) { - if(!dec->Enabled[chan]) + if(!(dec->Enabled&(1<ChannelMix, 0, SamplesToDo*sizeof(ALfloat)); - MixMatrixRow(dec->ChannelMix, dec->Matrix.Dual[chan][FB_HighFreq], - SAFE_CONST(ALfloatBUFFERSIZE*,dec->SamplesHF), dec->NumChannels, 0, - SamplesToDo + MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][HF_BAND], + dec->SamplesHF, dec->NumChannels, 0, SamplesToDo ); - MixMatrixRow(dec->ChannelMix, dec->Matrix.Dual[chan][FB_LowFreq], - SAFE_CONST(ALfloatBUFFERSIZE*,dec->SamplesLF), dec->NumChannels, 0, - SamplesToDo + MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][LF_BAND], + dec->SamplesLF, dec->NumChannels, 0, SamplesToDo ); for(i = 0;i < SamplesToDo;i++) @@ -449,12 +336,12 @@ void bformatdec_process(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[BU { for(chan = 0;chan < OutChannels;chan++) { - if(!dec->Enabled[chan]) + if(!(dec->Enabled&(1<ChannelMix, 0, SamplesToDo*sizeof(ALfloat)); - MixMatrixRow(dec->ChannelMix, dec->Matrix.Single[chan], InSamples, - dec->NumChannels, 0, SamplesToDo); + MixRowSamples(dec->ChannelMix, dec->Matrix.Single[chan], InSamples, + dec->NumChannels, 0, SamplesToDo); for(i = 0;i < SamplesToDo;i++) OutBuffer[chan][i] += dec->ChannelMix[i]; @@ -483,14 +370,13 @@ void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[B * bands. */ bandsplit_process(&dec->UpSampler[i].XOver, - dec->Samples[FB_HighFreq], dec->Samples[FB_LowFreq], + dec->Samples[HF_BAND], dec->Samples[LF_BAND], InSamples[i], SamplesToDo ); /* Now write each band to the output. */ - MixMatrixRow(OutBuffer[i], dec->UpSampler[i].Gains, - SAFE_CONST(ALfloatBUFFERSIZE*,dec->Samples), FB_Max, 0, - SamplesToDo + MixRowSamples(OutBuffer[i], dec->UpSampler[i].Gains, + dec->Samples, NUM_BANDS, 0, SamplesToDo ); } } @@ -511,28 +397,31 @@ static ALsizei GetACNIndex(const BFChannelConfig *chans, ALsizei numchans, ALsiz #define GetChannelForACN(b, a) GetACNIndex((b).Ambi.Map, (b).NumChannels, (a)) typedef struct AmbiUpsampler { - alignas(16) ALfloat Samples[FB_Max][BUFFERSIZE]; + alignas(16) ALfloat Samples[NUM_BANDS][BUFFERSIZE]; BandSplitter XOver[4]; - ALfloat Gains[4][MAX_OUTPUT_CHANNELS][FB_Max]; + ALfloat Gains[4][MAX_OUTPUT_CHANNELS][NUM_BANDS]; } AmbiUpsampler; AmbiUpsampler *ambiup_alloc() { - alcall_once(&bformatdec_inited, init_bformatdec); return al_calloc(16, sizeof(AmbiUpsampler)); } -void ambiup_free(struct AmbiUpsampler *ambiup) +void ambiup_free(struct AmbiUpsampler **ambiup) { - al_free(ambiup); + if(ambiup) + { + al_free(*ambiup); + *ambiup = NULL; + } } -void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device) +void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale) { ALfloat ratio; - size_t i; + ALsizei i; ratio = 400.0f / (ALfloat)device->Frequency; for(i = 0;i < 4;i++) @@ -545,11 +434,11 @@ void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device) ALsizei j; size_t k; - for(i = 0;i < COUNTOF(Ambi3DPoints);i++) + for(k = 0;k < COUNTOF(Ambi3DPoints);k++) { ALfloat coeffs[MAX_AMBI_COEFFS] = { 0.0f }; - CalcDirectionCoeffs(Ambi3DPoints[i], 0.0f, coeffs); - ComputePanningGains(device->Dry, coeffs, 1.0f, encgains[i]); + CalcDirectionCoeffs(Ambi3DPoints[k], 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, 1.0f, encgains[k]); } /* Combine the matrices that do the in->virt and virt->out conversions @@ -561,32 +450,24 @@ void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device) { for(j = 0;j < device->Dry.NumChannels;j++) { - ALfloat hfgain=0.0f, lfgain=0.0f; + ALdouble gain = 0.0; for(k = 0;k < COUNTOF(Ambi3DDecoder);k++) - { - hfgain += Ambi3DDecoder[k][FB_HighFreq][i]*encgains[k][j]; - lfgain += Ambi3DDecoder[k][FB_LowFreq][i]*encgains[k][j]; - } - ambiup->Gains[i][j][FB_HighFreq] = hfgain; - ambiup->Gains[i][j][FB_LowFreq] = lfgain; + gain += (ALdouble)Ambi3DDecoder[k][i] * encgains[k][j]; + ambiup->Gains[i][j][HF_BAND] = (ALfloat)(gain * Ambi3DDecoderHFScale[i]); + ambiup->Gains[i][j][LF_BAND] = (ALfloat)gain; } } } else { - /* Assumes full 3D/periphonic on the input and output mixes! */ - ALfloat w_scale = (device->Dry.NumChannels > 9) ? W_SCALE3D_THIRD : - (device->Dry.NumChannels > 4) ? W_SCALE3D_SECOND : 1.0f; - ALfloat xyz_scale = (device->Dry.NumChannels > 9) ? XYZ_SCALE3D_THIRD : - (device->Dry.NumChannels > 4) ? XYZ_SCALE3D_SECOND : 1.0f; for(i = 0;i < 4;i++) { ALsizei index = GetChannelForACN(device->Dry, i); if(index != INVALID_UPSAMPLE_INDEX) { ALfloat scale = device->Dry.Ambi.Map[index].Scale; - ambiup->Gains[i][index][FB_HighFreq] = scale * ((i==0) ? w_scale : xyz_scale); - ambiup->Gains[i][index][FB_LowFreq] = scale; + ambiup->Gains[i][index][HF_BAND] = scale * ((i==0) ? w_scale : xyz_scale); + ambiup->Gains[i][index][LF_BAND] = scale; } } } @@ -599,14 +480,13 @@ void ambiup_process(struct AmbiUpsampler *ambiup, ALfloat (*restrict OutBuffer)[ for(i = 0;i < 4;i++) { bandsplit_process(&ambiup->XOver[i], - ambiup->Samples[FB_HighFreq], ambiup->Samples[FB_LowFreq], + ambiup->Samples[HF_BAND], ambiup->Samples[LF_BAND], InSamples[i], SamplesToDo ); for(j = 0;j < OutChannels;j++) - MixMatrixRow(OutBuffer[j], ambiup->Gains[i][j], - SAFE_CONST(ALfloatBUFFERSIZE*,ambiup->Samples), FB_Max, 0, - SamplesToDo + MixRowSamples(OutBuffer[j], ambiup->Gains[i][j], + ambiup->Samples, NUM_BANDS, 0, SamplesToDo ); } } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/bformatdec.h b/love/src/jni/openal-soft-1.19.1/Alc/bformatdec.h similarity index 52% rename from love/src/jni/openal-soft-1.18.2/Alc/bformatdec.h rename to love/src/jni/openal-soft-1.19.1/Alc/bformatdec.h index 8f44fc2a..2d7d1d62 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/bformatdec.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/bformatdec.h @@ -7,18 +7,26 @@ /* These are the necessary scales for first-order HF responses to play over * higher-order 2D (non-periphonic) decoders. */ -#define W_SCALE2D_SECOND 1.224744871f /* sqrt(1.5) */ -#define XYZ_SCALE2D_SECOND 1.0f -#define W_SCALE2D_THIRD 1.414213562f /* sqrt(2) */ -#define XYZ_SCALE2D_THIRD 1.082392196f +#define W_SCALE_2H0P 1.224744871f /* sqrt(1.5) */ +#define XYZ_SCALE_2H0P 1.0f +#define W_SCALE_3H0P 1.414213562f /* sqrt(2) */ +#define XYZ_SCALE_3H0P 1.082392196f /* These are the necessary scales for first-order HF responses to play over * higher-order 3D (periphonic) decoders. */ -#define W_SCALE3D_SECOND 1.341640787f /* sqrt(1.8) */ -#define XYZ_SCALE3D_SECOND 1.0f -#define W_SCALE3D_THIRD 1.695486018f -#define XYZ_SCALE3D_THIRD 1.136697713f +#define W_SCALE_2H2P 1.341640787f /* sqrt(1.8) */ +#define XYZ_SCALE_2H2P 1.0f +#define W_SCALE_3H3P 1.695486018f +#define XYZ_SCALE_3H3P 1.136697713f + + +/* NOTE: These are scale factors as applied to Ambisonics content. Decoder + * coefficients should be divided by these values to get proper N3D scalings. + */ +const ALfloat N3D2N3DScale[MAX_AMBI_COEFFS]; +const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS]; +const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS]; struct AmbDecConf; @@ -27,7 +35,7 @@ struct AmbiUpsampler; struct BFormatDec *bformatdec_alloc(); -void bformatdec_free(struct BFormatDec *dec); +void bformatdec_free(struct BFormatDec **dec); void bformatdec_reset(struct BFormatDec *dec, const struct AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei chanmap[MAX_OUTPUT_CHANNELS]); /* Decodes the ambisonic input to the given output channels. */ @@ -38,38 +46,12 @@ void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*restrict OutBuffer)[B /* Stand-alone first-order upsampler. Kept here because it shares some stuff - * with bformatdec. + * with bformatdec. Assumes a periphonic (4-channel) input mix! */ struct AmbiUpsampler *ambiup_alloc(); -void ambiup_free(struct AmbiUpsampler *ambiup); -void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device); +void ambiup_free(struct AmbiUpsampler **ambiup); +void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale); void ambiup_process(struct AmbiUpsampler *ambiup, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*restrict InSamples)[BUFFERSIZE], ALsizei SamplesToDo); - -/* Band splitter. Splits a signal into two phase-matching frequency bands. */ -typedef struct BandSplitter { - ALfloat coeff; - ALfloat lp_z1; - ALfloat lp_z2; - ALfloat hp_z1; -} BandSplitter; - -void bandsplit_init(BandSplitter *splitter, ALfloat freq_mult); -void bandsplit_clear(BandSplitter *splitter); -void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, - const ALfloat *input, ALsizei count); - -/* The all-pass portion of the band splitter. Applies the same phase shift - * without splitting the signal. - */ -typedef struct SplitterAllpass { - ALfloat coeff; - ALfloat z1; -} SplitterAllpass; - -void splitterap_init(SplitterAllpass *splitter, ALfloat freq_mult); -void splitterap_clear(SplitterAllpass *splitter); -void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count); - #endif /* BFORMATDEC_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/bs2b.c b/love/src/jni/openal-soft-1.19.1/Alc/bs2b.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/Alc/bs2b.c rename to love/src/jni/openal-soft-1.19.1/Alc/bs2b.c diff --git a/love/src/jni/openal-soft-1.18.2/Alc/compat.h b/love/src/jni/openal-soft-1.19.1/Alc/compat.h similarity index 77% rename from love/src/jni/openal-soft-1.18.2/Alc/compat.h rename to love/src/jni/openal-soft-1.19.1/Alc/compat.h index 247ed05b..495bfdf2 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/compat.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/compat.h @@ -3,6 +3,10 @@ #include "alstring.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -38,7 +42,7 @@ struct FileMapping { struct FileMapping MapFileToMem(const char *fname); void UnmapFileMem(const struct FileMapping *mapping); -al_string GetProcPath(void); +void GetProcBinary(al_string *path, al_string *fname); #ifdef HAVE_DYNLOAD void *LoadLib(const char *name); @@ -46,12 +50,8 @@ void CloseLib(void *handle); void *GetSymbol(void *handle, const char *name); #endif -#ifdef __ANDROID__ -#define JCALL(obj, func) ((*(obj))->func((obj), EXTRACT_VCALL_ARGS -#define JCALL0(obj, func) ((*(obj))->func((obj) EXTRACT_VCALL_ARGS - -/** Returns a JNIEnv*. */ -void *Android_GetJNIEnv(void); +#ifdef __cplusplus +} /* extern "C" */ #endif #endif /* AL_COMPAT_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/converter.c b/love/src/jni/openal-soft-1.19.1/Alc/converter.c similarity index 93% rename from love/src/jni/openal-soft-1.18.2/Alc/converter.c rename to love/src/jni/openal-soft-1.19.1/Alc/converter.c index 5cfe7031..ef2eb9af 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/converter.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/converter.c @@ -3,7 +3,8 @@ #include "converter.h" -#include "mixer_defs.h" +#include "fpu_modes.h" +#include "mixer/defs.h" SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType dstType, ALsizei numchans, ALsizei srcRate, ALsizei dstRate) @@ -26,15 +27,16 @@ SampleConverter *CreateSampleConverter(enum DevFmtType srcType, enum DevFmtType /* Have to set the mixer FPU mode since that's what the resampler code expects. */ START_MIXER_MODE(); - step = fastf2i(minf((ALdouble)srcRate / dstRate, MAX_PITCH)*FRACTIONONE + 0.5f); + step = (ALsizei)mind(((ALdouble)srcRate/dstRate*FRACTIONONE) + 0.5, + MAX_PITCH * FRACTIONONE); converter->mIncrement = maxi(step, 1); if(converter->mIncrement == FRACTIONONE) - converter->mResample = Resample_copy32_C; + converter->mResample = Resample_copy_C; else { /* TODO: Allow other resamplers. */ - BsincPrepare(converter->mIncrement, &converter->mState.bsinc); - converter->mResample = SelectResampler(BSincResampler); + BsincPrepare(converter->mIncrement, &converter->mState.bsinc, &bsinc12); + converter->mResample = SelectResampler(BSinc12Resampler); } END_MIXER_MODE(); @@ -205,8 +207,8 @@ ALsizei SampleConverterAvailableOut(SampleConverter *converter, ALsizei srcframe return 0; } - if(prepcount < MAX_POST_SAMPLES+MAX_PRE_SAMPLES && - MAX_POST_SAMPLES+MAX_PRE_SAMPLES-prepcount >= srcframes) + if(prepcount < MAX_RESAMPLE_PADDING*2 && + MAX_RESAMPLE_PADDING*2 - prepcount >= srcframes) { /* Not enough input samples to generate an output sample. */ return 0; @@ -214,7 +216,7 @@ ALsizei SampleConverterAvailableOut(SampleConverter *converter, ALsizei srcframe DataSize64 = prepcount; DataSize64 += srcframes; - DataSize64 -= MAX_POST_SAMPLES+MAX_PRE_SAMPLES; + DataSize64 -= MAX_RESAMPLE_PADDING*2; DataSize64 <<= FRACTIONBITS; DataSize64 -= DataPosFrac; @@ -256,10 +258,10 @@ ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALs converter->mSrcPrepCount = 0; continue; } - toread = mini(*srcframes, BUFFERSIZE-(MAX_POST_SAMPLES+MAX_PRE_SAMPLES)); + toread = mini(*srcframes, BUFFERSIZE - MAX_RESAMPLE_PADDING*2); - if(prepcount < MAX_POST_SAMPLES+MAX_PRE_SAMPLES && - MAX_POST_SAMPLES+MAX_PRE_SAMPLES-prepcount >= toread) + if(prepcount < MAX_RESAMPLE_PADDING*2 && + MAX_RESAMPLE_PADDING*2 - prepcount >= toread) { /* Not enough input samples to generate an output sample. Store * what we're given for later. @@ -277,7 +279,7 @@ ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALs DataSize64 = prepcount; DataSize64 += toread; - DataSize64 -= MAX_POST_SAMPLES+MAX_PRE_SAMPLES; + DataSize64 -= MAX_RESAMPLE_PADDING*2; DataSize64 <<= FRACTIONBITS; DataSize64 -= DataPosFrac; @@ -310,7 +312,7 @@ ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALs sizeof(converter->Chan[chan].mPrevSamples)); else { - size_t len = mini(MAX_PRE_SAMPLES+MAX_POST_SAMPLES, prepcount+toread-SrcDataEnd); + size_t len = mini(MAX_RESAMPLE_PADDING*2, prepcount+toread-SrcDataEnd); memcpy(converter->Chan[chan].mPrevSamples, &SrcData[SrcDataEnd], len*sizeof(ALfloat)); memset(converter->Chan[chan].mPrevSamples+len, 0, @@ -319,7 +321,7 @@ ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALs /* Now resample, and store the result in the output buffer. */ ResampledData = converter->mResample(&converter->mState, - SrcData+MAX_PRE_SAMPLES, DataPosFrac, increment, + SrcData+MAX_RESAMPLE_PADDING, DataPosFrac, increment, DstData, DstSize ); @@ -331,8 +333,8 @@ ALsizei SampleConverterInput(SampleConverter *converter, const ALvoid **src, ALs * fractional offset. */ DataPosFrac += increment*DstSize; - converter->mSrcPrepCount = mini(MAX_PRE_SAMPLES+MAX_POST_SAMPLES, - prepcount+toread-(DataPosFrac>>FRACTIONBITS)); + converter->mSrcPrepCount = mini(prepcount + toread - (DataPosFrac>>FRACTIONBITS), + MAX_RESAMPLE_PADDING*2); converter->mFracOffset = DataPosFrac & FRACTIONMASK; /* Update the src and dst pointers in case there's still more to do. */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/converter.h b/love/src/jni/openal-soft-1.19.1/Alc/converter.h similarity index 95% rename from love/src/jni/openal-soft-1.18.2/Alc/converter.h rename to love/src/jni/openal-soft-1.19.1/Alc/converter.h index 9934fa4b..b58fd831 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/converter.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/converter.h @@ -26,7 +26,7 @@ typedef struct SampleConverter { alignas(16) ALfloat mDstSamples[BUFFERSIZE]; struct { - alignas(16) ALfloat mPrevSamples[MAX_PRE_SAMPLES+MAX_POST_SAMPLES]; + alignas(16) ALfloat mPrevSamples[MAX_RESAMPLE_PADDING*2]; } Chan[]; } SampleConverter; diff --git a/love/src/jni/openal-soft-1.19.1/Alc/cpu_caps.h b/love/src/jni/openal-soft-1.19.1/Alc/cpu_caps.h new file mode 100644 index 00000000..328d470e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/cpu_caps.h @@ -0,0 +1,15 @@ +#ifndef CPU_CAPS_H +#define CPU_CAPS_H + +extern int CPUCapFlags; +enum { + CPU_CAP_SSE = 1<<0, + CPU_CAP_SSE2 = 1<<1, + CPU_CAP_SSE3 = 1<<2, + CPU_CAP_SSE4_1 = 1<<3, + CPU_CAP_NEON = 1<<4, +}; + +void FillCPUCaps(int capfilter); + +#endif /* CPU_CAPS_H */ diff --git a/love/src/jni/openal-soft-1.19.1/Alc/effects/autowah.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/autowah.c new file mode 100644 index 00000000..ba1180ef --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/autowah.c @@ -0,0 +1,321 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alMain.h" +#include "alAuxEffectSlot.h" +#include "alError.h" +#include "alu.h" +#include "filters/defs.h" + +#define MIN_FREQ 20.0f +#define MAX_FREQ 2500.0f +#define Q_FACTOR 5.0f + +typedef struct ALautowahState { + DERIVE_FROM_TYPE(ALeffectState); + + /* Effect parameters */ + ALfloat AttackRate; + ALfloat ReleaseRate; + ALfloat ResonanceGain; + ALfloat PeakGain; + ALfloat FreqMinNorm; + ALfloat BandwidthNorm; + ALfloat env_delay; + + /* Filter components derived from the envelope. */ + struct { + ALfloat cos_w0; + ALfloat alpha; + } Env[BUFFERSIZE]; + + struct { + /* Effect filters' history. */ + struct { + ALfloat z1, z2; + } Filter; + + /* Effect gains for each output channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; + } Chans[MAX_EFFECT_CHANNELS]; + + /* Effects buffers */ + alignas(16) ALfloat BufferOut[BUFFERSIZE]; +} ALautowahState; + +static ALvoid ALautowahState_Destruct(ALautowahState *state); +static ALboolean ALautowahState_deviceUpdate(ALautowahState *state, ALCdevice *device); +static ALvoid ALautowahState_update(ALautowahState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALautowahState_process(ALautowahState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); +DECLARE_DEFAULT_ALLOCATORS(ALautowahState) + +DEFINE_ALEFFECTSTATE_VTABLE(ALautowahState); + +static void ALautowahState_Construct(ALautowahState *state) +{ + ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); + SET_VTABLE2(ALautowahState, ALeffectState, state); +} + +static ALvoid ALautowahState_Destruct(ALautowahState *state) +{ + ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); +} + +static ALboolean ALautowahState_deviceUpdate(ALautowahState *state, ALCdevice *UNUSED(device)) +{ + /* (Re-)initializing parameters and clear the buffers. */ + ALsizei i, j; + + state->AttackRate = 1.0f; + state->ReleaseRate = 1.0f; + state->ResonanceGain = 10.0f; + state->PeakGain = 4.5f; + state->FreqMinNorm = 4.5e-4f; + state->BandwidthNorm = 0.05f; + state->env_delay = 0.0f; + + memset(state->Env, 0, sizeof(state->Env)); + + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + { + for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) + state->Chans[i].CurrentGains[j] = 0.0f; + state->Chans[i].Filter.z1 = 0.0f; + state->Chans[i].Filter.z2 = 0.0f; + } + + return AL_TRUE; +} + +static ALvoid ALautowahState_update(ALautowahState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) +{ + const ALCdevice *device = context->Device; + ALfloat ReleaseTime; + ALsizei i; + + ReleaseTime = clampf(props->Autowah.ReleaseTime, 0.001f, 1.0f); + + state->AttackRate = expf(-1.0f / (props->Autowah.AttackTime*device->Frequency)); + state->ReleaseRate = expf(-1.0f / (ReleaseTime*device->Frequency)); + /* 0-20dB Resonance Peak gain */ + state->ResonanceGain = sqrtf(log10f(props->Autowah.Resonance)*10.0f / 3.0f); + state->PeakGain = 1.0f - log10f(props->Autowah.PeakGain/AL_AUTOWAH_MAX_PEAK_GAIN); + state->FreqMinNorm = MIN_FREQ / device->Frequency; + state->BandwidthNorm = (MAX_FREQ-MIN_FREQ) / device->Frequency; + + STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; + STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + ComputePanGains(&device->FOAOut, IdentityMatrixf.m[i], slot->Params.Gain, + state->Chans[i].TargetGains); +} + +static ALvoid ALautowahState_process(ALautowahState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) +{ + const ALfloat attack_rate = state->AttackRate; + const ALfloat release_rate = state->ReleaseRate; + const ALfloat res_gain = state->ResonanceGain; + const ALfloat peak_gain = state->PeakGain; + const ALfloat freq_min = state->FreqMinNorm; + const ALfloat bandwidth = state->BandwidthNorm; + ALfloat env_delay; + ALsizei c, i; + + env_delay = state->env_delay; + for(i = 0;i < SamplesToDo;i++) + { + ALfloat w0, sample, a; + + /* Envelope follower described on the book: Audio Effects, Theory, + * Implementation and Application. + */ + sample = peak_gain * fabsf(SamplesIn[0][i]); + a = (sample > env_delay) ? attack_rate : release_rate; + env_delay = lerp(sample, env_delay, a); + + /* Calculate the cos and alpha components for this sample's filter. */ + w0 = minf((bandwidth*env_delay + freq_min), 0.46f) * F_TAU; + state->Env[i].cos_w0 = cosf(w0); + state->Env[i].alpha = sinf(w0)/(2.0f * Q_FACTOR); + } + state->env_delay = env_delay; + + for(c = 0;c < MAX_EFFECT_CHANNELS; c++) + { + /* This effectively inlines BiquadFilter_setParams for a peaking + * filter and BiquadFilter_processC. The alpha and cosine components + * for the filter coefficients were previously calculated with the + * envelope. Because the filter changes for each sample, the + * coefficients are transient and don't need to be held. + */ + ALfloat z1 = state->Chans[c].Filter.z1; + ALfloat z2 = state->Chans[c].Filter.z2; + + for(i = 0;i < SamplesToDo;i++) + { + const ALfloat alpha = state->Env[i].alpha; + const ALfloat cos_w0 = state->Env[i].cos_w0; + ALfloat input, output; + ALfloat a[3], b[3]; + + b[0] = 1.0f + alpha*res_gain; + b[1] = -2.0f * cos_w0; + b[2] = 1.0f - alpha*res_gain; + a[0] = 1.0f + alpha/res_gain; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha/res_gain; + + input = SamplesIn[c][i]; + output = input*(b[0]/a[0]) + z1; + z1 = input*(b[1]/a[0]) - output*(a[1]/a[0]) + z2; + z2 = input*(b[2]/a[0]) - output*(a[2]/a[0]); + state->BufferOut[i] = output; + } + state->Chans[c].Filter.z1 = z1; + state->Chans[c].Filter.z2 = z2; + + /* Now, mix the processed sound data to the output. */ + MixSamples(state->BufferOut, NumChannels, SamplesOut, state->Chans[c].CurrentGains, + state->Chans[c].TargetGains, SamplesToDo, 0, SamplesToDo); + } +} + +typedef struct AutowahStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} AutowahStateFactory; + +static ALeffectState *AutowahStateFactory_create(AutowahStateFactory *UNUSED(factory)) +{ + ALautowahState *state; + + NEW_OBJ0(state, ALautowahState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(AutowahStateFactory); + +EffectStateFactory *AutowahStateFactory_getFactory(void) +{ + static AutowahStateFactory AutowahFactory = { { GET_VTABLE2(AutowahStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &AutowahFactory); +} + +void ALautowah_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_AUTOWAH_ATTACK_TIME: + if(!(val >= AL_AUTOWAH_MIN_ATTACK_TIME && val <= AL_AUTOWAH_MAX_ATTACK_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah attack time out of range"); + props->Autowah.AttackTime = val; + break; + + case AL_AUTOWAH_RELEASE_TIME: + if(!(val >= AL_AUTOWAH_MIN_RELEASE_TIME && val <= AL_AUTOWAH_MAX_RELEASE_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah release time out of range"); + props->Autowah.ReleaseTime = val; + break; + + case AL_AUTOWAH_RESONANCE: + if(!(val >= AL_AUTOWAH_MIN_RESONANCE && val <= AL_AUTOWAH_MAX_RESONANCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah resonance out of range"); + props->Autowah.Resonance = val; + break; + + case AL_AUTOWAH_PEAK_GAIN: + if(!(val >= AL_AUTOWAH_MIN_PEAK_GAIN && val <= AL_AUTOWAH_MAX_PEAK_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Autowah peak gain out of range"); + props->Autowah.PeakGain = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); + } +} + +void ALautowah_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ + ALautowah_setParamf(effect, context, param, vals[0]); +} + +void ALautowah_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); +} + +void ALautowah_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); +} + +void ALautowah_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer property 0x%04x", param); +} +void ALautowah_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid autowah integer vector property 0x%04x", param); +} + +void ALautowah_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_AUTOWAH_ATTACK_TIME: + *val = props->Autowah.AttackTime; + break; + + case AL_AUTOWAH_RELEASE_TIME: + *val = props->Autowah.ReleaseTime; + break; + + case AL_AUTOWAH_RESONANCE: + *val = props->Autowah.Resonance; + break; + + case AL_AUTOWAH_PEAK_GAIN: + *val = props->Autowah.PeakGain; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid autowah float property 0x%04x", param); + } + +} + +void ALautowah_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ + ALautowah_getParamf(effect, context, param, vals); +} + +DEFINE_ALEFFECT_VTABLE(ALautowah); diff --git a/love/src/jni/openal-soft-1.19.1/Alc/effects/chorus.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/chorus.c new file mode 100644 index 00000000..f2861cf5 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/chorus.c @@ -0,0 +1,555 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2013 by Mike Gorchak + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alMain.h" +#include "alAuxEffectSlot.h" +#include "alError.h" +#include "alu.h" +#include "filters/defs.h" + + +static_assert(AL_CHORUS_WAVEFORM_SINUSOID == AL_FLANGER_WAVEFORM_SINUSOID, "Chorus/Flanger waveform value mismatch"); +static_assert(AL_CHORUS_WAVEFORM_TRIANGLE == AL_FLANGER_WAVEFORM_TRIANGLE, "Chorus/Flanger waveform value mismatch"); + +enum WaveForm { + WF_Sinusoid, + WF_Triangle +}; + +typedef struct ALchorusState { + DERIVE_FROM_TYPE(ALeffectState); + + ALfloat *SampleBuffer; + ALsizei BufferLength; + ALsizei offset; + + ALsizei lfo_offset; + ALsizei lfo_range; + ALfloat lfo_scale; + ALint lfo_disp; + + /* Gains for left and right sides */ + struct { + ALfloat Current[MAX_OUTPUT_CHANNELS]; + ALfloat Target[MAX_OUTPUT_CHANNELS]; + } Gains[2]; + + /* effect parameters */ + enum WaveForm waveform; + ALint delay; + ALfloat depth; + ALfloat feedback; +} ALchorusState; + +static ALvoid ALchorusState_Destruct(ALchorusState *state); +static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device); +static ALvoid ALchorusState_update(ALchorusState *state, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); +DECLARE_DEFAULT_ALLOCATORS(ALchorusState) + +DEFINE_ALEFFECTSTATE_VTABLE(ALchorusState); + + +static void ALchorusState_Construct(ALchorusState *state) +{ + ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); + SET_VTABLE2(ALchorusState, ALeffectState, state); + + state->BufferLength = 0; + state->SampleBuffer = NULL; + state->offset = 0; + state->lfo_offset = 0; + state->lfo_range = 1; + state->waveform = WF_Triangle; +} + +static ALvoid ALchorusState_Destruct(ALchorusState *state) +{ + al_free(state->SampleBuffer); + state->SampleBuffer = NULL; + + ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); +} + +static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device) +{ + const ALfloat max_delay = maxf(AL_CHORUS_MAX_DELAY, AL_FLANGER_MAX_DELAY); + ALsizei maxlen; + + maxlen = NextPowerOf2(float2int(max_delay*2.0f*Device->Frequency) + 1u); + if(maxlen <= 0) return AL_FALSE; + + if(maxlen != state->BufferLength) + { + void *temp = al_calloc(16, maxlen * sizeof(ALfloat)); + if(!temp) return AL_FALSE; + + al_free(state->SampleBuffer); + state->SampleBuffer = temp; + + state->BufferLength = maxlen; + } + + memset(state->SampleBuffer, 0, state->BufferLength*sizeof(ALfloat)); + memset(state->Gains, 0, sizeof(state->Gains)); + + return AL_TRUE; +} + +static ALvoid ALchorusState_update(ALchorusState *state, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props) +{ + const ALsizei mindelay = MAX_RESAMPLE_PADDING << FRACTIONBITS; + const ALCdevice *device = Context->Device; + ALfloat frequency = (ALfloat)device->Frequency; + ALfloat coeffs[MAX_AMBI_COEFFS]; + ALfloat rate; + ALint phase; + + switch(props->Chorus.Waveform) + { + case AL_CHORUS_WAVEFORM_TRIANGLE: + state->waveform = WF_Triangle; + break; + case AL_CHORUS_WAVEFORM_SINUSOID: + state->waveform = WF_Sinusoid; + break; + } + + /* The LFO depth is scaled to be relative to the sample delay. Clamp the + * delay and depth to allow enough padding for resampling. + */ + state->delay = maxi(float2int(props->Chorus.Delay*frequency*FRACTIONONE + 0.5f), + mindelay); + state->depth = minf(props->Chorus.Depth * state->delay, + (ALfloat)(state->delay - mindelay)); + + state->feedback = props->Chorus.Feedback; + + /* Gains for left and right sides */ + CalcAngleCoeffs(-F_PI_2, 0.0f, 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, Slot->Params.Gain, state->Gains[0].Target); + CalcAngleCoeffs( F_PI_2, 0.0f, 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, Slot->Params.Gain, state->Gains[1].Target); + + phase = props->Chorus.Phase; + rate = props->Chorus.Rate; + if(!(rate > 0.0f)) + { + state->lfo_offset = 0; + state->lfo_range = 1; + state->lfo_scale = 0.0f; + state->lfo_disp = 0; + } + else + { + /* Calculate LFO coefficient (number of samples per cycle). Limit the + * max range to avoid overflow when calculating the displacement. + */ + ALsizei lfo_range = float2int(minf(frequency/rate + 0.5f, (ALfloat)(INT_MAX/360 - 180))); + + state->lfo_offset = float2int((ALfloat)state->lfo_offset/state->lfo_range* + lfo_range + 0.5f) % lfo_range; + state->lfo_range = lfo_range; + switch(state->waveform) + { + case WF_Triangle: + state->lfo_scale = 4.0f / state->lfo_range; + break; + case WF_Sinusoid: + state->lfo_scale = F_TAU / state->lfo_range; + break; + } + + /* Calculate lfo phase displacement */ + if(phase < 0) phase = 360 + phase; + state->lfo_disp = (state->lfo_range*phase + 180) / 360; + } +} + +static void GetTriangleDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, + const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, + const ALsizei todo) +{ + ALsizei i; + for(i = 0;i < todo;i++) + { + delays[i] = fastf2i((1.0f - fabsf(2.0f - lfo_scale*offset)) * depth) + delay; + offset = (offset+1)%lfo_range; + } +} + +static void GetSinusoidDelays(ALint *restrict delays, ALsizei offset, const ALsizei lfo_range, + const ALfloat lfo_scale, const ALfloat depth, const ALsizei delay, + const ALsizei todo) +{ + ALsizei i; + for(i = 0;i < todo;i++) + { + delays[i] = fastf2i(sinf(lfo_scale*offset) * depth) + delay; + offset = (offset+1)%lfo_range; + } +} + + +static ALvoid ALchorusState_process(ALchorusState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) +{ + const ALsizei bufmask = state->BufferLength-1; + const ALfloat feedback = state->feedback; + const ALsizei avgdelay = (state->delay + (FRACTIONONE>>1)) >> FRACTIONBITS; + ALfloat *restrict delaybuf = state->SampleBuffer; + ALsizei offset = state->offset; + ALsizei i, c; + ALsizei base; + + for(base = 0;base < SamplesToDo;) + { + const ALsizei todo = mini(256, SamplesToDo-base); + ALint moddelays[2][256]; + alignas(16) ALfloat temps[2][256]; + + if(state->waveform == WF_Sinusoid) + { + GetSinusoidDelays(moddelays[0], state->lfo_offset, state->lfo_range, state->lfo_scale, + state->depth, state->delay, todo); + GetSinusoidDelays(moddelays[1], (state->lfo_offset+state->lfo_disp)%state->lfo_range, + state->lfo_range, state->lfo_scale, state->depth, state->delay, + todo); + } + else /*if(state->waveform == WF_Triangle)*/ + { + GetTriangleDelays(moddelays[0], state->lfo_offset, state->lfo_range, state->lfo_scale, + state->depth, state->delay, todo); + GetTriangleDelays(moddelays[1], (state->lfo_offset+state->lfo_disp)%state->lfo_range, + state->lfo_range, state->lfo_scale, state->depth, state->delay, + todo); + } + state->lfo_offset = (state->lfo_offset+todo) % state->lfo_range; + + for(i = 0;i < todo;i++) + { + ALint delay; + ALfloat mu; + + // Feed the buffer's input first (necessary for delays < 1). + delaybuf[offset&bufmask] = SamplesIn[0][base+i]; + + // Tap for the left output. + delay = offset - (moddelays[0][i]>>FRACTIONBITS); + mu = (moddelays[0][i]&FRACTIONMASK) * (1.0f/FRACTIONONE); + temps[0][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], + delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], + mu); + + // Tap for the right output. + delay = offset - (moddelays[1][i]>>FRACTIONBITS); + mu = (moddelays[1][i]&FRACTIONMASK) * (1.0f/FRACTIONONE); + temps[1][i] = cubic(delaybuf[(delay+1) & bufmask], delaybuf[(delay ) & bufmask], + delaybuf[(delay-1) & bufmask], delaybuf[(delay-2) & bufmask], + mu); + + // Accumulate feedback from the average delay of the taps. + delaybuf[offset&bufmask] += delaybuf[(offset-avgdelay) & bufmask] * feedback; + offset++; + } + + for(c = 0;c < 2;c++) + MixSamples(temps[c], NumChannels, SamplesOut, state->Gains[c].Current, + state->Gains[c].Target, SamplesToDo-base, base, todo); + + base += todo; + } + + state->offset = offset; +} + + +typedef struct ChorusStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} ChorusStateFactory; + +static ALeffectState *ChorusStateFactory_create(ChorusStateFactory *UNUSED(factory)) +{ + ALchorusState *state; + + NEW_OBJ0(state, ALchorusState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(ChorusStateFactory); + + +EffectStateFactory *ChorusStateFactory_getFactory(void) +{ + static ChorusStateFactory ChorusFactory = { { GET_VTABLE2(ChorusStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &ChorusFactory); +} + + +void ALchorus_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_CHORUS_WAVEFORM: + if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid chorus waveform"); + props->Chorus.Waveform = val; + break; + + case AL_CHORUS_PHASE: + if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus phase out of range"); + props->Chorus.Phase = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); + } +} +void ALchorus_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ ALchorus_setParami(effect, context, param, vals[0]); } +void ALchorus_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_CHORUS_RATE: + if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus rate out of range"); + props->Chorus.Rate = val; + break; + + case AL_CHORUS_DEPTH: + if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus depth out of range"); + props->Chorus.Depth = val; + break; + + case AL_CHORUS_FEEDBACK: + if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus feedback out of range"); + props->Chorus.Feedback = val; + break; + + case AL_CHORUS_DELAY: + if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Chorus delay out of range"); + props->Chorus.Delay = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); + } +} +void ALchorus_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALchorus_setParamf(effect, context, param, vals[0]); } + +void ALchorus_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_CHORUS_WAVEFORM: + *val = props->Chorus.Waveform; + break; + + case AL_CHORUS_PHASE: + *val = props->Chorus.Phase; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid chorus integer property 0x%04x", param); + } +} +void ALchorus_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ ALchorus_getParami(effect, context, param, vals); } +void ALchorus_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_CHORUS_RATE: + *val = props->Chorus.Rate; + break; + + case AL_CHORUS_DEPTH: + *val = props->Chorus.Depth; + break; + + case AL_CHORUS_FEEDBACK: + *val = props->Chorus.Feedback; + break; + + case AL_CHORUS_DELAY: + *val = props->Chorus.Delay; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid chorus float property 0x%04x", param); + } +} +void ALchorus_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALchorus_getParamf(effect, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(ALchorus); + + +/* Flanger is basically a chorus with a really short delay. They can both use + * the same processing functions, so piggyback flanger on the chorus functions. + */ +typedef struct FlangerStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} FlangerStateFactory; + +ALeffectState *FlangerStateFactory_create(FlangerStateFactory *UNUSED(factory)) +{ + ALchorusState *state; + + NEW_OBJ0(state, ALchorusState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(FlangerStateFactory); + +EffectStateFactory *FlangerStateFactory_getFactory(void) +{ + static FlangerStateFactory FlangerFactory = { { GET_VTABLE2(FlangerStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &FlangerFactory); +} + + +void ALflanger_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FLANGER_WAVEFORM: + if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid flanger waveform"); + props->Chorus.Waveform = val; + break; + + case AL_FLANGER_PHASE: + if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger phase out of range"); + props->Chorus.Phase = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); + } +} +void ALflanger_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ ALflanger_setParami(effect, context, param, vals[0]); } +void ALflanger_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FLANGER_RATE: + if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger rate out of range"); + props->Chorus.Rate = val; + break; + + case AL_FLANGER_DEPTH: + if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger depth out of range"); + props->Chorus.Depth = val; + break; + + case AL_FLANGER_FEEDBACK: + if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger feedback out of range"); + props->Chorus.Feedback = val; + break; + + case AL_FLANGER_DELAY: + if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Flanger delay out of range"); + props->Chorus.Delay = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); + } +} +void ALflanger_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALflanger_setParamf(effect, context, param, vals[0]); } + +void ALflanger_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FLANGER_WAVEFORM: + *val = props->Chorus.Waveform; + break; + + case AL_FLANGER_PHASE: + *val = props->Chorus.Phase; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid flanger integer property 0x%04x", param); + } +} +void ALflanger_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ ALflanger_getParami(effect, context, param, vals); } +void ALflanger_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FLANGER_RATE: + *val = props->Chorus.Rate; + break; + + case AL_FLANGER_DEPTH: + *val = props->Chorus.Depth; + break; + + case AL_FLANGER_FEEDBACK: + *val = props->Chorus.Feedback; + break; + + case AL_FLANGER_DELAY: + *val = props->Chorus.Delay; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid flanger float property 0x%04x", param); + } +} +void ALflanger_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALflanger_getParamf(effect, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(ALflanger); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/compressor.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/compressor.c similarity index 50% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/compressor.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/compressor.c index 25c7a3dc..2b4a76b0 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/compressor.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/compressor.c @@ -27,6 +27,13 @@ #include "alu.h" +#define AMP_ENVELOPE_MIN 0.5f +#define AMP_ENVELOPE_MAX 2.0f + +#define ATTACK_TIME 0.1f /* 100ms to rise from min to max */ +#define RELEASE_TIME 0.2f /* 200ms to drop from max to min */ + + typedef struct ALcompressorState { DERIVE_FROM_TYPE(ALeffectState); @@ -35,14 +42,14 @@ typedef struct ALcompressorState { /* Effect parameters */ ALboolean Enabled; - ALfloat AttackRate; - ALfloat ReleaseRate; - ALfloat GainCtrl; + ALfloat AttackMult; + ALfloat ReleaseMult; + ALfloat EnvFollower; } ALcompressorState; static ALvoid ALcompressorState_Destruct(ALcompressorState *state); static ALboolean ALcompressorState_deviceUpdate(ALcompressorState *state, ALCdevice *device); -static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCdevice *device, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALcompressorState) @@ -55,9 +62,9 @@ static void ALcompressorState_Construct(ALcompressorState *state) SET_VTABLE2(ALcompressorState, ALeffectState, state); state->Enabled = AL_TRUE; - state->AttackRate = 0.0f; - state->ReleaseRate = 0.0f; - state->GainCtrl = 1.0f; + state->AttackMult = 1.0f; + state->ReleaseMult = 1.0f; + state->EnvFollower = 1.0f; } static ALvoid ALcompressorState_Destruct(ALcompressorState *state) @@ -67,17 +74,24 @@ static ALvoid ALcompressorState_Destruct(ALcompressorState *state) static ALboolean ALcompressorState_deviceUpdate(ALcompressorState *state, ALCdevice *device) { - const ALfloat attackTime = device->Frequency * 0.2f; /* 200ms Attack */ - const ALfloat releaseTime = device->Frequency * 0.4f; /* 400ms Release */ + /* Number of samples to do a full attack and release (non-integer sample + * counts are okay). + */ + const ALfloat attackCount = (ALfloat)device->Frequency * ATTACK_TIME; + const ALfloat releaseCount = (ALfloat)device->Frequency * RELEASE_TIME; - state->AttackRate = 1.0f / attackTime; - state->ReleaseRate = 1.0f / releaseTime; + /* Calculate per-sample multipliers to attack and release at the desired + * rates. + */ + state->AttackMult = powf(AMP_ENVELOPE_MAX/AMP_ENVELOPE_MIN, 1.0f/attackCount); + state->ReleaseMult = powf(AMP_ENVELOPE_MIN/AMP_ENVELOPE_MAX, 1.0f/releaseCount); return AL_TRUE; } -static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCdevice *device, const ALeffectslot *slot, const ALeffectProps *props) +static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { + const ALCdevice *device = context->Device; ALuint i; state->Enabled = props->Compressor.OnOff; @@ -85,8 +99,7 @@ static ALvoid ALcompressorState_update(ALcompressorState *state, const ALCdevice STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; for(i = 0;i < 4;i++) - ComputeFirstOrderGains(device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Gain[i]); + ComputePanGains(&device->FOAOut, IdentityMatrixf.m[i], slot->Params.Gain, state->Gain[i]); } static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) @@ -96,71 +109,52 @@ static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei Sample for(base = 0;base < SamplesToDo;) { - ALfloat temps[64][4]; - ALsizei td = mini(64, SamplesToDo-base); - - /* Load samples into the temp buffer first. */ - for(j = 0;j < 4;j++) - { - for(i = 0;i < td;i++) - temps[i][j] = SamplesIn[j][i+base]; - } + ALfloat gains[256]; + ALsizei td = mini(256, SamplesToDo-base); + ALfloat env = state->EnvFollower; + /* Generate the per-sample gains from the signal envelope. */ if(state->Enabled) { - ALfloat gain = state->GainCtrl; - ALfloat output, amplitude; - - for(i = 0;i < td;i++) + for(i = 0;i < td;++i) { - /* Roughly calculate the maximum amplitude from the 4-channel - * signal, and attack or release the gain control to reach it. + /* Clamp the absolute amplitude to the defined envelope limits, + * then attack or release the envelope to reach it. */ - amplitude = fabsf(temps[i][0]); - amplitude = maxf(amplitude + fabsf(temps[i][1]), - maxf(amplitude + fabsf(temps[i][2]), - amplitude + fabsf(temps[i][3]))); - if(amplitude > gain) - gain = minf(gain+state->AttackRate, amplitude); - else if(amplitude < gain) - gain = maxf(gain-state->ReleaseRate, amplitude); + ALfloat amplitude = clampf(fabsf(SamplesIn[0][base+i]), + AMP_ENVELOPE_MIN, AMP_ENVELOPE_MAX); + if(amplitude > env) + env = minf(env*state->AttackMult, amplitude); + else if(amplitude < env) + env = maxf(env*state->ReleaseMult, amplitude); - /* Apply the inverse of the gain control to normalize/compress - * the volume. */ - output = 1.0f / clampf(gain, 0.5f, 2.0f); - for(j = 0;j < 4;j++) - temps[i][j] *= output; + /* Apply the reciprocal of the envelope to normalize the volume + * (compress the dynamic range). + */ + gains[i] = 1.0f / env; } - - state->GainCtrl = gain; } else { - ALfloat gain = state->GainCtrl; - ALfloat output, amplitude; - - for(i = 0;i < td;i++) + /* Same as above, except the amplitude is forced to 1. This helps + * ensure smooth gain changes when the compressor is turned on and + * off. + */ + for(i = 0;i < td;++i) { - /* Same as above, except the amplitude is forced to 1. This - * helps ensure smooth gain changes when the compressor is - * turned on and off. - */ - amplitude = 1.0f; - if(amplitude > gain) - gain = minf(gain+state->AttackRate, amplitude); - else if(amplitude < gain) - gain = maxf(gain-state->ReleaseRate, amplitude); + ALfloat amplitude = 1.0f; + if(amplitude > env) + env = minf(env*state->AttackMult, amplitude); + else if(amplitude < env) + env = maxf(env*state->ReleaseMult, amplitude); - output = 1.0f / clampf(gain, 0.5f, 2.0f); - for(j = 0;j < 4;j++) - temps[i][j] *= output; + gains[i] = 1.0f / env; } - - state->GainCtrl = gain; } + state->EnvFollower = env; - /* Now mix to the output. */ - for(j = 0;j < 4;j++) + /* Now compress the signal amplitude to output. */ + for(j = 0;j < MAX_EFFECT_CHANNELS;j++) { for(k = 0;k < NumChannels;k++) { @@ -169,7 +163,7 @@ static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei Sample continue; for(i = 0;i < td;i++) - SamplesOut[k][base+i] += gain * temps[i][j]; + SamplesOut[k][base+i] += SamplesIn[j][base+i] * gains[i] * gain; } } @@ -178,11 +172,11 @@ static ALvoid ALcompressorState_process(ALcompressorState *state, ALsizei Sample } -typedef struct ALcompressorStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALcompressorStateFactory; +typedef struct CompressorStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} CompressorStateFactory; -static ALeffectState *ALcompressorStateFactory_create(ALcompressorStateFactory *UNUSED(factory)) +static ALeffectState *CompressorStateFactory_create(CompressorStateFactory *UNUSED(factory)) { ALcompressorState *state; @@ -192,13 +186,13 @@ static ALeffectState *ALcompressorStateFactory_create(ALcompressorStateFactory * return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALcompressorStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(CompressorStateFactory); -ALeffectStateFactory *ALcompressorStateFactory_getFactory(void) +EffectStateFactory *CompressorStateFactory_getFactory(void) { - static ALcompressorStateFactory CompressorFactory = { { GET_VTABLE2(ALcompressorStateFactory, ALeffectStateFactory) } }; + static CompressorStateFactory CompressorFactory = { { GET_VTABLE2(CompressorStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &CompressorFactory); + return STATIC_CAST(EffectStateFactory, &CompressorFactory); } @@ -209,24 +203,21 @@ void ALcompressor_setParami(ALeffect *effect, ALCcontext *context, ALenum param, { case AL_COMPRESSOR_ONOFF: if(!(val >= AL_COMPRESSOR_MIN_ONOFF && val <= AL_COMPRESSOR_MAX_ONOFF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Compressor state out of range"); props->Compressor.OnOff = val; break; - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", + param); } } void ALcompressor_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALcompressor_setParami(effect, context, param, vals[0]); -} -void ALcompressor_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALfloat UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALcompressor_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALcompressor_setParamf(effect, context, param, vals[0]); -} +{ ALcompressor_setParami(effect, context, param, vals[0]); } +void ALcompressor_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } +void ALcompressor_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } void ALcompressor_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) { @@ -236,19 +227,17 @@ void ALcompressor_getParami(const ALeffect *effect, ALCcontext *context, ALenum case AL_COMPRESSOR_ONOFF: *val = props->Compressor.OnOff; break; + default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid compressor integer property 0x%04x", + param); } } void ALcompressor_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALcompressor_getParami(effect, context, param, vals); -} -void ALcompressor_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALfloat *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALcompressor_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALcompressor_getParamf(effect, context, param, vals); -} +{ ALcompressor_getParami(effect, context, param, vals); } +void ALcompressor_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float property 0x%04x", param); } +void ALcompressor_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid compressor float-vector property 0x%04x", param); } DEFINE_ALEFFECT_VTABLE(ALcompressor); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/dedicated.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/dedicated.c similarity index 61% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/dedicated.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/dedicated.c index 52d0ec6d..0e1fd389 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/dedicated.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/dedicated.c @@ -23,21 +23,22 @@ #include #include "alMain.h" -#include "alFilter.h" #include "alAuxEffectSlot.h" #include "alError.h" #include "alu.h" +#include "filters/defs.h" typedef struct ALdedicatedState { DERIVE_FROM_TYPE(ALeffectState); - ALfloat gains[MAX_OUTPUT_CHANNELS]; + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; } ALdedicatedState; static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state); static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *state, ALCdevice *device); -static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCdevice *device, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALdedicatedState) @@ -46,13 +47,8 @@ DEFINE_ALEFFECTSTATE_VTABLE(ALdedicatedState); static void ALdedicatedState_Construct(ALdedicatedState *state) { - ALsizei s; - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); SET_VTABLE2(ALdedicatedState, ALeffectState, state); - - for(s = 0;s < MAX_OUTPUT_CHANNELS;s++) - state->gains[s] = 0.0f; } static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state) @@ -60,40 +56,44 @@ static ALvoid ALdedicatedState_Destruct(ALdedicatedState *state) ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); } -static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *UNUSED(state), ALCdevice *UNUSED(device)) +static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *state, ALCdevice *UNUSED(device)) { + ALsizei i; + for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) + state->CurrentGains[i] = 0.0f; return AL_TRUE; } -static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCdevice *device, const ALeffectslot *Slot, const ALeffectProps *props) +static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { + const ALCdevice *device = context->Device; ALfloat Gain; - ALuint i; + ALsizei i; for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) - state->gains[i] = 0.0f; + state->TargetGains[i] = 0.0f; - Gain = Slot->Params.Gain * props->Dedicated.Gain; - if(Slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT) + Gain = slot->Params.Gain * props->Dedicated.Gain; + if(slot->Params.EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT) { int idx; - if((idx=GetChannelIdxByName(device->RealOut, LFE)) != -1) + if((idx=GetChannelIdxByName(&device->RealOut, LFE)) != -1) { STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer; STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels; - state->gains[idx] = Gain; + state->TargetGains[idx] = Gain; } } - else if(Slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE) + else if(slot->Params.EffectType == AL_EFFECT_DEDICATED_DIALOGUE) { int idx; /* Dialog goes to the front-center speaker if it exists, otherwise it * plays from the front-center location. */ - if((idx=GetChannelIdxByName(device->RealOut, FrontCenter)) != -1) + if((idx=GetChannelIdxByName(&device->RealOut, FrontCenter)) != -1) { STATIC_CAST(ALeffectState,state)->OutBuffer = device->RealOut.Buffer; STATIC_CAST(ALeffectState,state)->OutChannels = device->RealOut.NumChannels; - state->gains[idx] = Gain; + state->TargetGains[idx] = Gain; } else { @@ -102,34 +102,23 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, const ALCdevice * STATIC_CAST(ALeffectState,state)->OutBuffer = device->Dry.Buffer; STATIC_CAST(ALeffectState,state)->OutChannels = device->Dry.NumChannels; - ComputePanningGains(device->Dry, coeffs, Gain, state->gains); + ComputePanGains(&device->Dry, coeffs, Gain, state->TargetGains); } } } static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) { - ALsizei i, c; - - SamplesIn = ASSUME_ALIGNED(SamplesIn, 16); - SamplesOut = ASSUME_ALIGNED(SamplesOut, 16); - for(c = 0;c < NumChannels;c++) - { - const ALfloat gain = state->gains[c]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(i = 0;i < SamplesToDo;i++) - SamplesOut[c][i] += SamplesIn[0][i] * gain; - } + MixSamples(SamplesIn[0], NumChannels, SamplesOut, state->CurrentGains, + state->TargetGains, SamplesToDo, 0, SamplesToDo); } -typedef struct ALdedicatedStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALdedicatedStateFactory; +typedef struct DedicatedStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} DedicatedStateFactory; -ALeffectState *ALdedicatedStateFactory_create(ALdedicatedStateFactory *UNUSED(factory)) +ALeffectState *DedicatedStateFactory_create(DedicatedStateFactory *UNUSED(factory)) { ALdedicatedState *state; @@ -139,23 +128,21 @@ ALeffectState *ALdedicatedStateFactory_create(ALdedicatedStateFactory *UNUSED(fa return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALdedicatedStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(DedicatedStateFactory); -ALeffectStateFactory *ALdedicatedStateFactory_getFactory(void) +EffectStateFactory *DedicatedStateFactory_getFactory(void) { - static ALdedicatedStateFactory DedicatedFactory = { { GET_VTABLE2(ALdedicatedStateFactory, ALeffectStateFactory) } }; + static DedicatedStateFactory DedicatedFactory = { { GET_VTABLE2(DedicatedStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &DedicatedFactory); + return STATIC_CAST(EffectStateFactory, &DedicatedFactory); } -void ALdedicated_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALdedicated_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALdedicated_setParami(effect, context, param, vals[0]); -} +void ALdedicated_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } +void ALdedicated_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } void ALdedicated_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) { ALeffectProps *props = &effect->Props; @@ -163,25 +150,21 @@ void ALdedicated_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, { case AL_DEDICATED_GAIN: if(!(val >= 0.0f && isfinite(val))) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Dedicated gain out of range"); props->Dedicated.Gain = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); } } void ALdedicated_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALdedicated_setParamf(effect, context, param, vals[0]); -} +{ ALdedicated_setParamf(effect, context, param, vals[0]); } -void ALdedicated_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALdedicated_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALdedicated_getParami(effect, context, param, vals); -} +void ALdedicated_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer property 0x%04x", param); } +void ALdedicated_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid dedicated integer-vector property 0x%04x", param); } void ALdedicated_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) { const ALeffectProps *props = &effect->Props; @@ -192,12 +175,10 @@ void ALdedicated_getParamf(const ALeffect *effect, ALCcontext *context, ALenum p break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid dedicated float property 0x%04x", param); } } void ALdedicated_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALdedicated_getParamf(effect, context, param, vals); -} +{ ALdedicated_getParamf(effect, context, param, vals); } DEFINE_ALEFFECT_VTABLE(ALdedicated); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/distortion.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/distortion.c similarity index 65% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/distortion.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/distortion.c index 4619894d..de8da4fe 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/distortion.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/distortion.c @@ -24,10 +24,10 @@ #include #include "alMain.h" -#include "alFilter.h" #include "alAuxEffectSlot.h" #include "alError.h" #include "alu.h" +#include "filters/defs.h" typedef struct ALdistortionState { @@ -37,15 +37,17 @@ typedef struct ALdistortionState { ALfloat Gain[MAX_OUTPUT_CHANNELS]; /* Effect parameters */ - ALfilterState lowpass; - ALfilterState bandpass; + BiquadFilter lowpass; + BiquadFilter bandpass; ALfloat attenuation; ALfloat edge_coeff; + + ALfloat Buffer[2][BUFFERSIZE]; } ALdistortionState; static ALvoid ALdistortionState_Destruct(ALdistortionState *state); static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *state, ALCdevice *device); -static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALdistortionState_process(ALdistortionState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALdistortionState) @@ -56,9 +58,6 @@ static void ALdistortionState_Construct(ALdistortionState *state) { ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); SET_VTABLE2(ALdistortionState, ALeffectState, state); - - ALfilterState_clear(&state->lowpass); - ALfilterState_clear(&state->bandpass); } static ALvoid ALdistortionState_Destruct(ALdistortionState *state) @@ -66,21 +65,22 @@ static ALvoid ALdistortionState_Destruct(ALdistortionState *state) ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); } -static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *UNUSED(state), ALCdevice *UNUSED(device)) +static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *state, ALCdevice *UNUSED(device)) { + BiquadFilter_clear(&state->lowpass); + BiquadFilter_clear(&state->bandpass); return AL_TRUE; } -static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) +static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { - ALfloat frequency = (ALfloat)Device->Frequency; + const ALCdevice *device = context->Device; + ALfloat frequency = (ALfloat)device->Frequency; + ALfloat coeffs[MAX_AMBI_COEFFS]; ALfloat bandwidth; ALfloat cutoff; ALfloat edge; - /* Store distorted signal attenuation settings. */ - state->attenuation = props->Distortion.Gain; - /* Store waveshaper edge settings. */ edge = sinf(props->Distortion.Edge * (F_PI_2)); edge = minf(edge, 0.99f); @@ -92,98 +92,93 @@ static ALvoid ALdistortionState_update(ALdistortionState *state, const ALCdevice /* Multiply sampling frequency by the amount of oversampling done during * processing. */ - ALfilterState_setParams(&state->lowpass, ALfilterType_LowPass, 1.0f, + BiquadFilter_setParams(&state->lowpass, BiquadType_LowPass, 1.0f, cutoff / (frequency*4.0f), calc_rcpQ_from_bandwidth(cutoff / (frequency*4.0f), bandwidth) ); cutoff = props->Distortion.EQCenter; /* Convert bandwidth in Hz to octaves. */ bandwidth = props->Distortion.EQBandwidth / (cutoff * 0.67f); - ALfilterState_setParams(&state->bandpass, ALfilterType_BandPass, 1.0f, + BiquadFilter_setParams(&state->bandpass, BiquadType_BandPass, 1.0f, cutoff / (frequency*4.0f), calc_rcpQ_from_bandwidth(cutoff / (frequency*4.0f), bandwidth) ); - ComputeAmbientGains(Device->Dry, Slot->Params.Gain, state->Gain); + CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, slot->Params.Gain*props->Distortion.Gain, state->Gain); } static ALvoid ALdistortionState_process(ALdistortionState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) { + ALfloat (*restrict buffer)[BUFFERSIZE] = state->Buffer; const ALfloat fc = state->edge_coeff; - ALsizei it, kt; ALsizei base; + ALsizei i, k; for(base = 0;base < SamplesToDo;) { - float buffer[2][64 * 4]; - ALsizei td = mini(64, SamplesToDo-base); - /* Perform 4x oversampling to avoid aliasing. Oversampling greatly * improves distortion quality and allows to implement lowpass and * bandpass filters using high frequencies, at which classic IIR * filters became unstable. */ + ALsizei todo = mini(BUFFERSIZE, (SamplesToDo-base) * 4); - /* Fill oversample buffer using zero stuffing. */ - for(it = 0;it < td;it++) - { - /* Multiply the sample by the amount of oversampling to maintain - * the signal's power. - */ - buffer[0][it*4 + 0] = SamplesIn[0][it+base] * 4.0f; - buffer[0][it*4 + 1] = 0.0f; - buffer[0][it*4 + 2] = 0.0f; - buffer[0][it*4 + 3] = 0.0f; - } + /* Fill oversample buffer using zero stuffing. Multiply the sample by + * the amount of oversampling to maintain the signal's power. + */ + for(i = 0;i < todo;i++) + buffer[0][i] = !(i&3) ? SamplesIn[0][(i>>2)+base] * 4.0f : 0.0f; /* First step, do lowpass filtering of original signal. Additionally * perform buffer interpolation and lowpass cutoff for oversampling * (which is fortunately first step of distortion). So combine three * operations into the one. */ - ALfilterState_process(&state->lowpass, buffer[1], buffer[0], td*4); + BiquadFilter_process(&state->lowpass, buffer[1], buffer[0], todo); /* Second step, do distortion using waveshaper function to emulate * signal processing during tube overdriving. Three steps of * waveshaping are intended to modify waveform without boost/clipping/ * attenuation process. */ - for(it = 0;it < td*4;it++) + for(i = 0;i < todo;i++) { - ALfloat smp = buffer[1][it]; + ALfloat smp = buffer[1][i]; smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)); smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)) * -1.0f; smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)); - buffer[0][it] = smp; + buffer[0][i] = smp; } /* Third step, do bandpass filtering of distorted signal. */ - ALfilterState_process(&state->bandpass, buffer[1], buffer[0], td*4); + BiquadFilter_process(&state->bandpass, buffer[1], buffer[0], todo); - for(kt = 0;kt < NumChannels;kt++) + todo >>= 2; + for(k = 0;k < NumChannels;k++) { /* Fourth step, final, do attenuation and perform decimation, - * store only one sample out of 4. + * storing only one sample out of four. */ - ALfloat gain = state->Gain[kt] * state->attenuation; + ALfloat gain = state->Gain[k]; if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) continue; - for(it = 0;it < td;it++) - SamplesOut[kt][base+it] += gain * buffer[1][it*4]; + for(i = 0;i < todo;i++) + SamplesOut[k][base+i] += gain * buffer[1][i*4]; } - base += td; + base += todo; } } -typedef struct ALdistortionStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALdistortionStateFactory; +typedef struct DistortionStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} DistortionStateFactory; -static ALeffectState *ALdistortionStateFactory_create(ALdistortionStateFactory *UNUSED(factory)) +static ALeffectState *DistortionStateFactory_create(DistortionStateFactory *UNUSED(factory)) { ALdistortionState *state; @@ -193,23 +188,21 @@ static ALeffectState *ALdistortionStateFactory_create(ALdistortionStateFactory * return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALdistortionStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(DistortionStateFactory); -ALeffectStateFactory *ALdistortionStateFactory_getFactory(void) +EffectStateFactory *DistortionStateFactory_getFactory(void) { - static ALdistortionStateFactory DistortionFactory = { { GET_VTABLE2(ALdistortionStateFactory, ALeffectStateFactory) } }; + static DistortionStateFactory DistortionFactory = { { GET_VTABLE2(DistortionStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &DistortionFactory); + return STATIC_CAST(EffectStateFactory, &DistortionFactory); } -void ALdistortion_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALdistortion_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALdistortion_setParami(effect, context, param, vals[0]); -} +void ALdistortion_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } +void ALdistortion_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } void ALdistortion_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) { ALeffectProps *props = &effect->Props; @@ -217,49 +210,46 @@ void ALdistortion_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, { case AL_DISTORTION_EDGE: if(!(val >= AL_DISTORTION_MIN_EDGE && val <= AL_DISTORTION_MAX_EDGE)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion edge out of range"); props->Distortion.Edge = val; break; case AL_DISTORTION_GAIN: if(!(val >= AL_DISTORTION_MIN_GAIN && val <= AL_DISTORTION_MAX_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion gain out of range"); props->Distortion.Gain = val; break; case AL_DISTORTION_LOWPASS_CUTOFF: if(!(val >= AL_DISTORTION_MIN_LOWPASS_CUTOFF && val <= AL_DISTORTION_MAX_LOWPASS_CUTOFF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion low-pass cutoff out of range"); props->Distortion.LowpassCutoff = val; break; case AL_DISTORTION_EQCENTER: if(!(val >= AL_DISTORTION_MIN_EQCENTER && val <= AL_DISTORTION_MAX_EQCENTER)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ center out of range"); props->Distortion.EQCenter = val; break; case AL_DISTORTION_EQBANDWIDTH: if(!(val >= AL_DISTORTION_MIN_EQBANDWIDTH && val <= AL_DISTORTION_MAX_EQBANDWIDTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Distortion EQ bandwidth out of range"); props->Distortion.EQBandwidth = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", + param); } } void ALdistortion_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALdistortion_setParamf(effect, context, param, vals[0]); -} +{ ALdistortion_setParamf(effect, context, param, vals[0]); } -void ALdistortion_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALdistortion_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALdistortion_getParami(effect, context, param, vals); -} +void ALdistortion_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer property 0x%04x", param); } +void ALdistortion_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid distortion integer-vector property 0x%04x", param); } void ALdistortion_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) { const ALeffectProps *props = &effect->Props; @@ -286,12 +276,11 @@ void ALdistortion_getParamf(const ALeffect *effect, ALCcontext *context, ALenum break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid distortion float property 0x%04x", + param); } } void ALdistortion_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALdistortion_getParamf(effect, context, param, vals); -} +{ ALdistortion_getParamf(effect, context, param, vals); } DEFINE_ALEFFECT_VTABLE(ALdistortion); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/echo.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/echo.c similarity index 58% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/echo.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/echo.c index c0b1bf63..4570fcb1 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/echo.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/echo.c @@ -28,6 +28,7 @@ #include "alAuxEffectSlot.h" #include "alError.h" #include "alu.h" +#include "filters/defs.h" typedef struct ALechoState { @@ -42,17 +43,21 @@ typedef struct ALechoState { ALsizei delay; } Tap[2]; ALsizei Offset; + /* The panning gains for the two taps */ - ALfloat Gain[2][MAX_OUTPUT_CHANNELS]; + struct { + ALfloat Current[MAX_OUTPUT_CHANNELS]; + ALfloat Target[MAX_OUTPUT_CHANNELS]; + } Gains[2]; ALfloat FeedGain; - ALfilterState Filter; + BiquadFilter Filter; } ALechoState; static ALvoid ALechoState_Destruct(ALechoState *state); static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device); -static ALvoid ALechoState_update(ALechoState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ALechoState_update(ALechoState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALechoState_process(ALechoState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALechoState) @@ -71,7 +76,7 @@ static void ALechoState_Construct(ALechoState *state) state->Tap[1].delay = 0; state->Offset = 0; - ALfilterState_clear(&state->Filter); + BiquadFilter_clear(&state->Filter); } static ALvoid ALechoState_Destruct(ALechoState *state) @@ -83,13 +88,14 @@ static ALvoid ALechoState_Destruct(ALechoState *state) static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device) { - ALsizei maxlen, i; + ALsizei maxlen; // Use the next power of 2 for the buffer length, so the tap offsets can be // wrapped using a mask instead of a modulo - maxlen = fastf2i(AL_ECHO_MAX_DELAY * Device->Frequency) + 1; - maxlen += fastf2i(AL_ECHO_MAX_LRDELAY * Device->Frequency) + 1; - maxlen = NextPowerOf2(maxlen); + maxlen = float2int(AL_ECHO_MAX_DELAY*Device->Frequency + 0.5f) + + float2int(AL_ECHO_MAX_LRDELAY*Device->Frequency + 0.5f); + maxlen = NextPowerOf2(maxlen); + if(maxlen <= 0) return AL_FALSE; if(maxlen != state->BufferLength) { @@ -100,20 +106,22 @@ static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device) state->SampleBuffer = temp; state->BufferLength = maxlen; } - for(i = 0;i < state->BufferLength;i++) - state->SampleBuffer[i] = 0.0f; + + memset(state->SampleBuffer, 0, state->BufferLength*sizeof(ALfloat)); + memset(state->Gains, 0, sizeof(state->Gains)); return AL_TRUE; } -static ALvoid ALechoState_update(ALechoState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) +static ALvoid ALechoState_update(ALechoState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { - ALuint frequency = Device->Frequency; + const ALCdevice *device = context->Device; + ALuint frequency = device->Frequency; ALfloat coeffs[MAX_AMBI_COEFFS]; - ALfloat gain, lrpan, spread; + ALfloat gainhf, lrpan, spread; - state->Tap[0].delay = fastf2i(props->Echo.Delay * frequency) + 1; - state->Tap[1].delay = fastf2i(props->Echo.LRDelay * frequency); + state->Tap[0].delay = maxi(float2int(props->Echo.Delay*frequency + 0.5f), 1); + state->Tap[1].delay = float2int(props->Echo.LRDelay*frequency + 0.5f); state->Tap[1].delay += state->Tap[0].delay; spread = props->Echo.Spread; @@ -126,20 +134,18 @@ static ALvoid ALechoState_update(ALechoState *state, const ALCdevice *Device, co state->FeedGain = props->Echo.Feedback; - gain = maxf(1.0f - props->Echo.Damping, 0.0625f); /* Limit -24dB */ - ALfilterState_setParams(&state->Filter, ALfilterType_HighShelf, - gain, LOWPASSFREQREF/frequency, - calc_rcpQ_from_slope(gain, 1.0f)); - - gain = Slot->Params.Gain; + gainhf = maxf(1.0f - props->Echo.Damping, 0.0625f); /* Limit -24dB */ + BiquadFilter_setParams(&state->Filter, BiquadType_HighShelf, + gainhf, LOWPASSFREQREF/frequency, calc_rcpQ_from_slope(gainhf, 1.0f) + ); /* First tap panning */ CalcAngleCoeffs(-F_PI_2*lrpan, 0.0f, spread, coeffs); - ComputePanningGains(Device->Dry, coeffs, gain, state->Gain[0]); + ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, state->Gains[0].Target); /* Second tap panning */ CalcAngleCoeffs( F_PI_2*lrpan, 0.0f, spread, coeffs); - ComputePanningGains(Device->Dry, coeffs, gain, state->Gain[1]); + ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, state->Gains[1].Target); } static ALvoid ALechoState_process(ALechoState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) @@ -147,73 +153,59 @@ static ALvoid ALechoState_process(ALechoState *state, ALsizei SamplesToDo, const const ALsizei mask = state->BufferLength-1; const ALsizei tap1 = state->Tap[0].delay; const ALsizei tap2 = state->Tap[1].delay; + ALfloat *restrict delaybuf = state->SampleBuffer; ALsizei offset = state->Offset; - ALfloat x[2], y[2], in, out; - ALsizei base, k; - ALsizei i; + ALfloat z1, z2, in, out; + ALsizei base; + ALsizei c, i; - x[0] = state->Filter.x[0]; - x[1] = state->Filter.x[1]; - y[0] = state->Filter.y[0]; - y[1] = state->Filter.y[1]; + z1 = state->Filter.z1; + z2 = state->Filter.z2; for(base = 0;base < SamplesToDo;) { - ALfloat temps[128][2]; + alignas(16) ALfloat temps[2][128]; ALsizei td = mini(128, SamplesToDo-base); for(i = 0;i < td;i++) { + /* Feed the delay buffer's input first. */ + delaybuf[offset&mask] = SamplesIn[0][i+base]; + /* First tap */ - temps[i][0] = state->SampleBuffer[(offset-tap1) & mask]; + temps[0][i] = delaybuf[(offset-tap1) & mask]; /* Second tap */ - temps[i][1] = state->SampleBuffer[(offset-tap2) & mask]; + temps[1][i] = delaybuf[(offset-tap2) & mask]; - // Apply damping and feedback gain to the second tap, and mix in the - // new sample - in = temps[i][1] + SamplesIn[0][i+base]; - out = in*state->Filter.b0 + - x[0]*state->Filter.b1 + x[1]*state->Filter.b2 - - y[0]*state->Filter.a1 - y[1]*state->Filter.a2; - x[1] = x[0]; x[0] = in; - y[1] = y[0]; y[0] = out; + /* Apply damping to the second tap, then add it to the buffer with + * feedback attenuation. + */ + in = temps[1][i]; + out = in*state->Filter.b0 + z1; + z1 = in*state->Filter.b1 - out*state->Filter.a1 + z2; + z2 = in*state->Filter.b2 - out*state->Filter.a2; - state->SampleBuffer[offset&mask] = out * state->FeedGain; + delaybuf[offset&mask] += out * state->FeedGain; offset++; } - for(k = 0;k < NumChannels;k++) - { - ALfloat gain = state->Gain[0][k]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < td;i++) - SamplesOut[k][i+base] += temps[i][0] * gain; - } - - gain = state->Gain[1][k]; - if(fabsf(gain) > GAIN_SILENCE_THRESHOLD) - { - for(i = 0;i < td;i++) - SamplesOut[k][i+base] += temps[i][1] * gain; - } - } + for(c = 0;c < 2;c++) + MixSamples(temps[c], NumChannels, SamplesOut, state->Gains[c].Current, + state->Gains[c].Target, SamplesToDo-base, base, td); base += td; } - state->Filter.x[0] = x[0]; - state->Filter.x[1] = x[1]; - state->Filter.y[0] = y[0]; - state->Filter.y[1] = y[1]; + state->Filter.z1 = z1; + state->Filter.z2 = z2; state->Offset = offset; } -typedef struct ALechoStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALechoStateFactory; +typedef struct EchoStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} EchoStateFactory; -ALeffectState *ALechoStateFactory_create(ALechoStateFactory *UNUSED(factory)) +ALeffectState *EchoStateFactory_create(EchoStateFactory *UNUSED(factory)) { ALechoState *state; @@ -223,22 +215,20 @@ ALeffectState *ALechoStateFactory_create(ALechoStateFactory *UNUSED(factory)) return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALechoStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(EchoStateFactory); -ALeffectStateFactory *ALechoStateFactory_getFactory(void) +EffectStateFactory *EchoStateFactory_getFactory(void) { - static ALechoStateFactory EchoFactory = { { GET_VTABLE2(ALechoStateFactory, ALeffectStateFactory) } }; + static EchoStateFactory EchoFactory = { { GET_VTABLE2(EchoStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &EchoFactory); + return STATIC_CAST(EffectStateFactory, &EchoFactory); } -void ALecho_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALecho_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALecho_setParami(effect, context, param, vals[0]); -} +void ALecho_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } +void ALecho_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } void ALecho_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) { ALeffectProps *props = &effect->Props; @@ -246,49 +236,45 @@ void ALecho_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALflo { case AL_ECHO_DELAY: if(!(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo delay out of range"); props->Echo.Delay = val; break; case AL_ECHO_LRDELAY: if(!(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo LR delay out of range"); props->Echo.LRDelay = val; break; case AL_ECHO_DAMPING: if(!(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo damping out of range"); props->Echo.Damping = val; break; case AL_ECHO_FEEDBACK: if(!(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo feedback out of range"); props->Echo.Feedback = val; break; case AL_ECHO_SPREAD: if(!(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Echo spread out of range"); props->Echo.Spread = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); } } void ALecho_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALecho_setParamf(effect, context, param, vals[0]); -} +{ ALecho_setParamf(effect, context, param, vals[0]); } -void ALecho_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALecho_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALecho_getParami(effect, context, param, vals); -} +void ALecho_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer property 0x%04x", param); } +void ALecho_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid echo integer-vector property 0x%04x", param); } void ALecho_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) { const ALeffectProps *props = &effect->Props; @@ -315,12 +301,10 @@ void ALecho_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid echo float property 0x%04x", param); } } void ALecho_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALecho_getParamf(effect, context, param, vals); -} +{ ALecho_getParamf(effect, context, param, vals); } DEFINE_ALEFFECT_VTABLE(ALecho); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/equalizer.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/equalizer.c similarity index 65% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/equalizer.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/equalizer.c index 030eacc9..17106127 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/equalizer.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/equalizer.c @@ -24,10 +24,10 @@ #include #include "alMain.h" -#include "alFilter.h" #include "alAuxEffectSlot.h" #include "alError.h" #include "alu.h" +#include "filters/defs.h" /* The document "Effects Extension Guide.pdf" says that low and high * @@ -72,24 +72,24 @@ * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt */ -/* The maximum number of sample frames per update. */ -#define MAX_UPDATE_SAMPLES 256 - typedef struct ALequalizerState { DERIVE_FROM_TYPE(ALeffectState); - /* Effect gains for each channel */ - ALfloat Gain[MAX_EFFECT_CHANNELS][MAX_OUTPUT_CHANNELS]; + struct { + /* Effect parameters */ + BiquadFilter filter[4]; - /* Effect parameters */ - ALfilterState filter[4][MAX_EFFECT_CHANNELS]; + /* Effect gains for each channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; + } Chans[MAX_EFFECT_CHANNELS]; - ALfloat SampleBuffer[4][MAX_EFFECT_CHANNELS][MAX_UPDATE_SAMPLES]; + ALfloat SampleBuffer[MAX_EFFECT_CHANNELS][BUFFERSIZE]; } ALequalizerState; static ALvoid ALequalizerState_Destruct(ALequalizerState *state); static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *state, ALCdevice *device); -static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCdevice *device, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALequalizerState_process(ALequalizerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALequalizerState) @@ -98,18 +98,8 @@ DEFINE_ALEFFECTSTATE_VTABLE(ALequalizerState); static void ALequalizerState_Construct(ALequalizerState *state) { - int it, ft; - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); SET_VTABLE2(ALequalizerState, ALeffectState, state); - - /* Initialize sample history only on filter creation to avoid */ - /* sound clicks if filter settings were changed in runtime. */ - for(it = 0; it < 4; it++) - { - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - ALfilterState_clear(&state->filter[it][ft]); - } } static ALvoid ALequalizerState_Destruct(ALequalizerState *state) @@ -117,107 +107,100 @@ static ALvoid ALequalizerState_Destruct(ALequalizerState *state) ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); } -static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *UNUSED(state), ALCdevice *UNUSED(device)) +static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *state, ALCdevice *UNUSED(device)) { + ALsizei i, j; + + for(i = 0; i < MAX_EFFECT_CHANNELS;i++) + { + for(j = 0;j < 4;j++) + BiquadFilter_clear(&state->Chans[i].filter[j]); + for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) + state->Chans[i].CurrentGains[j] = 0.0f; + } return AL_TRUE; } -static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCdevice *device, const ALeffectslot *slot, const ALeffectProps *props) +static ALvoid ALequalizerState_update(ALequalizerState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { + const ALCdevice *device = context->Device; ALfloat frequency = (ALfloat)device->Frequency; - ALfloat gain, freq_mult; + ALfloat gain, f0norm; ALuint i; - STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(device->FOAOut, IdentityMatrixf.m[i], - slot->Params.Gain, state->Gain[i]); - /* Calculate coefficients for the each type of filter. Note that the shelf * filters' gain is for the reference frequency, which is the centerpoint * of the transition band. */ gain = maxf(sqrtf(props->Equalizer.LowGain), 0.0625f); /* Limit -24dB */ - freq_mult = props->Equalizer.LowCutoff/frequency; - ALfilterState_setParams(&state->filter[0][0], ALfilterType_LowShelf, - gain, freq_mult, calc_rcpQ_from_slope(gain, 0.75f) + f0norm = props->Equalizer.LowCutoff/frequency; + BiquadFilter_setParams(&state->Chans[0].filter[0], BiquadType_LowShelf, + gain, f0norm, calc_rcpQ_from_slope(gain, 0.75f) ); - /* Copy the filter coefficients for the other input channels. */ - for(i = 1;i < MAX_EFFECT_CHANNELS;i++) - ALfilterState_copyParams(&state->filter[0][i], &state->filter[0][0]); gain = maxf(props->Equalizer.Mid1Gain, 0.0625f); - freq_mult = props->Equalizer.Mid1Center/frequency; - ALfilterState_setParams(&state->filter[1][0], ALfilterType_Peaking, - gain, freq_mult, calc_rcpQ_from_bandwidth( - freq_mult, props->Equalizer.Mid1Width + f0norm = props->Equalizer.Mid1Center/frequency; + BiquadFilter_setParams(&state->Chans[0].filter[1], BiquadType_Peaking, + gain, f0norm, calc_rcpQ_from_bandwidth( + f0norm, props->Equalizer.Mid1Width ) ); - for(i = 1;i < MAX_EFFECT_CHANNELS;i++) - ALfilterState_copyParams(&state->filter[1][i], &state->filter[1][0]); gain = maxf(props->Equalizer.Mid2Gain, 0.0625f); - freq_mult = props->Equalizer.Mid2Center/frequency; - ALfilterState_setParams(&state->filter[2][0], ALfilterType_Peaking, - gain, freq_mult, calc_rcpQ_from_bandwidth( - freq_mult, props->Equalizer.Mid2Width + f0norm = props->Equalizer.Mid2Center/frequency; + BiquadFilter_setParams(&state->Chans[0].filter[2], BiquadType_Peaking, + gain, f0norm, calc_rcpQ_from_bandwidth( + f0norm, props->Equalizer.Mid2Width ) ); - for(i = 1;i < MAX_EFFECT_CHANNELS;i++) - ALfilterState_copyParams(&state->filter[2][i], &state->filter[2][0]); gain = maxf(sqrtf(props->Equalizer.HighGain), 0.0625f); - freq_mult = props->Equalizer.HighCutoff/frequency; - ALfilterState_setParams(&state->filter[3][0], ALfilterType_HighShelf, - gain, freq_mult, calc_rcpQ_from_slope(gain, 0.75f) + f0norm = props->Equalizer.HighCutoff/frequency; + BiquadFilter_setParams(&state->Chans[0].filter[3], BiquadType_HighShelf, + gain, f0norm, calc_rcpQ_from_slope(gain, 0.75f) ); + + /* Copy the filter coefficients for the other input channels. */ for(i = 1;i < MAX_EFFECT_CHANNELS;i++) - ALfilterState_copyParams(&state->filter[3][i], &state->filter[3][0]); + { + BiquadFilter_copyParams(&state->Chans[i].filter[0], &state->Chans[0].filter[0]); + BiquadFilter_copyParams(&state->Chans[i].filter[1], &state->Chans[0].filter[1]); + BiquadFilter_copyParams(&state->Chans[i].filter[2], &state->Chans[0].filter[2]); + BiquadFilter_copyParams(&state->Chans[i].filter[3], &state->Chans[0].filter[3]); + } + + STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; + STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + ComputePanGains(&device->FOAOut, IdentityMatrixf.m[i], slot->Params.Gain, + state->Chans[i].TargetGains); } static ALvoid ALequalizerState_process(ALequalizerState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) { - ALfloat (*Samples)[MAX_EFFECT_CHANNELS][MAX_UPDATE_SAMPLES] = state->SampleBuffer; - ALsizei it, kt, ft; - ALsizei base; + ALfloat (*restrict temps)[BUFFERSIZE] = state->SampleBuffer; + ALsizei c; - for(base = 0;base < SamplesToDo;) + for(c = 0;c < MAX_EFFECT_CHANNELS;c++) { - ALsizei td = mini(MAX_UPDATE_SAMPLES, SamplesToDo-base); + BiquadFilter_process(&state->Chans[c].filter[0], temps[0], SamplesIn[c], SamplesToDo); + BiquadFilter_process(&state->Chans[c].filter[1], temps[1], temps[0], SamplesToDo); + BiquadFilter_process(&state->Chans[c].filter[2], temps[2], temps[1], SamplesToDo); + BiquadFilter_process(&state->Chans[c].filter[3], temps[3], temps[2], SamplesToDo); - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - ALfilterState_process(&state->filter[0][ft], Samples[0][ft], &SamplesIn[ft][base], td); - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - ALfilterState_process(&state->filter[1][ft], Samples[1][ft], Samples[0][ft], td); - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - ALfilterState_process(&state->filter[2][ft], Samples[2][ft], Samples[1][ft], td); - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - ALfilterState_process(&state->filter[3][ft], Samples[3][ft], Samples[2][ft], td); - - for(ft = 0;ft < MAX_EFFECT_CHANNELS;ft++) - { - for(kt = 0;kt < NumChannels;kt++) - { - ALfloat gain = state->Gain[ft][kt]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; - - for(it = 0;it < td;it++) - SamplesOut[kt][base+it] += gain * Samples[3][ft][it]; - } - } - - base += td; + MixSamples(temps[3], NumChannels, SamplesOut, + state->Chans[c].CurrentGains, state->Chans[c].TargetGains, + SamplesToDo, 0, SamplesToDo + ); } } -typedef struct ALequalizerStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALequalizerStateFactory; +typedef struct EqualizerStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} EqualizerStateFactory; -ALeffectState *ALequalizerStateFactory_create(ALequalizerStateFactory *UNUSED(factory)) +ALeffectState *EqualizerStateFactory_create(EqualizerStateFactory *UNUSED(factory)) { ALequalizerState *state; @@ -227,22 +210,20 @@ ALeffectState *ALequalizerStateFactory_create(ALequalizerStateFactory *UNUSED(fa return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALequalizerStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(EqualizerStateFactory); -ALeffectStateFactory *ALequalizerStateFactory_getFactory(void) +EffectStateFactory *EqualizerStateFactory_getFactory(void) { - static ALequalizerStateFactory EqualizerFactory = { { GET_VTABLE2(ALequalizerStateFactory, ALeffectStateFactory) } }; + static EqualizerStateFactory EqualizerFactory = { { GET_VTABLE2(EqualizerStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &EqualizerFactory); + return STATIC_CAST(EffectStateFactory, &EqualizerFactory); } -void ALequalizer_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALequalizer_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALequalizer_setParami(effect, context, param, vals[0]); -} +void ALequalizer_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } +void ALequalizer_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } void ALequalizer_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) { ALeffectProps *props = &effect->Props; @@ -250,79 +231,75 @@ void ALequalizer_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, { case AL_EQUALIZER_LOW_GAIN: if(!(val >= AL_EQUALIZER_MIN_LOW_GAIN && val <= AL_EQUALIZER_MAX_LOW_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer low-band gain out of range"); props->Equalizer.LowGain = val; break; case AL_EQUALIZER_LOW_CUTOFF: if(!(val >= AL_EQUALIZER_MIN_LOW_CUTOFF && val <= AL_EQUALIZER_MAX_LOW_CUTOFF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer low-band cutoff out of range"); props->Equalizer.LowCutoff = val; break; case AL_EQUALIZER_MID1_GAIN: if(!(val >= AL_EQUALIZER_MIN_MID1_GAIN && val <= AL_EQUALIZER_MAX_MID1_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid1-band gain out of range"); props->Equalizer.Mid1Gain = val; break; case AL_EQUALIZER_MID1_CENTER: if(!(val >= AL_EQUALIZER_MIN_MID1_CENTER && val <= AL_EQUALIZER_MAX_MID1_CENTER)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid1-band center out of range"); props->Equalizer.Mid1Center = val; break; case AL_EQUALIZER_MID1_WIDTH: if(!(val >= AL_EQUALIZER_MIN_MID1_WIDTH && val <= AL_EQUALIZER_MAX_MID1_WIDTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid1-band width out of range"); props->Equalizer.Mid1Width = val; break; case AL_EQUALIZER_MID2_GAIN: if(!(val >= AL_EQUALIZER_MIN_MID2_GAIN && val <= AL_EQUALIZER_MAX_MID2_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid2-band gain out of range"); props->Equalizer.Mid2Gain = val; break; case AL_EQUALIZER_MID2_CENTER: if(!(val >= AL_EQUALIZER_MIN_MID2_CENTER && val <= AL_EQUALIZER_MAX_MID2_CENTER)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid2-band center out of range"); props->Equalizer.Mid2Center = val; break; case AL_EQUALIZER_MID2_WIDTH: if(!(val >= AL_EQUALIZER_MIN_MID2_WIDTH && val <= AL_EQUALIZER_MAX_MID2_WIDTH)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer mid2-band width out of range"); props->Equalizer.Mid2Width = val; break; case AL_EQUALIZER_HIGH_GAIN: if(!(val >= AL_EQUALIZER_MIN_HIGH_GAIN && val <= AL_EQUALIZER_MAX_HIGH_GAIN)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer high-band gain out of range"); props->Equalizer.HighGain = val; break; case AL_EQUALIZER_HIGH_CUTOFF: if(!(val >= AL_EQUALIZER_MIN_HIGH_CUTOFF && val <= AL_EQUALIZER_MAX_HIGH_CUTOFF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Equalizer high-band cutoff out of range"); props->Equalizer.HighCutoff = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); } } void ALequalizer_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALequalizer_setParamf(effect, context, param, vals[0]); -} +{ ALequalizer_setParamf(effect, context, param, vals[0]); } -void ALequalizer_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val)) -{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); } -void ALequalizer_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALequalizer_getParami(effect, context, param, vals); -} +void ALequalizer_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer property 0x%04x", param); } +void ALequalizer_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid equalizer integer-vector property 0x%04x", param); } void ALequalizer_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) { const ALeffectProps *props = &effect->Props; @@ -369,12 +346,10 @@ void ALequalizer_getParamf(const ALeffect *effect, ALCcontext *context, ALenum p break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid equalizer float property 0x%04x", param); } } void ALequalizer_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALequalizer_getParamf(effect, context, param, vals); -} +{ ALequalizer_getParamf(effect, context, param, vals); } DEFINE_ALEFFECT_VTABLE(ALequalizer); diff --git a/love/src/jni/openal-soft-1.19.1/Alc/effects/fshifter.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/fshifter.c new file mode 100644 index 00000000..7d72472a --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/fshifter.c @@ -0,0 +1,329 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alMain.h" +#include "alAuxEffectSlot.h" +#include "alError.h" +#include "alu.h" +#include "filters/defs.h" + +#include "alcomplex.h" + +#define HIL_SIZE 1024 +#define OVERSAMP (1<<2) + +#define HIL_STEP (HIL_SIZE / OVERSAMP) +#define FIFO_LATENCY (HIL_STEP * (OVERSAMP-1)) + + +typedef struct ALfshifterState { + DERIVE_FROM_TYPE(ALeffectState); + + /* Effect parameters */ + ALsizei count; + ALsizei PhaseStep; + ALsizei Phase; + ALdouble ld_sign; + + /*Effects buffers*/ + ALfloat InFIFO[HIL_SIZE]; + ALcomplex OutFIFO[HIL_SIZE]; + ALcomplex OutputAccum[HIL_SIZE]; + ALcomplex Analytic[HIL_SIZE]; + ALcomplex Outdata[BUFFERSIZE]; + + alignas(16) ALfloat BufferOut[BUFFERSIZE]; + + /* Effect gains for each output channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; +} ALfshifterState; + +static ALvoid ALfshifterState_Destruct(ALfshifterState *state); +static ALboolean ALfshifterState_deviceUpdate(ALfshifterState *state, ALCdevice *device); +static ALvoid ALfshifterState_update(ALfshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALfshifterState_process(ALfshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); +DECLARE_DEFAULT_ALLOCATORS(ALfshifterState) + +DEFINE_ALEFFECTSTATE_VTABLE(ALfshifterState); + +/* Define a Hann window, used to filter the HIL input and output. */ +alignas(16) static ALdouble HannWindow[HIL_SIZE]; + +static void InitHannWindow(void) +{ + ALsizei i; + + /* Create lookup table of the Hann window for the desired size, i.e. HIL_SIZE */ + for(i = 0;i < HIL_SIZE>>1;i++) + { + ALdouble val = sin(M_PI * (ALdouble)i / (ALdouble)(HIL_SIZE-1)); + HannWindow[i] = HannWindow[HIL_SIZE-1-i] = val * val; + } +} + +static alonce_flag HannInitOnce = AL_ONCE_FLAG_INIT; + +static void ALfshifterState_Construct(ALfshifterState *state) +{ + ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); + SET_VTABLE2(ALfshifterState, ALeffectState, state); + + alcall_once(&HannInitOnce, InitHannWindow); +} + +static ALvoid ALfshifterState_Destruct(ALfshifterState *state) +{ + ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); +} + +static ALboolean ALfshifterState_deviceUpdate(ALfshifterState *state, ALCdevice *UNUSED(device)) +{ + /* (Re-)initializing parameters and clear the buffers. */ + state->count = FIFO_LATENCY; + state->PhaseStep = 0; + state->Phase = 0; + state->ld_sign = 1.0; + + memset(state->InFIFO, 0, sizeof(state->InFIFO)); + memset(state->OutFIFO, 0, sizeof(state->OutFIFO)); + memset(state->OutputAccum, 0, sizeof(state->OutputAccum)); + memset(state->Analytic, 0, sizeof(state->Analytic)); + + memset(state->CurrentGains, 0, sizeof(state->CurrentGains)); + memset(state->TargetGains, 0, sizeof(state->TargetGains)); + + return AL_TRUE; +} + +static ALvoid ALfshifterState_update(ALfshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) +{ + const ALCdevice *device = context->Device; + ALfloat coeffs[MAX_AMBI_COEFFS]; + ALfloat step; + + step = props->Fshifter.Frequency / (ALfloat)device->Frequency; + state->PhaseStep = fastf2i(minf(step, 0.5f) * FRACTIONONE); + + switch(props->Fshifter.LeftDirection) + { + case AL_FREQUENCY_SHIFTER_DIRECTION_DOWN: + state->ld_sign = -1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_UP: + state->ld_sign = 1.0; + break; + + case AL_FREQUENCY_SHIFTER_DIRECTION_OFF: + state->Phase = 0; + state->PhaseStep = 0; + break; + } + + CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, state->TargetGains); +} + +static ALvoid ALfshifterState_process(ALfshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) +{ + static const ALcomplex complex_zero = { 0.0, 0.0 }; + ALfloat *restrict BufferOut = state->BufferOut; + ALsizei j, k, base; + + for(base = 0;base < SamplesToDo;) + { + ALsizei todo = mini(HIL_SIZE-state->count, SamplesToDo-base); + + ASSUME(todo > 0); + + /* Fill FIFO buffer with samples data */ + k = state->count; + for(j = 0;j < todo;j++,k++) + { + state->InFIFO[k] = SamplesIn[0][base+j]; + state->Outdata[base+j] = state->OutFIFO[k-FIFO_LATENCY]; + } + state->count += todo; + base += todo; + + /* Check whether FIFO buffer is filled */ + if(state->count < HIL_SIZE) continue; + + state->count = FIFO_LATENCY; + + /* Real signal windowing and store in Analytic buffer */ + for(k = 0;k < HIL_SIZE;k++) + { + state->Analytic[k].Real = state->InFIFO[k] * HannWindow[k]; + state->Analytic[k].Imag = 0.0; + } + + /* Processing signal by Discrete Hilbert Transform (analytical signal). */ + complex_hilbert(state->Analytic, HIL_SIZE); + + /* Windowing and add to output accumulator */ + for(k = 0;k < HIL_SIZE;k++) + { + state->OutputAccum[k].Real += 2.0/OVERSAMP*HannWindow[k]*state->Analytic[k].Real; + state->OutputAccum[k].Imag += 2.0/OVERSAMP*HannWindow[k]*state->Analytic[k].Imag; + } + + /* Shift accumulator, input & output FIFO */ + for(k = 0;k < HIL_STEP;k++) state->OutFIFO[k] = state->OutputAccum[k]; + for(j = 0;k < HIL_SIZE;k++,j++) state->OutputAccum[j] = state->OutputAccum[k]; + for(;j < HIL_SIZE;j++) state->OutputAccum[j] = complex_zero; + for(k = 0;k < FIFO_LATENCY;k++) + state->InFIFO[k] = state->InFIFO[k+HIL_STEP]; + } + + /* Process frequency shifter using the analytic signal obtained. */ + for(k = 0;k < SamplesToDo;k++) + { + ALdouble phase = state->Phase * ((1.0/FRACTIONONE) * 2.0*M_PI); + BufferOut[k] = (ALfloat)(state->Outdata[k].Real*cos(phase) + + state->Outdata[k].Imag*sin(phase)*state->ld_sign); + + state->Phase += state->PhaseStep; + state->Phase &= FRACTIONMASK; + } + + /* Now, mix the processed sound data to the output. */ + MixSamples(BufferOut, NumChannels, SamplesOut, state->CurrentGains, state->TargetGains, + maxi(SamplesToDo, 512), 0, SamplesToDo); +} + +typedef struct FshifterStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} FshifterStateFactory; + +static ALeffectState *FshifterStateFactory_create(FshifterStateFactory *UNUSED(factory)) +{ + ALfshifterState *state; + + NEW_OBJ0(state, ALfshifterState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(FshifterStateFactory); + +EffectStateFactory *FshifterStateFactory_getFactory(void) +{ + static FshifterStateFactory FshifterFactory = { { GET_VTABLE2(FshifterStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &FshifterFactory); +} + +void ALfshifter_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FREQUENCY_SHIFTER_FREQUENCY: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_FREQUENCY && val <= AL_FREQUENCY_SHIFTER_MAX_FREQUENCY)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter frequency out of range"); + props->Fshifter.Frequency = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", param); + } +} + +void ALfshifter_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ + ALfshifter_setParamf(effect, context, param, vals[0]); +} + +void ALfshifter_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter left direction out of range"); + props->Fshifter.LeftDirection = val; + break; + + case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: + if(!(val >= AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION && val <= AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Frequency shifter right direction out of range"); + props->Fshifter.RightDirection = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", param); + } +} +void ALfshifter_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ + ALfshifter_setParami(effect, context, param, vals[0]); +} + +void ALfshifter_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FREQUENCY_SHIFTER_LEFT_DIRECTION: + *val = props->Fshifter.LeftDirection; + break; + case AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION: + *val = props->Fshifter.RightDirection; + break; + default: + alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter integer property 0x%04x", param); + } +} +void ALfshifter_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ + ALfshifter_getParami(effect, context, param, vals); +} + +void ALfshifter_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_FREQUENCY_SHIFTER_FREQUENCY: + *val = props->Fshifter.Frequency; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid frequency shifter float property 0x%04x", param); + } + +} + +void ALfshifter_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ + ALfshifter_getParamf(effect, context, param, vals); +} + +DEFINE_ALEFFECT_VTABLE(ALfshifter); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/modulator.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/modulator.c similarity index 59% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/modulator.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/modulator.c index 5de88fcd..e368adb8 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/modulator.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/modulator.c @@ -24,28 +24,33 @@ #include #include "alMain.h" -#include "alFilter.h" #include "alAuxEffectSlot.h" #include "alError.h" #include "alu.h" +#include "filters/defs.h" +#define MAX_UPDATE_SAMPLES 128 + typedef struct ALmodulatorState { DERIVE_FROM_TYPE(ALeffectState); - void (*Process)(ALfloat*, const ALfloat*, ALsizei, const ALsizei, ALsizei); + void (*GetSamples)(ALfloat*, ALsizei, const ALsizei, ALsizei); ALsizei index; ALsizei step; - ALfloat Gain[MAX_EFFECT_CHANNELS][MAX_OUTPUT_CHANNELS]; + struct { + BiquadFilter Filter; - ALfilterState Filter[MAX_EFFECT_CHANNELS]; + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; + } Chans[MAX_EFFECT_CHANNELS]; } ALmodulatorState; static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state); static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *state, ALCdevice *device); -static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); DECLARE_DEFAULT_ALLOCATORS(ALmodulatorState) @@ -58,51 +63,52 @@ DEFINE_ALEFFECTSTATE_VTABLE(ALmodulatorState); static inline ALfloat Sin(ALsizei index) { - return sinf(index*(F_TAU/WAVEFORM_FRACONE) - F_PI)*0.5f + 0.5f; + return sinf((ALfloat)index * (F_TAU / WAVEFORM_FRACONE)); } static inline ALfloat Saw(ALsizei index) { - return (ALfloat)index / WAVEFORM_FRACONE; + return (ALfloat)index*(2.0f/WAVEFORM_FRACONE) - 1.0f; } static inline ALfloat Square(ALsizei index) { - return (ALfloat)((index >> (WAVEFORM_FRACBITS - 1)) & 1); + return (ALfloat)(((index>>(WAVEFORM_FRACBITS-2))&2) - 1); +} + +static inline ALfloat One(ALsizei UNUSED(index)) +{ + return 1.0f; } #define DECL_TEMPLATE(func) \ -static void Modulate##func(ALfloat *restrict dst, const ALfloat *restrict src,\ - ALsizei index, const ALsizei step, ALsizei todo) \ +static void Modulate##func(ALfloat *restrict dst, ALsizei index, \ + const ALsizei step, ALsizei todo) \ { \ ALsizei i; \ for(i = 0;i < todo;i++) \ { \ index += step; \ index &= WAVEFORM_FRACMASK; \ - dst[i] = src[i] * func(index); \ + dst[i] = func(index); \ } \ } DECL_TEMPLATE(Sin) DECL_TEMPLATE(Saw) DECL_TEMPLATE(Square) +DECL_TEMPLATE(One) #undef DECL_TEMPLATE static void ALmodulatorState_Construct(ALmodulatorState *state) { - ALuint i; - ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); SET_VTABLE2(ALmodulatorState, ALeffectState, state); state->index = 0; state->step = 1; - - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ALfilterState_clear(&state->Filter[i]); } static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state) @@ -110,91 +116,89 @@ static ALvoid ALmodulatorState_Destruct(ALmodulatorState *state) ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); } -static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *UNUSED(state), ALCdevice *UNUSED(device)) +static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *state, ALCdevice *UNUSED(device)) { + ALsizei i, j; + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + { + BiquadFilter_clear(&state->Chans[i].Filter); + for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) + state->Chans[i].CurrentGains[j] = 0.0f; + } return AL_TRUE; } -static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCdevice *Device, const ALeffectslot *Slot, const ALeffectProps *props) +static ALvoid ALmodulatorState_update(ALmodulatorState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) { - ALfloat cw, a; + const ALCdevice *device = context->Device; + ALfloat f0norm; ALsizei i; - if(props->Modulator.Waveform == AL_RING_MODULATOR_SINUSOID) - state->Process = ModulateSin; + state->step = fastf2i(props->Modulator.Frequency / (ALfloat)device->Frequency * + WAVEFORM_FRACONE); + state->step = clampi(state->step, 0, WAVEFORM_FRACONE-1); + + if(state->step == 0) + state->GetSamples = ModulateOne; + else if(props->Modulator.Waveform == AL_RING_MODULATOR_SINUSOID) + state->GetSamples = ModulateSin; else if(props->Modulator.Waveform == AL_RING_MODULATOR_SAWTOOTH) - state->Process = ModulateSaw; + state->GetSamples = ModulateSaw; else /*if(Slot->Params.EffectProps.Modulator.Waveform == AL_RING_MODULATOR_SQUARE)*/ - state->Process = ModulateSquare; + state->GetSamples = ModulateSquare; - state->step = fastf2i(props->Modulator.Frequency*WAVEFORM_FRACONE / - Device->Frequency); - if(state->step == 0) state->step = 1; - - /* Custom filter coeffs, which match the old version instead of a low-shelf. */ - cw = cosf(F_TAU * props->Modulator.HighPassCutoff / Device->Frequency); - a = (2.0f-cw) - sqrtf(powf(2.0f-cw, 2.0f) - 1.0f); + f0norm = props->Modulator.HighPassCutoff / (ALfloat)device->Frequency; + f0norm = clampf(f0norm, 1.0f/512.0f, 0.49f); + /* Bandwidth value is constant in octaves. */ + BiquadFilter_setParams(&state->Chans[0].Filter, BiquadType_HighPass, 1.0f, + f0norm, calc_rcpQ_from_bandwidth(f0norm, 0.75f)); + for(i = 1;i < MAX_EFFECT_CHANNELS;i++) + BiquadFilter_copyParams(&state->Chans[i].Filter, &state->Chans[0].Filter); + STATIC_CAST(ALeffectState,state)->OutBuffer = device->FOAOut.Buffer; + STATIC_CAST(ALeffectState,state)->OutChannels = device->FOAOut.NumChannels; for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - { - state->Filter[i].b0 = a; - state->Filter[i].b1 = -a; - state->Filter[i].b2 = 0.0f; - state->Filter[i].a1 = -a; - state->Filter[i].a2 = 0.0f; - } - - STATIC_CAST(ALeffectState,state)->OutBuffer = Device->FOAOut.Buffer; - STATIC_CAST(ALeffectState,state)->OutChannels = Device->FOAOut.NumChannels; - for(i = 0;i < MAX_EFFECT_CHANNELS;i++) - ComputeFirstOrderGains(Device->FOAOut, IdentityMatrixf.m[i], - Slot->Params.Gain, state->Gain[i]); + ComputePanGains(&device->FOAOut, IdentityMatrixf.m[i], slot->Params.Gain, + state->Chans[i].TargetGains); } static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) { const ALsizei step = state->step; - ALsizei index = state->index; ALsizei base; for(base = 0;base < SamplesToDo;) { - ALfloat temps[2][128]; - ALsizei td = mini(128, SamplesToDo-base); - ALsizei i, j, k; + alignas(16) ALfloat modsamples[MAX_UPDATE_SAMPLES]; + ALsizei td = mini(MAX_UPDATE_SAMPLES, SamplesToDo-base); + ALsizei c, i; - for(j = 0;j < MAX_EFFECT_CHANNELS;j++) + state->GetSamples(modsamples, state->index, step, td); + state->index += (step*td) & WAVEFORM_FRACMASK; + state->index &= WAVEFORM_FRACMASK; + + for(c = 0;c < MAX_EFFECT_CHANNELS;c++) { - ALfilterState_process(&state->Filter[j], temps[0], &SamplesIn[j][base], td); - state->Process(temps[1], temps[0], index, step, td); + alignas(16) ALfloat temps[MAX_UPDATE_SAMPLES]; - for(k = 0;k < NumChannels;k++) - { - ALfloat gain = state->Gain[j][k]; - if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) - continue; + BiquadFilter_process(&state->Chans[c].Filter, temps, &SamplesIn[c][base], td); + for(i = 0;i < td;i++) + temps[i] *= modsamples[i]; - for(i = 0;i < td;i++) - SamplesOut[k][base+i] += gain * temps[1][i]; - } + MixSamples(temps, NumChannels, SamplesOut, state->Chans[c].CurrentGains, + state->Chans[c].TargetGains, SamplesToDo-base, base, td); } - for(i = 0;i < td;i++) - { - index += step; - index &= WAVEFORM_FRACMASK; - } base += td; } - state->index = index; } -typedef struct ALmodulatorStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALmodulatorStateFactory; +typedef struct ModulatorStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} ModulatorStateFactory; -static ALeffectState *ALmodulatorStateFactory_create(ALmodulatorStateFactory *UNUSED(factory)) +static ALeffectState *ModulatorStateFactory_create(ModulatorStateFactory *UNUSED(factory)) { ALmodulatorState *state; @@ -204,13 +208,13 @@ static ALeffectState *ALmodulatorStateFactory_create(ALmodulatorStateFactory *UN return STATIC_CAST(ALeffectState, state); } -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALmodulatorStateFactory); +DEFINE_EFFECTSTATEFACTORY_VTABLE(ModulatorStateFactory); -ALeffectStateFactory *ALmodulatorStateFactory_getFactory(void) +EffectStateFactory *ModulatorStateFactory_getFactory(void) { - static ALmodulatorStateFactory ModulatorFactory = { { GET_VTABLE2(ALmodulatorStateFactory, ALeffectStateFactory) } }; + static ModulatorStateFactory ModulatorFactory = { { GET_VTABLE2(ModulatorStateFactory, EffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &ModulatorFactory); + return STATIC_CAST(EffectStateFactory, &ModulatorFactory); } @@ -221,24 +225,22 @@ void ALmodulator_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, { case AL_RING_MODULATOR_FREQUENCY: if(!(val >= AL_RING_MODULATOR_MIN_FREQUENCY && val <= AL_RING_MODULATOR_MAX_FREQUENCY)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator frequency out of range"); props->Modulator.Frequency = val; break; case AL_RING_MODULATOR_HIGHPASS_CUTOFF: if(!(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Modulator high-pass cutoff out of range"); props->Modulator.HighPassCutoff = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); } } void ALmodulator_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) -{ - ALmodulator_setParamf(effect, context, param, vals[0]); -} +{ ALmodulator_setParamf(effect, context, param, vals[0]); } void ALmodulator_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) { ALeffectProps *props = &effect->Props; @@ -251,18 +253,16 @@ void ALmodulator_setParami(ALeffect *effect, ALCcontext *context, ALenum param, case AL_RING_MODULATOR_WAVEFORM: if(!(val >= AL_RING_MODULATOR_MIN_WAVEFORM && val <= AL_RING_MODULATOR_MAX_WAVEFORM)) - SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE); + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid modulator waveform"); props->Modulator.Waveform = val; break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); } } void ALmodulator_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) -{ - ALmodulator_setParami(effect, context, param, vals[0]); -} +{ ALmodulator_setParami(effect, context, param, vals[0]); } void ALmodulator_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) { @@ -280,13 +280,11 @@ void ALmodulator_getParami(const ALeffect *effect, ALCcontext *context, ALenum p break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid modulator integer property 0x%04x", param); } } void ALmodulator_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) -{ - ALmodulator_getParami(effect, context, param, vals); -} +{ ALmodulator_getParami(effect, context, param, vals); } void ALmodulator_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) { const ALeffectProps *props = &effect->Props; @@ -300,12 +298,10 @@ void ALmodulator_getParamf(const ALeffect *effect, ALCcontext *context, ALenum p break; default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + alSetError(context, AL_INVALID_ENUM, "Invalid modulator float property 0x%04x", param); } } void ALmodulator_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) -{ - ALmodulator_getParamf(effect, context, param, vals); -} +{ ALmodulator_getParamf(effect, context, param, vals); } DEFINE_ALEFFECT_VTABLE(ALmodulator); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/effects/null.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/null.c similarity index 60% rename from love/src/jni/openal-soft-1.18.2/Alc/effects/null.c rename to love/src/jni/openal-soft-1.19.1/Alc/effects/null.c index 3812d8fc..e57359e3 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/effects/null.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/null.c @@ -16,8 +16,8 @@ typedef struct ALnullState { /* Forward-declare "virtual" functions to define the vtable with. */ static ALvoid ALnullState_Destruct(ALnullState *state); static ALboolean ALnullState_deviceUpdate(ALnullState *state, ALCdevice *device); -static ALvoid ALnullState_update(ALnullState *state, const ALCdevice *device, const ALeffectslot *slot, const ALeffectProps *props); -static ALvoid ALnullState_process(ALnullState *state, ALsizei samplesToDo, const ALfloatBUFFERSIZE*restrict samplesIn, ALfloatBUFFERSIZE*restrict samplesOut, ALsizei NumChannels); +static ALvoid ALnullState_update(ALnullState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALnullState_process(ALnullState *state, ALsizei samplesToDo, const ALfloat (*restrict samplesIn)[BUFFERSIZE], ALfloat (*restrict samplesOut)[BUFFERSIZE], ALsizei mumChannels); static void *ALnullState_New(size_t size); static void ALnullState_Delete(void *ptr); @@ -56,7 +56,7 @@ static ALboolean ALnullState_deviceUpdate(ALnullState* UNUSED(state), ALCdevice* /* This updates the effect state. This is called any time the effect is * (re)loaded into a slot. */ -static ALvoid ALnullState_update(ALnullState* UNUSED(state), const ALCdevice* UNUSED(device), const ALeffectslot* UNUSED(slot), const ALeffectProps* UNUSED(props)) +static ALvoid ALnullState_update(ALnullState* UNUSED(state), const ALCcontext* UNUSED(context), const ALeffectslot* UNUSED(slot), const ALeffectProps* UNUSED(props)) { } @@ -64,7 +64,7 @@ static ALvoid ALnullState_update(ALnullState* UNUSED(state), const ALCdevice* UN * input to the output buffer. The result should be added to the output buffer, * not replace it. */ -static ALvoid ALnullState_process(ALnullState* UNUSED(state), ALsizei UNUSED(samplesToDo), const ALfloatBUFFERSIZE*restrict UNUSED(samplesIn), ALfloatBUFFERSIZE*restrict UNUSED(samplesOut), ALsizei UNUSED(NumChannels)) +static ALvoid ALnullState_process(ALnullState* UNUSED(state), ALsizei UNUSED(samplesToDo), const ALfloatBUFFERSIZE*restrict UNUSED(samplesIn), ALfloatBUFFERSIZE*restrict UNUSED(samplesOut), ALsizei UNUSED(numChannels)) { } @@ -85,12 +85,12 @@ static void ALnullState_Delete(void *ptr) } -typedef struct ALnullStateFactory { - DERIVE_FROM_TYPE(ALeffectStateFactory); -} ALnullStateFactory; +typedef struct NullStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} NullStateFactory; /* Creates ALeffectState objects of the appropriate type. */ -ALeffectState *ALnullStateFactory_create(ALnullStateFactory *UNUSED(factory)) +ALeffectState *NullStateFactory_create(NullStateFactory *UNUSED(factory)) { ALnullState *state; @@ -100,79 +100,79 @@ ALeffectState *ALnullStateFactory_create(ALnullStateFactory *UNUSED(factory)) return STATIC_CAST(ALeffectState, state); } -/* Define the ALeffectStateFactory vtable for this type. */ -DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALnullStateFactory); +/* Define the EffectStateFactory vtable for this type. */ +DEFINE_EFFECTSTATEFACTORY_VTABLE(NullStateFactory); -ALeffectStateFactory *ALnullStateFactory_getFactory(void) +EffectStateFactory *NullStateFactory_getFactory(void) { - static ALnullStateFactory NullFactory = { { GET_VTABLE2(ALnullStateFactory, ALeffectStateFactory) } }; - return STATIC_CAST(ALeffectStateFactory, &NullFactory); + static NullStateFactory NullFactory = { { GET_VTABLE2(NullStateFactory, EffectStateFactory) } }; + return STATIC_CAST(EffectStateFactory, &NullFactory); } -void ALnull_setParami(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) +void ALnull_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); } } -void ALnull_setParamiv(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, const ALint* UNUSED(vals)) +void ALnull_setParamiv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALint* UNUSED(vals)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer-vector property 0x%04x", param); } } -void ALnull_setParamf(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) +void ALnull_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); } } -void ALnull_setParamfv(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat* UNUSED(vals)) +void ALnull_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat* UNUSED(vals)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect float-vector property 0x%04x", param); } } -void ALnull_getParami(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(val)) +void ALnull_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(val)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer property 0x%04x", param); } } -void ALnull_getParamiv(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(vals)) +void ALnull_getParamiv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(vals)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect integer-vector property 0x%04x", param); } } -void ALnull_getParamf(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(val)) +void ALnull_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(val)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect float property 0x%04x", param); } } -void ALnull_getParamfv(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(vals)) +void ALnull_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(vals)) { switch(param) { - default: - SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); + default: + alSetError(context, AL_INVALID_ENUM, "Invalid null effect float-vector property 0x%04x", param); } } diff --git a/love/src/jni/openal-soft-1.19.1/Alc/effects/pshifter.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/pshifter.c new file mode 100644 index 00000000..ed18e9a8 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/pshifter.c @@ -0,0 +1,441 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 2018 by Raul Herraiz. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include + +#include "alMain.h" +#include "alAuxEffectSlot.h" +#include "alError.h" +#include "alu.h" +#include "filters/defs.h" + +#include "alcomplex.h" + + +#define STFT_SIZE 1024 +#define STFT_HALF_SIZE (STFT_SIZE>>1) +#define OVERSAMP (1<<2) + +#define STFT_STEP (STFT_SIZE / OVERSAMP) +#define FIFO_LATENCY (STFT_STEP * (OVERSAMP-1)) + + +typedef struct ALphasor { + ALdouble Amplitude; + ALdouble Phase; +} ALphasor; + +typedef struct ALFrequencyDomain { + ALdouble Amplitude; + ALdouble Frequency; +} ALfrequencyDomain; + + +typedef struct ALpshifterState { + DERIVE_FROM_TYPE(ALeffectState); + + /* Effect parameters */ + ALsizei count; + ALsizei PitchShiftI; + ALfloat PitchShift; + ALfloat FreqPerBin; + + /*Effects buffers*/ + ALfloat InFIFO[STFT_SIZE]; + ALfloat OutFIFO[STFT_STEP]; + ALdouble LastPhase[STFT_HALF_SIZE+1]; + ALdouble SumPhase[STFT_HALF_SIZE+1]; + ALdouble OutputAccum[STFT_SIZE]; + + ALcomplex FFTbuffer[STFT_SIZE]; + + ALfrequencyDomain Analysis_buffer[STFT_HALF_SIZE+1]; + ALfrequencyDomain Syntesis_buffer[STFT_HALF_SIZE+1]; + + alignas(16) ALfloat BufferOut[BUFFERSIZE]; + + /* Effect gains for each output channel */ + ALfloat CurrentGains[MAX_OUTPUT_CHANNELS]; + ALfloat TargetGains[MAX_OUTPUT_CHANNELS]; +} ALpshifterState; + +static ALvoid ALpshifterState_Destruct(ALpshifterState *state); +static ALboolean ALpshifterState_deviceUpdate(ALpshifterState *state, ALCdevice *device); +static ALvoid ALpshifterState_update(ALpshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props); +static ALvoid ALpshifterState_process(ALpshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); +DECLARE_DEFAULT_ALLOCATORS(ALpshifterState) + +DEFINE_ALEFFECTSTATE_VTABLE(ALpshifterState); + + +/* Define a Hann window, used to filter the STFT input and output. */ +alignas(16) static ALdouble HannWindow[STFT_SIZE]; + +static void InitHannWindow(void) +{ + ALsizei i; + + /* Create lookup table of the Hann window for the desired size, i.e. STFT_SIZE */ + for(i = 0;i < STFT_SIZE>>1;i++) + { + ALdouble val = sin(M_PI * (ALdouble)i / (ALdouble)(STFT_SIZE-1)); + HannWindow[i] = HannWindow[STFT_SIZE-1-i] = val * val; + } +} +static alonce_flag HannInitOnce = AL_ONCE_FLAG_INIT; + + +static inline ALint double2int(ALdouble d) +{ +#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE2_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2) + ALint sign, shift; + ALint64 mant; + union { + ALdouble d; + ALint64 i64; + } conv; + + conv.d = d; + sign = (conv.i64>>63) | 1; + shift = ((conv.i64>>52)&0x7ff) - (1023+52); + + /* Over/underflow */ + if(UNLIKELY(shift >= 63 || shift < -52)) + return 0; + + mant = (conv.i64&I64(0xfffffffffffff)) | I64(0x10000000000000); + if(LIKELY(shift < 0)) + return (ALint)(mant >> -shift) * sign; + return (ALint)(mant << shift) * sign; + +#else + + return (ALint)d; +#endif +} + + +/* Converts ALcomplex to ALphasor */ +static inline ALphasor rect2polar(ALcomplex number) +{ + ALphasor polar; + + polar.Amplitude = sqrt(number.Real*number.Real + number.Imag*number.Imag); + polar.Phase = atan2(number.Imag, number.Real); + + return polar; +} + +/* Converts ALphasor to ALcomplex */ +static inline ALcomplex polar2rect(ALphasor number) +{ + ALcomplex cartesian; + + cartesian.Real = number.Amplitude * cos(number.Phase); + cartesian.Imag = number.Amplitude * sin(number.Phase); + + return cartesian; +} + + +static void ALpshifterState_Construct(ALpshifterState *state) +{ + ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); + SET_VTABLE2(ALpshifterState, ALeffectState, state); + + alcall_once(&HannInitOnce, InitHannWindow); +} + +static ALvoid ALpshifterState_Destruct(ALpshifterState *state) +{ + ALeffectState_Destruct(STATIC_CAST(ALeffectState,state)); +} + +static ALboolean ALpshifterState_deviceUpdate(ALpshifterState *state, ALCdevice *device) +{ + /* (Re-)initializing parameters and clear the buffers. */ + state->count = FIFO_LATENCY; + state->PitchShiftI = FRACTIONONE; + state->PitchShift = 1.0f; + state->FreqPerBin = device->Frequency / (ALfloat)STFT_SIZE; + + memset(state->InFIFO, 0, sizeof(state->InFIFO)); + memset(state->OutFIFO, 0, sizeof(state->OutFIFO)); + memset(state->FFTbuffer, 0, sizeof(state->FFTbuffer)); + memset(state->LastPhase, 0, sizeof(state->LastPhase)); + memset(state->SumPhase, 0, sizeof(state->SumPhase)); + memset(state->OutputAccum, 0, sizeof(state->OutputAccum)); + memset(state->Analysis_buffer, 0, sizeof(state->Analysis_buffer)); + memset(state->Syntesis_buffer, 0, sizeof(state->Syntesis_buffer)); + + memset(state->CurrentGains, 0, sizeof(state->CurrentGains)); + memset(state->TargetGains, 0, sizeof(state->TargetGains)); + + return AL_TRUE; +} + +static ALvoid ALpshifterState_update(ALpshifterState *state, const ALCcontext *context, const ALeffectslot *slot, const ALeffectProps *props) +{ + const ALCdevice *device = context->Device; + ALfloat coeffs[MAX_AMBI_COEFFS]; + float pitch; + + pitch = powf(2.0f, + (ALfloat)(props->Pshifter.CoarseTune*100 + props->Pshifter.FineTune) / 1200.0f + ); + state->PitchShiftI = fastf2i(pitch*FRACTIONONE); + state->PitchShift = state->PitchShiftI * (1.0f/FRACTIONONE); + + CalcAngleCoeffs(0.0f, 0.0f, 0.0f, coeffs); + ComputePanGains(&device->Dry, coeffs, slot->Params.Gain, state->TargetGains); +} + +static ALvoid ALpshifterState_process(ALpshifterState *state, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) +{ + /* Pitch shifter engine based on the work of Stephan Bernsee. + * http://blogs.zynaptiq.com/bernsee/pitch-shifting-using-the-ft/ + */ + + static const ALdouble expected = M_PI*2.0 / OVERSAMP; + const ALdouble freq_per_bin = state->FreqPerBin; + ALfloat *restrict bufferOut = state->BufferOut; + ALsizei count = state->count; + ALsizei i, j, k; + + for(i = 0;i < SamplesToDo;) + { + do { + /* Fill FIFO buffer with samples data */ + state->InFIFO[count] = SamplesIn[0][i]; + bufferOut[i] = state->OutFIFO[count - FIFO_LATENCY]; + + count++; + } while(++i < SamplesToDo && count < STFT_SIZE); + + /* Check whether FIFO buffer is filled */ + if(count < STFT_SIZE) break; + count = FIFO_LATENCY; + + /* Real signal windowing and store in FFTbuffer */ + for(k = 0;k < STFT_SIZE;k++) + { + state->FFTbuffer[k].Real = state->InFIFO[k] * HannWindow[k]; + state->FFTbuffer[k].Imag = 0.0; + } + + /* ANALYSIS */ + /* Apply FFT to FFTbuffer data */ + complex_fft(state->FFTbuffer, STFT_SIZE, -1.0); + + /* Analyze the obtained data. Since the real FFT is symmetric, only + * STFT_HALF_SIZE+1 samples are needed. + */ + for(k = 0;k < STFT_HALF_SIZE+1;k++) + { + ALphasor component; + ALdouble tmp; + ALint qpd; + + /* Compute amplitude and phase */ + component = rect2polar(state->FFTbuffer[k]); + + /* Compute phase difference and subtract expected phase difference */ + tmp = (component.Phase - state->LastPhase[k]) - k*expected; + + /* Map delta phase into +/- Pi interval */ + qpd = double2int(tmp / M_PI); + tmp -= M_PI * (qpd + (qpd%2)); + + /* Get deviation from bin frequency from the +/- Pi interval */ + tmp /= expected; + + /* Compute the k-th partials' true frequency, twice the amplitude + * for maintain the gain (because half of bins are used) and store + * amplitude and true frequency in analysis buffer. + */ + state->Analysis_buffer[k].Amplitude = 2.0 * component.Amplitude; + state->Analysis_buffer[k].Frequency = (k + tmp) * freq_per_bin; + + /* Store actual phase[k] for the calculations in the next frame*/ + state->LastPhase[k] = component.Phase; + } + + /* PROCESSING */ + /* pitch shifting */ + for(k = 0;k < STFT_HALF_SIZE+1;k++) + { + state->Syntesis_buffer[k].Amplitude = 0.0; + state->Syntesis_buffer[k].Frequency = 0.0; + } + + for(k = 0;k < STFT_HALF_SIZE+1;k++) + { + j = (k*state->PitchShiftI) >> FRACTIONBITS; + if(j >= STFT_HALF_SIZE+1) break; + + state->Syntesis_buffer[j].Amplitude += state->Analysis_buffer[k].Amplitude; + state->Syntesis_buffer[j].Frequency = state->Analysis_buffer[k].Frequency * + state->PitchShift; + } + + /* SYNTHESIS */ + /* Synthesis the processing data */ + for(k = 0;k < STFT_HALF_SIZE+1;k++) + { + ALphasor component; + ALdouble tmp; + + /* Compute bin deviation from scaled freq */ + tmp = state->Syntesis_buffer[k].Frequency/freq_per_bin - k; + + /* Calculate actual delta phase and accumulate it to get bin phase */ + state->SumPhase[k] += (k + tmp) * expected; + + component.Amplitude = state->Syntesis_buffer[k].Amplitude; + component.Phase = state->SumPhase[k]; + + /* Compute phasor component to cartesian complex number and storage it into FFTbuffer*/ + state->FFTbuffer[k] = polar2rect(component); + } + /* zero negative frequencies for recontruct a real signal */ + for(k = STFT_HALF_SIZE+1;k < STFT_SIZE;k++) + { + state->FFTbuffer[k].Real = 0.0; + state->FFTbuffer[k].Imag = 0.0; + } + + /* Apply iFFT to buffer data */ + complex_fft(state->FFTbuffer, STFT_SIZE, 1.0); + + /* Windowing and add to output */ + for(k = 0;k < STFT_SIZE;k++) + state->OutputAccum[k] += HannWindow[k] * state->FFTbuffer[k].Real / + (0.5 * STFT_HALF_SIZE * OVERSAMP); + + /* Shift accumulator, input & output FIFO */ + for(k = 0;k < STFT_STEP;k++) state->OutFIFO[k] = (ALfloat)state->OutputAccum[k]; + for(j = 0;k < STFT_SIZE;k++,j++) state->OutputAccum[j] = state->OutputAccum[k]; + for(;j < STFT_SIZE;j++) state->OutputAccum[j] = 0.0; + for(k = 0;k < FIFO_LATENCY;k++) + state->InFIFO[k] = state->InFIFO[k+STFT_STEP]; + } + state->count = count; + + /* Now, mix the processed sound data to the output. */ + MixSamples(bufferOut, NumChannels, SamplesOut, state->CurrentGains, state->TargetGains, + maxi(SamplesToDo, 512), 0, SamplesToDo); +} + +typedef struct PshifterStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} PshifterStateFactory; + +static ALeffectState *PshifterStateFactory_create(PshifterStateFactory *UNUSED(factory)) +{ + ALpshifterState *state; + + NEW_OBJ0(state, ALpshifterState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(PshifterStateFactory); + +EffectStateFactory *PshifterStateFactory_getFactory(void) +{ + static PshifterStateFactory PshifterFactory = { { GET_VTABLE2(PshifterStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &PshifterFactory); +} + + +void ALpshifter_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) +{ + alSetError( context, AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param ); +} + +void ALpshifter_setParamfv(ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) +{ + alSetError( context, AL_INVALID_ENUM, "Invalid pitch shifter float-vector property 0x%04x", param ); +} + +void ALpshifter_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_PITCH_SHIFTER_COARSE_TUNE: + if(!(val >= AL_PITCH_SHIFTER_MIN_COARSE_TUNE && val <= AL_PITCH_SHIFTER_MAX_COARSE_TUNE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter coarse tune out of range"); + props->Pshifter.CoarseTune = val; + break; + + case AL_PITCH_SHIFTER_FINE_TUNE: + if(!(val >= AL_PITCH_SHIFTER_MIN_FINE_TUNE && val <= AL_PITCH_SHIFTER_MAX_FINE_TUNE)) + SETERR_RETURN(context, AL_INVALID_VALUE,,"Pitch shifter fine tune out of range"); + props->Pshifter.FineTune = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", param); + } +} +void ALpshifter_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ + ALpshifter_setParami(effect, context, param, vals[0]); +} + +void ALpshifter_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_PITCH_SHIFTER_COARSE_TUNE: + *val = (ALint)props->Pshifter.CoarseTune; + break; + case AL_PITCH_SHIFTER_FINE_TUNE: + *val = (ALint)props->Pshifter.FineTune; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter integer property 0x%04x", param); + } +} +void ALpshifter_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ + ALpshifter_getParami(effect, context, param, vals); +} + +void ALpshifter_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter float property 0x%04x", param); +} + +void ALpshifter_getParamfv(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) +{ + alSetError(context, AL_INVALID_ENUM, "Invalid pitch shifter float vector-property 0x%04x", param); +} + +DEFINE_ALEFFECT_VTABLE(ALpshifter); diff --git a/love/src/jni/openal-soft-1.19.1/Alc/effects/reverb.c b/love/src/jni/openal-soft-1.19.1/Alc/effects/reverb.c new file mode 100644 index 00000000..8ebc089e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/effects/reverb.c @@ -0,0 +1,2090 @@ +/** + * Ambisonic reverb engine for the OpenAL cross platform audio library + * Copyright (C) 2008-2017 by Chris Robinson and Christopher Fitzgerald. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include + +#include "alMain.h" +#include "alu.h" +#include "alAuxEffectSlot.h" +#include "alListener.h" +#include "alError.h" +#include "filters/defs.h" + +/* This is a user config option for modifying the overall output of the reverb + * effect. + */ +ALfloat ReverbBoost = 1.0f; + +/* This is the maximum number of samples processed for each inner loop + * iteration. */ +#define MAX_UPDATE_SAMPLES 256 + +/* The number of samples used for cross-faded delay lines. This can be used + * to balance the compensation for abrupt line changes and attenuation due to + * minimally lengthed recursive lines. Try to keep this below the device + * update size. + */ +#define FADE_SAMPLES 128 + +/* The number of spatialized lines or channels to process. Four channels allows + * for a 3D A-Format response. NOTE: This can't be changed without taking care + * of the conversion matrices, and a few places where the length arrays are + * assumed to have 4 elements. + */ +#define NUM_LINES 4 + + +/* The B-Format to A-Format conversion matrix. The arrangement of rows is + * deliberately chosen to align the resulting lines to their spatial opposites + * (0:above front left <-> 3:above back right, 1:below front right <-> 2:below + * back left). It's not quite opposite, since the A-Format results in a + * tetrahedron, but it's close enough. Should the model be extended to 8-lines + * in the future, true opposites can be used. + */ +static const aluMatrixf B2A = {{ + { 0.288675134595f, 0.288675134595f, 0.288675134595f, 0.288675134595f }, + { 0.288675134595f, -0.288675134595f, -0.288675134595f, 0.288675134595f }, + { 0.288675134595f, 0.288675134595f, -0.288675134595f, -0.288675134595f }, + { 0.288675134595f, -0.288675134595f, 0.288675134595f, -0.288675134595f } +}}; + +/* Converts A-Format to B-Format. */ +static const aluMatrixf A2B = {{ + { 0.866025403785f, 0.866025403785f, 0.866025403785f, 0.866025403785f }, + { 0.866025403785f, -0.866025403785f, 0.866025403785f, -0.866025403785f }, + { 0.866025403785f, -0.866025403785f, -0.866025403785f, 0.866025403785f }, + { 0.866025403785f, 0.866025403785f, -0.866025403785f, -0.866025403785f } +}}; + +static const ALfloat FadeStep = 1.0f / FADE_SAMPLES; + +/* The all-pass and delay lines have a variable length dependent on the + * effect's density parameter, which helps alter the perceived environment + * size. The size-to-density conversion is a cubed scale: + * + * density = min(1.0, pow(size, 3.0) / DENSITY_SCALE); + * + * The line lengths scale linearly with room size, so the inverse density + * conversion is needed, taking the cube root of the re-scaled density to + * calculate the line length multiplier: + * + * length_mult = max(5.0, cbrtf(density*DENSITY_SCALE)); + * + * The density scale below will result in a max line multiplier of 50, for an + * effective size range of 5m to 50m. + */ +static const ALfloat DENSITY_SCALE = 125000.0f; + +/* All delay line lengths are specified in seconds. + * + * To approximate early reflections, we break them up into primary (those + * arriving from the same direction as the source) and secondary (those + * arriving from the opposite direction). + * + * The early taps decorrelate the 4-channel signal to approximate an average + * room response for the primary reflections after the initial early delay. + * + * Given an average room dimension (d_a) and the speed of sound (c) we can + * calculate the average reflection delay (r_a) regardless of listener and + * source positions as: + * + * r_a = d_a / c + * c = 343.3 + * + * This can extended to finding the average difference (r_d) between the + * maximum (r_1) and minimum (r_0) reflection delays: + * + * r_0 = 2 / 3 r_a + * = r_a - r_d / 2 + * = r_d + * r_1 = 4 / 3 r_a + * = r_a + r_d / 2 + * = 2 r_d + * r_d = 2 / 3 r_a + * = r_1 - r_0 + * + * As can be determined by integrating the 1D model with a source (s) and + * listener (l) positioned across the dimension of length (d_a): + * + * r_d = int_(l=0)^d_a (int_(s=0)^d_a |2 d_a - 2 (l + s)| ds) dl / c + * + * The initial taps (T_(i=0)^N) are then specified by taking a power series + * that ranges between r_0 and half of r_1 less r_0: + * + * R_i = 2^(i / (2 N - 1)) r_d + * = r_0 + (2^(i / (2 N - 1)) - 1) r_d + * = r_0 + T_i + * T_i = R_i - r_0 + * = (2^(i / (2 N - 1)) - 1) r_d + * + * Assuming an average of 1m, we get the following taps: + */ +static const ALfloat EARLY_TAP_LENGTHS[NUM_LINES] = +{ + 0.0000000e+0f, 2.0213520e-4f, 4.2531060e-4f, 6.7171600e-4f +}; + +/* The early all-pass filter lengths are based on the early tap lengths: + * + * A_i = R_i / a + * + * Where a is the approximate maximum all-pass cycle limit (20). + */ +static const ALfloat EARLY_ALLPASS_LENGTHS[NUM_LINES] = +{ + 9.7096800e-5f, 1.0720356e-4f, 1.1836234e-4f, 1.3068260e-4f +}; + +/* The early delay lines are used to transform the primary reflections into + * the secondary reflections. The A-format is arranged in such a way that + * the channels/lines are spatially opposite: + * + * C_i is opposite C_(N-i-1) + * + * The delays of the two opposing reflections (R_i and O_i) from a source + * anywhere along a particular dimension always sum to twice its full delay: + * + * 2 r_a = R_i + O_i + * + * With that in mind we can determine the delay between the two reflections + * and thus specify our early line lengths (L_(i=0)^N) using: + * + * O_i = 2 r_a - R_(N-i-1) + * L_i = O_i - R_(N-i-1) + * = 2 (r_a - R_(N-i-1)) + * = 2 (r_a - T_(N-i-1) - r_0) + * = 2 r_a (1 - (2 / 3) 2^((N - i - 1) / (2 N - 1))) + * + * Using an average dimension of 1m, we get: + */ +static const ALfloat EARLY_LINE_LENGTHS[NUM_LINES] = +{ + 5.9850400e-4f, 1.0913150e-3f, 1.5376658e-3f, 1.9419362e-3f +}; + +/* The late all-pass filter lengths are based on the late line lengths: + * + * A_i = (5 / 3) L_i / r_1 + */ +static const ALfloat LATE_ALLPASS_LENGTHS[NUM_LINES] = +{ + 1.6182800e-4f, 2.0389060e-4f, 2.8159360e-4f, 3.2365600e-4f +}; + +/* The late lines are used to approximate the decaying cycle of recursive + * late reflections. + * + * Splitting the lines in half, we start with the shortest reflection paths + * (L_(i=0)^(N/2)): + * + * L_i = 2^(i / (N - 1)) r_d + * + * Then for the opposite (longest) reflection paths (L_(i=N/2)^N): + * + * L_i = 2 r_a - L_(i-N/2) + * = 2 r_a - 2^((i - N / 2) / (N - 1)) r_d + * + * For our 1m average room, we get: + */ +static const ALfloat LATE_LINE_LENGTHS[NUM_LINES] = +{ + 1.9419362e-3f, 2.4466860e-3f, 3.3791220e-3f, 3.8838720e-3f +}; + + +typedef struct DelayLineI { + /* The delay lines use interleaved samples, with the lengths being powers + * of 2 to allow the use of bit-masking instead of a modulus for wrapping. + */ + ALsizei Mask; + ALfloat (*Line)[NUM_LINES]; +} DelayLineI; + +typedef struct VecAllpass { + DelayLineI Delay; + ALfloat Coeff; + ALsizei Offset[NUM_LINES][2]; +} VecAllpass; + +typedef struct T60Filter { + /* Two filters are used to adjust the signal. One to control the low + * frequencies, and one to control the high frequencies. + */ + ALfloat MidGain[2]; + BiquadFilter HFFilter, LFFilter; +} T60Filter; + +typedef struct EarlyReflections { + /* A Gerzon vector all-pass filter is used to simulate initial diffusion. + * The spread from this filter also helps smooth out the reverb tail. + */ + VecAllpass VecAp; + + /* An echo line is used to complete the second half of the early + * reflections. + */ + DelayLineI Delay; + ALsizei Offset[NUM_LINES][2]; + ALfloat Coeff[NUM_LINES][2]; + + /* The gain for each output channel based on 3D panning. */ + ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; + ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; +} EarlyReflections; + +typedef struct LateReverb { + /* A recursive delay line is used fill in the reverb tail. */ + DelayLineI Delay; + ALsizei Offset[NUM_LINES][2]; + + /* Attenuation to compensate for the modal density and decay rate of the + * late lines. + */ + ALfloat DensityGain[2]; + + /* T60 decay filters are used to simulate absorption. */ + T60Filter T60[NUM_LINES]; + + /* A Gerzon vector all-pass filter is used to simulate diffusion. */ + VecAllpass VecAp; + + /* The gain for each output channel based on 3D panning. */ + ALfloat CurrentGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; + ALfloat PanGain[NUM_LINES][MAX_OUTPUT_CHANNELS]; +} LateReverb; + +typedef struct ReverbState { + DERIVE_FROM_TYPE(ALeffectState); + + /* All delay lines are allocated as a single buffer to reduce memory + * fragmentation and management code. + */ + ALfloat *SampleBuffer; + ALuint TotalSamples; + + struct { + /* Calculated parameters which indicate if cross-fading is needed after + * an update. + */ + ALfloat Density, Diffusion; + ALfloat DecayTime, HFDecayTime, LFDecayTime; + ALfloat HFReference, LFReference; + } Params; + + /* Master effect filters */ + struct { + BiquadFilter Lp; + BiquadFilter Hp; + } Filter[NUM_LINES]; + + /* Core delay line (early reflections and late reverb tap from this). */ + DelayLineI Delay; + + /* Tap points for early reflection delay. */ + ALsizei EarlyDelayTap[NUM_LINES][2]; + ALfloat EarlyDelayCoeff[NUM_LINES][2]; + + /* Tap points for late reverb feed and delay. */ + ALsizei LateFeedTap; + ALsizei LateDelayTap[NUM_LINES][2]; + + /* Coefficients for the all-pass and line scattering matrices. */ + ALfloat MixX; + ALfloat MixY; + + EarlyReflections Early; + + LateReverb Late; + + /* Indicates the cross-fade point for delay line reads [0,FADE_SAMPLES]. */ + ALsizei FadeCount; + + /* Maximum number of samples to process at once. */ + ALsizei MaxUpdate[2]; + + /* The current write offset for all delay lines. */ + ALsizei Offset; + + /* Temporary storage used when processing. */ + alignas(16) ALfloat TempSamples[NUM_LINES][MAX_UPDATE_SAMPLES]; + alignas(16) ALfloat MixSamples[NUM_LINES][MAX_UPDATE_SAMPLES]; +} ReverbState; + +static ALvoid ReverbState_Destruct(ReverbState *State); +static ALboolean ReverbState_deviceUpdate(ReverbState *State, ALCdevice *Device); +static ALvoid ReverbState_update(ReverbState *State, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props); +static ALvoid ReverbState_process(ReverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels); +DECLARE_DEFAULT_ALLOCATORS(ReverbState) + +DEFINE_ALEFFECTSTATE_VTABLE(ReverbState); + +static void ReverbState_Construct(ReverbState *state) +{ + ALsizei i, j; + + ALeffectState_Construct(STATIC_CAST(ALeffectState, state)); + SET_VTABLE2(ReverbState, ALeffectState, state); + + state->TotalSamples = 0; + state->SampleBuffer = NULL; + + state->Params.Density = AL_EAXREVERB_DEFAULT_DENSITY; + state->Params.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION; + state->Params.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME; + state->Params.HFDecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME*AL_EAXREVERB_DEFAULT_DECAY_HFRATIO; + state->Params.LFDecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME*AL_EAXREVERB_DEFAULT_DECAY_LFRATIO; + state->Params.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE; + state->Params.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE; + + for(i = 0;i < NUM_LINES;i++) + { + BiquadFilter_clear(&state->Filter[i].Lp); + BiquadFilter_clear(&state->Filter[i].Hp); + } + + state->Delay.Mask = 0; + state->Delay.Line = NULL; + + for(i = 0;i < NUM_LINES;i++) + { + state->EarlyDelayTap[i][0] = 0; + state->EarlyDelayTap[i][1] = 0; + state->EarlyDelayCoeff[i][0] = 0.0f; + state->EarlyDelayCoeff[i][1] = 0.0f; + } + + state->LateFeedTap = 0; + + for(i = 0;i < NUM_LINES;i++) + { + state->LateDelayTap[i][0] = 0; + state->LateDelayTap[i][1] = 0; + } + + state->MixX = 0.0f; + state->MixY = 0.0f; + + state->Early.VecAp.Delay.Mask = 0; + state->Early.VecAp.Delay.Line = NULL; + state->Early.VecAp.Coeff = 0.0f; + state->Early.Delay.Mask = 0; + state->Early.Delay.Line = NULL; + for(i = 0;i < NUM_LINES;i++) + { + state->Early.VecAp.Offset[i][0] = 0; + state->Early.VecAp.Offset[i][1] = 0; + state->Early.Offset[i][0] = 0; + state->Early.Offset[i][1] = 0; + state->Early.Coeff[i][0] = 0.0f; + state->Early.Coeff[i][1] = 0.0f; + } + + state->Late.DensityGain[0] = 0.0f; + state->Late.DensityGain[1] = 0.0f; + state->Late.Delay.Mask = 0; + state->Late.Delay.Line = NULL; + state->Late.VecAp.Delay.Mask = 0; + state->Late.VecAp.Delay.Line = NULL; + state->Late.VecAp.Coeff = 0.0f; + for(i = 0;i < NUM_LINES;i++) + { + state->Late.Offset[i][0] = 0; + state->Late.Offset[i][1] = 0; + + state->Late.VecAp.Offset[i][0] = 0; + state->Late.VecAp.Offset[i][1] = 0; + + state->Late.T60[i].MidGain[0] = 0.0f; + state->Late.T60[i].MidGain[1] = 0.0f; + BiquadFilter_clear(&state->Late.T60[i].HFFilter); + BiquadFilter_clear(&state->Late.T60[i].LFFilter); + } + + for(i = 0;i < NUM_LINES;i++) + { + for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) + { + state->Early.CurrentGain[i][j] = 0.0f; + state->Early.PanGain[i][j] = 0.0f; + state->Late.CurrentGain[i][j] = 0.0f; + state->Late.PanGain[i][j] = 0.0f; + } + } + + state->FadeCount = 0; + state->MaxUpdate[0] = MAX_UPDATE_SAMPLES; + state->MaxUpdate[1] = MAX_UPDATE_SAMPLES; + state->Offset = 0; +} + +static ALvoid ReverbState_Destruct(ReverbState *State) +{ + al_free(State->SampleBuffer); + State->SampleBuffer = NULL; + + ALeffectState_Destruct(STATIC_CAST(ALeffectState,State)); +} + +/************************************** + * Device Update * + **************************************/ + +static inline ALfloat CalcDelayLengthMult(ALfloat density) +{ + return maxf(5.0f, cbrtf(density*DENSITY_SCALE)); +} + +/* Given the allocated sample buffer, this function updates each delay line + * offset. + */ +static inline ALvoid RealizeLineOffset(ALfloat *sampleBuffer, DelayLineI *Delay) +{ + union { + ALfloat *f; + ALfloat (*f4)[NUM_LINES]; + } u; + u.f = &sampleBuffer[(ptrdiff_t)Delay->Line * NUM_LINES]; + Delay->Line = u.f4; +} + +/* Calculate the length of a delay line and store its mask and offset. */ +static ALuint CalcLineLength(const ALfloat length, const ptrdiff_t offset, const ALuint frequency, + const ALuint extra, DelayLineI *Delay) +{ + ALuint samples; + + /* All line lengths are powers of 2, calculated from their lengths in + * seconds, rounded up. + */ + samples = float2int(ceilf(length*frequency)); + samples = NextPowerOf2(samples + extra); + + /* All lines share a single sample buffer. */ + Delay->Mask = samples - 1; + Delay->Line = (ALfloat(*)[NUM_LINES])offset; + + /* Return the sample count for accumulation. */ + return samples; +} + +/* Calculates the delay line metrics and allocates the shared sample buffer + * for all lines given the sample rate (frequency). If an allocation failure + * occurs, it returns AL_FALSE. + */ +static ALboolean AllocLines(const ALuint frequency, ReverbState *State) +{ + ALuint totalSamples, i; + ALfloat multiplier, length; + + /* All delay line lengths are calculated to accomodate the full range of + * lengths given their respective paramters. + */ + totalSamples = 0; + + /* Multiplier for the maximum density value, i.e. density=1, which is + * actually the least density... + */ + multiplier = CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY); + + /* The main delay length includes the maximum early reflection delay, the + * largest early tap width, the maximum late reverb delay, and the + * largest late tap width. Finally, it must also be extended by the + * update size (MAX_UPDATE_SAMPLES) for block processing. + */ + length = AL_EAXREVERB_MAX_REFLECTIONS_DELAY + EARLY_TAP_LENGTHS[NUM_LINES-1]*multiplier + + AL_EAXREVERB_MAX_LATE_REVERB_DELAY + + (LATE_LINE_LENGTHS[NUM_LINES-1] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; + totalSamples += CalcLineLength(length, totalSamples, frequency, MAX_UPDATE_SAMPLES, + &State->Delay); + + /* The early vector all-pass line. */ + length = EARLY_ALLPASS_LENGTHS[NUM_LINES-1] * multiplier; + totalSamples += CalcLineLength(length, totalSamples, frequency, 0, + &State->Early.VecAp.Delay); + + /* The early reflection line. */ + length = EARLY_LINE_LENGTHS[NUM_LINES-1] * multiplier; + totalSamples += CalcLineLength(length, totalSamples, frequency, 0, + &State->Early.Delay); + + /* The late vector all-pass line. */ + length = LATE_ALLPASS_LENGTHS[NUM_LINES-1] * multiplier; + totalSamples += CalcLineLength(length, totalSamples, frequency, 0, + &State->Late.VecAp.Delay); + + /* The late delay lines are calculated from the largest maximum density + * line length. + */ + length = LATE_LINE_LENGTHS[NUM_LINES-1] * multiplier; + totalSamples += CalcLineLength(length, totalSamples, frequency, 0, + &State->Late.Delay); + + if(totalSamples != State->TotalSamples) + { + ALfloat *newBuffer; + + TRACE("New reverb buffer length: %ux4 samples\n", totalSamples); + newBuffer = al_calloc(16, sizeof(ALfloat[NUM_LINES]) * totalSamples); + if(!newBuffer) return AL_FALSE; + + al_free(State->SampleBuffer); + State->SampleBuffer = newBuffer; + State->TotalSamples = totalSamples; + } + + /* Update all delays to reflect the new sample buffer. */ + RealizeLineOffset(State->SampleBuffer, &State->Delay); + RealizeLineOffset(State->SampleBuffer, &State->Early.VecAp.Delay); + RealizeLineOffset(State->SampleBuffer, &State->Early.Delay); + RealizeLineOffset(State->SampleBuffer, &State->Late.VecAp.Delay); + RealizeLineOffset(State->SampleBuffer, &State->Late.Delay); + + /* Clear the sample buffer. */ + for(i = 0;i < State->TotalSamples;i++) + State->SampleBuffer[i] = 0.0f; + + return AL_TRUE; +} + +static ALboolean ReverbState_deviceUpdate(ReverbState *State, ALCdevice *Device) +{ + ALuint frequency = Device->Frequency; + ALfloat multiplier; + ALsizei i, j; + + /* Allocate the delay lines. */ + if(!AllocLines(frequency, State)) + return AL_FALSE; + + multiplier = CalcDelayLengthMult(AL_EAXREVERB_MAX_DENSITY); + + /* The late feed taps are set a fixed position past the latest delay tap. */ + State->LateFeedTap = float2int((AL_EAXREVERB_MAX_REFLECTIONS_DELAY + + EARLY_TAP_LENGTHS[NUM_LINES-1]*multiplier) * + frequency); + + /* Clear filters and gain coefficients since the delay lines were all just + * cleared (if not reallocated). + */ + for(i = 0;i < NUM_LINES;i++) + { + BiquadFilter_clear(&State->Filter[i].Lp); + BiquadFilter_clear(&State->Filter[i].Hp); + } + + for(i = 0;i < NUM_LINES;i++) + { + State->EarlyDelayCoeff[i][0] = 0.0f; + State->EarlyDelayCoeff[i][1] = 0.0f; + } + + for(i = 0;i < NUM_LINES;i++) + { + State->Early.Coeff[i][0] = 0.0f; + State->Early.Coeff[i][1] = 0.0f; + } + + State->Late.DensityGain[0] = 0.0f; + State->Late.DensityGain[1] = 0.0f; + for(i = 0;i < NUM_LINES;i++) + { + State->Late.T60[i].MidGain[0] = 0.0f; + State->Late.T60[i].MidGain[1] = 0.0f; + BiquadFilter_clear(&State->Late.T60[i].HFFilter); + BiquadFilter_clear(&State->Late.T60[i].LFFilter); + } + + for(i = 0;i < NUM_LINES;i++) + { + for(j = 0;j < MAX_OUTPUT_CHANNELS;j++) + { + State->Early.CurrentGain[i][j] = 0.0f; + State->Early.PanGain[i][j] = 0.0f; + State->Late.CurrentGain[i][j] = 0.0f; + State->Late.PanGain[i][j] = 0.0f; + } + } + + /* Reset counters and offset base. */ + State->FadeCount = 0; + State->MaxUpdate[0] = MAX_UPDATE_SAMPLES; + State->MaxUpdate[1] = MAX_UPDATE_SAMPLES; + State->Offset = 0; + + return AL_TRUE; +} + +/************************************** + * Effect Update * + **************************************/ + +/* Calculate a decay coefficient given the length of each cycle and the time + * until the decay reaches -60 dB. + */ +static inline ALfloat CalcDecayCoeff(const ALfloat length, const ALfloat decayTime) +{ + return powf(REVERB_DECAY_GAIN, length/decayTime); +} + +/* Calculate a decay length from a coefficient and the time until the decay + * reaches -60 dB. + */ +static inline ALfloat CalcDecayLength(const ALfloat coeff, const ALfloat decayTime) +{ + return log10f(coeff) * decayTime / log10f(REVERB_DECAY_GAIN); +} + +/* Calculate an attenuation to be applied to the input of any echo models to + * compensate for modal density and decay time. + */ +static inline ALfloat CalcDensityGain(const ALfloat a) +{ + /* The energy of a signal can be obtained by finding the area under the + * squared signal. This takes the form of Sum(x_n^2), where x is the + * amplitude for the sample n. + * + * Decaying feedback matches exponential decay of the form Sum(a^n), + * where a is the attenuation coefficient, and n is the sample. The area + * under this decay curve can be calculated as: 1 / (1 - a). + * + * Modifying the above equation to find the area under the squared curve + * (for energy) yields: 1 / (1 - a^2). Input attenuation can then be + * calculated by inverting the square root of this approximation, + * yielding: 1 / sqrt(1 / (1 - a^2)), simplified to: sqrt(1 - a^2). + */ + return sqrtf(1.0f - a*a); +} + +/* Calculate the scattering matrix coefficients given a diffusion factor. */ +static inline ALvoid CalcMatrixCoeffs(const ALfloat diffusion, ALfloat *x, ALfloat *y) +{ + ALfloat n, t; + + /* The matrix is of order 4, so n is sqrt(4 - 1). */ + n = sqrtf(3.0f); + t = diffusion * atanf(n); + + /* Calculate the first mixing matrix coefficient. */ + *x = cosf(t); + /* Calculate the second mixing matrix coefficient. */ + *y = sinf(t) / n; +} + +/* Calculate the limited HF ratio for use with the late reverb low-pass + * filters. + */ +static ALfloat CalcLimitedHfRatio(const ALfloat hfRatio, const ALfloat airAbsorptionGainHF, + const ALfloat decayTime, const ALfloat SpeedOfSound) +{ + ALfloat limitRatio; + + /* Find the attenuation due to air absorption in dB (converting delay + * time to meters using the speed of sound). Then reversing the decay + * equation, solve for HF ratio. The delay length is cancelled out of + * the equation, so it can be calculated once for all lines. + */ + limitRatio = 1.0f / (CalcDecayLength(airAbsorptionGainHF, decayTime) * SpeedOfSound); + + /* Using the limit calculated above, apply the upper bound to the HF ratio. + */ + return minf(limitRatio, hfRatio); +} + + +/* Calculates the 3-band T60 damping coefficients for a particular delay line + * of specified length, using a combination of two shelf filter sections given + * decay times for each band split at two reference frequencies. + */ +static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime, + const ALfloat mfDecayTime, const ALfloat hfDecayTime, + const ALfloat lf0norm, const ALfloat hf0norm, + T60Filter *filter) +{ + ALfloat lfGain = CalcDecayCoeff(length, lfDecayTime); + ALfloat mfGain = CalcDecayCoeff(length, mfDecayTime); + ALfloat hfGain = CalcDecayCoeff(length, hfDecayTime); + + filter->MidGain[1] = mfGain; + BiquadFilter_setParams(&filter->LFFilter, BiquadType_LowShelf, lfGain/mfGain, lf0norm, + calc_rcpQ_from_slope(lfGain/mfGain, 1.0f)); + BiquadFilter_setParams(&filter->HFFilter, BiquadType_HighShelf, hfGain/mfGain, hf0norm, + calc_rcpQ_from_slope(hfGain/mfGain, 1.0f)); +} + +/* Update the offsets for the main effect delay line. */ +static ALvoid UpdateDelayLine(const ALfloat earlyDelay, const ALfloat lateDelay, const ALfloat density, const ALfloat decayTime, const ALuint frequency, ReverbState *State) +{ + ALfloat multiplier, length; + ALuint i; + + multiplier = CalcDelayLengthMult(density); + + /* Early reflection taps are decorrelated by means of an average room + * reflection approximation described above the definition of the taps. + * This approximation is linear and so the above density multiplier can + * be applied to adjust the width of the taps. A single-band decay + * coefficient is applied to simulate initial attenuation and absorption. + * + * Late reverb taps are based on the late line lengths to allow a zero- + * delay path and offsets that would continue the propagation naturally + * into the late lines. + */ + for(i = 0;i < NUM_LINES;i++) + { + length = earlyDelay + EARLY_TAP_LENGTHS[i]*multiplier; + State->EarlyDelayTap[i][1] = float2int(length * frequency); + + length = EARLY_TAP_LENGTHS[i]*multiplier; + State->EarlyDelayCoeff[i][1] = CalcDecayCoeff(length, decayTime); + + length = lateDelay + (LATE_LINE_LENGTHS[i] - LATE_LINE_LENGTHS[0])*0.25f*multiplier; + State->LateDelayTap[i][1] = State->LateFeedTap + float2int(length * frequency); + } +} + +/* Update the early reflection line lengths and gain coefficients. */ +static ALvoid UpdateEarlyLines(const ALfloat density, const ALfloat diffusion, const ALfloat decayTime, const ALuint frequency, EarlyReflections *Early) +{ + ALfloat multiplier, length; + ALsizei i; + + multiplier = CalcDelayLengthMult(density); + + /* Calculate the all-pass feed-back/forward coefficient. */ + Early->VecAp.Coeff = sqrtf(0.5f) * powf(diffusion, 2.0f); + + for(i = 0;i < NUM_LINES;i++) + { + /* Calculate the length (in seconds) of each all-pass line. */ + length = EARLY_ALLPASS_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each all-pass line. */ + Early->VecAp.Offset[i][1] = float2int(length * frequency); + + /* Calculate the length (in seconds) of each delay line. */ + length = EARLY_LINE_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each delay line. */ + Early->Offset[i][1] = float2int(length * frequency); + + /* Calculate the gain (coefficient) for each line. */ + Early->Coeff[i][1] = CalcDecayCoeff(length, decayTime); + } +} + +/* Update the late reverb line lengths and T60 coefficients. */ +static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, const ALfloat lfDecayTime, const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lf0norm, const ALfloat hf0norm, const ALuint frequency, LateReverb *Late) +{ + /* Scaling factor to convert the normalized reference frequencies from + * representing 0...freq to 0...max_reference. + */ + const ALfloat norm_weight_factor = (ALfloat)frequency / AL_EAXREVERB_MAX_HFREFERENCE; + ALfloat multiplier, length, bandWeights[3]; + ALsizei i; + + /* To compensate for changes in modal density and decay time of the late + * reverb signal, the input is attenuated based on the maximal energy of + * the outgoing signal. This approximation is used to keep the apparent + * energy of the signal equal for all ranges of density and decay time. + * + * The average length of the delay lines is used to calculate the + * attenuation coefficient. + */ + multiplier = CalcDelayLengthMult(density); + length = (LATE_LINE_LENGTHS[0] + LATE_LINE_LENGTHS[1] + + LATE_LINE_LENGTHS[2] + LATE_LINE_LENGTHS[3]) / 4.0f * multiplier; + length += (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + + LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f * multiplier; + /* The density gain calculation uses an average decay time weighted by + * approximate bandwidth. This attempts to compensate for losses of energy + * that reduce decay time due to scattering into highly attenuated bands. + */ + bandWeights[0] = lf0norm*norm_weight_factor; + bandWeights[1] = hf0norm*norm_weight_factor - lf0norm*norm_weight_factor; + bandWeights[2] = 1.0f - hf0norm*norm_weight_factor; + Late->DensityGain[1] = CalcDensityGain( + CalcDecayCoeff(length, + bandWeights[0]*lfDecayTime + bandWeights[1]*mfDecayTime + bandWeights[2]*hfDecayTime + ) + ); + + /* Calculate the all-pass feed-back/forward coefficient. */ + Late->VecAp.Coeff = sqrtf(0.5f) * powf(diffusion, 2.0f); + + for(i = 0;i < NUM_LINES;i++) + { + /* Calculate the length (in seconds) of each all-pass line. */ + length = LATE_ALLPASS_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each all-pass line. */ + Late->VecAp.Offset[i][1] = float2int(length * frequency); + + /* Calculate the length (in seconds) of each delay line. */ + length = LATE_LINE_LENGTHS[i] * multiplier; + + /* Calculate the delay offset for each delay line. */ + Late->Offset[i][1] = float2int(length*frequency + 0.5f); + + /* Approximate the absorption that the vector all-pass would exhibit + * given the current diffusion so we don't have to process a full T60 + * filter for each of its four lines. + */ + length += lerp(LATE_ALLPASS_LENGTHS[i], + (LATE_ALLPASS_LENGTHS[0] + LATE_ALLPASS_LENGTHS[1] + + LATE_ALLPASS_LENGTHS[2] + LATE_ALLPASS_LENGTHS[3]) / 4.0f, + diffusion) * multiplier; + + /* Calculate the T60 damping coefficients for each line. */ + CalcT60DampingCoeffs(length, lfDecayTime, mfDecayTime, hfDecayTime, + lf0norm, hf0norm, &Late->T60[i]); + } +} + +/* Creates a transform matrix given a reverb vector. The vector pans the reverb + * reflections toward the given direction, using its magnitude (up to 1) as a + * focal strength. This function results in a B-Format transformation matrix + * that spatially focuses the signal in the desired direction. + */ +static aluMatrixf GetTransformFromVector(const ALfloat *vec) +{ + aluMatrixf focus; + ALfloat norm[3]; + ALfloat mag; + + /* Normalize the panning vector according to the N3D scale, which has an + * extra sqrt(3) term on the directional components. Converting from OpenAL + * to B-Format also requires negating X (ACN 1) and Z (ACN 3). Note however + * that the reverb panning vectors use left-handed coordinates, unlike the + * rest of OpenAL which use right-handed. This is fixed by negating Z, + * which cancels out with the B-Format Z negation. + */ + mag = sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); + if(mag > 1.0f) + { + norm[0] = vec[0] / mag * -SQRTF_3; + norm[1] = vec[1] / mag * SQRTF_3; + norm[2] = vec[2] / mag * SQRTF_3; + mag = 1.0f; + } + else + { + /* If the magnitude is less than or equal to 1, just apply the sqrt(3) + * term. There's no need to renormalize the magnitude since it would + * just be reapplied in the matrix. + */ + norm[0] = vec[0] * -SQRTF_3; + norm[1] = vec[1] * SQRTF_3; + norm[2] = vec[2] * SQRTF_3; + } + + aluMatrixfSet(&focus, + 1.0f, 0.0f, 0.0f, 0.0f, + norm[0], 1.0f-mag, 0.0f, 0.0f, + norm[1], 0.0f, 1.0f-mag, 0.0f, + norm[2], 0.0f, 0.0f, 1.0f-mag + ); + + return focus; +} + +/* Update the early and late 3D panning gains. */ +static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, const ALfloat earlyGain, const ALfloat lateGain, ReverbState *State) +{ + aluMatrixf transform, rot; + ALsizei i; + + STATIC_CAST(ALeffectState,State)->OutBuffer = Device->FOAOut.Buffer; + STATIC_CAST(ALeffectState,State)->OutChannels = Device->FOAOut.NumChannels; + + /* Note: _res is transposed. */ +#define MATRIX_MULT(_res, _m1, _m2) do { \ + int row, col; \ + for(col = 0;col < 4;col++) \ + { \ + for(row = 0;row < 4;row++) \ + _res.m[col][row] = _m1.m[row][0]*_m2.m[0][col] + _m1.m[row][1]*_m2.m[1][col] + \ + _m1.m[row][2]*_m2.m[2][col] + _m1.m[row][3]*_m2.m[3][col]; \ + } \ +} while(0) + /* Create a matrix that first converts A-Format to B-Format, then + * transforms the B-Format signal according to the panning vector. + */ + rot = GetTransformFromVector(ReflectionsPan); + MATRIX_MULT(transform, rot, A2B); + memset(&State->Early.PanGain, 0, sizeof(State->Early.PanGain)); + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + ComputePanGains(&Device->FOAOut, transform.m[i], earlyGain, + State->Early.PanGain[i]); + + rot = GetTransformFromVector(LateReverbPan); + MATRIX_MULT(transform, rot, A2B); + memset(&State->Late.PanGain, 0, sizeof(State->Late.PanGain)); + for(i = 0;i < MAX_EFFECT_CHANNELS;i++) + ComputePanGains(&Device->FOAOut, transform.m[i], lateGain, + State->Late.PanGain[i]); +#undef MATRIX_MULT +} + +static void ReverbState_update(ReverbState *State, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props) +{ + const ALCdevice *Device = Context->Device; + const ALlistener *Listener = Context->Listener; + ALuint frequency = Device->Frequency; + ALfloat lf0norm, hf0norm, hfRatio; + ALfloat lfDecayTime, hfDecayTime; + ALfloat gain, gainlf, gainhf; + ALsizei i; + + /* Calculate the master filters */ + hf0norm = minf(props->Reverb.HFReference / frequency, 0.49f); + /* Restrict the filter gains from going below -60dB to keep the filter from + * killing most of the signal. + */ + gainhf = maxf(props->Reverb.GainHF, 0.001f); + BiquadFilter_setParams(&State->Filter[0].Lp, BiquadType_HighShelf, gainhf, hf0norm, + calc_rcpQ_from_slope(gainhf, 1.0f)); + lf0norm = minf(props->Reverb.LFReference / frequency, 0.49f); + gainlf = maxf(props->Reverb.GainLF, 0.001f); + BiquadFilter_setParams(&State->Filter[0].Hp, BiquadType_LowShelf, gainlf, lf0norm, + calc_rcpQ_from_slope(gainlf, 1.0f)); + for(i = 1;i < NUM_LINES;i++) + { + BiquadFilter_copyParams(&State->Filter[i].Lp, &State->Filter[0].Lp); + BiquadFilter_copyParams(&State->Filter[i].Hp, &State->Filter[0].Hp); + } + + /* Update the main effect delay and associated taps. */ + UpdateDelayLine(props->Reverb.ReflectionsDelay, props->Reverb.LateReverbDelay, + props->Reverb.Density, props->Reverb.DecayTime, frequency, + State); + + /* Update the early lines. */ + UpdateEarlyLines(props->Reverb.Density, props->Reverb.Diffusion, + props->Reverb.DecayTime, frequency, &State->Early); + + /* Get the mixing matrix coefficients. */ + CalcMatrixCoeffs(props->Reverb.Diffusion, &State->MixX, &State->MixY); + + /* If the HF limit parameter is flagged, calculate an appropriate limit + * based on the air absorption parameter. + */ + hfRatio = props->Reverb.DecayHFRatio; + if(props->Reverb.DecayHFLimit && props->Reverb.AirAbsorptionGainHF < 1.0f) + hfRatio = CalcLimitedHfRatio(hfRatio, props->Reverb.AirAbsorptionGainHF, + props->Reverb.DecayTime, Listener->Params.ReverbSpeedOfSound + ); + + /* Calculate the LF/HF decay times. */ + lfDecayTime = clampf(props->Reverb.DecayTime * props->Reverb.DecayLFRatio, + AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); + hfDecayTime = clampf(props->Reverb.DecayTime * hfRatio, + AL_EAXREVERB_MIN_DECAY_TIME, AL_EAXREVERB_MAX_DECAY_TIME); + + /* Update the late lines. */ + UpdateLateLines(props->Reverb.Density, props->Reverb.Diffusion, + lfDecayTime, props->Reverb.DecayTime, hfDecayTime, lf0norm, hf0norm, + frequency, &State->Late + ); + + /* Update early and late 3D panning. */ + gain = props->Reverb.Gain * Slot->Params.Gain * ReverbBoost; + Update3DPanning(Device, props->Reverb.ReflectionsPan, props->Reverb.LateReverbPan, + props->Reverb.ReflectionsGain*gain, props->Reverb.LateReverbGain*gain, + State); + + /* Calculate the max update size from the smallest relevant delay. */ + State->MaxUpdate[1] = mini(MAX_UPDATE_SAMPLES, + mini(State->Early.Offset[0][1], State->Late.Offset[0][1]) + ); + + /* Determine if delay-line cross-fading is required. Density is essentially + * a master control for the feedback delays, so changes the offsets of many + * delay lines. + */ + if(State->Params.Density != props->Reverb.Density || + /* Diffusion and decay times influences the decay rate (gain) of the + * late reverb T60 filter. + */ + State->Params.Diffusion != props->Reverb.Diffusion || + State->Params.DecayTime != props->Reverb.DecayTime || + State->Params.HFDecayTime != hfDecayTime || + State->Params.LFDecayTime != lfDecayTime || + /* HF/LF References control the weighting used to calculate the density + * gain. + */ + State->Params.HFReference != props->Reverb.HFReference || + State->Params.LFReference != props->Reverb.LFReference) + State->FadeCount = 0; + State->Params.Density = props->Reverb.Density; + State->Params.Diffusion = props->Reverb.Diffusion; + State->Params.DecayTime = props->Reverb.DecayTime; + State->Params.HFDecayTime = hfDecayTime; + State->Params.LFDecayTime = lfDecayTime; + State->Params.HFReference = props->Reverb.HFReference; + State->Params.LFReference = props->Reverb.LFReference; +} + + +/************************************** + * Effect Processing * + **************************************/ + +/* Basic delay line input/output routines. */ +static inline ALfloat DelayLineOut(const DelayLineI *Delay, const ALsizei offset, const ALsizei c) +{ + return Delay->Line[offset&Delay->Mask][c]; +} + +/* Cross-faded delay line output routine. Instead of interpolating the + * offsets, this interpolates (cross-fades) the outputs at each offset. + */ +static inline ALfloat FadedDelayLineOut(const DelayLineI *Delay, const ALsizei off0, + const ALsizei off1, const ALsizei c, + const ALfloat sc0, const ALfloat sc1) +{ + return Delay->Line[off0&Delay->Mask][c]*sc0 + + Delay->Line[off1&Delay->Mask][c]*sc1; +} + + +static inline void DelayLineIn(const DelayLineI *Delay, ALsizei offset, const ALsizei c, + const ALfloat *restrict in, ALsizei count) +{ + ALsizei i; + for(i = 0;i < count;i++) + Delay->Line[(offset++)&Delay->Mask][c] = *(in++); +} + +/* Applies a scattering matrix to the 4-line (vector) input. This is used + * for both the below vector all-pass model and to perform modal feed-back + * delay network (FDN) mixing. + * + * The matrix is derived from a skew-symmetric matrix to form a 4D rotation + * matrix with a single unitary rotational parameter: + * + * [ d, a, b, c ] 1 = a^2 + b^2 + c^2 + d^2 + * [ -a, d, c, -b ] + * [ -b, -c, d, a ] + * [ -c, b, -a, d ] + * + * The rotation is constructed from the effect's diffusion parameter, + * yielding: + * + * 1 = x^2 + 3 y^2 + * + * Where a, b, and c are the coefficient y with differing signs, and d is the + * coefficient x. The final matrix is thus: + * + * [ x, y, -y, y ] n = sqrt(matrix_order - 1) + * [ -y, x, y, y ] t = diffusion_parameter * atan(n) + * [ y, -y, x, y ] x = cos(t) + * [ -y, -y, -y, x ] y = sin(t) / n + * + * Any square orthogonal matrix with an order that is a power of two will + * work (where ^T is transpose, ^-1 is inverse): + * + * M^T = M^-1 + * + * Using that knowledge, finding an appropriate matrix can be accomplished + * naively by searching all combinations of: + * + * M = D + S - S^T + * + * Where D is a diagonal matrix (of x), and S is a triangular matrix (of y) + * whose combination of signs are being iterated. + */ +static inline void VectorPartialScatter(ALfloat *restrict out, const ALfloat *restrict in, + const ALfloat xCoeff, const ALfloat yCoeff) +{ + out[0] = xCoeff*in[0] + yCoeff*( in[1] + -in[2] + in[3]); + out[1] = xCoeff*in[1] + yCoeff*(-in[0] + in[2] + in[3]); + out[2] = xCoeff*in[2] + yCoeff*( in[0] + -in[1] + in[3]); + out[3] = xCoeff*in[3] + yCoeff*(-in[0] + -in[1] + -in[2] ); +} +#define VectorScatterDelayIn(delay, o, in, xcoeff, ycoeff) \ + VectorPartialScatter((delay)->Line[(o)&(delay)->Mask], in, xcoeff, ycoeff) + +/* Utilizes the above, but reverses the input channels. */ +static inline void VectorScatterRevDelayIn(const DelayLineI *Delay, ALint offset, + const ALfloat xCoeff, const ALfloat yCoeff, + const ALfloat (*restrict in)[MAX_UPDATE_SAMPLES], + const ALsizei count) +{ + const DelayLineI delay = *Delay; + ALsizei i, j; + + for(i = 0;i < count;++i) + { + ALfloat f[NUM_LINES]; + for(j = 0;j < NUM_LINES;j++) + f[NUM_LINES-1-j] = in[j][i]; + + VectorScatterDelayIn(&delay, offset++, f, xCoeff, yCoeff); + } +} + +/* This applies a Gerzon multiple-in/multiple-out (MIMO) vector all-pass + * filter to the 4-line input. + * + * It works by vectorizing a regular all-pass filter and replacing the delay + * element with a scattering matrix (like the one above) and a diagonal + * matrix of delay elements. + * + * Two static specializations are used for transitional (cross-faded) delay + * line processing and non-transitional processing. + */ +static void VectorAllpass_Unfaded(ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES], ALsizei offset, + const ALfloat xCoeff, const ALfloat yCoeff, ALsizei todo, + VecAllpass *Vap) +{ + const DelayLineI delay = Vap->Delay; + const ALfloat feedCoeff = Vap->Coeff; + ALsizei vap_offset[NUM_LINES]; + ALsizei i, j; + + ASSUME(todo > 0); + + for(j = 0;j < NUM_LINES;j++) + vap_offset[j] = offset-Vap->Offset[j][0]; + for(i = 0;i < todo;i++) + { + ALfloat f[NUM_LINES]; + + for(j = 0;j < NUM_LINES;j++) + { + ALfloat input = samples[j][i]; + ALfloat out = DelayLineOut(&delay, vap_offset[j]++, j) - feedCoeff*input; + f[j] = input + feedCoeff*out; + + samples[j][i] = out; + } + + VectorScatterDelayIn(&delay, offset, f, xCoeff, yCoeff); + ++offset; + } +} +static void VectorAllpass_Faded(ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES], ALsizei offset, + const ALfloat xCoeff, const ALfloat yCoeff, ALfloat fade, + ALsizei todo, VecAllpass *Vap) +{ + const DelayLineI delay = Vap->Delay; + const ALfloat feedCoeff = Vap->Coeff; + ALsizei vap_offset[NUM_LINES][2]; + ALsizei i, j; + + ASSUME(todo > 0); + + fade *= 1.0f/FADE_SAMPLES; + for(j = 0;j < NUM_LINES;j++) + { + vap_offset[j][0] = offset-Vap->Offset[j][0]; + vap_offset[j][1] = offset-Vap->Offset[j][1]; + } + for(i = 0;i < todo;i++) + { + ALfloat f[NUM_LINES]; + + for(j = 0;j < NUM_LINES;j++) + { + ALfloat input = samples[j][i]; + ALfloat out = + FadedDelayLineOut(&delay, vap_offset[j][0]++, vap_offset[j][1]++, j, + 1.0f-fade, fade + ) - feedCoeff*input; + f[j] = input + feedCoeff*out; + + samples[j][i] = out; + } + fade += FadeStep; + + VectorScatterDelayIn(&delay, offset, f, xCoeff, yCoeff); + ++offset; + } +} + +/* This generates early reflections. + * + * This is done by obtaining the primary reflections (those arriving from the + * same direction as the source) from the main delay line. These are + * attenuated and all-pass filtered (based on the diffusion parameter). + * + * The early lines are then fed in reverse (according to the approximately + * opposite spatial location of the A-Format lines) to create the secondary + * reflections (those arriving from the opposite direction as the source). + * + * The early response is then completed by combining the primary reflections + * with the delayed and attenuated output from the early lines. + * + * Finally, the early response is reversed, scattered (based on diffusion), + * and fed into the late reverb section of the main delay line. + * + * Two static specializations are used for transitional (cross-faded) delay + * line processing and non-transitional processing. + */ +static void EarlyReflection_Unfaded(ReverbState *State, ALsizei offset, const ALsizei todo, + ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) +{ + ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; + const DelayLineI early_delay = State->Early.Delay; + const DelayLineI main_delay = State->Delay; + const ALfloat mixX = State->MixX; + const ALfloat mixY = State->MixY; + ALsizei late_feed_tap; + ALsizei i, j; + + ASSUME(todo > 0); + + /* First, load decorrelated samples from the main delay line as the primary + * reflections. + */ + for(j = 0;j < NUM_LINES;j++) + { + ALsizei early_delay_tap = offset - State->EarlyDelayTap[j][0]; + ALfloat coeff = State->EarlyDelayCoeff[j][0]; + for(i = 0;i < todo;i++) + temps[j][i] = DelayLineOut(&main_delay, early_delay_tap++, j) * coeff; + } + + /* Apply a vector all-pass, to help color the initial reflections based on + * the diffusion strength. + */ + VectorAllpass_Unfaded(temps, offset, mixX, mixY, todo, &State->Early.VecAp); + + /* Apply a delay and bounce to generate secondary reflections, combine with + * the primary reflections and write out the result for mixing. + */ + for(j = 0;j < NUM_LINES;j++) + { + ALint early_feedb_tap = offset - State->Early.Offset[j][0]; + ALfloat early_feedb_coeff = State->Early.Coeff[j][0]; + + for(i = 0;i < todo;i++) + out[j][i] = DelayLineOut(&early_delay, early_feedb_tap++, j)*early_feedb_coeff + + temps[j][i]; + } + for(j = 0;j < NUM_LINES;j++) + DelayLineIn(&early_delay, offset, NUM_LINES-1-j, temps[j], todo); + + /* Also write the result back to the main delay line for the late reverb + * stage to pick up at the appropriate time, appplying a scatter and + * bounce to improve the initial diffusion in the late reverb. + */ + late_feed_tap = offset - State->LateFeedTap; + VectorScatterRevDelayIn(&main_delay, late_feed_tap, mixX, mixY, out, todo); +} +static void EarlyReflection_Faded(ReverbState *State, ALsizei offset, const ALsizei todo, + const ALfloat fade, ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) +{ + ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; + const DelayLineI early_delay = State->Early.Delay; + const DelayLineI main_delay = State->Delay; + const ALfloat mixX = State->MixX; + const ALfloat mixY = State->MixY; + ALsizei late_feed_tap; + ALsizei i, j; + + ASSUME(todo > 0); + + for(j = 0;j < NUM_LINES;j++) + { + ALsizei early_delay_tap0 = offset - State->EarlyDelayTap[j][0]; + ALsizei early_delay_tap1 = offset - State->EarlyDelayTap[j][1]; + ALfloat oldCoeff = State->EarlyDelayCoeff[j][0]; + ALfloat oldCoeffStep = -oldCoeff / FADE_SAMPLES; + ALfloat newCoeffStep = State->EarlyDelayCoeff[j][1] / FADE_SAMPLES; + ALfloat fadeCount = fade; + + for(i = 0;i < todo;i++) + { + const ALfloat fade0 = oldCoeff + oldCoeffStep*fadeCount; + const ALfloat fade1 = newCoeffStep*fadeCount; + temps[j][i] = FadedDelayLineOut(&main_delay, + early_delay_tap0++, early_delay_tap1++, j, fade0, fade1 + ); + fadeCount += 1.0f; + } + } + + VectorAllpass_Faded(temps, offset, mixX, mixY, fade, todo, &State->Early.VecAp); + + for(j = 0;j < NUM_LINES;j++) + { + ALint feedb_tap0 = offset - State->Early.Offset[j][0]; + ALint feedb_tap1 = offset - State->Early.Offset[j][1]; + ALfloat feedb_oldCoeff = State->Early.Coeff[j][0]; + ALfloat feedb_oldCoeffStep = -feedb_oldCoeff / FADE_SAMPLES; + ALfloat feedb_newCoeffStep = State->Early.Coeff[j][1] / FADE_SAMPLES; + ALfloat fadeCount = fade; + + for(i = 0;i < todo;i++) + { + const ALfloat fade0 = feedb_oldCoeff + feedb_oldCoeffStep*fadeCount; + const ALfloat fade1 = feedb_newCoeffStep*fadeCount; + out[j][i] = FadedDelayLineOut(&early_delay, + feedb_tap0++, feedb_tap1++, j, fade0, fade1 + ) + temps[j][i]; + fadeCount += 1.0f; + } + } + for(j = 0;j < NUM_LINES;j++) + DelayLineIn(&early_delay, offset, NUM_LINES-1-j, temps[j], todo); + + late_feed_tap = offset - State->LateFeedTap; + VectorScatterRevDelayIn(&main_delay, late_feed_tap, mixX, mixY, out, todo); +} + +/* Applies the two T60 damping filter sections. */ +static inline void LateT60Filter(ALfloat *restrict samples, const ALsizei todo, T60Filter *filter) +{ + ALfloat temp[MAX_UPDATE_SAMPLES]; + BiquadFilter_process(&filter->HFFilter, temp, samples, todo); + BiquadFilter_process(&filter->LFFilter, samples, temp, todo); +} + +/* This generates the reverb tail using a modified feed-back delay network + * (FDN). + * + * Results from the early reflections are mixed with the output from the late + * delay lines. + * + * The late response is then completed by T60 and all-pass filtering the mix. + * + * Finally, the lines are reversed (so they feed their opposite directions) + * and scattered with the FDN matrix before re-feeding the delay lines. + * + * Two variations are made, one for for transitional (cross-faded) delay line + * processing and one for non-transitional processing. + */ +static void LateReverb_Unfaded(ReverbState *State, ALsizei offset, const ALsizei todo, + ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) +{ + ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; + const DelayLineI late_delay = State->Late.Delay; + const DelayLineI main_delay = State->Delay; + const ALfloat mixX = State->MixX; + const ALfloat mixY = State->MixY; + ALsizei i, j; + + ASSUME(todo > 0); + + /* First, load decorrelated samples from the main and feedback delay lines. + * Filter the signal to apply its frequency-dependent decay. + */ + for(j = 0;j < NUM_LINES;j++) + { + ALsizei late_delay_tap = offset - State->LateDelayTap[j][0]; + ALsizei late_feedb_tap = offset - State->Late.Offset[j][0]; + ALfloat midGain = State->Late.T60[j].MidGain[0]; + const ALfloat densityGain = State->Late.DensityGain[0] * midGain; + for(i = 0;i < todo;i++) + temps[j][i] = DelayLineOut(&main_delay, late_delay_tap++, j)*densityGain + + DelayLineOut(&late_delay, late_feedb_tap++, j)*midGain; + LateT60Filter(temps[j], todo, &State->Late.T60[j]); + } + + /* Apply a vector all-pass to improve micro-surface diffusion, and write + * out the results for mixing. + */ + VectorAllpass_Unfaded(temps, offset, mixX, mixY, todo, &State->Late.VecAp); + + for(j = 0;j < NUM_LINES;j++) + memcpy(out[j], temps[j], todo*sizeof(ALfloat)); + + /* Finally, scatter and bounce the results to refeed the feedback buffer. */ + VectorScatterRevDelayIn(&late_delay, offset, mixX, mixY, out, todo); +} +static void LateReverb_Faded(ReverbState *State, ALsizei offset, const ALsizei todo, + const ALfloat fade, ALfloat (*restrict out)[MAX_UPDATE_SAMPLES]) +{ + ALfloat (*restrict temps)[MAX_UPDATE_SAMPLES] = State->TempSamples; + const DelayLineI late_delay = State->Late.Delay; + const DelayLineI main_delay = State->Delay; + const ALfloat mixX = State->MixX; + const ALfloat mixY = State->MixY; + ALsizei i, j; + + ASSUME(todo > 0); + + for(j = 0;j < NUM_LINES;j++) + { + const ALfloat oldMidGain = State->Late.T60[j].MidGain[0]; + const ALfloat midGain = State->Late.T60[j].MidGain[1]; + const ALfloat oldMidStep = -oldMidGain / FADE_SAMPLES; + const ALfloat midStep = midGain / FADE_SAMPLES; + const ALfloat oldDensityGain = State->Late.DensityGain[0] * oldMidGain; + const ALfloat densityGain = State->Late.DensityGain[1] * midGain; + const ALfloat oldDensityStep = -oldDensityGain / FADE_SAMPLES; + const ALfloat densityStep = densityGain / FADE_SAMPLES; + ALsizei late_delay_tap0 = offset - State->LateDelayTap[j][0]; + ALsizei late_delay_tap1 = offset - State->LateDelayTap[j][1]; + ALsizei late_feedb_tap0 = offset - State->Late.Offset[j][0]; + ALsizei late_feedb_tap1 = offset - State->Late.Offset[j][1]; + ALfloat fadeCount = fade; + + for(i = 0;i < todo;i++) + { + const ALfloat fade0 = oldDensityGain + oldDensityStep*fadeCount; + const ALfloat fade1 = densityStep*fadeCount; + const ALfloat gfade0 = oldMidGain + oldMidStep*fadeCount; + const ALfloat gfade1 = midStep*fadeCount; + temps[j][i] = + FadedDelayLineOut(&main_delay, late_delay_tap0++, late_delay_tap1++, j, + fade0, fade1) + + FadedDelayLineOut(&late_delay, late_feedb_tap0++, late_feedb_tap1++, j, + gfade0, gfade1); + fadeCount += 1.0f; + } + LateT60Filter(temps[j], todo, &State->Late.T60[j]); + } + + VectorAllpass_Faded(temps, offset, mixX, mixY, fade, todo, &State->Late.VecAp); + + for(j = 0;j < NUM_LINES;j++) + memcpy(out[j], temps[j], todo*sizeof(ALfloat)); + + VectorScatterRevDelayIn(&late_delay, offset, mixX, mixY, temps, todo); +} + +static ALvoid ReverbState_process(ReverbState *State, ALsizei SamplesToDo, const ALfloat (*restrict SamplesIn)[BUFFERSIZE], ALfloat (*restrict SamplesOut)[BUFFERSIZE], ALsizei NumChannels) +{ + ALfloat (*restrict afmt)[MAX_UPDATE_SAMPLES] = State->TempSamples; + ALfloat (*restrict samples)[MAX_UPDATE_SAMPLES] = State->MixSamples; + ALsizei fadeCount = State->FadeCount; + ALsizei offset = State->Offset; + ALsizei base, c; + + /* Process reverb for these samples. */ + for(base = 0;base < SamplesToDo;) + { + ALsizei todo = SamplesToDo - base; + /* If cross-fading, don't do more samples than there are to fade. */ + if(FADE_SAMPLES-fadeCount > 0) + { + todo = mini(todo, FADE_SAMPLES-fadeCount); + todo = mini(todo, State->MaxUpdate[0]); + } + todo = mini(todo, State->MaxUpdate[1]); + /* If this is not the final update, ensure the update size is a + * multiple of 4 for the SIMD mixers. + */ + if(todo < SamplesToDo-base) + todo &= ~3; + + /* Convert B-Format to A-Format for processing. */ + memset(afmt, 0, sizeof(*afmt)*NUM_LINES); + for(c = 0;c < NUM_LINES;c++) + MixRowSamples(afmt[c], B2A.m[c], + SamplesIn, MAX_EFFECT_CHANNELS, base, todo + ); + + /* Process the samples for reverb. */ + for(c = 0;c < NUM_LINES;c++) + { + /* Band-pass the incoming samples. */ + BiquadFilter_process(&State->Filter[c].Lp, samples[0], afmt[c], todo); + BiquadFilter_process(&State->Filter[c].Hp, samples[1], samples[0], todo); + + /* Feed the initial delay line. */ + DelayLineIn(&State->Delay, offset, c, samples[1], todo); + } + + if(UNLIKELY(fadeCount < FADE_SAMPLES)) + { + ALfloat fade = (ALfloat)fadeCount; + + /* Generate early reflections. */ + EarlyReflection_Faded(State, offset, todo, fade, samples); + /* Mix the A-Format results to output, implicitly converting back + * to B-Format. + */ + for(c = 0;c < NUM_LINES;c++) + MixSamples(samples[c], NumChannels, SamplesOut, + State->Early.CurrentGain[c], State->Early.PanGain[c], + SamplesToDo-base, base, todo + ); + + /* Generate and mix late reverb. */ + LateReverb_Faded(State, offset, todo, fade, samples); + for(c = 0;c < NUM_LINES;c++) + MixSamples(samples[c], NumChannels, SamplesOut, + State->Late.CurrentGain[c], State->Late.PanGain[c], + SamplesToDo-base, base, todo + ); + + /* Step fading forward. */ + fadeCount += todo; + if(LIKELY(fadeCount >= FADE_SAMPLES)) + { + /* Update the cross-fading delay line taps. */ + fadeCount = FADE_SAMPLES; + for(c = 0;c < NUM_LINES;c++) + { + State->EarlyDelayTap[c][0] = State->EarlyDelayTap[c][1]; + State->EarlyDelayCoeff[c][0] = State->EarlyDelayCoeff[c][1]; + State->Early.VecAp.Offset[c][0] = State->Early.VecAp.Offset[c][1]; + State->Early.Offset[c][0] = State->Early.Offset[c][1]; + State->Early.Coeff[c][0] = State->Early.Coeff[c][1]; + State->LateDelayTap[c][0] = State->LateDelayTap[c][1]; + State->Late.VecAp.Offset[c][0] = State->Late.VecAp.Offset[c][1]; + State->Late.Offset[c][0] = State->Late.Offset[c][1]; + State->Late.T60[c].MidGain[0] = State->Late.T60[c].MidGain[1]; + } + State->Late.DensityGain[0] = State->Late.DensityGain[1]; + State->MaxUpdate[0] = State->MaxUpdate[1]; + } + } + else + { + /* Generate and mix early reflections. */ + EarlyReflection_Unfaded(State, offset, todo, samples); + for(c = 0;c < NUM_LINES;c++) + MixSamples(samples[c], NumChannels, SamplesOut, + State->Early.CurrentGain[c], State->Early.PanGain[c], + SamplesToDo-base, base, todo + ); + + /* Generate and mix late reverb. */ + LateReverb_Unfaded(State, offset, todo, samples); + for(c = 0;c < NUM_LINES;c++) + MixSamples(samples[c], NumChannels, SamplesOut, + State->Late.CurrentGain[c], State->Late.PanGain[c], + SamplesToDo-base, base, todo + ); + } + + /* Step all delays forward. */ + offset += todo; + + base += todo; + } + State->Offset = offset; + State->FadeCount = fadeCount; +} + + +typedef struct ReverbStateFactory { + DERIVE_FROM_TYPE(EffectStateFactory); +} ReverbStateFactory; + +static ALeffectState *ReverbStateFactory_create(ReverbStateFactory* UNUSED(factory)) +{ + ReverbState *state; + + NEW_OBJ0(state, ReverbState)(); + if(!state) return NULL; + + return STATIC_CAST(ALeffectState, state); +} + +DEFINE_EFFECTSTATEFACTORY_VTABLE(ReverbStateFactory); + +EffectStateFactory *ReverbStateFactory_getFactory(void) +{ + static ReverbStateFactory ReverbFactory = { { GET_VTABLE2(ReverbStateFactory, EffectStateFactory) } }; + + return STATIC_CAST(EffectStateFactory, &ReverbFactory); +} + + +void ALeaxreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_DECAY_HFLIMIT: + if(!(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hflimit out of range"); + props->Reverb.DecayHFLimit = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", + param); + } +} +void ALeaxreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ ALeaxreverb_setParami(effect, context, param, vals[0]); } +void ALeaxreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_DENSITY: + if(!(val >= AL_EAXREVERB_MIN_DENSITY && val <= AL_EAXREVERB_MAX_DENSITY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb density out of range"); + props->Reverb.Density = val; + break; + + case AL_EAXREVERB_DIFFUSION: + if(!(val >= AL_EAXREVERB_MIN_DIFFUSION && val <= AL_EAXREVERB_MAX_DIFFUSION)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb diffusion out of range"); + props->Reverb.Diffusion = val; + break; + + case AL_EAXREVERB_GAIN: + if(!(val >= AL_EAXREVERB_MIN_GAIN && val <= AL_EAXREVERB_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gain out of range"); + props->Reverb.Gain = val; + break; + + case AL_EAXREVERB_GAINHF: + if(!(val >= AL_EAXREVERB_MIN_GAINHF && val <= AL_EAXREVERB_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainhf out of range"); + props->Reverb.GainHF = val; + break; + + case AL_EAXREVERB_GAINLF: + if(!(val >= AL_EAXREVERB_MIN_GAINLF && val <= AL_EAXREVERB_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb gainlf out of range"); + props->Reverb.GainLF = val; + break; + + case AL_EAXREVERB_DECAY_TIME: + if(!(val >= AL_EAXREVERB_MIN_DECAY_TIME && val <= AL_EAXREVERB_MAX_DECAY_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay time out of range"); + props->Reverb.DecayTime = val; + break; + + case AL_EAXREVERB_DECAY_HFRATIO: + if(!(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO && val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay hfratio out of range"); + props->Reverb.DecayHFRatio = val; + break; + + case AL_EAXREVERB_DECAY_LFRATIO: + if(!(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO && val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb decay lfratio out of range"); + props->Reverb.DecayLFRatio = val; + break; + + case AL_EAXREVERB_REFLECTIONS_GAIN: + if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections gain out of range"); + props->Reverb.ReflectionsGain = val; + break; + + case AL_EAXREVERB_REFLECTIONS_DELAY: + if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections delay out of range"); + props->Reverb.ReflectionsDelay = val; + break; + + case AL_EAXREVERB_LATE_REVERB_GAIN: + if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb gain out of range"); + props->Reverb.LateReverbGain = val; + break; + + case AL_EAXREVERB_LATE_REVERB_DELAY: + if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb delay out of range"); + props->Reverb.LateReverbDelay = val; + break; + + case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: + if(!(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb air absorption gainhf out of range"); + props->Reverb.AirAbsorptionGainHF = val; + break; + + case AL_EAXREVERB_ECHO_TIME: + if(!(val >= AL_EAXREVERB_MIN_ECHO_TIME && val <= AL_EAXREVERB_MAX_ECHO_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo time out of range"); + props->Reverb.EchoTime = val; + break; + + case AL_EAXREVERB_ECHO_DEPTH: + if(!(val >= AL_EAXREVERB_MIN_ECHO_DEPTH && val <= AL_EAXREVERB_MAX_ECHO_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb echo depth out of range"); + props->Reverb.EchoDepth = val; + break; + + case AL_EAXREVERB_MODULATION_TIME: + if(!(val >= AL_EAXREVERB_MIN_MODULATION_TIME && val <= AL_EAXREVERB_MAX_MODULATION_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation time out of range"); + props->Reverb.ModulationTime = val; + break; + + case AL_EAXREVERB_MODULATION_DEPTH: + if(!(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH && val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb modulation depth out of range"); + props->Reverb.ModulationDepth = val; + break; + + case AL_EAXREVERB_HFREFERENCE: + if(!(val >= AL_EAXREVERB_MIN_HFREFERENCE && val <= AL_EAXREVERB_MAX_HFREFERENCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb hfreference out of range"); + props->Reverb.HFReference = val; + break; + + case AL_EAXREVERB_LFREFERENCE: + if(!(val >= AL_EAXREVERB_MIN_LFREFERENCE && val <= AL_EAXREVERB_MAX_LFREFERENCE)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb lfreference out of range"); + props->Reverb.LFReference = val; + break; + + case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: + if(!(val >= AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb room rolloff factor out of range"); + props->Reverb.RoomRolloffFactor = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", + param); + } +} +void ALeaxreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_REFLECTIONS_PAN: + if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb reflections pan out of range"); + props->Reverb.ReflectionsPan[0] = vals[0]; + props->Reverb.ReflectionsPan[1] = vals[1]; + props->Reverb.ReflectionsPan[2] = vals[2]; + break; + case AL_EAXREVERB_LATE_REVERB_PAN: + if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))) + SETERR_RETURN(context, AL_INVALID_VALUE,, "EAX Reverb late reverb pan out of range"); + props->Reverb.LateReverbPan[0] = vals[0]; + props->Reverb.LateReverbPan[1] = vals[1]; + props->Reverb.LateReverbPan[2] = vals[2]; + break; + + default: + ALeaxreverb_setParamf(effect, context, param, vals[0]); + break; + } +} + +void ALeaxreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_DECAY_HFLIMIT: + *val = props->Reverb.DecayHFLimit; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb integer property 0x%04x", + param); + } +} +void ALeaxreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ ALeaxreverb_getParami(effect, context, param, vals); } +void ALeaxreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_DENSITY: + *val = props->Reverb.Density; + break; + + case AL_EAXREVERB_DIFFUSION: + *val = props->Reverb.Diffusion; + break; + + case AL_EAXREVERB_GAIN: + *val = props->Reverb.Gain; + break; + + case AL_EAXREVERB_GAINHF: + *val = props->Reverb.GainHF; + break; + + case AL_EAXREVERB_GAINLF: + *val = props->Reverb.GainLF; + break; + + case AL_EAXREVERB_DECAY_TIME: + *val = props->Reverb.DecayTime; + break; + + case AL_EAXREVERB_DECAY_HFRATIO: + *val = props->Reverb.DecayHFRatio; + break; + + case AL_EAXREVERB_DECAY_LFRATIO: + *val = props->Reverb.DecayLFRatio; + break; + + case AL_EAXREVERB_REFLECTIONS_GAIN: + *val = props->Reverb.ReflectionsGain; + break; + + case AL_EAXREVERB_REFLECTIONS_DELAY: + *val = props->Reverb.ReflectionsDelay; + break; + + case AL_EAXREVERB_LATE_REVERB_GAIN: + *val = props->Reverb.LateReverbGain; + break; + + case AL_EAXREVERB_LATE_REVERB_DELAY: + *val = props->Reverb.LateReverbDelay; + break; + + case AL_EAXREVERB_AIR_ABSORPTION_GAINHF: + *val = props->Reverb.AirAbsorptionGainHF; + break; + + case AL_EAXREVERB_ECHO_TIME: + *val = props->Reverb.EchoTime; + break; + + case AL_EAXREVERB_ECHO_DEPTH: + *val = props->Reverb.EchoDepth; + break; + + case AL_EAXREVERB_MODULATION_TIME: + *val = props->Reverb.ModulationTime; + break; + + case AL_EAXREVERB_MODULATION_DEPTH: + *val = props->Reverb.ModulationDepth; + break; + + case AL_EAXREVERB_HFREFERENCE: + *val = props->Reverb.HFReference; + break; + + case AL_EAXREVERB_LFREFERENCE: + *val = props->Reverb.LFReference; + break; + + case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR: + *val = props->Reverb.RoomRolloffFactor; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid EAX reverb float property 0x%04x", + param); + } +} +void ALeaxreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_EAXREVERB_REFLECTIONS_PAN: + vals[0] = props->Reverb.ReflectionsPan[0]; + vals[1] = props->Reverb.ReflectionsPan[1]; + vals[2] = props->Reverb.ReflectionsPan[2]; + break; + case AL_EAXREVERB_LATE_REVERB_PAN: + vals[0] = props->Reverb.LateReverbPan[0]; + vals[1] = props->Reverb.LateReverbPan[1]; + vals[2] = props->Reverb.LateReverbPan[2]; + break; + + default: + ALeaxreverb_getParamf(effect, context, param, vals); + break; + } +} + +DEFINE_ALEFFECT_VTABLE(ALeaxreverb); + +void ALreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_REVERB_DECAY_HFLIMIT: + if(!(val >= AL_REVERB_MIN_DECAY_HFLIMIT && val <= AL_REVERB_MAX_DECAY_HFLIMIT)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hflimit out of range"); + props->Reverb.DecayHFLimit = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); + } +} +void ALreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals) +{ ALreverb_setParami(effect, context, param, vals[0]); } +void ALreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val) +{ + ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_REVERB_DENSITY: + if(!(val >= AL_REVERB_MIN_DENSITY && val <= AL_REVERB_MAX_DENSITY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb density out of range"); + props->Reverb.Density = val; + break; + + case AL_REVERB_DIFFUSION: + if(!(val >= AL_REVERB_MIN_DIFFUSION && val <= AL_REVERB_MAX_DIFFUSION)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb diffusion out of range"); + props->Reverb.Diffusion = val; + break; + + case AL_REVERB_GAIN: + if(!(val >= AL_REVERB_MIN_GAIN && val <= AL_REVERB_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gain out of range"); + props->Reverb.Gain = val; + break; + + case AL_REVERB_GAINHF: + if(!(val >= AL_REVERB_MIN_GAINHF && val <= AL_REVERB_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb gainhf out of range"); + props->Reverb.GainHF = val; + break; + + case AL_REVERB_DECAY_TIME: + if(!(val >= AL_REVERB_MIN_DECAY_TIME && val <= AL_REVERB_MAX_DECAY_TIME)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay time out of range"); + props->Reverb.DecayTime = val; + break; + + case AL_REVERB_DECAY_HFRATIO: + if(!(val >= AL_REVERB_MIN_DECAY_HFRATIO && val <= AL_REVERB_MAX_DECAY_HFRATIO)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb decay hfratio out of range"); + props->Reverb.DecayHFRatio = val; + break; + + case AL_REVERB_REFLECTIONS_GAIN: + if(!(val >= AL_REVERB_MIN_REFLECTIONS_GAIN && val <= AL_REVERB_MAX_REFLECTIONS_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections gain out of range"); + props->Reverb.ReflectionsGain = val; + break; + + case AL_REVERB_REFLECTIONS_DELAY: + if(!(val >= AL_REVERB_MIN_REFLECTIONS_DELAY && val <= AL_REVERB_MAX_REFLECTIONS_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb reflections delay out of range"); + props->Reverb.ReflectionsDelay = val; + break; + + case AL_REVERB_LATE_REVERB_GAIN: + if(!(val >= AL_REVERB_MIN_LATE_REVERB_GAIN && val <= AL_REVERB_MAX_LATE_REVERB_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb gain out of range"); + props->Reverb.LateReverbGain = val; + break; + + case AL_REVERB_LATE_REVERB_DELAY: + if(!(val >= AL_REVERB_MIN_LATE_REVERB_DELAY && val <= AL_REVERB_MAX_LATE_REVERB_DELAY)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb late reverb delay out of range"); + props->Reverb.LateReverbDelay = val; + break; + + case AL_REVERB_AIR_ABSORPTION_GAINHF: + if(!(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb air absorption gainhf out of range"); + props->Reverb.AirAbsorptionGainHF = val; + break; + + case AL_REVERB_ROOM_ROLLOFF_FACTOR: + if(!(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Reverb room rolloff factor out of range"); + props->Reverb.RoomRolloffFactor = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); + } +} +void ALreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALreverb_setParamf(effect, context, param, vals[0]); } + +void ALreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_REVERB_DECAY_HFLIMIT: + *val = props->Reverb.DecayHFLimit; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid reverb integer property 0x%04x", param); + } +} +void ALreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals) +{ ALreverb_getParami(effect, context, param, vals); } +void ALreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val) +{ + const ALeffectProps *props = &effect->Props; + switch(param) + { + case AL_REVERB_DENSITY: + *val = props->Reverb.Density; + break; + + case AL_REVERB_DIFFUSION: + *val = props->Reverb.Diffusion; + break; + + case AL_REVERB_GAIN: + *val = props->Reverb.Gain; + break; + + case AL_REVERB_GAINHF: + *val = props->Reverb.GainHF; + break; + + case AL_REVERB_DECAY_TIME: + *val = props->Reverb.DecayTime; + break; + + case AL_REVERB_DECAY_HFRATIO: + *val = props->Reverb.DecayHFRatio; + break; + + case AL_REVERB_REFLECTIONS_GAIN: + *val = props->Reverb.ReflectionsGain; + break; + + case AL_REVERB_REFLECTIONS_DELAY: + *val = props->Reverb.ReflectionsDelay; + break; + + case AL_REVERB_LATE_REVERB_GAIN: + *val = props->Reverb.LateReverbGain; + break; + + case AL_REVERB_LATE_REVERB_DELAY: + *val = props->Reverb.LateReverbDelay; + break; + + case AL_REVERB_AIR_ABSORPTION_GAINHF: + *val = props->Reverb.AirAbsorptionGainHF; + break; + + case AL_REVERB_ROOM_ROLLOFF_FACTOR: + *val = props->Reverb.RoomRolloffFactor; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid reverb float property 0x%04x", param); + } +} +void ALreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALreverb_getParamf(effect, context, param, vals); } + +DEFINE_ALEFFECT_VTABLE(ALreverb); diff --git a/love/src/jni/openal-soft-1.19.1/Alc/filters/defs.h b/love/src/jni/openal-soft-1.19.1/Alc/filters/defs.h new file mode 100644 index 00000000..133a85eb --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/defs.h @@ -0,0 +1,112 @@ +#ifndef ALC_FILTER_H +#define ALC_FILTER_H + +#include "AL/al.h" +#include "math_defs.h" + +/* Filters implementation is based on the "Cookbook formulae for audio + * EQ biquad filter coefficients" by Robert Bristow-Johnson + * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt + */ +/* Implementation note: For the shelf filters, the specified gain is for the + * reference frequency, which is the centerpoint of the transition band. This + * better matches EFX filter design. To set the gain for the shelf itself, use + * the square root of the desired linear gain (or halve the dB gain). + */ + +typedef enum BiquadType { + /** EFX-style low-pass filter, specifying a gain and reference frequency. */ + BiquadType_HighShelf, + /** EFX-style high-pass filter, specifying a gain and reference frequency. */ + BiquadType_LowShelf, + /** Peaking filter, specifying a gain and reference frequency. */ + BiquadType_Peaking, + + /** Low-pass cut-off filter, specifying a cut-off frequency. */ + BiquadType_LowPass, + /** High-pass cut-off filter, specifying a cut-off frequency. */ + BiquadType_HighPass, + /** Band-pass filter, specifying a center frequency. */ + BiquadType_BandPass, +} BiquadType; + +typedef struct BiquadFilter { + ALfloat z1, z2; /* Last two delayed components for direct form II. */ + ALfloat b0, b1, b2; /* Transfer function coefficients "b" (numerator) */ + ALfloat a1, a2; /* Transfer function coefficients "a" (denominator; a0 is + * pre-applied). */ +} BiquadFilter; +/* Currently only a C-based filter process method is implemented. */ +#define BiquadFilter_process BiquadFilter_processC + +/** + * Calculates the rcpQ (i.e. 1/Q) coefficient for shelving filters, using the + * reference gain and shelf slope parameter. + * \param gain 0 < gain + * \param slope 0 < slope <= 1 + */ +inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope) +{ + return sqrtf((gain + 1.0f/gain)*(1.0f/slope - 1.0f) + 2.0f); +} +/** + * Calculates the rcpQ (i.e. 1/Q) coefficient for filters, using the normalized + * reference frequency and bandwidth. + * \param f0norm 0 < f0norm < 0.5. + * \param bandwidth 0 < bandwidth + */ +inline ALfloat calc_rcpQ_from_bandwidth(ALfloat f0norm, ALfloat bandwidth) +{ + ALfloat w0 = F_TAU * f0norm; + return 2.0f*sinhf(logf(2.0f)/2.0f*bandwidth*w0/sinf(w0)); +} + +inline void BiquadFilter_clear(BiquadFilter *filter) +{ + filter->z1 = 0.0f; + filter->z2 = 0.0f; +} + +/** + * Sets up the filter state for the specified filter type and its parameters. + * + * \param filter The filter object to prepare. + * \param type The type of filter for the object to apply. + * \param gain The gain for the reference frequency response. Only used by the + * Shelf and Peaking filter types. + * \param f0norm The normalized reference frequency (ref_freq / sample_rate). + * This is the center point for the Shelf, Peaking, and BandPass + * filter types, or the cutoff frequency for the LowPass and + * HighPass filter types. + * \param rcpQ The reciprocal of the Q coefficient for the filter's transition + * band. Can be generated from calc_rcpQ_from_slope or + * calc_rcpQ_from_bandwidth depending on the available data. + */ +void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, ALfloat f0norm, ALfloat rcpQ); + +inline void BiquadFilter_copyParams(BiquadFilter *restrict dst, const BiquadFilter *restrict src) +{ + dst->b0 = src->b0; + dst->b1 = src->b1; + dst->b2 = src->b2; + dst->a1 = src->a1; + dst->a2 = src->a2; +} + +void BiquadFilter_processC(BiquadFilter *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples); + +inline void BiquadFilter_passthru(BiquadFilter *filter, ALsizei numsamples) +{ + if(LIKELY(numsamples >= 2)) + { + filter->z1 = 0.0f; + filter->z2 = 0.0f; + } + else if(numsamples == 1) + { + filter->z1 = filter->z2; + filter->z2 = 0.0f; + } +} + +#endif /* ALC_FILTER_H */ diff --git a/love/src/jni/openal-soft-1.19.1/Alc/filters/filter.c b/love/src/jni/openal-soft-1.19.1/Alc/filters/filter.c new file mode 100644 index 00000000..2b370f89 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/filter.c @@ -0,0 +1,129 @@ + +#include "config.h" + +#include "AL/alc.h" +#include "AL/al.h" + +#include "alMain.h" +#include "defs.h" + +extern inline void BiquadFilter_clear(BiquadFilter *filter); +extern inline void BiquadFilter_copyParams(BiquadFilter *restrict dst, const BiquadFilter *restrict src); +extern inline void BiquadFilter_passthru(BiquadFilter *filter, ALsizei numsamples); +extern inline ALfloat calc_rcpQ_from_slope(ALfloat gain, ALfloat slope); +extern inline ALfloat calc_rcpQ_from_bandwidth(ALfloat f0norm, ALfloat bandwidth); + + +void BiquadFilter_setParams(BiquadFilter *filter, BiquadType type, ALfloat gain, ALfloat f0norm, ALfloat rcpQ) +{ + ALfloat alpha, sqrtgain_alpha_2; + ALfloat w0, sin_w0, cos_w0; + ALfloat a[3] = { 1.0f, 0.0f, 0.0f }; + ALfloat b[3] = { 1.0f, 0.0f, 0.0f }; + + // Limit gain to -100dB + assert(gain > 0.00001f); + + w0 = F_TAU * f0norm; + sin_w0 = sinf(w0); + cos_w0 = cosf(w0); + alpha = sin_w0/2.0f * rcpQ; + + /* Calculate filter coefficients depending on filter type */ + switch(type) + { + case BiquadType_HighShelf: + sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; + b[0] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); + b[1] = -2.0f*gain*((gain-1.0f) + (gain+1.0f)*cos_w0 ); + b[2] = gain*((gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); + a[0] = (gain+1.0f) - (gain-1.0f)*cos_w0 + sqrtgain_alpha_2; + a[1] = 2.0f* ((gain-1.0f) - (gain+1.0f)*cos_w0 ); + a[2] = (gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; + break; + case BiquadType_LowShelf: + sqrtgain_alpha_2 = 2.0f * sqrtf(gain) * alpha; + b[0] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 + sqrtgain_alpha_2); + b[1] = 2.0f*gain*((gain-1.0f) - (gain+1.0f)*cos_w0 ); + b[2] = gain*((gain+1.0f) - (gain-1.0f)*cos_w0 - sqrtgain_alpha_2); + a[0] = (gain+1.0f) + (gain-1.0f)*cos_w0 + sqrtgain_alpha_2; + a[1] = -2.0f* ((gain-1.0f) + (gain+1.0f)*cos_w0 ); + a[2] = (gain+1.0f) + (gain-1.0f)*cos_w0 - sqrtgain_alpha_2; + break; + case BiquadType_Peaking: + gain = sqrtf(gain); + b[0] = 1.0f + alpha * gain; + b[1] = -2.0f * cos_w0; + b[2] = 1.0f - alpha * gain; + a[0] = 1.0f + alpha / gain; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha / gain; + break; + + case BiquadType_LowPass: + b[0] = (1.0f - cos_w0) / 2.0f; + b[1] = 1.0f - cos_w0; + b[2] = (1.0f - cos_w0) / 2.0f; + a[0] = 1.0f + alpha; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha; + break; + case BiquadType_HighPass: + b[0] = (1.0f + cos_w0) / 2.0f; + b[1] = -(1.0f + cos_w0); + b[2] = (1.0f + cos_w0) / 2.0f; + a[0] = 1.0f + alpha; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha; + break; + case BiquadType_BandPass: + b[0] = alpha; + b[1] = 0; + b[2] = -alpha; + a[0] = 1.0f + alpha; + a[1] = -2.0f * cos_w0; + a[2] = 1.0f - alpha; + break; + } + + filter->a1 = a[1] / a[0]; + filter->a2 = a[2] / a[0]; + filter->b0 = b[0] / a[0]; + filter->b1 = b[1] / a[0]; + filter->b2 = b[2] / a[0]; +} + + +void BiquadFilter_processC(BiquadFilter *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) +{ + const ALfloat a1 = filter->a1; + const ALfloat a2 = filter->a2; + const ALfloat b0 = filter->b0; + const ALfloat b1 = filter->b1; + const ALfloat b2 = filter->b2; + ALfloat z1 = filter->z1; + ALfloat z2 = filter->z2; + ALsizei i; + + ASSUME(numsamples > 0); + + /* Processing loop is Transposed Direct Form II. This requires less storage + * compared to Direct Form I (only two delay components, instead of a four- + * sample history; the last two inputs and outputs), and works better for + * floating-point which favors summing similarly-sized values while being + * less bothered by overflow. + * + * See: http://www.earlevel.com/main/2003/02/28/biquads/ + */ + for(i = 0;i < numsamples;i++) + { + ALfloat input = src[i]; + ALfloat output = input*b0 + z1; + z1 = input*b1 - output*a1 + z2; + z2 = input*b2 - output*a2; + dst[i] = output; + } + + filter->z1 = z1; + filter->z2 = z2; +} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.c b/love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.c similarity index 66% rename from love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.c rename to love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.c index 758863c9..8869d1d0 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/nfcfilter.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.c @@ -1,9 +1,10 @@ #include "config.h" -#include "nfcfilter.h" +#include "nfc.h" +#include "alMain.h" -#include "alu.h" +#include /* Near-field control filters are the basis for handling the near-field effect. @@ -52,35 +53,33 @@ static const float B[4][3] = { /*{ 4.2076f, 11.4877f, 5.7924f, 9.1401f }*/ }; -void NfcFilterCreate1(NfcFilter *nfc, const float w0, const float w1) +static void NfcFilterCreate1(struct NfcFilter1 *nfc, const float w0, const float w1) { float b_00, g_0; float r; - memset(nfc, 0, sizeof(*nfc)); - - nfc->g = 1.0f; - nfc->coeffs[0] = 1.0f; + nfc->base_gain = 1.0f; + nfc->gain = 1.0f; /* Calculate bass-boost coefficients. */ r = 0.5f * w0; b_00 = B[1][0] * r; g_0 = 1.0f + b_00; - nfc->coeffs[0] *= g_0; - nfc->coeffs[1] = (2.0f * b_00) / g_0; + nfc->gain *= g_0; + nfc->b1 = 2.0f * b_00 / g_0; /* Calculate bass-cut coefficients. */ r = 0.5f * w1; b_00 = B[1][0] * r; g_0 = 1.0f + b_00; - nfc->g /= g_0; - nfc->coeffs[0] /= g_0; - nfc->coeffs[1+1] = (2.0f * b_00) / g_0; + nfc->base_gain /= g_0; + nfc->gain /= g_0; + nfc->a1 = 2.0f * b_00 / g_0; } -void NfcFilterAdjust1(NfcFilter *nfc, const float w0) +static void NfcFilterAdjust1(struct NfcFilter1 *nfc, const float w0) { float b_00, g_0; float r; @@ -89,212 +88,221 @@ void NfcFilterAdjust1(NfcFilter *nfc, const float w0) b_00 = B[1][0] * r; g_0 = 1.0f + b_00; - nfc->coeffs[0] = nfc->g * g_0; - nfc->coeffs[1] = (2.0f * b_00) / g_0; + nfc->gain = nfc->base_gain * g_0; + nfc->b1 = 2.0f * b_00 / g_0; } -void NfcFilterUpdate1(NfcFilter *nfc, ALfloat *restrict dst, const float *restrict src, const int count) + +static void NfcFilterCreate2(struct NfcFilter2 *nfc, const float w0, const float w1) { - const float b0 = nfc->coeffs[0]; - const float a0 = nfc->coeffs[1]; - const float a1 = nfc->coeffs[2]; - float z1 = nfc->history[0]; + float b_10, b_11, g_1; + float r; + + nfc->base_gain = 1.0f; + nfc->gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_10 = B[2][0] * r; + b_11 = B[2][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->gain *= g_1; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_10 = B[2][0] * r; + b_11 = B[2][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->base_gain /= g_1; + nfc->gain /= g_1; + nfc->a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->a2 = 4.0f * b_11 / g_1; +} + +static void NfcFilterAdjust2(struct NfcFilter2 *nfc, const float w0) +{ + float b_10, b_11, g_1; + float r; + + r = 0.5f * w0; + b_10 = B[2][0] * r; + b_11 = B[2][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->gain = nfc->base_gain * g_1; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; +} + + +static void NfcFilterCreate3(struct NfcFilter3 *nfc, const float w0, const float w1) +{ + float b_10, b_11, g_1; + float b_00, g_0; + float r; + + nfc->base_gain = 1.0f; + nfc->gain = 1.0f; + + /* Calculate bass-boost coefficients. */ + r = 0.5f * w0; + b_10 = B[3][0] * r; + b_11 = B[3][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->gain *= g_1; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; + + b_00 = B[3][2] * r; + g_0 = 1.0f + b_00; + + nfc->gain *= g_0; + nfc->b3 = 2.0f * b_00 / g_0; + + /* Calculate bass-cut coefficients. */ + r = 0.5f * w1; + b_10 = B[3][0] * r; + b_11 = B[3][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->base_gain /= g_1; + nfc->gain /= g_1; + nfc->a1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->a2 = 4.0f * b_11 / g_1; + + b_00 = B[3][2] * r; + g_0 = 1.0f + b_00; + + nfc->base_gain /= g_0; + nfc->gain /= g_0; + nfc->a3 = 2.0f * b_00 / g_0; +} + +static void NfcFilterAdjust3(struct NfcFilter3 *nfc, const float w0) +{ + float b_10, b_11, g_1; + float b_00, g_0; + float r; + + r = 0.5f * w0; + b_10 = B[3][0] * r; + b_11 = B[3][1] * r * r; + g_1 = 1.0f + b_10 + b_11; + + nfc->gain = nfc->base_gain * g_1; + nfc->b1 = (2.0f*b_10 + 4.0f*b_11) / g_1; + nfc->b2 = 4.0f * b_11 / g_1; + + b_00 = B[3][2] * r; + g_0 = 1.0f + b_00; + + nfc->gain *= g_0; + nfc->b3 = 2.0f * b_00 / g_0; +} + + +void NfcFilterCreate(NfcFilter *nfc, const float w0, const float w1) +{ + memset(nfc, 0, sizeof(*nfc)); + NfcFilterCreate1(&nfc->first, w0, w1); + NfcFilterCreate2(&nfc->second, w0, w1); + NfcFilterCreate3(&nfc->third, w0, w1); +} + +void NfcFilterAdjust(NfcFilter *nfc, const float w0) +{ + NfcFilterAdjust1(&nfc->first, w0); + NfcFilterAdjust2(&nfc->second, w0); + NfcFilterAdjust3(&nfc->third, w0); +} + + +void NfcFilterProcess1(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) +{ + const float gain = nfc->first.gain; + const float b1 = nfc->first.b1; + const float a1 = nfc->first.a1; + float z1 = nfc->first.z[0]; int i; + ASSUME(count > 0); + for(i = 0;i < count;i++) { - float out = src[i] * b0; - float y; - - y = out - (a1*z1); - out = y + (a0*z1); + float y = src[i]*gain - a1*z1; + float out = y + b1*z1; z1 += y; dst[i] = out; } - nfc->history[0] = z1; + nfc->first.z[0] = z1; } - -void NfcFilterCreate2(NfcFilter *nfc, const float w0, const float w1) +void NfcFilterProcess2(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) { - float b_10, b_11, g_1; - float r; - - memset(nfc, 0, sizeof(*nfc)); - - nfc->g = 1.0f; - nfc->coeffs[0] = 1.0f; - - /* Calculate bass-boost coefficients. */ - r = 0.5f * w0; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->coeffs[0] *= g_1; - nfc->coeffs[1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[2] = (4.0f * b_11) / g_1; - - /* Calculate bass-cut coefficients. */ - r = 0.5f * w1; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->g /= g_1; - nfc->coeffs[0] /= g_1; - nfc->coeffs[2+1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[2+2] = (4.0f * b_11) / g_1; -} - -void NfcFilterAdjust2(NfcFilter *nfc, const float w0) -{ - float b_10, b_11, g_1; - float r; - - r = 0.5f * w0; - b_10 = B[2][0] * r; - b_11 = B[2][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->coeffs[0] = nfc->g * g_1; - nfc->coeffs[1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[2] = (4.0f * b_11) / g_1; -} - -void NfcFilterUpdate2(NfcFilter *nfc, ALfloat *restrict dst, const float *restrict src, const int count) -{ - const float b0 = nfc->coeffs[0]; - const float a00 = nfc->coeffs[1]; - const float a01 = nfc->coeffs[2]; - const float a10 = nfc->coeffs[3]; - const float a11 = nfc->coeffs[4]; - float z1 = nfc->history[0]; - float z2 = nfc->history[1]; + const float gain = nfc->second.gain; + const float b1 = nfc->second.b1; + const float b2 = nfc->second.b2; + const float a1 = nfc->second.a1; + const float a2 = nfc->second.a2; + float z1 = nfc->second.z[0]; + float z2 = nfc->second.z[1]; int i; + ASSUME(count > 0); + for(i = 0;i < count;i++) { - float out = src[i] * b0; - float y; - - y = out - (a10*z1) - (a11*z2); - out = y + (a00*z1) + (a01*z2); + float y = src[i]*gain - a1*z1 - a2*z2; + float out = y + b1*z1 + b2*z2; z2 += z1; z1 += y; dst[i] = out; } - nfc->history[0] = z1; - nfc->history[1] = z2; + nfc->second.z[0] = z1; + nfc->second.z[1] = z2; } - -void NfcFilterCreate3(NfcFilter *nfc, const float w0, const float w1) +void NfcFilterProcess3(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count) { - float b_10, b_11, g_1; - float b_00, g_0; - float r; - - memset(nfc, 0, sizeof(*nfc)); - - nfc->g = 1.0f; - nfc->coeffs[0] = 1.0f; - - /* Calculate bass-boost coefficients. */ - r = 0.5f * w0; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->coeffs[0] *= g_1; - nfc->coeffs[1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[2] = (4.0f * b_11) / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->coeffs[0] *= g_0; - nfc->coeffs[2+1] = (2.0f * b_00) / g_0; - - /* Calculate bass-cut coefficients. */ - r = 0.5f * w1; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->g /= g_1; - nfc->coeffs[0] /= g_1; - nfc->coeffs[3+1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[3+2] = (4.0f * b_11) / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->g /= g_0; - nfc->coeffs[0] /= g_0; - nfc->coeffs[3+2+1] = (2.0f * b_00) / g_0; -} - -void NfcFilterAdjust3(NfcFilter *nfc, const float w0) -{ - float b_10, b_11, g_1; - float b_00, g_0; - float r; - - r = 0.5f * w0; - b_10 = B[3][0] * r; - b_11 = B[3][1] * r * r; - g_1 = 1.0f + b_10 + b_11; - - nfc->coeffs[0] = nfc->g * g_1; - nfc->coeffs[1] = ((2.0f * b_10) + (4.0f * b_11)) / g_1; - nfc->coeffs[2] = (4.0f * b_11) / g_1; - - b_00 = B[3][2] * r; - g_0 = 1.0f + b_00; - - nfc->coeffs[0] *= g_0; - nfc->coeffs[2+1] = (2.0f * b_00) / g_0; -} - -void NfcFilterUpdate3(NfcFilter *nfc, ALfloat *restrict dst, const float *restrict src, const int count) -{ - const float b0 = nfc->coeffs[0]; - const float a00 = nfc->coeffs[1]; - const float a01 = nfc->coeffs[2]; - const float a02 = nfc->coeffs[3]; - const float a10 = nfc->coeffs[4]; - const float a11 = nfc->coeffs[5]; - const float a12 = nfc->coeffs[6]; - float z1 = nfc->history[0]; - float z2 = nfc->history[1]; - float z3 = nfc->history[2]; + const float gain = nfc->third.gain; + const float b1 = nfc->third.b1; + const float b2 = nfc->third.b2; + const float b3 = nfc->third.b3; + const float a1 = nfc->third.a1; + const float a2 = nfc->third.a2; + const float a3 = nfc->third.a3; + float z1 = nfc->third.z[0]; + float z2 = nfc->third.z[1]; + float z3 = nfc->third.z[2]; int i; + ASSUME(count > 0); + for(i = 0;i < count;i++) { - float out = src[i] * b0; - float y; - - y = out - (a10*z1) - (a11*z2); - out = y + (a00*z1) + (a01*z2); + float y = src[i]*gain - a1*z1 - a2*z2; + float out = y + b1*z1 + b2*z2; z2 += z1; z1 += y; - y = out - (a12*z3); - out = y + (a02*z3); + y = out - a3*z3; + out = y + b3*z3; z3 += y; dst[i] = out; } - nfc->history[0] = z1; - nfc->history[1] = z2; - nfc->history[2] = z3; + nfc->third.z[0] = z1; + nfc->third.z[1] = z2; + nfc->third.z[2] = z3; } - #if 0 /* Original methods the above are derived from. */ static void NfcFilterCreate(NfcFilter *nfc, const ALsizei order, const float src_dist, const float ctl_dist, const float rate) { @@ -391,7 +399,7 @@ static void NfcFilterAdjust(NfcFilter *nfc, const float distance) } } -static float NfcFilterUpdate(const float in, NfcFilter *nfc) +static float NfcFilterProcess(const float in, NfcFilter *nfc) { int i; float out = in * nfc->coeffs[0]; diff --git a/love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.h b/love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.h new file mode 100644 index 00000000..12a5a18f --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/nfc.h @@ -0,0 +1,49 @@ +#ifndef FILTER_NFC_H +#define FILTER_NFC_H + +struct NfcFilter1 { + float base_gain, gain; + float b1, a1; + float z[1]; +}; +struct NfcFilter2 { + float base_gain, gain; + float b1, b2, a1, a2; + float z[2]; +}; +struct NfcFilter3 { + float base_gain, gain; + float b1, b2, b3, a1, a2, a3; + float z[3]; +}; + +typedef struct NfcFilter { + struct NfcFilter1 first; + struct NfcFilter2 second; + struct NfcFilter3 third; +} NfcFilter; + + +/* NOTE: + * w0 = speed_of_sound / (source_distance * sample_rate); + * w1 = speed_of_sound / (control_distance * sample_rate); + * + * Generally speaking, the control distance should be approximately the average + * speaker distance, or based on the reference delay if outputing NFC-HOA. It + * must not be negative, 0, or infinite. The source distance should not be too + * small relative to the control distance. + */ + +void NfcFilterCreate(NfcFilter *nfc, const float w0, const float w1); +void NfcFilterAdjust(NfcFilter *nfc, const float w0); + +/* Near-field control filter for first-order ambisonic channels (1-3). */ +void NfcFilterProcess1(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); + +/* Near-field control filter for second-order ambisonic channels (4-8). */ +void NfcFilterProcess2(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); + +/* Near-field control filter for third-order ambisonic channels (9-15). */ +void NfcFilterProcess3(NfcFilter *nfc, float *restrict dst, const float *restrict src, const int count); + +#endif /* FILTER_NFC_H */ diff --git a/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.c b/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.c new file mode 100644 index 00000000..e99f4b95 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.c @@ -0,0 +1,109 @@ + +#include "config.h" + +#include "splitter.h" + +#include "math_defs.h" + + +void bandsplit_init(BandSplitter *splitter, ALfloat f0norm) +{ + ALfloat w = f0norm * F_TAU; + ALfloat cw = cosf(w); + if(cw > FLT_EPSILON) + splitter->coeff = (sinf(w) - 1.0f) / cw; + else + splitter->coeff = cw * -0.5f; + + splitter->lp_z1 = 0.0f; + splitter->lp_z2 = 0.0f; + splitter->hp_z1 = 0.0f; +} + +void bandsplit_clear(BandSplitter *splitter) +{ + splitter->lp_z1 = 0.0f; + splitter->lp_z2 = 0.0f; + splitter->hp_z1 = 0.0f; +} + +void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, + const ALfloat *input, ALsizei count) +{ + ALfloat lp_coeff, hp_coeff, lp_y, hp_y, d; + ALfloat lp_z1, lp_z2, hp_z1; + ALsizei i; + + ASSUME(count > 0); + + hp_coeff = splitter->coeff; + lp_coeff = splitter->coeff*0.5f + 0.5f; + lp_z1 = splitter->lp_z1; + lp_z2 = splitter->lp_z2; + hp_z1 = splitter->hp_z1; + for(i = 0;i < count;i++) + { + ALfloat in = input[i]; + + /* Low-pass sample processing. */ + d = (in - lp_z1) * lp_coeff; + lp_y = lp_z1 + d; + lp_z1 = lp_y + d; + + d = (lp_y - lp_z2) * lp_coeff; + lp_y = lp_z2 + d; + lp_z2 = lp_y + d; + + lpout[i] = lp_y; + + /* All-pass sample processing. */ + hp_y = in*hp_coeff + hp_z1; + hp_z1 = in - hp_y*hp_coeff; + + /* High-pass generated from removing low-passed output. */ + hpout[i] = hp_y - lp_y; + } + splitter->lp_z1 = lp_z1; + splitter->lp_z2 = lp_z2; + splitter->hp_z1 = hp_z1; +} + + +void splitterap_init(SplitterAllpass *splitter, ALfloat f0norm) +{ + ALfloat w = f0norm * F_TAU; + ALfloat cw = cosf(w); + if(cw > FLT_EPSILON) + splitter->coeff = (sinf(w) - 1.0f) / cw; + else + splitter->coeff = cw * -0.5f; + + splitter->z1 = 0.0f; +} + +void splitterap_clear(SplitterAllpass *splitter) +{ + splitter->z1 = 0.0f; +} + +void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count) +{ + ALfloat coeff, in, out; + ALfloat z1; + ALsizei i; + + ASSUME(count > 0); + + coeff = splitter->coeff; + z1 = splitter->z1; + for(i = 0;i < count;i++) + { + in = samples[i]; + + out = in*coeff + z1; + z1 = in - out*coeff; + + samples[i] = out; + } + splitter->z1 = z1; +} diff --git a/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.h b/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.h new file mode 100644 index 00000000..a788bc3e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/filters/splitter.h @@ -0,0 +1,40 @@ +#ifndef FILTER_SPLITTER_H +#define FILTER_SPLITTER_H + +#include "alMain.h" + + +/* Band splitter. Splits a signal into two phase-matching frequency bands. */ +typedef struct BandSplitter { + ALfloat coeff; + ALfloat lp_z1; + ALfloat lp_z2; + ALfloat hp_z1; +} BandSplitter; + +void bandsplit_init(BandSplitter *splitter, ALfloat f0norm); +void bandsplit_clear(BandSplitter *splitter); +void bandsplit_process(BandSplitter *splitter, ALfloat *restrict hpout, ALfloat *restrict lpout, + const ALfloat *input, ALsizei count); + +/* The all-pass portion of the band splitter. Applies the same phase shift + * without splitting the signal. + */ +typedef struct SplitterAllpass { + ALfloat coeff; + ALfloat z1; +} SplitterAllpass; + +void splitterap_init(SplitterAllpass *splitter, ALfloat f0norm); +void splitterap_clear(SplitterAllpass *splitter); +void splitterap_process(SplitterAllpass *splitter, ALfloat *restrict samples, ALsizei count); + + +typedef struct FrontStablizer { + SplitterAllpass APFilter[MAX_OUTPUT_CHANNELS]; + BandSplitter LFilter, RFilter; + alignas(16) ALfloat LSplit[2][BUFFERSIZE]; + alignas(16) ALfloat RSplit[2][BUFFERSIZE]; +} FrontStablizer; + +#endif /* FILTER_SPLITTER_H */ diff --git a/love/src/jni/openal-soft-1.19.1/Alc/fpu_modes.h b/love/src/jni/openal-soft-1.19.1/Alc/fpu_modes.h new file mode 100644 index 00000000..eb305967 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/fpu_modes.h @@ -0,0 +1,34 @@ +#ifndef FPU_MODES_H +#define FPU_MODES_H + +#ifdef HAVE_FENV_H +#include +#endif + + +typedef struct FPUCtl { +#if defined(__GNUC__) && defined(HAVE_SSE) + unsigned int sse_state; +#elif defined(HAVE___CONTROL87_2) + unsigned int state; + unsigned int sse_state; +#elif defined(HAVE__CONTROLFP) + unsigned int state; +#endif +} FPUCtl; +void SetMixerFPUMode(FPUCtl *ctl); +void RestoreFPUMode(const FPUCtl *ctl); + +#ifdef __GNUC__ +/* Use an alternate macro set with GCC to avoid accidental continue or break + * statements within the mixer mode. + */ +#define START_MIXER_MODE() __extension__({ FPUCtl _oldMode; SetMixerFPUMode(&_oldMode) +#define END_MIXER_MODE() RestoreFPUMode(&_oldMode); }) +#else +#define START_MIXER_MODE() do { FPUCtl _oldMode; SetMixerFPUMode(&_oldMode) +#define END_MIXER_MODE() RestoreFPUMode(&_oldMode); } while(0) +#endif +#define LEAVE_MIXER_MODE() RestoreFPUMode(&_oldMode) + +#endif /* FPU_MODES_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/helpers.c b/love/src/jni/openal-soft-1.19.1/Alc/helpers.c similarity index 79% rename from love/src/jni/openal-soft-1.18.2/Alc/helpers.c rename to love/src/jni/openal-soft-1.19.1/Alc/helpers.c index 7f6349b3..d2cb6253 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/helpers.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/helpers.c @@ -39,6 +39,9 @@ #ifdef HAVE_DIRENT_H #include #endif +#ifdef HAVE_PROC_PIDPATH +#include +#endif #ifdef __FreeBSD__ #include @@ -66,7 +69,7 @@ DEFINE_GUID(IID_IAudioClient, 0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1,0x78, 0xc DEFINE_GUID(IID_IAudioRenderClient, 0xf294acfc, 0x3146, 0x4483, 0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2); DEFINE_GUID(IID_IAudioCaptureClient, 0xc8adbd64, 0xe71e, 0x48a0, 0xa4,0xde, 0x18,0x5c,0x39,0x5c,0xd3,0x17); -#ifdef HAVE_MMDEVAPI +#ifdef HAVE_WASAPI #include #include #include @@ -108,6 +111,8 @@ DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x #include "alMain.h" #include "alu.h" +#include "cpu_caps.h" +#include "fpu_modes.h" #include "atomic.h" #include "uintmap.h" #include "vector.h" @@ -118,73 +123,50 @@ DEFINE_PROPERTYKEY(PKEY_AudioEndpoint_GUID, 0x1da5d803, 0xd492, 0x4edd, 0x8c, 0x extern inline ALuint NextPowerOf2(ALuint value); extern inline size_t RoundUp(size_t value, size_t r); -extern inline ALuint64 ScaleRound(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale); -extern inline ALuint64 ScaleFloor(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale); -extern inline ALuint64 ScaleCeil(ALuint64 val, ALuint64 new_scale, ALuint64 old_scale); extern inline ALint fastf2i(ALfloat f); +extern inline int float2int(float f); +extern inline float fast_roundf(float f); +#ifndef __GNUC__ +#if defined(HAVE_BITSCANFORWARD64_INTRINSIC) +extern inline int msvc64_ctz64(ALuint64 v); +#elif defined(HAVE_BITSCANFORWARD_INTRINSIC) +extern inline int msvc_ctz64(ALuint64 v); +#else +extern inline int fallback_popcnt64(ALuint64 v); +extern inline int fallback_ctz64(ALuint64 value); +#endif +#endif -ALuint CPUCapFlags = 0; +#if defined(HAVE_GCC_GET_CPUID) && (defined(__i386__) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64)) +typedef unsigned int reg_type; +static inline void get_cpuid(int f, reg_type *regs) +{ __get_cpuid(f, ®s[0], ®s[1], ®s[2], ®s[3]); } +#define CAN_GET_CPUID +#elif defined(HAVE_CPUID_INTRINSIC) && (defined(__i386__) || defined(__x86_64__) || \ + defined(_M_IX86) || defined(_M_X64)) +typedef int reg_type; +static inline void get_cpuid(int f, reg_type *regs) +{ (__cpuid)(regs, f); } +#define CAN_GET_CPUID +#endif +int CPUCapFlags = 0; -void FillCPUCaps(ALuint capfilter) +void FillCPUCaps(int capfilter) { - ALuint caps = 0; + int caps = 0; /* FIXME: We really should get this for all available CPUs in case different * CPUs have different caps (is that possible on one machine?). */ -#if defined(HAVE_GCC_GET_CPUID) && (defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64)) +#ifdef CAN_GET_CPUID union { - unsigned int regs[4]; - char str[sizeof(unsigned int[4])]; - } cpuinf[3]; + reg_type regs[4]; + char str[sizeof(reg_type[4])]; + } cpuinf[3] = {{ { 0, 0, 0, 0 } }}; - if(!__get_cpuid(0, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3])) - ERR("Failed to get CPUID\n"); - else - { - unsigned int maxfunc = cpuinf[0].regs[0]; - unsigned int maxextfunc = 0; - - if(__get_cpuid(0x80000000, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3])) - maxextfunc = cpuinf[0].regs[0]; - TRACE("Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc); - - TRACE("Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].str+4, cpuinf[0].str+12, cpuinf[0].str+8); - if(maxextfunc >= 0x80000004 && - __get_cpuid(0x80000002, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]) && - __get_cpuid(0x80000003, &cpuinf[1].regs[0], &cpuinf[1].regs[1], &cpuinf[1].regs[2], &cpuinf[1].regs[3]) && - __get_cpuid(0x80000004, &cpuinf[2].regs[0], &cpuinf[2].regs[1], &cpuinf[2].regs[2], &cpuinf[2].regs[3])) - TRACE("Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].str, cpuinf[1].str, cpuinf[2].str); - - if(maxfunc >= 1 && - __get_cpuid(1, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3])) - { - if((cpuinf[0].regs[3]&(1<<25))) - { - caps |= CPU_CAP_SSE; - if((cpuinf[0].regs[3]&(1<<26))) - { - caps |= CPU_CAP_SSE2; - if((cpuinf[0].regs[2]&(1<<0))) - { - caps |= CPU_CAP_SSE3; - if((cpuinf[0].regs[2]&(1<<19))) - caps |= CPU_CAP_SSE4_1; - } - } - } - } - } -#elif defined(HAVE_CPUID_INTRINSIC) && (defined(__i386__) || defined(__x86_64__) || \ - defined(_M_IX86) || defined(_M_X64)) - union { - int regs[4]; - char str[sizeof(int[4])]; - } cpuinf[3]; - - (__cpuid)(cpuinf[0].regs, 0); + get_cpuid(0, cpuinf[0].regs); if(cpuinf[0].regs[0] == 0) ERR("Failed to get CPUID\n"); else @@ -192,7 +174,7 @@ void FillCPUCaps(ALuint capfilter) unsigned int maxfunc = cpuinf[0].regs[0]; unsigned int maxextfunc; - (__cpuid)(cpuinf[0].regs, 0x80000000); + get_cpuid(0x80000000, cpuinf[0].regs); maxextfunc = cpuinf[0].regs[0]; TRACE("Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc); @@ -200,29 +182,23 @@ void FillCPUCaps(ALuint capfilter) TRACE("Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].str+4, cpuinf[0].str+12, cpuinf[0].str+8); if(maxextfunc >= 0x80000004) { - (__cpuid)(cpuinf[0].regs, 0x80000002); - (__cpuid)(cpuinf[1].regs, 0x80000003); - (__cpuid)(cpuinf[2].regs, 0x80000004); + get_cpuid(0x80000002, cpuinf[0].regs); + get_cpuid(0x80000003, cpuinf[1].regs); + get_cpuid(0x80000004, cpuinf[2].regs); TRACE("Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].str, cpuinf[1].str, cpuinf[2].str); } if(maxfunc >= 1) { - (__cpuid)(cpuinf[0].regs, 1); + get_cpuid(1, cpuinf[0].regs); if((cpuinf[0].regs[3]&(1<<25))) - { caps |= CPU_CAP_SSE; - if((cpuinf[0].regs[3]&(1<<26))) - { - caps |= CPU_CAP_SSE2; - if((cpuinf[0].regs[2]&(1<<0))) - { - caps |= CPU_CAP_SSE3; - if((cpuinf[0].regs[2]&(1<<19))) - caps |= CPU_CAP_SSE4_1; - } - } - } + if((caps&CPU_CAP_SSE) && (cpuinf[0].regs[3]&(1<<26))) + caps |= CPU_CAP_SSE2; + if((caps&CPU_CAP_SSE2) && (cpuinf[0].regs[2]&(1<<0))) + caps |= CPU_CAP_SSE3; + if((caps&CPU_CAP_SSE3) && (cpuinf[0].regs[2]&(1<<19))) + caps |= CPU_CAP_SSE4_1; } } #else @@ -247,22 +223,32 @@ void FillCPUCaps(ALuint capfilter) ERR("Failed to open /proc/cpuinfo, cannot check for NEON support\n"); else { + al_string features = AL_STRING_INIT_STATIC(); char buf[256]; + while(fgets(buf, sizeof(buf), file) != NULL) { - size_t len; - char *str; - if(strncmp(buf, "Features\t:", 10) != 0) continue; - len = strlen(buf); - while(len > 0 && isspace(buf[len-1])) - buf[--len] = 0; + alstr_copy_cstr(&features, buf+10); + while(VECTOR_BACK(features) != '\n') + { + if(fgets(buf, sizeof(buf), file) == NULL) + break; + alstr_append_cstr(&features, buf); + } + break; + } + fclose(file); + file = NULL; - TRACE("Got features string:%s\n", buf+10); + if(!alstr_empty(features)) + { + const char *str = alstr_get_cstr(features); + while(isspace(str[0])) ++str; - str = buf; + TRACE("Got features string:%s\n", str); while((str=strstr(str, "neon")) != NULL) { if(isspace(*(str-1)) && (str[4] == 0 || isspace(str[4]))) @@ -270,13 +256,11 @@ void FillCPUCaps(ALuint capfilter) caps |= CPU_CAP_NEON; break; } - str++; + ++str; } - break; } - fclose(file); - file = NULL; + alstr_reset(&features); } #endif @@ -294,81 +278,44 @@ void FillCPUCaps(ALuint capfilter) void SetMixerFPUMode(FPUCtl *ctl) { -#ifdef HAVE_FENV_H - fegetenv(STATIC_CAST(fenv_t, ctl)); -#ifdef _WIN32 - /* HACK: A nasty bug in MinGW-W64 causes fegetenv and fesetenv to not save - * and restore the FPU rounding mode, so we have to do it manually. Don't - * know if this also applies to MSVC. - */ - ctl->round_mode = fegetround(); -#endif -#if defined(__GNUC__) && defined(HAVE_SSE) - /* FIXME: Some fegetenv implementations can get the SSE environment too? - * How to tell when it does? */ - if((CPUCapFlags&CPU_CAP_SSE)) - __asm__ __volatile__("stmxcsr %0" : "=m" (*&ctl->sse_state)); -#endif - -#ifdef FE_TOWARDZERO - fesetround(FE_TOWARDZERO); -#endif #if defined(__GNUC__) && defined(HAVE_SSE) if((CPUCapFlags&CPU_CAP_SSE)) { - int sseState = ctl->sse_state; - sseState |= 0x6000; /* set round-to-zero */ + __asm__ __volatile__("stmxcsr %0" : "=m" (*&ctl->sse_state)); + unsigned int sseState = ctl->sse_state; sseState |= 0x8000; /* set flush-to-zero */ if((CPUCapFlags&CPU_CAP_SSE2)) sseState |= 0x0040; /* set denormals-are-zero */ __asm__ __volatile__("ldmxcsr %0" : : "m" (*&sseState)); } -#endif #elif defined(HAVE___CONTROL87_2) - int mode; - __control87_2(0, 0, &ctl->state, NULL); - __control87_2(_RC_CHOP, _MCW_RC, &mode, NULL); -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - { - __control87_2(0, 0, NULL, &ctl->sse_state); - __control87_2(_RC_CHOP|_DN_FLUSH, _MCW_RC|_MCW_DN, NULL, &mode); - } -#endif + __control87_2(0, 0, &ctl->state, &ctl->sse_state); + _control87(_DN_FLUSH, _MCW_DN); #elif defined(HAVE__CONTROLFP) ctl->state = _controlfp(0, 0); - (void)_controlfp(_RC_CHOP, _MCW_RC); + _controlfp(_DN_FLUSH, _MCW_DN); #endif } void RestoreFPUMode(const FPUCtl *ctl) { -#ifdef HAVE_FENV_H - fesetenv(STATIC_CAST(fenv_t, ctl)); -#ifdef _WIN32 - fesetround(ctl->round_mode); -#endif #if defined(__GNUC__) && defined(HAVE_SSE) if((CPUCapFlags&CPU_CAP_SSE)) __asm__ __volatile__("ldmxcsr %0" : : "m" (*&ctl->sse_state)); -#endif #elif defined(HAVE___CONTROL87_2) int mode; - __control87_2(ctl->state, _MCW_RC, &mode, NULL); -#ifdef HAVE_SSE - if((CPUCapFlags&CPU_CAP_SSE)) - __control87_2(ctl->sse_state, _MCW_RC|_MCW_DN, NULL, &mode); -#endif + __control87_2(ctl->state, _MCW_DN, &mode, NULL); + __control87_2(ctl->sse_state, _MCW_DN, NULL, &mode); #elif defined(HAVE__CONTROLFP) - _controlfp(ctl->state, _MCW_RC); + _controlfp(ctl->state, _MCW_DN); #endif } @@ -392,9 +339,8 @@ static WCHAR *strrchrW(WCHAR *str, WCHAR ch) return ret; } -al_string GetProcPath(void) +void GetProcBinary(al_string *path, al_string *fname) { - al_string ret = AL_STRING_INIT_STATIC(); WCHAR *pathname, *sep; DWORD pathlen; DWORD len; @@ -411,23 +357,34 @@ al_string GetProcPath(void) { free(pathname); ERR("Failed to get process name: error %lu\n", GetLastError()); - return ret; + return; } pathname[len] = 0; - if((sep = strrchrW(pathname, '\\'))) + if((sep=strrchrW(pathname, '\\')) != NULL) { - WCHAR *sep2 = strrchrW(pathname, '/'); - if(sep2) *sep2 = 0; - else *sep = 0; + WCHAR *sep2 = strrchrW(sep+1, '/'); + if(sep2) sep = sep2; + } + else + sep = strrchrW(pathname, '/'); + + if(sep) + { + if(path) alstr_copy_wrange(path, pathname, sep); + if(fname) alstr_copy_wcstr(fname, sep+1); + } + else + { + if(path) alstr_clear(path); + if(fname) alstr_copy_wcstr(fname, pathname); } - else if((sep = strrchrW(pathname, '/'))) - *sep = 0; - alstr_copy_wcstr(&ret, pathname); free(pathname); - TRACE("Got: %s\n", alstr_get_cstr(ret)); - return ret; + if(path && fname) + TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); + else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); + else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); } @@ -634,7 +591,7 @@ vector_al_string SearchDataFiles(const char *ext, const char *subdir) /* Search the local and global data dirs. */ for(i = 0;i < COUNTOF(ids);i++) { - WCHAR buffer[PATH_MAX]; + WCHAR buffer[MAX_PATH]; if(SHGetSpecialFolderPathW(NULL, buffer, ids[i], FALSE) != FALSE) { alstr_copy_wcstr(&path, buffer); @@ -721,64 +678,103 @@ void UnmapFileMem(const struct FileMapping *mapping) #else -al_string GetProcPath(void) +void GetProcBinary(al_string *path, al_string *fname) { - al_string ret = AL_STRING_INIT_STATIC(); - char *pathname, *sep; + char *pathname = NULL; size_t pathlen; #ifdef __FreeBSD__ - int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; - mib[3] = getpid(); - if (sysctl(mib, 4, NULL, &pathlen, NULL, 0) == -1) { - WARN("Failed to sysctl kern.proc.pathname.%d: %s\n", mib[3], strerror(errno)); - return ret; - } - - pathname = malloc(pathlen + 1); - sysctl(mib, 4, (void*)pathname, &pathlen, NULL, 0); - pathname[pathlen] = 0; -#else - const char *fname; - ssize_t len; - - pathlen = 256; - pathname = malloc(pathlen); - - fname = "/proc/self/exe"; - len = readlink(fname, pathname, pathlen); - if(len == -1 && errno == ENOENT) - { - fname = "/proc/self/file"; - len = readlink(fname, pathname, pathlen); - } - - while(len > 0 && (size_t)len == pathlen) - { - free(pathname); - pathlen <<= 1; - pathname = malloc(pathlen); - len = readlink(fname, pathname, pathlen); - } - if(len <= 0) - { - free(pathname); - WARN("Failed to readlink %s: %s\n", fname, strerror(errno)); - return ret; - } - - pathname[len] = 0; -#endif - - sep = strrchr(pathname, '/'); - if(sep) - alstr_copy_range(&ret, pathname, sep); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + if(sysctl(mib, 4, NULL, &pathlen, NULL, 0) == -1) + WARN("Failed to sysctl kern.proc.pathname: %s\n", strerror(errno)); else - alstr_copy_cstr(&ret, pathname); + { + pathname = malloc(pathlen + 1); + sysctl(mib, 4, (void*)pathname, &pathlen, NULL, 0); + pathname[pathlen] = 0; + } +#endif +#ifdef HAVE_PROC_PIDPATH + if(!pathname) + { + const pid_t pid = getpid(); + char procpath[PROC_PIDPATHINFO_MAXSIZE]; + int ret; + + ret = proc_pidpath(pid, procpath, sizeof(procpath)); + if(ret < 1) + { + WARN("proc_pidpath(%d, ...) failed: %s\n", pid, strerror(errno)); + free(pathname); + pathname = NULL; + } + else + { + pathlen = strlen(procpath); + pathname = strdup(procpath); + } + } +#endif + if(!pathname) + { + const char *selfname; + ssize_t len; + + pathlen = 256; + pathname = malloc(pathlen); + + selfname = "/proc/self/exe"; + len = readlink(selfname, pathname, pathlen); + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/self/file"; + len = readlink(selfname, pathname, pathlen); + } + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/curproc/exe"; + len = readlink(selfname, pathname, pathlen); + } + if(len == -1 && errno == ENOENT) + { + selfname = "/proc/curproc/file"; + len = readlink(selfname, pathname, pathlen); + } + + while(len > 0 && (size_t)len == pathlen) + { + free(pathname); + pathlen <<= 1; + pathname = malloc(pathlen); + len = readlink(selfname, pathname, pathlen); + } + if(len <= 0) + { + free(pathname); + WARN("Failed to readlink %s: %s\n", selfname, strerror(errno)); + return; + } + + pathname[len] = 0; + } + + char *sep = strrchr(pathname, '/'); + if(sep) + { + if(path) alstr_copy_range(path, pathname, sep); + if(fname) alstr_copy_cstr(fname, sep+1); + } + else + { + if(path) alstr_clear(path); + if(fname) alstr_copy_cstr(fname, pathname); + } free(pathname); - TRACE("Got: %s\n", alstr_get_cstr(ret)); - return ret; + if(path && fname) + TRACE("Got: %s, %s\n", alstr_get_cstr(*path), alstr_get_cstr(*fname)); + else if(path) TRACE("Got path: %s\n", alstr_get_cstr(*path)); + else if(fname) TRACE("Got filename: %s\n", alstr_get_cstr(*fname)); } @@ -881,15 +877,32 @@ vector_al_string SearchDataFiles(const char *ext, const char *subdir) { al_string path = AL_STRING_INIT_STATIC(); const char *str, *next; - char cwdbuf[PATH_MAX]; /* Search the app-local directory. */ if((str=getenv("ALSOFT_LOCAL_PATH")) && *str != '\0') DirectorySearch(str, ext, &results); - else if(getcwd(cwdbuf, sizeof(cwdbuf))) - DirectorySearch(cwdbuf, ext, &results); else - DirectorySearch(".", ext, &results); + { + size_t cwdlen = 256; + char *cwdbuf = malloc(cwdlen); + while(!getcwd(cwdbuf, cwdlen)) + { + free(cwdbuf); + cwdbuf = NULL; + if(errno != ERANGE) + break; + cwdlen <<= 1; + cwdbuf = malloc(cwdlen); + } + if(!cwdbuf) + DirectorySearch(".", ext, &results); + else + { + DirectorySearch(cwdbuf, ext, &results); + free(cwdbuf); + cwdbuf = NULL; + } + } // Search local data dir if((str=getenv("XDG_DATA_HOME")) != NULL && str[0] != '\0') @@ -1092,8 +1105,8 @@ void alstr_copy_range(al_string *str, const al_string_char_type *from, const al_ void alstr_append_char(al_string *str, const al_string_char_type c) { size_t len = alstr_length(*str); - VECTOR_RESIZE(*str, len, len+2); - VECTOR_PUSH_BACK(*str, c); + VECTOR_RESIZE(*str, len+1, len+2); + VECTOR_BACK(*str) = c; VECTOR_ELEM(*str, len+1) = 0; } @@ -1151,6 +1164,17 @@ void alstr_append_wcstr(al_string *str, const wchar_t *from) } } +void alstr_copy_wrange(al_string *str, const wchar_t *from, const wchar_t *to) +{ + int len; + if((len=WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), NULL, 0, NULL, NULL)) > 0) + { + VECTOR_RESIZE(*str, len, len+1); + WideCharToMultiByte(CP_UTF8, 0, from, (int)(to-from), &VECTOR_FRONT(*str), len+1, NULL, NULL); + VECTOR_ELEM(*str, len) = 0; + } +} + void alstr_append_wrange(al_string *str, const wchar_t *from, const wchar_t *to) { int len; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/hrtf.c b/love/src/jni/openal-soft-1.19.1/Alc/hrtf.c similarity index 70% rename from love/src/jni/openal-soft-1.18.2/Alc/hrtf.c rename to love/src/jni/openal-soft-1.19.1/Alc/hrtf.c index d9968154..ddbd3a28 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/hrtf.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/hrtf.c @@ -28,8 +28,9 @@ #include "alMain.h" #include "alSource.h" #include "alu.h" -#include "bformatdec.h" #include "hrtf.h" +#include "alconfig.h" +#include "filters/splitter.h" #include "compat.h" #include "almalloc.h" @@ -40,12 +41,20 @@ #define MAX_IR_SIZE (512) #define MOD_IR_SIZE (8) +#define MIN_FD_COUNT (1) +#define MAX_FD_COUNT (16) + +#define MIN_FD_DISTANCE (50) +#define MAX_FD_DISTANCE (2500) + #define MIN_EV_COUNT (5) #define MAX_EV_COUNT (128) #define MIN_AZ_COUNT (1) #define MAX_AZ_COUNT (128) +#define MAX_HRIR_DELAY (HRTF_HISTORY_LENGTH-1) + struct HrtfEntry { struct HrtfEntry *next; struct Hrtf *handle; @@ -54,6 +63,7 @@ struct HrtfEntry { static const ALchar magicMarker00[8] = "MinPHR00"; static const ALchar magicMarker01[8] = "MinPHR01"; +static const ALchar magicMarker02[8] = "MinPHR02"; /* First value for pass-through coefficients (remaining are 0), used for omni- * directional sounds. */ @@ -64,37 +74,36 @@ static struct HrtfEntry *LoadedHrtfs = NULL; /* Calculate the elevation index given the polar elevation in radians. This - * will return an index between 0 and (evcount - 1). Assumes the FPU is in - * round-to-zero mode. + * will return an index between 0 and (evcount - 1). */ static ALsizei CalcEvIndex(ALsizei evcount, ALfloat ev, ALfloat *mu) { ALsizei idx; ev = (F_PI_2+ev) * (evcount-1) / F_PI; - idx = mini(fastf2i(ev), evcount-1); + idx = float2int(ev); *mu = ev - idx; - return idx; + return mini(idx, evcount-1); } /* Calculate the azimuth index given the polar azimuth in radians. This will - * return an index between 0 and (azcount - 1). Assumes the FPU is in round-to- - * zero mode. + * return an index between 0 and (azcount - 1). */ static ALsizei CalcAzIndex(ALsizei azcount, ALfloat az, ALfloat *mu) { ALsizei idx; az = (F_TAU+az) * azcount / F_TAU; - idx = fastf2i(az) % azcount; - *mu = az - floorf(az); - return idx; + idx = float2int(az); + *mu = az - idx; + return idx % azcount; } /* Calculates static HRIR coefficients and delays for the given polar elevation * and azimuth in radians. The coefficients are normalized. */ -void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat spread, ALfloat (*coeffs)[2], ALsizei *delays) +void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat spread, + ALfloat (*restrict coeffs)[2], ALsizei *delays) { ALsizei evidx, azidx, idx[4]; ALsizei evoffset; @@ -149,11 +158,11 @@ void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, /* Calculate the blended HRIR delays. */ delays[0] = fastf2i( Hrtf->delays[idx[0]][0]*blend[0] + Hrtf->delays[idx[1]][0]*blend[1] + - Hrtf->delays[idx[2]][0]*blend[2] + Hrtf->delays[idx[3]][0]*blend[3] + 0.5f + Hrtf->delays[idx[2]][0]*blend[2] + Hrtf->delays[idx[3]][0]*blend[3] ); delays[1] = fastf2i( Hrtf->delays[idx[0]][1]*blend[0] + Hrtf->delays[idx[1]][1]*blend[1] + - Hrtf->delays[idx[2]][1]*blend[2] + Hrtf->delays[idx[3]][1]*blend[3] + 0.5f + Hrtf->delays[idx[2]][1]*blend[2] + Hrtf->delays[idx[3]][1]*blend[3] ); /* Calculate the sample offsets for the HRIR indices. */ @@ -162,6 +171,8 @@ void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, idx[2] *= Hrtf->irSize; idx[3] *= Hrtf->irSize; + ASSUME(Hrtf->irSize >= MIN_IR_SIZE && (Hrtf->irSize%MOD_IR_SIZE) == 0); + coeffs = ASSUME_ALIGNED(coeffs, 16); /* Calculate the blended HRIR coefficients. */ coeffs[0][0] = PassthruCoeff * (1.0f-dirfact); coeffs[0][1] = PassthruCoeff * (1.0f-dirfact); @@ -172,16 +183,17 @@ void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, } for(c = 0;c < 4;c++) { + const ALfloat (*restrict srccoeffs)[2] = ASSUME_ALIGNED(Hrtf->coeffs+idx[c], 16); for(i = 0;i < Hrtf->irSize;i++) { - coeffs[i][0] += Hrtf->coeffs[idx[c]+i][0] * blend[c]; - coeffs[i][1] += Hrtf->coeffs[idx[c]+i][1] * blend[c]; + coeffs[i][0] += srccoeffs[i][0] * blend[c]; + coeffs[i][1] += srccoeffs[i][1] * blend[c]; } } } -ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsizei NumChannels, const ALfloat (*restrict AmbiPoints)[2], const ALfloat (*restrict AmbiMatrix)[2][MAX_AMBI_COEFFS], ALsizei AmbiCount) +void BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsizei NumChannels, const struct AngularPoint *AmbiPoints, const ALfloat (*restrict AmbiMatrix)[MAX_AMBI_COEFFS], ALsizei AmbiCount, const ALfloat *restrict AmbiOrderHFGain) { /* Set this to 2 for dual-band HRTF processing. May require a higher quality * band-splitter, or better calculation of the new IR length to deal with the @@ -189,12 +201,16 @@ ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsize */ #define NUM_BANDS 2 BandSplitter splitter; - ALsizei idx[HRTF_AMBI_MAX_CHANNELS]; + ALdouble (*tmpres)[HRIR_LENGTH][2]; + ALsizei *restrict idx; ALsizei min_delay = HRTF_HISTORY_LENGTH; + ALsizei max_delay = 0; ALfloat temps[3][HRIR_LENGTH]; - ALsizei max_length = 0; + ALsizei max_length; ALsizei i, c, b; + idx = al_calloc(DEF_ALIGN, AmbiCount*sizeof(*idx)); + for(c = 0;c < AmbiCount;c++) { ALuint evidx, azidx; @@ -202,23 +218,24 @@ ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsize ALuint azcount; /* Calculate elevation index. */ - evidx = (ALsizei)floorf((F_PI_2 + AmbiPoints[c][0]) * - (Hrtf->evCount-1)/F_PI + 0.5f); - evidx = mini(evidx, Hrtf->evCount-1); + evidx = (ALsizei)((F_PI_2+AmbiPoints[c].Elev) * (Hrtf->evCount-1) / F_PI + 0.5f); + evidx = clampi(evidx, 0, Hrtf->evCount-1); azcount = Hrtf->azCount[evidx]; evoffset = Hrtf->evOffset[evidx]; /* Calculate azimuth index for this elevation. */ - azidx = (ALsizei)floorf((F_TAU+AmbiPoints[c][1]) * - azcount/F_TAU + 0.5f) % azcount; + azidx = (ALsizei)((F_TAU+AmbiPoints[c].Azim) * azcount / F_TAU + 0.5f) % azcount; /* Calculate indices for left and right channels. */ idx[c] = evoffset + azidx; min_delay = mini(min_delay, mini(Hrtf->delays[idx[c]][0], Hrtf->delays[idx[c]][1])); + max_delay = maxi(max_delay, maxi(Hrtf->delays[idx[c]][0], Hrtf->delays[idx[c]][1])); } + tmpres = al_calloc(16, NumChannels * sizeof(*tmpres)); + memset(temps, 0, sizeof(temps)); bandsplit_init(&splitter, 400.0f / (ALfloat)Hrtf->sampleRate); for(c = 0;c < AmbiCount;c++) @@ -227,20 +244,17 @@ ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsize ALsizei ldelay = Hrtf->delays[idx[c]][0] - min_delay; ALsizei rdelay = Hrtf->delays[idx[c]][1] - min_delay; - max_length = maxi(max_length, - mini(maxi(ldelay, rdelay) + Hrtf->irSize, HRIR_LENGTH) - ); - if(NUM_BANDS == 1) { for(i = 0;i < NumChannels;++i) { + ALdouble mult = (ALdouble)AmbiOrderHFGain[(ALsizei)sqrt(i)] * AmbiMatrix[c][i]; ALsizei lidx = ldelay, ridx = rdelay; ALsizei j = 0; while(lidx < HRIR_LENGTH && ridx < HRIR_LENGTH && j < Hrtf->irSize) { - state->Chan[i].Coeffs[lidx++][0] += fir[j][0] * AmbiMatrix[c][0][i]; - state->Chan[i].Coeffs[ridx++][1] += fir[j][1] * AmbiMatrix[c][0][i]; + tmpres[i][lidx++][0] += fir[j][0] * mult; + tmpres[i][ridx++][1] += fir[j][1] * mult; j++; } } @@ -256,12 +270,14 @@ ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsize /* Apply left ear response with delay. */ for(i = 0;i < NumChannels;++i) { + ALfloat hfgain = AmbiOrderHFGain[(ALsizei)sqrt(i)]; for(b = 0;b < NUM_BANDS;b++) { + ALdouble mult = AmbiMatrix[c][i] * (ALdouble)((b==0) ? hfgain : 1.0); ALsizei lidx = ldelay; ALsizei j = 0; while(lidx < HRIR_LENGTH) - state->Chan[i].Coeffs[lidx++][0] += temps[b][j++] * AmbiMatrix[c][b][i]; + tmpres[i][lidx++][0] += temps[b][j++] * mult; } } @@ -274,29 +290,58 @@ ALsizei BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsize /* Apply right ear response with delay. */ for(i = 0;i < NumChannels;++i) { + ALfloat hfgain = AmbiOrderHFGain[(ALsizei)sqrt(i)]; for(b = 0;b < NUM_BANDS;b++) { + ALdouble mult = AmbiMatrix[c][i] * (ALdouble)((b==0) ? hfgain : 1.0); ALsizei ridx = rdelay; ALsizei j = 0; while(ridx < HRIR_LENGTH) - state->Chan[i].Coeffs[ridx++][1] += temps[b][j++] * AmbiMatrix[c][b][i]; + tmpres[i][ridx++][1] += temps[b][j++] * mult; } } } } - /* Round up to the next IR size multiple. */ - max_length = RoundUp(max_length, MOD_IR_SIZE); - TRACE("Skipped min delay: %d, new combined length: %d\n", min_delay, max_length); - return max_length; + for(i = 0;i < NumChannels;++i) + { + int idx; + for(idx = 0;idx < HRIR_LENGTH;idx++) + { + state->Chan[i].Coeffs[idx][0] = (ALfloat)tmpres[i][idx][0]; + state->Chan[i].Coeffs[idx][1] = (ALfloat)tmpres[i][idx][1]; + } + } + al_free(tmpres); + tmpres = NULL; + al_free(idx); + idx = NULL; + + if(NUM_BANDS == 1) + max_length = mini(max_delay-min_delay + Hrtf->irSize, HRIR_LENGTH); + else + { + /* Increase the IR size by 2/3rds to account for the tail generated by + * the band-split filter. + */ + const ALsizei irsize = mini(Hrtf->irSize*5/3, HRIR_LENGTH); + max_length = mini(max_delay-min_delay + irsize, HRIR_LENGTH); + } + /* Round up to the next IR size multiple. */ + max_length += MOD_IR_SIZE-1; + max_length -= max_length%MOD_IR_SIZE; + + TRACE("Skipped delay: %d, max delay: %d, new FIR length: %d\n", + min_delay, max_delay-min_delay, max_length); + state->IrSize = max_length; #undef NUM_BANDS } -static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount, ALsizei irCount, - const ALubyte *azCount, const ALushort *evOffset, - const ALfloat (*coeffs)[2], const ALubyte (*delays)[2], - const char *filename) +static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, + ALfloat distance, ALsizei evCount, ALsizei irCount, const ALubyte *azCount, + const ALushort *evOffset, const ALfloat (*coeffs)[2], const ALubyte (*delays)[2], + const char *filename) { struct Hrtf *Hrtf; size_t total; @@ -325,23 +370,26 @@ static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount InitRef(&Hrtf->ref, 0); Hrtf->sampleRate = rate; Hrtf->irSize = irSize; + Hrtf->distance = distance; Hrtf->evCount = evCount; /* Set up pointers to storage following the main HRTF struct. */ - _azCount = (ALubyte*)(base + offset); Hrtf->azCount = _azCount; + _azCount = (ALubyte*)(base + offset); offset += sizeof(_azCount[0])*evCount; offset = RoundUp(offset, sizeof(ALushort)); /* Align for ushort fields */ - _evOffset = (ALushort*)(base + offset); Hrtf->evOffset = _evOffset; + _evOffset = (ALushort*)(base + offset); offset += sizeof(_evOffset[0])*evCount; offset = RoundUp(offset, 16); /* Align for coefficients using SIMD */ - _coeffs = (ALfloat(*)[2])(base + offset); Hrtf->coeffs = _coeffs; + _coeffs = (ALfloat(*)[2])(base + offset); offset += sizeof(_coeffs[0])*irSize*irCount; - _delays = (ALubyte(*)[2])(base + offset); Hrtf->delays = _delays; + _delays = (ALubyte(*)[2])(base + offset); offset += sizeof(_delays[0])*irCount; + assert(offset == total); + /* Copy input data to storage. */ for(i = 0;i < evCount;i++) _azCount[i] = azCount[i]; for(i = 0;i < evCount;i++) _evOffset[i] = evOffset[i]; @@ -356,7 +404,11 @@ static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount _delays[i][1] = delays[i][1]; } - assert(offset == total); + /* Finally, assign the storage pointers. */ + Hrtf->azCount = _azCount; + Hrtf->evOffset = _evOffset; + Hrtf->coeffs = _coeffs; + Hrtf->delays = _delays; } return Hrtf; @@ -383,9 +435,16 @@ static ALushort GetLE_ALushort(const ALubyte **data, size_t *len) return ret; } -static ALint GetLE_ALuint(const ALubyte **data, size_t *len) +static ALint GetLE_ALint24(const ALubyte **data, size_t *len) { - ALint ret = (*data)[0] | ((*data)[1]<<8) | ((*data)[2]<<16) | ((*data)[3]<<24); + ALint ret = (*data)[0] | ((*data)[1]<<8) | ((*data)[2]<<16); + *data += 3; *len -= 3; + return (ret^0x800000) - 0x800000; +} + +static ALuint GetLE_ALuint(const ALubyte **data, size_t *len) +{ + ALuint ret = (*data)[0] | ((*data)[1]<<8) | ((*data)[2]<<16) | ((*data)[3]<<24); *data += 4; *len -= 4; return ret; } @@ -399,7 +458,6 @@ static const ALubyte *Get_ALubytePtr(const ALubyte **data, size_t *len, size_t s static struct Hrtf *LoadHrtf00(const ALubyte *data, size_t datalen, const char *filename) { - const ALubyte maxDelay = HRTF_HISTORY_LENGTH-1; struct Hrtf *Hrtf = NULL; ALboolean failed = AL_FALSE; ALuint rate = 0; @@ -525,9 +583,9 @@ static struct Hrtf *LoadHrtf00(const ALubyte *data, size_t datalen, const char * for(i = 0;i < irCount;i++) { delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > maxDelay) + if(delays[i][0] > MAX_HRIR_DELAY) { - ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], maxDelay); + ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); failed = AL_TRUE; } } @@ -552,7 +610,7 @@ static struct Hrtf *LoadHrtf00(const ALubyte *data, size_t datalen, const char * } } - Hrtf = CreateHrtfStore(rate, irSize, evCount, irCount, azCount, + Hrtf = CreateHrtfStore(rate, irSize, 0.0f, evCount, irCount, azCount, evOffset, coeffs, delays, filename); } @@ -565,7 +623,6 @@ static struct Hrtf *LoadHrtf00(const ALubyte *data, size_t datalen, const char * static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const char *filename) { - const ALubyte maxDelay = HRTF_HISTORY_LENGTH-1; struct Hrtf *Hrtf = NULL; ALboolean failed = AL_FALSE; ALuint rate = 0; @@ -674,9 +731,9 @@ static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const char * for(i = 0;i < irCount;i++) { delays[i][0] = GetLE_ALubyte(&data, &datalen); - if(delays[i][0] > maxDelay) + if(delays[i][0] > MAX_HRIR_DELAY) { - ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], maxDelay); + ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); failed = AL_TRUE; } } @@ -701,7 +758,7 @@ static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const char * } } - Hrtf = CreateHrtfStore(rate, irSize, evCount, irCount, azCount, + Hrtf = CreateHrtfStore(rate, irSize, 0.0f, evCount, irCount, azCount, evOffset, coeffs, delays, filename); } @@ -711,6 +768,253 @@ static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const char * return Hrtf; } +#define SAMPLETYPE_S16 0 +#define SAMPLETYPE_S24 1 + +#define CHANTYPE_LEFTONLY 0 +#define CHANTYPE_LEFTRIGHT 1 + +static struct Hrtf *LoadHrtf02(const ALubyte *data, size_t datalen, const char *filename) +{ + struct Hrtf *Hrtf = NULL; + ALboolean failed = AL_FALSE; + ALuint rate = 0; + ALubyte sampleType; + ALubyte channelType; + ALushort irCount = 0; + ALushort irSize = 0; + ALubyte fdCount = 0; + ALushort distance = 0; + ALubyte evCount = 0; + const ALubyte *azCount = NULL; + ALushort *evOffset = NULL; + ALfloat (*coeffs)[2] = NULL; + ALubyte (*delays)[2] = NULL; + ALsizei i, j; + + if(datalen < 8) + { + ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, 8, datalen); + return NULL; + } + + rate = GetLE_ALuint(&data, &datalen); + sampleType = GetLE_ALubyte(&data, &datalen); + channelType = GetLE_ALubyte(&data, &datalen); + + irSize = GetLE_ALubyte(&data, &datalen); + + fdCount = GetLE_ALubyte(&data, &datalen); + + if(sampleType > SAMPLETYPE_S24) + { + ERR("Unsupported sample type: %d\n", sampleType); + failed = AL_TRUE; + } + if(channelType > CHANTYPE_LEFTRIGHT) + { + ERR("Unsupported channel type: %d\n", channelType); + failed = AL_TRUE; + } + + if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE)) + { + ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n", + irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE); + failed = AL_TRUE; + } + if(fdCount != 1) + { + ERR("Multiple field-depths not supported: fdCount=%d (%d to %d)\n", + evCount, MIN_FD_COUNT, MAX_FD_COUNT); + failed = AL_TRUE; + } + if(failed) + return NULL; + + for(i = 0;i < fdCount;i++) + { + if(datalen < 3) + { + ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, 3, datalen); + return NULL; + } + + distance = GetLE_ALushort(&data, &datalen); + if(distance < MIN_FD_DISTANCE || distance > MAX_FD_DISTANCE) + { + ERR("Unsupported field distance: distance=%d (%dmm to %dmm)\n", + distance, MIN_FD_DISTANCE, MAX_FD_DISTANCE); + failed = AL_TRUE; + } + + evCount = GetLE_ALubyte(&data, &datalen); + if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT) + { + ERR("Unsupported elevation count: evCount=%d (%d to %d)\n", + evCount, MIN_EV_COUNT, MAX_EV_COUNT); + failed = AL_TRUE; + } + if(failed) + return NULL; + + if(datalen < evCount) + { + ERR("Unexpected end of %s data (req %d, rem "SZFMT"\n", filename, evCount, datalen); + return NULL; + } + + azCount = Get_ALubytePtr(&data, &datalen, evCount); + for(j = 0;j < evCount;j++) + { + if(azCount[j] < MIN_AZ_COUNT || azCount[j] > MAX_AZ_COUNT) + { + ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n", + j, azCount[j], MIN_AZ_COUNT, MAX_AZ_COUNT); + failed = AL_TRUE; + } + } + } + if(failed) + return NULL; + + evOffset = malloc(sizeof(evOffset[0])*evCount); + if(azCount == NULL || evOffset == NULL) + { + ERR("Out of memory.\n"); + failed = AL_TRUE; + } + + if(!failed) + { + evOffset[0] = 0; + irCount = azCount[0]; + for(i = 1;i < evCount;i++) + { + evOffset[i] = evOffset[i-1] + azCount[i-1]; + irCount += azCount[i]; + } + + coeffs = malloc(sizeof(coeffs[0])*irSize*irCount); + delays = malloc(sizeof(delays[0])*irCount); + if(coeffs == NULL || delays == NULL) + { + ERR("Out of memory.\n"); + failed = AL_TRUE; + } + } + + if(!failed) + { + size_t reqsize = 2*irSize*irCount + irCount; + if(datalen < reqsize) + { + ERR("Unexpected end of %s data (req "SZFMT", rem "SZFMT"\n", + filename, reqsize, datalen); + failed = AL_TRUE; + } + } + + if(!failed) + { + if(channelType == CHANTYPE_LEFTONLY) + { + if(sampleType == SAMPLETYPE_S16) + for(i = 0;i < irCount;i++) + { + for(j = 0;j < irSize;j++) + coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; + } + else if(sampleType == SAMPLETYPE_S24) + for(i = 0;i < irCount;i++) + { + for(j = 0;j < irSize;j++) + coeffs[i*irSize + j][0] = GetLE_ALint24(&data, &datalen) / 8388608.0f; + } + + for(i = 0;i < irCount;i++) + { + delays[i][0] = GetLE_ALubyte(&data, &datalen); + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%d][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + failed = AL_TRUE; + } + } + } + else if(channelType == CHANTYPE_LEFTRIGHT) + { + if(sampleType == SAMPLETYPE_S16) + for(i = 0;i < irCount;i++) + { + for(j = 0;j < irSize;j++) + { + coeffs[i*irSize + j][0] = GetLE_ALshort(&data, &datalen) / 32768.0f; + coeffs[i*irSize + j][1] = GetLE_ALshort(&data, &datalen) / 32768.0f; + } + } + else if(sampleType == SAMPLETYPE_S24) + for(i = 0;i < irCount;i++) + { + for(j = 0;j < irSize;j++) + { + coeffs[i*irSize + j][0] = GetLE_ALint24(&data, &datalen) / 8388608.0f; + coeffs[i*irSize + j][1] = GetLE_ALint24(&data, &datalen) / 8388608.0f; + } + } + + for(i = 0;i < irCount;i++) + { + delays[i][0] = GetLE_ALubyte(&data, &datalen); + if(delays[i][0] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%d][0]: %d (%d)\n", i, delays[i][0], MAX_HRIR_DELAY); + failed = AL_TRUE; + } + delays[i][1] = GetLE_ALubyte(&data, &datalen); + if(delays[i][1] > MAX_HRIR_DELAY) + { + ERR("Invalid delays[%d][1]: %d (%d)\n", i, delays[i][1], MAX_HRIR_DELAY); + failed = AL_TRUE; + } + } + } + } + + if(!failed) + { + if(channelType == CHANTYPE_LEFTONLY) + { + /* Mirror the left ear responses to the right ear. */ + for(i = 0;i < evCount;i++) + { + ALushort evoffset = evOffset[i]; + ALubyte azcount = azCount[i]; + for(j = 0;j < azcount;j++) + { + ALsizei lidx = evoffset + j; + ALsizei ridx = evoffset + ((azcount-j) % azcount); + ALsizei k; + + for(k = 0;k < irSize;k++) + coeffs[ridx*irSize + k][1] = coeffs[lidx*irSize + k][0]; + delays[ridx][1] = delays[lidx][0]; + } + } + } + + Hrtf = CreateHrtfStore(rate, irSize, + (ALfloat)distance / 1000.0f, evCount, irCount, azCount, evOffset, + coeffs, delays, filename + ); + } + + free(evOffset); + free(coeffs); + free(delays); + return Hrtf; +} + static void AddFileEntry(vector_EnumeratedHrtf *list, const_al_string filename) { @@ -730,12 +1034,12 @@ static void AddFileEntry(vector_EnumeratedHrtf *list, const_al_string filename) /* Check if this entry has already been added to the list. */ #define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf) VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY); +#undef MATCH_ENTRY if(iter != VECTOR_END(*list)) { TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename)); return; } -#undef MATCH_FNAME break; } @@ -792,7 +1096,7 @@ static void AddFileEntry(vector_EnumeratedHrtf *list, const_al_string filename) /* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer * for input instead of opening the given filename. */ -static void AddBuiltInEntry(vector_EnumeratedHrtf *list, const_al_string filename, size_t residx) +static void AddBuiltInEntry(vector_EnumeratedHrtf *list, const_al_string filename, ALuint residx) { EnumeratedHrtf entry = { AL_STRING_INIT_STATIC(), NULL }; struct HrtfEntry *loaded_entry; @@ -809,12 +1113,12 @@ static void AddBuiltInEntry(vector_EnumeratedHrtf *list, const_al_string filenam { #define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf) VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY); +#undef MATCH_ENTRY if(iter != VECTOR_END(*list)) { TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename)); return; } -#undef MATCH_FNAME break; } @@ -832,7 +1136,7 @@ static void AddBuiltInEntry(vector_EnumeratedHrtf *list, const_al_string filenam ); loaded_entry->next = LoadedHrtfs; loaded_entry->handle = hrtf; - snprintf(loaded_entry->filename, namelen, "!"SZFMT"_%s", + snprintf(loaded_entry->filename, namelen, "!%u_%s", residx, alstr_get_cstr(filename)); LoadedHrtfs = loaded_entry; } @@ -1020,7 +1324,7 @@ struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry) struct FileMapping fmap; const ALubyte *rdata; const char *name; - size_t residx; + ALuint residx; size_t rsize; char ch; @@ -1036,7 +1340,7 @@ struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry) fmap.ptr = NULL; fmap.len = 0; - if(sscanf(entry->filename, "!"SZFMT"%c", &residx, &ch) == 2 && ch == '_') + if(sscanf(entry->filename, "!%u%c", &residx, &ch) == 2 && ch == '_') { name = strchr(entry->filename, ch)+1; @@ -1044,7 +1348,7 @@ struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry) rdata = GetResource(residx, &rsize); if(rdata == NULL || rsize == 0) { - ERR("Could not get resource "SZFMT", %s\n", residx, name); + ERR("Could not get resource %u, %s\n", residx, name); goto done; } } @@ -1064,8 +1368,15 @@ struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry) rsize = fmap.len; } - if(rsize < sizeof(magicMarker01)) + if(rsize < sizeof(magicMarker02)) ERR("%s data is too short ("SZFMT" bytes)\n", name, rsize); + else if(memcmp(rdata, magicMarker02, sizeof(magicMarker02)) == 0) + { + TRACE("Detected data set format v2\n"); + hrtf = LoadHrtf02(rdata+sizeof(magicMarker02), + rsize-sizeof(magicMarker02), name + ); + } else if(memcmp(rdata, magicMarker01, sizeof(magicMarker01)) == 0) { TRACE("Detected data set format v1\n"); diff --git a/love/src/jni/openal-soft-1.19.1/Alc/hrtf.h b/love/src/jni/openal-soft-1.19.1/Alc/hrtf.h new file mode 100644 index 00000000..ab68929b --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/hrtf.h @@ -0,0 +1,84 @@ +#ifndef ALC_HRTF_H +#define ALC_HRTF_H + +#include "AL/al.h" +#include "AL/alc.h" + +#include "alMain.h" +#include "alstring.h" +#include "atomic.h" + + +#define HRTF_HISTORY_BITS (6) +#define HRTF_HISTORY_LENGTH (1< + + +#ifdef __GNUC__ +#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z)))) +#else +#define DECL_FORMAT(x, y, z) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +extern FILE *LogFile; + +#if defined(__GNUC__) && !defined(_WIN32) +#define AL_PRINT(T, MSG, ...) fprintf(LogFile, "AL lib: %s %s: "MSG, T, __FUNCTION__ , ## __VA_ARGS__) +#else +void al_print(const char *type, const char *func, const char *fmt, ...) DECL_FORMAT(printf, 3,4); +#define AL_PRINT(T, ...) al_print((T), __FUNCTION__, __VA_ARGS__) +#endif + +#ifdef __ANDROID__ +#include +#define LOG_ANDROID(T, MSG, ...) __android_log_print(T, "openal", "AL lib: %s: "MSG, __FUNCTION__ , ## __VA_ARGS__) +#else +#define LOG_ANDROID(T, MSG, ...) ((void)0) +#endif + +enum LogLevel { + NoLog, + LogError, + LogWarning, + LogTrace, + LogRef +}; +extern enum LogLevel LogLevel; + +#define TRACEREF(...) do { \ + if(LogLevel >= LogRef) \ + AL_PRINT("(--)", __VA_ARGS__); \ +} while(0) + +#define TRACE(...) do { \ + if(LogLevel >= LogTrace) \ + AL_PRINT("(II)", __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_DEBUG, __VA_ARGS__); \ +} while(0) + +#define WARN(...) do { \ + if(LogLevel >= LogWarning) \ + AL_PRINT("(WW)", __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_WARN, __VA_ARGS__); \ +} while(0) + +#define ERR(...) do { \ + if(LogLevel >= LogError) \ + AL_PRINT("(EE)", __VA_ARGS__); \ + LOG_ANDROID(ANDROID_LOG_ERROR, __VA_ARGS__); \ +} while(0) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LOGGING_H */ diff --git a/love/src/jni/openal-soft-1.19.1/Alc/mastering.c b/love/src/jni/openal-soft-1.19.1/Alc/mastering.c new file mode 100644 index 00000000..52ff5b23 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/mastering.c @@ -0,0 +1,530 @@ +#include "config.h" + +#include + +#include "mastering.h" +#include "alu.h" +#include "almalloc.h" +#include "static_assert.h" + + +/* These structures assume BUFFERSIZE is a power of 2. */ +static_assert((BUFFERSIZE & (BUFFERSIZE-1)) == 0, "BUFFERSIZE is not a power of 2"); + +typedef struct SlidingHold { + ALfloat Values[BUFFERSIZE]; + ALsizei Expiries[BUFFERSIZE]; + ALsizei LowerIndex; + ALsizei UpperIndex; + ALsizei Length; +} SlidingHold; + +/* General topology and basic automation was based on the following paper: + * + * D. Giannoulis, M. Massberg and J. D. Reiss, + * "Parameter Automation in a Dynamic Range Compressor," + * Journal of the Audio Engineering Society, v61 (10), Oct. 2013 + * + * Available (along with supplemental reading) at: + * + * http://c4dm.eecs.qmul.ac.uk/audioengineering/compressors/ + */ +typedef struct Compressor { + ALsizei NumChans; + ALuint SampleRate; + + struct { + ALuint Knee : 1; + ALuint Attack : 1; + ALuint Release : 1; + ALuint PostGain : 1; + ALuint Declip : 1; + } Auto; + + ALsizei LookAhead; + + ALfloat PreGain; + ALfloat PostGain; + + ALfloat Threshold; + ALfloat Slope; + ALfloat Knee; + + ALfloat Attack; + ALfloat Release; + + alignas(16) ALfloat SideChain[2*BUFFERSIZE]; + alignas(16) ALfloat CrestFactor[BUFFERSIZE]; + + SlidingHold *Hold; + ALfloat (*Delay)[BUFFERSIZE]; + ALsizei DelayIndex; + + ALfloat CrestCoeff; + ALfloat GainEstimate; + ALfloat AdaptCoeff; + + ALfloat LastPeakSq; + ALfloat LastRmsSq; + ALfloat LastRelease; + ALfloat LastAttack; + ALfloat LastGainDev; +} Compressor; + + +/* This sliding hold follows the input level with an instant attack and a + * fixed duration hold before an instant release to the next highest level. + * It is a sliding window maximum (descending maxima) implementation based on + * Richard Harter's ascending minima algorithm available at: + * + * http://www.richardhartersworld.com/cri/2001/slidingmin.html + */ +static ALfloat UpdateSlidingHold(SlidingHold *Hold, const ALsizei i, const ALfloat in) +{ + const ALsizei mask = BUFFERSIZE - 1; + const ALsizei length = Hold->Length; + ALfloat *restrict values = Hold->Values; + ALsizei *restrict expiries = Hold->Expiries; + ALsizei lowerIndex = Hold->LowerIndex; + ALsizei upperIndex = Hold->UpperIndex; + + if(i >= expiries[upperIndex]) + upperIndex = (upperIndex + 1) & mask; + + if(in >= values[upperIndex]) + { + values[upperIndex] = in; + expiries[upperIndex] = i + length; + lowerIndex = upperIndex; + } + else + { + do { + do { + if(!(in >= values[lowerIndex])) + goto found_place; + } while(lowerIndex--); + lowerIndex = mask; + } while(1); + found_place: + + lowerIndex = (lowerIndex + 1) & mask; + values[lowerIndex] = in; + expiries[lowerIndex] = i + length; + } + + Hold->LowerIndex = lowerIndex; + Hold->UpperIndex = upperIndex; + + return values[upperIndex]; +} + +static void ShiftSlidingHold(SlidingHold *Hold, const ALsizei n) +{ + const ALsizei lowerIndex = Hold->LowerIndex; + ALsizei *restrict expiries = Hold->Expiries; + ALsizei i = Hold->UpperIndex; + + if(lowerIndex < i) + { + for(;i < BUFFERSIZE;i++) + expiries[i] -= n; + i = 0; + } + for(;i < lowerIndex;i++) + expiries[i] -= n; + + expiries[i] -= n; +} + +/* Multichannel compression is linked via the absolute maximum of all + * channels. + */ +static void LinkChannels(Compressor *Comp, const ALsizei SamplesToDo, ALfloat (*restrict OutBuffer)[BUFFERSIZE]) +{ + const ALsizei index = Comp->LookAhead; + const ALsizei numChans = Comp->NumChans; + ALfloat *restrict sideChain = Comp->SideChain; + ALsizei c, i; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + + for(i = 0;i < SamplesToDo;i++) + sideChain[index + i] = 0.0f; + + for(c = 0;c < numChans;c++) + { + ALsizei offset = index; + for(i = 0;i < SamplesToDo;i++) + { + sideChain[offset] = maxf(sideChain[offset], fabsf(OutBuffer[c][i])); + ++offset; + } + } +} + +/* This calculates the squared crest factor of the control signal for the + * basic automation of the attack/release times. As suggested by the paper, + * it uses an instantaneous squared peak detector and a squared RMS detector + * both with 200ms release times. + */ +static void CrestDetector(Compressor *Comp, const ALsizei SamplesToDo) +{ + const ALfloat a_crest = Comp->CrestCoeff; + const ALsizei index = Comp->LookAhead; + const ALfloat *restrict sideChain = Comp->SideChain; + ALfloat *restrict crestFactor = Comp->CrestFactor; + ALfloat y2_peak = Comp->LastPeakSq; + ALfloat y2_rms = Comp->LastRmsSq; + ALsizei i; + + ASSUME(SamplesToDo > 0); + + for(i = 0;i < SamplesToDo;i++) + { + ALfloat x_abs = sideChain[index + i]; + ALfloat x2 = maxf(0.000001f, x_abs * x_abs); + + y2_peak = maxf(x2, lerp(x2, y2_peak, a_crest)); + y2_rms = lerp(x2, y2_rms, a_crest); + crestFactor[i] = y2_peak / y2_rms; + } + + Comp->LastPeakSq = y2_peak; + Comp->LastRmsSq = y2_rms; +} + +/* The side-chain starts with a simple peak detector (based on the absolute + * value of the incoming signal) and performs most of its operations in the + * log domain. + */ +static void PeakDetector(Compressor *Comp, const ALsizei SamplesToDo) +{ + const ALsizei index = Comp->LookAhead; + ALfloat *restrict sideChain = Comp->SideChain; + ALsizei i; + + ASSUME(SamplesToDo > 0); + + for(i = 0;i < SamplesToDo;i++) + { + const ALuint offset = index + i; + const ALfloat x_abs = sideChain[offset]; + + sideChain[offset] = logf(maxf(0.000001f, x_abs)); + } +} + +/* An optional hold can be used to extend the peak detector so it can more + * solidly detect fast transients. This is best used when operating as a + * limiter. + */ +static void PeakHoldDetector(Compressor *Comp, const ALsizei SamplesToDo) +{ + const ALsizei index = Comp->LookAhead; + ALfloat *restrict sideChain = Comp->SideChain; + SlidingHold *hold = Comp->Hold; + ALsizei i; + + ASSUME(SamplesToDo > 0); + + for(i = 0;i < SamplesToDo;i++) + { + const ALsizei offset = index + i; + const ALfloat x_abs = sideChain[offset]; + const ALfloat x_G = logf(maxf(0.000001f, x_abs)); + + sideChain[offset] = UpdateSlidingHold(hold, i, x_G); + } + + ShiftSlidingHold(hold, SamplesToDo); +} + +/* This is the heart of the feed-forward compressor. It operates in the log + * domain (to better match human hearing) and can apply some basic automation + * to knee width, attack/release times, make-up/post gain, and clipping + * reduction. + */ +static void GainCompressor(Compressor *Comp, const ALsizei SamplesToDo) +{ + const bool autoKnee = Comp->Auto.Knee; + const bool autoAttack = Comp->Auto.Attack; + const bool autoRelease = Comp->Auto.Release; + const bool autoPostGain = Comp->Auto.PostGain; + const bool autoDeclip = Comp->Auto.Declip; + const ALsizei lookAhead = Comp->LookAhead; + const ALfloat threshold = Comp->Threshold; + const ALfloat slope = Comp->Slope; + const ALfloat attack = Comp->Attack; + const ALfloat release = Comp->Release; + const ALfloat c_est = Comp->GainEstimate; + const ALfloat a_adp = Comp->AdaptCoeff; + const ALfloat *restrict crestFactor = Comp->CrestFactor; + ALfloat *restrict sideChain = Comp->SideChain; + ALfloat postGain = Comp->PostGain; + ALfloat knee = Comp->Knee; + ALfloat t_att = attack; + ALfloat t_rel = release - attack; + ALfloat a_att = expf(-1.0f / t_att); + ALfloat a_rel = expf(-1.0f / t_rel); + ALfloat y_1 = Comp->LastRelease; + ALfloat y_L = Comp->LastAttack; + ALfloat c_dev = Comp->LastGainDev; + ALsizei i; + + ASSUME(SamplesToDo > 0); + + for(i = 0;i < SamplesToDo;i++) + { + const ALfloat y2_crest = crestFactor[i]; + const ALfloat x_G = sideChain[lookAhead + i]; + const ALfloat x_over = x_G - threshold; + ALfloat knee_h; + ALfloat y_G; + ALfloat x_L; + + if(autoKnee) + knee = maxf(0.0f, 2.5f * (c_dev + c_est)); + knee_h = 0.5f * knee; + + /* This is the gain computer. It applies a static compression curve + * to the control signal. + */ + if(x_over <= -knee_h) + y_G = 0.0f; + else if(fabsf(x_over) < knee_h) + y_G = (x_over + knee_h) * (x_over + knee_h) / (2.0f * knee); + else + y_G = x_over; + + x_L = -slope * y_G; + + if(autoAttack) + { + t_att = 2.0f * attack / y2_crest; + a_att = expf(-1.0f / t_att); + } + + if(autoRelease) + { + t_rel = 2.0f * release / y2_crest - t_att; + a_rel = expf(-1.0f / t_rel); + } + + /* Gain smoothing (ballistics) is done via a smooth decoupled peak + * detector. The attack time is subtracted from the release time + * above to compensate for the chained operating mode. + */ + y_1 = maxf(x_L, lerp(x_L, y_1, a_rel)); + y_L = lerp(y_1, y_L, a_att); + + /* Knee width and make-up gain automation make use of a smoothed + * measurement of deviation between the control signal and estimate. + * The estimate is also used to bias the measurement to hot-start its + * average. + */ + c_dev = lerp(-y_L - c_est, c_dev, a_adp); + + if(autoPostGain) + { + /* Clipping reduction is only viable when make-up gain is being + * automated. It modifies the deviation to further attenuate the + * control signal when clipping is detected. The adaptation + * time is sufficiently long enough to suppress further clipping + * at the same output level. + */ + if(autoDeclip) + c_dev = maxf(c_dev, sideChain[i] - y_L - threshold - c_est); + + postGain = -(c_dev + c_est); + } + + sideChain[i] = expf(postGain - y_L); + } + + Comp->LastRelease = y_1; + Comp->LastAttack = y_L; + Comp->LastGainDev = c_dev; +} + +/* Combined with the hold time, a look-ahead delay can improve handling of + * fast transients by allowing the envelope time to converge prior to + * reaching the offending impulse. This is best used when operating as a + * limiter. + */ +static void SignalDelay(Compressor *Comp, const ALsizei SamplesToDo, ALfloat (*restrict OutBuffer)[BUFFERSIZE]) +{ + const ALsizei mask = BUFFERSIZE - 1; + const ALsizei numChans = Comp->NumChans; + const ALsizei indexIn = Comp->DelayIndex; + const ALsizei indexOut = Comp->DelayIndex - Comp->LookAhead; + ALfloat (*restrict delay)[BUFFERSIZE] = Comp->Delay; + ALsizei c, i; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + + for(c = 0;c < numChans;c++) + { + for(i = 0;i < SamplesToDo;i++) + { + ALfloat sig = OutBuffer[c][i]; + + OutBuffer[c][i] = delay[c][(indexOut + i) & mask]; + delay[c][(indexIn + i) & mask] = sig; + } + } + + Comp->DelayIndex = (indexIn + SamplesToDo) & mask; +} + +/* The compressor is initialized with the following settings: + * + * NumChans - Number of channels to process. + * SampleRate - Sample rate to process. + * AutoKnee - Whether to automate the knee width parameter. + * AutoAttack - Whether to automate the attack time parameter. + * AutoRelease - Whether to automate the release time parameter. + * AutoPostGain - Whether to automate the make-up (post) gain parameter. + * AutoDeclip - Whether to automate clipping reduction. Ignored when + * not automating make-up gain. + * LookAheadTime - Look-ahead time (in seconds). + * HoldTime - Peak hold-time (in seconds). + * PreGainDb - Gain applied before detection (in dB). + * PostGainDb - Make-up gain applied after compression (in dB). + * ThresholdDb - Triggering threshold (in dB). + * Ratio - Compression ratio (x:1). Set to INFINITY for true + * limiting. Ignored when automating knee width. + * KneeDb - Knee width (in dB). Ignored when automating knee + * width. + * AttackTimeMin - Attack time (in seconds). Acts as a maximum when + * automating attack time. + * ReleaseTimeMin - Release time (in seconds). Acts as a maximum when + * automating release time. + */ +Compressor* CompressorInit(const ALsizei NumChans, const ALuint SampleRate, + const ALboolean AutoKnee, const ALboolean AutoAttack, + const ALboolean AutoRelease, const ALboolean AutoPostGain, + const ALboolean AutoDeclip, const ALfloat LookAheadTime, + const ALfloat HoldTime, const ALfloat PreGainDb, + const ALfloat PostGainDb, const ALfloat ThresholdDb, + const ALfloat Ratio, const ALfloat KneeDb, + const ALfloat AttackTime, const ALfloat ReleaseTime) +{ + Compressor *Comp; + ALsizei lookAhead; + ALsizei hold; + size_t size; + + lookAhead = (ALsizei)clampf(roundf(LookAheadTime*SampleRate), 0.0f, BUFFERSIZE-1); + hold = (ALsizei)clampf(roundf(HoldTime*SampleRate), 0.0f, BUFFERSIZE-1); + /* The sliding hold implementation doesn't handle a length of 1. A 1-sample + * hold is useless anyway, it would only ever give back what was just given + * to it. + */ + if(hold == 1) + hold = 0; + + size = sizeof(*Comp); + if(lookAhead > 0) + { + size += sizeof(*Comp->Delay) * NumChans; + if(hold > 0) + size += sizeof(*Comp->Hold); + } + + Comp = al_calloc(16, size); + Comp->NumChans = NumChans; + Comp->SampleRate = SampleRate; + Comp->Auto.Knee = AutoKnee; + Comp->Auto.Attack = AutoAttack; + Comp->Auto.Release = AutoRelease; + Comp->Auto.PostGain = AutoPostGain; + Comp->Auto.Declip = AutoPostGain && AutoDeclip; + Comp->LookAhead = lookAhead; + Comp->PreGain = powf(10.0f, PreGainDb / 20.0f); + Comp->PostGain = PostGainDb * logf(10.0f) / 20.0f; + Comp->Threshold = ThresholdDb * logf(10.0f) / 20.0f; + Comp->Slope = 1.0f / maxf(1.0f, Ratio) - 1.0f; + Comp->Knee = maxf(0.0f, KneeDb * logf(10.0f) / 20.0f); + Comp->Attack = maxf(1.0f, AttackTime * SampleRate); + Comp->Release = maxf(1.0f, ReleaseTime * SampleRate); + + /* Knee width automation actually treats the compressor as a limiter. By + * varying the knee width, it can effectively be seen as applying + * compression over a wide range of ratios. + */ + if(AutoKnee) + Comp->Slope = -1.0f; + + if(lookAhead > 0) + { + if(hold > 0) + { + Comp->Hold = (SlidingHold*)(Comp + 1); + Comp->Hold->Values[0] = -INFINITY; + Comp->Hold->Expiries[0] = hold; + Comp->Hold->Length = hold; + Comp->Delay = (ALfloat(*)[])(Comp->Hold + 1); + } + else + { + Comp->Delay = (ALfloat(*)[])(Comp + 1); + } + } + + Comp->CrestCoeff = expf(-1.0f / (0.200f * SampleRate)); // 200ms + Comp->GainEstimate = Comp->Threshold * -0.5f * Comp->Slope; + Comp->AdaptCoeff = expf(-1.0f / (2.0f * SampleRate)); // 2s + + return Comp; +} + +void ApplyCompression(Compressor *Comp, const ALsizei SamplesToDo, ALfloat (*restrict OutBuffer)[BUFFERSIZE]) +{ + const ALsizei numChans = Comp->NumChans; + const ALfloat preGain = Comp->PreGain; + ALfloat *restrict sideChain; + ALsizei c, i; + + ASSUME(SamplesToDo > 0); + ASSUME(numChans > 0); + + if(preGain != 1.0f) + { + for(c = 0;c < numChans;c++) + { + for(i = 0;i < SamplesToDo;i++) + OutBuffer[c][i] *= preGain; + } + } + + LinkChannels(Comp, SamplesToDo, OutBuffer); + + if(Comp->Auto.Attack || Comp->Auto.Release) + CrestDetector(Comp, SamplesToDo); + + if(Comp->Hold) + PeakHoldDetector(Comp, SamplesToDo); + else + PeakDetector(Comp, SamplesToDo); + + GainCompressor(Comp, SamplesToDo); + + if(Comp->Delay) + SignalDelay(Comp, SamplesToDo, OutBuffer); + + sideChain = Comp->SideChain; + for(c = 0;c < numChans;c++) + { + for(i = 0;i < SamplesToDo;i++) + OutBuffer[c][i] *= sideChain[i]; + } + + memmove(sideChain, sideChain+SamplesToDo, Comp->LookAhead*sizeof(ALfloat)); +} + + +ALsizei GetCompressorLookAhead(const Compressor *Comp) +{ return Comp->LookAhead; } diff --git a/love/src/jni/openal-soft-1.19.1/Alc/mastering.h b/love/src/jni/openal-soft-1.19.1/Alc/mastering.h new file mode 100644 index 00000000..b68b0de1 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/mastering.h @@ -0,0 +1,49 @@ +#ifndef MASTERING_H +#define MASTERING_H + +#include "AL/al.h" + +/* For BUFFERSIZE. */ +#include "alMain.h" + +struct Compressor; + +/* The compressor is initialized with the following settings: + * + * NumChans - Number of channels to process. + * SampleRate - Sample rate to process. + * AutoKnee - Whether to automate the knee width parameter. + * AutoAttack - Whether to automate the attack time parameter. + * AutoRelease - Whether to automate the release time parameter. + * AutoPostGain - Whether to automate the make-up (post) gain parameter. + * AutoDeclip - Whether to automate clipping reduction. Ignored when + * not automating make-up gain. + * LookAheadTime - Look-ahead time (in seconds). + * HoldTime - Peak hold-time (in seconds). + * PreGainDb - Gain applied before detection (in dB). + * PostGainDb - Make-up gain applied after compression (in dB). + * ThresholdDb - Triggering threshold (in dB). + * Ratio - Compression ratio (x:1). Set to INFINIFTY for true + * limiting. Ignored when automating knee width. + * KneeDb - Knee width (in dB). Ignored when automating knee + * width. + * AttackTimeMin - Attack time (in seconds). Acts as a maximum when + * automating attack time. + * ReleaseTimeMin - Release time (in seconds). Acts as a maximum when + * automating release time. + */ +struct Compressor* CompressorInit(const ALsizei NumChans, const ALuint SampleRate, + const ALboolean AutoKnee, const ALboolean AutoAttack, + const ALboolean AutoRelease, const ALboolean AutoPostGain, + const ALboolean AutoDeclip, const ALfloat LookAheadTime, + const ALfloat HoldTime, const ALfloat PreGainDb, + const ALfloat PostGainDb, const ALfloat ThresholdDb, + const ALfloat Ratio, const ALfloat KneeDb, + const ALfloat AttackTime, const ALfloat ReleaseTime); + +void ApplyCompression(struct Compressor *Comp, const ALsizei SamplesToDo, + ALfloat (*restrict OutBuffer)[BUFFERSIZE]); + +ALsizei GetCompressorLookAhead(const struct Compressor *Comp); + +#endif /* MASTERING_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_defs.h b/love/src/jni/openal-soft-1.19.1/Alc/mixer/defs.h similarity index 62% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_defs.h rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/defs.h index 462d6179..8f6e3755 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_defs.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/defs.h @@ -12,11 +12,11 @@ struct MixHrtfParams; struct HrtfState; /* C resamplers */ -const ALfloat *Resample_copy32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_point32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_lerp32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_fir4_32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); -const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_copy_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_point_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_lerp_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_cubic_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); +const ALfloat *Resample_bsinc_C(const InterpState *state, const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei dstlen); /* C mixers */ @@ -62,7 +62,7 @@ void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* SSE resamplers */ -inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size) +inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALsizei *restrict pos_arr, ALsizei size) { ALsizei i; @@ -76,23 +76,16 @@ inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restr } } -const ALfloat *Resample_lerp32_SSE2(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_lerp32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); +const ALfloat *Resample_lerp_SSE2(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_lerp_SSE41(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE3(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir4_32_SSE41(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); - -const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); /* Neon mixers */ void MixHrtf_Neon(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, @@ -116,14 +109,11 @@ void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, ALsizei InPos, ALsizei BufferSize); /* Neon resamplers */ -const ALfloat *Resample_lerp32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_fir4_32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei numsamples); -const ALfloat *Resample_bsinc32_Neon(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen); +const ALfloat *Resample_lerp_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei numsamples); +const ALfloat *Resample_bsinc_Neon(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen); #endif /* MIXER_DEFS_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_inc.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/hrtf_inc.c similarity index 80% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_inc.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/hrtf_inc.c index 3c9d4dc5..3ef22f24 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_inc.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/hrtf_inc.c @@ -4,9 +4,9 @@ #include "alSource.h" #include "hrtf.h" -#include "mixer_defs.h" #include "align.h" #include "alu.h" +#include "defs.h" static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], @@ -22,18 +22,24 @@ void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, { const ALfloat (*Coeffs)[2] = ASSUME_ALIGNED(hrtfparams->Coeffs, 16); const ALsizei Delay[2] = { hrtfparams->Delay[0], hrtfparams->Delay[1] }; - ALfloat gainstep = hrtfparams->GainStep; - ALfloat gain = hrtfparams->Gain; + const ALfloat gainstep = hrtfparams->GainStep; + const ALfloat gain = hrtfparams->Gain; + ALfloat g, stepcount = 0.0f; ALfloat left, right; ALsizei i; + ASSUME(IrSize >= 4); + ASSUME(BufferSize > 0); + LeftOut += OutPos; RightOut += OutPos; for(i = 0;i < BufferSize;i++) { hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*gain; - right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*gain; + + g = gain + gainstep*stepcount; + left = hrtfstate->History[(Offset-Delay[0])&HRTF_HISTORY_MASK]*g; + right = hrtfstate->History[(Offset-Delay[1])&HRTF_HISTORY_MASK]*g; hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][0] = 0.0f; hrtfstate->Values[(Offset+IrSize-1)&HRIR_MASK][1] = 0.0f; @@ -42,10 +48,10 @@ void MixHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - gain += gainstep; + stepcount += 1.0f; Offset++; } - hrtfparams->Gain = gain; + hrtfparams->Gain = gain + gainstep*stepcount; } void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, @@ -56,15 +62,19 @@ void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, { const ALfloat (*OldCoeffs)[2] = ASSUME_ALIGNED(oldparams->Coeffs, 16); const ALsizei OldDelay[2] = { oldparams->Delay[0], oldparams->Delay[1] }; - ALfloat oldGain = oldparams->Gain; - ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize; + const ALfloat oldGain = oldparams->Gain; + const ALfloat oldGainStep = -oldGain / (ALfloat)BufferSize; const ALfloat (*NewCoeffs)[2] = ASSUME_ALIGNED(newparams->Coeffs, 16); const ALsizei NewDelay[2] = { newparams->Delay[0], newparams->Delay[1] }; - ALfloat newGain = newparams->Gain; - ALfloat newGainStep = newparams->GainStep; + const ALfloat newGain = newparams->Gain; + const ALfloat newGainStep = newparams->GainStep; + ALfloat g, stepcount = 0.0f; ALfloat left, right; ALsizei i; + ASSUME(IrSize >= 4); + ASSUME(BufferSize > 0); + LeftOut += OutPos; RightOut += OutPos; for(i = 0;i < BufferSize;i++) @@ -74,22 +84,23 @@ void MixHrtfBlend(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, hrtfstate->History[Offset&HRTF_HISTORY_MASK] = *(data++); - left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*oldGain; - right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*oldGain; + g = oldGain + oldGainStep*stepcount; + left = hrtfstate->History[(Offset-OldDelay[0])&HRTF_HISTORY_MASK]*g; + right = hrtfstate->History[(Offset-OldDelay[1])&HRTF_HISTORY_MASK]*g; ApplyCoeffs(Offset, hrtfstate->Values, IrSize, OldCoeffs, left, right); - left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*newGain; - right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*newGain; + g = newGain + newGainStep*stepcount; + left = hrtfstate->History[(Offset-NewDelay[0])&HRTF_HISTORY_MASK]*g; + right = hrtfstate->History[(Offset-NewDelay[1])&HRTF_HISTORY_MASK]*g; ApplyCoeffs(Offset, hrtfstate->Values, IrSize, NewCoeffs, left, right); *(LeftOut++) += hrtfstate->Values[Offset&HRIR_MASK][0]; *(RightOut++) += hrtfstate->Values[Offset&HRIR_MASK][1]; - oldGain += oldGainStep; - newGain += newGainStep; + stepcount += 1.0f; Offset++; } - newparams->Gain = newGain; + newparams->Gain = newGain + newGainStep*stepcount; } void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, @@ -100,6 +111,9 @@ void MixDirectHrtf(ALfloat *restrict LeftOut, ALfloat *restrict RightOut, ALfloat insample; ALsizei i; + ASSUME(IrSize >= 4); + ASSUME(BufferSize > 0); + for(i = 0;i < BufferSize;i++) { Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_c.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_c.c similarity index 51% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_c.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_c.c index 87f2fe90..14d7c669 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_c.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_c.c @@ -6,17 +6,42 @@ #include "alu.h" #include "alSource.h" #include "alAuxEffectSlot.h" +#include "defs.h" -static inline ALfloat point32(const ALfloat *restrict vals, ALsizei UNUSED(frac)) +static inline ALfloat do_point(const InterpState* UNUSED(state), const ALfloat *restrict vals, ALsizei UNUSED(frac)) { return vals[0]; } -static inline ALfloat lerp32(const ALfloat *restrict vals, ALsizei frac) +static inline ALfloat do_lerp(const InterpState* UNUSED(state), const ALfloat *restrict vals, ALsizei frac) { return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); } -static inline ALfloat fir4_32(const ALfloat *restrict vals, ALsizei frac) -{ return resample_fir4(vals[-1], vals[0], vals[1], vals[2], frac); } +static inline ALfloat do_cubic(const InterpState* UNUSED(state), const ALfloat *restrict vals, ALsizei frac) +{ return cubic(vals[0], vals[1], vals[2], vals[3], frac * (1.0f/FRACTIONONE)); } +static inline ALfloat do_bsinc(const InterpState *state, const ALfloat *restrict vals, ALsizei frac) +{ + const ALfloat *fil, *scd, *phd, *spd; + ALsizei j_f, pi; + ALfloat pf, r; + ASSUME(state->bsinc.m > 0); -const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + pi = frac >> FRAC_PHASE_BITDIFF; + pf = (frac & ((1<bsinc.filter + state->bsinc.m*pi*4, 16); + scd = ASSUME_ALIGNED(fil + state->bsinc.m, 16); + phd = ASSUME_ALIGNED(scd + state->bsinc.m, 16); + spd = ASSUME_ALIGNED(phd + state->bsinc.m, 16); + + // Apply the scale and phase interpolated filter. + r = 0.0f; + for(j_f = 0;j_f < state->bsinc.m;j_f++) + r += (fil[j_f] + state->bsinc.sf*scd[j_f] + pf*(phd[j_f] + state->bsinc.sf*spd[j_f])) * vals[j_f]; + return r; +} + +const ALfloat *Resample_copy_C(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei UNUSED(frac), ALint UNUSED(increment), ALfloat *restrict dst, ALsizei numsamples) { @@ -29,15 +54,20 @@ const ALfloat *Resample_copy32_C(const InterpState* UNUSED(state), return dst; } -#define DECL_TEMPLATE(Sampler) \ -const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ +#define DECL_TEMPLATE(Tag, Sampler, O) \ +const ALfloat *Resample_##Tag##_C(const InterpState *state, \ const ALfloat *restrict src, ALsizei frac, ALint increment, \ ALfloat *restrict dst, ALsizei numsamples) \ { \ + const InterpState istate = *state; \ ALsizei i; \ + \ + ASSUME(numsamples > 0); \ + \ + src -= O; \ for(i = 0;i < numsamples;i++) \ { \ - dst[i] = Sampler(src, frac); \ + dst[i] = Sampler(&istate, src, frac); \ \ frac += increment; \ src += frac>>FRACTIONBITS; \ @@ -46,90 +76,13 @@ const ALfloat *Resample_##Sampler##_C(const InterpState* UNUSED(state), \ return dst; \ } -DECL_TEMPLATE(point32) -DECL_TEMPLATE(lerp32) -DECL_TEMPLATE(fir4_32) +DECL_TEMPLATE(point, do_point, 0) +DECL_TEMPLATE(lerp, do_lerp, 0) +DECL_TEMPLATE(cubic, do_cubic, 1) +DECL_TEMPLATE(bsinc, do_bsinc, istate.bsinc.l) #undef DECL_TEMPLATE -const ALfloat *Resample_bsinc32_C(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) -{ - const ALfloat *fil, *scd, *phd, *spd; - const ALfloat sf = state->bsinc.sf; - const ALsizei m = state->bsinc.m; - ALsizei j_f, pi, i; - ALfloat pf, r; - - src += state->bsinc.l; - for(i = 0;i < dstlen;i++) - { - // Calculate the phase index and factor. -#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) - pi = frac >> FRAC_PHASE_BITDIFF; - pf = (frac & ((1<bsinc.coeffs[pi].filter, 16); - scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); - phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); - spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); - - // Apply the scale and phase interpolated filter. - r = 0.0f; - for(j_f = 0;j_f < m;j_f++) - r += (fil[j_f] + sf*scd[j_f] + pf*(phd[j_f] + sf*spd[j_f])) * src[j_f]; - dst[i] = r; - - frac += increment; - src += frac>>FRACTIONBITS; - frac &= FRACTIONMASK; - } - return dst; -} - - -void ALfilterState_processC(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples) -{ - ALsizei i; - if(numsamples > 1) - { - dst[0] = filter->b0 * src[0] + - filter->b1 * filter->x[0] + - filter->b2 * filter->x[1] - - filter->a1 * filter->y[0] - - filter->a2 * filter->y[1]; - dst[1] = filter->b0 * src[1] + - filter->b1 * src[0] + - filter->b2 * filter->x[0] - - filter->a1 * dst[0] - - filter->a2 * filter->y[0]; - for(i = 2;i < numsamples;i++) - dst[i] = filter->b0 * src[i] + - filter->b1 * src[i-1] + - filter->b2 * src[i-2] - - filter->a1 * dst[i-1] - - filter->a2 * dst[i-2]; - filter->x[0] = src[i-1]; - filter->x[1] = src[i-2]; - filter->y[0] = dst[i-1]; - filter->y[1] = dst[i-2]; - } - else if(numsamples == 1) - { - dst[0] = filter->b0 * src[0] + - filter->b1 * filter->x[0] + - filter->b2 * filter->x[1] - - filter->a1 * filter->y[0] - - filter->a2 * filter->y[1]; - filter->x[1] = filter->x[0]; - filter->x[0] = src[0]; - filter->y[1] = filter->y[0]; - filter->y[0] = dst[0]; - } -} - static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], const ALsizei IrSize, @@ -148,34 +101,39 @@ static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], #define MixHrtf MixHrtf_C #define MixHrtfBlend MixHrtfBlend_C #define MixDirectHrtf MixDirectHrtf_C -#include "mixer_inc.c" -#undef MixHrtf +#include "hrtf_inc.c" void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, ALsizei BufferSize) { - ALfloat gain, delta, step; + const ALfloat delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; ALsizei c; - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + ASSUME(OutChans > 0); + ASSUME(BufferSize > 0); for(c = 0;c < OutChans;c++) { ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) + ALfloat gain = CurrentGains[c]; + const ALfloat diff = TargetGains[c] - gain; + + if(fabsf(diff) > FLT_EPSILON) { ALsizei minsize = mini(BufferSize, Counter); + const ALfloat step = diff * delta; + ALfloat step_count = 0.0f; for(;pos < minsize;pos++) { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; + OutBuffer[c][OutPos+pos] += data[pos] * (gain + step*step_count); + step_count += 1.0f; } if(pos == Counter) gain = TargetGains[c]; + else + gain += step*step_count; CurrentGains[c] = gain; } @@ -196,9 +154,12 @@ void MixRow_C(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict { ALsizei c, i; + ASSUME(InChans > 0); + ASSUME(BufferSize > 0); + for(c = 0;c < InChans;c++) { - ALfloat gain = Gains[c]; + const ALfloat gain = Gains[c]; if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) continue; diff --git a/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_neon.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_neon.c new file mode 100644 index 00000000..9bf5521a --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_neon.c @@ -0,0 +1,283 @@ +#include "config.h" + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "alMain.h" +#include "alu.h" +#include "hrtf.h" +#include "defs.h" + + +const ALfloat *Resample_lerp_Neon(const InterpState* UNUSED(state), + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei numsamples) +{ + const int32x4_t increment4 = vdupq_n_s32(increment*4); + const float32x4_t fracOne4 = vdupq_n_f32(1.0f/FRACTIONONE); + const int32x4_t fracMask4 = vdupq_n_s32(FRACTIONMASK); + alignas(16) ALsizei pos_[4], frac_[4]; + int32x4_t pos4, frac4; + ALsizei todo, pos, i; + + ASSUME(numsamples > 0); + + InitiatePositionArrays(frac, increment, frac_, pos_, 4); + frac4 = vld1q_s32(frac_); + pos4 = vld1q_s32(pos_); + + todo = numsamples & ~3; + for(i = 0;i < todo;i += 4) + { + const int pos0 = vgetq_lane_s32(pos4, 0); + const int pos1 = vgetq_lane_s32(pos4, 1); + const int pos2 = vgetq_lane_s32(pos4, 2); + const int pos3 = vgetq_lane_s32(pos4, 3); + const float32x4_t val1 = (float32x4_t){src[pos0], src[pos1], src[pos2], src[pos3]}; + const float32x4_t val2 = (float32x4_t){src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]}; + + /* val1 + (val2-val1)*mu */ + const float32x4_t r0 = vsubq_f32(val2, val1); + const float32x4_t mu = vmulq_f32(vcvtq_f32_s32(frac4), fracOne4); + const float32x4_t out = vmlaq_f32(val1, mu, r0); + + vst1q_f32(&dst[i], out); + + frac4 = vaddq_s32(frac4, increment4); + pos4 = vaddq_s32(pos4, vshrq_n_s32(frac4, FRACTIONBITS)); + frac4 = vandq_s32(frac4, fracMask4); + } + + /* NOTE: These four elements represent the position *after* the last four + * samples, so the lowest element is the next position to resample. + */ + pos = vgetq_lane_s32(pos4, 0); + frac = vgetq_lane_s32(frac4, 0); + + for(;i < numsamples;++i) + { + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); + + frac += increment; + pos += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + +const ALfloat *Resample_bsinc_Neon(const InterpState *state, + const ALfloat *restrict src, ALsizei frac, ALint increment, + ALfloat *restrict dst, ALsizei dstlen) +{ + const ALfloat *const filter = state->bsinc.filter; + const float32x4_t sf4 = vdupq_n_f32(state->bsinc.sf); + const ALsizei m = state->bsinc.m; + const float32x4_t *fil, *scd, *phd, *spd; + ALsizei pi, i, j, offset; + float32x4_t r4; + ALfloat pf; + + ASSUME(m > 0); + ASSUME(dstlen > 0); + + src -= state->bsinc.l; + for(i = 0;i < dstlen;i++) + { + // Calculate the phase index and factor. +#define FRAC_PHASE_BITDIFF (FRACTIONBITS-BSINC_PHASE_BITS) + pi = frac >> FRAC_PHASE_BITDIFF; + pf = (frac & ((1<> 2; + const float32x4_t pf4 = vdupq_n_f32(pf); + + ASSUME(count > 0); + + for(j = 0;j < count;j++) + { + /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ + const float32x4_t f4 = vmlaq_f32( + vmlaq_f32(fil[j], sf4, scd[j]), + pf4, vmlaq_f32(phd[j], sf4, spd[j]) + ); + /* r += f*src */ + r4 = vmlaq_f32(r4, f4, vld1q_f32(&src[j*4])); + } + } + r4 = vaddq_f32(r4, vcombine_f32(vrev64_f32(vget_high_f32(r4)), + vrev64_f32(vget_low_f32(r4)))); + dst[i] = vget_lane_f32(vadd_f32(vget_low_f32(r4), vget_high_f32(r4)), 0); + + frac += increment; + src += frac>>FRACTIONBITS; + frac &= FRACTIONMASK; + } + return dst; +} + + +static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], + const ALsizei IrSize, + const ALfloat (*restrict Coeffs)[2], + ALfloat left, ALfloat right) +{ + ALsizei c; + float32x4_t leftright4; + { + float32x2_t leftright2 = vdup_n_f32(0.0); + leftright2 = vset_lane_f32(left, leftright2, 0); + leftright2 = vset_lane_f32(right, leftright2, 1); + leftright4 = vcombine_f32(leftright2, leftright2); + } + Values = ASSUME_ALIGNED(Values, 16); + Coeffs = ASSUME_ALIGNED(Coeffs, 16); + for(c = 0;c < IrSize;c += 2) + { + const ALsizei o0 = (Offset+c)&HRIR_MASK; + const ALsizei o1 = (o0+1)&HRIR_MASK; + float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]), + vld1_f32((float32_t*)&Values[o1][0])); + float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]); + + vals = vmlaq_f32(vals, coefs, leftright4); + + vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals)); + vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals)); + } +} + +#define MixHrtf MixHrtf_Neon +#define MixHrtfBlend MixHrtfBlend_Neon +#define MixDirectHrtf MixDirectHrtf_Neon +#include "hrtf_inc.c" + + +void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], + ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, + ALsizei BufferSize) +{ + const ALfloat delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + ALsizei c; + + ASSUME(OutChans > 0); + ASSUME(BufferSize > 0); + data = ASSUME_ALIGNED(data, 16); + OutBuffer = ASSUME_ALIGNED(OutBuffer, 16); + + for(c = 0;c < OutChans;c++) + { + ALsizei pos = 0; + ALfloat gain = CurrentGains[c]; + const ALfloat diff = TargetGains[c] - gain; + + if(fabsf(diff) > FLT_EPSILON) + { + ALsizei minsize = mini(BufferSize, Counter); + const ALfloat step = diff * delta; + ALfloat step_count = 0.0f; + /* Mix with applying gain steps in aligned multiples of 4. */ + if(LIKELY(minsize > 3)) + { + const float32x4_t four4 = vdupq_n_f32(4.0f); + const float32x4_t step4 = vdupq_n_f32(step); + const float32x4_t gain4 = vdupq_n_f32(gain); + float32x4_t step_count4 = vsetq_lane_f32(0.0f, + vsetq_lane_f32(1.0f, + vsetq_lane_f32(2.0f, + vsetq_lane_f32(3.0f, vdupq_n_f32(0.0f), 3), + 2), 1), 0 + ); + ALsizei todo = minsize >> 2; + + do { + const float32x4_t val4 = vld1q_f32(&data[pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); + dry4 = vmlaq_f32(dry4, val4, vmlaq_f32(gain4, step4, step_count4)); + step_count4 = vaddq_f32(step_count4, four4); + vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); + pos += 4; + } while(--todo); + /* NOTE: step_count4 now represents the next four counts after + * the last four mixed samples, so the lowest element + * represents the next step count to apply. + */ + step_count = vgetq_lane_f32(step_count4, 0); + } + /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ + for(;pos < minsize;pos++) + { + OutBuffer[c][OutPos+pos] += data[pos]*(gain + step*step_count); + step_count += 1.0f; + } + if(pos == Counter) + gain = TargetGains[c]; + else + gain += step*step_count; + CurrentGains[c] = gain; + + /* Mix until pos is aligned with 4 or the mix is done. */ + minsize = mini(BufferSize, (pos+3)&~3); + for(;pos < minsize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } + + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + if(LIKELY(BufferSize-pos > 3)) + { + ALsizei todo = (BufferSize-pos) >> 2; + const float32x4_t gain4 = vdupq_n_f32(gain); + do { + const float32x4_t val4 = vld1q_f32(&data[pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(&OutBuffer[c][OutPos+pos], dry4); + pos += 4; + } while(--todo); + } + for(;pos < BufferSize;pos++) + OutBuffer[c][OutPos+pos] += data[pos]*gain; + } +} + +void MixRow_Neon(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) +{ + ALsizei c; + + ASSUME(InChans > 0); + ASSUME(BufferSize > 0); + + for(c = 0;c < InChans;c++) + { + ALsizei pos = 0; + const ALfloat gain = Gains[c]; + if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) + continue; + + if(LIKELY(BufferSize > 3)) + { + ALsizei todo = BufferSize >> 2; + float32x4_t gain4 = vdupq_n_f32(gain); + do { + const float32x4_t val4 = vld1q_f32(&data[c][InPos+pos]); + float32x4_t dry4 = vld1q_f32(&OutBuffer[pos]); + dry4 = vmlaq_f32(dry4, val4, gain4); + vst1q_f32(&OutBuffer[pos], dry4); + pos += 4; + } while(--todo); + } + for(;pos < BufferSize;pos++) + OutBuffer[pos] += data[c][InPos+pos]*gain; + } +} diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse.c similarity index 59% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_sse.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse.c index 68786573..725a5ebc 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse.c @@ -9,21 +9,25 @@ #include "alSource.h" #include "alAuxEffectSlot.h" -#include "mixer_defs.h" +#include "defs.h" -const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *restrict src, - ALsizei frac, ALint increment, ALfloat *restrict dst, - ALsizei dstlen) +const ALfloat *Resample_bsinc_SSE(const InterpState *state, const ALfloat *restrict src, + ALsizei frac, ALint increment, ALfloat *restrict dst, + ALsizei dstlen) { + const ALfloat *const filter = state->bsinc.filter; const __m128 sf4 = _mm_set1_ps(state->bsinc.sf); const ALsizei m = state->bsinc.m; - const ALfloat *fil, *scd, *phd, *spd; - ALsizei pi, i, j; + const __m128 *fil, *scd, *phd, *spd; + ALsizei pi, i, j, offset; ALfloat pf; __m128 r4; - src += state->bsinc.l; + ASSUME(m > 0); + ASSUME(dstlen > 0); + + src -= state->bsinc.l; for(i = 0;i < dstlen;i++) { // Calculate the phase index and factor. @@ -32,30 +36,32 @@ const ALfloat *Resample_bsinc32_SSE(const InterpState *state, const ALfloat *res pf = (frac & ((1<bsinc.coeffs[pi].filter, 16); - scd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].scDelta, 16); - phd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].phDelta, 16); - spd = ASSUME_ALIGNED(state->bsinc.coeffs[pi].spDelta, 16); + offset = m*pi*4; + fil = (const __m128*)ASSUME_ALIGNED(filter + offset, 16); offset += m; + scd = (const __m128*)ASSUME_ALIGNED(filter + offset, 16); offset += m; + phd = (const __m128*)ASSUME_ALIGNED(filter + offset, 16); offset += m; + spd = (const __m128*)ASSUME_ALIGNED(filter + offset, 16); // Apply the scale and phase interpolated filter. r4 = _mm_setzero_ps(); { + const ALsizei count = m >> 2; const __m128 pf4 = _mm_set1_ps(pf); -#define LD4(x) _mm_load_ps(x) -#define ULD4(x) _mm_loadu_ps(x) + + ASSUME(count > 0); + #define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) - for(j = 0;j < m;j+=4) + for(j = 0;j < count;j++) { /* f = ((fil + sf*scd) + pf*(phd + sf*spd)) */ - const __m128 f4 = MLA4(MLA4(LD4(&fil[j]), sf4, LD4(&scd[j])), - pf4, MLA4(LD4(&phd[j]), sf4, LD4(&spd[j])) + const __m128 f4 = MLA4( + MLA4(fil[j], sf4, scd[j]), + pf4, MLA4(phd[j], sf4, spd[j]) ); /* r += f*src */ - r4 = MLA4(r4, f4, ULD4(&src[j])); + r4 = MLA4(r4, f4, _mm_loadu_ps(&src[j*4])); } #undef MLA4 -#undef ULD4 -#undef LD4 } r4 = _mm_add_ps(r4, _mm_shuffle_ps(r4, r4, _MM_SHUFFLE(0, 1, 2, 3))); r4 = _mm_add_ps(r4, _mm_movehl_ps(r4, r4)); @@ -126,61 +132,65 @@ static inline void ApplyCoeffs(ALsizei Offset, ALfloat (*restrict Values)[2], #define MixHrtf MixHrtf_SSE #define MixHrtfBlend MixHrtfBlend_SSE #define MixDirectHrtf MixDirectHrtf_SSE -#include "mixer_inc.c" -#undef MixHrtf +#include "hrtf_inc.c" void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], ALfloat *CurrentGains, const ALfloat *TargetGains, ALsizei Counter, ALsizei OutPos, ALsizei BufferSize) { - ALfloat gain, delta, step; - __m128 gain4; + const ALfloat delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; ALsizei c; - delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + ASSUME(OutChans > 0); + ASSUME(BufferSize > 0); for(c = 0;c < OutChans;c++) { ALsizei pos = 0; - gain = CurrentGains[c]; - step = (TargetGains[c] - gain) * delta; - if(fabsf(step) > FLT_EPSILON) + ALfloat gain = CurrentGains[c]; + const ALfloat diff = TargetGains[c] - gain; + + if(fabsf(diff) > FLT_EPSILON) { ALsizei minsize = mini(BufferSize, Counter); + const ALfloat step = diff * delta; + ALfloat step_count = 0.0f; /* Mix with applying gain steps in aligned multiples of 4. */ - if(minsize-pos > 3) + if(LIKELY(minsize > 3)) { - __m128 step4; - gain4 = _mm_setr_ps( - gain, - gain + step, - gain + step + step, - gain + step + step + step - ); - step4 = _mm_set1_ps(step + step + step + step); + const __m128 four4 = _mm_set1_ps(4.0f); + const __m128 step4 = _mm_set1_ps(step); + const __m128 gain4 = _mm_set1_ps(gain); + __m128 step_count4 = _mm_setr_ps(0.0f, 1.0f, 2.0f, 3.0f); + ALsizei todo = minsize >> 2; do { const __m128 val4 = _mm_load_ps(&data[pos]); __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - gain4 = _mm_add_ps(gain4, step4); +#define MLA4(x, y, z) _mm_add_ps(x, _mm_mul_ps(y, z)) + /* dry += val * (gain + step*step_count) */ + dry4 = MLA4(dry4, val4, MLA4(gain4, step4, step_count4)); +#undef MLA4 _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); + step_count4 = _mm_add_ps(step_count4, four4); pos += 4; - } while(minsize-pos > 3); - /* NOTE: gain4 now represents the next four gains after the - * last four mixed samples, so the lowest element represents - * the next gain to apply. + } while(--todo); + /* NOTE: step_count4 now represents the next four counts after + * the last four mixed samples, so the lowest element + * represents the next step count to apply. */ - gain = _mm_cvtss_f32(gain4); + step_count = _mm_cvtss_f32(step_count4); } /* Mix with applying left over gain steps that aren't aligned multiples of 4. */ for(;pos < minsize;pos++) { - OutBuffer[c][OutPos+pos] += data[pos]*gain; - gain += step; + OutBuffer[c][OutPos+pos] += data[pos]*(gain + step*step_count); + step_count += 1.0f; } if(pos == Counter) gain = TargetGains[c]; + else + gain += step*step_count; CurrentGains[c] = gain; /* Mix until pos is aligned with 4 or the mix is done. */ @@ -191,13 +201,17 @@ void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) continue; - gain4 = _mm_set1_ps(gain); - for(;BufferSize-pos > 3;pos += 4) + if(LIKELY(BufferSize-pos > 3)) { - const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); + ALsizei todo = (BufferSize-pos) >> 2; + const __m128 gain4 = _mm_set1_ps(gain); + do { + const __m128 val4 = _mm_load_ps(&data[pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); + pos += 4; + } while(--todo); } for(;pos < BufferSize;pos++) OutBuffer[c][OutPos+pos] += data[pos]*gain; @@ -206,23 +220,29 @@ void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*restrict OutBuffer void MixRow_SSE(ALfloat *OutBuffer, const ALfloat *Gains, const ALfloat (*restrict data)[BUFFERSIZE], ALsizei InChans, ALsizei InPos, ALsizei BufferSize) { - __m128 gain4; ALsizei c; + ASSUME(InChans > 0); + ASSUME(BufferSize > 0); + for(c = 0;c < InChans;c++) { ALsizei pos = 0; - ALfloat gain = Gains[c]; + const ALfloat gain = Gains[c]; if(!(fabsf(gain) > GAIN_SILENCE_THRESHOLD)) continue; - gain4 = _mm_set1_ps(gain); - for(;BufferSize-pos > 3;pos += 4) + if(LIKELY(BufferSize > 3)) { - const __m128 val4 = _mm_load_ps(&data[c][InPos+pos]); - __m128 dry4 = _mm_load_ps(&OutBuffer[pos]); - dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); - _mm_store_ps(&OutBuffer[pos], dry4); + ALsizei todo = BufferSize >> 2; + const __m128 gain4 = _mm_set1_ps(gain); + do { + const __m128 val4 = _mm_load_ps(&data[c][InPos+pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[pos]); + dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain4)); + _mm_store_ps(&OutBuffer[pos], dry4); + pos += 4; + } while(--todo); } for(;pos < BufferSize;pos++) OutBuffer[pos] += data[c][InPos+pos]*gain; diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse3.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse2.c similarity index 51% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_sse3.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse2.c index 78603c87..9cbaeb0a 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse3.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse2.c @@ -1,9 +1,6 @@ /** - * OpenAL cross platform audio library, SSE3 mixer functions - * + * OpenAL cross platform audio library * Copyright (C) 2014 by Timothy Arceri . - * Copyright (C) 2015 by Chris Robinson . - * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either @@ -25,69 +22,59 @@ #include #include -#include #include "alu.h" -#include "mixer_defs.h" +#include "defs.h" -const ALfloat *Resample_fir4_32_SSE3(const InterpState* UNUSED(state), +const ALfloat *Resample_lerp_SSE2(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); + const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; + alignas(16) ALsizei pos_[4], frac_[4]; __m128i frac4, pos4; - ALint pos; - ALsizei i; + ALsizei todo, pos, i; - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); + ASSUME(numsamples > 0); - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); + InitiatePositionArrays(frac, increment, frac_, pos_, 4); + frac4 = _mm_setr_epi32(frac_[0], frac_[1], frac_[2], frac_[3]); + pos4 = _mm_setr_epi32(pos_[0], pos_[1], pos_[2], pos_[3]); - --src; - for(i = 0;numsamples-i > 3;i += 4) + todo = numsamples & ~3; + for(i = 0;i < todo;i += 4) { - const __m128 val0 = _mm_loadu_ps(&src[pos_.i[0]]); - const __m128 val1 = _mm_loadu_ps(&src[pos_.i[1]]); - const __m128 val2 = _mm_loadu_ps(&src[pos_.i[2]]); - const __m128 val3 = _mm_loadu_ps(&src[pos_.i[3]]); - __m128 k0 = _mm_load_ps(sinc4Tab[frac_.i[0]]); - __m128 k1 = _mm_load_ps(sinc4Tab[frac_.i[1]]); - __m128 k2 = _mm_load_ps(sinc4Tab[frac_.i[2]]); - __m128 k3 = _mm_load_ps(sinc4Tab[frac_.i[3]]); - __m128 out; + const int pos0 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(0, 0, 0, 0))); + const int pos1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(1, 1, 1, 1))); + const int pos2 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(2, 2, 2, 2))); + const int pos3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(pos4, _MM_SHUFFLE(3, 3, 3, 3))); + const __m128 val1 = _mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ]); + const __m128 val2 = _mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]); - k0 = _mm_mul_ps(k0, val0); - k1 = _mm_mul_ps(k1, val1); - k2 = _mm_mul_ps(k2, val2); - k3 = _mm_mul_ps(k3, val3); - k0 = _mm_hadd_ps(k0, k1); - k2 = _mm_hadd_ps(k2, k3); - out = _mm_hadd_ps(k0, k2); + /* val1 + (val2-val1)*mu */ + const __m128 r0 = _mm_sub_ps(val2, val1); + const __m128 mu = _mm_mul_ps(_mm_cvtepi32_ps(frac4), fracOne4); + const __m128 out = _mm_add_ps(val1, _mm_mul_ps(mu, r0)); _mm_store_ps(&dst[i], out); frac4 = _mm_add_epi32(frac4, increment4); pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); frac4 = _mm_and_si128(frac4, fracMask4); - - _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); - _mm_store_ps(frac_.f, _mm_castsi128_ps(frac4)); } /* NOTE: These four elements represent the position *after* the last four * samples, so the lowest element is the next position to resample. */ - pos = pos_.i[0]; - frac = frac_.i[0]; + pos = _mm_cvtsi128_si32(pos4); + frac = _mm_cvtsi128_si32(frac4); - for(;i < numsamples;i++) + for(;i < numsamples;++i) { - dst[i] = resample_fir4(src[pos], src[pos+1], src[pos+2], src[pos+3], frac); + dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); frac += increment; pos += frac>>FRACTIONBITS; diff --git a/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse3.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse3.c new file mode 100644 index 00000000..e69de29b diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse2.c b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse41.c similarity index 70% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer_sse2.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse41.c index 84cc35dd..e92a3dd0 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer_sse2.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixer/mixer_sse41.c @@ -22,33 +22,38 @@ #include #include +#include #include "alu.h" -#include "mixer_defs.h" +#include "defs.h" -const ALfloat *Resample_lerp32_SSE2(const InterpState* UNUSED(state), +const ALfloat *Resample_lerp_SSE41(const InterpState* UNUSED(state), const ALfloat *restrict src, ALsizei frac, ALint increment, ALfloat *restrict dst, ALsizei numsamples) { const __m128i increment4 = _mm_set1_epi32(increment*4); const __m128 fracOne4 = _mm_set1_ps(1.0f/FRACTIONONE); const __m128i fracMask4 = _mm_set1_epi32(FRACTIONMASK); - union { alignas(16) ALint i[4]; float f[4]; } pos_; - union { alignas(16) ALsizei i[4]; float f[4]; } frac_; + alignas(16) ALsizei pos_[4], frac_[4]; __m128i frac4, pos4; - ALint pos; - ALsizei i; + ALsizei todo, pos, i; - InitiatePositionArrays(frac, increment, frac_.i, pos_.i, 4); + ASSUME(numsamples > 0); - frac4 = _mm_castps_si128(_mm_load_ps(frac_.f)); - pos4 = _mm_castps_si128(_mm_load_ps(pos_.f)); + InitiatePositionArrays(frac, increment, frac_, pos_, 4); + frac4 = _mm_setr_epi32(frac_[0], frac_[1], frac_[2], frac_[3]); + pos4 = _mm_setr_epi32(pos_[0], pos_[1], pos_[2], pos_[3]); - for(i = 0;numsamples-i > 3;i += 4) + todo = numsamples & ~3; + for(i = 0;i < todo;i += 4) { - const __m128 val1 = _mm_setr_ps(src[pos_.i[0]], src[pos_.i[1]], src[pos_.i[2]], src[pos_.i[3]]); - const __m128 val2 = _mm_setr_ps(src[pos_.i[0]+1], src[pos_.i[1]+1], src[pos_.i[2]+1], src[pos_.i[3]+1]); + const int pos0 = _mm_extract_epi32(pos4, 0); + const int pos1 = _mm_extract_epi32(pos4, 1); + const int pos2 = _mm_extract_epi32(pos4, 2); + const int pos3 = _mm_extract_epi32(pos4, 3); + const __m128 val1 = _mm_setr_ps(src[pos0 ], src[pos1 ], src[pos2 ], src[pos3 ]); + const __m128 val2 = _mm_setr_ps(src[pos0+1], src[pos1+1], src[pos2+1], src[pos3+1]); /* val1 + (val2-val1)*mu */ const __m128 r0 = _mm_sub_ps(val2, val1); @@ -60,17 +65,15 @@ const ALfloat *Resample_lerp32_SSE2(const InterpState* UNUSED(state), frac4 = _mm_add_epi32(frac4, increment4); pos4 = _mm_add_epi32(pos4, _mm_srli_epi32(frac4, FRACTIONBITS)); frac4 = _mm_and_si128(frac4, fracMask4); - - _mm_store_ps(pos_.f, _mm_castsi128_ps(pos4)); } /* NOTE: These four elements represent the position *after* the last four * samples, so the lowest element is the next position to resample. */ - pos = pos_.i[0]; + pos = _mm_cvtsi128_si32(pos4); frac = _mm_cvtsi128_si32(frac4); - for(;i < numsamples;i++) + for(;i < numsamples;++i) { dst[i] = lerp(src[pos], src[pos+1], frac * (1.0f/FRACTIONONE)); diff --git a/love/src/jni/openal-soft-1.18.2/Alc/mixer.c b/love/src/jni/openal-soft-1.19.1/Alc/mixvoice.c similarity index 57% rename from love/src/jni/openal-soft-1.18.2/Alc/mixer.c rename to love/src/jni/openal-soft-1.19.1/Alc/mixvoice.c index b5c4605b..d019b898 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/mixer.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/mixvoice.c @@ -33,29 +33,33 @@ #include "alBuffer.h" #include "alListener.h" #include "alAuxEffectSlot.h" +#include "sample_cvt.h" #include "alu.h" +#include "alconfig.h" +#include "ringbuffer.h" -#include "mixer_defs.h" +#include "cpu_caps.h" +#include "mixer/defs.h" static_assert((INT_MAX>>FRACTIONBITS)/MAX_PITCH > BUFFERSIZE, "MAX_PITCH and/or BUFFERSIZE are too large for FRACTIONBITS!"); -extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALint *restrict pos_arr, ALsizei size); +extern inline void InitiatePositionArrays(ALsizei frac, ALint increment, ALsizei *restrict frac_arr, ALsizei *restrict pos_arr, ALsizei size); -/* BSinc requires up to 11 extra samples before the current position, and 12 after. */ -static_assert(MAX_PRE_SAMPLES >= 11, "MAX_PRE_SAMPLES must be at least 11!"); -static_assert(MAX_POST_SAMPLES >= 12, "MAX_POST_SAMPLES must be at least 12!"); +/* BSinc24 requires up to 23 extra samples before the current position, and 24 after. */ +static_assert(MAX_RESAMPLE_PADDING >= 24, "MAX_RESAMPLE_PADDING must be at least 24!"); enum Resampler ResamplerDefault = LinearResampler; -static MixerFunc MixSamples = Mix_C; +MixerFunc MixSamples = Mix_C; +RowMixerFunc MixRowSamples = MixRow_C; static HrtfMixerFunc MixHrtfSamples = MixHrtf_C; -HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_C; +static HrtfMixerBlendFunc MixHrtfBlendSamples = MixHrtfBlend_C; -MixerFunc SelectMixer(void) +static MixerFunc SelectMixer(void) { #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) @@ -68,7 +72,7 @@ MixerFunc SelectMixer(void) return Mix_C; } -RowMixerFunc SelectRowMixer(void) +static RowMixerFunc SelectRowMixer(void) { #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) @@ -112,48 +116,37 @@ ResamplerFunc SelectResampler(enum Resampler resampler) switch(resampler) { case PointResampler: - return Resample_point32_C; + return Resample_point_C; case LinearResampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_lerp32_Neon; + return Resample_lerp_Neon; #endif #ifdef HAVE_SSE4_1 if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_lerp32_SSE41; + return Resample_lerp_SSE41; #endif #ifdef HAVE_SSE2 if((CPUCapFlags&CPU_CAP_SSE2)) - return Resample_lerp32_SSE2; + return Resample_lerp_SSE2; #endif - return Resample_lerp32_C; + return Resample_lerp_C; case FIR4Resampler: + return Resample_cubic_C; + case BSinc12Resampler: + case BSinc24Resampler: #ifdef HAVE_NEON if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_fir4_32_Neon; -#endif -#ifdef HAVE_SSE4_1 - if((CPUCapFlags&CPU_CAP_SSE4_1)) - return Resample_fir4_32_SSE41; -#endif -#ifdef HAVE_SSE3 - if((CPUCapFlags&CPU_CAP_SSE3)) - return Resample_fir4_32_SSE3; -#endif - return Resample_fir4_32_C; - case BSincResampler: -#ifdef HAVE_NEON - if((CPUCapFlags&CPU_CAP_NEON)) - return Resample_bsinc32_Neon; + return Resample_bsinc_Neon; #endif #ifdef HAVE_SSE if((CPUCapFlags&CPU_CAP_SSE)) - return Resample_bsinc32_SSE; + return Resample_bsinc_SSE; #endif - return Resample_bsinc32_C; + return Resample_bsinc_C; } - return Resample_point32_C; + return Resample_point_C; } @@ -167,13 +160,20 @@ void aluInitMixer(void) ResamplerDefault = PointResampler; else if(strcasecmp(str, "linear") == 0) ResamplerDefault = LinearResampler; - else if(strcasecmp(str, "sinc4") == 0) + else if(strcasecmp(str, "cubic") == 0) ResamplerDefault = FIR4Resampler; + else if(strcasecmp(str, "bsinc12") == 0) + ResamplerDefault = BSinc12Resampler; + else if(strcasecmp(str, "bsinc24") == 0) + ResamplerDefault = BSinc24Resampler; else if(strcasecmp(str, "bsinc") == 0) - ResamplerDefault = BSincResampler; - else if(strcasecmp(str, "cubic") == 0 || strcasecmp(str, "sinc8") == 0) { - WARN("Resampler option \"%s\" is deprecated, using sinc4\n", str); + WARN("Resampler option \"%s\" is deprecated, using bsinc12\n", str); + ResamplerDefault = BSinc12Resampler; + } + else if(strcasecmp(str, "sinc4") == 0 || strcasecmp(str, "sinc8") == 0) + { + WARN("Resampler option \"%s\" is deprecated, using cubic\n", str); ResamplerDefault = FIR4Resampler; } else @@ -190,11 +190,25 @@ void aluInitMixer(void) MixHrtfBlendSamples = SelectHrtfBlendMixer(); MixHrtfSamples = SelectHrtfMixer(); MixSamples = SelectMixer(); + MixRowSamples = SelectRowMixer(); } -static inline ALfloat Sample_ALbyte(ALbyte val) -{ return val * (1.0f/128.0f); } +static void SendAsyncEvent(ALCcontext *context, ALuint enumtype, ALenum type, + ALuint objid, ALuint param, const char *msg) +{ + AsyncEvent evt = ASYNC_EVENT(enumtype); + evt.u.user.type = type; + evt.u.user.id = objid; + evt.u.user.param = param; + strcpy(evt.u.user.msg, msg); + if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) + alsem_post(&context->EventSem); +} + + +static inline ALfloat Sample_ALubyte(ALubyte val) +{ return (val-128) * (1.0f/128.0f); } static inline ALfloat Sample_ALshort(ALshort val) { return val * (1.0f/32768.0f); } @@ -202,45 +216,53 @@ static inline ALfloat Sample_ALshort(ALshort val) static inline ALfloat Sample_ALfloat(ALfloat val) { return val; } +static inline ALfloat Sample_ALdouble(ALdouble val) +{ return (ALfloat)val; } + +typedef ALubyte ALmulaw; +static inline ALfloat Sample_ALmulaw(ALmulaw val) +{ return muLawDecompressionTable[val] * (1.0f/32768.0f); } + +typedef ALubyte ALalaw; +static inline ALfloat Sample_ALalaw(ALalaw val) +{ return aLawDecompressionTable[val] * (1.0f/32768.0f); } + #define DECL_TEMPLATE(T) \ -static inline void Load_##T(ALfloat *dst, const T *src, ALint srcstep, ALsizei samples)\ +static inline void Load_##T(ALfloat *restrict dst, const T *restrict src, \ + ALint srcstep, ALsizei samples) \ { \ ALsizei i; \ for(i = 0;i < samples;i++) \ - dst[i] = Sample_##T(src[i*srcstep]); \ + dst[i] += Sample_##T(src[i*srcstep]); \ } -DECL_TEMPLATE(ALbyte) +DECL_TEMPLATE(ALubyte) DECL_TEMPLATE(ALshort) DECL_TEMPLATE(ALfloat) +DECL_TEMPLATE(ALdouble) +DECL_TEMPLATE(ALmulaw) +DECL_TEMPLATE(ALalaw) #undef DECL_TEMPLATE -static void LoadSamples(ALfloat *dst, const ALvoid *src, ALint srcstep, enum FmtType srctype, ALsizei samples) +static void LoadSamples(ALfloat *restrict dst, const ALvoid *restrict src, ALint srcstep, + enum FmtType srctype, ALsizei samples) { +#define HANDLE_FMT(ET, ST) case ET: Load_##ST(dst, src, srcstep, samples); break switch(srctype) { - case FmtByte: - Load_ALbyte(dst, src, srcstep, samples); - break; - case FmtShort: - Load_ALshort(dst, src, srcstep, samples); - break; - case FmtFloat: - Load_ALfloat(dst, src, srcstep, samples); - break; + HANDLE_FMT(FmtUByte, ALubyte); + HANDLE_FMT(FmtShort, ALshort); + HANDLE_FMT(FmtFloat, ALfloat); + HANDLE_FMT(FmtDouble, ALdouble); + HANDLE_FMT(FmtMulaw, ALmulaw); + HANDLE_FMT(FmtAlaw, ALalaw); } -} - -static inline void SilenceSamples(ALfloat *dst, ALsizei samples) -{ - ALsizei i; - for(i = 0;i < samples;i++) - dst[i] = 0.0f; +#undef HANDLE_FMT } -static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter, +static const ALfloat *DoFilters(BiquadFilter *lpfilter, BiquadFilter *hpfilter, ALfloat *restrict dst, const ALfloat *restrict src, ALsizei numsamples, enum ActiveFilters type) { @@ -248,17 +270,17 @@ static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter switch(type) { case AF_None: - ALfilterState_processPassthru(lpfilter, src, numsamples); - ALfilterState_processPassthru(hpfilter, src, numsamples); + BiquadFilter_passthru(lpfilter, numsamples); + BiquadFilter_passthru(hpfilter, numsamples); break; case AF_LowPass: - ALfilterState_process(lpfilter, dst, src, numsamples); - ALfilterState_processPassthru(hpfilter, dst, numsamples); + BiquadFilter_process(lpfilter, dst, src, numsamples); + BiquadFilter_passthru(hpfilter, numsamples); return dst; case AF_HighPass: - ALfilterState_processPassthru(lpfilter, src, numsamples); - ALfilterState_process(hpfilter, dst, src, numsamples); + BiquadFilter_passthru(lpfilter, numsamples); + BiquadFilter_process(hpfilter, dst, src, numsamples); return dst; case AF_BandPass: @@ -267,8 +289,8 @@ static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter ALfloat temp[256]; ALsizei todo = mini(256, numsamples-i); - ALfilterState_process(lpfilter, temp, src+i, todo); - ALfilterState_process(hpfilter, dst+i, temp, todo); + BiquadFilter_process(lpfilter, temp, src+i, todo); + BiquadFilter_process(hpfilter, dst+i, temp, todo); i += todo; } return dst; @@ -277,11 +299,19 @@ static const ALfloat *DoFilters(ALfilterState *lpfilter, ALfilterState *hpfilter } -ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei SamplesToDo) +/* This function uses these device temp buffers. */ +#define SOURCE_DATA_BUF 0 +#define RESAMPLED_BUF 1 +#define FILTERED_BUF 2 +#define NFC_DATA_BUF 3 +ALboolean MixSource(ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo) { + ALCdevice *Device = Context->Device; ALbufferlistitem *BufferListItem; ALbufferlistitem *BufferLoopItem; ALsizei NumChannels, SampleSize; + ALbitfieldSOFT enabledevt; + ALsizei buffers_done = 0; ResamplerFunc Resample; ALsizei DataPosInt; ALsizei DataPosFrac; @@ -292,11 +322,13 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ALsizei IrSize; bool isplaying; bool firstpass; + bool isstatic; ALsizei chan; ALsizei send; /* Get source info */ isplaying = true; /* Will only be called while playing. */ + isstatic = !!(voice->Flags&VOICE_IS_STATIC); DataPosInt = ATOMIC_LOAD(&voice->position, almemory_order_acquire); DataPosFrac = ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed); BufferListItem = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); @@ -308,7 +340,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei IrSize = (Device->HrtfHandle ? Device->HrtfHandle->irSize : 0); Resample = ((increment == FRACTIONONE && DataPosFrac == 0) ? - Resample_copy32_C : voice->Resampler); + Resample_copy_C : voice->Resampler); Counter = (voice->Flags&VOICE_IS_FADING) ? SamplesToDo : 0; firstpass = true; @@ -322,81 +354,126 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei DataSize64 *= increment; DataSize64 += DataPosFrac+FRACTIONMASK; DataSize64 >>= FRACTIONBITS; - DataSize64 += MAX_POST_SAMPLES+MAX_PRE_SAMPLES; - + DataSize64 += MAX_RESAMPLE_PADDING*2; SrcBufferSize = (ALsizei)mini64(DataSize64, BUFFERSIZE); /* Figure out how many samples we can actually mix from this. */ DataSize64 = SrcBufferSize; - DataSize64 -= MAX_POST_SAMPLES+MAX_PRE_SAMPLES; + DataSize64 -= MAX_RESAMPLE_PADDING*2; DataSize64 <<= FRACTIONBITS; DataSize64 -= DataPosFrac; - - DstBufferSize = (ALsizei)((DataSize64+(increment-1)) / increment); - DstBufferSize = mini(DstBufferSize, (SamplesToDo-OutPos)); + DstBufferSize = (ALsizei)mini64((DataSize64+(increment-1)) / increment, + SamplesToDo - OutPos); /* Some mixers like having a multiple of 4, so try to give that unless * this is the last update. */ - if(OutPos+DstBufferSize < SamplesToDo) + if(DstBufferSize < SamplesToDo-OutPos) DstBufferSize &= ~3; + /* It's impossible to have a buffer list item with no entries. */ + assert(BufferListItem->num_buffers > 0); + for(chan = 0;chan < NumChannels;chan++) { const ALfloat *ResampledData; - ALfloat *SrcData = Device->SourceData; - ALsizei SrcDataSize; + ALfloat *SrcData = Device->TempBuffer[SOURCE_DATA_BUF]; + ALsizei FilledAmt; - /* Load the previous samples into the source data first. */ - memcpy(SrcData, voice->PrevSamples[chan], MAX_PRE_SAMPLES*sizeof(ALfloat)); - SrcDataSize = MAX_PRE_SAMPLES; + /* Load the previous samples into the source data first, and clear the rest. */ + memcpy(SrcData, voice->PrevSamples[chan], MAX_RESAMPLE_PADDING*sizeof(ALfloat)); + memset(SrcData+MAX_RESAMPLE_PADDING, 0, (BUFFERSIZE-MAX_RESAMPLE_PADDING)* + sizeof(ALfloat)); + FilledAmt = MAX_RESAMPLE_PADDING; - if(Source->SourceType == AL_STATIC) + if(isstatic) { - const ALbuffer *ALBuffer = BufferListItem->buffer; - const ALubyte *Data = ALBuffer->data; - ALsizei DataSize; - - /* Offset buffer data to current channel */ - Data += chan*SampleSize; + /* TODO: For static sources, loop points are taken from the + * first buffer (should be adjusted by any buffer offset, to + * possibly be added later). + */ + const ALbuffer *Buffer0 = BufferListItem->buffers[0]; + const ALsizei LoopStart = Buffer0->LoopStart; + const ALsizei LoopEnd = Buffer0->LoopEnd; + const ALsizei LoopSize = LoopEnd - LoopStart; /* If current pos is beyond the loop range, do not loop */ - if(!BufferLoopItem || DataPosInt >= ALBuffer->LoopEnd) + if(!BufferLoopItem || DataPosInt >= LoopEnd) { + ALsizei SizeToDo = SrcBufferSize - FilledAmt; + ALsizei CompLen = 0; + ALsizei i; + BufferLoopItem = NULL; - /* Load what's left to play from the source buffer, and - * clear the rest of the temp buffer */ - DataSize = minu(SrcBufferSize - SrcDataSize, - ALBuffer->SampleLen - DataPosInt); + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; - LoadSamples(&SrcData[SrcDataSize], &Data[DataPosInt * NumChannels*SampleSize], - NumChannels, ALBuffer->FmtType, DataSize); - SrcDataSize += DataSize; + if(DataPosInt >= buffer->SampleLen) + continue; - SilenceSamples(&SrcData[SrcDataSize], SrcBufferSize - SrcDataSize); - SrcDataSize += SrcBufferSize - SrcDataSize; + /* Load what's left to play from the buffer */ + DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(DataPosInt*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; } else { - ALsizei LoopStart = ALBuffer->LoopStart; - ALsizei LoopEnd = ALBuffer->LoopEnd; + ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopEnd - DataPosInt); + ALsizei CompLen = 0; + ALsizei i; - /* Load what's left of this loop iteration, then load - * repeats of the loop section */ - DataSize = minu(SrcBufferSize - SrcDataSize, LoopEnd - DataPosInt); - - LoadSamples(&SrcData[SrcDataSize], &Data[DataPosInt * NumChannels*SampleSize], - NumChannels, ALBuffer->FmtType, DataSize); - SrcDataSize += DataSize; - - DataSize = LoopEnd-LoopStart; - while(SrcBufferSize > SrcDataSize) + for(i = 0;i < BufferListItem->num_buffers;i++) { - DataSize = mini(SrcBufferSize - SrcDataSize, DataSize); + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; - LoadSamples(&SrcData[SrcDataSize], &Data[LoopStart * NumChannels*SampleSize], - NumChannels, ALBuffer->FmtType, DataSize); - SrcDataSize += DataSize; + if(DataPosInt >= buffer->SampleLen) + continue; + + /* Load what's left of this loop iteration */ + DataSize = mini(SizeToDo, buffer->SampleLen - DataPosInt); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(DataPosInt*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; + + while(SrcBufferSize > FilledAmt) + { + const ALsizei SizeToDo = mini(SrcBufferSize - FilledAmt, LoopSize); + + CompLen = 0; + for(i = 0;i < BufferListItem->num_buffers;i++) + { + const ALbuffer *buffer = BufferListItem->buffers[i]; + const ALubyte *Data = buffer->data; + ALsizei DataSize; + + if(LoopStart >= buffer->SampleLen) + continue; + + DataSize = mini(SizeToDo, buffer->SampleLen - LoopStart); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], + &Data[(LoopStart*NumChannels + chan)*SampleSize], + NumChannels, buffer->FmtType, DataSize + ); + } + FilledAmt += CompLen; } } } @@ -406,57 +483,60 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ALbufferlistitem *tmpiter = BufferListItem; ALsizei pos = DataPosInt; - while(tmpiter && SrcBufferSize > SrcDataSize) + while(tmpiter && SrcBufferSize > FilledAmt) { - const ALbuffer *ALBuffer; - if((ALBuffer=tmpiter->buffer) != NULL) + ALsizei SizeToDo = SrcBufferSize - FilledAmt; + ALsizei CompLen = 0; + ALsizei i; + + for(i = 0;i < tmpiter->num_buffers;i++) { - const ALubyte *Data = ALBuffer->data; - ALsizei DataSize = ALBuffer->SampleLen; + const ALbuffer *ALBuffer = tmpiter->buffers[i]; + ALsizei DataSize = ALBuffer ? ALBuffer->SampleLen : 0; - /* Skip the data already played */ - if(DataSize <= pos) - pos -= DataSize; - else + if(DataSize > pos) { + const ALubyte *Data = ALBuffer->data; Data += (pos*NumChannels + chan)*SampleSize; - DataSize -= pos; - pos -= pos; - DataSize = minu(SrcBufferSize - SrcDataSize, DataSize); - LoadSamples(&SrcData[SrcDataSize], Data, NumChannels, + DataSize = mini(SizeToDo, DataSize - pos); + CompLen = maxi(CompLen, DataSize); + + LoadSamples(&SrcData[FilledAmt], Data, NumChannels, ALBuffer->FmtType, DataSize); - SrcDataSize += DataSize; } } - tmpiter = ATOMIC_LOAD(&tmpiter->next, almemory_order_acquire); - if(!tmpiter && BufferLoopItem) - tmpiter = BufferLoopItem; - else if(!tmpiter) + if(UNLIKELY(!CompLen)) + pos -= tmpiter->max_samples; + else { - SilenceSamples(&SrcData[SrcDataSize], SrcBufferSize - SrcDataSize); - SrcDataSize += SrcBufferSize - SrcDataSize; + FilledAmt += CompLen; + if(SrcBufferSize <= FilledAmt) + break; + pos = 0; } + tmpiter = ATOMIC_LOAD(&tmpiter->next, almemory_order_acquire); + if(!tmpiter) tmpiter = BufferLoopItem; } } /* Store the last source samples used for next time. */ memcpy(voice->PrevSamples[chan], &SrcData[(increment*DstBufferSize + DataPosFrac)>>FRACTIONBITS], - MAX_PRE_SAMPLES*sizeof(ALfloat) + MAX_RESAMPLE_PADDING*sizeof(ALfloat) ); /* Now resample, then filter and mix to the appropriate outputs. */ ResampledData = Resample(&voice->ResampleState, - &SrcData[MAX_PRE_SAMPLES], DataPosFrac, increment, - Device->ResampledData, DstBufferSize + &SrcData[MAX_RESAMPLE_PADDING], DataPosFrac, increment, + Device->TempBuffer[RESAMPLED_BUF], DstBufferSize ); { DirectParams *parms = &voice->Direct.Params[chan]; const ALfloat *samples; samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->FilteredData, + &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], ResampledData, DstBufferSize, voice->Direct.FilterType ); if(!(voice->Flags&VOICE_HAS_HRTF)) @@ -471,7 +551,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ); else { - ALfloat *nfcsamples = Device->NFCtrlData; + ALfloat *nfcsamples = Device->TempBuffer[NFC_DATA_BUF]; ALsizei chanoffset = 0; MixSamples(samples, @@ -483,8 +563,8 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei #define APPLY_NFC_MIX(order) \ if(voice->Direct.ChannelsPerOrder[order] > 0) \ { \ - NfcFilterUpdate##order(&parms->NFCtrlFilter[order-1], nfcsamples, \ - samples, DstBufferSize); \ + NfcFilterProcess##order(&parms->NFCtrlFilter, nfcsamples, samples, \ + DstBufferSize); \ MixSamples(nfcsamples, voice->Direct.ChannelsPerOrder[order], \ voice->Direct.Buffer+chanoffset, parms->Gains.Current+chanoffset, \ parms->Gains.Target+chanoffset, Counter, OutPos, DstBufferSize \ @@ -503,8 +583,8 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ALsizei fademix = 0; int lidx, ridx; - lidx = GetChannelIdxByName(Device->RealOut, FrontLeft); - ridx = GetChannelIdxByName(Device->RealOut, FrontRight); + lidx = GetChannelIdxByName(&Device->RealOut, FrontLeft); + ridx = GetChannelIdxByName(&Device->RealOut, FrontRight); assert(lidx != -1 && ridx != -1); if(!Counter) @@ -536,7 +616,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei */ gain = lerp(parms->Hrtf.Old.Gain, parms->Hrtf.Target.Gain, minf(1.0f, (ALfloat)fademix/Counter)); - hrtfparams.Coeffs = SAFE_CONST(ALfloat2*,parms->Hrtf.Target.Coeffs); + hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; hrtfparams.Gain = 0.0f; @@ -565,7 +645,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei gain = lerp(parms->Hrtf.Old.Gain, gain, (ALfloat)todo/(Counter-fademix)); - hrtfparams.Coeffs = SAFE_CONST(ALfloat2*,parms->Hrtf.Target.Coeffs); + hrtfparams.Coeffs = parms->Hrtf.Target.Coeffs; hrtfparams.Delay[0] = parms->Hrtf.Target.Delay[0]; hrtfparams.Delay[1] = parms->Hrtf.Target.Delay[1]; hrtfparams.Gain = parms->Hrtf.Old.Gain; @@ -595,7 +675,7 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei continue; samples = DoFilters( - &parms->LowPass, &parms->HighPass, Device->FilteredData, + &parms->LowPass, &parms->HighPass, Device->TempBuffer[FILTERED_BUF], ResampledData, DstBufferSize, voice->Send[send].FilterType ); @@ -617,47 +697,50 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei Counter = maxi(DstBufferSize, Counter) - DstBufferSize; firstpass = false; - /* Handle looping sources */ - while(1) + if(isstatic) { - const ALbuffer *ALBuffer; - ALsizei DataSize = 0; - ALsizei LoopStart = 0; - ALsizei LoopEnd = 0; - - if((ALBuffer=BufferListItem->buffer) != NULL) + if(BufferLoopItem) { - DataSize = ALBuffer->SampleLen; - LoopStart = ALBuffer->LoopStart; - LoopEnd = ALBuffer->LoopEnd; - if(LoopEnd > DataPosInt) - break; + /* Handle looping static source */ + const ALbuffer *Buffer = BufferListItem->buffers[0]; + ALsizei LoopStart = Buffer->LoopStart; + ALsizei LoopEnd = Buffer->LoopEnd; + if(DataPosInt >= LoopEnd) + { + assert(LoopEnd > LoopStart); + DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; + } } - - if(BufferLoopItem && Source->SourceType == AL_STATIC) + else { - assert(LoopEnd > LoopStart); - DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart; - break; - } - - if(DataSize > DataPosInt) - break; - - BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_acquire); - if(!BufferListItem) - { - BufferListItem = BufferLoopItem; - if(!BufferListItem) + /* Handle non-looping static source */ + if(DataPosInt >= BufferListItem->max_samples) { isplaying = false; + BufferListItem = NULL; DataPosInt = 0; DataPosFrac = 0; break; } } + } + else while(1) + { + /* Handle streaming source */ + if(BufferListItem->max_samples > DataPosInt) + break; - DataPosInt -= DataSize; + DataPosInt -= BufferListItem->max_samples; + + buffers_done += BufferListItem->num_buffers; + BufferListItem = ATOMIC_LOAD(&BufferListItem->next, almemory_order_relaxed); + if(!BufferListItem && !(BufferListItem=BufferLoopItem)) + { + isplaying = false; + DataPosInt = 0; + DataPosFrac = 0; + break; + } } } while(isplaying && OutPos < SamplesToDo); @@ -667,5 +750,13 @@ ALboolean MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALsizei ATOMIC_STORE(&voice->position, DataPosInt, almemory_order_relaxed); ATOMIC_STORE(&voice->position_fraction, DataPosFrac, almemory_order_relaxed); ATOMIC_STORE(&voice->current_buffer, BufferListItem, almemory_order_release); + + /* Send any events now, after the position/buffer info was updated. */ + enabledevt = ATOMIC_LOAD(&Context->EnabledEvts, almemory_order_acquire); + if(buffers_done > 0 && (enabledevt&EventType_BufferCompleted)) + SendAsyncEvent(Context, EventType_BufferCompleted, + AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, SourceID, buffers_done, "Buffer completed" + ); + return isplaying; } diff --git a/love/src/jni/openal-soft-1.18.2/Alc/panning.c b/love/src/jni/openal-soft-1.19.1/Alc/panning.c similarity index 64% rename from love/src/jni/openal-soft-1.18.2/Alc/panning.c rename to love/src/jni/openal-soft-1.19.1/Alc/panning.c index 0abf18db..2c0f3bf2 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/panning.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/panning.c @@ -29,14 +29,19 @@ #include "alMain.h" #include "alAuxEffectSlot.h" #include "alu.h" +#include "alconfig.h" #include "bool.h" #include "ambdec.h" #include "bformatdec.h" +#include "filters/splitter.h" #include "uhjfilter.h" #include "bs2b.h" +extern inline void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); extern inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); +extern inline float ScaleAzimuthFront(float azimuth, float scale); +extern inline void ComputePanGains(const MixParams *dry, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); static const ALsizei FuMa2ACN[MAX_AMBI_COEFFS] = { @@ -62,64 +67,16 @@ static const ALsizei ACN2ACN[MAX_AMBI_COEFFS] = { 8, 9, 10, 11, 12, 13, 14, 15 }; -/* NOTE: These are scale factors as applied to Ambisonics content. Decoder - * coefficients should be divided by these values to get proper N3D scalings. - */ -static const ALfloat UnitScale[MAX_AMBI_COEFFS] = { - 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 -}; -static const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS] = { - 1.000000000f, /* ACN 0 (W), sqrt(1) */ - 1.732050808f, /* ACN 1 (Y), sqrt(3) */ - 1.732050808f, /* ACN 2 (Z), sqrt(3) */ - 1.732050808f, /* ACN 3 (X), sqrt(3) */ - 2.236067978f, /* ACN 4 (V), sqrt(5) */ - 2.236067978f, /* ACN 5 (T), sqrt(5) */ - 2.236067978f, /* ACN 6 (R), sqrt(5) */ - 2.236067978f, /* ACN 7 (S), sqrt(5) */ - 2.236067978f, /* ACN 8 (U), sqrt(5) */ - 2.645751311f, /* ACN 9 (Q), sqrt(7) */ - 2.645751311f, /* ACN 10 (O), sqrt(7) */ - 2.645751311f, /* ACN 11 (M), sqrt(7) */ - 2.645751311f, /* ACN 12 (K), sqrt(7) */ - 2.645751311f, /* ACN 13 (L), sqrt(7) */ - 2.645751311f, /* ACN 14 (N), sqrt(7) */ - 2.645751311f, /* ACN 15 (P), sqrt(7) */ -}; -static const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS] = { - 1.414213562f, /* ACN 0 (W), sqrt(2) */ - 1.732050808f, /* ACN 1 (Y), sqrt(3) */ - 1.732050808f, /* ACN 2 (Z), sqrt(3) */ - 1.732050808f, /* ACN 3 (X), sqrt(3) */ - 1.936491673f, /* ACN 4 (V), sqrt(15)/2 */ - 1.936491673f, /* ACN 5 (T), sqrt(15)/2 */ - 2.236067978f, /* ACN 6 (R), sqrt(5) */ - 1.936491673f, /* ACN 7 (S), sqrt(15)/2 */ - 1.936491673f, /* ACN 8 (U), sqrt(15)/2 */ - 2.091650066f, /* ACN 9 (Q), sqrt(35/8) */ - 1.972026594f, /* ACN 10 (O), sqrt(35)/3 */ - 2.231093404f, /* ACN 11 (M), sqrt(224/45) */ - 2.645751311f, /* ACN 12 (K), sqrt(7) */ - 2.231093404f, /* ACN 13 (L), sqrt(224/45) */ - 1.972026594f, /* ACN 14 (N), sqrt(35)/3 */ - 2.091650066f, /* ACN 15 (P), sqrt(35/8) */ -}; - -void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) +void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALfloat spread, + ALfloat coeffs[MAX_AMBI_COEFFS]) { - /* Convert from OpenAL coords to Ambisonics. */ - ALfloat x = -dir[2]; - ALfloat y = -dir[0]; - ALfloat z = dir[1]; - /* Zeroth-order */ coeffs[0] = 1.0f; /* ACN 0 = 1 */ /* First-order */ - coeffs[1] = 1.732050808f * y; /* ACN 1 = sqrt(3) * Y */ - coeffs[2] = 1.732050808f * z; /* ACN 2 = sqrt(3) * Z */ - coeffs[3] = 1.732050808f * x; /* ACN 3 = sqrt(3) * X */ + coeffs[1] = SQRTF_3 * y; /* ACN 1 = sqrt(3) * Y */ + coeffs[2] = SQRTF_3 * z; /* ACN 2 = sqrt(3) * Z */ + coeffs[3] = SQRTF_3 * x; /* ACN 3 = sqrt(3) * X */ /* Second-order */ coeffs[4] = 3.872983346f * x * y; /* ACN 4 = sqrt(15) * X * Y */ coeffs[5] = 3.872983346f * y * z; /* ACN 5 = sqrt(15) * Y * Z */ @@ -193,41 +150,8 @@ void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MA } } -void CalcAnglePairwiseCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) -{ - ALfloat sign = (azimuth < 0.0f) ? -1.0f : 1.0f; - if(!(fabsf(azimuth) > F_PI_2)) - azimuth = minf(fabsf(azimuth) * F_PI_2 / (F_PI/6.0f), F_PI_2) * sign; - CalcAngleCoeffs(azimuth, elevation, spread, coeffs); -} - -void ComputeAmbientGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i; - - for(i = 0;i < numchans;i++) - gains[i] = chancoeffs[i][0] * 1.414213562f * ingain; - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputeAmbientGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALfloat gain = 0.0f; - ALsizei i; - - for(i = 0;i < numchans;i++) - { - if(chanmap[i].Index == 0) - gain += chanmap[i].Scale; - } - gains[0] = gain * 1.414213562f * ingain; - for(i = 1;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) +void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) { ALsizei i, j; @@ -242,7 +166,7 @@ void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, AL gains[i] = 0.0f; } -void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) +void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) { ALsizei i; @@ -252,31 +176,6 @@ void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, con gains[i] = 0.0f; } -void ComputeFirstOrderGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i, j; - - for(i = 0;i < numchans;i++) - { - float gain = 0.0f; - for(j = 0;j < 4;j++) - gain += chancoeffs[i][j] * mtx[j]; - gains[i] = clampf(gain, 0.0f, 1.0f) * ingain; - } - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - -void ComputeFirstOrderGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) -{ - ALsizei i; - - for(i = 0;i < numchans;i++) - gains[i] = chanmap[i].Scale * mtx[chanmap[i].Index] * ingain; - for(;i < MAX_OUTPUT_CHANNELS;i++) - gains[i] = 0.0f; -} - static inline const char *GetLabelFromChannel(enum Channel channel) { @@ -329,34 +228,28 @@ typedef struct ChannelMap { ChannelConfig Config; } ChannelMap; -static void SetChannelMap(const enum Channel *devchans, ChannelConfig *ambicoeffs, - const ChannelMap *chanmap, size_t count, ALsizei *outcount) +static void SetChannelMap(const enum Channel devchans[MAX_OUTPUT_CHANNELS], + ChannelConfig *ambicoeffs, const ChannelMap *chanmap, + ALsizei count, ALsizei *outcount) { - size_t j, k; - ALsizei i; + ALsizei maxchans = 0; + ALsizei i, j; - for(i = 0;i < MAX_OUTPUT_CHANNELS && devchans[i] != InvalidChannel;i++) + for(i = 0;i < count;i++) { - if(devchans[i] == LFE) + ALint idx = GetChannelIndex(devchans, chanmap[i].ChanName); + if(idx < 0) { - for(j = 0;j < MAX_AMBI_COEFFS;j++) - ambicoeffs[i][j] = 0.0f; + ERR("Failed to find %s channel in device\n", + GetLabelFromChannel(chanmap[i].ChanName)); continue; } - for(j = 0;j < count;j++) - { - if(devchans[i] != chanmap[j].ChanName) - continue; - - for(k = 0;k < MAX_AMBI_COEFFS;++k) - ambicoeffs[i][k] = chanmap[j].Config[k]; - break; - } - if(j == count) - ERR("Failed to match %s channel (%u) in channel map\n", GetLabelFromChannel(devchans[i]), i); + maxchans = maxi(maxchans, idx+1); + for(j = 0;j < MAX_AMBI_COEFFS;j++) + ambicoeffs[idx][j] = chanmap[i].Config[j]; } - *outcount = i; + *outcount = mini(maxchans, MAX_OUTPUT_CHANNELS); } static bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALsizei speakermap[MAX_OUTPUT_CHANNELS]) @@ -365,7 +258,8 @@ static bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALsizei sp for(i = 0;i < conf->NumSpeakers;i++) { - int c = -1; + enum Channel ch; + int chidx = -1; /* NOTE: AmbDec does not define any standard speaker names, however * for this to work we have to by able to find the output channel @@ -388,62 +282,63 @@ static bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALsizei sp * and vice-versa. */ if(alstr_cmp_cstr(conf->Speakers[i].Name, "LF") == 0) - c = GetChannelIdxByName(device->RealOut, FrontLeft); + ch = FrontLeft; else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RF") == 0) - c = GetChannelIdxByName(device->RealOut, FrontRight); + ch = FrontRight; else if(alstr_cmp_cstr(conf->Speakers[i].Name, "CE") == 0) - c = GetChannelIdxByName(device->RealOut, FrontCenter); + ch = FrontCenter; else if(alstr_cmp_cstr(conf->Speakers[i].Name, "LS") == 0) { if(device->FmtChans == DevFmtX51Rear) - c = GetChannelIdxByName(device->RealOut, BackLeft); + ch = BackLeft; else - c = GetChannelIdxByName(device->RealOut, SideLeft); + ch = SideLeft; } else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RS") == 0) { if(device->FmtChans == DevFmtX51Rear) - c = GetChannelIdxByName(device->RealOut, BackRight); + ch = BackRight; else - c = GetChannelIdxByName(device->RealOut, SideRight); + ch = SideRight; } else if(alstr_cmp_cstr(conf->Speakers[i].Name, "LB") == 0) { if(device->FmtChans == DevFmtX51) - c = GetChannelIdxByName(device->RealOut, SideLeft); + ch = SideLeft; else - c = GetChannelIdxByName(device->RealOut, BackLeft); + ch = BackLeft; } else if(alstr_cmp_cstr(conf->Speakers[i].Name, "RB") == 0) { if(device->FmtChans == DevFmtX51) - c = GetChannelIdxByName(device->RealOut, SideRight); + ch = SideRight; else - c = GetChannelIdxByName(device->RealOut, BackRight); + ch = BackRight; } else if(alstr_cmp_cstr(conf->Speakers[i].Name, "CB") == 0) - c = GetChannelIdxByName(device->RealOut, BackCenter); + ch = BackCenter; else { const char *name = alstr_get_cstr(conf->Speakers[i].Name); unsigned int n; - char ch; + char c; - if(sscanf(name, "AUX%u%c", &n, &ch) == 1 && n < 16) - c = GetChannelIdxByName(device->RealOut, Aux0+n); + if(sscanf(name, "AUX%u%c", &n, &c) == 1 && n < 16) + ch = Aux0+n; else { ERR("AmbDec speaker label \"%s\" not recognized\n", name); return false; } } - if(c == -1) + chidx = GetChannelIdxByName(&device->RealOut, ch); + if(chidx == -1) { ERR("Failed to lookup AmbDec speaker label %s\n", alstr_get_cstr(conf->Speakers[i].Name)); return false; } - speakermap[i] = c; + speakermap[i] = chidx; } return true; @@ -453,31 +348,28 @@ static bool MakeSpeakerMap(ALCdevice *device, const AmbDecConf *conf, ALsizei sp static const ChannelMap MonoCfg[1] = { { FrontCenter, { 1.0f } }, }, StereoCfg[2] = { - { FrontLeft, { 5.00000000e-1f, 2.88675135e-1f, 0.0f, 1.19573156e-1f } }, - { FrontRight, { 5.00000000e-1f, -2.88675135e-1f, 0.0f, 1.19573156e-1f } }, + { FrontLeft, { 5.00000000e-1f, 2.88675135e-1f, 0.0f, 5.52305643e-2f } }, + { FrontRight, { 5.00000000e-1f, -2.88675135e-1f, 0.0f, 5.52305643e-2f } }, }, QuadCfg[4] = { { BackLeft, { 3.53553391e-1f, 2.04124145e-1f, 0.0f, -2.04124145e-1f } }, { FrontLeft, { 3.53553391e-1f, 2.04124145e-1f, 0.0f, 2.04124145e-1f } }, { FrontRight, { 3.53553391e-1f, -2.04124145e-1f, 0.0f, 2.04124145e-1f } }, { BackRight, { 3.53553391e-1f, -2.04124145e-1f, 0.0f, -2.04124145e-1f } }, -}, X51SideCfg[5] = { - { SideLeft, { 3.33001372e-1f, 1.89085671e-1f, 0.0f, -2.00041334e-1f, -2.12309737e-2f, 0.0f, 0.0f, 0.0f, -1.14573483e-2f } }, - { FrontLeft, { 1.47751298e-1f, 1.28994110e-1f, 0.0f, 1.15190495e-1f, 7.44949143e-2f, 0.0f, 0.0f, 0.0f, -6.47739980e-3f } }, - { FrontCenter, { 7.73595729e-2f, 0.00000000e+0f, 0.0f, 9.71390298e-2f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, 5.18625335e-2f } }, - { FrontRight, { 1.47751298e-1f, -1.28994110e-1f, 0.0f, 1.15190495e-1f, -7.44949143e-2f, 0.0f, 0.0f, 0.0f, -6.47739980e-3f } }, - { SideRight, { 3.33001372e-1f, -1.89085671e-1f, 0.0f, -2.00041334e-1f, 2.12309737e-2f, 0.0f, 0.0f, 0.0f, -1.14573483e-2f } }, -}, X51RearCfg[5] = { - { BackLeft, { 3.33001372e-1f, 1.89085671e-1f, 0.0f, -2.00041334e-1f, -2.12309737e-2f, 0.0f, 0.0f, 0.0f, -1.14573483e-2f } }, - { FrontLeft, { 1.47751298e-1f, 1.28994110e-1f, 0.0f, 1.15190495e-1f, 7.44949143e-2f, 0.0f, 0.0f, 0.0f, -6.47739980e-3f } }, - { FrontCenter, { 7.73595729e-2f, 0.00000000e+0f, 0.0f, 9.71390298e-2f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, 5.18625335e-2f } }, - { FrontRight, { 1.47751298e-1f, -1.28994110e-1f, 0.0f, 1.15190495e-1f, -7.44949143e-2f, 0.0f, 0.0f, 0.0f, -6.47739980e-3f } }, - { BackRight, { 3.33001372e-1f, -1.89085671e-1f, 0.0f, -2.00041334e-1f, 2.12309737e-2f, 0.0f, 0.0f, 0.0f, -1.14573483e-2f } }, +}, X51SideCfg[4] = { + { SideLeft, { 3.33000782e-1f, 1.89084803e-1f, 0.0f, -2.00042375e-1f, -2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, + { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 0.0f, 1.66295695e-1f, 7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, + { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 0.0f, 1.66295695e-1f, -7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, + { SideRight, { 3.33000782e-1f, -1.89084803e-1f, 0.0f, -2.00042375e-1f, 2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, +}, X51RearCfg[4] = { + { BackLeft, { 3.33000782e-1f, 1.89084803e-1f, 0.0f, -2.00042375e-1f, -2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, + { FrontLeft, { 1.88542860e-1f, 1.27709292e-1f, 0.0f, 1.66295695e-1f, 7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, + { FrontRight, { 1.88542860e-1f, -1.27709292e-1f, 0.0f, 1.66295695e-1f, -7.30571517e-2f, 0.0f, 0.0f, 0.0f, 2.10901184e-2f } }, + { BackRight, { 3.33000782e-1f, -1.89084803e-1f, 0.0f, -2.00042375e-1f, 2.12307769e-2f, 0.0f, 0.0f, 0.0f, -1.14579885e-2f } }, }, X61Cfg[6] = { - { SideLeft, { 2.04462744e-1f, 2.17178497e-1f, 0.0f, -4.39990188e-2f, -2.60787329e-2f, 0.0f, 0.0f, 0.0f, -6.87238843e-2f } }, - { FrontLeft, { 1.18130342e-1f, 9.34633906e-2f, 0.0f, 1.08553749e-1f, 6.80658795e-2f, 0.0f, 0.0f, 0.0f, 1.08999485e-2f } }, - { FrontCenter, { 7.73595729e-2f, 0.00000000e+0f, 0.0f, 9.71390298e-2f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, 5.18625335e-2f } }, - { FrontRight, { 1.18130342e-1f, -9.34633906e-2f, 0.0f, 1.08553749e-1f, -6.80658795e-2f, 0.0f, 0.0f, 0.0f, 1.08999485e-2f } }, - { SideRight, { 2.04462744e-1f, -2.17178497e-1f, 0.0f, -4.39990188e-2f, 2.60787329e-2f, 0.0f, 0.0f, 0.0f, -6.87238843e-2f } }, + { SideLeft, { 2.04460341e-1f, 2.17177926e-1f, 0.0f, -4.39996780e-2f, -2.60790269e-2f, 0.0f, 0.0f, 0.0f, -6.87239792e-2f } }, + { FrontLeft, { 1.58923161e-1f, 9.21772680e-2f, 0.0f, 1.59658796e-1f, 6.66278083e-2f, 0.0f, 0.0f, 0.0f, 3.84686854e-2f } }, + { FrontRight, { 1.58923161e-1f, -9.21772680e-2f, 0.0f, 1.59658796e-1f, -6.66278083e-2f, 0.0f, 0.0f, 0.0f, 3.84686854e-2f } }, + { SideRight, { 2.04460341e-1f, -2.17177926e-1f, 0.0f, -4.39996780e-2f, 2.60790269e-2f, 0.0f, 0.0f, 0.0f, -6.87239792e-2f } }, { BackCenter, { 2.50001688e-1f, 0.00000000e+0f, 0.0f, -2.50000094e-1f, 0.00000000e+0f, 0.0f, 0.0f, 0.0f, 6.05133395e-2f } }, }, X71Cfg[6] = { { BackLeft, { 2.04124145e-1f, 1.08880247e-1f, 0.0f, -1.88586120e-1f, -1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, 3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, @@ -488,28 +380,24 @@ static const ChannelMap MonoCfg[1] = { { BackRight, { 2.04124145e-1f, -1.08880247e-1f, 0.0f, -1.88586120e-1f, 1.29099444e-1f, 0.0f, 0.0f, 0.0f, 7.45355993e-2f, -3.73460789e-2f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.00000000e+0f } }, }; -static void InitNearFieldCtrl(ALCdevice *device, ALfloat ctrl_dist, ALsizei order, bool periphonic) +static void InitNearFieldCtrl(ALCdevice *device, ALfloat ctrl_dist, ALsizei order, + const ALsizei *restrict chans_per_order) { const char *devname = alstr_get_cstr(device->DeviceName); ALsizei i; if(GetConfigValueBool(devname, "decoder", "nfc", 1) && ctrl_dist > 0.0f) { - /* NFC is only used when AvgSpeakerDist is greater than 0, and - * METERS_PER_UNIT is also greater than 0. In addition, NFC can only be - * used when rendering to an ambisonic buffer. + /* NFC is only used when AvgSpeakerDist is greater than 0, and can only + * be used when rendering to an ambisonic buffer. */ - device->AvgSpeakerDist = ctrl_dist; + device->AvgSpeakerDist = minf(ctrl_dist, 10.0f); + TRACE("Using near-field reference distance: %.2f meters\n", device->AvgSpeakerDist); - device->Dry.NumChannelsPerOrder[0] = 1; - if(periphonic) - for(i = 1;i < order+1;i++) - device->Dry.NumChannelsPerOrder[i] = (i+1)*(i+1) - i*i; - else - for(i = 1;i < order+1;i++) - device->Dry.NumChannelsPerOrder[i] = (i*2+1) - ((i-1)*2+1); + for(i = 0;i < order+1;i++) + device->NumChannelsPerOrder[i] = chans_per_order[i]; for(;i < MAX_AMBI_ORDER+1;i++) - device->Dry.NumChannelsPerOrder[i] = 0; + device->NumChannelsPerOrder[i] = 0; } } @@ -517,7 +405,7 @@ static void InitDistanceComp(ALCdevice *device, const AmbDecConf *conf, const AL { const char *devname = alstr_get_cstr(device->DeviceName); ALfloat maxdist = 0.0f; - ALsizei total = 0; + size_t total = 0; ALsizei i; for(i = 0;i < conf->NumSpeakers;i++) @@ -631,7 +519,7 @@ static void InitPanning(ALCdevice *device) const ALsizei *acnmap = (device->AmbiLayout == AmbiLayout_FuMa) ? FuMa2ACN : ACN2ACN; const ALfloat *n3dscale = (device->AmbiScale == AmbiNorm_FuMa) ? FuMa2N3DScale : (device->AmbiScale == AmbiNorm_SN3D) ? SN3D2N3DScale : - /*(device->AmbiScale == AmbiNorm_N3D) ?*/ UnitScale; + /*(device->AmbiScale == AmbiNorm_N3D) ?*/ N3D2N3DScale; ALfloat nfc_delay = 0.0f; count = (device->AmbiOrder == 3) ? 16 : @@ -654,6 +542,8 @@ static void InitPanning(ALCdevice *device) } else { + ALfloat w_scale=1.0f, xyz_scale=1.0f; + /* FOA output is always ACN+N3D for higher-order ambisonic output. * The upsampler expects this and will convert it for output. */ @@ -666,14 +556,27 @@ static void InitPanning(ALCdevice *device) device->FOAOut.CoeffCount = 0; device->FOAOut.NumChannels = 4; - ambiup_reset(device->AmbiUp, device); + if(device->AmbiOrder >= 3) + { + w_scale = W_SCALE_3H3P; + xyz_scale = XYZ_SCALE_3H3P; + } + else + { + w_scale = W_SCALE_2H2P; + xyz_scale = XYZ_SCALE_2H2P; + } + ambiup_reset(device->AmbiUp, device, w_scale, xyz_scale); } if(ConfigValueFloat(devname, "decoder", "nfc-ref-delay", &nfc_delay) && nfc_delay > 0.0f) { + static const ALsizei chans_per_order[MAX_AMBI_ORDER+1] = { + 1, 3, 5, 7 + }; nfc_delay = clampf(nfc_delay, 0.001f, 1000.0f); InitNearFieldCtrl(device, nfc_delay * SPEEDOFSOUNDMETRESPERSEC, - device->AmbiOrder, true); + device->AmbiOrder, chans_per_order); } } else @@ -684,10 +587,10 @@ static void InitPanning(ALCdevice *device) chanmap, count, &device->Dry.NumChannels); device->Dry.CoeffCount = coeffcount; - w_scale = (device->Dry.CoeffCount > 9) ? W_SCALE2D_THIRD : - (device->Dry.CoeffCount > 4) ? W_SCALE2D_SECOND : 1.0f; - xyz_scale = (device->Dry.CoeffCount > 9) ? XYZ_SCALE2D_THIRD : - (device->Dry.CoeffCount > 4) ? XYZ_SCALE2D_SECOND : 1.0f; + w_scale = (device->Dry.CoeffCount > 9) ? W_SCALE_3H0P : + (device->Dry.CoeffCount > 4) ? W_SCALE_2H0P : 1.0f; + xyz_scale = (device->Dry.CoeffCount > 9) ? XYZ_SCALE_3H0P : + (device->Dry.CoeffCount > 4) ? XYZ_SCALE_2H0P : 1.0f; memset(&device->FOAOut.Ambi, 0, sizeof(device->FOAOut.Ambi)); for(i = 0;i < device->Dry.NumChannels;i++) @@ -705,7 +608,7 @@ static void InitPanning(ALCdevice *device) static void InitCustomPanning(ALCdevice *device, const AmbDecConf *conf, const ALsizei speakermap[MAX_OUTPUT_CHANNELS]) { ChannelMap chanmap[MAX_OUTPUT_CHANNELS]; - const ALfloat *coeff_scale = UnitScale; + const ALfloat *coeff_scale = N3D2N3DScale; ALfloat w_scale = 1.0f; ALfloat xyz_scale = 1.0f; ALsizei i, j; @@ -718,26 +621,26 @@ static void InitCustomPanning(ALCdevice *device, const AmbDecConf *conf, const A { if(conf->ChanMask > 0x1ff) { - w_scale = W_SCALE3D_THIRD; - xyz_scale = XYZ_SCALE3D_THIRD; + w_scale = W_SCALE_3H3P; + xyz_scale = XYZ_SCALE_3H3P; } else if(conf->ChanMask > 0xf) { - w_scale = W_SCALE3D_SECOND; - xyz_scale = XYZ_SCALE3D_SECOND; + w_scale = W_SCALE_2H2P; + xyz_scale = XYZ_SCALE_2H2P; } } else { if(conf->ChanMask > 0x1ff) { - w_scale = W_SCALE2D_THIRD; - xyz_scale = XYZ_SCALE2D_THIRD; + w_scale = W_SCALE_3H0P; + xyz_scale = XYZ_SCALE_3H0P; } else if(conf->ChanMask > 0xf) { - w_scale = W_SCALE2D_SECOND; - xyz_scale = XYZ_SCALE2D_SECOND; + w_scale = W_SCALE_2H0P; + xyz_scale = XYZ_SCALE_2H0P; } } @@ -789,6 +692,8 @@ static void InitCustomPanning(ALCdevice *device, const AmbDecConf *conf, const A static void InitHQPanning(ALCdevice *device, const AmbDecConf *conf, const ALsizei speakermap[MAX_OUTPUT_CHANNELS]) { + static const ALsizei chans_per_order2d[MAX_AMBI_ORDER+1] = { 1, 2, 2, 2 }; + static const ALsizei chans_per_order3d[MAX_AMBI_ORDER+1] = { 1, 3, 5, 7 }; ALfloat avg_dist; ALsizei count; ALsizei i; @@ -865,7 +770,7 @@ static void InitHQPanning(ALCdevice *device, const AmbDecConf *conf, const ALsiz avg_dist /= (ALfloat)conf->NumSpeakers; InitNearFieldCtrl(device, avg_dist, (conf->ChanMask > 0x1ff) ? 3 : (conf->ChanMask > 0xf) ? 2 : 1, - !!(conf->ChanMask&AMBI_PERIPHONIC_MASK) + (conf->ChanMask&AMBI_PERIPHONIC_MASK) ? chans_per_order3d : chans_per_order2d ); InitDistanceComp(device, conf, speakermap); @@ -874,66 +779,93 @@ static void InitHQPanning(ALCdevice *device, const AmbDecConf *conf, const ALsiz static void InitHrtfPanning(ALCdevice *device) { /* NOTE: azimuth goes clockwise. */ - static const ALfloat AmbiPoints[][2] = { + static const struct AngularPoint AmbiPoints[] = { { DEG2RAD( 90.0f), DEG2RAD( 0.0f) }, - { DEG2RAD( 35.0f), DEG2RAD( -45.0f) }, - { DEG2RAD( 35.0f), DEG2RAD( 45.0f) }, - { DEG2RAD( 35.0f), DEG2RAD( 135.0f) }, - { DEG2RAD( 35.0f), DEG2RAD(-135.0f) }, + { DEG2RAD( 35.2643897f), DEG2RAD( 45.0f) }, + { DEG2RAD( 35.2643897f), DEG2RAD( 135.0f) }, + { DEG2RAD( 35.2643897f), DEG2RAD(-135.0f) }, + { DEG2RAD( 35.2643897f), DEG2RAD( -45.0f) }, { DEG2RAD( 0.0f), DEG2RAD( 0.0f) }, + { DEG2RAD( 0.0f), DEG2RAD( 45.0f) }, { DEG2RAD( 0.0f), DEG2RAD( 90.0f) }, + { DEG2RAD( 0.0f), DEG2RAD( 135.0f) }, { DEG2RAD( 0.0f), DEG2RAD( 180.0f) }, + { DEG2RAD( 0.0f), DEG2RAD(-135.0f) }, { DEG2RAD( 0.0f), DEG2RAD( -90.0f) }, - { DEG2RAD(-35.0f), DEG2RAD( -45.0f) }, - { DEG2RAD(-35.0f), DEG2RAD( 45.0f) }, - { DEG2RAD(-35.0f), DEG2RAD( 135.0f) }, - { DEG2RAD(-35.0f), DEG2RAD(-135.0f) }, + { DEG2RAD( 0.0f), DEG2RAD( -45.0f) }, + { DEG2RAD(-35.2643897f), DEG2RAD( 45.0f) }, + { DEG2RAD(-35.2643897f), DEG2RAD( 135.0f) }, + { DEG2RAD(-35.2643897f), DEG2RAD(-135.0f) }, + { DEG2RAD(-35.2643897f), DEG2RAD( -45.0f) }, { DEG2RAD(-90.0f), DEG2RAD( 0.0f) }, }; - static const ALfloat AmbiMatrixFOA[][2][MAX_AMBI_COEFFS] = { - { { 1.88982237e-001f, 0.00000000e+000f, 1.90399923e-001f, 0.00000000e+000f }, { 7.14285714e-002f, 0.00000000e+000f, 1.24646009e-001f, 0.00000000e+000f } }, - { { 1.88982237e-001f, 1.09057783e-001f, 1.09208910e-001f, 1.09057783e-001f }, { 7.14285714e-002f, 7.13950780e-002f, 7.14940135e-002f, 7.13950780e-002f } }, - { { 1.88982237e-001f, -1.09057783e-001f, 1.09208910e-001f, 1.09057783e-001f }, { 7.14285714e-002f, -7.13950780e-002f, 7.14940135e-002f, 7.13950780e-002f } }, - { { 1.88982237e-001f, -1.09057783e-001f, 1.09208910e-001f, -1.09057783e-001f }, { 7.14285714e-002f, -7.13950780e-002f, 7.14940135e-002f, -7.13950780e-002f } }, - { { 1.88982237e-001f, 1.09057783e-001f, 1.09208910e-001f, -1.09057783e-001f }, { 7.14285714e-002f, 7.13950780e-002f, 7.14940135e-002f, -7.13950780e-002f } }, - { { 1.88982237e-001f, 0.00000000e+000f, 0.00000000e+000f, 1.88281281e-001f }, { 7.14285714e-002f, 0.00000000e+000f, 0.00000000e+000f, 1.23259031e-001f } }, - { { 1.88982237e-001f, -1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f }, { 7.14285714e-002f, -1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f } }, - { { 1.88982237e-001f, 0.00000000e+000f, 0.00000000e+000f, -1.88281281e-001f }, { 7.14285714e-002f, 0.00000000e+000f, 0.00000000e+000f, -1.23259031e-001f } }, - { { 1.88982237e-001f, 1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f }, { 7.14285714e-002f, 1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f } }, - { { 1.88982237e-001f, 1.09057783e-001f, -1.09208910e-001f, 1.09057783e-001f }, { 7.14285714e-002f, 7.13950780e-002f, -7.14940135e-002f, 7.13950780e-002f } }, - { { 1.88982237e-001f, -1.09057783e-001f, -1.09208910e-001f, 1.09057783e-001f }, { 7.14285714e-002f, -7.13950780e-002f, -7.14940135e-002f, 7.13950780e-002f } }, - { { 1.88982237e-001f, -1.09057783e-001f, -1.09208910e-001f, -1.09057783e-001f }, { 7.14285714e-002f, -7.13950780e-002f, -7.14940135e-002f, -7.13950780e-002f } }, - { { 1.88982237e-001f, 1.09057783e-001f, -1.09208910e-001f, -1.09057783e-001f }, { 7.14285714e-002f, 7.13950780e-002f, -7.14940135e-002f, -7.13950780e-002f } }, - { { 1.88982237e-001f, 0.00000000e+000f, -1.90399923e-001f, 0.00000000e+000f }, { 7.14285714e-002f, 0.00000000e+000f, -1.24646009e-001f, 0.00000000e+000f } } - }, AmbiMatrixHOA[][2][MAX_AMBI_COEFFS] = { - { { 1.43315266e-001f, 0.00000000e+000f, 1.90399923e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 1.18020996e-001f, 0.00000000e+000f, 0.00000000e+000f }, { 7.26741039e-002f, 0.00000000e+000f, 1.24646009e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 1.49618920e-001f, 0.00000000e+000f, 0.00000000e+000f } }, - { { 1.40852210e-001f, 1.09057783e-001f, 1.09208910e-001f, 1.09057783e-001f, 7.58818830e-002f, 7.66295578e-002f, -3.28314629e-004f, 7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, 7.13950780e-002f, 7.14940135e-002f, 7.13950780e-002f, 9.61978444e-002f, 9.71456952e-002f, -4.16214759e-004f, 9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, -1.09057783e-001f, 1.09208910e-001f, 1.09057783e-001f, -7.58818830e-002f, -7.66295578e-002f, -3.28314629e-004f, 7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, -7.13950780e-002f, 7.14940135e-002f, 7.13950780e-002f, -9.61978444e-002f, -9.71456952e-002f, -4.16214759e-004f, 9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, -1.09057783e-001f, 1.09208910e-001f, -1.09057783e-001f, 7.58818830e-002f, -7.66295578e-002f, -3.28314629e-004f, -7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, -7.13950780e-002f, 7.14940135e-002f, -7.13950780e-002f, 9.61978444e-002f, -9.71456952e-002f, -4.16214759e-004f, -9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, 1.09057783e-001f, 1.09208910e-001f, -1.09057783e-001f, -7.58818830e-002f, 7.66295578e-002f, -3.28314629e-004f, -7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, 7.13950780e-002f, 7.14940135e-002f, -7.13950780e-002f, -9.61978444e-002f, 9.71456952e-002f, -4.16214759e-004f, -9.71456952e-002f, 0.00000000e+000f } }, - { { 1.39644596e-001f, 0.00000000e+000f, 0.00000000e+000f, 1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f, -5.83538687e-002f, 0.00000000e+000f, 1.01835015e-001f }, { 7.08127349e-002f, 0.00000000e+000f, 0.00000000e+000f, 1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f, -7.39770307e-002f, 0.00000000e+000f, 1.29099445e-001f } }, - { { 1.39644596e-001f, -1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, -5.83538687e-002f, 0.00000000e+000f, -1.01835015e-001f }, { 7.08127349e-002f, -1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, -7.39770307e-002f, 0.00000000e+000f, -1.29099445e-001f } }, - { { 1.39644596e-001f, 0.00000000e+000f, 0.00000000e+000f, -1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f, -5.83538687e-002f, 0.00000000e+000f, 1.01835015e-001f }, { 7.08127349e-002f, 0.00000000e+000f, 0.00000000e+000f, -1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f, -7.39770307e-002f, 0.00000000e+000f, 1.29099445e-001f } }, - { { 1.39644596e-001f, 1.88281281e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, -5.83538687e-002f, 0.00000000e+000f, -1.01835015e-001f }, { 7.08127349e-002f, 1.23259031e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, -7.39770307e-002f, 0.00000000e+000f, -1.29099445e-001f } }, - { { 1.40852210e-001f, 1.09057783e-001f, -1.09208910e-001f, 1.09057783e-001f, 7.58818830e-002f, -7.66295578e-002f, -3.28314629e-004f, -7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, 7.13950780e-002f, -7.14940135e-002f, 7.13950780e-002f, 9.61978444e-002f, -9.71456952e-002f, -4.16214759e-004f, -9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, -1.09057783e-001f, -1.09208910e-001f, 1.09057783e-001f, -7.58818830e-002f, 7.66295578e-002f, -3.28314629e-004f, -7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, -7.13950780e-002f, -7.14940135e-002f, 7.13950780e-002f, -9.61978444e-002f, 9.71456952e-002f, -4.16214759e-004f, -9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, -1.09057783e-001f, -1.09208910e-001f, -1.09057783e-001f, 7.58818830e-002f, 7.66295578e-002f, -3.28314629e-004f, 7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, -7.13950780e-002f, -7.14940135e-002f, -7.13950780e-002f, 9.61978444e-002f, 9.71456952e-002f, -4.16214759e-004f, 9.71456952e-002f, 0.00000000e+000f } }, - { { 1.40852210e-001f, 1.09057783e-001f, -1.09208910e-001f, -1.09057783e-001f, -7.58818830e-002f, -7.66295578e-002f, -3.28314629e-004f, 7.66295578e-002f, 0.00000000e+000f }, { 7.14251066e-002f, 7.13950780e-002f, -7.14940135e-002f, -7.13950780e-002f, -9.61978444e-002f, -9.71456952e-002f, -4.16214759e-004f, 9.71456952e-002f, 0.00000000e+000f } }, - { { 1.43315266e-001f, 0.00000000e+000f, -1.90399923e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 1.18020996e-001f, 0.00000000e+000f, 0.00000000e+000f }, { 7.26741039e-002f, 0.00000000e+000f, -1.24646009e-001f, 0.00000000e+000f, 0.00000000e+000f, 0.00000000e+000f, 1.49618920e-001f, 0.00000000e+000f, 0.00000000e+000f } }, + static const ALfloat AmbiMatrixFOA[][MAX_AMBI_COEFFS] = { + { 5.55555556e-02f, 0.00000000e+00f, 1.23717915e-01f, 0.00000000e+00f }, + { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f }, + { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f }, + { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f }, + { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f }, + { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, 8.66025404e-02f }, + { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f }, + { 5.55555556e-02f, -8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f }, + { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f }, + { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, -8.66025404e-02f }, + { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f }, + { 5.55555556e-02f, 8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f }, + { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f }, + { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f }, + { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f }, + { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f }, + { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f }, + { 5.55555556e-02f, 0.00000000e+00f, -1.23717915e-01f, 0.00000000e+00f }, + }, AmbiMatrixHOA[][MAX_AMBI_COEFFS] = { + { 5.55555556e-02f, 0.00000000e+00f, 1.23717915e-01f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f }, + { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, -5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, -5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 5.00000000e-02f, 7.14285715e-02f, 5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, 8.66025404e-02f, 0.00000000e+00f, 1.29099445e-01f }, + { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f, -6.83467648e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, -8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f, -1.29099445e-01f }, + { 5.55555556e-02f, -6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f, 6.83467648e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 0.00000000e+00f, 0.00000000e+00f, -8.66025404e-02f, 0.00000000e+00f, 1.29099445e-01f }, + { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, -6.12372435e-02f, -6.83467648e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 8.66025404e-02f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f, -1.29099445e-01f }, + { 5.55555556e-02f, 6.12372435e-02f, 0.00000000e+00f, 6.12372435e-02f, 6.83467648e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, -5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, -5.00000000e-02f, -4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 5.00000000e-02f, -7.14285715e-02f, 5.00000000e-02f, 4.55645099e-02f, 0.00000000e+00f }, + { 5.55555556e-02f, 0.00000000e+00f, -1.23717915e-01f, 0.00000000e+00f, 0.00000000e+00f, 0.00000000e+00f }, }; - const ALfloat (*AmbiMatrix)[2][MAX_AMBI_COEFFS] = device->AmbiUp ? AmbiMatrixHOA : - AmbiMatrixFOA; - ALsizei count = device->AmbiUp ? 9 : 4; + static const ALfloat AmbiOrderHFGainFOA[MAX_AMBI_ORDER+1] = { + 3.00000000e+00f, 1.73205081e+00f + }, AmbiOrderHFGainHOA[MAX_AMBI_ORDER+1] = { + 2.40192231e+00f, 1.86052102e+00f, 9.60768923e-01f + }; + static const ALsizei IndexMap[6] = { 0, 1, 2, 3, 4, 8 }; + static const ALsizei ChansPerOrder[MAX_AMBI_ORDER+1] = { 1, 3, 2, 0 }; + const ALfloat (*restrict AmbiMatrix)[MAX_AMBI_COEFFS] = AmbiMatrixFOA; + const ALfloat *restrict AmbiOrderHFGain = AmbiOrderHFGainFOA; + ALsizei count = 4; ALsizei i; - static_assert(COUNTOF(AmbiPoints) <= HRTF_AMBI_MAX_CHANNELS, "HRTF_AMBI_MAX_CHANNELS is too small"); + static_assert(COUNTOF(AmbiPoints) == COUNTOF(AmbiMatrixFOA), "FOA Ambisonic HRTF mismatch"); + static_assert(COUNTOF(AmbiPoints) == COUNTOF(AmbiMatrixHOA), "HOA Ambisonic HRTF mismatch"); + + if(device->AmbiUp) + { + AmbiMatrix = AmbiMatrixHOA; + AmbiOrderHFGain = AmbiOrderHFGainHOA; + count = COUNTOF(IndexMap); + } device->Hrtf = al_calloc(16, FAM_SIZE(DirectHrtfState, Chan, count)); for(i = 0;i < count;i++) { device->Dry.Ambi.Map[i].Scale = 1.0f; - device->Dry.Ambi.Map[i].Index = i; + device->Dry.Ambi.Map[i].Index = IndexMap[i]; } device->Dry.CoeffCount = 0; device->Dry.NumChannels = count; @@ -949,7 +881,8 @@ static void InitHrtfPanning(ALCdevice *device) device->FOAOut.CoeffCount = 0; device->FOAOut.NumChannels = 4; - ambiup_reset(device->AmbiUp, device); + ambiup_reset(device->AmbiUp, device, AmbiOrderHFGainFOA[0] / AmbiOrderHFGain[0], + AmbiOrderHFGainFOA[1] / AmbiOrderHFGain[1]); } else { @@ -960,10 +893,13 @@ static void InitHrtfPanning(ALCdevice *device) device->RealOut.NumChannels = ChannelsFromDevFmt(device->FmtChans, device->AmbiOrder); - device->Hrtf->IrSize = BuildBFormatHrtf(device->HrtfHandle, - device->Hrtf, device->Dry.NumChannels, - AmbiPoints, AmbiMatrix, COUNTOF(AmbiPoints) + BuildBFormatHrtf(device->HrtfHandle, + device->Hrtf, device->Dry.NumChannels, AmbiPoints, AmbiMatrix, COUNTOF(AmbiPoints), + AmbiOrderHFGain ); + + InitNearFieldCtrl(device, device->HrtfHandle->distance, device->AmbiUp ? 2 : 1, + ChansPerOrder); } static void InitUhjPanning(ALCdevice *device) @@ -1006,7 +942,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf device->Dry.CoeffCount = 0; device->Dry.NumChannels = 0; for(i = 0;i < MAX_AMBI_ORDER+1;i++) - device->Dry.NumChannelsPerOrder[i] = 0; + device->NumChannelsPerOrder[i] = 0; device->AvgSpeakerDist = 0.0f; memset(device->ChannelDelay, 0, sizeof(device->ChannelDelay)); @@ -1016,6 +952,9 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf device->ChannelDelay[i].Length = 0; } + al_free(device->Stablizer); + device->Stablizer = NULL; + if(device->FmtChans != DevFmtStereo) { ALsizei speakermap[MAX_OUTPUT_CHANNELS]; @@ -1066,25 +1005,20 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf if(pconf && GetConfigValueBool(devname, "decoder", "hq-mode", 0)) { - ambiup_free(device->AmbiUp); - device->AmbiUp = NULL; + ambiup_free(&device->AmbiUp); if(!device->AmbiDecoder) device->AmbiDecoder = bformatdec_alloc(); } else { - bformatdec_free(device->AmbiDecoder); - device->AmbiDecoder = NULL; - if(device->FmtChans == DevFmtAmbi3D && device->AmbiOrder > 1) + bformatdec_free(&device->AmbiDecoder); + if(device->FmtChans != DevFmtAmbi3D || device->AmbiOrder < 2) + ambiup_free(&device->AmbiUp); + else { if(!device->AmbiUp) device->AmbiUp = ambiup_alloc(); } - else - { - ambiup_free(device->AmbiUp); - device->AmbiUp = NULL; - } } if(!pconf) @@ -1094,12 +1028,48 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf else InitCustomPanning(device, pconf, speakermap); + /* Enable the stablizer only for formats that have front-left, front- + * right, and front-center outputs. + */ + switch(device->FmtChans) + { + case DevFmtX51: + case DevFmtX51Rear: + case DevFmtX61: + case DevFmtX71: + if(GetConfigValueBool(devname, NULL, "front-stablizer", 0)) + { + /* Initialize band-splitting filters for the front-left and + * front-right channels, with a crossover at 5khz (could be + * higher). + */ + ALfloat scale = (ALfloat)(5000.0 / device->Frequency); + FrontStablizer *stablizer = al_calloc(16, sizeof(*stablizer)); + + bandsplit_init(&stablizer->LFilter, scale); + stablizer->RFilter = stablizer->LFilter; + + /* Initialize all-pass filters for all other channels. */ + splitterap_init(&stablizer->APFilter[0], scale); + for(i = 1;i < (size_t)device->RealOut.NumChannels;i++) + stablizer->APFilter[i] = stablizer->APFilter[0]; + + device->Stablizer = stablizer; + } + break; + case DevFmtMono: + case DevFmtStereo: + case DevFmtQuad: + case DevFmtAmbi3D: + break; + } + TRACE("Front stablizer %s\n", device->Stablizer ? "enabled" : "disabled"); + ambdec_deinit(&conf); return; } - bformatdec_free(device->AmbiDecoder); - device->AmbiDecoder = NULL; + bformatdec_free(&device->AmbiDecoder); headphones = device->IsHeadphones; if(device->Type != Loopback) @@ -1191,8 +1161,7 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf /* Don't bother with HOA when using full HRTF rendering. Nothing * needs it, and it eases the CPU/memory load. */ - ambiup_free(device->AmbiUp); - device->AmbiUp = NULL; + ambiup_free(&device->AmbiUp); } else { @@ -1217,8 +1186,7 @@ no_hrtf: device->Render_Mode = StereoPair; - ambiup_free(device->AmbiUp); - device->AmbiUp = NULL; + ambiup_free(&device->AmbiUp); bs2blevel = ((headphones && hrtf_appreq != Hrtf_Disable) || (hrtf_appreq == Hrtf_Enable)) ? 5 : 0; diff --git a/love/src/jni/openal-soft-1.19.1/Alc/polymorphism.h b/love/src/jni/openal-soft-1.19.1/Alc/polymorphism.h new file mode 100644 index 00000000..fa31fad2 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/polymorphism.h @@ -0,0 +1,105 @@ +#ifndef POLYMORPHISM_H +#define POLYMORPHISM_H + +/* Macros to declare inheriting types, and to (down-)cast and up-cast. */ +#define DERIVE_FROM_TYPE(t) t t##_parent +#define STATIC_CAST(to, obj) (&(obj)->to##_parent) +#ifdef __GNUC__ +#define STATIC_UPCAST(to, from, obj) __extension__({ \ + static_assert(__builtin_types_compatible_p(from, __typeof(*(obj))), \ + "Invalid upcast object from type"); \ + (to*)((char*)(obj) - offsetof(to, from##_parent)); \ +}) +#else +#define STATIC_UPCAST(to, from, obj) ((to*)((char*)(obj) - offsetof(to, from##_parent))) +#endif + +/* Defines method forwards, which call the given parent's (T2's) implementation. */ +#define DECLARE_FORWARD(T1, T2, rettype, func) \ +rettype T1##_##func(T1 *obj) \ +{ return T2##_##func(STATIC_CAST(T2, obj)); } + +#define DECLARE_FORWARD1(T1, T2, rettype, func, argtype1) \ +rettype T1##_##func(T1 *obj, argtype1 a) \ +{ return T2##_##func(STATIC_CAST(T2, obj), a); } + +#define DECLARE_FORWARD2(T1, T2, rettype, func, argtype1, argtype2) \ +rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b) \ +{ return T2##_##func(STATIC_CAST(T2, obj), a, b); } + +#define DECLARE_FORWARD3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ +rettype T1##_##func(T1 *obj, argtype1 a, argtype2 b, argtype3 c) \ +{ return T2##_##func(STATIC_CAST(T2, obj), a, b, c); } + +/* Defines method thunks, functions that call to the child's method. */ +#define DECLARE_THUNK(T1, T2, rettype, func) \ +static rettype T1##_##T2##_##func(T2 *obj) \ +{ return T1##_##func(STATIC_UPCAST(T1, T2, obj)); } + +#define DECLARE_THUNK1(T1, T2, rettype, func, argtype1) \ +static rettype T1##_##T2##_##func(T2 *obj, argtype1 a) \ +{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a); } + +#define DECLARE_THUNK2(T1, T2, rettype, func, argtype1, argtype2) \ +static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b) \ +{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b); } + +#define DECLARE_THUNK3(T1, T2, rettype, func, argtype1, argtype2, argtype3) \ +static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c) \ +{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c); } + +#define DECLARE_THUNK4(T1, T2, rettype, func, argtype1, argtype2, argtype3, argtype4) \ +static rettype T1##_##T2##_##func(T2 *obj, argtype1 a, argtype2 b, argtype3 c, argtype4 d) \ +{ return T1##_##func(STATIC_UPCAST(T1, T2, obj), a, b, c, d); } + +/* Defines the default functions used to (de)allocate a polymorphic object. */ +#define DECLARE_DEFAULT_ALLOCATORS(T) \ +static void* T##_New(size_t size) { return al_malloc(16, size); } \ +static void T##_Delete(void *ptr) { al_free(ptr); } + + +/* Helper to extract an argument list for virtual method calls. */ +#define EXTRACT_VCALL_ARGS(...) __VA_ARGS__)) + +/* Call a "virtual" method on an object, with arguments. */ +#define V(obj, func) ((obj)->vtbl->func((obj), EXTRACT_VCALL_ARGS +/* Call a "virtual" method on an object, with no arguments. */ +#define V0(obj, func) ((obj)->vtbl->func((obj) EXTRACT_VCALL_ARGS + + +/* Helper to extract an argument list for NEW_OBJ calls. */ +#define EXTRACT_NEW_ARGS(...) __VA_ARGS__); \ + } \ +} while(0) + +/* Allocate and construct an object, with arguments. */ +#define NEW_OBJ(_res, T) do { \ + _res = T##_New(sizeof(T)); \ + if(_res) \ + { \ + memset(_res, 0, sizeof(T)); \ + T##_Construct(_res, EXTRACT_NEW_ARGS +/* Allocate and construct an object, with no arguments. */ +#define NEW_OBJ0(_res, T) do { \ + _res = T##_New(sizeof(T)); \ + if(_res) \ + { \ + memset(_res, 0, sizeof(T)); \ + T##_Construct(_res EXTRACT_NEW_ARGS + +/* Destructs and deallocate an object. */ +#define DELETE_OBJ(obj) do { \ + if((obj) != NULL) \ + { \ + V0((obj),Destruct)(); \ + V0((obj),Delete)(); \ + } \ +} while(0) + + +/* Helper to get a type's vtable thunk for a child type. */ +#define GET_VTABLE2(T1, T2) (&(T1##_##T2##_vtable)) +/* Helper to set an object's vtable thunk for a child type. Used when constructing an object. */ +#define SET_VTABLE2(T1, T2, obj) (STATIC_CAST(T2, obj)->vtbl = GET_VTABLE2(T1, T2)) + +#endif /* POLYMORPHISM_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/alcRing.c b/love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.c similarity index 72% rename from love/src/jni/openal-soft-1.18.2/Alc/alcRing.c rename to love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.c index d72b34f1..6c419cf8 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/alcRing.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.c @@ -22,8 +22,11 @@ #include #include +#include -#include "alMain.h" +#include "ringbuffer.h" +#include "align.h" +#include "atomic.h" #include "threads.h" #include "almalloc.h" #include "compat.h" @@ -39,85 +42,70 @@ struct ll_ringbuffer { size_t size; size_t size_mask; size_t elem_size; - int mlocked; alignas(16) char buf[]; }; -/* Create a new ringbuffer to hold at least `sz' elements of `elem_sz' bytes. - * The number of elements is rounded up to the next power of two. */ -ll_ringbuffer_t *ll_ringbuffer_create(size_t sz, size_t elem_sz) +ll_ringbuffer_t *ll_ringbuffer_create(size_t sz, size_t elem_sz, int limit_writes) { ll_ringbuffer_t *rb; - ALuint power_of_two; + size_t power_of_two = 0; - power_of_two = NextPowerOf2(sz); - if(power_of_two < sz) - return NULL; + if(sz > 0) + { + power_of_two = sz; + power_of_two |= power_of_two>>1; + power_of_two |= power_of_two>>2; + power_of_two |= power_of_two>>4; + power_of_two |= power_of_two>>8; + power_of_two |= power_of_two>>16; +#if SIZE_MAX > UINT_MAX + power_of_two |= power_of_two>>32; +#endif + } + power_of_two++; + if(power_of_two < sz) return NULL; rb = al_malloc(16, sizeof(*rb) + power_of_two*elem_sz); if(!rb) return NULL; ATOMIC_INIT(&rb->write_ptr, 0); ATOMIC_INIT(&rb->read_ptr, 0); - rb->size = power_of_two; - rb->size_mask = rb->size - 1; + rb->size = limit_writes ? sz : power_of_two; + rb->size_mask = power_of_two - 1; rb->elem_size = elem_sz; - rb->mlocked = 0; return rb; } -/* Free all data associated with the ringbuffer `rb'. */ void ll_ringbuffer_free(ll_ringbuffer_t *rb) { - if(rb) - { -#ifdef USE_MLOCK - if(rb->mlocked) - munlock(rb, sizeof(*rb) + rb->size*rb->elem_size); -#endif /* USE_MLOCK */ - al_free(rb); - } + al_free(rb); } -/* Lock the data block of `rb' using the system call 'mlock'. */ -int ll_ringbuffer_mlock(ll_ringbuffer_t *rb) -{ -#ifdef USE_MLOCK - if(!rb->mlocked && mlock(rb, sizeof(*rb) + rb->size*rb->elem_size)) - return -1; -#endif /* USE_MLOCK */ - rb->mlocked = 1; - return 0; -} - -/* Reset the read and write pointers to zero. This is not thread safe. */ void ll_ringbuffer_reset(ll_ringbuffer_t *rb) { ATOMIC_STORE(&rb->write_ptr, 0, almemory_order_release); ATOMIC_STORE(&rb->read_ptr, 0, almemory_order_release); - memset(rb->buf, 0, rb->size*rb->elem_size); + memset(rb->buf, 0, (rb->size_mask+1)*rb->elem_size); } -/* Return the number of elements available for reading. This is the number of - * elements in front of the read pointer and behind the write pointer. */ + size_t ll_ringbuffer_read_space(const ll_ringbuffer_t *rb) { size_t w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); size_t r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); return (w-r) & rb->size_mask; } -/* Return the number of elements available for writing. This is the number of - * elements in front of the write pointer and behind the read pointer. */ + size_t ll_ringbuffer_write_space(const ll_ringbuffer_t *rb) { size_t w = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->write_ptr, almemory_order_acquire); size_t r = ATOMIC_LOAD(&CONST_CAST(ll_ringbuffer_t*,rb)->read_ptr, almemory_order_acquire); - return (r-w-1) & rb->size_mask; + w = (r-w-1) & rb->size_mask; + return (w > rb->size) ? rb->size : w; } -/* The copying data reader. Copy at most `cnt' elements from `rb' to `dest'. - * Returns the actual number of elements copied. */ + size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt) { size_t read_ptr; @@ -133,9 +121,9 @@ size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt) read_ptr = ATOMIC_LOAD(&rb->read_ptr, almemory_order_relaxed) & rb->size_mask; cnt2 = read_ptr + to_read; - if(cnt2 > rb->size) + if(cnt2 > rb->size_mask+1) { - n1 = rb->size - read_ptr; + n1 = rb->size_mask+1 - read_ptr; n2 = cnt2 & rb->size_mask; } else @@ -156,9 +144,6 @@ size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt) return to_read; } -/* The copying data reader w/o read pointer advance. Copy at most `cnt' - * elements from `rb' to `dest'. Returns the actual number of elements copied. - */ size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt) { size_t free_cnt; @@ -174,9 +159,9 @@ size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt) read_ptr = ATOMIC_LOAD(&rb->read_ptr, almemory_order_relaxed) & rb->size_mask; cnt2 = read_ptr + to_read; - if(cnt2 > rb->size) + if(cnt2 > rb->size_mask+1) { - n1 = rb->size - read_ptr; + n1 = rb->size_mask+1 - read_ptr; n2 = cnt2 & rb->size_mask; } else @@ -195,8 +180,6 @@ size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt) return to_read; } -/* The copying data writer. Copy at most `cnt' elements to `rb' from `src'. - * Returns the actual number of elements copied. */ size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt) { size_t write_ptr; @@ -212,9 +195,9 @@ size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt) write_ptr = ATOMIC_LOAD(&rb->write_ptr, almemory_order_relaxed) & rb->size_mask; cnt2 = write_ptr + to_write; - if(cnt2 > rb->size) + if(cnt2 > rb->size_mask+1) { - n1 = rb->size - write_ptr; + n1 = rb->size_mask+1 - write_ptr; n2 = cnt2 & rb->size_mask; } else @@ -235,22 +218,19 @@ size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt) return to_write; } -/* Advance the read pointer `cnt' places. */ + void ll_ringbuffer_read_advance(ll_ringbuffer_t *rb, size_t cnt) { ATOMIC_ADD(&rb->read_ptr, cnt, almemory_order_acq_rel); } -/* Advance the write pointer `cnt' places. */ void ll_ringbuffer_write_advance(ll_ringbuffer_t *rb, size_t cnt) { ATOMIC_ADD(&rb->write_ptr, cnt, almemory_order_acq_rel); } -/* The non-copying data reader. `vec' is an array of two places. Set the values - * at `vec' to hold the current readable data at `rb'. If the readable data is - * in one segment the second segment has zero length. */ -void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t * vec) + +void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]) { size_t free_cnt; size_t cnt2; @@ -263,12 +243,12 @@ void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data free_cnt = (w-r) & rb->size_mask; cnt2 = r + free_cnt; - if(cnt2 > rb->size) + if(cnt2 > rb->size_mask+1) { /* Two part vector: the rest of the buffer after the current write ptr, * plus some from the start of the buffer. */ vec[0].buf = (char*)&rb->buf[r*rb->elem_size]; - vec[0].len = rb->size - r; + vec[0].len = rb->size_mask+1 - r; vec[1].buf = (char*)rb->buf; vec[1].len = cnt2 & rb->size_mask; } @@ -282,10 +262,7 @@ void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data } } -/* The non-copying data writer. `vec' is an array of two places. Set the values - * at `vec' to hold the current writeable data at `rb'. If the writeable data - * is in one segment the second segment has zero length. */ -void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t *vec) +void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]) { size_t free_cnt; size_t cnt2; @@ -296,14 +273,15 @@ void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_dat w &= rb->size_mask; r &= rb->size_mask; free_cnt = (r-w-1) & rb->size_mask; + if(free_cnt > rb->size) free_cnt = rb->size; cnt2 = w + free_cnt; - if(cnt2 > rb->size) + if(cnt2 > rb->size_mask+1) { /* Two part vector: the rest of the buffer after the current write ptr, * plus some from the start of the buffer. */ vec[0].buf = (char*)&rb->buf[w*rb->elem_size]; - vec[0].len = rb->size - w; + vec[0].len = rb->size_mask+1 - w; vec[1].buf = (char*)rb->buf; vec[1].len = cnt2 & rb->size_mask; } diff --git a/love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.h b/love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.h new file mode 100644 index 00000000..0d05ec84 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Alc/ringbuffer.h @@ -0,0 +1,77 @@ +#ifndef RINGBUFFER_H +#define RINGBUFFER_H + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ll_ringbuffer ll_ringbuffer_t; +typedef struct ll_ringbuffer_data { + char *buf; + size_t len; +} ll_ringbuffer_data_t; + + +/** + * Create a new ringbuffer to hold at least `sz' elements of `elem_sz' bytes. + * The number of elements is rounded up to the next power of two (even if it is + * already a power of two, to ensure the requested amount can be written). + */ +ll_ringbuffer_t *ll_ringbuffer_create(size_t sz, size_t elem_sz, int limit_writes); +/** Free all data associated with the ringbuffer `rb'. */ +void ll_ringbuffer_free(ll_ringbuffer_t *rb); +/** Reset the read and write pointers to zero. This is not thread safe. */ +void ll_ringbuffer_reset(ll_ringbuffer_t *rb); + +/** + * The non-copying data reader. `vec' is an array of two places. Set the values + * at `vec' to hold the current readable data at `rb'. If the readable data is + * in one segment the second segment has zero length. + */ +void ll_ringbuffer_get_read_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]); +/** + * The non-copying data writer. `vec' is an array of two places. Set the values + * at `vec' to hold the current writeable data at `rb'. If the writeable data + * is in one segment the second segment has zero length. + */ +void ll_ringbuffer_get_write_vector(const ll_ringbuffer_t *rb, ll_ringbuffer_data_t vec[2]); + +/** + * Return the number of elements available for reading. This is the number of + * elements in front of the read pointer and behind the write pointer. + */ +size_t ll_ringbuffer_read_space(const ll_ringbuffer_t *rb); +/** + * The copying data reader. Copy at most `cnt' elements from `rb' to `dest'. + * Returns the actual number of elements copied. + */ +size_t ll_ringbuffer_read(ll_ringbuffer_t *rb, char *dest, size_t cnt); +/** + * The copying data reader w/o read pointer advance. Copy at most `cnt' + * elements from `rb' to `dest'. Returns the actual number of elements copied. + */ +size_t ll_ringbuffer_peek(ll_ringbuffer_t *rb, char *dest, size_t cnt); +/** Advance the read pointer `cnt' places. */ +void ll_ringbuffer_read_advance(ll_ringbuffer_t *rb, size_t cnt); + +/** + * Return the number of elements available for writing. This is the number of + * elements in front of the write pointer and behind the read pointer. + */ +size_t ll_ringbuffer_write_space(const ll_ringbuffer_t *rb); +/** + * The copying data writer. Copy at most `cnt' elements to `rb' from `src'. + * Returns the actual number of elements copied. + */ +size_t ll_ringbuffer_write(ll_ringbuffer_t *rb, const char *src, size_t cnt); +/** Advance the write pointer `cnt' places. */ +void ll_ringbuffer_write_advance(ll_ringbuffer_t *rb, size_t cnt); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* RINGBUFFER_H */ diff --git a/love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.c b/love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.c similarity index 53% rename from love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.c rename to love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.c index 8e2febae..42b0bc40 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.c +++ b/love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.c @@ -9,36 +9,29 @@ #define MAX_UPDATE_SAMPLES 128 -static const ALfloat Filter1Coeff[4] = { - 0.6923878f, 0.9360654322959f, 0.9882295226860f, 0.9987488452737f +static const ALfloat Filter1CoeffSqr[4] = { + 0.479400865589f, 0.876218493539f, 0.976597589508f, 0.997499255936f }; -static const ALfloat Filter2Coeff[4] = { - 0.4021921162426f, 0.8561710882420f, 0.9722909545651f, 0.9952884791278f +static const ALfloat Filter2CoeffSqr[4] = { + 0.161758498368f, 0.733028932341f, 0.945349700329f, 0.990599156685f }; static void allpass_process(AllPassState *state, ALfloat *restrict dst, const ALfloat *restrict src, const ALfloat aa, ALsizei todo) { + ALfloat z1 = state->z[0]; + ALfloat z2 = state->z[1]; ALsizei i; - if(todo > 1) + for(i = 0;i < todo;i++) { - dst[0] = aa*(src[0] + state->y[1]) - state->x[1]; - dst[1] = aa*(src[1] + state->y[0]) - state->x[0]; - for(i = 2;i < todo;i++) - dst[i] = aa*(src[i] + dst[i-2]) - src[i-2]; - state->x[1] = src[i-2]; - state->x[0] = src[i-1]; - state->y[1] = dst[i-2]; - state->y[0] = dst[i-1]; - } - else if(todo == 1) - { - dst[0] = aa*(src[0] + state->y[1]) - state->x[1]; - state->x[1] = state->x[0]; - state->x[0] = src[0]; - state->y[1] = state->y[0]; - state->y[0] = dst[0]; + ALfloat input = src[i]; + ALfloat output = input*aa + z1; + z1 = z2; z2 = output*aa - input; + dst[i] = output; } + + state->z[0] = z1; + state->z[1] = z2; } @@ -68,41 +61,37 @@ void EncodeUhj2(Uhj2Encoder *enc, ALfloat *restrict LeftOut, ALfloat *restrict R ALfloat temp[2][MAX_UPDATE_SAMPLES]; ALsizei base, i; + ASSUME(SamplesToDo > 0); + for(base = 0;base < SamplesToDo;) { ALsizei todo = mini(SamplesToDo - base, MAX_UPDATE_SAMPLES); + ASSUME(todo > 0); /* D = 0.6554516*Y */ for(i = 0;i < todo;i++) temp[0][i] = 0.6554516f*InSamples[2][base+i]; - allpass_process(&enc->Filter1_Y[0], temp[1], temp[0], - Filter1Coeff[0]*Filter1Coeff[0], todo); - allpass_process(&enc->Filter1_Y[1], temp[0], temp[1], - Filter1Coeff[1]*Filter1Coeff[1], todo); - allpass_process(&enc->Filter1_Y[2], temp[1], temp[0], - Filter1Coeff[2]*Filter1Coeff[2], todo); + allpass_process(&enc->Filter1_Y[0], temp[1], temp[0], Filter1CoeffSqr[0], todo); + allpass_process(&enc->Filter1_Y[1], temp[0], temp[1], Filter1CoeffSqr[1], todo); + allpass_process(&enc->Filter1_Y[2], temp[1], temp[0], Filter1CoeffSqr[2], todo); + allpass_process(&enc->Filter1_Y[3], temp[0], temp[1], Filter1CoeffSqr[3], todo); /* NOTE: Filter1 requires a 1 sample delay for the final output, so * take the last processed sample from the previous run as the first * output sample. */ - D[0] = enc->Filter1_Y[3].y[0]; - allpass_process(&enc->Filter1_Y[3], temp[0], temp[1], - Filter1Coeff[3]*Filter1Coeff[3], todo); + D[0] = enc->LastY; for(i = 1;i < todo;i++) D[i] = temp[0][i-1]; + enc->LastY = temp[0][i-1]; /* D += j(-0.3420201*W + 0.5098604*X) */ for(i = 0;i < todo;i++) temp[0][i] = -0.3420201f*InSamples[0][base+i] + 0.5098604f*InSamples[1][base+i]; - allpass_process(&enc->Filter2_WX[0], temp[1], temp[0], - Filter2Coeff[0]*Filter2Coeff[0], todo); - allpass_process(&enc->Filter2_WX[1], temp[0], temp[1], - Filter2Coeff[1]*Filter2Coeff[1], todo); - allpass_process(&enc->Filter2_WX[2], temp[1], temp[0], - Filter2Coeff[2]*Filter2Coeff[2], todo); - allpass_process(&enc->Filter2_WX[3], temp[0], temp[1], - Filter2Coeff[3]*Filter2Coeff[3], todo); + allpass_process(&enc->Filter2_WX[0], temp[1], temp[0], Filter2CoeffSqr[0], todo); + allpass_process(&enc->Filter2_WX[1], temp[0], temp[1], Filter2CoeffSqr[1], todo); + allpass_process(&enc->Filter2_WX[2], temp[1], temp[0], Filter2CoeffSqr[2], todo); + allpass_process(&enc->Filter2_WX[3], temp[0], temp[1], Filter2CoeffSqr[3], todo); for(i = 0;i < todo;i++) D[i] += temp[0][i]; @@ -110,17 +99,14 @@ void EncodeUhj2(Uhj2Encoder *enc, ALfloat *restrict LeftOut, ALfloat *restrict R for(i = 0;i < todo;i++) temp[0][i] = 0.9396926f*InSamples[0][base+i] + 0.1855740f*InSamples[1][base+i]; - allpass_process(&enc->Filter1_WX[0], temp[1], temp[0], - Filter1Coeff[0]*Filter1Coeff[0], todo); - allpass_process(&enc->Filter1_WX[1], temp[0], temp[1], - Filter1Coeff[1]*Filter1Coeff[1], todo); - allpass_process(&enc->Filter1_WX[2], temp[1], temp[0], - Filter1Coeff[2]*Filter1Coeff[2], todo); - S[0] = enc->Filter1_WX[3].y[0]; - allpass_process(&enc->Filter1_WX[3], temp[0], temp[1], - Filter1Coeff[3]*Filter1Coeff[3], todo); + allpass_process(&enc->Filter1_WX[0], temp[1], temp[0], Filter1CoeffSqr[0], todo); + allpass_process(&enc->Filter1_WX[1], temp[0], temp[1], Filter1CoeffSqr[1], todo); + allpass_process(&enc->Filter1_WX[2], temp[1], temp[0], Filter1CoeffSqr[2], todo); + allpass_process(&enc->Filter1_WX[3], temp[0], temp[1], Filter1CoeffSqr[3], todo); + S[0] = enc->LastWX; for(i = 1;i < todo;i++) S[i] = temp[0][i-1]; + enc->LastWX = temp[0][i-1]; /* Left = (S + D)/2.0 */ for(i = 0;i < todo;i++) diff --git a/love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.h b/love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.h similarity index 94% rename from love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.h rename to love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.h index 48c2fde6..e773e0a7 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/uhjfilter.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/uhjfilter.h @@ -6,8 +6,7 @@ #include "alMain.h" typedef struct AllPassState { - ALfloat x[2]; /* Last two input samples */ - ALfloat y[2]; /* Last two output samples */ + ALfloat z[2]; } AllPassState; /* Encoding 2-channel UHJ from B-Format is done as: @@ -36,9 +35,10 @@ typedef struct AllPassState { */ typedef struct Uhj2Encoder { - AllPassState Filter1_WX[4]; AllPassState Filter1_Y[4]; AllPassState Filter2_WX[4]; + AllPassState Filter1_WX[4]; + ALfloat LastY, LastWX; } Uhj2Encoder; /* Encodes a 2-channel UHJ (stereo-compatible) signal from a B-Format input diff --git a/love/src/jni/openal-soft-1.18.2/Alc/vector.h b/love/src/jni/openal-soft-1.19.1/Alc/vector.h similarity index 96% rename from love/src/jni/openal-soft-1.18.2/Alc/vector.h rename to love/src/jni/openal-soft-1.19.1/Alc/vector.h index ed0780e3..ed9acfb0 100644 --- a/love/src/jni/openal-soft-1.18.2/Alc/vector.h +++ b/love/src/jni/openal-soft-1.19.1/Alc/vector.h @@ -37,7 +37,8 @@ typedef const _##N* const_##N; \ if(((_x) ? (_x)->Capacity : 0) < _cap) \ { \ - ptrdiff_t data_offset = (char*)((_x)->Data) - (char*)(_x); \ + ptrdiff_t data_offset = (_x) ? (char*)((_x)->Data) - (char*)(_x) : \ + sizeof(*(_x)); \ size_t old_size = ((_x) ? (_x)->Size : 0); \ void *temp; \ \ diff --git a/love/src/jni/openal-soft-1.19.1/Android.mk b/love/src/jni/openal-soft-1.19.1/Android.mk new file mode 100644 index 00000000..dacc228d --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/Android.mk @@ -0,0 +1,144 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE := libopenal +# Filled later. The config.h is based on very minimal config of ARM32 +LOCAL_CFLAGS := -std=c99 -DAL_ALEXT_PROTOTYPES +# Is there any devices without NEON support in 2019? +LOCAL_ARM_NEON := true + +# Target conditionals +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + # Defines for ARM32 + LOCAL_CFLAGS += \ + -DHAVE_NEON \ + -DSIZEOF_LONG=4 +else ifeq ($(TARGET_ARCH_ABI),arm64-v8a) + # Defines for ARM64 + LOCAL_CFLAGS += \ + -DHAVE_POSIX_MEMALIGN \ + -DHAVE_NEON \ + -DHAVE_LOG2F \ + -DHAVE_STRTOF \ + -DSIZEOF_LONG=8 \ + -DHAVE_PTHREAD_MUTEX_TIMEDLOCK +else ifeq ($(TARGET_ARCH_ABI),x86) + # Defines for x86. UNTESTED! + LOCAL_CFLAGS += \ + -DHAVE_SSE \ + -DHAVE_SSE2 \ + -DHAVE_SSE3 \ + -DSIZEOF_LONG=4 \ + -DHAVE_CPUID_H \ + -DHAVE_GCC_GET_CPUID \ +else ifeq ($(TARGET_ARCH_ABI),x86_64) + # Defines for x86-64. UNTESTED! + LOCAL_CFLAGS += \ + -DHAVE_POSIX_MEMALIGN \ + -DHAVE_SSE \ + -DHAVE_SSE2 \ + -DHAVE_SSE3 \ + -DHAVE_SSE4_1 \ + -DHAVE_LOG2F \ + -DHAVE_STRTOF \ + -DSIZEOF_LONG=8 \ + -DHAVE_CPUID_H \ + -DHAVE_GCC_GET_CPUID \ + -DHAVE_PTHREAD_MUTEX_TIMEDLOCK +endif + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/include \ + $(LOCAL_PATH)/common \ + $(LOCAL_PATH)/Alc \ + $(LOCAL_PATH)/OpenAL32/Include + +LOCAL_SRC_FILES := \ + common/alcomplex.c \ + common/almalloc.c \ + common/atomic.c \ + common/rwlock.c \ + common/threads.c \ + common/uintmap.c \ + OpenAL32/alAuxEffectSlot.c \ + OpenAL32/alBuffer.c \ + OpenAL32/alEffect.c \ + OpenAL32/alError.c \ + OpenAL32/alExtension.c \ + OpenAL32/alFilter.c \ + OpenAL32/alListener.c \ + OpenAL32/alSource.c \ + OpenAL32/alState.c \ + OpenAL32/event.c \ + OpenAL32/sample_cvt.c \ + Alc/ALc.c \ + Alc/ALu.c \ + Alc/alconfig.c \ + Alc/bs2b.c \ + Alc/converter.c \ + Alc/mastering.c \ + Alc/ringbuffer.c \ + Alc/effects/autowah.c \ + Alc/effects/chorus.c \ + Alc/effects/compressor.c \ + Alc/effects/dedicated.c \ + Alc/effects/distortion.c \ + Alc/effects/echo.c \ + Alc/effects/equalizer.c \ + Alc/effects/fshifter.c \ + Alc/effects/modulator.c \ + Alc/effects/null.c \ + Alc/effects/pshifter.c \ + Alc/effects/reverb.c \ + Alc/filters/filter.c \ + Alc/filters/nfc.c \ + Alc/filters/splitter.c \ + Alc/helpers.c \ + Alc/hrtf.c \ + Alc/uhjfilter.c \ + Alc/ambdec.c \ + Alc/bformatdec.c \ + Alc/panning.c \ + Alc/mixvoice.c \ + Alc/mixer/mixer_c.c \ + Alc/backends/base.c \ + Alc/backends/loopback.c \ + Alc/backends/null.c \ + Alc/backends/opensl.c \ + Alc/backends/wave.c + +LOCAL_LDLIBS := -lOpenSLES +LOCAL_STATIC_LIBRARIES := + +# CPU-specific instructions +ifneq (,$(findstring HAVE_SSE4_1,${LOCAL_CFLAGS})) + # SSE4.1 mixer + LOCAL_SRC_FILES += \ + Alc/mixer/mixer_sse.c \ + Alc/mixer/mixer_sse2.c \ + Alc/mixer/mixer_sse3.c \ + Alc/mixer/mixer_sse41.c +else ifneq (,$(findstring HAVE_SSE3,${LOCAL_CFLAGS})) + # SSE3 mixer + LOCAL_SRC_FILES += \ + Alc/mixer/mixer_sse.c \ + Alc/mixer/mixer_sse2.c \ + Alc/mixer/mixer_sse3.c +else ifneq (,$(findstring HAVE_NEON,${LOCAL_CFLAGS})) + # NEON mixer + LOCAL_SRC_FILES += Alc/mixer/mixer_neon.c +endif + +# NDK R17 Support library +ifeq ($(NDK_R17),yes) + # Well, NDK r17 (is it?) defines all function regardless of API level + ifeq (,$(findstring HAVE_LOG2F,${LOCAL_CFLAGS})) + LOCAL_CFLAGS += -DHAVE_LOG2F + endif + # Also only link with android_support for older than 21 + ifeq ($(ANDROID_21_OR_LATER),no) + LOCAL_STATIC_LIBRARIES += android_support + endif +endif + +include $(BUILD_SHARED_LIBRARY) diff --git a/love/src/jni/openal-soft-1.18.2/CMakeLists.txt b/love/src/jni/openal-soft-1.19.1/CMakeLists.txt similarity index 69% rename from love/src/jni/openal-soft-1.18.2/CMakeLists.txt rename to love/src/jni/openal-soft-1.19.1/CMakeLists.txt index a871f4cf..39b80250 100644 --- a/love/src/jni/openal-soft-1.18.2/CMakeLists.txt +++ b/love/src/jni/openal-soft-1.19.1/CMakeLists.txt @@ -62,8 +62,14 @@ if(DEFINED LIB_SUFFIX) endif() +SET(CPP_DEFS ) # C pre-process, not C++ +SET(INC_PATHS ) +SET(C_FLAGS ) +SET(LINKER_FLAGS ) +SET(EXTRA_LIBS ) + IF(WIN32) - ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502") + SET(CPP_DEFS ${CPP_DEFS} _WIN32 _WIN32_WINNT=0x0502) OPTION(ALSOFT_BUILD_ROUTER "Build the router (EXPERIMENTAL; creates OpenAL32.dll and soft_oal.dll)" OFF) @@ -85,13 +91,10 @@ IF(WIN32) ENDIF() -SET(EXTRA_LIBS "") -SET(EXTRA_LDFLAGS "") - # QNX's gcc do not uses /usr/include and /usr/lib pathes by default IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX") - ADD_DEFINITIONS("-I/usr/include") - SET(EXTRA_LDFLAGS "${EXTRA_LDFLAGS} -L/usr/lib") + SET(INC_PATHS ${INC_PATHS} /usr/include) + SET(LINKER_FLAGS ${LINKER_FLAGS} -L/usr/lib) ENDIF() IF(NOT LIBTYPE) @@ -99,8 +102,8 @@ IF(NOT LIBTYPE) ENDIF() SET(LIB_MAJOR_VERSION "1") -SET(LIB_MINOR_VERSION "18") -SET(LIB_REVISION "2") +SET(LIB_MINOR_VERSION "19") +SET(LIB_REVISION "1") SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") SET(EXPORT_DECL "") @@ -136,7 +139,7 @@ if(NOT WIN32) IF(NOT HAVE_POSIX_MEMALIGN_POSIX) SET(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS}) ELSE() - ADD_DEFINITIONS(-D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600) + SET(CPP_DEFS ${CPP_DEFS} _POSIX_C_SOURCE=200112L _XOPEN_SOURCE=600) ENDIF() ENDIF() UNSET(OLD_REQUIRED_FLAGS) @@ -145,10 +148,10 @@ ENDIF() # Set defines for large file support CHECK_FILE_OFFSET_BITS() IF(_FILE_OFFSET_BITS) - ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}) + SET(CPP_DEFS ${CPP_DEFS} "_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}") SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}") ENDIF() -ADD_DEFINITIONS(-D_LARGEFILE_SOURCE -D_LARGE_FILES) +SET(CPP_DEFS ${CPP_DEFS} _LARGEFILE_SOURCE _LARGE_FILES) SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_LARGEFILE_SOURCE -D_LARGE_FILES") # MSVC may need workarounds for C99 restrict and inline @@ -158,7 +161,7 @@ IF(MSVC) CHECK_C_SOURCE_COMPILES("int *restrict foo; int main() {return 0;}" HAVE_RESTRICT) IF(NOT HAVE_RESTRICT) - ADD_DEFINITIONS("-Drestrict=") + SET(CPP_DEFS ${CPP_DEFS} "restrict=") SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=") ENDIF() @@ -171,7 +174,7 @@ IF(MSVC) MESSAGE(FATAL_ERROR "No inline keyword found, please report!") ENDIF() - ADD_DEFINITIONS(-Dinline=__inline) + SET(CPP_DEFS ${CPP_DEFS} inline=__inline) SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline") ENDIF() ENDIF() @@ -198,7 +201,7 @@ ENDIF() CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC) IF(HAVE_STRUCT_TIMESPEC) # Define it here so we don't have to include config.h for it - ADD_DEFINITIONS("-DHAVE_STRUCT_TIMESPEC") + SET(CPP_DEFS ${CPP_DEFS} HAVE_STRUCT_TIMESPEC) ENDIF() # Some systems may need libatomic for C11 atomic functions to work @@ -225,16 +228,6 @@ IF(HAVE_LIBLOG) SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} log) ENDIF() -# Check if we have C99 variable length arrays -CHECK_C_SOURCE_COMPILES( -"int main(int argc, char *argv[]) - { - volatile int tmp[argc]; - tmp[0] = argv[0][0]; - return tmp[0]; - }" -HAVE_C99_VLA) - # Check if we have C99 bool CHECK_C_SOURCE_COMPILES( "int main(int argc, char *argv[]) @@ -288,11 +281,9 @@ IF(NOT CMAKE_DEBUG_POSTFIX) FORCE) ENDIF() -SET(EXTRA_CFLAGS "") IF(MSVC) - ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) - ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} /wd4098") + SET(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE) + SET(C_FLAGS ${C_FLAGS} /wd4098) IF(NOT DXSDK_DIR) STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}") @@ -314,14 +305,14 @@ IF(MSVC) ENDFOREACH(flag_var) ENDIF() ELSE() - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Winline -Wall") + SET(C_FLAGS ${C_FLAGS} -Winline -Wall) CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA) IF(HAVE_W_EXTRA) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Wextra") + SET(C_FLAGS ${C_FLAGS} -Wextra) ENDIF() IF(ALSOFT_WERROR) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror") + SET(C_FLAGS ${C_FLAGS} -Werror) ENDIF() # We want RelWithDebInfo to actually include debug stuff (define _DEBUG @@ -334,7 +325,7 @@ ELSE() CHECK_C_COMPILER_FLAG(-fno-math-errno HAVE_FNO_MATH_ERRNO) IF(HAVE_FNO_MATH_ERRNO) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fno-math-errno") + SET(C_FLAGS ${C_FLAGS} -fno-math-errno) ENDIF() CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor)); @@ -353,7 +344,7 @@ int main() HAVE_STATIC_LIBGCC_SWITCH ) if(HAVE_STATIC_LIBGCC_SWITCH) - set(EXTRA_LDFLAGS "${EXTRA_LDFLAGS} -static-libgcc") + SET(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc) endif() set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES}) unset(OLD_REQUIRED_LIBRARIES) @@ -388,7 +379,7 @@ ELSE() IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY) CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH) IF(HAVE_VISIBILITY_HIDDEN_SWITCH) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden") + SET(C_FLAGS ${C_FLAGS} -fvisibility=hidden) ENDIF() ENDIF() @@ -441,6 +432,48 @@ IF(HAVE_MFPU_NEON_SWITCH) SET(FPU_NEON_SWITCH "-mfpu=neon") ENDIF() +SET(FPMATH_SET "0") +IF(CMAKE_SIZEOF_VOID_P MATCHES "4") + IF(SSE_SWITCH OR MSVC) + OPTION(ALSOFT_ENABLE_SSE_CODEGEN "Enable SSE code generation instead of x87 for 32-bit targets." TRUE) + ENDIF() + IF(SSE2_SWITCH OR MSVC) + OPTION(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE) + ENDIF() + + IF(ALSOFT_ENABLE_SSE2_CODEGEN) + IF(SSE2_SWITCH) + CHECK_C_COMPILER_FLAG("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2) + IF(HAVE_MFPMATH_SSE_2) + SET(C_FLAGS ${C_FLAGS} ${SSE2_SWITCH} -mfpmath=sse) + SET(FPMATH_SET 2) + ENDIF() + ELSEIF(MSVC) + CHECK_C_COMPILER_FLAG("/arch:SSE2" HAVE_ARCH_SSE2) + IF(HAVE_ARCH_SSE2) + SET(C_FLAGS ${C_FLAGS} "/arch:SSE2") + SET(FPMATH_SET 2) + ENDIF() + ENDIF() + ENDIF() + IF(ALSOFT_ENABLE_SSE_CODEGEN AND NOT FPMATH_SET) + IF(SSE_SWITCH) + CHECK_C_COMPILER_FLAG("${SSE_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE) + IF(HAVE_MFPMATH_SSE) + SET(C_FLAGS ${C_FLAGS} ${SSE_SWITCH} -mfpmath=sse) + SET(FPMATH_SET 1) + ENDIF() + ELSEIF(MSVC) + CHECK_C_COMPILER_FLAG("/arch:SSE" HAVE_ARCH_SSE) + IF(HAVE_ARCH_SSE) + SET(C_FLAGS ${C_FLAGS} "/arch:SSE") + SET(FPMATH_SET 1) + ENDIF() + ENDIF() + ENDIF() +ENDIF() + + CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2))); int main() {return 0;}" HAVE_GCC_FORMAT) @@ -461,9 +494,10 @@ IF(NOT HAVE_GUIDDEF_H) ENDIF() # Some systems need libm for some of the following math functions to work +SET(MATH_LIB ) CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM) IF(HAVE_LIBM) - SET(EXTRA_LIBS m ${EXTRA_LIBS}) + SET(MATH_LIB ${MATH_LIB} m) SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m) ENDIF() @@ -495,20 +529,32 @@ IF(HAVE_INTRIN_H) __cpuid(regs, 0); return regs[0]; }" HAVE_CPUID_INTRINSIC) + CHECK_C_SOURCE_COMPILES("#include + int main() + { + unsigned long idx = 0; + _BitScanForward64(&idx, 1); + return idx; + }" HAVE_BITSCANFORWARD64_INTRINSIC) + CHECK_C_SOURCE_COMPILES("#include + int main() + { + unsigned long idx = 0; + _BitScanForward(&idx, 1); + return idx; + }" HAVE_BITSCANFORWARD_INTRINSIC) ENDIF() +CHECK_SYMBOL_EXISTS(sysconf unistd.h HAVE_SYSCONF) CHECK_SYMBOL_EXISTS(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC) CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC) +CHECK_SYMBOL_EXISTS(proc_pidpath libproc.h HAVE_PROC_PIDPATH) CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF) CHECK_SYMBOL_EXISTS(modff math.h HAVE_MODFF) CHECK_SYMBOL_EXISTS(log2f math.h HAVE_LOG2F) -IF(NOT HAVE_C99_VLA) - CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA) - IF(NOT HAVE_ALLOCA) - MESSAGE(FATAL_ERROR "No alloca function found, please report!") - ENDIF() -ENDIF() +CHECK_SYMBOL_EXISTS(cbrtf math.h HAVE_CBRTF) +CHECK_SYMBOL_EXISTS(copysignf math.h HAVE_COPYSIGNF) IF(HAVE_FLOAT_H) CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP) @@ -524,7 +570,7 @@ IF(NOT HAVE_STRCASECMP) MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!") ENDIF() - ADD_DEFINITIONS(-Dstrcasecmp=_stricmp) + SET(CPP_DEFS ${CPP_DEFS} strcasecmp=_stricmp) ENDIF() CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP) @@ -534,7 +580,7 @@ IF(NOT HAVE_STRNCASECMP) MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!") ENDIF() - ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp) + SET(CPP_DEFS ${CPP_DEFS} strncasecmp=_strnicmp) ENDIF() CHECK_SYMBOL_EXISTS(strnlen string.h HAVE_STRNLEN) @@ -545,7 +591,7 @@ IF(NOT HAVE_SNPRINTF) MESSAGE(FATAL_ERROR "No snprintf function found, please report!") ENDIF() - ADD_DEFINITIONS(-Dsnprintf=_snprintf) + SET(CPP_DEFS ${CPP_DEFS} snprintf=_snprintf) ENDIF() CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE) @@ -556,9 +602,9 @@ IF(NOT HAVE_ISFINITE) IF(NOT HAVE__FINITE) MESSAGE(FATAL_ERROR "No isfinite function found, please report!") ENDIF() - ADD_DEFINITIONS(-Disfinite=_finite) + SET(CPP_DEFS ${CPP_DEFS} isfinite=_finite) ELSE() - ADD_DEFINITIONS(-Disfinite=finite) + SET(CPP_DEFS ${CPP_DEFS} isfinite=finite) ENDIF() ENDIF() @@ -569,12 +615,17 @@ IF(NOT HAVE_ISNAN) MESSAGE(FATAL_ERROR "No isnan function found, please report!") ENDIF() - ADD_DEFINITIONS(-Disnan=_isnan) + SET(CPP_DEFS ${CPP_DEFS} isnan=_isnan) ENDIF() # Check if we have Windows headers -CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502) +SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) +SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502) +CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H) +SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS}) +UNSET(OLD_REQUIRED_DEFINITIONS) + IF(NOT HAVE_WINDOWS_H) CHECK_SYMBOL_EXISTS(gettimeofday sys/time.h HAVE_GETTIMEOFDAY) IF(NOT HAVE_GETTIMEOFDAY) @@ -596,9 +647,9 @@ IF(NOT HAVE_WINDOWS_H) CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD) IF(HAVE_PTHREAD) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -pthread") SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread") - SET(EXTRA_LDFLAGS "${EXTRA_LDFLAGS} -pthread") + SET(C_FLAGS ${C_FLAGS} -pthread) + SET(LINKER_FLAGS ${LINKER_FLAGS} -pthread) ENDIF() CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD) @@ -670,6 +721,8 @@ int main() ENDIF() ENDIF() +CHECK_SYMBOL_EXISTS(getopt unistd.h HAVE_GETOPT) + # Check for a 64-bit type CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) IF(NOT HAVE_STDINT_H) @@ -689,51 +742,100 @@ IF(NOT HAVE_STDINT_H) ENDIF() -SET(COMMON_OBJS common/almalloc.c - common/atomic.c - common/rwlock.c - common/threads.c - common/uintmap.c +SET(COMMON_OBJS + common/alcomplex.c + common/alcomplex.h + common/align.h + common/almalloc.c + common/almalloc.h + common/atomic.c + common/atomic.h + common/bool.h + common/math_defs.h + common/rwlock.c + common/rwlock.h + common/static_assert.h + common/threads.c + common/threads.h + common/uintmap.c + common/uintmap.h ) -SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c - OpenAL32/alBuffer.c - OpenAL32/alEffect.c - OpenAL32/alError.c - OpenAL32/alExtension.c - OpenAL32/alFilter.c - OpenAL32/alListener.c - OpenAL32/alSource.c - OpenAL32/alState.c - OpenAL32/alThunk.c - OpenAL32/sample_cvt.c +SET(OPENAL_OBJS + OpenAL32/Include/bs2b.h + OpenAL32/Include/alMain.h + OpenAL32/Include/alu.h + + OpenAL32/Include/alAuxEffectSlot.h + OpenAL32/alAuxEffectSlot.c + OpenAL32/Include/alBuffer.h + OpenAL32/alBuffer.c + OpenAL32/Include/alEffect.h + OpenAL32/alEffect.c + OpenAL32/Include/alError.h + OpenAL32/alError.c + OpenAL32/alExtension.c + OpenAL32/Include/alFilter.h + OpenAL32/alFilter.c + OpenAL32/Include/alListener.h + OpenAL32/alListener.c + OpenAL32/Include/alSource.h + OpenAL32/alSource.c + OpenAL32/alState.c + OpenAL32/event.c + OpenAL32/Include/sample_cvt.h + OpenAL32/sample_cvt.c ) -SET(ALC_OBJS Alc/ALc.c - Alc/ALu.c - Alc/alcConfig.c - Alc/alcRing.c - Alc/bs2b.c - Alc/converter.c - Alc/mastering.c - Alc/effects/chorus.c - Alc/effects/compressor.c - Alc/effects/dedicated.c - Alc/effects/distortion.c - Alc/effects/echo.c - Alc/effects/equalizer.c - Alc/effects/flanger.c - Alc/effects/modulator.c - Alc/effects/null.c - Alc/effects/reverb.c - Alc/helpers.c - Alc/bsinc.c - Alc/hrtf.c - Alc/uhjfilter.c - Alc/ambdec.c - Alc/bformatdec.c - Alc/nfcfilter.c - Alc/panning.c - Alc/mixer.c - Alc/mixer_c.c +SET(ALC_OBJS + Alc/ALc.c + Alc/ALu.c + Alc/alconfig.c + Alc/alconfig.h + Alc/bs2b.c + Alc/converter.c + Alc/converter.h + Alc/inprogext.h + Alc/mastering.c + Alc/mastering.h + Alc/ringbuffer.c + Alc/ringbuffer.h + Alc/effects/autowah.c + Alc/effects/chorus.c + Alc/effects/compressor.c + Alc/effects/dedicated.c + Alc/effects/distortion.c + Alc/effects/echo.c + Alc/effects/equalizer.c + Alc/effects/fshifter.c + Alc/effects/modulator.c + Alc/effects/null.c + Alc/effects/pshifter.c + Alc/effects/reverb.c + Alc/filters/defs.h + Alc/filters/filter.c + Alc/filters/nfc.c + Alc/filters/nfc.h + Alc/filters/splitter.c + Alc/filters/splitter.h + Alc/helpers.c + Alc/alstring.h + Alc/compat.h + Alc/cpu_caps.h + Alc/fpu_modes.h + Alc/logging.h + Alc/vector.h + Alc/hrtf.c + Alc/hrtf.h + Alc/uhjfilter.c + Alc/uhjfilter.h + Alc/ambdec.c + Alc/ambdec.h + Alc/bformatdec.c + Alc/bformatdec.h + Alc/panning.c + Alc/polymorphism.h + Alc/mixvoice.c + Alc/mixer/defs.h + Alc/mixer/mixer_c.c ) @@ -750,13 +852,14 @@ SET(HAVE_SOLARIS 0) SET(HAVE_SNDIO 0) SET(HAVE_QSA 0) SET(HAVE_DSOUND 0) -SET(HAVE_MMDEVAPI 0) +SET(HAVE_WASAPI 0) SET(HAVE_WINMM 0) SET(HAVE_PORTAUDIO 0) SET(HAVE_PULSEAUDIO 0) SET(HAVE_COREAUDIO 0) SET(HAVE_OPENSL 0) SET(HAVE_WAVE 0) +SET(HAVE_SDL2 0) # Check for SSE support OPTION(ALSOFT_REQUIRE_SSE "Require SSE support" OFF) @@ -766,9 +869,9 @@ IF(HAVE_XMMINTRIN_H) IF(ALSOFT_CPUEXT_SSE) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse.c) IF(SSE_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse.c PROPERTIES COMPILE_FLAGS "${SSE_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE") @@ -786,9 +889,9 @@ IF(HAVE_EMMINTRIN_H) IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE2 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse2.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse2.c) IF(SSE2_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse2.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse2.c PROPERTIES COMPILE_FLAGS "${SSE2_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE2") @@ -799,16 +902,16 @@ IF(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2) MESSAGE(FATAL_ERROR "Failed to enable required SSE2 CPU extensions") ENDIF() -OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE3 support" OFF) +OPTION(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF) CHECK_INCLUDE_FILE(pmmintrin.h HAVE_PMMINTRIN_H "${SSE3_SWITCH}") IF(HAVE_EMMINTRIN_H) OPTION(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON) IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE3) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE3 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse3.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse3.c) IF(SSE2_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse3.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse3.c PROPERTIES COMPILE_FLAGS "${SSE3_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE3") @@ -826,9 +929,9 @@ IF(HAVE_SMMINTRIN_H) IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1) IF(ALIGN_DECL OR HAVE_C11_ALIGNAS) SET(HAVE_SSE4_1 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse41.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse41.c) IF(SSE4_1_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse41.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse41.c PROPERTIES COMPILE_FLAGS "${SSE4_1_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, SSE4.1") @@ -841,14 +944,14 @@ ENDIF() # Check for ARM Neon support OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF) -CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H) +CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H ${FPU_NEON_SWITCH}) IF(HAVE_ARM_NEON_H) OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON) IF(ALSOFT_CPUEXT_NEON) SET(HAVE_NEON 1) - SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_neon.c) + SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_neon.c) IF(FPU_NEON_SWITCH) - SET_SOURCE_FILES_PROPERTIES(Alc/mixer_neon.c PROPERTIES + SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_neon.c PROPERTIES COMPILE_FLAGS "${FPU_NEON_SWITCH}") ENDIF() SET(CPU_EXTS "${CPU_EXTS}, Neon") @@ -872,10 +975,11 @@ ENDIF() SET(BACKENDS "") SET(ALC_OBJS ${ALC_OBJS} - Alc/backends/base.c - # Default backends, always available - Alc/backends/loopback.c - Alc/backends/null.c + Alc/backends/base.c + Alc/backends/base.h + # Default backends, always available + Alc/backends/loopback.c + Alc/backends/null.c ) # Check ALSA backend @@ -888,6 +992,7 @@ IF(ALSA_FOUND) SET(BACKENDS "${BACKENDS} ALSA${IS_LINKED},") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/alsa.c) ADD_BACKEND_LIBS(${ALSA_LIBRARIES}) + SET(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA) @@ -906,6 +1011,7 @@ IF(OSS_FOUND) IF(OSS_LIBRARIES) SET(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS}) ENDIF() + SET(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS) @@ -921,6 +1027,7 @@ IF(AUDIOIO_FOUND) SET(HAVE_SOLARIS 1) SET(BACKENDS "${BACKENDS} Solaris,") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/solaris.c) + SET(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS) @@ -937,6 +1044,7 @@ IF(SOUNDIO_FOUND) SET(BACKENDS "${BACKENDS} SndIO (linked),") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sndio.c) SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS}) + SET(INC_PATHS ${INC_PATHS} ${SOUNDIO_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO) @@ -953,6 +1061,7 @@ IF(QSA_FOUND) SET(BACKENDS "${BACKENDS} QSA (linked),") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.c) SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS}) + SET(INC_PATHS ${INC_PATHS} ${QSA_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA) @@ -962,10 +1071,13 @@ ENDIF() # Check Windows-only backends OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF) OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF) -OPTION(ALSOFT_REQUIRE_MMDEVAPI "Require MMDevApi backend" OFF) +OPTION(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF) IF(HAVE_WINDOWS_H) + SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}) + SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502) + # Check MMSystem backend - CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502) + CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H) IF(HAVE_MMSYSTEM_H) CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM) IF(HAVE_LIBWINMM) @@ -988,19 +1100,23 @@ IF(HAVE_WINDOWS_H) SET(BACKENDS "${BACKENDS} DirectSound${IS_LINKED},") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/dsound.c) ADD_BACKEND_LIBS(${DSOUND_LIBRARIES}) + SET(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIRS}) ENDIF() ENDIF() - # Check for MMDevApi backend + # Check for WASAPI backend CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H) IF(HAVE_MMDEVICEAPI_H) - OPTION(ALSOFT_BACKEND_MMDEVAPI "Enable MMDevApi backend" ON) - IF(ALSOFT_BACKEND_MMDEVAPI) - SET(HAVE_MMDEVAPI 1) - SET(BACKENDS "${BACKENDS} MMDevApi,") - SET(ALC_OBJS ${ALC_OBJS} Alc/backends/mmdevapi.c) + OPTION(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON) + IF(ALSOFT_BACKEND_WASAPI) + SET(HAVE_WASAPI 1) + SET(BACKENDS "${BACKENDS} WASAPI,") + SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wasapi.c) ENDIF() ENDIF() + + SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS}) + UNSET(OLD_REQUIRED_DEFINITIONS) ENDIF() IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM) MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend") @@ -1008,8 +1124,8 @@ ENDIF() IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND) MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend") ENDIF() -IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI) - MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend") +IF(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI) + MESSAGE(FATAL_ERROR "Failed to enabled required WASAPI backend") ENDIF() # Check PortAudio backend @@ -1022,6 +1138,7 @@ IF(PORTAUDIO_FOUND) SET(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/portaudio.c) ADD_BACKEND_LIBS(${PORTAUDIO_LIBRARIES}) + SET(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO) @@ -1038,6 +1155,7 @@ IF(PULSEAUDIO_FOUND) SET(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/pulseaudio.c) ADD_BACKEND_LIBS(${PULSEAUDIO_LIBRARIES}) + SET(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO) @@ -1054,6 +1172,7 @@ IF(JACK_FOUND) SET(BACKENDS "${BACKENDS} JACK${IS_LINKED},") SET(ALC_OBJS ${ALC_OBJS} Alc/backends/jack.c) ADD_BACKEND_LIBS(${JACK_LIBRARIES}) + SET(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS}) ENDIF() ENDIF() IF(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK) @@ -1112,6 +1231,24 @@ IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL) MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend") ENDIF() +# Check for SDL2 backend +OPTION(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF) +FIND_PACKAGE(SDL2) +IF(SDL2_FOUND) + # Off by default, since it adds a runtime dependency + OPTION(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF) + IF(ALSOFT_BACKEND_SDL2) + SET(HAVE_SDL2 1) + SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sdl2.c) + SET(BACKENDS "${BACKENDS} SDL2,") + SET(EXTRA_LIBS ${SDL2_LIBRARY} ${EXTRA_LIBS}) + SET(INC_PATHS ${INC_PATHS} ${SDL2_INCLUDE_DIR}) + ENDIF() +ENDIF() +IF(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND) + MESSAGE(FATAL_ERROR "Failed to enabled required SDL2 backend") +ENDIF() + # Optionally enable the Wave Writer backend OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON) IF(ALSOFT_BACKEND_WAVE) @@ -1123,61 +1260,6 @@ ENDIF() # This is always available SET(BACKENDS "${BACKENDS} Null") -option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" OFF) -if(ALSOFT_EMBED_HRTF_DATA) - SET(NATIVE_SRC_DIR "${OpenAL_SOURCE_DIR}/native-tools/") - SET(NATIVE_BIN_DIR "${OpenAL_BINARY_DIR}/native-tools/") - FILE(MAKE_DIRECTORY "${NATIVE_BIN_DIR}") - - SET(BIN2H_COMMAND "${NATIVE_BIN_DIR}bin2h") - ADD_CUSTOM_COMMAND(OUTPUT "${BIN2H_COMMAND}" - COMMAND ${CMAKE_COMMAND} "${NATIVE_SRC_DIR}" - COMMAND ${CMAKE_COMMAND} --build . --config "Release" - WORKING_DIRECTORY "${NATIVE_BIN_DIR}" - DEPENDS "${NATIVE_SRC_DIR}CMakeLists.txt" "${NATIVE_SRC_DIR}bin2h.c" - VERBATIM - ) - - MACRO(make_hrtf_header FILENAME VARNAME) - SET(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}") - SET(outfile "${OpenAL_BINARY_DIR}/${FILENAME}.h") - - ADD_CUSTOM_COMMAND(OUTPUT "${outfile}" - COMMAND "${BIN2H_COMMAND}" "${infile}" "${outfile}" ${VARNAME} - DEPENDS "${BIN2H_COMMAND}" "${infile}" - COMMENT "Generating ${FILENAME}.h" - VERBATIM - ) - - SET(ALC_OBJS ${ALC_OBJS} "${outfile}") - ENDMACRO() - - make_hrtf_header(default-44100.mhr "hrtf_default_44100") - make_hrtf_header(default-48000.mhr "hrtf_default_48000") -endif() - - -IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL) - add_subdirectory(utils/alsoft-config) -ENDIF() -IF(ALSOFT_EXAMPLES) - FIND_PACKAGE(SDL2) - IF(SDL2_FOUND) - FIND_PACKAGE(SDL_sound) - FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE) - ENDIF() -ENDIF() - -IF(LIBTYPE STREQUAL "STATIC") - ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC) - SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS}) -ENDIF() - -IF(NOT WIN32) - SET(LIBNAME "openal") -ELSE() - SET(LIBNAME "OpenAL32") -ENDIF() FIND_PACKAGE(Git) IF(GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git") @@ -1199,6 +1281,72 @@ ELSE() "${OpenAL_BINARY_DIR}/version.h") ENDIF() +SET(NATIVE_SRC_DIR "${OpenAL_SOURCE_DIR}/native-tools/") +SET(NATIVE_BIN_DIR "${OpenAL_BINARY_DIR}/native-tools/") +FILE(MAKE_DIRECTORY "${NATIVE_BIN_DIR}") + +SET(BIN2H_COMMAND "${NATIVE_BIN_DIR}bin2h") +SET(BSINCGEN_COMMAND "${NATIVE_BIN_DIR}bsincgen") +ADD_CUSTOM_COMMAND(OUTPUT "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}" + COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" "${NATIVE_SRC_DIR}" + COMMAND ${CMAKE_COMMAND} -E remove "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}" + COMMAND ${CMAKE_COMMAND} --build . --config "Release" + WORKING_DIRECTORY "${NATIVE_BIN_DIR}" + DEPENDS "${NATIVE_SRC_DIR}CMakeLists.txt" + IMPLICIT_DEPENDS C "${NATIVE_SRC_DIR}bin2h.c" + C "${NATIVE_SRC_DIR}bsincgen.c" + VERBATIM +) +ADD_CUSTOM_TARGET(native-tools + DEPENDS "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}" + VERBATIM +) + +option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON) +if(ALSOFT_EMBED_HRTF_DATA) + MACRO(make_hrtf_header FILENAME VARNAME) + SET(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}") + SET(outfile "${OpenAL_BINARY_DIR}/${FILENAME}.h") + + ADD_CUSTOM_COMMAND(OUTPUT "${outfile}" + COMMAND "${BIN2H_COMMAND}" "${infile}" "${outfile}" ${VARNAME} + DEPENDS native-tools "${infile}" + VERBATIM + ) + SET(ALC_OBJS ${ALC_OBJS} "${outfile}") + ENDMACRO() + + make_hrtf_header(default-44100.mhr "hrtf_default_44100") + make_hrtf_header(default-48000.mhr "hrtf_default_48000") +endif() + +ADD_CUSTOM_COMMAND(OUTPUT "${OpenAL_BINARY_DIR}/bsinc_inc.h" + COMMAND "${BSINCGEN_COMMAND}" "${OpenAL_BINARY_DIR}/bsinc_inc.h" + DEPENDS native-tools "${NATIVE_SRC_DIR}bsincgen.c" + VERBATIM +) +SET(ALC_OBJS ${ALC_OBJS} "${OpenAL_BINARY_DIR}/bsinc_inc.h") + + +IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL) + add_subdirectory(utils/alsoft-config) +ENDIF() +IF(ALSOFT_EXAMPLES) + IF(NOT SDL2_FOUND) + FIND_PACKAGE(SDL2) + ENDIF() + IF(SDL2_FOUND) + FIND_PACKAGE(SDL_sound) + FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE) + ENDIF() +ENDIF() + +IF(NOT WIN32) + SET(LIBNAME "openal") +ELSE() + SET(LIBNAME "OpenAL32") +ENDIF() + # Needed for openal.pc.in SET(prefix ${CMAKE_INSTALL_PREFIX}) SET(exec_prefix "\${prefix}") @@ -1206,6 +1354,20 @@ SET(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") SET(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}") SET(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") SET(PACKAGE_VERSION "${LIB_VERSION}") +SET(PKG_CONFIG_CFLAGS ) +SET(PKG_CONFIG_PRIVATE_LIBS ) +IF(LIBTYPE STREQUAL "STATIC") + SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC) + FOREACH(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB}) + # If this is already a linker flag, or is a full path+file, add it + # as-is. Otherwise, it's a name intended to be dressed as -lname. + IF(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}") + SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}") + ELSE() + SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}") + ENDIF() + ENDFOREACH() +ENDIF() # End configuration CONFIGURE_FILE( @@ -1216,31 +1378,45 @@ CONFIGURE_FILE( "${OpenAL_BINARY_DIR}/openal.pc" @ONLY) -MACRO(ADD_INCLUDE_DIRS TRGT TESTVAR INCVAR) - IF(${TESTVAR}) - SET_PROPERTY(TARGET ${TRGT} APPEND PROPERTY INCLUDE_DIRECTORIES ${${INCVAR}}) - ENDIF() -ENDMACRO() + +# Add a static library with common functions used by multiple targets +ADD_LIBRARY(common STATIC ${COMMON_OBJS}) +TARGET_COMPILE_DEFINITIONS(common PRIVATE ${CPP_DEFS}) +TARGET_COMPILE_OPTIONS(common PRIVATE ${C_FLAGS}) + UNSET(HAS_ROUTER) SET(IMPL_TARGET OpenAL) +SET(COMMON_LIB ) +SET(SUBSYS_FLAG ) # Build main library IF(LIBTYPE STREQUAL "STATIC") + SET(CPP_DEFS ${CPP_DEFS} AL_LIBTYPE_STATIC) + IF(WIN32 AND ALSOFT_NO_UID_DEFS) + SET(CPP_DEFS ${CPP_DEFS} AL_NO_UID_DEFS) + ENDIF() ADD_LIBRARY(OpenAL STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS}) ELSE() - IF(WIN32 AND ALSOFT_BUILD_ROUTER) - ADD_LIBRARY(OpenAL SHARED router/router.c router/alc.c router/al.c ${COMMON_OBJS}) - SET_PROPERTY(TARGET OpenAL APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET OpenAL APPEND PROPERTY - COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES - ) - SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS ${EXTRA_LDFLAGS}) + # Make sure to compile the common code with PIC, since it'll be linked into + # shared libs that needs it. + SET_PROPERTY(TARGET common PROPERTY POSITION_INDEPENDENT_CODE TRUE) + SET(COMMON_LIB common) + + IF(WIN32) IF(MSVC) - SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS " /SUBSYSTEM:WINDOWS") + SET(SUBSYS_FLAG ${SUBSYS_FLAG} "/SUBSYSTEM:WINDOWS") ELSEIF(CMAKE_COMPILER_IS_GNUCC) - SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS " -mwindows") + SET(SUBSYS_FLAG ${SUBSYS_FLAG} "-mwindows") ENDIF() + ENDIF() + + IF(WIN32 AND ALSOFT_BUILD_ROUTER) + ADD_LIBRARY(OpenAL SHARED router/router.c router/router.h router/alc.c router/al.c) + TARGET_COMPILE_DEFINITIONS(OpenAL + PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS}) + TARGET_COMPILE_OPTIONS(OpenAL PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(OpenAL PRIVATE ${LINKER_FLAGS} ${COMMON_LIB}) SET_TARGET_PROPERTIES(OpenAL PROPERTIES PREFIX "") SET_TARGET_PROPERTIES(OpenAL PROPERTIES OUTPUT_NAME ${LIBNAME}) IF(TARGET build_version) @@ -1252,7 +1428,7 @@ ELSE() SET(IMPL_TARGET soft_oal) ENDIF() - ADD_LIBRARY(${IMPL_TARGET} SHARED ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS}) + ADD_LIBRARY(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS}) IF(WIN32) SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES PREFIX "") ENDIF() @@ -1261,62 +1437,37 @@ SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES OUTPUT_NAME ${LIBNAME} VERSION ${LIB_VERSION} SOVERSION ${LIB_MAJOR_VERSION} ) -SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND PROPERTY INCLUDE_DIRECTORIES - "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc" -) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_ALSA ALSA_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_OSS OSS_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_SOLARIS AUDIOIO_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_SNDIO SOUNDIO_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_QSA QSA_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_DSOUND DSOUND_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_PORTAUDIO PORTAUDIO_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_PULSEAUDIO PULSEAUDIO_INCLUDE_DIRS) -ADD_INCLUDE_DIRS(${IMPL_TARGET} HAVE_JACK JACK_INCLUDE_DIRS) -SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND PROPERTY - COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES -) -IF(WIN32 AND ALSOFT_NO_UID_DEFS) - SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS) -ENDIF() -SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) -SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND_STRING PROPERTY LINK_FLAGS ${EXTRA_LDFLAGS}) - -TARGET_LINK_LIBRARIES(${IMPL_TARGET} ${EXTRA_LIBS}) +TARGET_COMPILE_DEFINITIONS(${IMPL_TARGET} + PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS}) +TARGET_INCLUDE_DIRECTORIES(${IMPL_TARGET} + PRIVATE "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc" ${INC_PATHS}) +TARGET_COMPILE_OPTIONS(${IMPL_TARGET} PRIVATE ${C_FLAGS}) +TARGET_LINK_LIBRARIES(${IMPL_TARGET} + PRIVATE ${LINKER_FLAGS} ${COMMON_LIB} ${EXTRA_LIBS} ${MATH_LIB}) IF(TARGET build_version) ADD_DEPENDENCIES(${IMPL_TARGET} build_version) ENDIF() -IF(WIN32) - IF(MSVC) - SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND_STRING PROPERTY LINK_FLAGS " /SUBSYSTEM:WINDOWS") - ELSEIF(CMAKE_COMPILER_IS_GNUCC) - SET_PROPERTY(TARGET ${IMPL_TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -mwindows") - ENDIF() - - if(NOT LIBTYPE STREQUAL "STATIC") - IF(MINGW AND ALSOFT_BUILD_IMPORT_LIB) - FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable") - FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable") - IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE) - MESSAGE(STATUS "") - IF(NOT SED_EXECUTABLE) - MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation") - ENDIF() - IF(NOT DLLTOOL_EXECUTABLE) - MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation") - ENDIF() - ELSE() - SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS - " -Wl,--output-def,OpenAL32.def") - ADD_CUSTOM_COMMAND(TARGET OpenAL POST_BUILD - COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def - COMMAND "${DLLTOOL_EXECUTABLE}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll - COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..." - VERBATIM - ) - ENDIF() +IF(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC") + FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable") + FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable") + IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE) + MESSAGE(STATUS "") + IF(NOT SED_EXECUTABLE) + MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation") ENDIF() + IF(NOT DLLTOOL_EXECUTABLE) + MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation") + ENDIF() + ELSE() + SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS + " -Wl,--output-def,OpenAL32.def") + ADD_CUSTOM_COMMAND(TARGET OpenAL POST_BUILD + COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def + COMMAND "${DLLTOOL_EXECUTABLE}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll + COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..." + VERBATIM + ) ENDIF() ENDIF() @@ -1364,6 +1515,10 @@ MESSAGE(STATUS "") MESSAGE(STATUS "Building with support for CPU extensions:") MESSAGE(STATUS " ${CPU_EXTS}") MESSAGE(STATUS "") +IF(FPMATH_SET) + MESSAGE(STATUS "Building with SSE${FPMATH_SET} codegen") + MESSAGE(STATUS "") +ENDIF() IF(WIN32) IF(NOT HAVE_DSOUND) @@ -1402,6 +1557,7 @@ IF(ALSOFT_AMBDEC_PRESETS) INSTALL(FILES presets/3D7.1.ambdec presets/hexagon.ambdec presets/itu5.1.ambdec + presets/itu5.1-nocenter.ambdec presets/rectangle.ambdec presets/square.ambdec presets/presets.txt @@ -1413,23 +1569,22 @@ ENDIF() IF(ALSOFT_UTILS) ADD_EXECUTABLE(openal-info utils/openal-info.c) - SET_PROPERTY(TARGET openal-info APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - TARGET_LINK_LIBRARIES(openal-info OpenAL) + TARGET_COMPILE_OPTIONS(openal-info PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(openal-info PRIVATE ${LINKER_FLAGS} OpenAL) - ADD_EXECUTABLE(makehrtf utils/makehrtf.c) - SET_PROPERTY(TARGET makehrtf APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - IF(HAVE_LIBM) - TARGET_LINK_LIBRARIES(makehrtf m) + SET(MAKEHRTF_SRCS utils/makehrtf.c) + IF(NOT HAVE_GETOPT) + SET(MAKEHRTF_SRCS ${MAKEHRTF_SRCS} utils/getopt.c utils/getopt.h) ENDIF() - - ADD_EXECUTABLE(bsincgen utils/bsincgen.c) - SET_PROPERTY(TARGET bsincgen APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) + ADD_EXECUTABLE(makehrtf ${MAKEHRTF_SRCS}) + TARGET_COMPILE_DEFINITIONS(makehrtf PRIVATE ${CPP_DEFS}) + TARGET_COMPILE_OPTIONS(makehrtf PRIVATE ${C_FLAGS}) IF(HAVE_LIBM) - TARGET_LINK_LIBRARIES(bsincgen m) + TARGET_LINK_LIBRARIES(makehrtf PRIVATE ${LINKER_FLAGS} m) ENDIF() IF(ALSOFT_INSTALL) - INSTALL(TARGETS openal-info makehrtf bsincgen + INSTALL(TARGETS openal-info makehrtf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -1446,9 +1601,10 @@ ENDIF() IF(ALSOFT_TESTS) SET(TEST_COMMON_OBJS examples/common/alhelpers.c) - ADD_EXECUTABLE(altonegen examples/altonegen.c ${COMMON_OBJS} ${TEST_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(altonegen OpenAL) - SET_PROPERTY(TARGET altonegen APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) + ADD_EXECUTABLE(altonegen examples/altonegen.c ${TEST_COMMON_OBJS}) + TARGET_COMPILE_DEFINITIONS(altonegen PRIVATE ${CPP_DEFS}) + TARGET_COMPILE_OPTIONS(altonegen PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(altonegen PRIVATE ${LINKER_FLAGS} common OpenAL ${MATH_LIB}) IF(ALSOFT_INSTALL) INSTALL(TARGETS altonegen @@ -1463,9 +1619,10 @@ IF(ALSOFT_TESTS) ENDIF() IF(ALSOFT_EXAMPLES) - ADD_EXECUTABLE(alrecord examples/alrecord.c ${COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alrecord OpenAL) - SET_PROPERTY(TARGET alrecord APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) + ADD_EXECUTABLE(alrecord examples/alrecord.c) + TARGET_COMPILE_DEFINITIONS(alrecord PRIVATE ${CPP_DEFS}) + TARGET_COMPILE_OPTIONS(alrecord PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alrecord PRIVATE ${LINKER_FLAGS} common OpenAL) IF(ALSOFT_INSTALL) INSTALL(TARGETS alrecord @@ -1479,45 +1636,76 @@ IF(ALSOFT_EXAMPLES) IF(SDL2_FOUND) IF(SDL_SOUND_FOUND) - SET(EX_COMMON_OBJS examples/common/alhelpers.c) + # Add a static library with common functions used by multiple targets + ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c) + TARGET_COMPILE_DEFINITIONS(ex-common PRIVATE ${CPP_DEFS}) + TARGET_COMPILE_OPTIONS(ex-common PRIVATE ${C_FLAGS}) - ADD_EXECUTABLE(alstream examples/alstream.c ${COMMON_OBJS} ${EX_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alstream ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} OpenAL) - SET_PROPERTY(TARGET alstream APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET alstream APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR} - ) + ADD_EXECUTABLE(alplay examples/alplay.c) + TARGET_COMPILE_DEFINITIONS(alplay PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alplay + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(alplay PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alplay + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL) - ADD_EXECUTABLE(alreverb examples/alreverb.c ${COMMON_OBJS} ${EX_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alreverb ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} OpenAL) - SET_PROPERTY(TARGET alreverb APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET alreverb APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR} - ) + ADD_EXECUTABLE(alstream examples/alstream.c) + TARGET_COMPILE_DEFINITIONS(alstream PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alstream + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(alstream PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alstream + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL) - ADD_EXECUTABLE(allatency examples/allatency.c ${COMMON_OBJS} ${EX_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(allatency ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} OpenAL) - SET_PROPERTY(TARGET allatency APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET allatency APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR} - ) + ADD_EXECUTABLE(alreverb examples/alreverb.c) + TARGET_COMPILE_DEFINITIONS(alreverb PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alreverb + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(alreverb PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alreverb + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL) - ADD_EXECUTABLE(alloopback examples/alloopback.c ${COMMON_OBJS} ${EX_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alloopback ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} OpenAL) - SET_PROPERTY(TARGET alloopback APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET alloopback APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR} - ) + ADD_EXECUTABLE(almultireverb examples/almultireverb.c) + TARGET_COMPILE_DEFINITIONS(almultireverb PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(almultireverb + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(almultireverb PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(almultireverb + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL ${MATH_LIB}) - ADD_EXECUTABLE(alhrtf examples/alhrtf.c ${COMMON_OBJS} ${EX_COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alhrtf ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} OpenAL) - SET_PROPERTY(TARGET alhrtf APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET alhrtf APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR} - ) + ADD_EXECUTABLE(allatency examples/allatency.c) + TARGET_COMPILE_DEFINITIONS(allatency PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(allatency + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(allatency PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(allatency + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL) + + ADD_EXECUTABLE(alloopback examples/alloopback.c) + TARGET_COMPILE_DEFINITIONS(alloopback PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alloopback + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(alloopback PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alloopback + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL ${MATH_LIB}) + + ADD_EXECUTABLE(alhrtf examples/alhrtf.c) + TARGET_COMPILE_DEFINITIONS(alhrtf PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alhrtf + PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR}) + TARGET_COMPILE_OPTIONS(alhrtf PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alhrtf + PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common + OpenAL ${MATH_LIB}) IF(ALSOFT_INSTALL) - INSTALL(TARGETS alstream alreverb allatency alloopback alhrtf + INSTALL(TARGETS alplay alstream alreverb almultireverb allatency alloopback alhrtf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -1552,12 +1740,14 @@ IF(ALSOFT_EXAMPLES) ENDIF() ENDIF() IF(FFVER_OK) - ADD_EXECUTABLE(alffplay examples/alffplay.cpp ${COMMON_OBJS}) - TARGET_LINK_LIBRARIES(alffplay ${SDL2_LIBRARY} ${FFMPEG_LIBRARIES} OpenAL) - SET_PROPERTY(TARGET alffplay APPEND PROPERTY COMPILE_FLAGS ${EXTRA_CFLAGS}) - SET_PROPERTY(TARGET alffplay APPEND PROPERTY - INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS} - ) + ADD_EXECUTABLE(alffplay examples/alffplay.cpp) + TARGET_COMPILE_DEFINITIONS(alffplay PRIVATE ${CPP_DEFS}) + TARGET_INCLUDE_DIRECTORIES(alffplay + PRIVATE ${SDL2_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS}) + TARGET_COMPILE_OPTIONS(alffplay PRIVATE ${C_FLAGS}) + TARGET_LINK_LIBRARIES(alffplay + PRIVATE ${LINKER_FLAGS} ${SDL2_LIBRARY} ${FFMPEG_LIBRARIES} ex-common common + OpenAL) IF(ALSOFT_INSTALL) INSTALL(TARGETS alffplay diff --git a/love/src/jni/openal-soft-1.18.2/COPYING b/love/src/jni/openal-soft-1.19.1/COPYING similarity index 91% rename from love/src/jni/openal-soft-1.18.2/COPYING rename to love/src/jni/openal-soft-1.19.1/COPYING index 5bc8fb2c..8d5d0000 100644 --- a/love/src/jni/openal-soft-1.18.2/COPYING +++ b/love/src/jni/openal-soft-1.19.1/COPYING @@ -51,7 +51,7 @@ library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. - + Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect @@ -98,7 +98,7 @@ works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. - + GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @@ -145,7 +145,7 @@ Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 @@ -203,7 +203,7 @@ instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. @@ -254,7 +254,7 @@ Library will still fall under Section 6.) distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - + 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work @@ -308,7 +308,7 @@ restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined @@ -349,7 +349,7 @@ subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or @@ -401,7 +401,7 @@ conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is @@ -435,47 +435,3 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey 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 library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/love/src/jni/openal-soft-1.18.2/ChangeLog b/love/src/jni/openal-soft-1.19.1/ChangeLog similarity index 82% rename from love/src/jni/openal-soft-1.18.2/ChangeLog rename to love/src/jni/openal-soft-1.19.1/ChangeLog index 5300be12..d234c14f 100644 --- a/love/src/jni/openal-soft-1.18.2/ChangeLog +++ b/love/src/jni/openal-soft-1.19.1/ChangeLog @@ -1,3 +1,70 @@ +openal-soft-1.19.1: + + Implemented capture support for the SoundIO backend. + + Fixed source buffer queues potentially not playing properly when a queue + entry completes. + + Fixed possible unexpected failures when generating auxiliary effect slots. + + Fixed a crash with certain reverb or device settings. + + Fixed OpenSL capture. + + Improved output limiter response, better ensuring the sample amplitude is + clamped for output. + +openal-soft-1.19.0: + + Implemented the ALC_SOFT_device_clock extension. + + Implemented the Pitch Shifter, Frequency Shifter, and Autowah effects. + + Fixed compiling on FreeBSD systems that use freebsd-lib 9.1. + + Fixed compiling on NetBSD. + + Fixed the reverb effect's density scale and panning parameters. + + Fixed use of the WASAPI backend with certain games, which caused odd COM + initialization errors. + + Increased the number of virtual channels for decoding Ambisonics to HRTF + output. + + Changed 32-bit x86 builds to use SSE2 math by default for performance. + Build-time options are available to use just SSE1 or x87 instead. + + Replaced the 4-point Sinc resampler with a more efficient cubic resampler. + + Renamed the MMDevAPI backend to WASAPI. + + Added support for 24-bit, dual-ear HRTF data sets. The built-in data set + has been updated to 24-bit. + + Added a 24- to 48-point band-limited Sinc resampler. + + Added an SDL2 playback backend. Disabled by default to avoid a dependency + on SDL2. + + Improved the performance and quality of the Chorus and Flanger effects. + + Improved the efficiency of the band-limited Sinc resampler. + + Improved the Sinc resampler's transition band to avoid over-attenuating + higher frequencies. + + Improved the performance of some filter operations. + + Improved the efficiency of object ID lookups. + + Improved the efficienty of internal voice/source synchronization. + + Improved AL call error logging with contextualized messages. + + Removed the reverb effect's modulation stage. Due to the lack of reference + for its intended behavior and strength. + openal-soft-1.18.2: Fixed resetting the FPU rounding mode after certain function calls on diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alAuxEffectSlot.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alAuxEffectSlot.h similarity index 60% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alAuxEffectSlot.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alAuxEffectSlot.h index 5be9ae7a..03ee97d6 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alAuxEffectSlot.h +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alAuxEffectSlot.h @@ -29,16 +29,21 @@ struct ALeffectStateVtable { void (*const Destruct)(ALeffectState *state); ALboolean (*const deviceUpdate)(ALeffectState *state, ALCdevice *device); - void (*const update)(ALeffectState *state, const ALCdevice *device, const struct ALeffectslot *slot, const union ALeffectProps *props); + void (*const update)(ALeffectState *state, const ALCcontext *context, const struct ALeffectslot *slot, const union ALeffectProps *props); void (*const process)(ALeffectState *state, ALsizei samplesToDo, const ALfloat (*restrict samplesIn)[BUFFERSIZE], ALfloat (*restrict samplesOut)[BUFFERSIZE], ALsizei numChannels); void (*const Delete)(void *ptr); }; +/* Small hack to use a pointer-to-array types as a normal argument type. + * Shouldn't be used directly. + */ +typedef ALfloat ALfloatBUFFERSIZE[BUFFERSIZE]; + #define DEFINE_ALEFFECTSTATE_VTABLE(T) \ DECLARE_THUNK(T, ALeffectState, void, Destruct) \ DECLARE_THUNK1(T, ALeffectState, ALboolean, deviceUpdate, ALCdevice*) \ -DECLARE_THUNK3(T, ALeffectState, void, update, const ALCdevice*, const ALeffectslot*, const ALeffectProps*) \ +DECLARE_THUNK3(T, ALeffectState, void, update, const ALCcontext*, const ALeffectslot*, const ALeffectProps*) \ DECLARE_THUNK4(T, ALeffectState, void, process, ALsizei, const ALfloatBUFFERSIZE*restrict, ALfloatBUFFERSIZE*restrict, ALsizei) \ static void T##_ALeffectState_Delete(void *ptr) \ { return T##_Delete(STATIC_UPCAST(T, ALeffectState, (ALeffectState*)ptr)); } \ @@ -54,21 +59,22 @@ static const struct ALeffectStateVtable T##_ALeffectState_vtable = { \ } -struct ALeffectStateFactoryVtable; +struct EffectStateFactoryVtable; -typedef struct ALeffectStateFactory { - const struct ALeffectStateFactoryVtable *vtbl; -} ALeffectStateFactory; +typedef struct EffectStateFactory { + const struct EffectStateFactoryVtable *vtab; +} EffectStateFactory; -struct ALeffectStateFactoryVtable { - ALeffectState *(*const create)(ALeffectStateFactory *factory); +struct EffectStateFactoryVtable { + ALeffectState *(*const create)(EffectStateFactory *factory); }; +#define EffectStateFactory_create(x) ((x)->vtab->create((x))) -#define DEFINE_ALEFFECTSTATEFACTORY_VTABLE(T) \ -DECLARE_THUNK(T, ALeffectStateFactory, ALeffectState*, create) \ +#define DEFINE_EFFECTSTATEFACTORY_VTABLE(T) \ +DECLARE_THUNK(T, EffectStateFactory, ALeffectState*, create) \ \ -static const struct ALeffectStateFactoryVtable T##_ALeffectStateFactory_vtable = { \ - T##_ALeffectStateFactory_create, \ +static const struct EffectStateFactoryVtable T##_EffectStateFactory_vtable = { \ + T##_EffectStateFactory_create, \ } @@ -110,17 +116,18 @@ typedef struct ALeffectslot { RefCount ref; ATOMIC(struct ALeffectslotProps*) Update; - ATOMIC(struct ALeffectslotProps*) FreeList; struct { ALfloat Gain; ALboolean AuxSendAuto; ALenum EffectType; + ALeffectProps EffectProps; ALeffectState *EffectState; ALfloat RoomRolloff; /* Added to the source's room rolloff, not multiplied. */ ALfloat DecayTime; + ALfloat DecayLFRatio; ALfloat DecayHFRatio; ALboolean DecayHFLimit; ALfloat AirAbsorptionGainHF; @@ -133,55 +140,43 @@ typedef struct ALeffectslot { BFChannelConfig ChanMap[MAX_EFFECT_CHANNELS]; /* Wet buffer configuration is ACN channel order with N3D scaling: * * Channel 0 is the unattenuated mono signal. - * * Channel 1 is OpenAL -X - * * Channel 2 is OpenAL Y - * * Channel 3 is OpenAL -Z + * * Channel 1 is OpenAL -X * sqrt(3) + * * Channel 2 is OpenAL Y * sqrt(3) + * * Channel 3 is OpenAL -Z * sqrt(3) * Consequently, effects that only want to work with mono input can use * channel 0 by itself. Effects that want multichannel can process the - * ambisonics signal and make a B-Format pan (ComputeFirstOrderGains) for - * first-order device output (FOAOut). + * ambisonics signal and make a B-Format source pan for first-order device + * output (FOAOut). */ alignas(16) ALfloat WetBuffer[MAX_EFFECT_CHANNELS][BUFFERSIZE]; } ALeffectslot; -inline void LockEffectSlotsRead(ALCcontext *context) -{ LockUIntMapRead(&context->EffectSlotMap); } -inline void UnlockEffectSlotsRead(ALCcontext *context) -{ UnlockUIntMapRead(&context->EffectSlotMap); } -inline void LockEffectSlotsWrite(ALCcontext *context) -{ LockUIntMapWrite(&context->EffectSlotMap); } -inline void UnlockEffectSlotsWrite(ALCcontext *context) -{ UnlockUIntMapWrite(&context->EffectSlotMap); } - -inline struct ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) -{ return (struct ALeffectslot*)LookupUIntMapKeyNoLock(&context->EffectSlotMap, id); } -inline struct ALeffectslot *RemoveEffectSlot(ALCcontext *context, ALuint id) -{ return (struct ALeffectslot*)RemoveUIntMapKeyNoLock(&context->EffectSlotMap, id); } - ALenum InitEffectSlot(ALeffectslot *slot); void DeinitEffectSlot(ALeffectslot *slot); -void UpdateEffectSlotProps(ALeffectslot *slot); +void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context); void UpdateAllEffectSlotProps(ALCcontext *context); ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context); -ALeffectStateFactory *ALnullStateFactory_getFactory(void); -ALeffectStateFactory *ALreverbStateFactory_getFactory(void); -ALeffectStateFactory *ALchorusStateFactory_getFactory(void); -ALeffectStateFactory *ALcompressorStateFactory_getFactory(void); -ALeffectStateFactory *ALdistortionStateFactory_getFactory(void); -ALeffectStateFactory *ALechoStateFactory_getFactory(void); -ALeffectStateFactory *ALequalizerStateFactory_getFactory(void); -ALeffectStateFactory *ALflangerStateFactory_getFactory(void); -ALeffectStateFactory *ALmodulatorStateFactory_getFactory(void); +EffectStateFactory *NullStateFactory_getFactory(void); +EffectStateFactory *ReverbStateFactory_getFactory(void); +EffectStateFactory *AutowahStateFactory_getFactory(void); +EffectStateFactory *ChorusStateFactory_getFactory(void); +EffectStateFactory *CompressorStateFactory_getFactory(void); +EffectStateFactory *DistortionStateFactory_getFactory(void); +EffectStateFactory *EchoStateFactory_getFactory(void); +EffectStateFactory *EqualizerStateFactory_getFactory(void); +EffectStateFactory *FlangerStateFactory_getFactory(void); +EffectStateFactory *FshifterStateFactory_getFactory(void); +EffectStateFactory *ModulatorStateFactory_getFactory(void); +EffectStateFactory *PshifterStateFactory_getFactory(void); -ALeffectStateFactory *ALdedicatedStateFactory_getFactory(void); +EffectStateFactory *DedicatedStateFactory_getFactory(void); -ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *effect); +ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect); -void InitEffectFactoryMap(void); -void DeinitEffectFactoryMap(void); +void ALeffectState_DecRef(ALeffectState *state); #ifdef __cplusplus } diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alBuffer.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alBuffer.h new file mode 100644 index 00000000..fbe3e6e5 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alBuffer.h @@ -0,0 +1,115 @@ +#ifndef _AL_BUFFER_H_ +#define _AL_BUFFER_H_ + +#include "AL/alc.h" +#include "AL/al.h" +#include "AL/alext.h" + +#include "inprogext.h" +#include "atomic.h" +#include "rwlock.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* User formats */ +enum UserFmtType { + UserFmtUByte, + UserFmtShort, + UserFmtFloat, + UserFmtDouble, + UserFmtMulaw, + UserFmtAlaw, + UserFmtIMA4, + UserFmtMSADPCM, +}; +enum UserFmtChannels { + UserFmtMono, + UserFmtStereo, + UserFmtRear, + UserFmtQuad, + UserFmtX51, /* (WFX order) */ + UserFmtX61, /* (WFX order) */ + UserFmtX71, /* (WFX order) */ + UserFmtBFormat2D, /* WXY */ + UserFmtBFormat3D, /* WXYZ */ +}; + +ALsizei BytesFromUserFmt(enum UserFmtType type); +ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans); +inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type) +{ + return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); +} + + +/* Storable formats */ +enum FmtType { + FmtUByte = UserFmtUByte, + FmtShort = UserFmtShort, + FmtFloat = UserFmtFloat, + FmtDouble = UserFmtDouble, + FmtMulaw = UserFmtMulaw, + FmtAlaw = UserFmtAlaw, +}; +enum FmtChannels { + FmtMono = UserFmtMono, + FmtStereo = UserFmtStereo, + FmtRear = UserFmtRear, + FmtQuad = UserFmtQuad, + FmtX51 = UserFmtX51, + FmtX61 = UserFmtX61, + FmtX71 = UserFmtX71, + FmtBFormat2D = UserFmtBFormat2D, + FmtBFormat3D = UserFmtBFormat3D, +}; +#define MAX_INPUT_CHANNELS (8) + +ALsizei BytesFromFmt(enum FmtType type); +ALsizei ChannelsFromFmt(enum FmtChannels chans); +inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type) +{ + return ChannelsFromFmt(chans) * BytesFromFmt(type); +} + + +typedef struct ALbuffer { + ALvoid *data; + + ALsizei Frequency; + ALbitfieldSOFT Access; + ALsizei SampleLen; + + enum FmtChannels FmtChannels; + enum FmtType FmtType; + ALsizei BytesAlloc; + + enum UserFmtType OriginalType; + ALsizei OriginalSize; + ALsizei OriginalAlign; + + ALsizei LoopStart; + ALsizei LoopEnd; + + ATOMIC(ALsizei) UnpackAlign; + ATOMIC(ALsizei) PackAlign; + + ALbitfieldSOFT MappedAccess; + ALsizei MappedOffset; + ALsizei MappedSize; + + /* Number of times buffer was attached to a source (deletion can only occur when 0) */ + RefCount ref; + + /* Self ID */ + ALuint id; +} ALbuffer; + +ALvoid ReleaseALBuffers(ALCdevice *device); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alEffect.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alEffect.h similarity index 70% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alEffect.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alEffect.h index 80f029a9..7b849c0c 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alEffect.h +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alEffect.h @@ -10,23 +10,34 @@ extern "C" { struct ALeffect; enum { - AL__EAXREVERB = 0, - AL__REVERB, - AL__CHORUS, - AL__COMPRESSOR, - AL__DISTORTION, - AL__ECHO, - AL__EQUALIZER, - AL__FLANGER, - AL__MODULATOR, - AL__DEDICATED, + EAXREVERB_EFFECT = 0, + REVERB_EFFECT, + AUTOWAH_EFFECT, + CHORUS_EFFECT, + COMPRESSOR_EFFECT, + DISTORTION_EFFECT, + ECHO_EFFECT, + EQUALIZER_EFFECT, + FLANGER_EFFECT, + FSHIFTER_EFFECT, + MODULATOR_EFFECT, + PSHIFTER_EFFECT, + DEDICATED_EFFECT, MAX_EFFECTS }; extern ALboolean DisabledEffects[MAX_EFFECTS]; extern ALfloat ReverbBoost; -extern ALboolean EmulateEAXReverb; + +struct EffectList { + const char name[16]; + int type; + ALenum val; +}; +#define EFFECTLIST_SIZE 14 +extern const struct EffectList EffectList[EFFECTLIST_SIZE]; + struct ALeffectVtable { void (*const setParami)(struct ALeffect *effect, ALCcontext *context, ALenum param, ALint val); @@ -50,14 +61,17 @@ const struct ALeffectVtable T##_vtable = { \ extern const struct ALeffectVtable ALeaxreverb_vtable; extern const struct ALeffectVtable ALreverb_vtable; +extern const struct ALeffectVtable ALautowah_vtable; extern const struct ALeffectVtable ALchorus_vtable; extern const struct ALeffectVtable ALcompressor_vtable; extern const struct ALeffectVtable ALdistortion_vtable; extern const struct ALeffectVtable ALecho_vtable; extern const struct ALeffectVtable ALequalizer_vtable; extern const struct ALeffectVtable ALflanger_vtable; +extern const struct ALeffectVtable ALfshifter_vtable; extern const struct ALeffectVtable ALmodulator_vtable; extern const struct ALeffectVtable ALnull_vtable; +extern const struct ALeffectVtable ALpshifter_vtable; extern const struct ALeffectVtable ALdedicated_vtable; @@ -91,6 +105,13 @@ typedef union ALeffectProps { ALfloat LFReference; } Reverb; + struct { + ALfloat AttackTime; + ALfloat ReleaseTime; + ALfloat Resonance; + ALfloat PeakGain; + } Autowah; + struct { ALint Waveform; ALint Phase; @@ -98,7 +119,7 @@ typedef union ALeffectProps { ALfloat Depth; ALfloat Feedback; ALfloat Delay; - } Chorus; + } Chorus; /* Also Flanger */ struct { ALboolean OnOff; @@ -136,13 +157,10 @@ typedef union ALeffectProps { } Equalizer; struct { - ALint Waveform; - ALint Phase; - ALfloat Rate; - ALfloat Depth; - ALfloat Feedback; - ALfloat Delay; - } Flanger; + ALfloat Frequency; + ALint LeftDirection; + ALint RightDirection; + } Fshifter; struct { ALfloat Frequency; @@ -150,6 +168,11 @@ typedef union ALeffectProps { ALint Waveform; } Modulator; + struct { + ALint CoarseTune; + ALint FineTune; + } Pshifter; + struct { ALfloat Gain; } Dedicated; @@ -161,33 +184,27 @@ typedef struct ALeffect { ALeffectProps Props; - const struct ALeffectVtable *vtbl; + const struct ALeffectVtable *vtab; /* Self ID */ ALuint id; } ALeffect; - -inline void LockEffectsRead(ALCdevice *device) -{ LockUIntMapRead(&device->EffectMap); } -inline void UnlockEffectsRead(ALCdevice *device) -{ UnlockUIntMapRead(&device->EffectMap); } -inline void LockEffectsWrite(ALCdevice *device) -{ LockUIntMapWrite(&device->EffectMap); } -inline void UnlockEffectsWrite(ALCdevice *device) -{ UnlockUIntMapWrite(&device->EffectMap); } - -inline struct ALeffect *LookupEffect(ALCdevice *device, ALuint id) -{ return (struct ALeffect*)LookupUIntMapKeyNoLock(&device->EffectMap, id); } -inline struct ALeffect *RemoveEffect(ALCdevice *device, ALuint id) -{ return (struct ALeffect*)RemoveUIntMapKeyNoLock(&device->EffectMap, id); } +#define ALeffect_setParami(o, c, p, v) ((o)->vtab->setParami(o, c, p, v)) +#define ALeffect_setParamf(o, c, p, v) ((o)->vtab->setParamf(o, c, p, v)) +#define ALeffect_setParamiv(o, c, p, v) ((o)->vtab->setParamiv(o, c, p, v)) +#define ALeffect_setParamfv(o, c, p, v) ((o)->vtab->setParamfv(o, c, p, v)) +#define ALeffect_getParami(o, c, p, v) ((o)->vtab->getParami(o, c, p, v)) +#define ALeffect_getParamf(o, c, p, v) ((o)->vtab->getParamf(o, c, p, v)) +#define ALeffect_getParamiv(o, c, p, v) ((o)->vtab->getParamiv(o, c, p, v)) +#define ALeffect_getParamfv(o, c, p, v) ((o)->vtab->getParamfv(o, c, p, v)) inline ALboolean IsReverbEffect(ALenum type) { return type == AL_EFFECT_REVERB || type == AL_EFFECT_EAXREVERB; } -ALenum InitEffect(ALeffect *effect); -ALvoid ReleaseALEffects(ALCdevice *device); +void InitEffect(ALeffect *effect); +void ReleaseALEffects(ALCdevice *device); -ALvoid LoadReverbPreset(const char *name, ALeffect *effect); +void LoadReverbPreset(const char *name, ALeffect *effect); #ifdef __cplusplus } diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alError.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alError.h new file mode 100644 index 00000000..858f81de --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alError.h @@ -0,0 +1,29 @@ +#ifndef _AL_ERROR_H_ +#define _AL_ERROR_H_ + +#include "alMain.h" +#include "logging.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern ALboolean TrapALError; + +void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...) DECL_FORMAT(printf, 3, 4); + +#define SETERR_GOTO(ctx, err, lbl, ...) do { \ + alSetError((ctx), (err), __VA_ARGS__); \ + goto lbl; \ +} while(0) + +#define SETERR_RETURN(ctx, err, retval, ...) do { \ + alSetError((ctx), (err), __VA_ARGS__); \ + return retval; \ +} while(0) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alFilter.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alFilter.h new file mode 100644 index 00000000..2634d5e8 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alFilter.h @@ -0,0 +1,67 @@ +#ifndef _AL_FILTER_H_ +#define _AL_FILTER_H_ + +#include "AL/alc.h" +#include "AL/al.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LOWPASSFREQREF (5000.0f) +#define HIGHPASSFREQREF (250.0f) + + +struct ALfilter; + +typedef struct ALfilterVtable { + void (*const setParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint val); + void (*const setParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALint *vals); + void (*const setParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val); + void (*const setParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals); + + void (*const getParami)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *val); + void (*const getParamiv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALint *vals); + void (*const getParamf)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val); + void (*const getParamfv)(struct ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals); +} ALfilterVtable; + +#define DEFINE_ALFILTER_VTABLE(T) \ +const struct ALfilterVtable T##_vtable = { \ + T##_setParami, T##_setParamiv, \ + T##_setParamf, T##_setParamfv, \ + T##_getParami, T##_getParamiv, \ + T##_getParamf, T##_getParamfv, \ +} + +typedef struct ALfilter { + // Filter type (AL_FILTER_NULL, ...) + ALenum type; + + ALfloat Gain; + ALfloat GainHF; + ALfloat HFReference; + ALfloat GainLF; + ALfloat LFReference; + + const struct ALfilterVtable *vtab; + + /* Self ID */ + ALuint id; +} ALfilter; +#define ALfilter_setParami(o, c, p, v) ((o)->vtab->setParami(o, c, p, v)) +#define ALfilter_setParamf(o, c, p, v) ((o)->vtab->setParamf(o, c, p, v)) +#define ALfilter_setParamiv(o, c, p, v) ((o)->vtab->setParamiv(o, c, p, v)) +#define ALfilter_setParamfv(o, c, p, v) ((o)->vtab->setParamfv(o, c, p, v)) +#define ALfilter_getParami(o, c, p, v) ((o)->vtab->getParami(o, c, p, v)) +#define ALfilter_getParamf(o, c, p, v) ((o)->vtab->getParamf(o, c, p, v)) +#define ALfilter_getParamiv(o, c, p, v) ((o)->vtab->getParamiv(o, c, p, v)) +#define ALfilter_getParamfv(o, c, p, v) ((o)->vtab->getParamfv(o, c, p, v)) + +void ReleaseALFilters(ALCdevice *device); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alListener.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alListener.h similarity index 84% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alListener.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alListener.h index f1a92b0d..0d80a8d7 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alListener.h +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alListener.h @@ -8,19 +8,23 @@ extern "C" { #endif +struct ALcontextProps { + ALfloat DopplerFactor; + ALfloat DopplerVelocity; + ALfloat SpeedOfSound; + ALboolean SourceDistanceModel; + enum DistanceModel DistanceModel; + ALfloat MetersPerUnit; + + ATOMIC(struct ALcontextProps*) next; +}; + struct ALlistenerProps { ALfloat Position[3]; ALfloat Velocity[3]; ALfloat Forward[3]; ALfloat Up[3]; ALfloat Gain; - ALfloat MetersPerUnit; - - ALfloat DopplerFactor; - ALfloat DopplerVelocity; - ALfloat SpeedOfSound; - ALboolean SourceDistanceModel; - enum DistanceModel DistanceModel; ATOMIC(struct ALlistenerProps*) next; }; @@ -31,17 +35,13 @@ typedef struct ALlistener { ALfloat Forward[3]; ALfloat Up[3]; ALfloat Gain; - ALfloat MetersPerUnit; + + ATOMIC_FLAG PropsClean; /* Pointer to the most recent property values that are awaiting an update. */ ATOMIC(struct ALlistenerProps*) Update; - /* A linked list of unused property containers, free to use for future - * updates. - */ - ATOMIC(struct ALlistenerProps*) FreeList; - struct { aluMatrixf Matrix; aluVector Velocity; @@ -50,7 +50,8 @@ typedef struct ALlistener { ALfloat MetersPerUnit; ALfloat DopplerFactor; - ALfloat SpeedOfSound; + ALfloat SpeedOfSound; /* in units per sec! */ + ALfloat ReverbSpeedOfSound; /* in meters per sec! */ ALboolean SourceDistanceModel; enum DistanceModel DistanceModel; diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alMain.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alMain.h new file mode 100644 index 00000000..0fd77491 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alMain.h @@ -0,0 +1,920 @@ +#ifndef AL_MAIN_H +#define AL_MAIN_H + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_INTRIN_H +#include +#endif + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" + +#include "inprogext.h" +#include "logging.h" +#include "polymorphism.h" +#include "static_assert.h" +#include "align.h" +#include "atomic.h" +#include "vector.h" +#include "alstring.h" +#include "almalloc.h" +#include "threads.h" + + +#if defined(_WIN64) +#define SZFMT "%I64u" +#elif defined(_WIN32) +#define SZFMT "%u" +#else +#define SZFMT "%zu" +#endif + +#ifdef __has_builtin +#define HAS_BUILTIN __has_builtin +#else +#define HAS_BUILTIN(x) (0) +#endif + +#ifdef __GNUC__ +/* LIKELY optimizes the case where the condition is true. The condition is not + * required to be true, but it can result in more optimal code for the true + * path at the expense of a less optimal false path. + */ +#define LIKELY(x) __builtin_expect(!!(x), !0) +/* The opposite of LIKELY, optimizing the case where the condition is false. */ +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +/* Unlike LIKELY, ASSUME requires the condition to be true or else it invokes + * undefined behavior. It's essentially an assert without actually checking the + * condition at run-time, allowing for stronger optimizations than LIKELY. + */ +#if HAS_BUILTIN(__builtin_assume) +#define ASSUME __builtin_assume +#else +#define ASSUME(x) do { if(!(x)) __builtin_unreachable(); } while(0) +#endif + +#else + +#define LIKELY(x) (!!(x)) +#define UNLIKELY(x) (!!(x)) +#ifdef _MSC_VER +#define ASSUME __assume +#else +#define ASSUME(x) ((void)0) +#endif +#endif + +#ifndef UINT64_MAX +#define UINT64_MAX U64(18446744073709551615) +#endif + +#ifndef UNUSED +#if defined(__cplusplus) +#define UNUSED(x) +#elif defined(__GNUC__) +#define UNUSED(x) UNUSED_##x __attribute__((unused)) +#elif defined(__LCLINT__) +#define UNUSED(x) /*@unused@*/ x +#else +#define UNUSED(x) x +#endif +#endif + +/* Calculates the size of a struct with N elements of a flexible array member. + * GCC and Clang allow offsetof(Type, fam[N]) for this, but MSVC seems to have + * trouble, so a bit more verbose workaround is needed. + */ +#define FAM_SIZE(T, M, N) (offsetof(T, M) + sizeof(((T*)NULL)->M[0])*(N)) + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ALint64SOFT ALint64; +typedef ALuint64SOFT ALuint64; + +#ifndef U64 +#if defined(_MSC_VER) +#define U64(x) ((ALuint64)(x##ui64)) +#elif SIZEOF_LONG == 8 +#define U64(x) ((ALuint64)(x##ul)) +#elif SIZEOF_LONG_LONG == 8 +#define U64(x) ((ALuint64)(x##ull)) +#endif +#endif + +#ifndef I64 +#if defined(_MSC_VER) +#define I64(x) ((ALint64)(x##i64)) +#elif SIZEOF_LONG == 8 +#define I64(x) ((ALint64)(x##l)) +#elif SIZEOF_LONG_LONG == 8 +#define I64(x) ((ALint64)(x##ll)) +#endif +#endif + +/* Define a CTZ64 macro (count trailing zeros, for 64-bit integers). The result + * is *UNDEFINED* if the value is 0. + */ +#ifdef __GNUC__ + +#if SIZEOF_LONG == 8 +#define CTZ64 __builtin_ctzl +#else +#define CTZ64 __builtin_ctzll +#endif + +#elif defined(HAVE_BITSCANFORWARD64_INTRINSIC) + +inline int msvc64_ctz64(ALuint64 v) +{ + unsigned long idx = 64; + _BitScanForward64(&idx, v); + return (int)idx; +} +#define CTZ64 msvc64_ctz64 + +#elif defined(HAVE_BITSCANFORWARD_INTRINSIC) + +inline int msvc_ctz64(ALuint64 v) +{ + unsigned long idx = 64; + if(!_BitScanForward(&idx, v&0xffffffff)) + { + if(_BitScanForward(&idx, v>>32)) + idx += 32; + } + return (int)idx; +} +#define CTZ64 msvc_ctz64 + +#else + +/* There be black magics here. The popcnt64 method is derived from + * https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel + * while the ctz-utilizing-popcnt algorithm is shown here + * http://www.hackersdelight.org/hdcodetxt/ntz.c.txt + * as the ntz2 variant. These likely aren't the most efficient methods, but + * they're good enough if the GCC or MSVC intrinsics aren't available. + */ +inline int fallback_popcnt64(ALuint64 v) +{ + v = v - ((v >> 1) & U64(0x5555555555555555)); + v = (v & U64(0x3333333333333333)) + ((v >> 2) & U64(0x3333333333333333)); + v = (v + (v >> 4)) & U64(0x0f0f0f0f0f0f0f0f); + return (int)((v * U64(0x0101010101010101)) >> 56); +} + +inline int fallback_ctz64(ALuint64 value) +{ + return fallback_popcnt64(~value & (value - 1)); +} +#define CTZ64 fallback_ctz64 +#endif + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) +#define IS_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#else +static const union { + ALuint u; + ALubyte b[sizeof(ALuint)]; +} EndianTest = { 1 }; +#define IS_LITTLE_ENDIAN (EndianTest.b[0] == 1) +#endif + +#define COUNTOF(x) (sizeof(x) / sizeof(0[x])) + + +struct ll_ringbuffer; +struct Hrtf; +struct HrtfEntry; +struct DirectHrtfState; +struct FrontStablizer; +struct Compressor; +struct ALCbackend; +struct ALbuffer; +struct ALeffect; +struct ALfilter; +struct ALsource; +struct ALcontextProps; +struct ALlistenerProps; +struct ALvoiceProps; +struct ALeffectslotProps; + + +#define DEFAULT_OUTPUT_RATE (44100) +#define MIN_OUTPUT_RATE (8000) + + +/* Find the next power-of-2 for non-power-of-2 numbers. */ +inline ALuint NextPowerOf2(ALuint value) +{ + if(value > 0) + { + value--; + value |= value>>1; + value |= value>>2; + value |= value>>4; + value |= value>>8; + value |= value>>16; + } + return value+1; +} + +/** Round up a value to the next multiple. */ +inline size_t RoundUp(size_t value, size_t r) +{ + value += r-1; + return value - (value%r); +} + +/* Fast float-to-int conversion. No particular rounding mode is assumed; the + * IEEE-754 default is round-to-nearest with ties-to-even, though an app could + * change it on its own threads. On some systems, a truncating conversion may + * always be the fastest method. + */ +inline ALint fastf2i(ALfloat f) +{ +#if defined(HAVE_INTRIN_H) && ((defined(_M_IX86_FP) && (_M_IX86_FP > 0)) || defined(_M_X64)) + return _mm_cvt_ss2si(_mm_set1_ps(f)); + +#elif defined(_MSC_VER) && defined(_M_IX86_FP) + + ALint i; + __asm fld f + __asm fistp i + return i; + +#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) + + ALint i; +#ifdef __SSE_MATH__ + __asm__("cvtss2si %1, %0" : "=r"(i) : "x"(f)); +#else + __asm__ __volatile__("fistpl %0" : "=m"(i) : "t"(f) : "st"); +#endif + return i; + + /* On GCC when compiling with -fno-math-errno, lrintf can be inlined to + * some simple instructions. Clang does not inline it, always generating a + * libc call, while MSVC's implementation is horribly slow, so always fall + * back to a normal integer conversion for them. + */ +#elif defined(HAVE_LRINTF) && !defined(_MSC_VER) && !defined(__clang__) + + return lrintf(f); + +#else + + return (ALint)f; +#endif +} + +/* Converts float-to-int using standard behavior (truncation). */ +inline int float2int(float f) +{ +#if ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE_MATH__)) || (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0) + ALint sign, shift, mant; + union { + ALfloat f; + ALint i; + } conv; + + conv.f = f; + sign = (conv.i>>31) | 1; + shift = ((conv.i>>23)&0xff) - (127+23); + + /* Over/underflow */ + if(UNLIKELY(shift >= 31 || shift < -23)) + return 0; + + mant = (conv.i&0x7fffff) | 0x800000; + if(LIKELY(shift < 0)) + return (mant >> -shift) * sign; + return (mant << shift) * sign; + +#else + + return (ALint)f; +#endif +} + +/* Rounds a float to the nearest integral value, according to the current + * rounding mode. This is essentially an inlined version of rintf, although + * makes fewer promises (e.g. -0 or -0.25 rounded to 0 may result in +0). + */ +inline float fast_roundf(float f) +{ +#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) && \ + !defined(__SSE_MATH__) + + float out; + __asm__ __volatile__("frndint" : "=t"(out) : "0"(f)); + return out; + +#else + + /* Integral limit, where sub-integral precision is not available for + * floats. + */ + static const float ilim[2] = { + 8388608.0f /* 0x1.0p+23 */, + -8388608.0f /* -0x1.0p+23 */ + }; + ALuint sign, expo; + union { + ALfloat f; + ALuint i; + } conv; + + conv.f = f; + sign = (conv.i>>31)&0x01; + expo = (conv.i>>23)&0xff; + + if(UNLIKELY(expo >= 150/*+23*/)) + { + /* An exponent (base-2) of 23 or higher is incapable of sub-integral + * precision, so it's already an integral value. We don't need to worry + * about infinity or NaN here. + */ + return f; + } + /* Adding the integral limit to the value (with a matching sign) forces a + * result that has no sub-integral precision, and is consequently forced to + * round to an integral value. Removing the integral limit then restores + * the initial value rounded to the integral. The compiler should not + * optimize this out because of non-associative rules on floating-point + * math (as long as you don't use -fassociative-math, + * -funsafe-math-optimizations, -ffast-math, or -Ofast, in which case this + * may break). + */ + f += ilim[sign]; + return f - ilim[sign]; +#endif +} + + +enum DevProbe { + ALL_DEVICE_PROBE, + CAPTURE_DEVICE_PROBE +}; + + +enum DistanceModel { + InverseDistanceClamped = AL_INVERSE_DISTANCE_CLAMPED, + LinearDistanceClamped = AL_LINEAR_DISTANCE_CLAMPED, + ExponentDistanceClamped = AL_EXPONENT_DISTANCE_CLAMPED, + InverseDistance = AL_INVERSE_DISTANCE, + LinearDistance = AL_LINEAR_DISTANCE, + ExponentDistance = AL_EXPONENT_DISTANCE, + DisableDistance = AL_NONE, + + DefaultDistanceModel = InverseDistanceClamped +}; + +enum Channel { + FrontLeft = 0, + FrontRight, + FrontCenter, + LFE, + BackLeft, + BackRight, + BackCenter, + SideLeft, + SideRight, + + UpperFrontLeft, + UpperFrontRight, + UpperBackLeft, + UpperBackRight, + LowerFrontLeft, + LowerFrontRight, + LowerBackLeft, + LowerBackRight, + + Aux0, + Aux1, + Aux2, + Aux3, + Aux4, + Aux5, + Aux6, + Aux7, + Aux8, + Aux9, + Aux10, + Aux11, + Aux12, + Aux13, + Aux14, + Aux15, + + InvalidChannel +}; + + +/* Device formats */ +enum DevFmtType { + DevFmtByte = ALC_BYTE_SOFT, + DevFmtUByte = ALC_UNSIGNED_BYTE_SOFT, + DevFmtShort = ALC_SHORT_SOFT, + DevFmtUShort = ALC_UNSIGNED_SHORT_SOFT, + DevFmtInt = ALC_INT_SOFT, + DevFmtUInt = ALC_UNSIGNED_INT_SOFT, + DevFmtFloat = ALC_FLOAT_SOFT, + + DevFmtTypeDefault = DevFmtFloat +}; +enum DevFmtChannels { + DevFmtMono = ALC_MONO_SOFT, + DevFmtStereo = ALC_STEREO_SOFT, + DevFmtQuad = ALC_QUAD_SOFT, + DevFmtX51 = ALC_5POINT1_SOFT, + DevFmtX61 = ALC_6POINT1_SOFT, + DevFmtX71 = ALC_7POINT1_SOFT, + DevFmtAmbi3D = ALC_BFORMAT3D_SOFT, + + /* Similar to 5.1, except using rear channels instead of sides */ + DevFmtX51Rear = 0x80000000, + + DevFmtChannelsDefault = DevFmtStereo +}; +#define MAX_OUTPUT_CHANNELS (16) + +ALsizei BytesFromDevFmt(enum DevFmtType type); +ALsizei ChannelsFromDevFmt(enum DevFmtChannels chans, ALsizei ambiorder); +inline ALsizei FrameSizeFromDevFmt(enum DevFmtChannels chans, enum DevFmtType type, ALsizei ambiorder) +{ + return ChannelsFromDevFmt(chans, ambiorder) * BytesFromDevFmt(type); +} + +enum AmbiLayout { + AmbiLayout_FuMa = ALC_FUMA_SOFT, /* FuMa channel order */ + AmbiLayout_ACN = ALC_ACN_SOFT, /* ACN channel order */ + + AmbiLayout_Default = AmbiLayout_ACN +}; + +enum AmbiNorm { + AmbiNorm_FuMa = ALC_FUMA_SOFT, /* FuMa normalization */ + AmbiNorm_SN3D = ALC_SN3D_SOFT, /* SN3D normalization */ + AmbiNorm_N3D = ALC_N3D_SOFT, /* N3D normalization */ + + AmbiNorm_Default = AmbiNorm_SN3D +}; + + +enum DeviceType { + Playback, + Capture, + Loopback +}; + + +enum RenderMode { + NormalRender, + StereoPair, + HrtfRender +}; + + +/* The maximum number of Ambisonics coefficients. For a given order (o), the + * size needed will be (o+1)**2, thus zero-order has 1, first-order has 4, + * second-order has 9, third-order has 16, and fourth-order has 25. + */ +#define MAX_AMBI_ORDER 3 +#define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1)) + +/* A bitmask of ambisonic channels with height information. If none of these + * channels are used/needed, there's no height (e.g. with most surround sound + * speaker setups). This only specifies up to 4th order, which is the highest + * order a 32-bit mask value can specify (a 64-bit mask could handle up to 7th + * order). This is ACN ordering, with bit 0 being ACN 0, etc. + */ +#define AMBI_PERIPHONIC_MASK (0xfe7ce4) + +/* The maximum number of Ambisonic coefficients for 2D (non-periphonic) + * representation. This is 2 per each order above zero-order, plus 1 for zero- + * order. Or simply, o*2 + 1. + */ +#define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1) + + +typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS]; +typedef struct BFChannelConfig { + ALfloat Scale; + ALsizei Index; +} BFChannelConfig; + +typedef union AmbiConfig { + /* Ambisonic coefficients for mixing to the dry buffer. */ + ChannelConfig Coeffs[MAX_OUTPUT_CHANNELS]; + /* Coefficient channel mapping for mixing to the dry buffer. */ + BFChannelConfig Map[MAX_OUTPUT_CHANNELS]; +} AmbiConfig; + + +typedef struct BufferSubList { + ALuint64 FreeMask; + struct ALbuffer *Buffers; /* 64 */ +} BufferSubList; +TYPEDEF_VECTOR(BufferSubList, vector_BufferSubList) + +typedef struct EffectSubList { + ALuint64 FreeMask; + struct ALeffect *Effects; /* 64 */ +} EffectSubList; +TYPEDEF_VECTOR(EffectSubList, vector_EffectSubList) + +typedef struct FilterSubList { + ALuint64 FreeMask; + struct ALfilter *Filters; /* 64 */ +} FilterSubList; +TYPEDEF_VECTOR(FilterSubList, vector_FilterSubList) + +typedef struct SourceSubList { + ALuint64 FreeMask; + struct ALsource *Sources; /* 64 */ +} SourceSubList; +TYPEDEF_VECTOR(SourceSubList, vector_SourceSubList) + +/* Effect slots are rather large, and apps aren't likely to have more than one + * or two (let alone 64), so hold them individually. + */ +typedef struct ALeffectslot *ALeffectslotPtr; +TYPEDEF_VECTOR(ALeffectslotPtr, vector_ALeffectslotPtr) + + +typedef struct EnumeratedHrtf { + al_string name; + + struct HrtfEntry *hrtf; +} EnumeratedHrtf; +TYPEDEF_VECTOR(EnumeratedHrtf, vector_EnumeratedHrtf) + + +/* Maximum delay in samples for speaker distance compensation. */ +#define MAX_DELAY_LENGTH 1024 + +typedef struct DistanceComp { + ALfloat Gain; + ALsizei Length; /* Valid range is [0...MAX_DELAY_LENGTH). */ + ALfloat *Buffer; +} DistanceComp; + +/* Size for temporary storage of buffer data, in ALfloats. Larger values need + * more memory, while smaller values may need more iterations. The value needs + * to be a sensible size, however, as it constrains the max stepping value used + * for mixing, as well as the maximum number of samples per mixing iteration. + */ +#define BUFFERSIZE 2048 + +typedef struct MixParams { + AmbiConfig Ambi; + /* Number of coefficients in each Ambi.Coeffs to mix together (4 for first- + * order, 9 for second-order, etc). If the count is 0, Ambi.Map is used + * instead to map each output to a coefficient index. + */ + ALsizei CoeffCount; + + ALfloat (*Buffer)[BUFFERSIZE]; + ALsizei NumChannels; +} MixParams; + +typedef struct RealMixParams { + enum Channel ChannelName[MAX_OUTPUT_CHANNELS]; + + ALfloat (*Buffer)[BUFFERSIZE]; + ALsizei NumChannels; +} RealMixParams; + +typedef void (*POSTPROCESS)(ALCdevice *device, ALsizei SamplesToDo); + +struct ALCdevice_struct { + RefCount ref; + + ATOMIC(ALenum) Connected; + enum DeviceType Type; + + ALuint Frequency; + ALuint UpdateSize; + ALuint NumUpdates; + enum DevFmtChannels FmtChans; + enum DevFmtType FmtType; + ALboolean IsHeadphones; + ALsizei AmbiOrder; + /* For DevFmtAmbi* output only, specifies the channel order and + * normalization. + */ + enum AmbiLayout AmbiLayout; + enum AmbiNorm AmbiScale; + + ALCenum LimiterState; + + al_string DeviceName; + + ATOMIC(ALCenum) LastError; + + // Maximum number of sources that can be created + ALuint SourcesMax; + // Maximum number of slots that can be created + ALuint AuxiliaryEffectSlotMax; + + ALCuint NumMonoSources; + ALCuint NumStereoSources; + ALsizei NumAuxSends; + + // Map of Buffers for this device + vector_BufferSubList BufferList; + almtx_t BufferLock; + + // Map of Effects for this device + vector_EffectSubList EffectList; + almtx_t EffectLock; + + // Map of Filters for this device + vector_FilterSubList FilterList; + almtx_t FilterLock; + + POSTPROCESS PostProcess; + + /* HRTF state and info */ + struct DirectHrtfState *Hrtf; + al_string HrtfName; + struct Hrtf *HrtfHandle; + vector_EnumeratedHrtf HrtfList; + ALCenum HrtfStatus; + + /* UHJ encoder state */ + struct Uhj2Encoder *Uhj_Encoder; + + /* High quality Ambisonic decoder */ + struct BFormatDec *AmbiDecoder; + + /* Stereo-to-binaural filter */ + struct bs2b *Bs2b; + + /* First-order ambisonic upsampler for higher-order output */ + struct AmbiUpsampler *AmbiUp; + + /* Rendering mode. */ + enum RenderMode Render_Mode; + + // Device flags + ALuint Flags; + + ALuint64 ClockBase; + ALuint SamplesDone; + ALuint FixedLatency; + + /* Temp storage used for mixer processing. */ + alignas(16) ALfloat TempBuffer[4][BUFFERSIZE]; + + /* The "dry" path corresponds to the main output. */ + MixParams Dry; + ALsizei NumChannelsPerOrder[MAX_AMBI_ORDER+1]; + + /* First-order ambisonics output, to be upsampled to the dry buffer if different. */ + MixParams FOAOut; + + /* "Real" output, which will be written to the device buffer. May alias the + * dry buffer. + */ + RealMixParams RealOut; + + struct FrontStablizer *Stablizer; + + struct Compressor *Limiter; + + /* The average speaker distance as determined by the ambdec configuration + * (or alternatively, by the NFC-HOA reference delay). Only used for NFC. + */ + ALfloat AvgSpeakerDist; + + /* Delay buffers used to compensate for speaker distances. */ + DistanceComp ChannelDelay[MAX_OUTPUT_CHANNELS]; + + /* Dithering control. */ + ALfloat DitherDepth; + ALuint DitherSeed; + + /* Running count of the mixer invocations, in 31.1 fixed point. This + * actually increments *twice* when mixing, first at the start and then at + * the end, so the bottom bit indicates if the device is currently mixing + * and the upper bits indicates how many mixes have been done. + */ + RefCount MixCount; + + // Contexts created on this device + ATOMIC(ALCcontext*) ContextList; + + almtx_t BackendLock; + struct ALCbackend *Backend; + + ATOMIC(ALCdevice*) next; +}; + +// Frequency was requested by the app or config file +#define DEVICE_FREQUENCY_REQUEST (1u<<1) +// Channel configuration was requested by the config file +#define DEVICE_CHANNELS_REQUEST (1u<<2) +// Sample type was requested by the config file +#define DEVICE_SAMPLE_TYPE_REQUEST (1u<<3) + +// Specifies if the DSP is paused at user request +#define DEVICE_PAUSED (1u<<30) + +// Specifies if the device is currently running +#define DEVICE_RUNNING (1u<<31) + + +/* Nanosecond resolution for the device clock time. */ +#define DEVICE_CLOCK_RES U64(1000000000) + + +/* Must be less than 15 characters (16 including terminating null) for + * compatibility with pthread_setname_np limitations. */ +#define MIXER_THREAD_NAME "alsoft-mixer" + +#define RECORD_THREAD_NAME "alsoft-record" + + +enum { + /* End event thread processing. */ + EventType_KillThread = 0, + + /* User event types. */ + EventType_SourceStateChange = 1<<0, + EventType_BufferCompleted = 1<<1, + EventType_Error = 1<<2, + EventType_Performance = 1<<3, + EventType_Deprecated = 1<<4, + EventType_Disconnected = 1<<5, + + /* Internal events. */ + EventType_ReleaseEffectState = 65536, +}; + +typedef struct AsyncEvent { + unsigned int EnumType; + union { + char dummy; + struct { + ALenum type; + ALuint id; + ALuint param; + ALchar msg[1008]; + } user; + struct ALeffectState *EffectState; + } u; +} AsyncEvent; +#define ASYNC_EVENT(t) { t, { 0 } } + +struct ALCcontext_struct { + RefCount ref; + + struct ALlistener *Listener; + + vector_SourceSubList SourceList; + ALuint NumSources; + almtx_t SourceLock; + + vector_ALeffectslotPtr EffectSlotList; + almtx_t EffectSlotLock; + + ATOMIC(ALenum) LastError; + + enum DistanceModel DistanceModel; + ALboolean SourceDistanceModel; + + ALfloat DopplerFactor; + ALfloat DopplerVelocity; + ALfloat SpeedOfSound; + ALfloat MetersPerUnit; + + ATOMIC_FLAG PropsClean; + ATOMIC(ALenum) DeferUpdates; + + almtx_t PropLock; + + /* Counter for the pre-mixing updates, in 31.1 fixed point (lowest bit + * indicates if updates are currently happening). + */ + RefCount UpdateCount; + ATOMIC(ALenum) HoldUpdates; + + ALfloat GainBoost; + + ATOMIC(struct ALcontextProps*) Update; + + /* Linked lists of unused property containers, free to use for future + * updates. + */ + ATOMIC(struct ALcontextProps*) FreeContextProps; + ATOMIC(struct ALlistenerProps*) FreeListenerProps; + ATOMIC(struct ALvoiceProps*) FreeVoiceProps; + ATOMIC(struct ALeffectslotProps*) FreeEffectslotProps; + + struct ALvoice **Voices; + ALsizei VoiceCount; + ALsizei MaxVoices; + + ATOMIC(struct ALeffectslotArray*) ActiveAuxSlots; + + althrd_t EventThread; + alsem_t EventSem; + struct ll_ringbuffer *AsyncEvents; + ATOMIC(ALbitfieldSOFT) EnabledEvts; + almtx_t EventCbLock; + ALEVENTPROCSOFT EventCb; + void *EventParam; + + /* Default effect slot */ + struct ALeffectslot *DefaultSlot; + + ALCdevice *Device; + const ALCchar *ExtensionList; + + ATOMIC(ALCcontext*) next; + + /* Memory space used by the listener (and possibly default effect slot) */ + alignas(16) ALCbyte _listener_mem[]; +}; + +ALCcontext *GetContextRef(void); + +void ALCcontext_DecRef(ALCcontext *context); + +void ALCcontext_DeferUpdates(ALCcontext *context); +void ALCcontext_ProcessUpdates(ALCcontext *context); + +void AllocateVoices(ALCcontext *context, ALsizei num_voices, ALsizei old_sends); + + +extern ALint RTPrioLevel; +void SetRTPriority(void); + +void SetDefaultChannelOrder(ALCdevice *device); +void SetDefaultWFXChannelOrder(ALCdevice *device); + +const ALCchar *DevFmtTypeString(enum DevFmtType type); +const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans); + +inline ALint GetChannelIndex(const enum Channel names[MAX_OUTPUT_CHANNELS], enum Channel chan) +{ + ALint i; + for(i = 0;i < MAX_OUTPUT_CHANNELS;i++) + { + if(names[i] == chan) + return i; + } + return -1; +} +/** + * GetChannelIdxByName + * + * Returns the index for the given channel name (e.g. FrontCenter), or -1 if it + * doesn't exist. + */ +inline ALint GetChannelIdxByName(const RealMixParams *real, enum Channel chan) +{ return GetChannelIndex(real->ChannelName, chan); } + + +inline void LockBufferList(ALCdevice *device) { almtx_lock(&device->BufferLock); } +inline void UnlockBufferList(ALCdevice *device) { almtx_unlock(&device->BufferLock); } + +inline void LockEffectList(ALCdevice *device) { almtx_lock(&device->EffectLock); } +inline void UnlockEffectList(ALCdevice *device) { almtx_unlock(&device->EffectLock); } + +inline void LockFilterList(ALCdevice *device) { almtx_lock(&device->FilterLock); } +inline void UnlockFilterList(ALCdevice *device) { almtx_unlock(&device->FilterLock); } + +inline void LockEffectSlotList(ALCcontext *context) +{ almtx_lock(&context->EffectSlotLock); } +inline void UnlockEffectSlotList(ALCcontext *context) +{ almtx_unlock(&context->EffectSlotLock); } + + +int EventThread(void *arg); + + +vector_al_string SearchDataFiles(const char *match, const char *subdir); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alSource.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alSource.h similarity index 75% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alSource.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alSource.h index 03034ce8..5f07c09d 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alSource.h +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alSource.h @@ -19,8 +19,10 @@ struct ALsource; typedef struct ALbufferlistitem { - struct ALbuffer *buffer; ATOMIC(struct ALbufferlistitem*) next; + ALsizei max_samples; + ALsizei num_buffers; + struct ALbuffer *buffers[]; } ALbufferlistitem; @@ -91,32 +93,22 @@ typedef struct ALsource { ALint SourceType; /** Source state (initial, playing, paused, or stopped) */ - ATOMIC(ALenum) state; + ALenum state; /** Source Buffer Queue head. */ - RWLock queue_lock; ALbufferlistitem *queue; ATOMIC_FLAG PropsClean; + /* Index into the context's Voices array. Lazily updated, only checked and + * reset when looking up the voice. + */ + ALint VoiceIdx; + /** Self ID */ ALuint id; } ALsource; -inline void LockSourcesRead(ALCcontext *context) -{ LockUIntMapRead(&context->SourceMap); } -inline void UnlockSourcesRead(ALCcontext *context) -{ UnlockUIntMapRead(&context->SourceMap); } -inline void LockSourcesWrite(ALCcontext *context) -{ LockUIntMapWrite(&context->SourceMap); } -inline void UnlockSourcesWrite(ALCcontext *context) -{ UnlockUIntMapWrite(&context->SourceMap); } - -inline struct ALsource *LookupSource(ALCcontext *context, ALuint id) -{ return (struct ALsource*)LookupUIntMapKeyNoLock(&context->SourceMap, id); } -inline struct ALsource *RemoveSource(ALCcontext *context, ALuint id) -{ return (struct ALsource*)RemoveUIntMapKeyNoLock(&context->SourceMap, id); } - void UpdateAllSourceProps(ALCcontext *context); ALvoid ReleaseALSources(ALCcontext *Context); diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alu.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alu.h similarity index 67% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alu.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alu.h index 794bdec9..c572fd71 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/alu.h +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/alu.h @@ -12,28 +12,27 @@ #include "alMain.h" #include "alBuffer.h" -#include "alFilter.h" -#include "alAuxEffectSlot.h" #include "hrtf.h" #include "align.h" -#include "nfcfilter.h" #include "math_defs.h" +#include "filters/defs.h" +#include "filters/nfc.h" #define MAX_PITCH (255) -/* Maximum number of buffer samples before the current pos needed for resampling. */ -#define MAX_PRE_SAMPLES 12 - -/* Maximum number of buffer samples after the current pos needed for resampling. */ -#define MAX_POST_SAMPLES 12 +/* Maximum number of samples to pad on either end of a buffer for resampling. + * Note that both the beginning and end need padding! + */ +#define MAX_RESAMPLE_PADDING 24 #ifdef __cplusplus extern "C" { #endif +struct BSincTable; struct ALsource; struct ALbufferlistitem; struct ALvoice; @@ -53,13 +52,16 @@ enum Resampler { PointResampler, LinearResampler, FIR4Resampler, - BSincResampler, + BSinc12Resampler, + BSinc24Resampler, - ResamplerMax = BSincResampler + ResamplerMax = BSinc24Resampler }; extern enum Resampler ResamplerDefault; -/* The number of distinct scale and phase intervals within the filter table. */ +/* The number of distinct scale and phase intervals within the bsinc filter + * table. + */ #define BSINC_SCALE_BITS 4 #define BSINC_SCALE_COUNT (1< b) ? b : a); } +inline size_t maxz(size_t a, size_t b) +{ return ((a > b) ? a : b); } +inline size_t clampz(size_t val, size_t min, size_t max) +{ return minz(max, maxz(min, val)); } inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) { return val1 + (val2-val1)*mu; } -inline ALfloat resample_fir4(ALfloat val0, ALfloat val1, ALfloat val2, ALfloat val3, ALsizei frac) +inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu) { - return sinc4Tab[frac][0]*val0 + sinc4Tab[frac][1]*val1 + - sinc4Tab[frac][2]*val2 + sinc4Tab[frac][3]*val3; + ALfloat mu2 = mu*mu, mu3 = mu2*mu; + ALfloat a0 = -0.5f*mu3 + mu2 + -0.5f*mu; + ALfloat a1 = 1.5f*mu3 + -2.5f*mu2 + 1.0f; + ALfloat a2 = -1.5f*mu3 + 2.0f*mu2 + 0.5f*mu; + ALfloat a3 = 0.5f*mu3 + -0.5f*mu2; + return val1*a0 + val2*a1 + val3*a2 + val4*a3; } @@ -403,10 +413,10 @@ enum HrtfRequestMode { Hrtf_Disable = 2, }; +void aluInit(void); + void aluInitMixer(void); -MixerFunc SelectMixer(void); -RowMixerFunc SelectRowMixer(void); ResamplerFunc SelectResampler(enum Resampler resampler); /* aluInitRenderer @@ -418,14 +428,37 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf void aluInitEffectPanning(struct ALeffectslot *slot); +void aluSelectPostProcess(ALCdevice *device); + +/** + * Calculates ambisonic encoder coefficients using the X, Y, and Z direction + * components, which must represent a normalized (unit length) vector, and the + * spread is the angular width of the sound (0...tau). + * + * NOTE: The components use ambisonic coordinates. As a result: + * + * Ambisonic Y = OpenAL -X + * Ambisonic Z = OpenAL Y + * Ambisonic X = OpenAL -Z + * + * The components are ordered such that OpenAL's X, Y, and Z are the first, + * second, and third parameters respectively -- simply negate X and Z. + */ +void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALfloat spread, + ALfloat coeffs[MAX_AMBI_COEFFS]); + /** * CalcDirectionCoeffs * - * Calculates ambisonic coefficients based on a direction vector. The vector - * must be normalized (unit length), and the spread is the angular width of the - * sound (0...tau). + * Calculates ambisonic coefficients based on an OpenAL direction vector. The + * vector must be normalized (unit length), and the spread is the angular width + * of the sound (0...tau). */ -void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); +inline void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) +{ + /* Convert from OpenAL coords to Ambisonics. */ + CalcAmbiCoeffs(-dir[0], dir[1], -dir[2], spread, coeffs); +} /** * CalcAngleCoeffs @@ -436,78 +469,63 @@ void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat coeffs[MA */ inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]) { - ALfloat dir[3] = { - sinf(azimuth) * cosf(elevation), - sinf(elevation), - -cosf(azimuth) * cosf(elevation) - }; - CalcDirectionCoeffs(dir, spread, coeffs); + ALfloat x = -sinf(azimuth) * cosf(elevation); + ALfloat y = sinf(elevation); + ALfloat z = cosf(azimuth) * cosf(elevation); + + CalcAmbiCoeffs(x, y, z, spread, coeffs); } /** - * CalcAnglePairwiseCoeffs + * ScaleAzimuthFront * - * Calculates ambisonic coefficients based on azimuth and elevation. The - * azimuth and elevation parameters are in radians, going right and up - * respectively. This pairwise variant warps the result such that +30 azimuth - * is full right, and -30 azimuth is full left. + * Scales the given azimuth toward the side (+/- pi/2 radians) for positions in + * front. */ -void CalcAnglePairwiseCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat coeffs[MAX_AMBI_COEFFS]); +inline float ScaleAzimuthFront(float azimuth, float scale) +{ + ALfloat sign = copysignf(1.0f, azimuth); + if(!(fabsf(azimuth) > F_PI_2)) + return minf(fabsf(azimuth) * scale, F_PI_2) * sign; + return azimuth; +} + + +void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); +void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); /** - * ComputeAmbientGains - * - * Computes channel gains for ambient, omni-directional sounds. - */ -#define ComputeAmbientGains(b, g, o) do { \ - if((b).CoeffCount > 0) \ - ComputeAmbientGainsMC((b).Ambi.Coeffs, (b).NumChannels, g, o); \ - else \ - ComputeAmbientGainsBF((b).Ambi.Map, (b).NumChannels, g, o); \ -} while (0) -void ComputeAmbientGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -void ComputeAmbientGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); - -/** - * ComputePanningGains + * ComputePanGains * * Computes panning gains using the given channel decoder coefficients and the - * pre-calculated direction or angle coefficients. + * pre-calculated direction or angle coefficients. For B-Format sources, the + * coeffs are a 'slice' of a transform matrix for the input channel, used to + * scale and orient the sound samples. */ -#define ComputePanningGains(b, c, g, o) do { \ - if((b).CoeffCount > 0) \ - ComputePanningGainsMC((b).Ambi.Coeffs, (b).NumChannels, (b).CoeffCount, c, g, o);\ - else \ - ComputePanningGainsBF((b).Ambi.Map, (b).NumChannels, c, g, o); \ -} while (0) -void ComputePanningGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, ALsizei numcoeffs, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat coeffs[MAX_AMBI_COEFFS], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); - -/** - * ComputeFirstOrderGains - * - * Sets channel gains for a first-order ambisonics input channel. The matrix is - * a 1x4 'slice' of a transform matrix for the input channel, used to scale and - * orient the sound samples. - */ -#define ComputeFirstOrderGains(b, m, g, o) do { \ - if((b).CoeffCount > 0) \ - ComputeFirstOrderGainsMC((b).Ambi.Coeffs, (b).NumChannels, m, g, o); \ - else \ - ComputeFirstOrderGainsBF((b).Ambi.Map, (b).NumChannels, m, g, o); \ -} while (0) -void ComputeFirstOrderGainsMC(const ChannelConfig *chancoeffs, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); -void ComputeFirstOrderGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat mtx[4], ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]); +inline void ComputePanGains(const MixParams *dry, const ALfloat*restrict coeffs, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) +{ + if(dry->CoeffCount > 0) + ComputePanningGainsMC(dry->Ambi.Coeffs, dry->NumChannels, dry->CoeffCount, + coeffs, ingain, gains); + else + ComputePanningGainsBF(dry->Ambi.Map, dry->NumChannels, coeffs, ingain, gains); +} -ALboolean MixSource(struct ALvoice *voice, struct ALsource *Source, ALCdevice *Device, ALsizei SamplesToDo); +ALboolean MixSource(struct ALvoice *voice, ALuint SourceID, ALCcontext *Context, ALsizei SamplesToDo); void aluMixData(ALCdevice *device, ALvoid *OutBuffer, ALsizei NumSamples); -/* Caller must lock the device. */ -void aluHandleDisconnect(ALCdevice *device); +/* Caller must lock the device, and the mixer must not be running. */ +void aluHandleDisconnect(ALCdevice *device, const char *msg, ...) DECL_FORMAT(printf, 2, 3); + +void UpdateContextProps(ALCcontext *context); + +extern MixerFunc MixSamples; +extern RowMixerFunc MixRowSamples; extern ALfloat ConeScale; extern ALfloat ZScale; +extern ALboolean OverrideReverbSpeedOfSound; #ifdef __cplusplus } diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/Include/bs2b.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/bs2b.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/Include/bs2b.h rename to love/src/jni/openal-soft-1.19.1/OpenAL32/Include/bs2b.h diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/sample_cvt.h b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/sample_cvt.h new file mode 100644 index 00000000..c041760e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/Include/sample_cvt.h @@ -0,0 +1,15 @@ +#ifndef SAMPLE_CVT_H +#define SAMPLE_CVT_H + +#include "AL/al.h" +#include "alBuffer.h" + +extern const ALshort muLawDecompressionTable[256]; +extern const ALshort aLawDecompressionTable[256]; + +void Convert_ALshort_ALima4(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, + ALsizei align); +void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, + ALsizei align); + +#endif /* SAMPLE_CVT_H */ diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alAuxEffectSlot.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alAuxEffectSlot.c similarity index 50% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alAuxEffectSlot.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alAuxEffectSlot.c index 02288a31..8141e0f6 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alAuxEffectSlot.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alAuxEffectSlot.c @@ -27,36 +27,81 @@ #include "AL/alc.h" #include "alMain.h" #include "alAuxEffectSlot.h" -#include "alThunk.h" #include "alError.h" #include "alListener.h" #include "alSource.h" +#include "fpu_modes.h" #include "almalloc.h" -extern inline void LockEffectSlotsRead(ALCcontext *context); -extern inline void UnlockEffectSlotsRead(ALCcontext *context); -extern inline void LockEffectSlotsWrite(ALCcontext *context); -extern inline void UnlockEffectSlotsWrite(ALCcontext *context); -extern inline struct ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id); -extern inline struct ALeffectslot *RemoveEffectSlot(ALCcontext *context, ALuint id); +extern inline void LockEffectSlotList(ALCcontext *context); +extern inline void UnlockEffectSlotList(ALCcontext *context); -static UIntMap EffectStateFactoryMap; -static inline ALeffectStateFactory *getFactoryByType(ALenum type) +static void AddActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context); +static void RemoveActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context); + +static const struct { + ALenum Type; + EffectStateFactory* (*GetFactory)(void); +} FactoryList[] = { + { AL_EFFECT_NULL, NullStateFactory_getFactory }, + { AL_EFFECT_EAXREVERB, ReverbStateFactory_getFactory }, + { AL_EFFECT_REVERB, ReverbStateFactory_getFactory }, + { AL_EFFECT_AUTOWAH, AutowahStateFactory_getFactory }, + { AL_EFFECT_CHORUS, ChorusStateFactory_getFactory }, + { AL_EFFECT_COMPRESSOR, CompressorStateFactory_getFactory }, + { AL_EFFECT_DISTORTION, DistortionStateFactory_getFactory }, + { AL_EFFECT_ECHO, EchoStateFactory_getFactory }, + { AL_EFFECT_EQUALIZER, EqualizerStateFactory_getFactory }, + { AL_EFFECT_FLANGER, FlangerStateFactory_getFactory }, + { AL_EFFECT_FREQUENCY_SHIFTER, FshifterStateFactory_getFactory }, + { AL_EFFECT_RING_MODULATOR, ModulatorStateFactory_getFactory }, + { AL_EFFECT_PITCH_SHIFTER, PshifterStateFactory_getFactory}, + { AL_EFFECT_DEDICATED_DIALOGUE, DedicatedStateFactory_getFactory }, + { AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, DedicatedStateFactory_getFactory } +}; + +static inline EffectStateFactory *getFactoryByType(ALenum type) { - ALeffectStateFactory* (*getFactory)(void) = LookupUIntMapKey(&EffectStateFactoryMap, type); - if(getFactory != NULL) - return getFactory(); + size_t i; + for(i = 0;i < COUNTOF(FactoryList);i++) + { + if(FactoryList[i].Type == type) + return FactoryList[i].GetFactory(); + } return NULL; } static void ALeffectState_IncRef(ALeffectState *state); -static void ALeffectState_DecRef(ALeffectState *state); + + +static inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) +{ + id--; + if(UNLIKELY(id >= VECTOR_SIZE(context->EffectSlotList))) + return NULL; + return VECTOR_ELEM(context->EffectSlotList, id); +} + +static inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) +{ + EffectSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->EffectList))) + return NULL; + sublist = &VECTOR_ELEM(device->EffectList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Effects + slidx; +} + #define DO_UPDATEPROPS() do { \ if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ - UpdateEffectSlotProps(slot); \ + UpdateEffectSlotProps(slot, context); \ else \ ATOMIC_FLAG_CLEAR(&slot->PropsClean, almemory_order_release); \ } while(0) @@ -64,77 +109,63 @@ static void ALeffectState_DecRef(ALeffectState *state); AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots) { + ALCdevice *device; ALCcontext *context; - ALeffectslot **tmpslots = NULL; ALsizei cur; - ALenum err; context = GetContextRef(); if(!context) return; if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - tmpslots = al_malloc(DEF_ALIGN, sizeof(ALeffectslot*)*n); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Generating %d effect slots", n); + if(n == 0) goto done; - LockEffectSlotsWrite(context); + LockEffectSlotList(context); + device = context->Device; for(cur = 0;cur < n;cur++) { - ALeffectslot *slot = al_calloc(16, sizeof(ALeffectslot)); - err = AL_OUT_OF_MEMORY; + ALeffectslotPtr *iter = VECTOR_BEGIN(context->EffectSlotList); + ALeffectslotPtr *end = VECTOR_END(context->EffectSlotList); + ALeffectslot *slot = NULL; + ALenum err = AL_OUT_OF_MEMORY; + + for(;iter != end;iter++) + { + if(!*iter) + break; + } + if(iter == end) + { + if(device->AuxiliaryEffectSlotMax == VECTOR_SIZE(context->EffectSlotList)) + { + UnlockEffectSlotList(context); + alDeleteAuxiliaryEffectSlots(cur, effectslots); + SETERR_GOTO(context, AL_OUT_OF_MEMORY, done, + "Exceeding %u auxiliary effect slot limit", device->AuxiliaryEffectSlotMax); + } + VECTOR_PUSH_BACK(context->EffectSlotList, NULL); + iter = &VECTOR_BACK(context->EffectSlotList); + } + slot = al_calloc(16, sizeof(ALeffectslot)); if(!slot || (err=InitEffectSlot(slot)) != AL_NO_ERROR) { al_free(slot); - UnlockEffectSlotsWrite(context); + UnlockEffectSlotList(context); alDeleteAuxiliaryEffectSlots(cur, effectslots); - SET_ERROR_AND_GOTO(context, err, done); + SETERR_GOTO(context, err, done, "Effect slot object allocation failed"); } - - err = NewThunkEntry(&slot->id); - if(err == AL_NO_ERROR) - err = InsertUIntMapEntryNoLock(&context->EffectSlotMap, slot->id, slot); - if(err != AL_NO_ERROR) - { - FreeThunkEntry(slot->id); - ALeffectState_DecRef(slot->Effect.State); - if(slot->Params.EffectState) - ALeffectState_DecRef(slot->Params.EffectState); - al_free(slot); - UnlockEffectSlotsWrite(context); - - alDeleteAuxiliaryEffectSlots(cur, effectslots); - SET_ERROR_AND_GOTO(context, err, done); - } - aluInitEffectPanning(slot); - tmpslots[cur] = slot; + slot->id = (iter - VECTOR_BEGIN(context->EffectSlotList)) + 1; + *iter = slot; + effectslots[cur] = slot->id; } - if(n > 0) - { - struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, almemory_order_acquire); - struct ALeffectslotArray *newarray = NULL; - ALsizei newcount = curarray->count + n; - ALCdevice *device; - - newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); - newarray->count = newcount; - memcpy(newarray->slot, tmpslots, sizeof(ALeffectslot*)*n); - if(curarray) - memcpy(newarray->slot+n, curarray->slot, sizeof(ALeffectslot*)*curarray->count); - - newarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, - almemory_order_acq_rel); - device = context->Device; - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - al_free(newarray); - } - UnlockEffectSlotsWrite(context); + AddActiveEffectSlots(effectslots, n, context); + UnlockEffectSlotList(context); done: - al_free(tmpslots); ALCcontext_DecRef(context); } @@ -147,54 +178,28 @@ AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint * context = GetContextRef(); if(!context) return; - LockEffectSlotsWrite(context); + LockEffectSlotList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d effect slots", n); + if(n == 0) goto done; + for(i = 0;i < n;i++) { if((slot=LookupEffectSlot(context, effectslots[i])) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", + effectslots[i]); if(ReadRef(&slot->ref) != 0) - SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Deleting in-use effect slot %u", + effectslots[i]); } // All effectslots are valid - if(n > 0) - { - struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, almemory_order_acquire); - struct ALeffectslotArray *newarray = NULL; - ALsizei newcount = curarray->count - n; - ALCdevice *device; - ALsizei j, k; - - assert(newcount >= 0); - newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); - newarray->count = newcount; - for(i = j = 0;i < newarray->count;) - { - slot = curarray->slot[j++]; - for(k = 0;k < n;k++) - { - if(slot->id == effectslots[k]) - break; - } - if(k == n) - newarray->slot[i++] = slot; - } - - newarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, - almemory_order_acq_rel); - device = context->Device; - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - al_free(newarray); - } - + RemoveActiveEffectSlots(effectslots, n, context); for(i = 0;i < n;i++) { - if((slot=RemoveEffectSlot(context, effectslots[i])) == NULL) + if((slot=LookupEffectSlot(context, effectslots[i])) == NULL) continue; - FreeThunkEntry(slot->id); + VECTOR_ELEM(context->EffectSlotList, effectslots[i]-1) = NULL; DeinitEffectSlot(slot); @@ -203,7 +208,7 @@ AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint * } done: - UnlockEffectSlotsWrite(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -215,9 +220,9 @@ AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot) context = GetContextRef(); if(!context) return AL_FALSE; - LockEffectSlotsRead(context); + LockEffectSlotList(context); ret = (LookupEffectSlot(context, effectslot) ? AL_TRUE : AL_FALSE); - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); @@ -235,43 +240,45 @@ AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); - LockEffectSlotsRead(context); + almtx_lock(&context->PropLock); + LockEffectSlotList(context); if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { case AL_EFFECTSLOT_EFFECT: device = context->Device; - LockEffectsRead(device); + LockEffectList(device); effect = (value ? LookupEffect(device, value) : NULL); if(!(value == 0 || effect != NULL)) { - UnlockEffectsRead(device); - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + UnlockEffectList(device); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Invalid effect ID %u", value); } - err = InitializeEffect(device, slot, effect); - UnlockEffectsRead(device); + err = InitializeEffect(context, slot, effect); + UnlockEffectList(device); if(err != AL_NO_ERROR) - SET_ERROR_AND_GOTO(context, err, done); + SETERR_GOTO(context, err, done, "Effect initialization failed"); break; case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: if(!(value == AL_TRUE || value == AL_FALSE)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, + "Effect slot auxiliary send auto out of range"); slot->AuxSendAuto = value; break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid effect slot integer property 0x%04x", + param); } DO_UPDATEPROPS(); done: - UnlockEffectSlotsRead(context); - WriteUnlock(&context->PropLock); + UnlockEffectSlotList(context); + almtx_unlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -290,17 +297,18 @@ AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum para context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if(LookupEffectSlot(context, effectslot) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer-vector property 0x%04x", + param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -312,26 +320,27 @@ AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); - LockEffectSlotsRead(context); + almtx_lock(&context->PropLock); + LockEffectSlotList(context); if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { case AL_EFFECTSLOT_GAIN: if(!(value >= 0.0f && value <= 1.0f)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Effect slot gain out of range"); slot->Gain = value; break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid effect slot float property 0x%04x", + param); } DO_UPDATEPROPS(); done: - UnlockEffectSlotsRead(context); - WriteUnlock(&context->PropLock); + UnlockEffectSlotList(context); + almtx_unlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -349,17 +358,18 @@ AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum para context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if(LookupEffectSlot(context, effectslot) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float-vector property 0x%04x", + param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -371,9 +381,9 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum pa context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { case AL_EFFECTSLOT_AUXILIARY_SEND_AUTO: @@ -381,11 +391,11 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum pa break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer property 0x%04x", param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -404,17 +414,18 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum p context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if(LookupEffectSlot(context, effectslot) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot integer-vector property 0x%04x", + param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -426,9 +437,9 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum pa context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if((slot=LookupEffectSlot(context, effectslot)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { case AL_EFFECTSLOT_GAIN: @@ -436,11 +447,11 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum pa break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float property 0x%04x", param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } @@ -458,54 +469,32 @@ AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum p context = GetContextRef(); if(!context) return; - LockEffectSlotsRead(context); + LockEffectSlotList(context); if(LookupEffectSlot(context, effectslot) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect slot ID %u", effectslot); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid effect slot float-vector property 0x%04x", + param); } done: - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); ALCcontext_DecRef(context); } -void InitEffectFactoryMap(void) -{ - InitUIntMap(&EffectStateFactoryMap, INT_MAX); - - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_NULL, ALnullStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_EAXREVERB, ALreverbStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_REVERB, ALreverbStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_CHORUS, ALchorusStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_COMPRESSOR, ALcompressorStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DISTORTION, ALdistortionStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_ECHO, ALechoStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_EQUALIZER, ALequalizerStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_FLANGER, ALflangerStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_RING_MODULATOR, ALmodulatorStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DEDICATED_DIALOGUE, ALdedicatedStateFactory_getFactory); - InsertUIntMapEntry(&EffectStateFactoryMap, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, ALdedicatedStateFactory_getFactory); -} - -void DeinitEffectFactoryMap(void) -{ - ResetUIntMap(&EffectStateFactoryMap); -} - - -ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *effect) +ALenum InitializeEffect(ALCcontext *Context, ALeffectslot *EffectSlot, ALeffect *effect) { + ALCdevice *Device = Context->Device; ALenum newtype = (effect ? effect->type : AL_EFFECT_NULL); struct ALeffectslotProps *props; ALeffectState *State; if(newtype != EffectSlot->Effect.Type) { - ALeffectStateFactory *factory; + EffectStateFactory *factory; factory = getFactoryByType(newtype); if(!factory) @@ -513,7 +502,7 @@ ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *e ERR("Failed to find factory for effect type 0x%04x\n", newtype); return AL_INVALID_ENUM; } - State = V0(factory,create)(); + State = EffectStateFactory_create(factory); if(!State) return AL_OUT_OF_MEMORY; START_MIXER_MODE(); @@ -548,7 +537,7 @@ ALenum InitializeEffect(ALCdevice *Device, ALeffectslot *EffectSlot, ALeffect *e EffectSlot->Effect.Props = effect->Props; /* Remove state references from old effect slot property updates. */ - props = ATOMIC_LOAD_SEQ(&EffectSlot->FreeList); + props = ATOMIC_LOAD_SEQ(&Context->FreeEffectslotProps); while(props) { if(props->State) @@ -568,7 +557,7 @@ static void ALeffectState_IncRef(ALeffectState *state) TRACEREF("%p increasing refcount to %u\n", state, ref); } -static void ALeffectState_DecRef(ALeffectState *state) +void ALeffectState_DecRef(ALeffectState *state) { uint ref; ref = DecrementRef(&state->Ref); @@ -590,15 +579,103 @@ void ALeffectState_Destruct(ALeffectState *UNUSED(state)) } +static void AddActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context) +{ + struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, + almemory_order_acquire); + struct ALeffectslotArray *newarray = NULL; + ALsizei newcount = curarray->count + count; + ALCdevice *device = context->Device; + ALsizei i, j; + + /* Insert the new effect slots into the head of the array, followed by the + * existing ones. + */ + newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); + newarray->count = newcount; + for(i = 0;i < count;i++) + newarray->slot[i] = LookupEffectSlot(context, slotids[i]); + for(j = 0;i < newcount;) + newarray->slot[i++] = curarray->slot[j++]; + /* Remove any duplicates (first instance of each will be kept). */ + for(i = 1;i < newcount;i++) + { + for(j = i;j != 0;) + { + if(UNLIKELY(newarray->slot[i] == newarray->slot[--j])) + { + newcount--; + for(j = i;j < newcount;j++) + newarray->slot[j] = newarray->slot[j+1]; + i--; + break; + } + } + } + + /* Reallocate newarray if the new size ended up smaller from duplicate + * removal. + */ + if(UNLIKELY(newcount < newarray->count)) + { + struct ALeffectslotArray *tmpnewarray = al_calloc(DEF_ALIGN, + FAM_SIZE(struct ALeffectslotArray, slot, newcount)); + memcpy(tmpnewarray, newarray, FAM_SIZE(struct ALeffectslotArray, slot, newcount)); + al_free(newarray); + newarray = tmpnewarray; + newarray->count = newcount; + } + + curarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, almemory_order_acq_rel); + while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) + althrd_yield(); + al_free(curarray); +} + +static void RemoveActiveEffectSlots(const ALuint *slotids, ALsizei count, ALCcontext *context) +{ + struct ALeffectslotArray *curarray = ATOMIC_LOAD(&context->ActiveAuxSlots, + almemory_order_acquire); + struct ALeffectslotArray *newarray = NULL; + ALCdevice *device = context->Device; + ALsizei i, j; + + /* Don't shrink the allocated array size since we don't know how many (if + * any) of the effect slots to remove are in the array. + */ + newarray = al_calloc(DEF_ALIGN, FAM_SIZE(struct ALeffectslotArray, slot, curarray->count)); + newarray->count = 0; + for(i = 0;i < curarray->count;i++) + { + /* Insert this slot into the new array only if it's not one to remove. */ + ALeffectslot *slot = curarray->slot[i]; + for(j = count;j != 0;) + { + if(slot->id == slotids[--j]) + goto skip_ins; + } + newarray->slot[newarray->count++] = slot; + skip_ins: ; + } + + /* TODO: Could reallocate newarray now that we know it's needed size. */ + + curarray = ATOMIC_EXCHANGE_PTR(&context->ActiveAuxSlots, newarray, almemory_order_acq_rel); + while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) + althrd_yield(); + al_free(curarray); +} + + ALenum InitEffectSlot(ALeffectslot *slot) { - ALeffectStateFactory *factory; + EffectStateFactory *factory; slot->Effect.Type = AL_EFFECT_NULL; factory = getFactoryByType(AL_EFFECT_NULL); - if(!(slot->Effect.State=V0(factory,create)())) - return AL_OUT_OF_MEMORY; + slot->Effect.State = EffectStateFactory_create(factory); + if(!slot->Effect.State) return AL_OUT_OF_MEMORY; slot->Gain = 1.0; slot->AuxSendAuto = AL_TRUE; @@ -606,7 +683,6 @@ ALenum InitEffectSlot(ALeffectslot *slot) InitRef(&slot->ref, 0); ATOMIC_INIT(&slot->Update, NULL); - ATOMIC_INIT(&slot->FreeList, NULL); slot->Params.Gain = 1.0f; slot->Params.AuxSendAuto = AL_TRUE; @@ -614,6 +690,7 @@ ALenum InitEffectSlot(ALeffectslot *slot) slot->Params.EffectState = slot->Effect.State; slot->Params.RoomRolloff = 0.0f; slot->Params.DecayTime = 0.0f; + slot->Params.DecayLFRatio = 0.0f; slot->Params.DecayHFRatio = 0.0f; slot->Params.DecayHFLimit = AL_FALSE; slot->Params.AirAbsorptionGainHF = 1.0f; @@ -624,7 +701,6 @@ ALenum InitEffectSlot(ALeffectslot *slot) void DeinitEffectSlot(ALeffectslot *slot) { struct ALeffectslotProps *props; - size_t count = 0; props = ATOMIC_LOAD_SEQ(&slot->Update); if(props) @@ -633,29 +709,19 @@ void DeinitEffectSlot(ALeffectslot *slot) TRACE("Freed unapplied AuxiliaryEffectSlot update %p\n", props); al_free(props); } - props = ATOMIC_LOAD(&slot->FreeList, almemory_order_relaxed); - while(props) - { - struct ALeffectslotProps *next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - if(props->State) ALeffectState_DecRef(props->State); - al_free(props); - props = next; - ++count; - } - TRACE("Freed "SZFMT" AuxiliaryEffectSlot property object%s\n", count, (count==1)?"":"s"); ALeffectState_DecRef(slot->Effect.State); if(slot->Params.EffectState) ALeffectState_DecRef(slot->Params.EffectState); } -void UpdateEffectSlotProps(ALeffectslot *slot) +void UpdateEffectSlotProps(ALeffectslot *slot, ALCcontext *context) { struct ALeffectslotProps *props; ALeffectState *oldstate; /* Get an unused property container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&slot->FreeList, almemory_order_relaxed); + props = ATOMIC_LOAD(&context->FreeEffectslotProps, almemory_order_relaxed); if(!props) props = al_calloc(16, sizeof(*props)); else @@ -663,7 +729,7 @@ void UpdateEffectSlotProps(ALeffectslot *slot) struct ALeffectslotProps *next; do { next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&slot->FreeList, &props, next, + } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeEffectslotProps, &props, next, almemory_order_seq_cst, almemory_order_acquire) == 0); } @@ -687,7 +753,10 @@ void UpdateEffectSlotProps(ALeffectslot *slot) /* If there was an unused update container, put it back in the * freelist. */ - ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &slot->FreeList, props); + if(props->State) + ALeffectState_DecRef(props->State); + props->State = NULL; + ATOMIC_REPLACE_HEAD(struct ALeffectslotProps*, &context->FreeEffectslotProps, props); } if(oldstate) @@ -699,29 +768,35 @@ void UpdateAllEffectSlotProps(ALCcontext *context) struct ALeffectslotArray *auxslots; ALsizei i; - LockEffectSlotsRead(context); + LockEffectSlotList(context); auxslots = ATOMIC_LOAD(&context->ActiveAuxSlots, almemory_order_acquire); for(i = 0;i < auxslots->count;i++) { ALeffectslot *slot = auxslots->slot[i]; if(!ATOMIC_FLAG_TEST_AND_SET(&slot->PropsClean, almemory_order_acq_rel)) - UpdateEffectSlotProps(slot); + UpdateEffectSlotProps(slot, context); } - UnlockEffectSlotsRead(context); + UnlockEffectSlotList(context); } -ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *Context) +ALvoid ReleaseALAuxiliaryEffectSlots(ALCcontext *context) { - ALsizei pos; - for(pos = 0;pos < Context->EffectSlotMap.size;pos++) + ALeffectslotPtr *iter = VECTOR_BEGIN(context->EffectSlotList); + ALeffectslotPtr *end = VECTOR_END(context->EffectSlotList); + size_t leftover = 0; + + for(;iter != end;iter++) { - ALeffectslot *temp = Context->EffectSlotMap.values[pos]; - Context->EffectSlotMap.values[pos] = NULL; + ALeffectslot *slot = *iter; + if(!slot) continue; + *iter = NULL; - DeinitEffectSlot(temp); + DeinitEffectSlot(slot); - FreeThunkEntry(temp->id); - memset(temp, 0, sizeof(ALeffectslot)); - al_free(temp); + memset(slot, 0, sizeof(*slot)); + al_free(slot); + ++leftover; } + if(leftover > 0) + WARN("(%p) Deleted "SZFMT" AuxiliaryEffectSlot%s\n", context, leftover, (leftover==1)?"":"s"); } diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/alBuffer.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alBuffer.c new file mode 100644 index 00000000..ed712434 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alBuffer.c @@ -0,0 +1,1305 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_MALLOC_H +#include +#endif + +#include "alMain.h" +#include "alu.h" +#include "alError.h" +#include "alBuffer.h" +#include "sample_cvt.h" + + +extern inline void LockBufferList(ALCdevice *device); +extern inline void UnlockBufferList(ALCdevice *device); +extern inline ALsizei FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type); +extern inline ALsizei FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type); + +static ALbuffer *AllocBuffer(ALCcontext *context); +static void FreeBuffer(ALCdevice *device, ALbuffer *buffer); +static const ALchar *NameFromUserFmtType(enum UserFmtType type); +static void LoadData(ALCcontext *context, ALbuffer *buffer, ALuint freq, ALsizei size, + enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, + const ALvoid *data, ALbitfieldSOFT access); +static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, enum UserFmtType *type); +static ALsizei SanitizeAlignment(enum UserFmtType type, ALsizei align); + +static inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) +{ + BufferSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->BufferList))) + return NULL; + sublist = &VECTOR_ELEM(device->BufferList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Buffers + slidx; +} + + +#define INVALID_STORAGE_MASK ~(AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT | AL_PRESERVE_DATA_BIT_SOFT | AL_MAP_PERSISTENT_BIT_SOFT) +#define MAP_READ_WRITE_FLAGS (AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT) +#define INVALID_MAP_FLAGS ~(AL_MAP_READ_BIT_SOFT | AL_MAP_WRITE_BIT_SOFT | AL_MAP_PERSISTENT_BIT_SOFT) + + +AL_API ALvoid AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers) +{ + ALCcontext *context; + ALsizei cur = 0; + + context = GetContextRef(); + if(!context) return; + + if(!(n >= 0)) + alSetError(context, AL_INVALID_VALUE, "Generating %d buffers", n); + else for(cur = 0;cur < n;cur++) + { + ALbuffer *buffer = AllocBuffer(context); + if(!buffer) + { + alDeleteBuffers(cur, buffers); + break; + } + + buffers[cur] = buffer->id; + } + + ALCcontext_DecRef(context); +} + +AL_API ALvoid AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *ALBuf; + ALsizei i; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + + LockBufferList(device); + if(UNLIKELY(n < 0)) + { + alSetError(context, AL_INVALID_VALUE, "Deleting %d buffers", n); + goto done; + } + + for(i = 0;i < n;i++) + { + if(!buffers[i]) + continue; + + /* Check for valid Buffer ID, and make sure it's not in use. */ + if((ALBuf=LookupBuffer(device, buffers[i])) == NULL) + { + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffers[i]); + goto done; + } + if(ReadRef(&ALBuf->ref) != 0) + { + alSetError(context, AL_INVALID_OPERATION, "Deleting in-use buffer %u", buffers[i]); + goto done; + } + } + for(i = 0;i < n;i++) + { + if((ALBuf=LookupBuffer(device, buffers[i])) != NULL) + FreeBuffer(device, ALBuf); + } + +done: + UnlockBufferList(device); + ALCcontext_DecRef(context); +} + +AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer) +{ + ALCcontext *context; + ALboolean ret; + + context = GetContextRef(); + if(!context) return AL_FALSE; + + LockBufferList(context->Device); + ret = ((!buffer || LookupBuffer(context->Device, buffer)) ? + AL_TRUE : AL_FALSE); + UnlockBufferList(context->Device); + + ALCcontext_DecRef(context); + + return ret; +} + + +AL_API ALvoid AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq) +{ alBufferStorageSOFT(buffer, format, data, size, freq, 0); } + +AL_API void AL_APIENTRY alBufferStorageSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq, ALbitfieldSOFT flags) +{ + enum UserFmtChannels srcchannels = UserFmtMono; + enum UserFmtType srctype = UserFmtUByte; + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(size < 0)) + alSetError(context, AL_INVALID_VALUE, "Negative storage size %d", size); + else if(UNLIKELY(freq < 1)) + alSetError(context, AL_INVALID_VALUE, "Invalid sample rate %d", freq); + else if(UNLIKELY((flags&INVALID_STORAGE_MASK) != 0)) + alSetError(context, AL_INVALID_VALUE, "Invalid storage flags 0x%x", + flags&INVALID_STORAGE_MASK); + else if(UNLIKELY((flags&AL_MAP_PERSISTENT_BIT_SOFT) && !(flags&MAP_READ_WRITE_FLAGS))) + alSetError(context, AL_INVALID_VALUE, + "Declaring persistently mapped storage without read or write access"); + else if(UNLIKELY(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE)) + alSetError(context, AL_INVALID_ENUM, "Invalid format 0x%04x", format); + else + LoadData(context, albuf, freq, size, srcchannels, srctype, data, flags); + + UnlockBufferList(device); + ALCcontext_DecRef(context); +} + +AL_API void* AL_APIENTRY alMapBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length, ALbitfieldSOFT access) +{ + void *retval = NULL; + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return retval; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY((access&INVALID_MAP_FLAGS) != 0)) + alSetError(context, AL_INVALID_VALUE, "Invalid map flags 0x%x", access&INVALID_MAP_FLAGS); + else if(UNLIKELY(!(access&MAP_READ_WRITE_FLAGS))) + alSetError(context, AL_INVALID_VALUE, "Mapping buffer %u without read or write access", + buffer); + else + { + ALbitfieldSOFT unavailable = (albuf->Access^access) & access; + if(UNLIKELY(ReadRef(&albuf->ref) != 0 && !(access&AL_MAP_PERSISTENT_BIT_SOFT))) + alSetError(context, AL_INVALID_OPERATION, + "Mapping in-use buffer %u without persistent mapping", buffer); + else if(UNLIKELY(albuf->MappedAccess != 0)) + alSetError(context, AL_INVALID_OPERATION, "Mapping already-mapped buffer %u", buffer); + else if(UNLIKELY((unavailable&AL_MAP_READ_BIT_SOFT))) + alSetError(context, AL_INVALID_VALUE, + "Mapping buffer %u for reading without read access", buffer); + else if(UNLIKELY((unavailable&AL_MAP_WRITE_BIT_SOFT))) + alSetError(context, AL_INVALID_VALUE, + "Mapping buffer %u for writing without write access", buffer); + else if(UNLIKELY((unavailable&AL_MAP_PERSISTENT_BIT_SOFT))) + alSetError(context, AL_INVALID_VALUE, + "Mapping buffer %u persistently without persistent access", buffer); + else if(UNLIKELY(offset < 0 || offset >= albuf->OriginalSize || + length <= 0 || length > albuf->OriginalSize - offset)) + alSetError(context, AL_INVALID_VALUE, "Mapping invalid range %d+%d for buffer %u", + offset, length, buffer); + else + { + retval = (ALbyte*)albuf->data + offset; + albuf->MappedAccess = access; + albuf->MappedOffset = offset; + albuf->MappedSize = length; + } + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); + return retval; +} + +AL_API void AL_APIENTRY alUnmapBufferSOFT(ALuint buffer) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if((albuf=LookupBuffer(device, buffer)) == NULL) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(albuf->MappedAccess == 0) + alSetError(context, AL_INVALID_OPERATION, "Unmapping unmapped buffer %u", buffer); + else + { + albuf->MappedAccess = 0; + albuf->MappedOffset = 0; + albuf->MappedSize = 0; + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alFlushMappedBufferSOFT(ALuint buffer, ALsizei offset, ALsizei length) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!(albuf->MappedAccess&AL_MAP_WRITE_BIT_SOFT))) + alSetError(context, AL_INVALID_OPERATION, + "Flushing buffer %u while not mapped for writing", buffer); + else if(UNLIKELY(offset < albuf->MappedOffset || + offset >= albuf->MappedOffset+albuf->MappedSize || + length <= 0 || length > albuf->MappedOffset+albuf->MappedSize-offset)) + alSetError(context, AL_INVALID_VALUE, "Flushing invalid range %d+%d on buffer %u", + offset, length, buffer); + else + { + /* FIXME: Need to use some method of double-buffering for the mixer and + * app to hold separate memory, which can be safely transfered + * asynchronously. Currently we just say the app shouldn't write where + * OpenAL's reading, and hope for the best... + */ + ATOMIC_THREAD_FENCE(almemory_order_seq_cst); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + +AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer, ALenum format, const ALvoid *data, ALsizei offset, ALsizei length) +{ + enum UserFmtChannels srcchannels = UserFmtMono; + enum UserFmtType srctype = UserFmtUByte; + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(DecomposeUserFormat(format, &srcchannels, &srctype) == AL_FALSE)) + alSetError(context, AL_INVALID_ENUM, "Invalid format 0x%04x", format); + else + { + ALsizei unpack_align, align; + ALsizei byte_align; + ALsizei frame_size; + ALsizei num_chans; + void *dst; + + unpack_align = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); + align = SanitizeAlignment(srctype, unpack_align); + if(UNLIKELY(align < 1)) + alSetError(context, AL_INVALID_VALUE, "Invalid unpack alignment %d", unpack_align); + else if(UNLIKELY((long)srcchannels != (long)albuf->FmtChannels || + srctype != albuf->OriginalType)) + alSetError(context, AL_INVALID_ENUM, "Unpacking data with mismatched format"); + else if(UNLIKELY(align != albuf->OriginalAlign)) + alSetError(context, AL_INVALID_VALUE, + "Unpacking data with alignment %u does not match original alignment %u", + align, albuf->OriginalAlign); + else if(UNLIKELY(albuf->MappedAccess != 0)) + alSetError(context, AL_INVALID_OPERATION, "Unpacking data into mapped buffer %u", + buffer); + else + { + num_chans = ChannelsFromFmt(albuf->FmtChannels); + frame_size = num_chans * BytesFromFmt(albuf->FmtType); + if(albuf->OriginalType == UserFmtIMA4) + byte_align = ((align-1)/2 + 4) * num_chans; + else if(albuf->OriginalType == UserFmtMSADPCM) + byte_align = ((align-2)/2 + 7) * num_chans; + else + byte_align = align * frame_size; + + if(UNLIKELY(offset < 0 || length < 0 || offset > albuf->OriginalSize || + length > albuf->OriginalSize-offset)) + alSetError(context, AL_INVALID_VALUE, "Invalid data sub-range %d+%d on buffer %u", + offset, length, buffer); + else if(UNLIKELY((offset%byte_align) != 0)) + alSetError(context, AL_INVALID_VALUE, + "Sub-range offset %d is not a multiple of frame size %d (%d unpack alignment)", + offset, byte_align, align); + else if(UNLIKELY((length%byte_align) != 0)) + alSetError(context, AL_INVALID_VALUE, + "Sub-range length %d is not a multiple of frame size %d (%d unpack alignment)", + length, byte_align, align); + else + { + /* offset -> byte offset, length -> sample count */ + offset = offset/byte_align * align * frame_size; + length = length/byte_align * align; + + dst = (ALbyte*)albuf->data + offset; + if(srctype == UserFmtIMA4 && albuf->FmtType == FmtShort) + Convert_ALshort_ALima4(dst, data, num_chans, length, align); + else if(srctype == UserFmtMSADPCM && albuf->FmtType == FmtShort) + Convert_ALshort_ALmsadpcm(dst, data, num_chans, length, align); + else + { + assert((long)srctype == (long)albuf->FmtType); + memcpy(dst, data, length*frame_size); + } + } + } + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBufferSamplesSOFT(ALuint UNUSED(buffer), + ALuint UNUSED(samplerate), ALenum UNUSED(internalformat), ALsizei UNUSED(samples), + ALenum UNUSED(channels), ALenum UNUSED(type), const ALvoid *UNUSED(data)) +{ + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + alSetError(context, AL_INVALID_OPERATION, "alBufferSamplesSOFT not supported"); + + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alBufferSubSamplesSOFT(ALuint UNUSED(buffer), + ALsizei UNUSED(offset), ALsizei UNUSED(samples), + ALenum UNUSED(channels), ALenum UNUSED(type), const ALvoid *UNUSED(data)) +{ + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + alSetError(context, AL_INVALID_OPERATION, "alBufferSubSamplesSOFT not supported"); + + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alGetBufferSamplesSOFT(ALuint UNUSED(buffer), + ALsizei UNUSED(offset), ALsizei UNUSED(samples), + ALenum UNUSED(channels), ALenum UNUSED(type), ALvoid *UNUSED(data)) +{ + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + alSetError(context, AL_INVALID_OPERATION, "alGetBufferSamplesSOFT not supported"); + + ALCcontext_DecRef(context); +} + +AL_API ALboolean AL_APIENTRY alIsBufferFormatSupportedSOFT(ALenum UNUSED(format)) +{ + ALCcontext *context; + + context = GetContextRef(); + if(!context) return AL_FALSE; + + alSetError(context, AL_INVALID_OPERATION, "alIsBufferFormatSupportedSOFT not supported"); + + ALCcontext_DecRef(context); + return AL_FALSE; +} + + +AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat UNUSED(value)) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat UNUSED(value1), ALfloat UNUSED(value2), ALfloat UNUSED(value3)) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!values)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + if(UNLIKELY(value < 0)) + alSetError(context, AL_INVALID_VALUE, "Invalid unpack block alignment %d", value); + else + ATOMIC_STORE_SEQ(&albuf->UnpackAlign, value); + break; + + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + if(UNLIKELY(value < 0)) + alSetError(context, AL_INVALID_VALUE, "Invalid pack block alignment %d", value); + else + ATOMIC_STORE_SEQ(&albuf->PackAlign, value); + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint UNUSED(value1), ALint UNUSED(value2), ALint UNUSED(value3)) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + if(values) + { + switch(param) + { + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + alBufferi(buffer, param, values[0]); + return; + } + } + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!values)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_LOOP_POINTS_SOFT: + if(UNLIKELY(ReadRef(&albuf->ref) != 0)) + alSetError(context, AL_INVALID_OPERATION, "Modifying in-use buffer %u's loop points", + buffer); + else if(UNLIKELY(values[0] >= values[1] || values[0] < 0 || values[1] > albuf->SampleLen)) + alSetError(context, AL_INVALID_VALUE, "Invalid loop point range %d -> %d o buffer %u", + values[0], values[1], buffer); + else + { + albuf->LoopStart = values[0]; + albuf->LoopEnd = values[1]; + } + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", + param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API ALvoid AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!value)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer float property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!value1 || !value2 || !value3)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-float property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values) +{ + ALCdevice *device; + ALCcontext *context; + + switch(param) + { + case AL_SEC_LENGTH_SOFT: + alGetBufferf(buffer, param, values); + return; + } + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!values)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer float-vector property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API ALvoid AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!value)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_FREQUENCY: + *value = albuf->Frequency; + break; + + case AL_BITS: + *value = BytesFromFmt(albuf->FmtType) * 8; + break; + + case AL_CHANNELS: + *value = ChannelsFromFmt(albuf->FmtChannels); + break; + + case AL_SIZE: + *value = albuf->SampleLen * FrameSizeFromFmt(albuf->FmtChannels, + albuf->FmtType); + break; + + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + *value = ATOMIC_LOAD_SEQ(&albuf->UnpackAlign); + break; + + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + *value = ATOMIC_LOAD_SEQ(&albuf->PackAlign); + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3) +{ + ALCdevice *device; + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY(LookupBuffer(device, buffer) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!value1 || !value2 || !value3)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer 3-integer property 0x%04x", param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values) +{ + ALCdevice *device; + ALCcontext *context; + ALbuffer *albuf; + + switch(param) + { + case AL_FREQUENCY: + case AL_BITS: + case AL_CHANNELS: + case AL_SIZE: + case AL_INTERNAL_FORMAT_SOFT: + case AL_BYTE_LENGTH_SOFT: + case AL_SAMPLE_LENGTH_SOFT: + case AL_UNPACK_BLOCK_ALIGNMENT_SOFT: + case AL_PACK_BLOCK_ALIGNMENT_SOFT: + alGetBufferi(buffer, param, values); + return; + } + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockBufferList(device); + if(UNLIKELY((albuf=LookupBuffer(device, buffer)) == NULL)) + alSetError(context, AL_INVALID_NAME, "Invalid buffer ID %u", buffer); + else if(UNLIKELY(!values)) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) + { + case AL_LOOP_POINTS_SOFT: + values[0] = albuf->LoopStart; + values[1] = albuf->LoopEnd; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid buffer integer-vector property 0x%04x", + param); + } + UnlockBufferList(device); + + ALCcontext_DecRef(context); +} + + +static const ALchar *NameFromUserFmtType(enum UserFmtType type) +{ + switch(type) + { + case UserFmtUByte: return "Unsigned Byte"; + case UserFmtShort: return "Signed Short"; + case UserFmtFloat: return "Float32"; + case UserFmtDouble: return "Float64"; + case UserFmtMulaw: return "muLaw"; + case UserFmtAlaw: return "aLaw"; + case UserFmtIMA4: return "IMA4 ADPCM"; + case UserFmtMSADPCM: return "MSADPCM"; + } + return ""; +} + +/* + * LoadData + * + * Loads the specified data into the buffer, using the specified format. + */ +static void LoadData(ALCcontext *context, ALbuffer *ALBuf, ALuint freq, ALsizei size, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALbitfieldSOFT access) +{ + enum FmtChannels DstChannels = FmtMono; + enum FmtType DstType = FmtUByte; + ALsizei NumChannels, FrameSize; + ALsizei SrcByteAlign; + ALsizei unpackalign; + ALsizei newsize; + ALsizei frames; + ALsizei align; + + if(UNLIKELY(ReadRef(&ALBuf->ref) != 0 || ALBuf->MappedAccess != 0)) + SETERR_RETURN(context, AL_INVALID_OPERATION,, "Modifying storage for in-use buffer %u", + ALBuf->id); + + /* Currently no channel configurations need to be converted. */ + switch(SrcChannels) + { + case UserFmtMono: DstChannels = FmtMono; break; + case UserFmtStereo: DstChannels = FmtStereo; break; + case UserFmtRear: DstChannels = FmtRear; break; + case UserFmtQuad: DstChannels = FmtQuad; break; + case UserFmtX51: DstChannels = FmtX51; break; + case UserFmtX61: DstChannels = FmtX61; break; + case UserFmtX71: DstChannels = FmtX71; break; + case UserFmtBFormat2D: DstChannels = FmtBFormat2D; break; + case UserFmtBFormat3D: DstChannels = FmtBFormat3D; break; + } + if(UNLIKELY((long)SrcChannels != (long)DstChannels)) + SETERR_RETURN(context, AL_INVALID_ENUM,, "Invalid format"); + + /* IMA4 and MSADPCM convert to 16-bit short. */ + switch(SrcType) + { + case UserFmtUByte: DstType = FmtUByte; break; + case UserFmtShort: DstType = FmtShort; break; + case UserFmtFloat: DstType = FmtFloat; break; + case UserFmtDouble: DstType = FmtDouble; break; + case UserFmtAlaw: DstType = FmtAlaw; break; + case UserFmtMulaw: DstType = FmtMulaw; break; + case UserFmtIMA4: DstType = FmtShort; break; + case UserFmtMSADPCM: DstType = FmtShort; break; + } + + /* TODO: Currently we can only map samples when they're not converted. To + * allow it would need some kind of double-buffering to hold onto a copy of + * the original data. + */ + if((access&MAP_READ_WRITE_FLAGS)) + { + if(UNLIKELY((long)SrcType != (long)DstType)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "%s samples cannot be mapped", + NameFromUserFmtType(SrcType)); + } + + unpackalign = ATOMIC_LOAD_SEQ(&ALBuf->UnpackAlign); + if(UNLIKELY((align=SanitizeAlignment(SrcType, unpackalign)) < 1)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Invalid unpack alignment %d for %s samples", + unpackalign, NameFromUserFmtType(SrcType)); + + if((access&AL_PRESERVE_DATA_BIT_SOFT)) + { + /* Can only preserve data with the same format and alignment. */ + if(UNLIKELY(ALBuf->FmtChannels != DstChannels || ALBuf->OriginalType != SrcType)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched format"); + if(UNLIKELY(ALBuf->OriginalAlign != align)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Preserving data of mismatched alignment"); + } + + /* Convert the input/source size in bytes to sample frames using the unpack + * block alignment. + */ + if(SrcType == UserFmtIMA4) + SrcByteAlign = ((align-1)/2 + 4) * ChannelsFromUserFmt(SrcChannels); + else if(SrcType == UserFmtMSADPCM) + SrcByteAlign = ((align-2)/2 + 7) * ChannelsFromUserFmt(SrcChannels); + else + SrcByteAlign = align * FrameSizeFromUserFmt(SrcChannels, SrcType); + if(UNLIKELY((size%SrcByteAlign) != 0)) + SETERR_RETURN(context, AL_INVALID_VALUE,, + "Data size %d is not a multiple of frame size %d (%d unpack alignment)", + size, SrcByteAlign, align); + + if(UNLIKELY(size / SrcByteAlign > INT_MAX / align)) + SETERR_RETURN(context, AL_OUT_OF_MEMORY,, + "Buffer size overflow, %d blocks x %d samples per block", size/SrcByteAlign, align); + frames = size / SrcByteAlign * align; + + /* Convert the sample frames to the number of bytes needed for internal + * storage. + */ + NumChannels = ChannelsFromFmt(DstChannels); + FrameSize = NumChannels * BytesFromFmt(DstType); + if(UNLIKELY(frames > INT_MAX/FrameSize)) + SETERR_RETURN(context, AL_OUT_OF_MEMORY,, + "Buffer size overflow, %d frames x %d bytes per frame", frames, FrameSize); + newsize = frames*FrameSize; + + /* Round up to the next 16-byte multiple. This could reallocate only when + * increasing or the new size is less than half the current, but then the + * buffer's AL_SIZE would not be very reliable for accounting buffer memory + * usage, and reporting the real size could cause problems for apps that + * use AL_SIZE to try to get the buffer's play length. + */ + if(LIKELY(newsize <= INT_MAX-15)) + newsize = (newsize+15) & ~0xf; + if(newsize != ALBuf->BytesAlloc) + { + void *temp = al_malloc(16, (size_t)newsize); + if(UNLIKELY(!temp && newsize)) + SETERR_RETURN(context, AL_OUT_OF_MEMORY,, "Failed to allocate %d bytes of storage", + newsize); + if((access&AL_PRESERVE_DATA_BIT_SOFT)) + { + ALsizei tocopy = mini(newsize, ALBuf->BytesAlloc); + if(tocopy > 0) memcpy(temp, ALBuf->data, tocopy); + } + al_free(ALBuf->data); + ALBuf->data = temp; + ALBuf->BytesAlloc = newsize; + } + + if(SrcType == UserFmtIMA4) + { + assert(DstType == FmtShort); + if(data != NULL && ALBuf->data != NULL) + Convert_ALshort_ALima4(ALBuf->data, data, NumChannels, frames, align); + ALBuf->OriginalAlign = align; + } + else if(SrcType == UserFmtMSADPCM) + { + assert(DstType == FmtShort); + if(data != NULL && ALBuf->data != NULL) + Convert_ALshort_ALmsadpcm(ALBuf->data, data, NumChannels, frames, align); + ALBuf->OriginalAlign = align; + } + else + { + assert((long)SrcType == (long)DstType); + if(data != NULL && ALBuf->data != NULL) + memcpy(ALBuf->data, data, frames*FrameSize); + ALBuf->OriginalAlign = 1; + } + ALBuf->OriginalSize = size; + ALBuf->OriginalType = SrcType; + + ALBuf->Frequency = freq; + ALBuf->FmtChannels = DstChannels; + ALBuf->FmtType = DstType; + ALBuf->Access = access; + + ALBuf->SampleLen = frames; + ALBuf->LoopStart = 0; + ALBuf->LoopEnd = ALBuf->SampleLen; +} + + +ALsizei BytesFromUserFmt(enum UserFmtType type) +{ + switch(type) + { + case UserFmtUByte: return sizeof(ALubyte); + case UserFmtShort: return sizeof(ALshort); + case UserFmtFloat: return sizeof(ALfloat); + case UserFmtDouble: return sizeof(ALdouble); + case UserFmtMulaw: return sizeof(ALubyte); + case UserFmtAlaw: return sizeof(ALubyte); + case UserFmtIMA4: break; /* not handled here */ + case UserFmtMSADPCM: break; /* not handled here */ + } + return 0; +} +ALsizei ChannelsFromUserFmt(enum UserFmtChannels chans) +{ + switch(chans) + { + case UserFmtMono: return 1; + case UserFmtStereo: return 2; + case UserFmtRear: return 2; + case UserFmtQuad: return 4; + case UserFmtX51: return 6; + case UserFmtX61: return 7; + case UserFmtX71: return 8; + case UserFmtBFormat2D: return 3; + case UserFmtBFormat3D: return 4; + } + return 0; +} +static ALboolean DecomposeUserFormat(ALenum format, enum UserFmtChannels *chans, + enum UserFmtType *type) +{ + static const struct { + ALenum format; + enum UserFmtChannels channels; + enum UserFmtType type; + } list[] = { + { AL_FORMAT_MONO8, UserFmtMono, UserFmtUByte }, + { AL_FORMAT_MONO16, UserFmtMono, UserFmtShort }, + { AL_FORMAT_MONO_FLOAT32, UserFmtMono, UserFmtFloat }, + { AL_FORMAT_MONO_DOUBLE_EXT, UserFmtMono, UserFmtDouble }, + { AL_FORMAT_MONO_IMA4, UserFmtMono, UserFmtIMA4 }, + { AL_FORMAT_MONO_MSADPCM_SOFT, UserFmtMono, UserFmtMSADPCM }, + { AL_FORMAT_MONO_MULAW, UserFmtMono, UserFmtMulaw }, + { AL_FORMAT_MONO_ALAW_EXT, UserFmtMono, UserFmtAlaw }, + + { AL_FORMAT_STEREO8, UserFmtStereo, UserFmtUByte }, + { AL_FORMAT_STEREO16, UserFmtStereo, UserFmtShort }, + { AL_FORMAT_STEREO_FLOAT32, UserFmtStereo, UserFmtFloat }, + { AL_FORMAT_STEREO_DOUBLE_EXT, UserFmtStereo, UserFmtDouble }, + { AL_FORMAT_STEREO_IMA4, UserFmtStereo, UserFmtIMA4 }, + { AL_FORMAT_STEREO_MSADPCM_SOFT, UserFmtStereo, UserFmtMSADPCM }, + { AL_FORMAT_STEREO_MULAW, UserFmtStereo, UserFmtMulaw }, + { AL_FORMAT_STEREO_ALAW_EXT, UserFmtStereo, UserFmtAlaw }, + + { AL_FORMAT_REAR8, UserFmtRear, UserFmtUByte }, + { AL_FORMAT_REAR16, UserFmtRear, UserFmtShort }, + { AL_FORMAT_REAR32, UserFmtRear, UserFmtFloat }, + { AL_FORMAT_REAR_MULAW, UserFmtRear, UserFmtMulaw }, + + { AL_FORMAT_QUAD8_LOKI, UserFmtQuad, UserFmtUByte }, + { AL_FORMAT_QUAD16_LOKI, UserFmtQuad, UserFmtShort }, + + { AL_FORMAT_QUAD8, UserFmtQuad, UserFmtUByte }, + { AL_FORMAT_QUAD16, UserFmtQuad, UserFmtShort }, + { AL_FORMAT_QUAD32, UserFmtQuad, UserFmtFloat }, + { AL_FORMAT_QUAD_MULAW, UserFmtQuad, UserFmtMulaw }, + + { AL_FORMAT_51CHN8, UserFmtX51, UserFmtUByte }, + { AL_FORMAT_51CHN16, UserFmtX51, UserFmtShort }, + { AL_FORMAT_51CHN32, UserFmtX51, UserFmtFloat }, + { AL_FORMAT_51CHN_MULAW, UserFmtX51, UserFmtMulaw }, + + { AL_FORMAT_61CHN8, UserFmtX61, UserFmtUByte }, + { AL_FORMAT_61CHN16, UserFmtX61, UserFmtShort }, + { AL_FORMAT_61CHN32, UserFmtX61, UserFmtFloat }, + { AL_FORMAT_61CHN_MULAW, UserFmtX61, UserFmtMulaw }, + + { AL_FORMAT_71CHN8, UserFmtX71, UserFmtUByte }, + { AL_FORMAT_71CHN16, UserFmtX71, UserFmtShort }, + { AL_FORMAT_71CHN32, UserFmtX71, UserFmtFloat }, + { AL_FORMAT_71CHN_MULAW, UserFmtX71, UserFmtMulaw }, + + { AL_FORMAT_BFORMAT2D_8, UserFmtBFormat2D, UserFmtUByte }, + { AL_FORMAT_BFORMAT2D_16, UserFmtBFormat2D, UserFmtShort }, + { AL_FORMAT_BFORMAT2D_FLOAT32, UserFmtBFormat2D, UserFmtFloat }, + { AL_FORMAT_BFORMAT2D_MULAW, UserFmtBFormat2D, UserFmtMulaw }, + + { AL_FORMAT_BFORMAT3D_8, UserFmtBFormat3D, UserFmtUByte }, + { AL_FORMAT_BFORMAT3D_16, UserFmtBFormat3D, UserFmtShort }, + { AL_FORMAT_BFORMAT3D_FLOAT32, UserFmtBFormat3D, UserFmtFloat }, + { AL_FORMAT_BFORMAT3D_MULAW, UserFmtBFormat3D, UserFmtMulaw }, + }; + ALuint i; + + for(i = 0;i < COUNTOF(list);i++) + { + if(list[i].format == format) + { + *chans = list[i].channels; + *type = list[i].type; + return AL_TRUE; + } + } + + return AL_FALSE; +} + +ALsizei BytesFromFmt(enum FmtType type) +{ + switch(type) + { + case FmtUByte: return sizeof(ALubyte); + case FmtShort: return sizeof(ALshort); + case FmtFloat: return sizeof(ALfloat); + case FmtDouble: return sizeof(ALdouble); + case FmtMulaw: return sizeof(ALubyte); + case FmtAlaw: return sizeof(ALubyte); + } + return 0; +} +ALsizei ChannelsFromFmt(enum FmtChannels chans) +{ + switch(chans) + { + case FmtMono: return 1; + case FmtStereo: return 2; + case FmtRear: return 2; + case FmtQuad: return 4; + case FmtX51: return 6; + case FmtX61: return 7; + case FmtX71: return 8; + case FmtBFormat2D: return 3; + case FmtBFormat3D: return 4; + } + return 0; +} + +static ALsizei SanitizeAlignment(enum UserFmtType type, ALsizei align) +{ + if(align < 0) + return 0; + + if(align == 0) + { + if(type == UserFmtIMA4) + { + /* Here is where things vary: + * nVidia and Apple use 64+1 sample frames per block -> block_size=36 bytes per channel + * Most PC sound software uses 2040+1 sample frames per block -> block_size=1024 bytes per channel + */ + return 65; + } + if(type == UserFmtMSADPCM) + return 64; + return 1; + } + + if(type == UserFmtIMA4) + { + /* IMA4 block alignment must be a multiple of 8, plus 1. */ + if((align&7) == 1) return align; + return 0; + } + if(type == UserFmtMSADPCM) + { + /* MSADPCM block alignment must be a multiple of 2. */ + if((align&1) == 0) return align; + return 0; + } + + return align; +} + + +static ALbuffer *AllocBuffer(ALCcontext *context) +{ + ALCdevice *device = context->Device; + BufferSubList *sublist, *subend; + ALbuffer *buffer = NULL; + ALsizei lidx = 0; + ALsizei slidx; + + almtx_lock(&device->BufferLock); + sublist = VECTOR_BEGIN(device->BufferList); + subend = VECTOR_END(device->BufferList); + for(;sublist != subend;++sublist) + { + if(sublist->FreeMask) + { + slidx = CTZ64(sublist->FreeMask); + buffer = sublist->Buffers + slidx; + break; + } + ++lidx; + } + if(UNLIKELY(!buffer)) + { + const BufferSubList empty_sublist = { 0, NULL }; + /* Don't allocate so many list entries that the 32-bit ID could + * overflow... + */ + if(UNLIKELY(VECTOR_SIZE(device->BufferList) >= 1<<25)) + { + almtx_unlock(&device->BufferLock); + alSetError(context, AL_OUT_OF_MEMORY, "Too many buffers allocated"); + return NULL; + } + lidx = (ALsizei)VECTOR_SIZE(device->BufferList); + VECTOR_PUSH_BACK(device->BufferList, empty_sublist); + sublist = &VECTOR_BACK(device->BufferList); + sublist->FreeMask = ~U64(0); + sublist->Buffers = al_calloc(16, sizeof(ALbuffer)*64); + if(UNLIKELY(!sublist->Buffers)) + { + VECTOR_POP_BACK(device->BufferList); + almtx_unlock(&device->BufferLock); + alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate buffer batch"); + return NULL; + } + + slidx = 0; + buffer = sublist->Buffers + slidx; + } + + memset(buffer, 0, sizeof(*buffer)); + + /* Add 1 to avoid buffer ID 0. */ + buffer->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(U64(1)<BufferLock); + + return buffer; +} + +static void FreeBuffer(ALCdevice *device, ALbuffer *buffer) +{ + ALuint id = buffer->id - 1; + ALsizei lidx = id >> 6; + ALsizei slidx = id & 0x3f; + + al_free(buffer->data); + memset(buffer, 0, sizeof(*buffer)); + + VECTOR_ELEM(device->BufferList, lidx).FreeMask |= U64(1) << slidx; +} + + +/* + * ReleaseALBuffers() + * + * INTERNAL: Called to destroy any buffers that still exist on the device + */ +ALvoid ReleaseALBuffers(ALCdevice *device) +{ + BufferSubList *sublist = VECTOR_BEGIN(device->BufferList); + BufferSubList *subend = VECTOR_END(device->BufferList); + size_t leftover = 0; + for(;sublist != subend;++sublist) + { + ALuint64 usemask = ~sublist->FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALbuffer *buffer = sublist->Buffers + idx; + + al_free(buffer->data); + memset(buffer, 0, sizeof(*buffer)); + ++leftover; + + usemask &= ~(U64(1) << idx); + } + sublist->FreeMask = ~usemask; + } + if(leftover > 0) + WARN("(%p) Deleted "SZFMT" Buffer%s\n", device, leftover, (leftover==1)?"":"s"); +} diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alEffect.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alEffect.c similarity index 68% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alEffect.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alEffect.c index 6761e661..c2a78a0c 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alEffect.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alEffect.c @@ -28,26 +28,53 @@ #include "AL/alc.h" #include "alMain.h" #include "alEffect.h" -#include "alThunk.h" #include "alError.h" -ALboolean DisabledEffects[MAX_EFFECTS]; - -extern inline void LockEffectsRead(ALCdevice *device); -extern inline void UnlockEffectsRead(ALCdevice *device); -extern inline void LockEffectsWrite(ALCdevice *device); -extern inline void UnlockEffectsWrite(ALCdevice *device); -extern inline struct ALeffect *LookupEffect(ALCdevice *device, ALuint id); -extern inline struct ALeffect *RemoveEffect(ALCdevice *device, ALuint id); +extern inline void LockEffectList(ALCdevice *device); +extern inline void UnlockEffectList(ALCdevice *device); extern inline ALboolean IsReverbEffect(ALenum type); +const struct EffectList EffectList[EFFECTLIST_SIZE] = { + { "eaxreverb", EAXREVERB_EFFECT, AL_EFFECT_EAXREVERB }, + { "reverb", REVERB_EFFECT, AL_EFFECT_REVERB }, + { "autowah", AUTOWAH_EFFECT, AL_EFFECT_AUTOWAH }, + { "chorus", CHORUS_EFFECT, AL_EFFECT_CHORUS }, + { "compressor", COMPRESSOR_EFFECT, AL_EFFECT_COMPRESSOR }, + { "distortion", DISTORTION_EFFECT, AL_EFFECT_DISTORTION }, + { "echo", ECHO_EFFECT, AL_EFFECT_ECHO }, + { "equalizer", EQUALIZER_EFFECT, AL_EFFECT_EQUALIZER }, + { "flanger", FLANGER_EFFECT, AL_EFFECT_FLANGER }, + { "fshifter", FSHIFTER_EFFECT, AL_EFFECT_FREQUENCY_SHIFTER }, + { "modulator", MODULATOR_EFFECT, AL_EFFECT_RING_MODULATOR }, + { "pshifter", PSHIFTER_EFFECT, AL_EFFECT_PITCH_SHIFTER }, + { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT }, + { "dedicated", DEDICATED_EFFECT, AL_EFFECT_DEDICATED_DIALOGUE }, +}; + +ALboolean DisabledEffects[MAX_EFFECTS]; + +static ALeffect *AllocEffect(ALCcontext *context); +static void FreeEffect(ALCdevice *device, ALeffect *effect); static void InitEffectParams(ALeffect *effect, ALenum type); +static inline ALeffect *LookupEffect(ALCdevice *device, ALuint id) +{ + EffectSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->EffectList))) + return NULL; + sublist = &VECTOR_ELEM(device->EffectList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Effects + slidx; +} + AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) { - ALCdevice *device; ALCcontext *context; ALsizei cur; @@ -55,37 +82,18 @@ AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects) if(!context) return; if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - device = context->Device; - for(cur = 0;cur < n;cur++) + alSetError(context, AL_INVALID_VALUE, "Generating %d effects", n); + else for(cur = 0;cur < n;cur++) { - ALeffect *effect = al_calloc(16, sizeof(ALeffect)); - ALenum err = AL_OUT_OF_MEMORY; - if(!effect || (err=InitEffect(effect)) != AL_NO_ERROR) + ALeffect *effect = AllocEffect(context); + if(!effect) { - al_free(effect); alDeleteEffects(cur, effects); - SET_ERROR_AND_GOTO(context, err, done); + break; } - - err = NewThunkEntry(&effect->id); - if(err == AL_NO_ERROR) - err = InsertUIntMapEntry(&device->EffectMap, effect->id, effect); - if(err != AL_NO_ERROR) - { - FreeThunkEntry(effect->id); - memset(effect, 0, sizeof(ALeffect)); - al_free(effect); - - alDeleteEffects(cur, effects); - SET_ERROR_AND_GOTO(context, err, done); - } - effects[cur] = effect->id; } -done: ALCcontext_DecRef(context); } @@ -100,26 +108,22 @@ AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects) if(!context) return; device = context->Device; - LockEffectsWrite(device); + LockEffectList(device); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d effects", n); for(i = 0;i < n;i++) { if(effects[i] && LookupEffect(device, effects[i]) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid effect ID %u", effects[i]); } for(i = 0;i < n;i++) { - if((effect=RemoveEffect(device, effects[i])) == NULL) - continue; - FreeThunkEntry(effect->id); - - memset(effect, 0, sizeof(*effect)); - al_free(effect); + if((effect=LookupEffect(device, effects[i])) != NULL) + FreeEffect(device, effect); } done: - UnlockEffectsWrite(device); + UnlockEffectList(device); ALCcontext_DecRef(context); } @@ -131,10 +135,10 @@ AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect) Context = GetContextRef(); if(!Context) return AL_FALSE; - LockEffectsRead(Context->Device); + LockEffectList(Context->Device); result = ((!effect || LookupEffect(Context->Device, effect)) ? AL_TRUE : AL_FALSE); - UnlockEffectsRead(Context->Device); + UnlockEffectList(Context->Device); ALCcontext_DecRef(Context); @@ -151,16 +155,16 @@ AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint value) if(!Context) return; Device = Context->Device; - LockEffectsWrite(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { if(param == AL_EFFECT_TYPE) { ALboolean isOk = (value == AL_EFFECT_NULL); ALint i; - for(i = 0;!isOk && EffectList[i].val;i++) + for(i = 0;!isOk && i < EFFECTLIST_SIZE;i++) { if(value == EffectList[i].val && !DisabledEffects[EffectList[i].type]) @@ -170,15 +174,15 @@ AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint value) if(isOk) InitEffectParams(ALEffect, value); else - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "Effect type 0x%04x not supported", value); } else { /* Call the appropriate handler */ - V(ALEffect,setParami)(Context, param, value); + ALeffect_setParami(ALEffect, Context, param, value); } } - UnlockEffectsWrite(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -200,15 +204,15 @@ AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *v if(!Context) return; Device = Context->Device; - LockEffectsWrite(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,setParamiv)(Context, param, values); + ALeffect_setParamiv(ALEffect, Context, param, values); } - UnlockEffectsWrite(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -223,15 +227,15 @@ AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat value) if(!Context) return; Device = Context->Device; - LockEffectsWrite(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,setParamf)(Context, param, value); + ALeffect_setParamf(ALEffect, Context, param, value); } - UnlockEffectsWrite(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -246,15 +250,15 @@ AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat if(!Context) return; Device = Context->Device; - LockEffectsWrite(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,setParamfv)(Context, param, values); + ALeffect_setParamfv(ALEffect, Context, param, values); } - UnlockEffectsWrite(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -269,9 +273,9 @@ AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *value if(!Context) return; Device = Context->Device; - LockEffectsRead(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { if(param == AL_EFFECT_TYPE) @@ -279,10 +283,10 @@ AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *value else { /* Call the appropriate handler */ - V(ALEffect,getParami)(Context, param, value); + ALeffect_getParami(ALEffect, Context, param, value); } } - UnlockEffectsRead(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -304,15 +308,15 @@ AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *valu if(!Context) return; Device = Context->Device; - LockEffectsRead(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,getParamiv)(Context, param, values); + ALeffect_getParamiv(ALEffect, Context, param, values); } - UnlockEffectsRead(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -327,15 +331,15 @@ AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *val if(!Context) return; Device = Context->Device; - LockEffectsRead(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,getParamf)(Context, param, value); + ALeffect_getParamf(ALEffect, Context, param, value); } - UnlockEffectsRead(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } @@ -350,39 +354,120 @@ AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *va if(!Context) return; Device = Context->Device; - LockEffectsRead(Device); + LockEffectList(Device); if((ALEffect=LookupEffect(Device, effect)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid effect ID %u", effect); else { /* Call the appropriate handler */ - V(ALEffect,getParamfv)(Context, param, values); + ALeffect_getParamfv(ALEffect, Context, param, values); } - UnlockEffectsRead(Device); + UnlockEffectList(Device); ALCcontext_DecRef(Context); } -ALenum InitEffect(ALeffect *effect) +void InitEffect(ALeffect *effect) { InitEffectParams(effect, AL_EFFECT_NULL); - return AL_NO_ERROR; } -ALvoid ReleaseALEffects(ALCdevice *device) +static ALeffect *AllocEffect(ALCcontext *context) { - ALsizei i; - for(i = 0;i < device->EffectMap.size;i++) - { - ALeffect *temp = device->EffectMap.values[i]; - device->EffectMap.values[i] = NULL; + ALCdevice *device = context->Device; + EffectSubList *sublist, *subend; + ALeffect *effect = NULL; + ALsizei lidx = 0; + ALsizei slidx; - // Release effect structure - FreeThunkEntry(temp->id); - memset(temp, 0, sizeof(ALeffect)); - al_free(temp); + almtx_lock(&device->EffectLock); + sublist = VECTOR_BEGIN(device->EffectList); + subend = VECTOR_END(device->EffectList); + for(;sublist != subend;++sublist) + { + if(sublist->FreeMask) + { + slidx = CTZ64(sublist->FreeMask); + effect = sublist->Effects + slidx; + break; + } + ++lidx; } + if(UNLIKELY(!effect)) + { + const EffectSubList empty_sublist = { 0, NULL }; + /* Don't allocate so many list entries that the 32-bit ID could + * overflow... + */ + if(UNLIKELY(VECTOR_SIZE(device->EffectList) >= 1<<25)) + { + almtx_unlock(&device->EffectLock); + alSetError(context, AL_OUT_OF_MEMORY, "Too many effects allocated"); + return NULL; + } + lidx = (ALsizei)VECTOR_SIZE(device->EffectList); + VECTOR_PUSH_BACK(device->EffectList, empty_sublist); + sublist = &VECTOR_BACK(device->EffectList); + sublist->FreeMask = ~U64(0); + sublist->Effects = al_calloc(16, sizeof(ALeffect)*64); + if(UNLIKELY(!sublist->Effects)) + { + VECTOR_POP_BACK(device->EffectList); + almtx_unlock(&device->EffectLock); + alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate effect batch"); + return NULL; + } + + slidx = 0; + effect = sublist->Effects + slidx; + } + + memset(effect, 0, sizeof(*effect)); + InitEffectParams(effect, AL_EFFECT_NULL); + + /* Add 1 to avoid effect ID 0. */ + effect->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(U64(1)<EffectLock); + + return effect; +} + +static void FreeEffect(ALCdevice *device, ALeffect *effect) +{ + ALuint id = effect->id - 1; + ALsizei lidx = id >> 6; + ALsizei slidx = id & 0x3f; + + memset(effect, 0, sizeof(*effect)); + + VECTOR_ELEM(device->EffectList, lidx).FreeMask |= U64(1) << slidx; +} + +void ReleaseALEffects(ALCdevice *device) +{ + EffectSubList *sublist = VECTOR_BEGIN(device->EffectList); + EffectSubList *subend = VECTOR_END(device->EffectList); + size_t leftover = 0; + for(;sublist != subend;++sublist) + { + ALuint64 usemask = ~sublist->FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALeffect *effect = sublist->Effects + idx; + + memset(effect, 0, sizeof(*effect)); + ++leftover; + + usemask &= ~(U64(1) << idx); + } + sublist->FreeMask = ~usemask; + } + if(leftover > 0) + WARN("(%p) Deleted "SZFMT" Effect%s\n", device, leftover, (leftover==1)?"":"s"); } @@ -418,7 +503,7 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE; effect->Props.Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; effect->Props.Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT; - SET_VTABLE1(ALeaxreverb, effect); + effect->vtab = &ALeaxreverb_vtable; break; case AL_EFFECT_REVERB: effect->Props.Reverb.Density = AL_REVERB_DEFAULT_DENSITY; @@ -448,7 +533,14 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Reverb.LFReference = 250.0f; effect->Props.Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR; effect->Props.Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT; - SET_VTABLE1(ALreverb, effect); + effect->vtab = &ALreverb_vtable; + break; + case AL_EFFECT_AUTOWAH: + effect->Props.Autowah.AttackTime = AL_AUTOWAH_DEFAULT_ATTACK_TIME; + effect->Props.Autowah.ReleaseTime = AL_AUTOWAH_DEFAULT_RELEASE_TIME; + effect->Props.Autowah.Resonance = AL_AUTOWAH_DEFAULT_RESONANCE; + effect->Props.Autowah.PeakGain = AL_AUTOWAH_DEFAULT_PEAK_GAIN; + effect->vtab = &ALautowah_vtable; break; case AL_EFFECT_CHORUS: effect->Props.Chorus.Waveform = AL_CHORUS_DEFAULT_WAVEFORM; @@ -457,11 +549,11 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Chorus.Depth = AL_CHORUS_DEFAULT_DEPTH; effect->Props.Chorus.Feedback = AL_CHORUS_DEFAULT_FEEDBACK; effect->Props.Chorus.Delay = AL_CHORUS_DEFAULT_DELAY; - SET_VTABLE1(ALchorus, effect); + effect->vtab = &ALchorus_vtable; break; case AL_EFFECT_COMPRESSOR: effect->Props.Compressor.OnOff = AL_COMPRESSOR_DEFAULT_ONOFF; - SET_VTABLE1(ALcompressor, effect); + effect->vtab = &ALcompressor_vtable; break; case AL_EFFECT_DISTORTION: effect->Props.Distortion.Edge = AL_DISTORTION_DEFAULT_EDGE; @@ -469,7 +561,7 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Distortion.LowpassCutoff = AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF; effect->Props.Distortion.EQCenter = AL_DISTORTION_DEFAULT_EQCENTER; effect->Props.Distortion.EQBandwidth = AL_DISTORTION_DEFAULT_EQBANDWIDTH; - SET_VTABLE1(ALdistortion, effect); + effect->vtab = &ALdistortion_vtable; break; case AL_EFFECT_ECHO: effect->Props.Echo.Delay = AL_ECHO_DEFAULT_DELAY; @@ -477,7 +569,7 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Echo.Damping = AL_ECHO_DEFAULT_DAMPING; effect->Props.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK; effect->Props.Echo.Spread = AL_ECHO_DEFAULT_SPREAD; - SET_VTABLE1(ALecho, effect); + effect->vtab = &ALecho_vtable; break; case AL_EFFECT_EQUALIZER: effect->Props.Equalizer.LowCutoff = AL_EQUALIZER_DEFAULT_LOW_CUTOFF; @@ -490,30 +582,41 @@ static void InitEffectParams(ALeffect *effect, ALenum type) effect->Props.Equalizer.Mid2Width = AL_EQUALIZER_DEFAULT_MID2_WIDTH; effect->Props.Equalizer.HighCutoff = AL_EQUALIZER_DEFAULT_HIGH_CUTOFF; effect->Props.Equalizer.HighGain = AL_EQUALIZER_DEFAULT_HIGH_GAIN; - SET_VTABLE1(ALequalizer, effect); + effect->vtab = &ALequalizer_vtable; break; case AL_EFFECT_FLANGER: - effect->Props.Flanger.Waveform = AL_FLANGER_DEFAULT_WAVEFORM; - effect->Props.Flanger.Phase = AL_FLANGER_DEFAULT_PHASE; - effect->Props.Flanger.Rate = AL_FLANGER_DEFAULT_RATE; - effect->Props.Flanger.Depth = AL_FLANGER_DEFAULT_DEPTH; - effect->Props.Flanger.Feedback = AL_FLANGER_DEFAULT_FEEDBACK; - effect->Props.Flanger.Delay = AL_FLANGER_DEFAULT_DELAY; - SET_VTABLE1(ALflanger, effect); + effect->Props.Chorus.Waveform = AL_FLANGER_DEFAULT_WAVEFORM; + effect->Props.Chorus.Phase = AL_FLANGER_DEFAULT_PHASE; + effect->Props.Chorus.Rate = AL_FLANGER_DEFAULT_RATE; + effect->Props.Chorus.Depth = AL_FLANGER_DEFAULT_DEPTH; + effect->Props.Chorus.Feedback = AL_FLANGER_DEFAULT_FEEDBACK; + effect->Props.Chorus.Delay = AL_FLANGER_DEFAULT_DELAY; + effect->vtab = &ALflanger_vtable; + break; + case AL_EFFECT_FREQUENCY_SHIFTER: + effect->Props.Fshifter.Frequency = AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY; + effect->Props.Fshifter.LeftDirection = AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION; + effect->Props.Fshifter.RightDirection = AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION; + effect->vtab = &ALfshifter_vtable; break; case AL_EFFECT_RING_MODULATOR: effect->Props.Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY; effect->Props.Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF; effect->Props.Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM; - SET_VTABLE1(ALmodulator, effect); + effect->vtab = &ALmodulator_vtable; + break; + case AL_EFFECT_PITCH_SHIFTER: + effect->Props.Pshifter.CoarseTune = AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE; + effect->Props.Pshifter.FineTune = AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE; + effect->vtab = &ALpshifter_vtable; break; case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT: case AL_EFFECT_DEDICATED_DIALOGUE: effect->Props.Dedicated.Gain = 1.0f; - SET_VTABLE1(ALdedicated, effect); + effect->vtab = &ALdedicated_vtable; break; default: - SET_VTABLE1(ALnull, effect); + effect->vtab = &ALnull_vtable; break; } effect->type = type; @@ -656,7 +759,7 @@ static const struct { }; #undef DECL -ALvoid LoadReverbPreset(const char *name, ALeffect *effect) +void LoadReverbPreset(const char *name, ALeffect *effect) { size_t i; @@ -667,9 +770,9 @@ ALvoid LoadReverbPreset(const char *name, ALeffect *effect) return; } - if(!DisabledEffects[AL__EAXREVERB]) + if(!DisabledEffects[EAXREVERB_EFFECT]) InitEffectParams(effect, AL_EFFECT_EAXREVERB); - else if(!DisabledEffects[AL__REVERB]) + else if(!DisabledEffects[REVERB_EFFECT]) InitEffectParams(effect, AL_EFFECT_REVERB); else InitEffectParams(effect, AL_EFFECT_NULL); diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alError.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alError.c similarity index 53% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alError.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alError.c index 6c953977..b6208f77 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alError.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alError.c @@ -21,6 +21,7 @@ #include "config.h" #include +#include #ifdef HAVE_WINDOWS_H #define WIN32_LEAN_AND_MEAN @@ -33,11 +34,32 @@ ALboolean TrapALError = AL_FALSE; -ALvoid alSetError(ALCcontext *Context, ALenum errorCode) +void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...) { ALenum curerr = AL_NO_ERROR; + char message[1024] = { 0 }; + va_list args; + int msglen; - WARN("Error generated on context %p, code 0x%04x\n", Context, errorCode); + va_start(args, msg); + msglen = vsnprintf(message, sizeof(message), msg, args); + va_end(args); + + if(msglen < 0 || (size_t)msglen >= sizeof(message)) + { + message[sizeof(message)-1] = 0; + msglen = (int)strlen(message); + } + if(msglen > 0) + msg = message; + else + { + msg = ""; + msglen = (int)strlen(msg); + } + + WARN("Error generated on context %p, code 0x%04x, \"%s\"\n", + context, errorCode, message); if(TrapALError) { #ifdef _WIN32 @@ -49,19 +71,29 @@ ALvoid alSetError(ALCcontext *Context, ALenum errorCode) #endif } - (void)(ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&Context->LastError, &curerr, errorCode)); + ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&context->LastError, &curerr, errorCode); + if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Error)) + { + ALbitfieldSOFT enabledevts; + almtx_lock(&context->EventCbLock); + enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); + if((enabledevts&EventType_Error) && context->EventCb) + (*context->EventCb)(AL_EVENT_TYPE_ERROR_SOFT, 0, errorCode, msglen, msg, + context->EventParam); + almtx_unlock(&context->EventCbLock); + } } AL_API ALenum AL_APIENTRY alGetError(void) { - ALCcontext *Context; + ALCcontext *context; ALenum errorCode; - Context = GetContextRef(); - if(!Context) + context = GetContextRef(); + if(!context) { - WARN("Querying error state on null context (implicitly 0x%04x)\n", - AL_INVALID_OPERATION); + const ALenum deferror = AL_INVALID_OPERATION; + WARN("Querying error state on null context (implicitly 0x%04x)\n", deferror); if(TrapALError) { #ifdef _WIN32 @@ -71,12 +103,11 @@ AL_API ALenum AL_APIENTRY alGetError(void) raise(SIGTRAP); #endif } - return AL_INVALID_OPERATION; + return deferror; } - errorCode = ATOMIC_EXCHANGE_SEQ(&Context->LastError, AL_NO_ERROR); - - ALCcontext_DecRef(Context); + errorCode = ATOMIC_EXCHANGE_SEQ(&context->LastError, AL_NO_ERROR); + ALCcontext_DecRef(context); return errorCode; } diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alExtension.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alExtension.c similarity index 65% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alExtension.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alExtension.c index c85e9007..f6378c70 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alExtension.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alExtension.c @@ -35,22 +35,6 @@ #include "AL/alc.h" -const struct EffectList EffectList[] = { - { "eaxreverb", AL__EAXREVERB, "AL_EFFECT_EAXREVERB", AL_EFFECT_EAXREVERB }, - { "reverb", AL__REVERB, "AL_EFFECT_REVERB", AL_EFFECT_REVERB }, - { "chorus", AL__CHORUS, "AL_EFFECT_CHORUS", AL_EFFECT_CHORUS }, - { "compressor", AL__COMPRESSOR, "AL_EFFECT_COMPRESSOR", AL_EFFECT_COMPRESSOR }, - { "distortion", AL__DISTORTION, "AL_EFFECT_DISTORTION", AL_EFFECT_DISTORTION }, - { "echo", AL__ECHO, "AL_EFFECT_ECHO", AL_EFFECT_ECHO }, - { "equalizer", AL__EQUALIZER, "AL_EFFECT_EQUALIZER", AL_EFFECT_EQUALIZER }, - { "flanger", AL__FLANGER, "AL_EFFECT_FLANGER", AL_EFFECT_FLANGER }, - { "modulator", AL__MODULATOR, "AL_EFFECT_RING_MODULATOR", AL_EFFECT_RING_MODULATOR }, - { "dedicated", AL__DEDICATED, "AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT", AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT }, - { "dedicated", AL__DEDICATED, "AL_EFFECT_DEDICATED_DIALOGUE", AL_EFFECT_DEDICATED_DIALOGUE }, - { NULL, 0, NULL, (ALenum)0 } -}; - - AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName) { ALboolean ret = AL_FALSE; @@ -61,8 +45,8 @@ AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName) context = GetContextRef(); if(!context) return AL_FALSE; - if(!(extName)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(!extName) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); len = strlen(extName); ptr = context->ExtensionList; diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/alFilter.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alFilter.c new file mode 100644 index 00000000..e57653e0 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alFilter.c @@ -0,0 +1,671 @@ +/** + * OpenAL cross platform audio library + * Copyright (C) 1999-2007 by authors. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * Or go to http://www.gnu.org/copyleft/lgpl.html + */ + +#include "config.h" + +#include + +#include "alMain.h" +#include "alu.h" +#include "alFilter.h" +#include "alError.h" + + +#define FILTER_MIN_GAIN 0.0f +#define FILTER_MAX_GAIN 4.0f /* +12dB */ + +extern inline void LockFilterList(ALCdevice *device); +extern inline void UnlockFilterList(ALCdevice *device); + +static ALfilter *AllocFilter(ALCcontext *context); +static void FreeFilter(ALCdevice *device, ALfilter *filter); +static void InitFilterParams(ALfilter *filter, ALenum type); + +static inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) +{ + FilterSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->FilterList))) + return NULL; + sublist = &VECTOR_ELEM(device->FilterList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Filters + slidx; +} + + +AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters) +{ + ALCcontext *context; + ALsizei cur = 0; + + context = GetContextRef(); + if(!context) return; + + if(!(n >= 0)) + alSetError(context, AL_INVALID_VALUE, "Generating %d filters", n); + else for(cur = 0;cur < n;cur++) + { + ALfilter *filter = AllocFilter(context); + if(!filter) + { + alDeleteFilters(cur, filters); + break; + } + + filters[cur] = filter->id; + } + + ALCcontext_DecRef(context); +} + +AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters) +{ + ALCdevice *device; + ALCcontext *context; + ALfilter *filter; + ALsizei i; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + LockFilterList(device); + if(!(n >= 0)) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d filters", n); + for(i = 0;i < n;i++) + { + if(filters[i] && LookupFilter(device, filters[i]) == NULL) + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid filter ID %u", filters[i]); + } + for(i = 0;i < n;i++) + { + if((filter=LookupFilter(device, filters[i])) != NULL) + FreeFilter(device, filter); + } + +done: + UnlockFilterList(device); + ALCcontext_DecRef(context); +} + +AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter) +{ + ALCcontext *Context; + ALboolean result; + + Context = GetContextRef(); + if(!Context) return AL_FALSE; + + LockFilterList(Context->Device); + result = ((!filter || LookupFilter(Context->Device, filter)) ? + AL_TRUE : AL_FALSE); + UnlockFilterList(Context->Device); + + ALCcontext_DecRef(Context); + + return result; +} + +AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint value) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + if(param == AL_FILTER_TYPE) + { + if(value == AL_FILTER_NULL || value == AL_FILTER_LOWPASS || + value == AL_FILTER_HIGHPASS || value == AL_FILTER_BANDPASS) + InitFilterParams(ALFilter, value); + else + alSetError(Context, AL_INVALID_VALUE, "Invalid filter type 0x%04x", value); + } + else + { + /* Call the appropriate handler */ + ALfilter_setParami(ALFilter, Context, param, value); + } + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *values) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + switch(param) + { + case AL_FILTER_TYPE: + alFilteri(filter, param, values[0]); + return; + } + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamiv(ALFilter, Context, param, values); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat value) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamf(ALFilter, Context, param, value); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *values) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_setParamfv(ALFilter, Context, param, values); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *value) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + if(param == AL_FILTER_TYPE) + *value = ALFilter->type; + else + { + /* Call the appropriate handler */ + ALfilter_getParami(ALFilter, Context, param, value); + } + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *values) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + switch(param) + { + case AL_FILTER_TYPE: + alGetFilteri(filter, param, values); + return; + } + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamiv(ALFilter, Context, param, values); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *value) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamf(ALFilter, Context, param, value); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + +AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *values) +{ + ALCcontext *Context; + ALCdevice *Device; + ALfilter *ALFilter; + + Context = GetContextRef(); + if(!Context) return; + + Device = Context->Device; + LockFilterList(Device); + if((ALFilter=LookupFilter(Device, filter)) == NULL) + alSetError(Context, AL_INVALID_NAME, "Invalid filter ID %u", filter); + else + { + /* Call the appropriate handler */ + ALfilter_getParamfv(ALFilter, Context, param, values); + } + UnlockFilterList(Device); + + ALCcontext_DecRef(Context); +} + + +static void ALlowpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } +static void ALlowpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } +static void ALlowpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_LOWPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gain %f out of range", val); + filter->Gain = val; + break; + + case AL_LOWPASS_GAINHF: + if(!(val >= AL_LOWPASS_MIN_GAINHF && val <= AL_LOWPASS_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Low-pass gainhf %f out of range", val); + filter->GainHF = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); + } +} +static void ALlowpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALlowpass_setParamf(filter, context, param, vals[0]); } + +static void ALlowpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer property 0x%04x", param); } +static void ALlowpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid low-pass integer-vector property 0x%04x", param); } +static void ALlowpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_LOWPASS_GAIN: + *val = filter->Gain; + break; + + case AL_LOWPASS_GAINHF: + *val = filter->GainHF; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid low-pass float property 0x%04x", param); + } +} +static void ALlowpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALlowpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALlowpass); + + +static void ALhighpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } +static void ALhighpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } +static void ALhighpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_HIGHPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gain out of range"); + filter->Gain = val; + break; + + case AL_HIGHPASS_GAINLF: + if(!(val >= AL_HIGHPASS_MIN_GAINLF && val <= AL_HIGHPASS_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "High-pass gainlf out of range"); + filter->GainLF = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); + } +} +static void ALhighpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALhighpass_setParamf(filter, context, param, vals[0]); } + +static void ALhighpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer property 0x%04x", param); } +static void ALhighpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid high-pass integer-vector property 0x%04x", param); } +static void ALhighpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_HIGHPASS_GAIN: + *val = filter->Gain; + break; + + case AL_HIGHPASS_GAINLF: + *val = filter->GainLF; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid high-pass float property 0x%04x", param); + } +} +static void ALhighpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALhighpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALhighpass); + + +static void ALbandpass_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } +static void ALbandpass_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } +static void ALbandpass_setParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat val) +{ + switch(param) + { + case AL_BANDPASS_GAIN: + if(!(val >= FILTER_MIN_GAIN && val <= FILTER_MAX_GAIN)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gain out of range"); + filter->Gain = val; + break; + + case AL_BANDPASS_GAINHF: + if(!(val >= AL_BANDPASS_MIN_GAINHF && val <= AL_BANDPASS_MAX_GAINHF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainhf out of range"); + filter->GainHF = val; + break; + + case AL_BANDPASS_GAINLF: + if(!(val >= AL_BANDPASS_MIN_GAINLF && val <= AL_BANDPASS_MAX_GAINLF)) + SETERR_RETURN(context, AL_INVALID_VALUE,, "Band-pass gainlf out of range"); + filter->GainLF = val; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); + } +} +static void ALbandpass_setParamfv(ALfilter *filter, ALCcontext *context, ALenum param, const ALfloat *vals) +{ ALbandpass_setParamf(filter, context, param, vals[0]); } + +static void ALbandpass_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer property 0x%04x", param); } +static void ALbandpass_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid band-pass integer-vector property 0x%04x", param); } +static void ALbandpass_getParamf(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *val) +{ + switch(param) + { + case AL_BANDPASS_GAIN: + *val = filter->Gain; + break; + + case AL_BANDPASS_GAINHF: + *val = filter->GainHF; + break; + + case AL_BANDPASS_GAINLF: + *val = filter->GainLF; + break; + + default: + alSetError(context, AL_INVALID_ENUM, "Invalid band-pass float property 0x%04x", param); + } +} +static void ALbandpass_getParamfv(ALfilter *filter, ALCcontext *context, ALenum param, ALfloat *vals) +{ ALbandpass_getParamf(filter, context, param, vals); } + +DEFINE_ALFILTER_VTABLE(ALbandpass); + + +static void ALnullfilter_setParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_setParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_setParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_setParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, const ALfloat *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } + +static void ALnullfilter_getParami(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_getParamiv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALint *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_getParamf(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat *UNUSED(val)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } +static void ALnullfilter_getParamfv(ALfilter *UNUSED(filter), ALCcontext *context, ALenum param, ALfloat *UNUSED(vals)) +{ alSetError(context, AL_INVALID_ENUM, "Invalid null filter property 0x%04x", param); } + +DEFINE_ALFILTER_VTABLE(ALnullfilter); + + +static ALfilter *AllocFilter(ALCcontext *context) +{ + ALCdevice *device = context->Device; + FilterSubList *sublist, *subend; + ALfilter *filter = NULL; + ALsizei lidx = 0; + ALsizei slidx; + + almtx_lock(&device->FilterLock); + sublist = VECTOR_BEGIN(device->FilterList); + subend = VECTOR_END(device->FilterList); + for(;sublist != subend;++sublist) + { + if(sublist->FreeMask) + { + slidx = CTZ64(sublist->FreeMask); + filter = sublist->Filters + slidx; + break; + } + ++lidx; + } + if(UNLIKELY(!filter)) + { + const FilterSubList empty_sublist = { 0, NULL }; + /* Don't allocate so many list entries that the 32-bit ID could + * overflow... + */ + if(UNLIKELY(VECTOR_SIZE(device->FilterList) >= 1<<25)) + { + almtx_unlock(&device->FilterLock); + alSetError(context, AL_OUT_OF_MEMORY, "Too many filters allocated"); + return NULL; + } + lidx = (ALsizei)VECTOR_SIZE(device->FilterList); + VECTOR_PUSH_BACK(device->FilterList, empty_sublist); + sublist = &VECTOR_BACK(device->FilterList); + sublist->FreeMask = ~U64(0); + sublist->Filters = al_calloc(16, sizeof(ALfilter)*64); + if(UNLIKELY(!sublist->Filters)) + { + VECTOR_POP_BACK(device->FilterList); + almtx_unlock(&device->FilterLock); + alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate filter batch"); + return NULL; + } + + slidx = 0; + filter = sublist->Filters + slidx; + } + + memset(filter, 0, sizeof(*filter)); + InitFilterParams(filter, AL_FILTER_NULL); + + /* Add 1 to avoid filter ID 0. */ + filter->id = ((lidx<<6) | slidx) + 1; + + sublist->FreeMask &= ~(U64(1)<FilterLock); + + return filter; +} + +static void FreeFilter(ALCdevice *device, ALfilter *filter) +{ + ALuint id = filter->id - 1; + ALsizei lidx = id >> 6; + ALsizei slidx = id & 0x3f; + + memset(filter, 0, sizeof(*filter)); + + VECTOR_ELEM(device->FilterList, lidx).FreeMask |= U64(1) << slidx; +} + +void ReleaseALFilters(ALCdevice *device) +{ + FilterSubList *sublist = VECTOR_BEGIN(device->FilterList); + FilterSubList *subend = VECTOR_END(device->FilterList); + size_t leftover = 0; + for(;sublist != subend;++sublist) + { + ALuint64 usemask = ~sublist->FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALfilter *filter = sublist->Filters + idx; + + memset(filter, 0, sizeof(*filter)); + ++leftover; + + usemask &= ~(U64(1) << idx); + } + sublist->FreeMask = ~usemask; + } + if(leftover > 0) + WARN("(%p) Deleted "SZFMT" Filter%s\n", device, leftover, (leftover==1)?"":"s"); +} + + +static void InitFilterParams(ALfilter *filter, ALenum type) +{ + if(type == AL_FILTER_LOWPASS) + { + filter->Gain = AL_LOWPASS_DEFAULT_GAIN; + filter->GainHF = AL_LOWPASS_DEFAULT_GAINHF; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = 1.0f; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALlowpass_vtable; + } + else if(type == AL_FILTER_HIGHPASS) + { + filter->Gain = AL_HIGHPASS_DEFAULT_GAIN; + filter->GainHF = 1.0f; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = AL_HIGHPASS_DEFAULT_GAINLF; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALhighpass_vtable; + } + else if(type == AL_FILTER_BANDPASS) + { + filter->Gain = AL_BANDPASS_DEFAULT_GAIN; + filter->GainHF = AL_BANDPASS_DEFAULT_GAINHF; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = AL_BANDPASS_DEFAULT_GAINLF; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALbandpass_vtable; + } + else + { + filter->Gain = 1.0f; + filter->GainHF = 1.0f; + filter->HFReference = LOWPASSFREQREF; + filter->GainLF = 1.0f; + filter->LFReference = HIGHPASSFREQREF; + filter->vtab = &ALnullfilter_vtable; + } + filter->type = type; +} diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alListener.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alListener.c similarity index 64% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alListener.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alListener.c index d117c0ca..f1ac3ff4 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alListener.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alListener.c @@ -21,85 +21,101 @@ #include "config.h" #include "alMain.h" -#include "AL/alc.h" +#include "alu.h" #include "alError.h" #include "alListener.h" #include "alSource.h" +#define DO_UPDATEPROPS() do { \ + if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ + UpdateListenerProps(context); \ + else \ + ATOMIC_FLAG_CLEAR(&listener->PropsClean, almemory_order_release); \ +} while(0) + + AL_API ALvoid AL_APIENTRY alListenerf(ALenum param, ALfloat value) { + ALlistener *listener; ALCcontext *context; context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + listener = context->Listener; + almtx_lock(&context->PropLock); switch(param) { case AL_GAIN: if(!(value >= 0.0f && isfinite(value))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - context->Listener->Gain = value; + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener gain out of range"); + listener->Gain = value; + DO_UPDATEPROPS(); break; case AL_METERS_PER_UNIT: - if(!(value >= 0.0f && isfinite(value))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - context->Listener->MetersPerUnit = value; + if(!(value >= AL_MIN_METERS_PER_UNIT && value <= AL_MAX_METERS_PER_UNIT)) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener meters per unit out of range"); + context->MetersPerUnit = value; + if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) + UpdateContextProps(context); + else + ATOMIC_FLAG_CLEAR(&context->PropsClean, almemory_order_release); break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener float property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); done: - WriteUnlock(&context->PropLock); + almtx_unlock(&context->PropLock); ALCcontext_DecRef(context); } AL_API ALvoid AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3) { + ALlistener *listener; ALCcontext *context; context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + listener = context->Listener; + almtx_lock(&context->PropLock); switch(param) { case AL_POSITION: if(!(isfinite(value1) && isfinite(value2) && isfinite(value3))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - context->Listener->Position[0] = value1; - context->Listener->Position[1] = value2; - context->Listener->Position[2] = value3; + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener position out of range"); + listener->Position[0] = value1; + listener->Position[1] = value2; + listener->Position[2] = value3; + DO_UPDATEPROPS(); break; case AL_VELOCITY: if(!(isfinite(value1) && isfinite(value2) && isfinite(value3))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - context->Listener->Velocity[0] = value1; - context->Listener->Velocity[1] = value2; - context->Listener->Velocity[2] = value3; + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener velocity out of range"); + listener->Velocity[0] = value1; + listener->Velocity[1] = value2; + listener->Velocity[2] = value3; + DO_UPDATEPROPS(); break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-float property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); done: - WriteUnlock(&context->PropLock); + almtx_unlock(&context->PropLock); ALCcontext_DecRef(context); } AL_API ALvoid AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values) { + ALlistener *listener; ALCcontext *context; if(values) @@ -121,32 +137,31 @@ AL_API ALvoid AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values) context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + listener = context->Listener; + almtx_lock(&context->PropLock); + if(!values) SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); switch(param) { case AL_ORIENTATION: if(!(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]) && isfinite(values[3]) && isfinite(values[4]) && isfinite(values[5]))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Listener orientation out of range"); /* AT then UP */ - context->Listener->Forward[0] = values[0]; - context->Listener->Forward[1] = values[1]; - context->Listener->Forward[2] = values[2]; - context->Listener->Up[0] = values[3]; - context->Listener->Up[1] = values[4]; - context->Listener->Up[2] = values[5]; + listener->Forward[0] = values[0]; + listener->Forward[1] = values[1]; + listener->Forward[2] = values[2]; + listener->Up[0] = values[3]; + listener->Up[1] = values[4]; + listener->Up[2] = values[5]; + DO_UPDATEPROPS(); break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener float-vector property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); done: - WriteUnlock(&context->PropLock); + almtx_unlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -158,17 +173,14 @@ AL_API ALvoid AL_APIENTRY alListeneri(ALenum param, ALint UNUSED(value)) context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + almtx_lock(&context->PropLock); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener integer property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_unlock(&context->PropLock); -done: - WriteUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -188,17 +200,14 @@ AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, A context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + almtx_lock(&context->PropLock); switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-integer property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_unlock(&context->PropLock); -done: - WriteUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -232,19 +241,16 @@ AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values) context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener integer-vector property"); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_unlock(&context->PropLock); -done: - WriteUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -256,25 +262,24 @@ AL_API ALvoid AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value) context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(value)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!value) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { case AL_GAIN: *value = context->Listener->Gain; break; case AL_METERS_PER_UNIT: - *value = context->Listener->MetersPerUnit; + *value = context->MetersPerUnit; break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener float property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -286,10 +291,10 @@ AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(value1 && value2 && value3)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!value1 || !value2 || !value3) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { case AL_POSITION: *value1 = context->Listener->Position[0]; @@ -304,11 +309,10 @@ AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-float property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -333,10 +337,10 @@ AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values) context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { case AL_ORIENTATION: // AT then UP @@ -349,11 +353,10 @@ AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener float-vector property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -365,17 +368,16 @@ AL_API ALvoid AL_APIENTRY alGetListeneri(ALenum param, ALint *value) context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(value)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!value) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener integer property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -387,10 +389,10 @@ AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *valu context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(value1 && value2 && value3)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch (param) + almtx_lock(&context->PropLock); + if(!value1 || !value2 || !value3) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { case AL_POSITION: *value1 = (ALint)context->Listener->Position[0]; @@ -405,11 +407,10 @@ AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *valu break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener 3-integer property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -429,10 +430,10 @@ AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values) context = GetContextRef(); if(!context) return; - ReadLock(&context->PropLock); - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - switch(param) + almtx_lock(&context->PropLock); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + else switch(param) { case AL_ORIENTATION: // AT then UP @@ -445,11 +446,10 @@ AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_ENUM, "Invalid listener integer-vector property"); } + almtx_unlock(&context->PropLock); -done: - ReadUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -460,7 +460,7 @@ void UpdateListenerProps(ALCcontext *context) struct ALlistenerProps *props; /* Get an unused proprty container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&listener->FreeList, almemory_order_acquire); + props = ATOMIC_LOAD(&context->FreeListenerProps, almemory_order_acquire); if(!props) props = al_calloc(16, sizeof(*props)); else @@ -468,7 +468,7 @@ void UpdateListenerProps(ALCcontext *context) struct ALlistenerProps *next; do { next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&listener->FreeList, &props, next, + } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeListenerProps, &props, next, almemory_order_seq_cst, almemory_order_acquire) == 0); } @@ -489,14 +489,6 @@ void UpdateListenerProps(ALCcontext *context) props->Up[2] = listener->Up[2]; props->Gain = listener->Gain; - props->MetersPerUnit = listener->MetersPerUnit; - - props->DopplerFactor = context->DopplerFactor; - props->DopplerVelocity = context->DopplerVelocity; - props->SpeedOfSound = context->SpeedOfSound; - - props->SourceDistanceModel = context->SourceDistanceModel; - props->DistanceModel = context->DistanceModel;; /* Set the new container for updating internal parameters. */ props = ATOMIC_EXCHANGE_PTR(&listener->Update, props, almemory_order_acq_rel); @@ -505,6 +497,6 @@ void UpdateListenerProps(ALCcontext *context) /* If there was an unused update container, put it back in the * freelist. */ - ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &listener->FreeList, props); + ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &context->FreeListenerProps, props); } } diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alSource.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alSource.c similarity index 71% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alSource.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alSource.c index be191fdb..d7c68e4e 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alSource.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alSource.c @@ -31,8 +31,9 @@ #include "alError.h" #include "alSource.h" #include "alBuffer.h" -#include "alThunk.h" +#include "alFilter.h" #include "alAuxEffectSlot.h" +#include "ringbuffer.h" #include "backends/base.h" @@ -40,22 +41,73 @@ #include "almalloc.h" -extern inline void LockSourcesRead(ALCcontext *context); -extern inline void UnlockSourcesRead(ALCcontext *context); -extern inline void LockSourcesWrite(ALCcontext *context); -extern inline void UnlockSourcesWrite(ALCcontext *context); -extern inline struct ALsource *LookupSource(ALCcontext *context, ALuint id); -extern inline struct ALsource *RemoveSource(ALCcontext *context, ALuint id); - +static ALsource *AllocSource(ALCcontext *context); +static void FreeSource(ALCcontext *context, ALsource *source); static void InitSourceParams(ALsource *Source, ALsizei num_sends); static void DeinitSource(ALsource *source, ALsizei num_sends); -static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends); +static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends, ALCcontext *context); static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint64 *clocktime); static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *context); static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac); static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice); +static inline void LockSourceList(ALCcontext *context) +{ almtx_lock(&context->SourceLock); } +static inline void UnlockSourceList(ALCcontext *context) +{ almtx_unlock(&context->SourceLock); } + +static inline ALsource *LookupSource(ALCcontext *context, ALuint id) +{ + SourceSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(context->SourceList))) + return NULL; + sublist = &VECTOR_ELEM(context->SourceList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Sources + slidx; +} + +static inline ALbuffer *LookupBuffer(ALCdevice *device, ALuint id) +{ + BufferSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->BufferList))) + return NULL; + sublist = &VECTOR_ELEM(device->BufferList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Buffers + slidx; +} + +static inline ALfilter *LookupFilter(ALCdevice *device, ALuint id) +{ + FilterSubList *sublist; + ALuint lidx = (id-1) >> 6; + ALsizei slidx = (id-1) & 0x3f; + + if(UNLIKELY(lidx >= VECTOR_SIZE(device->FilterList))) + return NULL; + sublist = &VECTOR_ELEM(device->FilterList, lidx); + if(UNLIKELY(sublist->FreeMask & (U64(1)<Filters + slidx; +} + +static inline ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id) +{ + id--; + if(UNLIKELY(id >= VECTOR_SIZE(context->EffectSlotList))) + return NULL; + return VECTOR_ELEM(context->EffectSlotList, id); +} + + typedef enum SourceProp { srcPitch = AL_PITCH, srcGain = AL_GAIN, @@ -100,10 +152,6 @@ typedef enum SourceProp { /* AL_EXT_source_distance_model */ srcDistanceModel = AL_DISTANCE_MODEL, - srcByteLengthSOFT = AL_BYTE_LENGTH_SOFT, - srcSampleLengthSOFT = AL_SAMPLE_LENGTH_SOFT, - srcSecLengthSOFT = AL_SEC_LENGTH_SOFT, - /* AL_SOFT_source_latency */ srcSampleOffsetLatencySOFT = AL_SAMPLE_OFFSET_LATENCY_SOFT, srcSecOffsetLatencySOFT = AL_SEC_OFFSET_LATENCY_SOFT, @@ -122,6 +170,10 @@ typedef enum SourceProp { /* AL_SOFT_source_spatialize */ srcSpatialize = AL_SOURCE_SPATIALIZE_SOFT, + + /* ALC_SOFT_device_clock */ + srcSampleOffsetClockSOFT = AL_SAMPLE_OFFSET_CLOCK_SOFT, + srcSecOffsetClockSOFT = AL_SEC_OFFSET_CLOCK_SOFT, } SourceProp; static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALfloat *values); @@ -132,16 +184,16 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint *values); static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint64 *values); -static inline ALvoice *GetSourceVoice(const ALsource *source, const ALCcontext *context) +static inline ALvoice *GetSourceVoice(ALsource *source, ALCcontext *context) { - ALvoice **voice = context->Voices; - ALvoice **voice_end = voice + context->VoiceCount; - while(voice != voice_end) + ALint idx = source->VoiceIdx; + if(idx >= 0 && idx < context->VoiceCount) { - if(ATOMIC_LOAD(&(*voice)->Source, almemory_order_acquire) == source) - return *voice; - ++voice; + ALvoice *voice = context->Voices[idx]; + if(ATOMIC_LOAD(&voice->Source, almemory_order_acquire) == source) + return voice; } + source->VoiceIdx = -1; return NULL; } @@ -150,10 +202,7 @@ static inline ALvoice *GetSourceVoice(const ALsource *source, const ALCcontext * * not sync with the mixer voice. */ static inline bool IsPlayingOrPaused(ALsource *source) -{ - ALenum state = ATOMIC_LOAD(&source->state, almemory_order_acquire); - return state == AL_PLAYING || state == AL_PAUSED; -} +{ return source->state == AL_PLAYING || source->state == AL_PAUSED; } /** * Returns an updated source state using the matching voice's status (or lack @@ -161,15 +210,9 @@ static inline bool IsPlayingOrPaused(ALsource *source) */ static inline ALenum GetSourceState(ALsource *source, ALvoice *voice) { - if(!voice) - { - ALenum state = AL_PLAYING; - if(ATOMIC_COMPARE_EXCHANGE_STRONG(&source->state, &state, AL_STOPPED, - almemory_order_acq_rel, almemory_order_acquire)) - return AL_STOPPED; - return state; - } - return ATOMIC_LOAD(&source->state, almemory_order_acquire); + if(!voice && source->state == AL_PLAYING) + source->state = AL_STOPPED; + return source->state; } /** @@ -182,6 +225,34 @@ static inline bool SourceShouldUpdate(ALsource *source, ALCcontext *context) IsPlayingOrPaused(source); } + +/** Can only be called while the mixer is locked! */ +static void SendStateChangeEvent(ALCcontext *context, ALuint id, ALenum state) +{ + AsyncEvent evt = ASYNC_EVENT(EventType_SourceStateChange); + ALbitfieldSOFT enabledevt; + + enabledevt = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); + if(!(enabledevt&EventType_SourceStateChange)) return; + + evt.u.user.type = AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT; + evt.u.user.id = id; + evt.u.user.param = state; + snprintf(evt.u.user.msg, sizeof(evt.u.user.msg), "Source ID %u state changed to %s", id, + (state==AL_INITIAL) ? "AL_INITIAL" : + (state==AL_PLAYING) ? "AL_PLAYING" : + (state==AL_PAUSED) ? "AL_PAUSED" : + (state==AL_STOPPED) ? "AL_STOPPED" : "" + ); + /* The mixer may have queued a state change that's not yet been processed, + * and we don't want state change messages to occur out of order, so send + * it through the async queue to ensure proper ordering. + */ + if(ll_ringbuffer_write(context->AsyncEvents, (const char*)&evt, 1) == 1) + alsem_post(&context->EventSem); +} + + static ALint FloatValsByProp(ALenum prop) { if(prop != (ALenum)((SourceProp)prop)) @@ -216,9 +287,6 @@ static ALint FloatValsByProp(ALenum prop) case AL_BUFFERS_QUEUED: case AL_BUFFERS_PROCESSED: case AL_SOURCE_TYPE: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: case AL_SOURCE_RESAMPLER_SOFT: case AL_SOURCE_SPATIALIZE_SOFT: @@ -236,6 +304,7 @@ static ALint FloatValsByProp(ALenum prop) return 6; case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: break; /* Double only */ case AL_BUFFER: @@ -243,6 +312,7 @@ static ALint FloatValsByProp(ALenum prop) case AL_AUXILIARY_SEND_FILTER: break; /* i/i64 only */ case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; /* i64 only */ } return 0; @@ -281,15 +351,13 @@ static ALint DoubleValsByProp(ALenum prop) case AL_BUFFERS_QUEUED: case AL_BUFFERS_PROCESSED: case AL_SOURCE_TYPE: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: case AL_SOURCE_RESAMPLER_SOFT: case AL_SOURCE_SPATIALIZE_SOFT: return 1; case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: case AL_STEREO_ANGLES: return 2; @@ -306,6 +374,7 @@ static ALint DoubleValsByProp(ALenum prop) case AL_AUXILIARY_SEND_FILTER: break; /* i/i64 only */ case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; /* i64 only */ } return 0; @@ -347,9 +416,6 @@ static ALint IntValsByProp(ALenum prop) case AL_BUFFERS_PROCESSED: case AL_SOURCE_TYPE: case AL_DIRECT_FILTER: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: case AL_SOURCE_RESAMPLER_SOFT: case AL_SOURCE_SPATIALIZE_SOFT: @@ -365,8 +431,10 @@ static ALint IntValsByProp(ALenum prop) return 6; case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; /* i64 only */ case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: break; /* Double only */ case AL_STEREO_ANGLES: break; /* Float/double only */ @@ -409,15 +477,13 @@ static ALint Int64ValsByProp(ALenum prop) case AL_BUFFERS_PROCESSED: case AL_SOURCE_TYPE: case AL_DIRECT_FILTER: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: case AL_SOURCE_RESAMPLER_SOFT: case AL_SOURCE_SPATIALIZE_SOFT: return 1; case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: return 2; case AL_POSITION: @@ -430,6 +496,7 @@ static ALint Int64ValsByProp(ALenum prop) return 6; case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: break; /* Double only */ case AL_STEREO_ANGLES: break; /* Float/double only */ @@ -440,14 +507,17 @@ static ALint Int64ValsByProp(ALenum prop) #define CHECKVAL(x) do { \ if(!(x)) \ - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); \ + { \ + alSetError(Context, AL_INVALID_VALUE, "Value out of range"); \ + return AL_FALSE; \ + } \ } while(0) #define DO_UPDATEPROPS() do { \ ALvoice *voice; \ if(SourceShouldUpdate(Source, Context) && \ (voice=GetSourceVoice(Source, Context)) != NULL) \ - UpdateSourceProps(Source, voice, device->NumAuxSends); \ + UpdateSourceProps(Source, voice, device->NumAuxSends, Context); \ else \ ATOMIC_FLAG_CLEAR(&Source->PropsClean, almemory_order_release); \ } while(0) @@ -459,12 +529,11 @@ static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp p switch(prop) { - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: /* Query only */ - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_OPERATION, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, + "Setting read-only source property 0x%04x", prop); case AL_PITCH: CHECKVAL(*values >= 0.0f); @@ -583,14 +652,11 @@ static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp p voice = GetSourceVoice(Source, Context); if(voice) { - WriteLock(&Source->queue_lock); if(ApplyOffset(Source, voice) == AL_FALSE) { - WriteUnlock(&Source->queue_lock); ALCdevice_Unlock(Context->Device); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid offset"); } - WriteUnlock(&Source->queue_lock); } ALCdevice_Unlock(Context->Device); } @@ -676,11 +742,12 @@ static ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_DIRECT_FILTER: case AL_AUXILIARY_SEND_FILTER: case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source float property 0x%04x", prop); } static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint *values) @@ -698,11 +765,9 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_SOURCE_TYPE: case AL_BUFFERS_QUEUED: case AL_BUFFERS_PROCESSED: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: /* Query only */ - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_OPERATION, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, + "Setting read-only source property 0x%04x", prop); case AL_SOURCE_RELATIVE: CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); @@ -714,7 +779,6 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_LOOPING: CHECKVAL(*values == AL_FALSE || *values == AL_TRUE); - WriteLock(&Source->queue_lock); Source->Looping = (ALboolean)*values; if(IsPlayingOrPaused(Source)) { @@ -734,25 +798,32 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p althrd_yield(); } } - WriteUnlock(&Source->queue_lock); return AL_TRUE; case AL_BUFFER: - LockBuffersRead(device); + LockBufferList(device); if(!(*values == 0 || (buffer=LookupBuffer(device, *values)) != NULL)) { - UnlockBuffersRead(device); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); + UnlockBufferList(device); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid buffer ID %u", + *values); } - WriteLock(&Source->queue_lock); + if(buffer && buffer->MappedAccess != 0 && + !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) + { + UnlockBufferList(device); + SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, + "Setting non-persistently mapped buffer %u", buffer->id); + } + else { ALenum state = GetSourceState(Source, GetSourceVoice(Source, Context)); if(state == AL_PLAYING || state == AL_PAUSED) { - WriteUnlock(&Source->queue_lock); - UnlockBuffersRead(device); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_OPERATION, AL_FALSE); + UnlockBufferList(device); + SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, + "Setting buffer on playing or paused source %u", Source->id); } } @@ -760,9 +831,12 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p if(buffer != NULL) { /* Add the selected buffer to a one-item queue */ - ALbufferlistitem *newlist = al_calloc(DEF_ALIGN, sizeof(ALbufferlistitem)); - newlist->buffer = buffer; + ALbufferlistitem *newlist = al_calloc(DEF_ALIGN, + FAM_SIZE(ALbufferlistitem, buffers, 1)); ATOMIC_INIT(&newlist->next, NULL); + newlist->max_samples = buffer->SampleLen; + newlist->num_buffers = 1; + newlist->buffers[0] = buffer; IncrementRef(&buffer->ref); /* Source is now Static */ @@ -775,17 +849,20 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p Source->SourceType = AL_UNDETERMINED; Source->queue = NULL; } - WriteUnlock(&Source->queue_lock); - UnlockBuffersRead(device); + UnlockBufferList(device); /* Delete all elements in the previous queue */ while(oldlist != NULL) { + ALsizei i; ALbufferlistitem *temp = oldlist; oldlist = ATOMIC_LOAD(&temp->next, almemory_order_relaxed); - if(temp->buffer) - DecrementRef(&temp->buffer->ref); + for(i = 0;i < temp->num_buffers;i++) + { + if(temp->buffers[i]) + DecrementRef(&temp->buffers[i]->ref); + } al_free(temp); } return AL_TRUE; @@ -806,25 +883,24 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p voice = GetSourceVoice(Source, Context); if(voice) { - WriteLock(&Source->queue_lock); if(ApplyOffset(Source, voice) == AL_FALSE) { - WriteUnlock(&Source->queue_lock); ALCdevice_Unlock(Context->Device); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, + "Invalid source offset"); } - WriteUnlock(&Source->queue_lock); } ALCdevice_Unlock(Context->Device); } return AL_TRUE; case AL_DIRECT_FILTER: - LockFiltersRead(device); + LockFilterList(device); if(!(*values == 0 || (filter=LookupFilter(device, *values)) != NULL)) { - UnlockFiltersRead(device); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); + UnlockFilterList(device); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u", + *values); } if(!filter) @@ -843,7 +919,7 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p Source->Direct.GainLF = filter->GainLF; Source->Direct.LFReference = filter->LFReference; } - UnlockFiltersRead(device); + UnlockFilterList(device); DO_UPDATEPROPS(); return AL_TRUE; @@ -905,15 +981,25 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_AUXILIARY_SEND_FILTER: - LockEffectSlotsRead(Context); - LockFiltersRead(device); - if(!((ALuint)values[1] < (ALuint)device->NumAuxSends && - (values[0] == 0 || (slot=LookupEffectSlot(Context, values[0])) != NULL) && - (values[2] == 0 || (filter=LookupFilter(device, values[2])) != NULL))) + LockEffectSlotList(Context); + if(!(values[0] == 0 || (slot=LookupEffectSlot(Context, values[0])) != NULL)) { - UnlockFiltersRead(device); - UnlockEffectSlotsRead(Context); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_VALUE, AL_FALSE); + UnlockEffectSlotList(Context); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid effect ID %u", + values[0]); + } + if(!((ALuint)values[1] < (ALuint)device->NumAuxSends)) + { + UnlockEffectSlotList(Context); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid send %u", values[1]); + } + LockFilterList(device); + if(!(values[2] == 0 || (filter=LookupFilter(device, values[2])) != NULL)) + { + UnlockFilterList(device); + UnlockEffectSlotList(Context); + SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u", + values[2]); } if(!filter) @@ -933,7 +1019,7 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p Source->Send[values[1]].GainLF = filter->GainLF; Source->Send[values[1]].LFReference = filter->LFReference; } - UnlockFiltersRead(device); + UnlockFilterList(device); if(slot != Source->Send[values[1]].Slot && IsPlayingOrPaused(Source)) { @@ -948,7 +1034,7 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p * active source, in case the slot is about to be deleted. */ if((voice=GetSourceVoice(Source, Context)) != NULL) - UpdateSourceProps(Source, voice, device->NumAuxSends); + UpdateSourceProps(Source, voice, device->NumAuxSends, Context); else ATOMIC_FLAG_CLEAR(&Source->PropsClean, almemory_order_release); } @@ -960,7 +1046,7 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p Source->Send[values[1]].Slot = slot; DO_UPDATEPROPS(); } - UnlockEffectSlotsRead(Context); + UnlockEffectSlotList(Context); return AL_TRUE; @@ -1005,12 +1091,15 @@ static ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_SAMPLE_OFFSET_LATENCY_SOFT: case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: case AL_STEREO_ANGLES: break; } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer property 0x%04x", + prop); } static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint64SOFT *values) @@ -1025,12 +1114,10 @@ static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp case AL_BUFFERS_PROCESSED: case AL_SOURCE_STATE: case AL_SAMPLE_OFFSET_LATENCY_SOFT: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: - case AL_SEC_LENGTH_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: /* Query only */ - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_OPERATION, AL_FALSE); - + SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE, + "Setting read-only source property 0x%04x", prop); /* 1x int */ case AL_SOURCE_RELATIVE: @@ -1108,12 +1195,14 @@ static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp return SetSourcefv(Source, Context, (int)prop, fvals); case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: case AL_STEREO_ANGLES: break; } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer64 property 0x%04x", + prop); } #undef CHECKVAL @@ -1122,7 +1211,6 @@ static ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALdouble *values) { ALCdevice *device = Context->Device; - ALbufferlistitem *BufferList; ClockLatency clocktime; ALuint64 srcclock; ALint ivals[3]; @@ -1192,28 +1280,6 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p *values = Source->DopplerFactor; return AL_TRUE; - case AL_SEC_LENGTH_SOFT: - ReadLock(&Source->queue_lock); - if(!(BufferList=Source->queue)) - *values = 0; - else - { - ALint length = 0; - ALsizei freq = 1; - do { - ALbuffer *buffer = BufferList->buffer; - if(buffer && buffer->SampleLen > 0) - { - freq = buffer->Frequency; - length += buffer->SampleLen; - } - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } while(BufferList != NULL); - *values = (ALdouble)length / (ALdouble)freq; - } - ReadUnlock(&Source->queue_lock); - return AL_TRUE; - case AL_SOURCE_RADIUS: *values = Source->Radius; return AL_TRUE; @@ -1228,7 +1294,9 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p * clock time with the device latency. Order is important. */ values[0] = GetSourceSecOffset(Source, Context, &srcclock); - clocktime = V0(device->Backend,getClockLatency)(); + almtx_lock(&device->BackendLock); + clocktime = GetClockLatency(device); + almtx_unlock(&device->BackendLock); if(srcclock == (ALuint64)clocktime.ClockTime) values[1] = (ALdouble)clocktime.Latency / 1000000000.0; else @@ -1243,6 +1311,11 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p } return AL_TRUE; + case AL_SEC_OFFSET_CLOCK_SOFT: + values[0] = GetSourceSecOffset(Source, Context, &srcclock); + values[1] = srcclock / 1000000000.0; + return AL_TRUE; + case AL_POSITION: values[0] = Source->Position[0]; values[1] = Source->Position[1]; @@ -1281,8 +1354,6 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: case AL_DIRECT_CHANNELS_SOFT: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: case AL_DISTANCE_MODEL: case AL_SOURCE_RESAMPLER_SOFT: case AL_SOURCE_SPATIALIZE_SOFT: @@ -1294,11 +1365,13 @@ static ALboolean GetSourcedv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_DIRECT_FILTER: case AL_AUXILIARY_SEND_FILTER: case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source double property 0x%04x", + prop); } static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint *values) @@ -1318,91 +1391,30 @@ static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p return AL_TRUE; case AL_BUFFER: - ReadLock(&Source->queue_lock); BufferList = (Source->SourceType == AL_STATIC) ? Source->queue : NULL; - *values = (BufferList && BufferList->buffer) ? BufferList->buffer->id : 0; - ReadUnlock(&Source->queue_lock); + *values = (BufferList && BufferList->num_buffers >= 1 && BufferList->buffers[0]) ? + BufferList->buffers[0]->id : 0; return AL_TRUE; case AL_SOURCE_STATE: *values = GetSourceState(Source, GetSourceVoice(Source, Context)); return AL_TRUE; - case AL_BYTE_LENGTH_SOFT: - ReadLock(&Source->queue_lock); - if(!(BufferList=Source->queue)) - *values = 0; - else - { - ALint length = 0; - do { - ALbuffer *buffer = BufferList->buffer; - if(buffer && buffer->SampleLen > 0) - { - ALuint byte_align, sample_align; - if(buffer->OriginalType == UserFmtIMA4) - { - ALsizei align = (buffer->OriginalAlign-1)/2 + 4; - byte_align = align * ChannelsFromFmt(buffer->FmtChannels); - sample_align = buffer->OriginalAlign; - } - else if(buffer->OriginalType == UserFmtMSADPCM) - { - ALsizei align = (buffer->OriginalAlign-2)/2 + 7; - byte_align = align * ChannelsFromFmt(buffer->FmtChannels); - sample_align = buffer->OriginalAlign; - } - else - { - ALsizei align = buffer->OriginalAlign; - byte_align = align * ChannelsFromFmt(buffer->FmtChannels); - sample_align = buffer->OriginalAlign; - } - - length += buffer->SampleLen / sample_align * byte_align; - } - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } while(BufferList != NULL); - *values = length; - } - ReadUnlock(&Source->queue_lock); - return AL_TRUE; - - case AL_SAMPLE_LENGTH_SOFT: - ReadLock(&Source->queue_lock); - if(!(BufferList=Source->queue)) - *values = 0; - else - { - ALint length = 0; - do { - ALbuffer *buffer = BufferList->buffer; - if(buffer) length += buffer->SampleLen; - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } while(BufferList != NULL); - *values = length; - } - ReadUnlock(&Source->queue_lock); - return AL_TRUE; - case AL_BUFFERS_QUEUED: - ReadLock(&Source->queue_lock); if(!(BufferList=Source->queue)) *values = 0; else { ALsizei count = 0; do { - ++count; + count += BufferList->num_buffers; BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); } while(BufferList != NULL); *values = count; } - ReadUnlock(&Source->queue_lock); return AL_TRUE; case AL_BUFFERS_PROCESSED: - ReadLock(&Source->queue_lock); if(Source->Looping || Source->SourceType != AL_STREAMING) { /* Buffers on a looping source are in a perpetual state of @@ -1417,19 +1429,18 @@ static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p ALvoice *voice; if((voice=GetSourceVoice(Source, Context)) != NULL) - Current = ATOMIC_LOAD_SEQ(&voice->current_buffer); - else if(ATOMIC_LOAD_SEQ(&Source->state) == AL_INITIAL) + Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); + else if(Source->state == AL_INITIAL) Current = BufferList; while(BufferList && BufferList != Current) { - played++; + played += BufferList->num_buffers; BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } *values = played; } - ReadUnlock(&Source->queue_lock); return AL_TRUE; case AL_SOURCE_TYPE: @@ -1482,7 +1493,6 @@ static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p case AL_AIR_ABSORPTION_FACTOR: case AL_ROOM_ROLLOFF_FACTOR: case AL_CONE_OUTER_GAINHF: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) *values = (ALint)dvals[0]; @@ -1514,8 +1524,10 @@ static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p return err; case AL_SAMPLE_OFFSET_LATENCY_SOFT: + case AL_SAMPLE_OFFSET_CLOCK_SOFT: break; /* i64 only */ case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: break; /* Double only */ case AL_STEREO_ANGLES: break; /* Float/double only */ @@ -1526,7 +1538,8 @@ static ALboolean GetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp p } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer property 0x%04x", + prop); } static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, ALint64 *values) @@ -1545,7 +1558,9 @@ static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp * clock time with the device latency. Order is important. */ values[0] = GetSourceSampleOffset(Source, Context, &srcclock); - clocktime = V0(device->Backend,getClockLatency)(); + almtx_lock(&device->BackendLock); + clocktime = GetClockLatency(device); + almtx_unlock(&device->BackendLock); if(srcclock == (ALuint64)clocktime.ClockTime) values[1] = clocktime.Latency; else @@ -1559,6 +1574,11 @@ static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp } return AL_TRUE; + case AL_SAMPLE_OFFSET_CLOCK_SOFT: + values[0] = GetSourceSampleOffset(Source, Context, &srcclock); + values[1] = srcclock; + return AL_TRUE; + /* 1x float/double */ case AL_CONE_INNER_ANGLE: case AL_CONE_OUTER_ANGLE: @@ -1577,7 +1597,6 @@ static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp case AL_AIR_ABSORPTION_FACTOR: case AL_ROOM_ROLLOFF_FACTOR: case AL_CONE_OUTER_GAINHF: - case AL_SEC_LENGTH_SOFT: case AL_SOURCE_RADIUS: if((err=GetSourcedv(Source, Context, prop, dvals)) != AL_FALSE) *values = (ALint64)dvals[0]; @@ -1614,8 +1633,6 @@ static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp case AL_SOURCE_STATE: case AL_BUFFERS_QUEUED: case AL_BUFFERS_PROCESSED: - case AL_BYTE_LENGTH_SOFT: - case AL_SAMPLE_LENGTH_SOFT: case AL_SOURCE_TYPE: case AL_DIRECT_FILTER_GAINHF_AUTO: case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: @@ -1646,63 +1663,45 @@ static ALboolean GetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp return err; case AL_SEC_OFFSET_LATENCY_SOFT: + case AL_SEC_OFFSET_CLOCK_SOFT: break; /* Double only */ case AL_STEREO_ANGLES: break; /* Float/double only */ } ERR("Unexpected property: 0x%04x\n", prop); - SET_ERROR_AND_RETURN_VALUE(Context, AL_INVALID_ENUM, AL_FALSE); + SETERR_RETURN(Context, AL_INVALID_ENUM, AL_FALSE, "Invalid source integer64 property 0x%04x", + prop); } AL_API ALvoid AL_APIENTRY alGenSources(ALsizei n, ALuint *sources) { - ALCdevice *device; ALCcontext *context; ALsizei cur = 0; - ALenum err; context = GetContextRef(); if(!context) return; if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - device = context->Device; - for(cur = 0;cur < n;cur++) + alSetError(context, AL_INVALID_VALUE, "Generating %d sources", n); + else for(cur = 0;cur < n;cur++) { - ALsource *source = al_calloc(16, sizeof(ALsource)); + ALsource *source = AllocSource(context); if(!source) { alDeleteSources(cur, sources); - SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done); + break; } - InitSourceParams(source, device->NumAuxSends); - - err = NewThunkEntry(&source->id); - if(err == AL_NO_ERROR) - err = InsertUIntMapEntry(&context->SourceMap, source->id, source); - if(err != AL_NO_ERROR) - { - FreeThunkEntry(source->id); - memset(source, 0, sizeof(ALsource)); - al_free(source); - - alDeleteSources(cur, sources); - SET_ERROR_AND_GOTO(context, err, done); - } - sources[cur] = source->id; } -done: ALCcontext_DecRef(context); } AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources) { - ALCdevice *device; ALCcontext *context; ALsource *Source; ALsizei i; @@ -1710,41 +1709,24 @@ AL_API ALvoid AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources) context = GetContextRef(); if(!context) return; - LockSourcesWrite(context); + LockSourceList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d sources", n); /* Check that all Sources are valid */ for(i = 0;i < n;i++) { if(LookupSource(context, sources[i]) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); } - device = context->Device; for(i = 0;i < n;i++) { - ALvoice *voice; - - if((Source=RemoveSource(context, sources[i])) == NULL) - continue; - FreeThunkEntry(Source->id); - - ALCdevice_Lock(device); - if((voice=GetSourceVoice(Source, context)) != NULL) - { - ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); - ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - } - ALCdevice_Unlock(device); - - DeinitSource(Source, device->NumAuxSends); - - memset(Source, 0, sizeof(*Source)); - al_free(Source); + if((Source=LookupSource(context, sources[i])) != NULL) + FreeSource(context, Source); } done: - UnlockSourcesWrite(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -1757,9 +1739,9 @@ AL_API ALboolean AL_APIENTRY alIsSource(ALuint source) context = GetContextRef(); if(!context) return AL_FALSE; - LockSourcesRead(context); + LockSourceList(context); ret = (LookupSource(context, source) ? AL_TRUE : AL_FALSE); - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); @@ -1775,16 +1757,16 @@ AL_API ALvoid AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value) Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(FloatValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid float property 0x%04x", param); else SetSourcefv(Source, Context, param, &value); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1797,19 +1779,19 @@ AL_API ALvoid AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1 Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(FloatValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-float property 0x%04x", param); else { ALfloat fvals[3] = { value1, value2, value3 }; SetSourcefv(Source, Context, param, fvals); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1822,18 +1804,18 @@ AL_API ALvoid AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(FloatValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid float-vector property 0x%04x", param); else SetSourcefv(Source, Context, param, values); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1847,19 +1829,19 @@ AL_API ALvoid AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble va Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(DoubleValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid double property 0x%04x", param); else { ALfloat fval = (ALfloat)value; SetSourcefv(Source, Context, param, &fval); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1872,19 +1854,19 @@ AL_API ALvoid AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble v Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(DoubleValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-double property 0x%04x", param); else { ALfloat fvals[3] = { (ALfloat)value1, (ALfloat)value2, (ALfloat)value3 }; SetSourcefv(Source, Context, param, fvals); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1898,14 +1880,14 @@ AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdo Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!((count=DoubleValsByProp(param)) > 0 && count <= 6)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid double-vector property 0x%04x", param); else { ALfloat fvals[6]; @@ -1915,8 +1897,8 @@ AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdo fvals[i] = (ALfloat)values[i]; SetSourcefv(Source, Context, param, fvals); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1930,16 +1912,16 @@ AL_API ALvoid AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value) Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(IntValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer property 0x%04x", param); else SetSourceiv(Source, Context, param, &value); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1952,19 +1934,19 @@ AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, AL Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(IntValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer property 0x%04x", param); else { ALint ivals[3] = { value1, value2, value3 }; SetSourceiv(Source, Context, param, ivals); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -1977,18 +1959,18 @@ AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *val Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(IntValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer-vector property 0x%04x", param); else SetSourceiv(Source, Context, param, values); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -2002,16 +1984,16 @@ AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SO Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(Int64ValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer64 property 0x%04x", param); else SetSourcei64v(Source, Context, param, &value); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -2024,19 +2006,19 @@ AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOF Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(Int64ValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer64 property 0x%04x", param); else { ALint64SOFT i64vals[3] = { value1, value2, value3 }; SetSourcei64v(Source, Context, param, i64vals); } - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -2049,18 +2031,18 @@ AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALin Context = GetContextRef(); if(!Context) return; - WriteLock(&Context->PropLock); - LockSourcesRead(Context); + almtx_lock(&Context->PropLock); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(Int64ValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer64-vector property 0x%04x", param); else SetSourcei64v(Source, Context, param, values); - UnlockSourcesRead(Context); - WriteUnlock(&Context->PropLock); + UnlockSourceList(Context); + almtx_unlock(&Context->PropLock); ALCcontext_DecRef(Context); } @@ -2074,22 +2056,20 @@ AL_API ALvoid AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *val Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!value) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(FloatValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid float property 0x%04x", param); else { ALdouble dval; if(GetSourcedv(Source, Context, param, &dval)) *value = (ALfloat)dval; } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2103,14 +2083,13 @@ AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *va Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(FloatValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-float property 0x%04x", param); else { ALdouble dvals[3]; @@ -2121,8 +2100,7 @@ AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *va *value3 = (ALfloat)dvals[2]; } } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2137,14 +2115,13 @@ AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *va Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!((count=FloatValsByProp(param)) > 0 && count <= 6)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid float-vector property 0x%04x", param); else { ALdouble dvals[6]; @@ -2155,8 +2132,7 @@ AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *va values[i] = (ALfloat)dvals[i]; } } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2170,18 +2146,16 @@ AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble * Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!value) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(DoubleValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid double property 0x%04x", param); else GetSourcedv(Source, Context, param, value); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2194,14 +2168,13 @@ AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(DoubleValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-double property 0x%04x", param); else { ALdouble dvals[3]; @@ -2212,8 +2185,7 @@ AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble *value3 = dvals[2]; } } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2226,18 +2198,16 @@ AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(DoubleValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid double-vector property 0x%04x", param); else GetSourcedv(Source, Context, param, values); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2251,18 +2221,16 @@ AL_API ALvoid AL_APIENTRY alGetSourcei(ALuint source, ALenum param, ALint *value Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!value) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(IntValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer property 0x%04x", param); else GetSourceiv(Source, Context, param, value); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2276,14 +2244,13 @@ AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1 Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(IntValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer property 0x%04x", param); else { ALint ivals[3]; @@ -2294,8 +2261,7 @@ AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1 *value3 = ivals[2]; } } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2309,18 +2275,16 @@ AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(IntValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer-vector property 0x%04x", param); else GetSourceiv(Source, Context, param, values); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2334,18 +2298,16 @@ AL_API void AL_APIENTRY alGetSourcei64SOFT(ALuint source, ALenum param, ALint64S Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!value) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(Int64ValsByProp(param) == 1)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer64 property 0x%04x", param); else GetSourcei64v(Source, Context, param, value); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2358,14 +2320,13 @@ AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64 Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!(value1 && value2 && value3)) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(Int64ValsByProp(param) == 3)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid 3-integer64 property 0x%04x", param); else { ALint64 i64vals[3]; @@ -2376,8 +2337,7 @@ AL_API void AL_APIENTRY alGetSource3i64SOFT(ALuint source, ALenum param, ALint64 *value3 = i64vals[2]; } } - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2390,18 +2350,16 @@ AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64 Context = GetContextRef(); if(!Context) return; - ReadLock(&Context->PropLock); - LockSourcesRead(Context); + LockSourceList(Context); if((Source=LookupSource(Context, source)) == NULL) - alSetError(Context, AL_INVALID_NAME); + alSetError(Context, AL_INVALID_NAME, "Invalid source ID %u", source); else if(!values) - alSetError(Context, AL_INVALID_VALUE); + alSetError(Context, AL_INVALID_VALUE, "NULL pointer"); else if(!(Int64ValsByProp(param) > 0)) - alSetError(Context, AL_INVALID_ENUM); + alSetError(Context, AL_INVALID_ENUM, "Invalid integer64-vector property 0x%04x", param); else GetSourcei64v(Source, Context, param, values); - UnlockSourcesRead(Context); - ReadUnlock(&Context->PropLock); + UnlockSourceList(Context); ALCcontext_DecRef(Context); } @@ -2422,24 +2380,27 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) context = GetContextRef(); if(!context) return; - LockSourcesRead(context); + LockSourceList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Playing %d sources", n); for(i = 0;i < n;i++) { if(!LookupSource(context, sources[i])) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); } device = context->Device; ALCdevice_Lock(device); /* If the device is disconnected, go right to stopped. */ - if(!device->Connected) + if(!ATOMIC_LOAD(&device->Connected, almemory_order_acquire)) { + /* TODO: Send state change event? */ for(i = 0;i < n;i++) { source = LookupSource(context, sources[i]); - ATOMIC_STORE(&source->state, AL_STOPPED, almemory_order_relaxed); + source->OffsetType = AL_NONE; + source->Offset = 0.0; + source->state = AL_STOPPED; } ALCdevice_Unlock(device); goto done; @@ -2451,7 +2412,8 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) if(context->MaxVoices >= newcount) { ALCdevice_Unlock(device); - SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done); + SETERR_GOTO(context, AL_OUT_OF_MEMORY, done, + "Overflow increasing voice count %d -> %d", context->MaxVoices, newcount); } AllocateVoices(context, newcount, device->NumAuxSends); } @@ -2459,34 +2421,33 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) for(i = 0;i < n;i++) { ALbufferlistitem *BufferList; - ALbuffer *buffer = NULL; bool start_fading = false; - ALsizei s; + ALint vidx = -1; source = LookupSource(context, sources[i]); - WriteLock(&source->queue_lock); /* Check that there is a queue containing at least one valid, non zero - * length Buffer. + * length buffer. */ BufferList = source->queue; - while(BufferList) - { - if((buffer=BufferList->buffer) != NULL && buffer->SampleLen > 0) - break; + while(BufferList && BufferList->max_samples == 0) BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } /* If there's nothing to play, go right to stopped. */ - if(!BufferList) + if(UNLIKELY(!BufferList)) { /* NOTE: A source without any playable buffers should not have an * ALvoice since it shouldn't be in a playing or paused state. So * there's no need to look up its voice and clear the source. */ - ATOMIC_STORE(&source->state, AL_STOPPED, almemory_order_relaxed); + ALenum oldstate = GetSourceState(source, NULL); source->OffsetType = AL_NONE; source->Offset = 0.0; - goto finish_play; + if(oldstate != AL_STOPPED) + { + source->state = AL_STOPPED; + SendStateChangeEvent(context, source->id, AL_STOPPED); + } + continue; } voice = GetSourceVoice(source, context); @@ -2498,37 +2459,37 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed); ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed); ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_release); - goto finish_play; + continue; case AL_PAUSED: assert(voice != NULL); /* A source that's paused simply resumes. */ ATOMIC_STORE(&voice->Playing, true, almemory_order_release); - ATOMIC_STORE(&source->state, AL_PLAYING, almemory_order_release); - goto finish_play; + source->state = AL_PLAYING; + SendStateChangeEvent(context, source->id, AL_PLAYING); + continue; default: break; } - /* Make sure this source isn't already active, and if not, look for an - * unused voice to put it in. - */ + /* Look for an unused voice to play this source with. */ assert(voice == NULL); for(j = 0;j < context->VoiceCount;j++) { if(ATOMIC_LOAD(&context->Voices[j]->Source, almemory_order_acquire) == NULL) { - voice = context->Voices[j]; + vidx = j; break; } } - if(voice == NULL) - voice = context->Voices[context->VoiceCount++]; + if(vidx == -1) + vidx = context->VoiceCount++; + voice = context->Voices[vidx]; ATOMIC_STORE(&voice->Playing, false, almemory_order_release); ATOMIC_FLAG_TEST_AND_SET(&source->PropsClean, almemory_order_acquire); - UpdateSourceProps(source, voice, device->NumAuxSends); + UpdateSourceProps(source, voice, device->NumAuxSends, context); /* A source that's not playing or paused has any offset applied when it * starts playing. @@ -2540,16 +2501,21 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_relaxed); ATOMIC_STORE(&voice->position, 0, almemory_order_relaxed); ATOMIC_STORE(&voice->position_fraction, 0, almemory_order_relaxed); - if(source->OffsetType != AL_NONE) - { - ApplyOffset(source, voice); + if(ApplyOffset(source, voice) != AL_FALSE) start_fading = ATOMIC_LOAD(&voice->position, almemory_order_relaxed) != 0 || ATOMIC_LOAD(&voice->position_fraction, almemory_order_relaxed) != 0 || ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed) != BufferList; - } - voice->NumChannels = ChannelsFromFmt(buffer->FmtChannels); - voice->SampleSize = BytesFromFmt(buffer->FmtType); + for(j = 0;j < BufferList->num_buffers;j++) + { + ALbuffer *buffer = BufferList->buffers[j]; + if(buffer) + { + voice->NumChannels = ChannelsFromFmt(buffer->FmtChannels); + voice->SampleSize = BytesFromFmt(buffer->FmtType); + break; + } + } /* Clear previous samples. */ memset(voice->PrevSamples, 0, sizeof(voice->PrevSamples)); @@ -2560,31 +2526,29 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources) voice->Step = 0; voice->Flags = start_fading ? VOICE_IS_FADING : 0; + if(source->SourceType == AL_STATIC) voice->Flags |= VOICE_IS_STATIC; memset(voice->Direct.Params, 0, sizeof(voice->Direct.Params[0])*voice->NumChannels); - for(s = 0;s < device->NumAuxSends;s++) - memset(voice->Send[s].Params, 0, sizeof(voice->Send[s].Params[0])*voice->NumChannels); + for(j = 0;j < device->NumAuxSends;j++) + memset(voice->Send[j].Params, 0, sizeof(voice->Send[j].Params[0])*voice->NumChannels); if(device->AvgSpeakerDist > 0.0f) { ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC / - (device->AvgSpeakerDist * device->Frequency); + (device->AvgSpeakerDist * device->Frequency); for(j = 0;j < voice->NumChannels;j++) - { - NfcFilterCreate1(&voice->Direct.Params[j].NFCtrlFilter[0], 0.0f, w1); - NfcFilterCreate2(&voice->Direct.Params[j].NFCtrlFilter[1], 0.0f, w1); - NfcFilterCreate3(&voice->Direct.Params[j].NFCtrlFilter[2], 0.0f, w1); - } + NfcFilterCreate(&voice->Direct.Params[j].NFCtrlFilter, 0.0f, w1); } ATOMIC_STORE(&voice->Source, source, almemory_order_relaxed); ATOMIC_STORE(&voice->Playing, true, almemory_order_release); - ATOMIC_STORE(&source->state, AL_PLAYING, almemory_order_release); - finish_play: - WriteUnlock(&source->queue_lock); + source->state = AL_PLAYING; + source->VoiceIdx = vidx; + + SendStateChangeEvent(context, source->id, AL_PLAYING); } ALCdevice_Unlock(device); done: - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2603,13 +2567,13 @@ AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources) context = GetContextRef(); if(!context) return; - LockSourcesRead(context); + LockSourceList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Pausing %d sources", n); for(i = 0;i < n;i++) { if(!LookupSource(context, sources[i])) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); } device = context->Device; @@ -2617,21 +2581,18 @@ AL_API ALvoid AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources) for(i = 0;i < n;i++) { source = LookupSource(context, sources[i]); - WriteLock(&source->queue_lock); if((voice=GetSourceVoice(source, context)) != NULL) - { ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); - } if(GetSourceState(source, voice) == AL_PLAYING) - ATOMIC_STORE(&source->state, AL_PAUSED, almemory_order_release); - WriteUnlock(&source->queue_lock); + { + source->state = AL_PAUSED; + SendStateChangeEvent(context, source->id, AL_PAUSED); + } } ALCdevice_Unlock(device); done: - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2650,38 +2611,40 @@ AL_API ALvoid AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources) context = GetContextRef(); if(!context) return; - LockSourcesRead(context); + LockSourceList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Stopping %d sources", n); for(i = 0;i < n;i++) { if(!LookupSource(context, sources[i])) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); } device = context->Device; ALCdevice_Lock(device); for(i = 0;i < n;i++) { + ALenum oldstate; source = LookupSource(context, sources[i]); - WriteLock(&source->queue_lock); if((voice=GetSourceVoice(source, context)) != NULL) { ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); + voice = NULL; + } + oldstate = GetSourceState(source, voice); + if(oldstate != AL_INITIAL && oldstate != AL_STOPPED) + { + source->state = AL_STOPPED; + SendStateChangeEvent(context, source->id, AL_STOPPED); } - if(ATOMIC_LOAD(&source->state, almemory_order_acquire) != AL_INITIAL) - ATOMIC_STORE(&source->state, AL_STOPPED, almemory_order_relaxed); source->OffsetType = AL_NONE; source->Offset = 0.0; - WriteUnlock(&source->queue_lock); } ALCdevice_Unlock(device); done: - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2700,13 +2663,13 @@ AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources) context = GetContextRef(); if(!context) return; - LockSourcesRead(context); + LockSourceList(context); if(!(n >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Rewinding %d sources", n); for(i = 0;i < n;i++) { if(!LookupSource(context, sources[i])) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", sources[i]); } device = context->Device; @@ -2714,24 +2677,24 @@ AL_API ALvoid AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources) for(i = 0;i < n;i++) { source = LookupSource(context, sources[i]); - WriteLock(&source->queue_lock); if((voice=GetSourceVoice(source, context)) != NULL) { ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); ATOMIC_STORE(&voice->Playing, false, almemory_order_release); - while((ATOMIC_LOAD(&device->MixCount, almemory_order_acquire)&1)) - althrd_yield(); + voice = NULL; + } + if(GetSourceState(source, voice) != AL_INITIAL) + { + source->state = AL_INITIAL; + SendStateChangeEvent(context, source->id, AL_INITIAL); } - if(ATOMIC_LOAD(&source->state, almemory_order_acquire) != AL_INITIAL) - ATOMIC_STORE(&source->state, AL_INITIAL, almemory_order_relaxed); source->OffsetType = AL_NONE; source->Offset = 0.0; - WriteUnlock(&source->queue_lock); } ALCdevice_Unlock(device); done: - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2754,73 +2717,73 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALu device = context->Device; - LockSourcesRead(context); + LockSourceList(context); if(!(nb >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Queueing %d buffers", nb); if((source=LookupSource(context, src)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); - WriteLock(&source->queue_lock); if(source->SourceType == AL_STATIC) { - WriteUnlock(&source->queue_lock); /* Can't queue on a Static Source */ - SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); + SETERR_GOTO(context, AL_INVALID_OPERATION, done, "Queueing onto static source %u", src); } /* Check for a valid Buffer, for its frequency and format */ BufferList = source->queue; while(BufferList) { - if(BufferList->buffer) + for(i = 0;i < BufferList->num_buffers;i++) { - BufferFmt = BufferList->buffer; - break; + if((BufferFmt=BufferList->buffers[i]) != NULL) + break; } + if(BufferFmt) break; BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); } - LockBuffersRead(device); + LockBufferList(device); BufferListStart = NULL; BufferList = NULL; for(i = 0;i < nb;i++) { ALbuffer *buffer = NULL; if(buffers[i] && (buffer=LookupBuffer(device, buffers[i])) == NULL) - { - WriteUnlock(&source->queue_lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, buffer_error); - } + SETERR_GOTO(context, AL_INVALID_NAME, buffer_error, "Queueing invalid buffer ID %u", + buffers[i]); if(!BufferListStart) { - BufferListStart = al_calloc(DEF_ALIGN, sizeof(ALbufferlistitem)); + BufferListStart = al_calloc(DEF_ALIGN, + FAM_SIZE(ALbufferlistitem, buffers, 1)); BufferList = BufferListStart; } else { - ALbufferlistitem *item = al_calloc(DEF_ALIGN, sizeof(ALbufferlistitem)); + ALbufferlistitem *item = al_calloc(DEF_ALIGN, + FAM_SIZE(ALbufferlistitem, buffers, 1)); ATOMIC_STORE(&BufferList->next, item, almemory_order_relaxed); BufferList = item; } - BufferList->buffer = buffer; ATOMIC_INIT(&BufferList->next, NULL); + BufferList->max_samples = buffer ? buffer->SampleLen : 0; + BufferList->num_buffers = 1; + BufferList->buffers[0] = buffer; if(!buffer) continue; - /* Hold a read lock on each buffer being queued while checking all - * provided buffers. This is done so other threads don't see an extra - * reference on some buffers if this operation ends up failing. */ - ReadLock(&buffer->lock); IncrementRef(&buffer->ref); + if(buffer->MappedAccess != 0 && !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) + SETERR_GOTO(context, AL_INVALID_OPERATION, buffer_error, + "Queueing non-persistently mapped buffer %u", buffer->id); + if(BufferFmt == NULL) BufferFmt = buffer; else if(BufferFmt->Frequency != buffer->Frequency || - BufferFmt->OriginalChannels != buffer->OriginalChannels || + BufferFmt->FmtChannels != buffer->FmtChannels || BufferFmt->OriginalType != buffer->OriginalType) { - WriteUnlock(&source->queue_lock); - SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, buffer_error); + alSetError(context, AL_INVALID_OPERATION, "Queueing buffer with mismatched format"); buffer_error: /* A buffer failed (invalid ID or format), so unlock and release @@ -2829,27 +2792,20 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALu { ALbufferlistitem *next = ATOMIC_LOAD(&BufferListStart->next, almemory_order_relaxed); - if((buffer=BufferListStart->buffer) != NULL) + for(i = 0;i < BufferListStart->num_buffers;i++) { - DecrementRef(&buffer->ref); - ReadUnlock(&buffer->lock); + if((buffer=BufferListStart->buffers[i]) != NULL) + DecrementRef(&buffer->ref); } al_free(BufferListStart); BufferListStart = next; } - UnlockBuffersRead(device); + UnlockBufferList(device); goto done; } } - /* All buffers good, unlock them now. */ - BufferList = BufferListStart; - while(BufferList != NULL) - { - ALbuffer *buffer = BufferList->buffer; - if(buffer) ReadUnlock(&buffer->lock); - BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - } - UnlockBuffersRead(device); + /* All buffers good. */ + UnlockBufferList(device); /* Source is now streaming */ source->SourceType = AL_STREAMING; @@ -2863,10 +2819,124 @@ AL_API ALvoid AL_APIENTRY alSourceQueueBuffers(ALuint src, ALsizei nb, const ALu BufferList = next; ATOMIC_STORE(&BufferList->next, BufferListStart, almemory_order_release); } - WriteUnlock(&source->queue_lock); done: - UnlockSourcesRead(context); + UnlockSourceList(context); + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alSourceQueueBufferLayersSOFT(ALuint src, ALsizei nb, const ALuint *buffers) +{ + ALCdevice *device; + ALCcontext *context; + ALbufferlistitem *BufferListStart; + ALbufferlistitem *BufferList; + ALbuffer *BufferFmt = NULL; + ALsource *source; + ALsizei i; + + if(nb == 0) + return; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + + LockSourceList(context); + if(!(nb >= 0 && nb < 16)) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Queueing %d buffer layers", nb); + if((source=LookupSource(context, src)) == NULL) + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); + + if(source->SourceType == AL_STATIC) + { + /* Can't queue on a Static Source */ + SETERR_GOTO(context, AL_INVALID_OPERATION, done, "Queueing onto static source %u", src); + } + + /* Check for a valid Buffer, for its frequency and format */ + BufferList = source->queue; + while(BufferList) + { + for(i = 0;i < BufferList->num_buffers;i++) + { + if((BufferFmt=BufferList->buffers[i]) != NULL) + break; + } + if(BufferFmt) break; + BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); + } + + LockBufferList(device); + BufferListStart = al_calloc(DEF_ALIGN, FAM_SIZE(ALbufferlistitem, buffers, nb)); + BufferList = BufferListStart; + ATOMIC_INIT(&BufferList->next, NULL); + BufferList->max_samples = 0; + BufferList->num_buffers = 0; + for(i = 0;i < nb;i++) + { + ALbuffer *buffer = NULL; + if(buffers[i] && (buffer=LookupBuffer(device, buffers[i])) == NULL) + SETERR_GOTO(context, AL_INVALID_NAME, buffer_error, "Queueing invalid buffer ID %u", + buffers[i]); + + BufferList->buffers[BufferList->num_buffers++] = buffer; + if(!buffer) continue; + + IncrementRef(&buffer->ref); + + BufferList->max_samples = maxi(BufferList->max_samples, buffer->SampleLen); + + if(buffer->MappedAccess != 0 && !(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT)) + SETERR_GOTO(context, AL_INVALID_OPERATION, buffer_error, + "Queueing non-persistently mapped buffer %u", buffer->id); + + if(BufferFmt == NULL) + BufferFmt = buffer; + else if(BufferFmt->Frequency != buffer->Frequency || + BufferFmt->FmtChannels != buffer->FmtChannels || + BufferFmt->OriginalType != buffer->OriginalType) + { + alSetError(context, AL_INVALID_OPERATION, "Queueing buffer with mismatched format"); + + buffer_error: + /* A buffer failed (invalid ID or format), so unlock and release + * each buffer we had. */ + while(BufferListStart) + { + ALbufferlistitem *next = ATOMIC_LOAD(&BufferListStart->next, + almemory_order_relaxed); + for(i = 0;i < BufferListStart->num_buffers;i++) + { + if((buffer=BufferListStart->buffers[i]) != NULL) + DecrementRef(&buffer->ref); + } + al_free(BufferListStart); + BufferListStart = next; + } + UnlockBufferList(device); + goto done; + } + } + /* All buffers good. */ + UnlockBufferList(device); + + /* Source is now streaming */ + source->SourceType = AL_STREAMING; + + if(!(BufferList=source->queue)) + source->queue = BufferListStart; + else + { + ALbufferlistitem *next; + while((next=ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed)) != NULL) + BufferList = next; + ATOMIC_STORE(&BufferList->next, BufferListStart, almemory_order_release); + } + +done: + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2874,80 +2944,95 @@ AL_API ALvoid AL_APIENTRY alSourceUnqueueBuffers(ALuint src, ALsizei nb, ALuint { ALCcontext *context; ALsource *source; - ALbufferlistitem *OldHead; - ALbufferlistitem *OldTail; + ALbufferlistitem *BufferList; ALbufferlistitem *Current; ALvoice *voice; - ALsizei i = 0; + ALsizei i; context = GetContextRef(); if(!context) return; - LockSourcesRead(context); + LockSourceList(context); if(!(nb >= 0)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing %d buffers", nb); if((source=LookupSource(context, src)) == NULL) - SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid source ID %u", src); /* Nothing to unqueue. */ if(nb == 0) goto done; - WriteLock(&source->queue_lock); - if(source->Looping || source->SourceType != AL_STREAMING) - { - WriteUnlock(&source->queue_lock); - /* Trying to unqueue buffers on a looping or non-streaming source. */ - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - } + if(source->Looping) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing from looping source %u", src); + if(source->SourceType != AL_STREAMING) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing from a non-streaming source %u", + src); - /* Find the new buffer queue head */ - OldTail = source->queue; + /* Make sure enough buffers have been processed to unqueue. */ + BufferList = source->queue; Current = NULL; if((voice=GetSourceVoice(source, context)) != NULL) - Current = ATOMIC_LOAD_SEQ(&voice->current_buffer); - else if(ATOMIC_LOAD_SEQ(&source->state) == AL_INITIAL) - Current = OldTail; - if(OldTail != Current) + Current = ATOMIC_LOAD(&voice->current_buffer, almemory_order_relaxed); + else if(source->state == AL_INITIAL) + Current = BufferList; + if(BufferList == Current) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing pending buffers"); + + i = BufferList->num_buffers; + while(i < nb) { - for(i = 1;i < nb;i++) - { - ALbufferlistitem *next = ATOMIC_LOAD(&OldTail->next, almemory_order_relaxed); - if(!next || next == Current) break; - OldTail = next; - } - } - if(i != nb) - { - WriteUnlock(&source->queue_lock); - /* Trying to unqueue pending buffers. */ - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + /* If the next bufferlist to check is NULL or is the current one, it's + * trying to unqueue pending buffers. + */ + ALbufferlistitem *next = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); + if(!next || next == Current) + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Unqueueing pending buffers"); + BufferList = next; + + i += BufferList->num_buffers; } - /* Swap it, and cut the new head from the old. */ - OldHead = source->queue; - source->queue = ATOMIC_EXCHANGE_PTR(&OldTail->next, NULL, almemory_order_acq_rel); - WriteUnlock(&source->queue_lock); - - while(OldHead != NULL) + while(nb > 0) { - ALbufferlistitem *next = ATOMIC_LOAD(&OldHead->next, almemory_order_relaxed); - ALbuffer *buffer = OldHead->buffer; - - if(!buffer) - *(buffers++) = 0; - else + ALbufferlistitem *head = source->queue; + ALbufferlistitem *next = ATOMIC_LOAD(&head->next, almemory_order_relaxed); + for(i = 0;i < head->num_buffers && nb > 0;i++,nb--) { - *(buffers++) = buffer->id; - DecrementRef(&buffer->ref); + ALbuffer *buffer = head->buffers[i]; + if(!buffer) + *(buffers++) = 0; + else + { + *(buffers++) = buffer->id; + DecrementRef(&buffer->ref); + } + } + if(i < head->num_buffers) + { + /* This head has some buffers left over, so move them to the front + * and update the sample and buffer count. + */ + ALsizei max_length = 0; + ALsizei j = 0; + while(i < head->num_buffers) + { + ALbuffer *buffer = head->buffers[i++]; + if(buffer) max_length = maxi(max_length, buffer->SampleLen); + head->buffers[j++] = buffer; + } + head->max_samples = max_length; + head->num_buffers = j; + break; } - al_free(OldHead); - OldHead = next; + /* Otherwise, free this item and set the source queue head to the next + * one. + */ + al_free(head); + source->queue = next; } done: - UnlockSourcesRead(context); + UnlockSourceList(context); ALCcontext_DecRef(context); } @@ -2956,8 +3041,6 @@ static void InitSourceParams(ALsource *Source, ALsizei num_sends) { ALsizei i; - RWLockInit(&Source->queue_lock); - Source->InnerAngle = 360.0f; Source->OuterAngle = 360.0f; Source->Pitch = 1.0f; @@ -3022,7 +3105,7 @@ static void InitSourceParams(ALsource *Source, ALsizei num_sends) Source->Offset = 0.0; Source->OffsetType = AL_NONE; Source->SourceType = AL_UNDETERMINED; - ATOMIC_INIT(&Source->state, AL_INITIAL); + Source->state = AL_INITIAL; Source->queue = NULL; @@ -3030,6 +3113,8 @@ static void InitSourceParams(ALsource *Source, ALsizei num_sends) * ignore the test. */ ATOMIC_FLAG_TEST_AND_SET(&Source->PropsClean, almemory_order_relaxed); + + Source->VoiceIdx = -1; } static void DeinitSource(ALsource *source, ALsizei num_sends) @@ -3041,8 +3126,11 @@ static void DeinitSource(ALsource *source, ALsizei num_sends) while(BufferList != NULL) { ALbufferlistitem *next = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); - if(BufferList->buffer != NULL) - DecrementRef(&BufferList->buffer->ref); + for(i = 0;i < BufferList->num_buffers;i++) + { + if(BufferList->buffers[i] != NULL) + DecrementRef(&BufferList->buffers[i]->ref); + } al_free(BufferList); BufferList = next; } @@ -3061,13 +3149,13 @@ static void DeinitSource(ALsource *source, ALsizei num_sends) } } -static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends) +static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_sends, ALCcontext *context) { struct ALvoiceProps *props; ALsizei i; /* Get an unused property container, or allocate a new one as needed. */ - props = ATOMIC_LOAD(&voice->FreeList, almemory_order_acquire); + props = ATOMIC_LOAD(&context->FreeVoiceProps, almemory_order_acquire); if(!props) props = al_calloc(16, FAM_SIZE(struct ALvoiceProps, Send, num_sends)); else @@ -3075,7 +3163,7 @@ static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_send struct ALvoiceProps *next; do { next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); - } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&voice->FreeList, &props, next, + } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeVoiceProps, &props, next, almemory_order_acq_rel, almemory_order_acquire) == 0); } @@ -3145,7 +3233,7 @@ static void UpdateSourceProps(ALsource *source, ALvoice *voice, ALsizei num_send /* If there was an unused update container, put it back in the * freelist. */ - ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &voice->FreeList, props); + ATOMIC_REPLACE_HEAD(struct ALvoiceProps*, &context->FreeVoiceProps, props); } } @@ -3159,7 +3247,7 @@ void UpdateAllSourceProps(ALCcontext *context) ALvoice *voice = context->Voices[pos]; ALsource *source = ATOMIC_LOAD(&voice->Source, almemory_order_acquire); if(source && !ATOMIC_FLAG_TEST_AND_SET(&source->PropsClean, almemory_order_acq_rel)) - UpdateSourceProps(source, voice, num_sends); + UpdateSourceProps(source, voice, num_sends, context); } } @@ -3178,7 +3266,6 @@ static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALui ALuint refcount; ALvoice *voice; - ReadLock(&Source->queue_lock); do { Current = NULL; readPos = 0; @@ -3203,15 +3290,13 @@ static ALint64 GetSourceSampleOffset(ALsource *Source, ALCcontext *context, ALui const ALbufferlistitem *BufferList = Source->queue; while(BufferList && BufferList != Current) { - if(BufferList->buffer) - readPos += (ALuint64)BufferList->buffer->SampleLen << 32; + readPos += (ALuint64)BufferList->max_samples << 32; BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } readPos = minu64(readPos, U64(0x7fffffffffffffff)); } - ReadUnlock(&Source->queue_lock); return (ALint64)readPos; } @@ -3229,7 +3314,6 @@ static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint ALdouble offset; ALvoice *voice; - ReadLock(&Source->queue_lock); do { Current = NULL; readPos = 0; @@ -3256,19 +3340,19 @@ static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint const ALbuffer *BufferFmt = NULL; while(BufferList && BufferList != Current) { - const ALbuffer *buffer = BufferList->buffer; - if(buffer != NULL) - { - if(!BufferFmt) BufferFmt = buffer; - readPos += (ALuint64)buffer->SampleLen << FRACTIONBITS; - } + ALsizei i = 0; + while(!BufferFmt && i < BufferList->num_buffers) + BufferFmt = BufferList->buffers[i++]; + readPos += (ALuint64)BufferList->max_samples << FRACTIONBITS; BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } while(BufferList && !BufferFmt) { - BufferFmt = BufferList->buffer; + ALsizei i = 0; + while(!BufferFmt && i < BufferList->num_buffers) + BufferFmt = BufferList->buffers[i++]; BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } @@ -3278,7 +3362,6 @@ static ALdouble GetSourceSecOffset(ALsource *Source, ALCcontext *context, ALuint (ALdouble)BufferFmt->Frequency; } - ReadUnlock(&Source->queue_lock); return offset; } @@ -3298,7 +3381,6 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *conte ALdouble offset; ALvoice *voice; - ReadLock(&Source->queue_lock); do { Current = NULL; readPos = readPosFrac = 0; @@ -3325,14 +3407,14 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *conte while(BufferList != NULL) { - const ALbuffer *buffer; - readFin = readFin || (BufferList == Current); - if((buffer=BufferList->buffer) != NULL) - { - if(!BufferFmt) BufferFmt = buffer; - totalBufferLen += buffer->SampleLen; - if(!readFin) readPos += buffer->SampleLen; - } + ALsizei i = 0; + while(!BufferFmt && i < BufferList->num_buffers) + BufferFmt = BufferList->buffers[i++]; + + readFin |= (BufferList == Current); + totalBufferLen += BufferList->max_samples; + if(!readFin) readPos += BufferList->max_samples; + BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } @@ -3379,15 +3461,14 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *conte } else { - ALuint FrameSize = FrameSizeFromUserFmt(BufferFmt->OriginalChannels, - BufferFmt->OriginalType); + ALuint FrameSize = FrameSizeFromFmt(BufferFmt->FmtChannels, + BufferFmt->FmtType); offset = (ALdouble)(readPos * FrameSize); } break; } } - ReadUnlock(&Source->queue_lock); return offset; } @@ -3400,8 +3481,7 @@ static ALdouble GetSourceOffset(ALsource *Source, ALenum name, ALCcontext *conte static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) { ALbufferlistitem *BufferList; - const ALbuffer *Buffer; - ALuint bufferLen, totalBufferLen; + ALuint totalBufferLen; ALuint offset = 0; ALsizei frac = 0; @@ -3413,10 +3493,7 @@ static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) BufferList = Source->queue; while(BufferList && totalBufferLen <= offset) { - Buffer = BufferList->buffer; - bufferLen = Buffer ? Buffer->SampleLen : 0; - - if(bufferLen > offset-totalBufferLen) + if((ALuint)BufferList->max_samples > offset-totalBufferLen) { /* Offset is in this buffer */ ATOMIC_STORE(&voice->position, offset - totalBufferLen, almemory_order_relaxed); @@ -3424,8 +3501,7 @@ static ALboolean ApplyOffset(ALsource *Source, ALvoice *voice) ATOMIC_STORE(&voice->current_buffer, BufferList, almemory_order_release); return AL_TRUE; } - - totalBufferLen += bufferLen; + totalBufferLen += BufferList->max_samples; BufferList = ATOMIC_LOAD(&BufferList->next, almemory_order_relaxed); } @@ -3451,8 +3527,10 @@ static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac BufferList = Source->queue; while(BufferList) { - if((BufferFmt=BufferList->buffer) != NULL) - break; + ALsizei i; + for(i = 0;i < BufferList->num_buffers && !BufferFmt;i++) + BufferFmt = BufferList->buffers[i]; + if(BufferFmt) break; BufferList = ATOMIC_LOAD(&CONST_CAST(ALbufferlistitem*,BufferList)->next, almemory_order_relaxed); } @@ -3471,18 +3549,17 @@ static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac if(BufferFmt->OriginalType == UserFmtIMA4) { ALsizei align = (BufferFmt->OriginalAlign-1)/2 + 4; - *offset /= align * ChannelsFromUserFmt(BufferFmt->OriginalChannels); + *offset /= align * ChannelsFromFmt(BufferFmt->FmtChannels); *offset *= BufferFmt->OriginalAlign; } else if(BufferFmt->OriginalType == UserFmtMSADPCM) { ALsizei align = (BufferFmt->OriginalAlign-2)/2 + 7; - *offset /= align * ChannelsFromUserFmt(BufferFmt->OriginalChannels); + *offset /= align * ChannelsFromFmt(BufferFmt->FmtChannels); *offset *= BufferFmt->OriginalAlign; } else - *offset /= FrameSizeFromUserFmt(BufferFmt->OriginalChannels, - BufferFmt->OriginalType); + *offset /= FrameSizeFromFmt(BufferFmt->FmtChannels, BufferFmt->FmtType); *frac = 0; break; @@ -3505,23 +3582,124 @@ static ALboolean GetSampleOffset(ALsource *Source, ALuint *offset, ALsizei *frac } +static ALsource *AllocSource(ALCcontext *context) +{ + ALCdevice *device = context->Device; + SourceSubList *sublist, *subend; + ALsource *source = NULL; + ALsizei lidx = 0; + ALsizei slidx; + + almtx_lock(&context->SourceLock); + if(context->NumSources >= device->SourcesMax) + { + almtx_unlock(&context->SourceLock); + alSetError(context, AL_OUT_OF_MEMORY, "Exceeding %u source limit", device->SourcesMax); + return NULL; + } + sublist = VECTOR_BEGIN(context->SourceList); + subend = VECTOR_END(context->SourceList); + for(;sublist != subend;++sublist) + { + if(sublist->FreeMask) + { + slidx = CTZ64(sublist->FreeMask); + source = sublist->Sources + slidx; + break; + } + ++lidx; + } + if(UNLIKELY(!source)) + { + const SourceSubList empty_sublist = { 0, NULL }; + /* Don't allocate so many list entries that the 32-bit ID could + * overflow... + */ + if(UNLIKELY(VECTOR_SIZE(context->SourceList) >= 1<<25)) + { + almtx_unlock(&device->BufferLock); + alSetError(context, AL_OUT_OF_MEMORY, "Too many sources allocated"); + return NULL; + } + lidx = (ALsizei)VECTOR_SIZE(context->SourceList); + VECTOR_PUSH_BACK(context->SourceList, empty_sublist); + sublist = &VECTOR_BACK(context->SourceList); + sublist->FreeMask = ~U64(0); + sublist->Sources = al_calloc(16, sizeof(ALsource)*64); + if(UNLIKELY(!sublist->Sources)) + { + VECTOR_POP_BACK(context->SourceList); + almtx_unlock(&context->SourceLock); + alSetError(context, AL_OUT_OF_MEMORY, "Failed to allocate source batch"); + return NULL; + } + + slidx = 0; + source = sublist->Sources + slidx; + } + + memset(source, 0, sizeof(*source)); + InitSourceParams(source, device->NumAuxSends); + + /* Add 1 to avoid source ID 0. */ + source->id = ((lidx<<6) | slidx) + 1; + + context->NumSources++; + sublist->FreeMask &= ~(U64(1)<SourceLock); + + return source; +} + +static void FreeSource(ALCcontext *context, ALsource *source) +{ + ALCdevice *device = context->Device; + ALuint id = source->id - 1; + ALsizei lidx = id >> 6; + ALsizei slidx = id & 0x3f; + ALvoice *voice; + + ALCdevice_Lock(device); + if((voice=GetSourceVoice(source, context)) != NULL) + { + ATOMIC_STORE(&voice->Source, NULL, almemory_order_relaxed); + ATOMIC_STORE(&voice->Playing, false, almemory_order_release); + } + ALCdevice_Unlock(device); + + DeinitSource(source, device->NumAuxSends); + memset(source, 0, sizeof(*source)); + + VECTOR_ELEM(context->SourceList, lidx).FreeMask |= U64(1) << slidx; + context->NumSources--; +} + /* ReleaseALSources * * Destroys all sources in the source map. */ -ALvoid ReleaseALSources(ALCcontext *Context) +ALvoid ReleaseALSources(ALCcontext *context) { - ALCdevice *device = Context->Device; - ALsizei pos; - for(pos = 0;pos < Context->SourceMap.size;pos++) + ALCdevice *device = context->Device; + SourceSubList *sublist = VECTOR_BEGIN(context->SourceList); + SourceSubList *subend = VECTOR_END(context->SourceList); + size_t leftover = 0; + for(;sublist != subend;++sublist) { - ALsource *temp = Context->SourceMap.values[pos]; - Context->SourceMap.values[pos] = NULL; + ALuint64 usemask = ~sublist->FreeMask; + while(usemask) + { + ALsizei idx = CTZ64(usemask); + ALsource *source = sublist->Sources + idx; - DeinitSource(temp, device->NumAuxSends); + DeinitSource(source, device->NumAuxSends); + memset(source, 0, sizeof(*source)); + ++leftover; - FreeThunkEntry(temp->id); - memset(temp, 0, sizeof(*temp)); - al_free(temp); + usemask &= ~(U64(1) << idx); + } + sublist->FreeMask = ~usemask; } + if(leftover > 0) + WARN("(%p) Deleted "SZFMT" Source%s\n", device, leftover, (leftover==1)?"":"s"); } diff --git a/love/src/jni/openal-soft-1.18.2/OpenAL32/alState.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/alState.c similarity index 66% rename from love/src/jni/openal-soft-1.18.2/OpenAL32/alState.c rename to love/src/jni/openal-soft-1.19.1/OpenAL32/alState.c index a7dc1006..ce93e143 100644 --- a/love/src/jni/openal-soft-1.18.2/OpenAL32/alState.c +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/alState.c @@ -50,8 +50,27 @@ static const ALchar alErrOutOfMemory[] = "Out of Memory"; /* Resampler strings */ static const ALchar alPointResampler[] = "Nearest"; static const ALchar alLinearResampler[] = "Linear"; -static const ALchar alSinc4Resampler[] = "4-Point Sinc"; -static const ALchar alBSincResampler[] = "Band-limited Sinc (12/24)"; +static const ALchar alCubicResampler[] = "Cubic"; +static const ALchar alBSinc12Resampler[] = "11th order Sinc"; +static const ALchar alBSinc24Resampler[] = "23rd order Sinc"; + +/* WARNING: Non-standard export! Not part of any extension, or exposed in the + * alcFunctions list. + */ +AL_API const ALchar* AL_APIENTRY alsoft_get_version(void) +{ + const char *spoof = getenv("ALSOFT_SPOOF_VERSION"); + if(spoof && spoof[0] != '\0') return spoof; + return ALSOFT_VERSION; +} + +#define DO_UPDATEPROPS() do { \ + if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) \ + UpdateContextProps(context); \ + else \ + ATOMIC_FLAG_CLEAR(&context->PropsClean, almemory_order_release); \ +} while(0) + AL_API ALvoid AL_APIENTRY alEnable(ALenum capability) { @@ -60,21 +79,19 @@ AL_API ALvoid AL_APIENTRY alEnable(ALenum capability) context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + almtx_lock(&context->PropLock); switch(capability) { case AL_SOURCE_DISTANCE_MODEL: context->SourceDistanceModel = AL_TRUE; + DO_UPDATEPROPS(); break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid enable property 0x%04x", capability); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_unlock(&context->PropLock); -done: - WriteUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -85,21 +102,19 @@ AL_API ALvoid AL_APIENTRY alDisable(ALenum capability) context = GetContextRef(); if(!context) return; - WriteLock(&context->PropLock); + almtx_lock(&context->PropLock); switch(capability) { case AL_SOURCE_DISTANCE_MODEL: context->SourceDistanceModel = AL_FALSE; + DO_UPDATEPROPS(); break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid disable property 0x%04x", capability); } - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_unlock(&context->PropLock); -done: - WriteUnlock(&context->PropLock); ALCcontext_DecRef(context); } @@ -111,6 +126,7 @@ AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability) context = GetContextRef(); if(!context) return AL_FALSE; + almtx_lock(&context->PropLock); switch(capability) { case AL_SOURCE_DISTANCE_MODEL: @@ -118,12 +134,11 @@ AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid is enabled property 0x%04x", capability); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); - return value; } @@ -135,6 +150,7 @@ AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum pname) context = GetContextRef(); if(!context) return AL_FALSE; + almtx_lock(&context->PropLock); switch(pname) { case AL_DOPPLER_FACTOR: @@ -177,12 +193,11 @@ AL_API ALboolean AL_APIENTRY alGetBoolean(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid boolean property 0x%04x", pname); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); - return value; } @@ -194,6 +209,7 @@ AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname) context = GetContextRef(); if(!context) return 0.0; + almtx_lock(&context->PropLock); switch(pname) { case AL_DOPPLER_FACTOR: @@ -230,12 +246,11 @@ AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid double property 0x%04x", pname); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); - return value; } @@ -247,6 +262,7 @@ AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname) context = GetContextRef(); if(!context) return 0.0f; + almtx_lock(&context->PropLock); switch(pname) { case AL_DOPPLER_FACTOR: @@ -283,12 +299,11 @@ AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid float property 0x%04x", pname); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); - return value; } @@ -300,6 +315,7 @@ AL_API ALint AL_APIENTRY alGetInteger(ALenum pname) context = GetContextRef(); if(!context) return 0; + almtx_lock(&context->PropLock); switch(pname) { case AL_DOPPLER_FACTOR: @@ -336,12 +352,11 @@ AL_API ALint AL_APIENTRY alGetInteger(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid integer property 0x%04x", pname); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); - return value; } @@ -353,6 +368,7 @@ AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname) context = GetContextRef(); if(!context) return 0; + almtx_lock(&context->PropLock); switch(pname) { case AL_DOPPLER_FACTOR: @@ -389,12 +405,39 @@ AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid integer64 property 0x%04x", pname); } + almtx_unlock(&context->PropLock); -done: ALCcontext_DecRef(context); + return value; +} +AL_API void* AL_APIENTRY alGetPointerSOFT(ALenum pname) +{ + ALCcontext *context; + void *value = NULL; + + context = GetContextRef(); + if(!context) return NULL; + + almtx_lock(&context->PropLock); + switch(pname) + { + case AL_EVENT_CALLBACK_FUNCTION_SOFT: + value = context->EventCb; + break; + + case AL_EVENT_CALLBACK_USER_PARAM_SOFT: + value = context->EventParam; + break; + + default: + alSetError(context, AL_INVALID_VALUE, "Invalid pointer property 0x%04x", pname); + } + almtx_unlock(&context->PropLock); + + ALCcontext_DecRef(context); return value; } @@ -422,15 +465,14 @@ AL_API ALvoid AL_APIENTRY alGetBooleanv(ALenum pname, ALboolean *values) context = GetContextRef(); if(!context) return; - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); switch(pname) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid boolean-vector property 0x%04x", pname); } -done: ALCcontext_DecRef(context); } @@ -458,15 +500,14 @@ AL_API ALvoid AL_APIENTRY alGetDoublev(ALenum pname, ALdouble *values) context = GetContextRef(); if(!context) return; - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); switch(pname) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid double-vector property 0x%04x", pname); } -done: ALCcontext_DecRef(context); } @@ -494,15 +535,14 @@ AL_API ALvoid AL_APIENTRY alGetFloatv(ALenum pname, ALfloat *values) context = GetContextRef(); if(!context) return; - if(!(values)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); switch(pname) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid float-vector property 0x%04x", pname); } -done: ALCcontext_DecRef(context); } @@ -530,13 +570,14 @@ AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values) context = GetContextRef(); if(!context) return; + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); switch(pname) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid integer-vector property 0x%04x", pname); } -done: ALCcontext_DecRef(context); } @@ -564,13 +605,43 @@ AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values) context = GetContextRef(); if(!context) return; + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); switch(pname) { default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid integer64-vector property 0x%04x", pname); + } + + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values) +{ + ALCcontext *context; + + if(values) + { + switch(pname) + { + case AL_EVENT_CALLBACK_FUNCTION_SOFT: + case AL_EVENT_CALLBACK_USER_PARAM_SOFT: + values[0] = alGetPointerSOFT(pname); + return; + } + } + + context = GetContextRef(); + if(!context) return; + + if(!values) + alSetError(context, AL_INVALID_VALUE, "NULL pointer"); + switch(pname) + { + default: + alSetError(context, AL_INVALID_VALUE, "Invalid pointer-vector property 0x%04x", pname); } -done: ALCcontext_DecRef(context); } @@ -625,12 +696,10 @@ AL_API const ALchar* AL_APIENTRY alGetString(ALenum pname) break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid string property 0x%04x", pname); } -done: ALCcontext_DecRef(context); - return value; } @@ -642,15 +711,15 @@ AL_API ALvoid AL_APIENTRY alDopplerFactor(ALfloat value) if(!context) return; if(!(value >= 0.0f && isfinite(value))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + alSetError(context, AL_INVALID_VALUE, "Doppler factor %f out of range", value); + else + { + almtx_lock(&context->PropLock); + context->DopplerFactor = value; + DO_UPDATEPROPS(); + almtx_unlock(&context->PropLock); + } - WriteLock(&context->PropLock); - context->DopplerFactor = value; - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); - WriteUnlock(&context->PropLock); - -done: ALCcontext_DecRef(context); } @@ -661,16 +730,30 @@ AL_API ALvoid AL_APIENTRY alDopplerVelocity(ALfloat value) context = GetContextRef(); if(!context) return; + if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Deprecated)) + { + static const ALCchar msg[] = + "alDopplerVelocity is deprecated in AL1.1, use alSpeedOfSound"; + const ALsizei msglen = (ALsizei)strlen(msg); + ALbitfieldSOFT enabledevts; + almtx_lock(&context->EventCbLock); + enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); + if((enabledevts&EventType_Deprecated) && context->EventCb) + (*context->EventCb)(AL_EVENT_TYPE_DEPRECATED_SOFT, 0, 0, msglen, msg, + context->EventParam); + almtx_unlock(&context->EventCbLock); + } + if(!(value >= 0.0f && isfinite(value))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + alSetError(context, AL_INVALID_VALUE, "Doppler velocity %f out of range", value); + else + { + almtx_lock(&context->PropLock); + context->DopplerVelocity = value; + DO_UPDATEPROPS(); + almtx_unlock(&context->PropLock); + } - WriteLock(&context->PropLock); - context->DopplerVelocity = value; - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); - WriteUnlock(&context->PropLock); - -done: ALCcontext_DecRef(context); } @@ -682,15 +765,15 @@ AL_API ALvoid AL_APIENTRY alSpeedOfSound(ALfloat value) if(!context) return; if(!(value > 0.0f && isfinite(value))) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + alSetError(context, AL_INVALID_VALUE, "Speed of sound %f out of range", value); + else + { + almtx_lock(&context->PropLock); + context->SpeedOfSound = value; + DO_UPDATEPROPS(); + almtx_unlock(&context->PropLock); + } - WriteLock(&context->PropLock); - context->SpeedOfSound = value; - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); - WriteUnlock(&context->PropLock); - -done: ALCcontext_DecRef(context); } @@ -705,18 +788,16 @@ AL_API ALvoid AL_APIENTRY alDistanceModel(ALenum value) value == AL_LINEAR_DISTANCE || value == AL_LINEAR_DISTANCE_CLAMPED || value == AL_EXPONENT_DISTANCE || value == AL_EXPONENT_DISTANCE_CLAMPED || value == AL_NONE)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); - - WriteLock(&context->PropLock); - context->DistanceModel = value; - if(!context->SourceDistanceModel) + alSetError(context, AL_INVALID_VALUE, "Distance model 0x%04x out of range", value); + else { - if(!ATOMIC_LOAD(&context->DeferUpdates, almemory_order_acquire)) - UpdateListenerProps(context); + almtx_lock(&context->PropLock); + context->DistanceModel = value; + if(!context->SourceDistanceModel) + DO_UPDATEPROPS(); + almtx_unlock(&context->PropLock); } - WriteUnlock(&context->PropLock); -done: ALCcontext_DecRef(context); } @@ -750,7 +831,8 @@ AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) { const char *ResamplerNames[] = { alPointResampler, alLinearResampler, - alSinc4Resampler, alBSincResampler, + alCubicResampler, alBSinc12Resampler, + alBSinc24Resampler, }; const ALchar *value = NULL; ALCcontext *context; @@ -764,16 +846,55 @@ AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index) { case AL_RESAMPLER_NAME_SOFT: if(index < 0 || (size_t)index >= COUNTOF(ResamplerNames)) - SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + SETERR_GOTO(context, AL_INVALID_VALUE, done, "Resampler name index %d out of range", + index); value = ResamplerNames[index]; break; default: - SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done); + alSetError(context, AL_INVALID_VALUE, "Invalid string indexed property"); } done: ALCcontext_DecRef(context); - return value; } + + +void UpdateContextProps(ALCcontext *context) +{ + struct ALcontextProps *props; + + /* Get an unused proprty container, or allocate a new one as needed. */ + props = ATOMIC_LOAD(&context->FreeContextProps, almemory_order_acquire); + if(!props) + props = al_calloc(16, sizeof(*props)); + else + { + struct ALcontextProps *next; + do { + next = ATOMIC_LOAD(&props->next, almemory_order_relaxed); + } while(ATOMIC_COMPARE_EXCHANGE_PTR_WEAK(&context->FreeContextProps, &props, next, + almemory_order_seq_cst, almemory_order_acquire) == 0); + } + + /* Copy in current property values. */ + props->MetersPerUnit = context->MetersPerUnit; + + props->DopplerFactor = context->DopplerFactor; + props->DopplerVelocity = context->DopplerVelocity; + props->SpeedOfSound = context->SpeedOfSound; + + props->SourceDistanceModel = context->SourceDistanceModel; + props->DistanceModel = context->DistanceModel; + + /* Set the new container for updating internal parameters. */ + props = ATOMIC_EXCHANGE_PTR(&context->Update, props, almemory_order_acq_rel); + if(props) + { + /* If there was an unused update container, put it back in the + * freelist. + */ + ATOMIC_REPLACE_HEAD(struct ALcontextProps*, &context->FreeContextProps, props); + } +} diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/event.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/event.c new file mode 100644 index 00000000..4c9c0be2 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/event.c @@ -0,0 +1,127 @@ + +#include "config.h" + +#include "AL/alc.h" +#include "AL/al.h" +#include "AL/alext.h" +#include "alMain.h" +#include "alError.h" +#include "alAuxEffectSlot.h" +#include "ringbuffer.h" + + +int EventThread(void *arg) +{ + ALCcontext *context = arg; + bool quitnow = false; + + while(!quitnow) + { + ALbitfieldSOFT enabledevts; + AsyncEvent evt; + + if(ll_ringbuffer_read(context->AsyncEvents, (char*)&evt, 1) == 0) + { + alsem_wait(&context->EventSem); + continue; + } + + almtx_lock(&context->EventCbLock); + do { + quitnow = evt.EnumType == EventType_KillThread; + if(quitnow) break; + + if(evt.EnumType == EventType_ReleaseEffectState) + { + ALeffectState_DecRef(evt.u.EffectState); + continue; + } + + enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_acquire); + if(context->EventCb && (enabledevts&evt.EnumType) == evt.EnumType) + context->EventCb(evt.u.user.type, evt.u.user.id, evt.u.user.param, + (ALsizei)strlen(evt.u.user.msg), evt.u.user.msg, context->EventParam + ); + } while(ll_ringbuffer_read(context->AsyncEvents, (char*)&evt, 1) != 0); + almtx_unlock(&context->EventCbLock); + } + return 0; +} + +AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable) +{ + ALCcontext *context; + ALbitfieldSOFT enabledevts; + ALbitfieldSOFT flags = 0; + ALsizei i; + + context = GetContextRef(); + if(!context) return; + + if(count < 0) SETERR_GOTO(context, AL_INVALID_VALUE, done, "Controlling %d events", count); + if(count == 0) goto done; + if(!types) SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer"); + + for(i = 0;i < count;i++) + { + if(types[i] == AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT) + flags |= EventType_BufferCompleted; + else if(types[i] == AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT) + flags |= EventType_SourceStateChange; + else if(types[i] == AL_EVENT_TYPE_ERROR_SOFT) + flags |= EventType_Error; + else if(types[i] == AL_EVENT_TYPE_PERFORMANCE_SOFT) + flags |= EventType_Performance; + else if(types[i] == AL_EVENT_TYPE_DEPRECATED_SOFT) + flags |= EventType_Deprecated; + else if(types[i] == AL_EVENT_TYPE_DISCONNECTED_SOFT) + flags |= EventType_Disconnected; + else + SETERR_GOTO(context, AL_INVALID_ENUM, done, "Invalid event type 0x%04x", types[i]); + } + + if(enable) + { + enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); + while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts|flags, + almemory_order_acq_rel, almemory_order_acquire) == 0) + { + /* enabledevts is (re-)filled with the current value on failure, so + * just try again. + */ + } + } + else + { + enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed); + while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts&~flags, + almemory_order_acq_rel, almemory_order_acquire) == 0) + { + } + /* Wait to ensure the event handler sees the changed flags before + * returning. + */ + almtx_lock(&context->EventCbLock); + almtx_unlock(&context->EventCbLock); + } + +done: + ALCcontext_DecRef(context); +} + +AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *userParam) +{ + ALCcontext *context; + + context = GetContextRef(); + if(!context) return; + + almtx_lock(&context->PropLock); + almtx_lock(&context->EventCbLock); + context->EventCb = callback; + context->EventParam = userParam; + almtx_unlock(&context->EventCbLock); + almtx_unlock(&context->PropLock); + + ALCcontext_DecRef(context); +} diff --git a/love/src/jni/openal-soft-1.19.1/OpenAL32/sample_cvt.c b/love/src/jni/openal-soft-1.19.1/OpenAL32/sample_cvt.c new file mode 100644 index 00000000..4a85f74a --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/OpenAL32/sample_cvt.c @@ -0,0 +1,276 @@ + +#include "config.h" + +#include "sample_cvt.h" + +#include "AL/al.h" +#include "alu.h" +#include "alBuffer.h" + + +/* IMA ADPCM Stepsize table */ +static const int IMAStep_size[89] = { + 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, + 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, + 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, + 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, + 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, + 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493,10442, + 11487,12635,13899,15289,16818,18500,20350,22358,24633,27086,29794, + 32767 +}; + +/* IMA4 ADPCM Codeword decode table */ +static const int IMA4Codeword[16] = { + 1, 3, 5, 7, 9, 11, 13, 15, + -1,-3,-5,-7,-9,-11,-13,-15, +}; + +/* IMA4 ADPCM Step index adjust decode table */ +static const int IMA4Index_adjust[16] = { + -1,-1,-1,-1, 2, 4, 6, 8, + -1,-1,-1,-1, 2, 4, 6, 8 +}; + + +/* MSADPCM Adaption table */ +static const int MSADPCMAdaption[16] = { + 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 +}; + +/* MSADPCM Adaption Coefficient tables */ +static const int MSADPCMAdaptionCoeff[7][2] = { + { 256, 0 }, + { 512, -256 }, + { 0, 0 }, + { 192, 64 }, + { 240, 0 }, + { 460, -208 }, + { 392, -232 } +}; + + +/* A quick'n'dirty lookup table to decode a muLaw-encoded byte sample into a + * signed 16-bit sample */ +const ALshort muLawDecompressionTable[256] = { + -32124,-31100,-30076,-29052,-28028,-27004,-25980,-24956, + -23932,-22908,-21884,-20860,-19836,-18812,-17788,-16764, + -15996,-15484,-14972,-14460,-13948,-13436,-12924,-12412, + -11900,-11388,-10876,-10364, -9852, -9340, -8828, -8316, + -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, + -5884, -5628, -5372, -5116, -4860, -4604, -4348, -4092, + -3900, -3772, -3644, -3516, -3388, -3260, -3132, -3004, + -2876, -2748, -2620, -2492, -2364, -2236, -2108, -1980, + -1884, -1820, -1756, -1692, -1628, -1564, -1500, -1436, + -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, + -876, -844, -812, -780, -748, -716, -684, -652, + -620, -588, -556, -524, -492, -460, -428, -396, + -372, -356, -340, -324, -308, -292, -276, -260, + -244, -228, -212, -196, -180, -164, -148, -132, + -120, -112, -104, -96, -88, -80, -72, -64, + -56, -48, -40, -32, -24, -16, -8, 0, + 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, + 23932, 22908, 21884, 20860, 19836, 18812, 17788, 16764, + 15996, 15484, 14972, 14460, 13948, 13436, 12924, 12412, + 11900, 11388, 10876, 10364, 9852, 9340, 8828, 8316, + 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, + 5884, 5628, 5372, 5116, 4860, 4604, 4348, 4092, + 3900, 3772, 3644, 3516, 3388, 3260, 3132, 3004, + 2876, 2748, 2620, 2492, 2364, 2236, 2108, 1980, + 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, + 1372, 1308, 1244, 1180, 1116, 1052, 988, 924, + 876, 844, 812, 780, 748, 716, 684, 652, + 620, 588, 556, 524, 492, 460, 428, 396, + 372, 356, 340, 324, 308, 292, 276, 260, + 244, 228, 212, 196, 180, 164, 148, 132, + 120, 112, 104, 96, 88, 80, 72, 64, + 56, 48, 40, 32, 24, 16, 8, 0 +}; + + +/* A quick'n'dirty lookup table to decode an aLaw-encoded byte sample into a + * signed 16-bit sample */ +const ALshort aLawDecompressionTable[256] = { + -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736, + -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784, + -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, + -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392, + -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944, + -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136, + -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472, + -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568, + -344, -328, -376, -360, -280, -264, -312, -296, + -472, -456, -504, -488, -408, -392, -440, -424, + -88, -72, -120, -104, -24, -8, -56, -40, + -216, -200, -248, -232, -152, -136, -184, -168, + -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184, + -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, + -688, -656, -752, -720, -560, -528, -624, -592, + -944, -912, -1008, -976, -816, -784, -880, -848, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 +}; + + +static void DecodeIMA4Block(ALshort *dst, const ALubyte *src, ALint numchans, ALsizei align) +{ + ALint sample[MAX_INPUT_CHANNELS] = { 0 }; + ALint index[MAX_INPUT_CHANNELS] = { 0 }; + ALuint code[MAX_INPUT_CHANNELS] = { 0 }; + ALsizei c, i; + + for(c = 0;c < numchans;c++) + { + sample[c] = *(src++); + sample[c] |= *(src++) << 8; + sample[c] = (sample[c]^0x8000) - 32768; + index[c] = *(src++); + index[c] |= *(src++) << 8; + index[c] = (index[c]^0x8000) - 32768; + + index[c] = clampi(index[c], 0, 88); + + dst[c] = sample[c]; + } + + for(i = 1;i < align;i++) + { + if((i&7) == 1) + { + for(c = 0;c < numchans;c++) + { + code[c] = *(src++); + code[c] |= *(src++) << 8; + code[c] |= *(src++) << 16; + code[c] |= *(src++) << 24; + } + } + + for(c = 0;c < numchans;c++) + { + int nibble = code[c]&0xf; + code[c] >>= 4; + + sample[c] += IMA4Codeword[nibble] * IMAStep_size[index[c]] / 8; + sample[c] = clampi(sample[c], -32768, 32767); + + index[c] += IMA4Index_adjust[nibble]; + index[c] = clampi(index[c], 0, 88); + + *(dst++) = sample[c]; + } + } +} + +static void DecodeMSADPCMBlock(ALshort *dst, const ALubyte *src, ALint numchans, ALsizei align) +{ + ALubyte blockpred[MAX_INPUT_CHANNELS] = { 0 }; + ALint delta[MAX_INPUT_CHANNELS] = { 0 }; + ALshort samples[MAX_INPUT_CHANNELS][2] = { { 0, 0 } }; + ALint c, i; + + for(c = 0;c < numchans;c++) + { + blockpred[c] = *(src++); + blockpred[c] = minu(blockpred[c], 6); + } + for(c = 0;c < numchans;c++) + { + delta[c] = *(src++); + delta[c] |= *(src++) << 8; + delta[c] = (delta[c]^0x8000) - 32768; + } + for(c = 0;c < numchans;c++) + { + samples[c][0] = *(src++); + samples[c][0] |= *(src++) << 8; + samples[c][0] = (samples[c][0]^0x8000) - 32768; + } + for(c = 0;c < numchans;c++) + { + samples[c][1] = *(src++); + samples[c][1] |= *(src++) << 8; + samples[c][1] = (samples[c][1]^0x8000) - 0x8000; + } + + /* Second sample is written first. */ + for(c = 0;c < numchans;c++) + *(dst++) = samples[c][1]; + for(c = 0;c < numchans;c++) + *(dst++) = samples[c][0]; + + for(i = 2;i < align;i++) + { + for(c = 0;c < numchans;c++) + { + const ALint num = (i*numchans) + c; + ALint nibble, pred; + + /* Read the nibble (first is in the upper bits). */ + if(!(num&1)) + nibble = (*src>>4)&0x0f; + else + nibble = (*(src++))&0x0f; + + pred = (samples[c][0]*MSADPCMAdaptionCoeff[blockpred[c]][0] + + samples[c][1]*MSADPCMAdaptionCoeff[blockpred[c]][1]) / 256; + pred += ((nibble^0x08) - 0x08) * delta[c]; + pred = clampi(pred, -32768, 32767); + + samples[c][1] = samples[c][0]; + samples[c][0] = pred; + + delta[c] = (MSADPCMAdaption[nibble] * delta[c]) / 256; + delta[c] = maxi(16, delta[c]); + + *(dst++) = pred; + } + } +} + + +void Convert_ALshort_ALima4(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, + ALsizei align) +{ + ALsizei byte_align = ((align-1)/2 + 4) * numchans; + ALsizei i; + + assert(align > 0 && (len%align) == 0); + for(i = 0;i < len;i += align) + { + DecodeIMA4Block(dst, src, numchans, align); + src += byte_align; + dst += align*numchans; + } +} + +void Convert_ALshort_ALmsadpcm(ALshort *dst, const ALubyte *src, ALsizei numchans, ALsizei len, + ALsizei align) +{ + ALsizei byte_align = ((align-2)/2 + 7) * numchans; + ALsizei i; + + assert(align > 1 && (len%align) == 0); + for(i = 0;i < len;i += align) + { + DecodeMSADPCMBlock(dst, src, numchans, align); + src += byte_align; + dst += align*numchans; + } +} diff --git a/love/src/jni/openal-soft-1.19.1/README.md b/love/src/jni/openal-soft-1.19.1/README.md new file mode 100644 index 00000000..0c9d3027 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/README.md @@ -0,0 +1,61 @@ +OpenAL soft +=========== + +`master` branch CI status : [![Build Status](https://travis-ci.org/kcat/openal-soft.svg?branch=master)](https://travis-ci.org/kcat/openal-soft) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/kcat/openal-soft?branch=master&svg=true)](https://ci.appveyor.com/api/projects/status/github/kcat/openal-soft?branch=master&svg=true) + +OpenAL Soft is an LGPL-licensed, cross-platform, software implementation of the OpenAL 3D audio API. It's forked from the open-sourced Windows version available originally from openal.org's SVN repository (now defunct). +OpenAL provides capabilities for playing audio in a virtual 3D environment. Distance attenuation, doppler shift, and directional sound emitters are among the features handled by the API. More advanced effects, including air absorption, occlusion, and environmental reverb, are available through the EFX extension. It also facilitates streaming audio, multi-channel buffers, and audio capture. + +More information is available on the [official website](http://openal-soft.org/) + +Source Install +------------- +To install OpenAL Soft, use your favorite shell to go into the build/ +directory, and run: + +```bash +cmake .. +``` + +Assuming configuration went well, you can then build it, typically using GNU +Make (KDevelop, MSVC, and others are possible depending on your system setup +and CMake configuration). + +Please Note: Double check that the appropriate backends were detected. Often, +complaints of no sound, crashing, and missing devices can be solved by making +sure the correct backends are being used. CMake's output will identify which +backends were enabled. + +For most systems, you will likely want to make sure ALSA, OSS, and PulseAudio +were detected (if your target system uses them). For Windows, make sure +DirectSound was detected. + + +Utilities +--------- +The source package comes with an informational utility, openal-info, and is +built by default. It prints out information provided by the ALC and AL sub- +systems, including discovered devices, version information, and extensions. + + +Configuration +------------- + +OpenAL Soft can be configured on a per-user and per-system basis. This allows +users and sysadmins to control information provided to applications, as well +as application-agnostic behavior of the library. See alsoftrc.sample for +available settings. + + +Acknowledgements +---------------- + +Special thanks go to: + + - Creative Labs for the original source code this is based off of. + - Christopher Fitzgerald for the current reverb effect implementation, and +helping with the low-pass and HRTF filters. + - Christian Borss for the 3D panning code previous versions used as a base. + - Ben Davis for the idea behind a previous version of the click-removal code. + - Richard Furse for helping with my understanding of Ambisonics that is used by +the various parts of the library. diff --git a/love/src/jni/openal-soft-1.18.2/XCompile-Android.txt b/love/src/jni/openal-soft-1.19.1/XCompile-Android.txt similarity index 100% rename from love/src/jni/openal-soft-1.18.2/XCompile-Android.txt rename to love/src/jni/openal-soft-1.19.1/XCompile-Android.txt diff --git a/love/src/jni/openal-soft-1.18.2/XCompile.txt b/love/src/jni/openal-soft-1.19.1/XCompile.txt similarity index 100% rename from love/src/jni/openal-soft-1.18.2/XCompile.txt rename to love/src/jni/openal-soft-1.19.1/XCompile.txt diff --git a/love/src/jni/openal-soft-1.18.2/alsoftrc.sample b/love/src/jni/openal-soft-1.19.1/alsoftrc.sample similarity index 94% rename from love/src/jni/openal-soft-1.18.2/alsoftrc.sample rename to love/src/jni/openal-soft-1.19.1/alsoftrc.sample index 3e7d0eec..8061ed1c 100644 --- a/love/src/jni/openal-soft-1.18.2/alsoftrc.sample +++ b/love/src/jni/openal-soft-1.19.1/alsoftrc.sample @@ -149,10 +149,11 @@ # Selects the resampler used when mixing sources. Valid values are: # point - nearest sample, no interpolation # linear - extrapolates samples using a linear slope between samples -# sinc4 - extrapolates samples using a 4-point Sinc filter -# bsinc - extrapolates samples using a band-limited Sinc filter (varying -# between 12 and 24 points, with anti-aliasing) -# Specifying other values will result in using the default (linear). +# cubic - extrapolates samples using a Catmull-Rom spline +# bsinc12 - extrapolates samples using a band-limited Sinc filter (varying +# between 12 and 24 points, with anti-aliasing) +# bsinc24 - extrapolates samples using a band-limited Sinc filter (varying +# between 24 and 48 points, with anti-aliasing) #resampler = linear ## rt-prio: (global) @@ -181,6 +182,14 @@ # than the default has no effect. #sends = 16 +## front-stablizer: +# Applies filters to "stablize" front sound imaging. A psychoacoustic method +# is used to generate a front-center channel signal from the front-left and +# front-right channels, improving the front response by reducing the combing +# artifacts and phase errors. Consequently, it will only work with channel +# configurations that include front-left, front-right, and front-center. +#front-stablizer = false + ## output-limiter: # Applies a gain limiter on the final mixed output. This reduces the volume # when the output samples would otherwise clamp, avoiding excessive clipping @@ -210,8 +219,9 @@ ## excludefx: (global) # Sets which effects to exclude, preventing apps from using them. This can # help for apps that try to use effects which are too CPU intensive for the -# system to handle. Available effects are: eaxreverb,reverb,chorus,compressor, -# distortion,echo,equalizer,flanger,modulator,dedicated +# system to handle. Available effects are: eaxreverb,reverb,autowah,chorus, +# compressor,distortion,echo,equalizer,flanger,modulator,dedicated,pshifter, +# fshifter #excludefx = ## default-reverb: (global) @@ -277,7 +287,7 @@ nfc = true nfc-ref-delay = ## quad: -# Decoder configuration file for Quadrophonic channel output. See +# Decoder configuration file for Quadraphonic channel output. See # docs/ambdec.txt for a description of the file format. quad = @@ -310,12 +320,6 @@ surround71 = # value of 0 means no change. #boost = 0 -## emulate-eax: (global) -# Allows the standard reverb effect to be used in place of EAX reverb. EAX -# reverb processing is a bit more CPU intensive than standard, so this option -# allows a simpler effect to be used at the loss of some quality. -#emulate-eax = false - ## ## PulseAudio backend stuff ## @@ -441,9 +445,9 @@ surround71 = #buffer-size = 0 ## -## MMDevApi backend stuff +## WASAPI backend stuff ## -[mmdevapi] +[wasapi] ## ## DirectSound backend stuff diff --git a/love/src/jni/openal-soft-1.18.2/appveyor.yml b/love/src/jni/openal-soft-1.19.1/appveyor.yml similarity index 85% rename from love/src/jni/openal-soft-1.18.2/appveyor.yml rename to love/src/jni/openal-soft-1.19.1/appveyor.yml index eab4f397..6d826eed 100644 --- a/love/src/jni/openal-soft-1.18.2/appveyor.yml +++ b/love/src/jni/openal-soft-1.19.1/appveyor.yml @@ -1,4 +1,4 @@ -version: 1.18.2.{build} +version: 1.19.0.{build} environment: matrix: @@ -14,6 +14,6 @@ install: build_script: - cd build - - cmake -G"%GEN%" -DALSOFT_REQUIRE_WINMM=ON -DALSOFT_REQUIRE_DSOUND=ON -DALSOFT_REQUIRE_MMDEVAPI=ON -DALSOFT_EMBED_HRTF_DATA=YES .. + - cmake -G"%GEN%" -DALSOFT_REQUIRE_WINMM=ON -DALSOFT_REQUIRE_DSOUND=ON -DALSOFT_REQUIRE_WASAPI=ON -DALSOFT_EMBED_HRTF_DATA=YES .. - cmake --build . --config %CFG% --clean-first diff --git a/love/src/jni/openal-soft-1.19.1/bsinc_inc.h b/love/src/jni/openal-soft-1.19.1/bsinc_inc.h new file mode 100644 index 00000000..218f4ffb --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/bsinc_inc.h @@ -0,0 +1,2603 @@ +/* Generated by bsincgen, do not edit! */ + +static_assert(BSINC_SCALE_COUNT == 16, "Unexpected BSINC_SCALE_COUNT value!"); +static_assert(BSINC_PHASE_COUNT == 16, "Unexpected BSINC_PHASE_COUNT value!"); +static_assert(FRACTIONONE == 4096, "Unexpected FRACTIONONE value!"); + +typedef struct BSincTable { + const float scaleBase, scaleRange; + const int m[BSINC_SCALE_COUNT]; + const int filterOffset[BSINC_SCALE_COUNT]; + alignas(16) const float Tab[]; +} BSincTable; + +/* This 23rd order filter has a rejection of -60dB, yielding a transition width + * of ~0.158 (normalized frequency). Order increases when downsampling to a + * limit of one octave, after which the quality of the filter (transition + * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound + * after downsampling by ~3.67 octaves. + */ +const BSincTable bsinc24 = { + /* scaleBase */ 7.881281313e-02f, /* scaleRange */ 1.085555698e+00f, + /* m */ { 48, 48, 48, 48, 48, 48, 48, 48, 44, 40, 36, 32, 28, 28, 24, 24 }, + /* filterOffset */ { 0, 3072, 6144, 9216, 12288, 15360, 18432, 21504, 24576, 27392, 29952, 32256, 34304, 36096, 37888, 39424 }, + + /* Tab (40960 entries) */ { + /* 0, 0 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.436875469e-05f, +1.561612709e-05f, +1.417141484e-05f, +8.846225192e-06f, -1.492899882e-06f, -1.777981991e-05f, -4.059923501e-05f, -7.004937168e-05f, -1.056348136e-04f, -1.462059716e-04f, -1.899581021e-04f, -2.344972762e-04f, -2.769737986e-04f, -3.142760250e-04f, -3.432701935e-04f, -3.610656819e-04f, -3.652808343e-04f, -3.542827868e-04f, -3.273758978e-04f, -2.849174469e-04f, -2.283458597e-04f, -1.601151740e-04f, -8.353887009e-05f, -2.555508337e-06f, +7.856322346e-05f, +1.555353731e-04f, +2.243925418e-04f, +2.817745994e-04f, +3.251683254e-04f, +3.530689224e-04f, +3.650514058e-04f, +3.617481497e-04f, +3.447383033e-04f, +3.163633379e-04f, +2.794897176e-04f, +2.372439164e-04f, +1.927463657e-04f, +1.488693749e-04f, +1.080399453e-04f, +7.210228972e-05f, +4.224758644e-05f, +1.901092689e-05f, +2.328453823e-06f, -8.357927672e-06f, -1.396459906e-05f, -1.561691254e-05f, -1.450376051e-05f, -1.175075544e-05f, + /* 0, 1 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.422765568e-05f, +1.560484981e-05f, +1.436305556e-05f, +9.314872538e-06f, -6.806932534e-07f, -1.657438954e-05f, -3.897697936e-05f, -6.802063440e-05f, -1.032493727e-04f, -1.435551879e-04f, -1.871730634e-04f, -2.317426657e-04f, -2.744376758e-04f, -3.121561799e-04f, -3.417581727e-04f, -3.603299209e-04f, -3.654505292e-04f, -3.554341621e-04f, -3.295223672e-04f, -2.880048316e-04f, -2.322533521e-04f, -1.646621696e-04f, -8.849719227e-05f, -7.665992852e-06f, +7.357127629e-05f, +1.509236733e-04f, +2.203941213e-04f, +2.785767791e-04f, +3.228998788e-04f, +3.517925311e-04f, +3.647619571e-04f, +3.623768266e-04f, +3.461618466e-04f, +3.184173686e-04f, +2.819846545e-04f, +2.399818431e-04f, +1.955372004e-04f, +1.515448748e-04f, +1.104644002e-04f, +7.417918467e-05f, +4.392198589e-05f, +2.026779777e-05f, +3.187546744e-06f, -7.849719961e-06f, -1.374231680e-05f, -1.560691722e-05f, -1.463241434e-05f, -1.195157556e-05f, + /* 0, 2 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.408071968e-05f, +1.558336850e-05f, +1.453981342e-05f, +9.764132757e-06f, +1.083630892e-07f, -1.539454099e-05f, -3.738085809e-05f, -6.601627161e-05f, -1.008839801e-04f, -1.409175379e-04f, -1.843918961e-04f, -2.289808241e-04f, -2.718821271e-04f, -3.100045565e-04f, -3.402029042e-04f, -3.595413759e-04f, -3.655607915e-04f, -3.565231022e-04f, -3.316075217e-04f, -2.910362794e-04f, -2.361143096e-04f, -1.691754631e-04f, -9.343717126e-05f, -1.277488105e-05f, +6.856405736e-05f, +1.462809907e-04f, +2.163513340e-04f, +2.753244915e-04f, +3.205708032e-04f, +3.504535917e-04f, +3.644122164e-04f, +3.629512268e-04f, +3.475401762e-04f, +3.204373710e-04f, +2.844578309e-04f, +2.427103092e-04f, +1.983299454e-04f, +1.542319388e-04f, +1.129078005e-04f, +7.627984250e-05f, +4.562237634e-05f, +2.155051224e-05f, +4.070364810e-06f, -7.321345221e-06f, -1.350427756e-05f, -1.558585112e-05f, -1.475445480e-05f, -1.214962021e-05f, + /* 0, 3 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.392820018e-05f, +1.555196970e-05f, +1.470198130e-05f, +1.019427178e-05f, +8.744713867e-07f, -1.424017206e-05f, -3.581090067e-05f, -6.403646691e-05f, -9.853898309e-05f, -1.382935265e-04f, -1.816152396e-04f, -2.262124861e-04f, -2.693079297e-04f, -3.078219119e-04f, -3.386050587e-04f, -3.587005674e-04f, -3.656119364e-04f, -3.575496773e-04f, -3.336311662e-04f, -2.940113321e-04f, -2.399280361e-04f, -1.736541678e-04f, -9.835779378e-05f, -1.788110924e-05f, +6.354259999e-05f, +1.416082500e-04f, +2.122649289e-04f, +2.720182574e-04f, +3.181813609e-04f, +3.490520992e-04f, +3.640019265e-04f, +3.634708763e-04f, +3.488726530e-04f, +3.224226032e-04f, +2.869084686e-04f, +2.454285640e-04f, +2.011239334e-04f, +1.569300258e-04f, +1.153697583e-04f, +7.840403901e-05f, +4.734869143e-05f, +2.285914223e-05f, +4.977088548e-06f, -6.772549939e-06f, -1.325019189e-05f, -1.555342333e-05f, -1.486961808e-05f, -1.234467317e-05f, + /* 0, 4 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.377034793e-05f, +1.551093858e-05f, +1.484985257e-05f, +1.060555829e-05f, +1.617838952e-06f, -1.311117335e-05f, -3.426712759e-05f, -6.208139387e-05f, -9.621471868e-05f, -1.356836490e-04f, -1.788437260e-04f, -2.234383818e-04f, -2.667158598e-04f, -3.056090065e-04f, -3.369653145e-04f, -3.578080270e-04f, -3.656042935e-04f, -3.585139737e-04f, -3.355931220e-04f, -2.969295472e-04f, -2.436938494e-04f, -1.780974071e-04f, -1.032580523e-04f, -2.298361455e-05f, +5.850794175e-05f, +1.369063854e-04f, +2.081356675e-04f, +2.686586134e-04f, +3.157318305e-04f, +3.475880652e-04f, +3.635308455e-04f, +3.639353135e-04f, +3.501586466e-04f, +3.243723279e-04f, +2.893357895e-04f, +2.481358533e-04f, +2.039184901e-04f, +1.596385855e-04f, +1.178498758e-04f, +8.055153976e-05f, +4.910085537e-05f, +2.419375182e-05f, +5.907892698e-06f, -6.203084070e-06f, -1.297977154e-05f, -1.550934211e-05f, -1.497763796e-05f, -1.253651480e-05f, + /* 0, 5 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.360741082e-05f, +1.546055886e-05f, +1.498372103e-05f, +1.099826356e-05f, +2.338678028e-06f, -1.200742830e-05f, -3.274955044e-05f, -6.015121602e-05f, -9.391151370e-05f, -1.330883916e-04f, -1.760779795e-04f, -2.206592368e-04f, -2.641066927e-04f, -3.033666037e-04f, -3.352843568e-04f, -3.568642973e-04f, -3.655382063e-04f, -3.594160939e-04f, -3.374932277e-04f, -2.997904985e-04f, -2.474110810e-04f, -1.825043147e-04f, -1.081369454e-04f, -2.808133519e-05f, +5.346112415e-05f, +1.321763393e-04f, +2.039643239e-04f, +2.652461110e-04f, +3.132225075e-04f, +3.460615178e-04f, +3.629987460e-04f, +3.643440891e-04f, +3.513975353e-04f, +3.262858124e-04f, +2.917390162e-04f, +2.508314194e-04f, +2.067129352e-04f, +1.623570592e-04f, +1.203477449e-04f, +8.272210008e-05f, +5.087878289e-05f, +2.555439710e-05f, +6.862946083e-06f, -5.612701183e-06f, -1.269272958e-05f, -1.545331501e-05f, -1.507824593e-05f, -1.272492213e-05f, + /* 0, 6 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.343963384e-05f, +1.540111268e-05f, +1.510388072e-05f, +1.137266132e-05f, +3.037205637e-06f, -1.092881336e-05f, -3.125817198e-05f, -5.824608692e-05f, -9.162968470e-05f, -1.305082307e-04f, -1.733186168e-04f, -2.178757715e-04f, -2.614812022e-04f, -3.010954694e-04f, -3.335628777e-04f, -3.558699317e-04f, -3.654140322e-04f, -3.602561561e-04f, -3.393313383e-04f, -3.025937756e-04f, -2.510790765e-04f, -1.868740351e-04f, -1.129934779e-04f, -3.317321082e-05f, +4.840319232e-05f, +1.274190627e-04f, +1.997516844e-04f, +2.617813169e-04f, +3.106537038e-04f, +3.444725018e-04f, +3.624054162e-04f, +3.646967662e-04f, +3.525887067e-04f, +3.281623292e-04f, +2.941173722e-04f, +2.535145019e-04f, +2.095065816e-04f, +1.650848794e-04f, +1.228629477e-04f, +8.491546506e-05f, +5.268237913e-05f, +2.694112611e-05f, +7.842411460e-06f, -5.001158613e-06f, -1.238878055e-05f, -1.538504899e-05f, -1.517117127e-05f, -1.290966885e-05f, + /* 0, 7 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.326725904e-05f, +1.533288052e-05f, +1.521062582e-05f, +1.172902759e-05f, +3.713643442e-06f, -9.875198106e-06f, -2.979298624e-05f, -5.636615021e-05f, -8.936953796e-05f, -1.279436332e-04f, -1.705662467e-04f, -2.150887015e-04f, -2.588401603e-04f, -2.987963721e-04f, -3.318015757e-04f, -3.548254937e-04f, -3.652321423e-04f, -3.610342947e-04f, -3.411073257e-04f, -3.053389846e-04f, -2.546971958e-04f, -1.912057239e-04f, -1.178266614e-04f, -3.825818285e-05f, +4.333519473e-05f, +1.226355145e-04f, +1.954985477e-04f, +2.582648130e-04f, +3.080257478e-04f, +3.428210784e-04f, +3.617506595e-04f, +3.649929210e-04f, +3.537315574e-04f, +3.300011559e-04f, +2.964700822e-04f, +2.561843375e-04f, +2.122987367e-04f, +1.678214700e-04f, +1.253950564e-04f, +8.713136950e-05f, +5.451153963e-05f, +2.835397865e-05f, +8.846445392e-06f, -4.368217600e-06f, -1.206764059e-05f, -1.530425055e-05f, -1.525614110e-05f, -1.309052541e-05f, + /* 0, 8 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.309052541e-05f, +1.525614110e-05f, +1.530425055e-05f, +1.206764059e-05f, +4.368217600e-06f, -8.846445392e-06f, -2.835397865e-05f, -5.451153963e-05f, -8.713136950e-05f, -1.253950564e-04f, -1.678214700e-04f, -2.122987367e-04f, -2.561843375e-04f, -2.964700822e-04f, -3.300011559e-04f, -3.537315574e-04f, -3.649929210e-04f, -3.617506595e-04f, -3.428210784e-04f, -3.080257478e-04f, -2.582648130e-04f, -1.954985477e-04f, -1.226355145e-04f, -4.333519473e-05f, +3.825818285e-05f, +1.178266614e-04f, +1.912057239e-04f, +2.546971958e-04f, +3.053389846e-04f, +3.411073257e-04f, +3.610342947e-04f, +3.652321423e-04f, +3.548254937e-04f, +3.318015757e-04f, +2.987963721e-04f, +2.588401603e-04f, +2.150887015e-04f, +1.705662467e-04f, +1.279436332e-04f, +8.936953796e-05f, +5.636615021e-05f, +2.979298624e-05f, +9.875198106e-06f, -3.713643442e-06f, -1.172902759e-05f, -1.521062582e-05f, -1.533288052e-05f, -1.326725904e-05f, + /* 0, 9 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.290966885e-05f, +1.517117127e-05f, +1.538504899e-05f, +1.238878055e-05f, +5.001158613e-06f, -7.842411460e-06f, -2.694112611e-05f, -5.268237913e-05f, -8.491546506e-05f, -1.228629477e-04f, -1.650848794e-04f, -2.095065816e-04f, -2.535145019e-04f, -2.941173722e-04f, -3.281623292e-04f, -3.525887067e-04f, -3.646967662e-04f, -3.624054162e-04f, -3.444725018e-04f, -3.106537038e-04f, -2.617813169e-04f, -1.997516844e-04f, -1.274190627e-04f, -4.840319232e-05f, +3.317321082e-05f, +1.129934779e-04f, +1.868740351e-04f, +2.510790765e-04f, +3.025937756e-04f, +3.393313383e-04f, +3.602561561e-04f, +3.654140322e-04f, +3.558699317e-04f, +3.335628777e-04f, +3.010954694e-04f, +2.614812022e-04f, +2.178757715e-04f, +1.733186168e-04f, +1.305082307e-04f, +9.162968470e-05f, +5.824608692e-05f, +3.125817198e-05f, +1.092881336e-05f, -3.037205637e-06f, -1.137266132e-05f, -1.510388072e-05f, -1.540111268e-05f, -1.343963384e-05f, + /* 0,10 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.272492213e-05f, +1.507824593e-05f, +1.545331501e-05f, +1.269272958e-05f, +5.612701183e-06f, -6.862946083e-06f, -2.555439710e-05f, -5.087878289e-05f, -8.272210008e-05f, -1.203477449e-04f, -1.623570592e-04f, -2.067129352e-04f, -2.508314194e-04f, -2.917390162e-04f, -3.262858124e-04f, -3.513975353e-04f, -3.643440891e-04f, -3.629987460e-04f, -3.460615178e-04f, -3.132225075e-04f, -2.652461110e-04f, -2.039643239e-04f, -1.321763393e-04f, -5.346112415e-05f, +2.808133519e-05f, +1.081369454e-04f, +1.825043147e-04f, +2.474110810e-04f, +2.997904985e-04f, +3.374932277e-04f, +3.594160939e-04f, +3.655382063e-04f, +3.568642973e-04f, +3.352843568e-04f, +3.033666037e-04f, +2.641066927e-04f, +2.206592368e-04f, +1.760779795e-04f, +1.330883916e-04f, +9.391151370e-05f, +6.015121602e-05f, +3.274955044e-05f, +1.200742830e-05f, -2.338678028e-06f, -1.099826356e-05f, -1.498372103e-05f, -1.546055886e-05f, -1.360741082e-05f, + /* 0,11 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.253651480e-05f, +1.497763796e-05f, +1.550934211e-05f, +1.297977154e-05f, +6.203084070e-06f, -5.907892698e-06f, -2.419375182e-05f, -4.910085537e-05f, -8.055153976e-05f, -1.178498758e-04f, -1.596385855e-04f, -2.039184901e-04f, -2.481358533e-04f, -2.893357895e-04f, -3.243723279e-04f, -3.501586466e-04f, -3.639353135e-04f, -3.635308455e-04f, -3.475880652e-04f, -3.157318305e-04f, -2.686586134e-04f, -2.081356675e-04f, -1.369063854e-04f, -5.850794175e-05f, +2.298361455e-05f, +1.032580523e-04f, +1.780974071e-04f, +2.436938494e-04f, +2.969295472e-04f, +3.355931220e-04f, +3.585139737e-04f, +3.656042935e-04f, +3.578080270e-04f, +3.369653145e-04f, +3.056090065e-04f, +2.667158598e-04f, +2.234383818e-04f, +1.788437260e-04f, +1.356836490e-04f, +9.621471868e-05f, +6.208139387e-05f, +3.426712759e-05f, +1.311117335e-05f, -1.617838952e-06f, -1.060555829e-05f, -1.484985257e-05f, -1.551093858e-05f, -1.377034793e-05f, + /* 0,12 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.234467317e-05f, +1.486961808e-05f, +1.555342333e-05f, +1.325019189e-05f, +6.772549939e-06f, -4.977088548e-06f, -2.285914223e-05f, -4.734869143e-05f, -7.840403901e-05f, -1.153697583e-04f, -1.569300258e-04f, -2.011239334e-04f, -2.454285640e-04f, -2.869084686e-04f, -3.224226032e-04f, -3.488726530e-04f, -3.634708763e-04f, -3.640019265e-04f, -3.490520992e-04f, -3.181813609e-04f, -2.720182574e-04f, -2.122649289e-04f, -1.416082500e-04f, -6.354259999e-05f, +1.788110924e-05f, +9.835779378e-05f, +1.736541678e-04f, +2.399280361e-04f, +2.940113321e-04f, +3.336311662e-04f, +3.575496773e-04f, +3.656119364e-04f, +3.587005674e-04f, +3.386050587e-04f, +3.078219119e-04f, +2.693079297e-04f, +2.262124861e-04f, +1.816152396e-04f, +1.382935265e-04f, +9.853898309e-05f, +6.403646691e-05f, +3.581090067e-05f, +1.424017206e-05f, -8.744713867e-07f, -1.019427178e-05f, -1.470198130e-05f, -1.555196970e-05f, -1.392820018e-05f, + /* 0,13 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.214962021e-05f, +1.475445480e-05f, +1.558585112e-05f, +1.350427756e-05f, +7.321345221e-06f, -4.070364810e-06f, -2.155051224e-05f, -4.562237634e-05f, -7.627984250e-05f, -1.129078005e-04f, -1.542319388e-04f, -1.983299454e-04f, -2.427103092e-04f, -2.844578309e-04f, -3.204373710e-04f, -3.475401762e-04f, -3.629512268e-04f, -3.644122164e-04f, -3.504535917e-04f, -3.205708032e-04f, -2.753244915e-04f, -2.163513340e-04f, -1.462809907e-04f, -6.856405736e-05f, +1.277488105e-05f, +9.343717126e-05f, +1.691754631e-04f, +2.361143096e-04f, +2.910362794e-04f, +3.316075217e-04f, +3.565231022e-04f, +3.655607915e-04f, +3.595413759e-04f, +3.402029042e-04f, +3.100045565e-04f, +2.718821271e-04f, +2.289808241e-04f, +1.843918961e-04f, +1.409175379e-04f, +1.008839801e-04f, +6.601627161e-05f, +3.738085809e-05f, +1.539454099e-05f, -1.083630892e-07f, -9.764132757e-06f, -1.453981342e-05f, -1.558336850e-05f, -1.408071968e-05f, + /* 0,14 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.195157556e-05f, +1.463241434e-05f, +1.560691722e-05f, +1.374231680e-05f, +7.849719961e-06f, -3.187546744e-06f, -2.026779777e-05f, -4.392198589e-05f, -7.417918467e-05f, -1.104644002e-04f, -1.515448748e-04f, -1.955372004e-04f, -2.399818431e-04f, -2.819846545e-04f, -3.184173686e-04f, -3.461618466e-04f, -3.623768266e-04f, -3.647619571e-04f, -3.517925311e-04f, -3.228998788e-04f, -2.785767791e-04f, -2.203941213e-04f, -1.509236733e-04f, -7.357127629e-05f, +7.665992852e-06f, +8.849719227e-05f, +1.646621696e-04f, +2.322533521e-04f, +2.880048316e-04f, +3.295223672e-04f, +3.554341621e-04f, +3.654505292e-04f, +3.603299209e-04f, +3.417581727e-04f, +3.121561799e-04f, +2.744376758e-04f, +2.317426657e-04f, +1.871730634e-04f, +1.435551879e-04f, +1.032493727e-04f, +6.802063440e-05f, +3.897697936e-05f, +1.657438954e-05f, +6.806932534e-07f, -9.314872538e-06f, -1.436305556e-05f, -1.560484981e-05f, -1.422765568e-05f, + /* 0,15 (48) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.175075544e-05f, +1.450376051e-05f, +1.561691254e-05f, +1.396459906e-05f, +8.357927672e-06f, -2.328453823e-06f, -1.901092689e-05f, -4.224758644e-05f, -7.210228972e-05f, -1.080399453e-04f, -1.488693749e-04f, -1.927463657e-04f, -2.372439164e-04f, -2.794897176e-04f, -3.163633379e-04f, -3.447383033e-04f, -3.617481497e-04f, -3.650514058e-04f, -3.530689224e-04f, -3.251683254e-04f, -2.817745994e-04f, -2.243925418e-04f, -1.555353731e-04f, -7.856322346e-05f, +2.555508337e-06f, +8.353887009e-05f, +1.601151740e-04f, +2.283458597e-04f, +2.849174469e-04f, +3.273758978e-04f, +3.542827868e-04f, +3.652808343e-04f, +3.610656819e-04f, +3.432701935e-04f, +3.142760250e-04f, +2.769737986e-04f, +2.344972762e-04f, +1.899581021e-04f, +1.462059716e-04f, +1.056348136e-04f, +7.004937168e-05f, +4.059923501e-05f, +1.777981991e-05f, +1.492899882e-06f, -8.846225192e-06f, -1.417141484e-05f, -1.561612709e-05f, -1.436875469e-05f, + /* 1, 0 (48) */ + -4.796439624e-04f, -7.229492121e-04f, -9.648886183e-04f, -1.152303939e-03f, -1.213307251e-03f, -1.059372565e-03f, -5.898051232e-04f, +3.014766656e-04f, +1.717195100e-03f, +3.746628758e-03f, +6.455051836e-03f, +9.873721368e-03f, +1.399149756e-02f, +1.874912662e-02f, +2.403703938e-02f, +2.969723410e-02f, +3.552944303e-02f, +4.130136645e-02f, +4.676233873e-02f, +5.165941558e-02f, +5.575458332e-02f, +5.884162493e-02f, +6.076115668e-02f, +6.141247912e-02f, +6.076115668e-02f, +5.884162493e-02f, +5.575458332e-02f, +5.165941558e-02f, +4.676233873e-02f, +4.130136645e-02f, +3.552944303e-02f, +2.969723410e-02f, +2.403703938e-02f, +1.874912662e-02f, +1.399149756e-02f, +9.873721368e-03f, +6.455051836e-03f, +3.746628758e-03f, +1.717195100e-03f, +3.014766656e-04f, -5.898051232e-04f, -1.059372565e-03f, -1.213307251e-03f, -1.152303939e-03f, -9.648886183e-04f, -7.229492121e-04f, -4.796439624e-04f, -2.694957250e-04f, + +7.400711575e-04f, +1.375020608e-03f, +2.149280883e-03f, +2.889370620e-03f, +3.314167096e-03f, +3.062969010e-03f, +1.758157367e-03f, -9.035293376e-04f, -5.046849967e-03f, -1.052447103e-02f, -1.686036328e-02f, -2.325321288e-02f, -2.865282346e-02f, -3.190731847e-02f, -3.196179918e-02f, -2.807404400e-02f, -2.000388698e-02f, -8.133017718e-03f, +6.517945993e-03f, +2.238959427e-02f, +3.759199639e-02f, +5.018871167e-02f, +5.850644264e-02f, +6.141247912e-02f, +5.850644264e-02f, +5.018871167e-02f, +3.759199639e-02f, +2.238959427e-02f, +6.517945993e-03f, -8.133017718e-03f, -2.000388698e-02f, -2.807404400e-02f, -3.196179918e-02f, -3.190731847e-02f, -2.865282346e-02f, -2.325321288e-02f, -1.686036328e-02f, -1.052447103e-02f, -5.046849967e-03f, -9.035293376e-04f, +1.758157367e-03f, +3.062969010e-03f, +3.314167096e-03f, +2.889370620e-03f, +2.149280883e-03f, +1.375020608e-03f, +7.400711575e-04f, +3.136419749e-04f, + +1.436875469e-05f, +1.561612709e-05f, +1.417141484e-05f, +8.846225192e-06f, -1.492899882e-06f, -1.777981991e-05f, -4.059923501e-05f, -7.004937168e-05f, -1.056348136e-04f, -1.462059716e-04f, -1.899581021e-04f, -2.344972762e-04f, -2.769737986e-04f, -3.142760250e-04f, -3.432701935e-04f, -3.610656819e-04f, -3.652808343e-04f, -3.542827868e-04f, -3.273758978e-04f, -2.849174469e-04f, -2.283458597e-04f, -1.601151740e-04f, -8.353887009e-05f, -2.555508337e-06f, +7.856322346e-05f, +1.555353731e-04f, +2.243925418e-04f, +2.817745994e-04f, +3.251683254e-04f, +3.530689224e-04f, +3.650514058e-04f, +3.617481497e-04f, +3.447383033e-04f, +3.163633379e-04f, +2.794897176e-04f, +2.372439164e-04f, +1.927463657e-04f, +1.488693749e-04f, +1.080399453e-04f, +7.210228972e-05f, +4.224758644e-05f, +1.901092689e-05f, +2.328453823e-06f, -8.357927672e-06f, -1.396459906e-05f, -1.561691254e-05f, -1.450376051e-05f, -1.175075544e-05f, + -3.298796763e-05f, -4.497254386e-05f, -4.975291943e-05f, -4.042907987e-05f, -1.073671011e-05f, +4.281170552e-05f, +1.188365932e-04f, +2.096675045e-04f, +3.011639964e-04f, +3.741484107e-04f, +4.074621699e-04f, +3.822318455e-04f, +2.865420942e-04f, +1.194703409e-04f, -1.065721740e-04f, -3.659939596e-04f, -6.229874085e-04f, -8.370019861e-04f, -9.698167423e-04f, -9.928547411e-04f, -8.932168303e-04f, -6.770885329e-04f, -3.696692020e-04f, -1.148458052e-05f, +3.482868123e-04f, +6.601946496e-04f, +8.829516200e-04f, +9.902567432e-04f, +9.746956122e-04f, +8.480412722e-04f, +6.380463451e-04f, +3.825376741e-04f, +1.221374013e-04f, -1.068677635e-04f, -2.781320935e-04f, -3.783873075e-04f, -4.077685417e-04f, -3.776097676e-04f, -3.064853506e-04f, -2.155449835e-04f, -1.241951985e-04f, -4.695088128e-05f, +8.102898992e-06f, +3.922482936e-05f, +4.965574704e-05f, +4.555149778e-05f, +3.382854534e-05f, +2.043206678e-05f, + /* 1, 1 (48) */ + -4.652752077e-04f, -7.073330850e-04f, -9.507172034e-04f, -1.143457714e-03f, -1.214800150e-03f, -1.077152385e-03f, -6.304043582e-04f, +2.314272939e-04f, +1.611560287e-03f, +3.600422786e-03f, +6.265093734e-03f, +9.639224092e-03f, +1.371452376e-02f, +1.843485059e-02f, +2.369376918e-02f, +2.933616842e-02f, +3.516416220e-02f, +4.094708366e-02f, +4.643496283e-02f, +5.137449813e-02f, +5.552623746e-02f, +5.868150975e-02f, +6.067761781e-02f, +6.140992362e-02f, +6.083971990e-02f, +5.899716030e-02f, +5.597897586e-02f, +5.194119018e-02f, +4.708750705e-02f, +4.165443537e-02f, +3.589449444e-02f, +3.005898225e-02f, +2.438177768e-02f, +1.906548995e-02f, +1.427098728e-02f, +1.011096528e-02f, +6.647798202e-03f, +3.895498133e-03f, +1.825235046e-03f, +3.735789553e-04f, -5.475575367e-04f, -1.040361638e-03f, -1.210978797e-03f, -1.160661867e-03f, -9.788532173e-04f, -7.385661247e-04f, -4.941477229e-04f, -2.812464804e-04f, + +7.070831898e-04f, +1.330048064e-03f, +2.099527963e-03f, +2.848941540e-03f, +3.303430386e-03f, +3.105780715e-03f, +1.876993960e-03f, -6.938618331e-04f, -4.745685971e-03f, -1.015032262e-02f, -1.645290111e-02f, -2.287098103e-02f, -2.836628136e-02f, -3.178784813e-02f, -3.206837136e-02f, -2.844003796e-02f, -2.062687439e-02f, -8.970019704e-03f, +5.548129250e-03f, +2.139673953e-02f, +3.669877956e-02f, +4.951162314e-02f, +5.813677344e-02f, +6.140099454e-02f, +5.885472945e-02f, +5.084890632e-02f, +3.847494801e-02f, +2.337985102e-02f, +7.492641605e-03f, -7.284976446e-03f, -1.936584064e-02f, -2.769150633e-02f, -3.183966178e-02f, -3.201418624e-02f, -2.893095555e-02f, -2.363160019e-02f, -1.726813182e-02f, -1.090208080e-02f, -5.353335318e-03f, -1.119074321e-03f, +1.633962169e-03f, +3.016018128e-03f, +3.322269995e-03f, +2.928595450e-03f, +2.198936630e-03f, +1.420572106e-03f, +7.738997028e-04f, +3.340740417e-04f, + +1.422765568e-05f, +1.560484981e-05f, +1.436305556e-05f, +9.314872538e-06f, -6.806932534e-07f, -1.657438954e-05f, -3.897697936e-05f, -6.802063440e-05f, -1.032493727e-04f, -1.435551879e-04f, -1.871730634e-04f, -2.317426657e-04f, -2.744376758e-04f, -3.121561799e-04f, -3.417581727e-04f, -3.603299209e-04f, -3.654505292e-04f, -3.554341621e-04f, -3.295223672e-04f, -2.880048316e-04f, -2.322533521e-04f, -1.646621696e-04f, -8.849719227e-05f, -7.665992852e-06f, +7.357127629e-05f, +1.509236733e-04f, +2.203941213e-04f, +2.785767791e-04f, +3.228998788e-04f, +3.517925311e-04f, +3.647619571e-04f, +3.623768266e-04f, +3.461618466e-04f, +3.184173686e-04f, +2.819846545e-04f, +2.399818431e-04f, +1.955372004e-04f, +1.515448748e-04f, +1.104644002e-04f, +7.417918467e-05f, +4.392198589e-05f, +2.026779777e-05f, +3.187546744e-06f, -7.849719961e-06f, -1.374231680e-05f, -1.560691722e-05f, -1.463241434e-05f, -1.195157556e-05f, + -3.214276087e-05f, -4.436582473e-05f, -4.979481204e-05f, -4.155286413e-05f, -1.327572638e-05f, +3.876242354e-05f, +1.135379940e-04f, +2.037943320e-04f, +2.957710268e-04f, +3.705313687e-04f, +4.069248265e-04f, +3.857975120e-04f, +2.946688243e-04f, +1.318381643e-04f, -9.114075986e-05f, -3.494423697e-04f, -6.077598419e-04f, -8.256423296e-04f, -9.645038563e-04f, -9.949671927e-04f, -9.030206730e-04f, -6.936207075e-04f, -3.908504078e-04f, -3.444745270e-05f, +3.267147364e-04f, +6.429475305e-04f, +8.722291410e-04f, +9.871724207e-04f, +9.791352228e-04f, +8.587516819e-04f, +6.529265948e-04f, +3.990637556e-04f, +1.378286001e-04f, -9.403526962e-05f, -2.694402545e-04f, -3.742622091e-04f, -4.078399572e-04f, -3.809102841e-04f, -3.117299173e-04f, -2.214225220e-04f, -1.296110609e-04f, -5.117885245e-05f, +5.373957843e-06f, +3.793880645e-05f, +4.950156984e-05f, +4.610103897e-05f, +3.466326372e-05f, +2.123200363e-05f, + /* 1, 2 (48) */ + -4.510475520e-04f, -6.917282352e-04f, -9.363541479e-04f, -1.134142841e-03f, -1.215480844e-03f, -1.093726775e-03f, -6.693813375e-04f, +1.634066595e-04f, +1.508310914e-03f, +3.456867598e-03f, +6.077920671e-03f, +9.407481427e-03f, +1.344008609e-02f, +1.812269441e-02f, +2.335201101e-02f, +2.897583849e-02f, +3.479871167e-02f, +4.059164950e-02f, +4.610544046e-02f, +5.108649330e-02f, +5.529398411e-02f, +5.851684758e-02f, +6.058912062e-02f, +6.140225762e-02f, +6.091329118e-02f, +5.914808397e-02f, +5.619936998e-02f, +5.221976696e-02f, +4.741040693e-02f, +4.200622791e-02f, +3.625925639e-02f, +3.042135907e-02f, +2.472793953e-02f, +1.938390732e-02f, +1.455297193e-02f, +1.035094713e-02f, +6.843335402e-03f, +4.047043008e-03f, +1.935699446e-03f, +4.477581400e-04f, -5.036355508e-04f, -1.020093841e-03f, -1.207791250e-03f, -1.168511587e-03f, -9.925955341e-04f, -7.541730419e-04f, -5.087801372e-04f, -2.931980560e-04f, + +6.749404290e-04f, +1.285682239e-03f, +2.049733151e-03f, +2.807388676e-03f, +3.290154659e-03f, +3.144543139e-03f, +1.990531954e-03f, -4.900675011e-04f, -4.449914944e-03f, -9.779791249e-03f, -1.604597628e-02f, -2.248518352e-02f, -2.807161254e-02f, -3.165600997e-02f, -3.215951212e-02f, -2.878948033e-02f, -2.123463423e-02f, -9.795662033e-03f, +4.583625394e-03f, +2.040177234e-02f, +3.579575888e-02f, +4.881800243e-02f, +5.774592303e-02f, +6.136654709e-02f, +5.918144419e-02f, +5.149185385e-02f, +3.934717715e-02f, +2.436702344e-02f, +8.471776828e-03f, -6.426224764e-03f, -1.871291404e-02f, -2.729244257e-02f, -3.170183318e-02f, -3.210822151e-02f, -2.920039581e-02f, -2.400586239e-02f, -1.767597177e-02f, -1.128299108e-02f, -5.665065235e-03f, -1.340496843e-03f, +1.504351108e-03f, +2.964839276e-03f, +3.327643953e-03f, +2.966534256e-03f, +2.248438199e-03f, +1.466673145e-03f, +8.085629665e-04f, +3.553060453e-04f, + +1.408071968e-05f, +1.558336850e-05f, +1.453981342e-05f, +9.764132757e-06f, +1.083630892e-07f, -1.539454099e-05f, -3.738085809e-05f, -6.601627161e-05f, -1.008839801e-04f, -1.409175379e-04f, -1.843918961e-04f, -2.289808241e-04f, -2.718821271e-04f, -3.100045565e-04f, -3.402029042e-04f, -3.595413759e-04f, -3.655607915e-04f, -3.565231022e-04f, -3.316075217e-04f, -2.910362794e-04f, -2.361143096e-04f, -1.691754631e-04f, -9.343717126e-05f, -1.277488105e-05f, +6.856405736e-05f, +1.462809907e-04f, +2.163513340e-04f, +2.753244915e-04f, +3.205708032e-04f, +3.504535917e-04f, +3.644122164e-04f, +3.629512268e-04f, +3.475401762e-04f, +3.204373710e-04f, +2.844578309e-04f, +2.427103092e-04f, +1.983299454e-04f, +1.542319388e-04f, +1.129078005e-04f, +7.627984250e-05f, +4.562237634e-05f, +2.155051224e-05f, +4.070364810e-06f, -7.321345221e-06f, -1.350427756e-05f, -1.558585112e-05f, -1.475445480e-05f, -1.214962021e-05f, + -3.129412251e-05f, -4.373296981e-05f, -4.978315839e-05f, -4.259753072e-05f, -1.572035894e-05f, +3.480403449e-05f, +1.083020469e-04f, +1.979296317e-04f, +2.903115805e-04f, +3.667638307e-04f, +4.061606045e-04f, +3.890861680e-04f, +3.025110613e-04f, +1.439666045e-04f, -7.585083792e-05f, -3.328925852e-04f, -5.923737374e-04f, -8.139709591e-04f, -9.587624439e-04f, -9.965951766e-04f, -9.123593490e-04f, -7.097829418e-04f, -4.118190680e-04f, -5.739146255e-05f, +3.049646014e-04f, +6.253558851e-04f, +8.610537897e-04f, +9.836012974e-04f, +9.831305814e-04f, +8.691248663e-04f, +6.676181426e-04f, +4.155623762e-04f, +1.536377706e-04f, -8.097790407e-05f, -2.604682208e-04f, -3.698550369e-04f, -4.076725437e-04f, -3.840448432e-04f, -3.168924946e-04f, -2.272957940e-04f, -1.350813291e-04f, -5.549442053e-05f, +2.549629309e-06f, +3.656974964e-05f, +4.928867322e-05f, +4.661950316e-05f, +3.549086016e-05f, +2.204092248e-05f, + /* 1, 3 (48) */ + -4.369668323e-04f, -6.761448667e-04f, -9.218143344e-04f, -1.124378708e-03f, -1.215372481e-03f, -1.109121316e-03f, -7.067621956e-04f, +9.739038789e-05f, +1.407426934e-03f, +3.315950061e-03f, +5.893528775e-03f, +9.178500602e-03f, +1.316820396e-02f, +1.781268985e-02f, +2.301180811e-02f, +2.861629712e-02f, +3.443315088e-02f, +4.023512640e-02f, +4.577383294e-02f, +5.079545702e-02f, +5.505786980e-02f, +5.834767212e-02f, +6.049568345e-02f, +6.138948274e-02f, +6.098185524e-02f, +5.929436496e-02f, +5.641572132e-02f, +5.249509145e-02f, +4.773097773e-02f, +4.235668150e-02f, +3.662366861e-02f, +3.078431030e-02f, +2.507547970e-02f, +1.970434469e-02f, +1.483742976e-02f, +1.059365744e-02f, +7.041665348e-03f, +4.201274946e-03f, +2.048607246e-03f, +5.240379825e-04f, -4.580131745e-04f, -9.985433285e-04f, -1.203720885e-03f, -1.175832932e-03f, -1.006099812e-03f, -7.697588930e-04f, -5.235345920e-04f, -3.053476762e-04f, + +6.436463064e-04f, +1.241949270e-03f, +1.999949993e-03f, +2.764791145e-03f, +3.274434301e-03f, +3.179347173e-03f, +2.098834001e-03f, -2.921378694e-04f, -4.159603364e-03f, -9.413027418e-03f, -1.563981567e-02f, -2.209609735e-02f, -2.776910148e-02f, -3.151204336e-02f, -3.223536296e-02f, -2.912237291e-02f, -2.182700797e-02f, -1.060963299e-02f, +3.624862950e-03f, +1.940517716e-02f, +3.488339953e-02f, +4.810821949e-02f, +5.733410396e-02f, +6.130915563e-02f, +5.948640879e-02f, +5.211720974e-02f, +4.020823094e-02f, +2.535062474e-02f, +9.454907409e-03f, -5.557099897e-03f, -1.804529590e-02f, -2.687688019e-02f, -3.154819541e-02f, -3.218919941e-02f, -2.946086403e-02f, -2.437571743e-02f, -1.808364432e-02f, -1.166703592e-02f, -5.981957730e-03f, -1.567792637e-03f, +1.369269778e-03f, +2.909344855e-03f, +3.330193582e-03f, +3.003104006e-03f, +2.297726873e-03f, +1.513292648e-03f, +8.440538267e-04f, +3.773469678e-04f, + +1.392820018e-05f, +1.555196970e-05f, +1.470198130e-05f, +1.019427178e-05f, +8.744713867e-07f, -1.424017206e-05f, -3.581090067e-05f, -6.403646691e-05f, -9.853898309e-05f, -1.382935265e-04f, -1.816152396e-04f, -2.262124861e-04f, -2.693079297e-04f, -3.078219119e-04f, -3.386050587e-04f, -3.587005674e-04f, -3.656119364e-04f, -3.575496773e-04f, -3.336311662e-04f, -2.940113321e-04f, -2.399280361e-04f, -1.736541678e-04f, -9.835779378e-05f, -1.788110924e-05f, +6.354259999e-05f, +1.416082500e-04f, +2.122649289e-04f, +2.720182574e-04f, +3.181813609e-04f, +3.490520992e-04f, +3.640019265e-04f, +3.634708763e-04f, +3.488726530e-04f, +3.224226032e-04f, +2.869084686e-04f, +2.454285640e-04f, +2.011239334e-04f, +1.569300258e-04f, +1.153697583e-04f, +7.840403901e-05f, +4.734869143e-05f, +2.285914223e-05f, +4.977088548e-06f, -6.772549939e-06f, -1.325019189e-05f, -1.555342333e-05f, -1.486961808e-05f, -1.234467317e-05f, + -3.044321659e-05f, -4.307558912e-05f, -4.971969849e-05f, -4.356446846e-05f, -1.807109303e-05f, +3.093743924e-05f, +1.031312945e-04f, +1.920774861e-04f, +2.847907589e-04f, +3.628510148e-04f, +4.051736998e-04f, +3.920998434e-04f, +3.100677915e-04f, +1.558512420e-04f, -6.070992062e-05f, -3.163542042e-04f, -5.768392143e-04f, -8.019966748e-04f, -9.525982357e-04f, -9.977400699e-04f, -9.212293605e-04f, -7.255672513e-04f, -4.325639655e-04f, -8.030404950e-05f, +2.830481549e-04f, +6.074286538e-04f, +8.494302580e-04f, +9.795432004e-04f, +9.866769511e-04f, +8.791526409e-04f, +6.821110234e-04f, +4.320236446e-04f, +1.695567592e-04f, -6.770091667e-05f, -2.512178480e-04f, -3.651644562e-04f, -4.072625452e-04f, -3.870083707e-04f, -3.219678548e-04f, -2.331603972e-04f, -1.406030499e-04f, -5.989628606e-05f, -3.702643188e-07f, +3.511644428e-05f, +4.901535501e-05f, +4.710521070e-05f, +3.631004035e-05f, +2.285808138e-05f, + /* 1, 4 (48) */ + -4.230386322e-04f, -6.605928970e-04f, -9.071123531e-04f, -1.114184437e-03f, -1.214498009e-03f, -1.123361488e-03f, -7.425730963e-04f, +3.335392098e-05f, +1.308887951e-03f, +3.177656534e-03f, +5.711913535e-03f, +8.952288116e-03f, +1.289889603e-02f, +1.750486794e-02f, +2.267320305e-02f, +2.825759655e-02f, +3.406753894e-02f, +3.987757672e-02f, +4.544020177e-02f, +5.050144569e-02f, +5.481794176e-02f, +5.817401795e-02f, +6.039732565e-02f, +6.137160163e-02f, +6.104539784e-02f, +5.943597321e-02f, +5.662798625e-02f, +5.276710971e-02f, +4.804915909e-02f, +4.270573360e-02f, +3.698767054e-02f, +3.114778118e-02f, +2.542435236e-02f, +2.002676730e-02f, +1.512433823e-02f, +1.083908600e-02f, +7.242789281e-03f, +4.358204972e-03f, +2.163977005e-03f, +6.024420215e-04f, -4.106644831e-04f, -9.756841862e-04f, -1.198743797e-03f, -1.182605482e-03f, -1.019350004e-03f, -7.853123163e-04f, -5.384042101e-04f, -3.176923494e-04f, + +6.132030899e-04f, +1.198873681e-03f, +1.950230294e-03f, +2.721226677e-03f, +3.256363208e-03f, +3.210284612e-03f, +2.201965296e-03f, -1.000603833e-04f, -3.874812605e-03f, -9.050176404e-03f, -1.523464198e-02f, -2.170399751e-02f, -2.745903369e-02f, -3.135619212e-02f, -3.229607288e-02f, -2.943872712e-02f, -2.240384718e-02f, -1.141162967e-02f, +2.672264714e-03f, +1.840743709e-02f, +3.396217017e-02f, +4.738265224e-02f, +5.690154000e-02f, +6.122885158e-02f, +5.976945695e-02f, +5.272463839e-02f, +4.105766120e-02f, +2.633016794e-02f, +1.044158436e-02f, -4.677947257e-03f, -1.736318488e-02f, -2.644485655e-02f, -3.137863865e-02f, -3.225690033e-02f, -2.971208187e-02f, -2.474088189e-02f, -1.849090686e-02f, -1.205404429e-02f, -6.303925585e-03f, -1.800953034e-03f, +1.228666729e-03f, +2.849448569e-03f, +3.329823318e-03f, +3.038220450e-03f, +2.346742228e-03f, +1.560397859e-03f, +8.803638670e-04f, +4.002050492e-04f, + +1.377034793e-05f, +1.551093858e-05f, +1.484985257e-05f, +1.060555829e-05f, +1.617838952e-06f, -1.311117335e-05f, -3.426712759e-05f, -6.208139387e-05f, -9.621471868e-05f, -1.356836490e-04f, -1.788437260e-04f, -2.234383818e-04f, -2.667158598e-04f, -3.056090065e-04f, -3.369653145e-04f, -3.578080270e-04f, -3.656042935e-04f, -3.585139737e-04f, -3.355931220e-04f, -2.969295472e-04f, -2.436938494e-04f, -1.780974071e-04f, -1.032580523e-04f, -2.298361455e-05f, +5.850794175e-05f, +1.369063854e-04f, +2.081356675e-04f, +2.686586134e-04f, +3.157318305e-04f, +3.475880652e-04f, +3.635308455e-04f, +3.639353135e-04f, +3.501586466e-04f, +3.243723279e-04f, +2.893357895e-04f, +2.481358533e-04f, +2.039184901e-04f, +1.596385855e-04f, +1.178498758e-04f, +8.055153976e-05f, +4.910085537e-05f, +2.419375182e-05f, +5.907892698e-06f, -6.203084070e-06f, -1.297977154e-05f, -1.550934211e-05f, -1.497763796e-05f, -1.253651480e-05f, + -2.959117339e-05f, -4.239527205e-05f, -4.960617699e-05f, -4.445510421e-05f, -2.032848599e-05f, +2.716344140e-05f, +9.802817553e-05f, +1.862418924e-04f, +2.792136228e-04f, +3.587981640e-04f, +4.039684070e-04f, +3.948407330e-04f, +3.173382086e-04f, +1.674878689e-04f, -4.572534974e-05f, -2.998367356e-04f, -5.611664122e-04f, -7.897284134e-04f, -9.460171984e-04f, -9.984035460e-04f, -9.296275127e-04f, -7.409659036e-04f, -4.530740344e-04f, -1.031726744e-04f, +2.609772578e-04f, +5.891750020e-04f, +8.373635309e-04f, +9.749982615e-04f, +9.897698548e-04f, +8.888269914e-04f, +6.963953288e-04f, +4.484376120e-04f, +1.855772631e-04f, -5.420976061e-05f, -2.416912049e-04f, -3.601893137e-04f, -4.066063268e-04f, -3.897958401e-04f, -3.269507481e-04f, -2.390118549e-04f, -1.461731693e-04f, -6.438304794e-05f, -3.385819329e-06f, +3.357772476e-05f, +4.867992751e-05f, +4.755646799e-05f, +3.711947890e-05f, +2.368270267e-05f, + /* 1, 5 (48) */ + -4.092682842e-04f, -6.450819584e-04f, -8.922625006e-04f, -1.103578878e-03f, -1.212880170e-03f, -1.136472661e-03f, -7.768402239e-04f, -2.872747289e-05f, +1.212673232e-03f, +3.041972885e-03f, +5.533069809e-03f, +8.728849735e-03f, +1.263218017e-02f, +1.719925894e-02f, +2.233623773e-02f, +2.789978852e-02f, +3.370193465e-02f, +3.951906275e-02f, +4.510460865e-02f, +5.020451614e-02f, +5.457424791e-02f, +5.799592054e-02f, +6.029406760e-02f, +6.134861802e-02f, +6.110390578e-02f, +5.957287960e-02f, +5.683612192e-02f, +5.303576832e-02f, +4.836489092e-02f, +4.305332166e-02f, +3.735120138e-02f, +3.151171649e-02f, +2.577451100e-02f, +2.035113962e-02f, +1.541367402e-02f, +1.108722185e-02f, +7.446707771e-03f, +4.517843558e-03f, +2.281826881e-03f, +6.829935612e-04f, -3.615636277e-04f, -9.514904344e-04f, -1.192835904e-03f, -1.188808566e-03f, -1.032329775e-03f, -8.008216584e-04f, -5.533818481e-04f, -3.302288642e-04f, + +5.836119165e-04f, +1.156478409e-03f, +1.900624117e-03f, +2.676771573e-03f, +3.236034722e-03f, +3.237448054e-03f, +2.299993471e-03f, +8.618150913e-05f, -3.595598982e-03f, -8.691378240e-03f, -1.483067357e-02f, -2.130915678e-02f, -2.714169548e-02f, -3.118870425e-02f, -3.234179823e-02f, -2.973856385e-02f, -2.296501360e-02f, -1.220135808e-02f, +1.726247516e-03f, +1.740903355e-02f, +3.303254266e-02f, +4.664168634e-02f, +5.644846596e-02f, +6.112567891e-02f, +6.003043421e-02f, +5.331381339e-02f, +4.189502473e-02f, +2.730516620e-02f, +1.143135421e-02f, -3.789120265e-03f, -1.666678955e-02f, -2.599641894e-02f, -3.119306139e-02f, -3.231111009e-02f, -2.995377308e-02f, -2.510107120e-02f, -1.889751319e-02f, -1.244384013e-02f, -6.630876333e-03f, -2.039964889e-03f, +1.082493559e-03f, +2.785065521e-03f, +3.326437498e-03f, +3.071798175e-03f, +2.395422155e-03f, +1.607954327e-03f, +9.174833459e-04f, +4.238877519e-04f, + +1.360741082e-05f, +1.546055886e-05f, +1.498372103e-05f, +1.099826356e-05f, +2.338678028e-06f, -1.200742830e-05f, -3.274955044e-05f, -6.015121602e-05f, -9.391151370e-05f, -1.330883916e-04f, -1.760779795e-04f, -2.206592368e-04f, -2.641066927e-04f, -3.033666037e-04f, -3.352843568e-04f, -3.568642973e-04f, -3.655382063e-04f, -3.594160939e-04f, -3.374932277e-04f, -2.997904985e-04f, -2.474110810e-04f, -1.825043147e-04f, -1.081369454e-04f, -2.808133519e-05f, +5.346112415e-05f, +1.321763393e-04f, +2.039643239e-04f, +2.652461110e-04f, +3.132225075e-04f, +3.460615178e-04f, +3.629987460e-04f, +3.643440891e-04f, +3.513975353e-04f, +3.262858124e-04f, +2.917390162e-04f, +2.508314194e-04f, +2.067129352e-04f, +1.623570592e-04f, +1.203477449e-04f, +8.272210008e-05f, +5.087878289e-05f, +2.555439710e-05f, +6.862946083e-06f, -5.612701183e-06f, -1.269272958e-05f, -1.545331501e-05f, -1.507824593e-05f, -1.272492213e-05f, + -2.873908892e-05f, -4.169358615e-05f, -4.944434125e-05f, -4.527090066e-05f, -2.249316533e-05f, +2.348274851e-05f, +9.299502465e-05f, +1.804267603e-04f, +2.735851890e-04f, +3.546105412e-04f, +4.025491149e-04f, +3.973111934e-04f, +3.243217116e-04f, +1.788724890e-04f, -3.090429259e-05f, -2.833495928e-04f, -5.453654837e-04f, -7.771752413e-04f, -9.390255295e-04f, -9.985875726e-04f, -9.375509149e-04f, -7.559714225e-04f, -4.733383682e-04f, -1.259848280e-04f, +2.387638760e-04f, +5.706043144e-04f, +8.248588837e-04f, +9.699669182e-04f, +9.924050797e-04f, +8.981400810e-04f, +7.104612148e-04f, +4.647942795e-04f, +2.016908352e-04f, -4.051009021e-05f, -2.318905738e-04f, -3.549286412e-04f, -4.057003792e-04f, -3.924022771e-04f, -3.318359064e-04f, -2.448456191e-04f, -1.517885333e-04f, -6.895320271e-05f, -6.497048873e-06f, +3.195247673e-05f, +4.828071952e-05f, +4.797156900e-05f, +3.791782005e-05f, +2.451397293e-05f, + /* 1, 6 (48) */ + -3.956608734e-04f, -6.296213996e-04f, -8.772787795e-04f, -1.092580615e-03f, -1.210541492e-03f, -1.148480090e-03f, -8.095897743e-04f, -8.887868891e-05f, +1.118761719e-03f, +2.908884493e-03f, +5.356991830e-03f, +8.508190498e-03f, +1.236807348e-02f, +1.689589233e-02f, +2.200095338e-02f, +2.754292423e-02f, +3.333639644e-02f, +3.915964666e-02f, +4.476711542e-02f, +4.990472564e-02f, +5.432683683e-02f, +5.781341623e-02f, +6.018593065e-02f, +6.132053668e-02f, +6.115736690e-02f, +5.970505594e-02f, +5.704008624e-02f, +5.330101443e-02f, +4.867811343e-02f, +4.339938318e-02f, +3.771420013e-02f, +3.187606058e-02f, +2.612590854e-02f, +2.067742544e-02f, +1.570541304e-02f, +1.133805327e-02f, +7.653420706e-03f, +4.680200617e-03f, +2.402174625e-03f, +7.657156613e-04f, -3.106848448e-04f, -9.259360373e-04f, -1.185972958e-03f, -1.194421267e-03f, -1.045022505e-03f, -8.162749735e-04f, -5.684600940e-04f, -3.429537863e-04f, + +5.548728275e-04f, +1.114784822e-03f, +1.851179776e-03f, +2.631500672e-03f, +3.213541556e-03f, +3.260930802e-03f, +2.392988496e-03f, +2.666082695e-04f, -3.322013793e-03f, -8.336767698e-03f, -1.442812445e-02f, -2.091184558e-02f, -2.681737377e-02f, -3.100983176e-02f, -3.237270252e-02f, -3.002191345e-02f, -2.351037908e-02f, -1.297853332e-02f, +7.872219866e-04f, +1.641044598e-02f, +3.209499175e-02f, +4.588571491e-02f, +5.597512760e-02f, +6.099969408e-02f, +6.026919808e-02f, +5.388441771e-02f, +4.271988361e-02f, +2.827513312e-02f, +1.242375929e-02f, -2.890980184e-03f, -1.595632833e-02f, -2.553162466e-02f, -3.099137055e-02f, -3.235162018e-02f, -3.018566365e-02f, -2.545599984e-02f, -1.930321357e-02f, -1.283624241e-02f, -6.962712239e-03f, -2.284810508e-03f, +9.307050260e-04f, +2.716112319e-03f, +3.319940450e-03f, +3.103750651e-03f, +2.443702875e-03f, +1.655925896e-03f, +9.554011660e-04f, +4.484017248e-04f, + +1.343963384e-05f, +1.540111268e-05f, +1.510388072e-05f, +1.137266132e-05f, +3.037205637e-06f, -1.092881336e-05f, -3.125817198e-05f, -5.824608692e-05f, -9.162968470e-05f, -1.305082307e-04f, -1.733186168e-04f, -2.178757715e-04f, -2.614812022e-04f, -3.010954694e-04f, -3.335628777e-04f, -3.558699317e-04f, -3.654140322e-04f, -3.602561561e-04f, -3.393313383e-04f, -3.025937756e-04f, -2.510790765e-04f, -1.868740351e-04f, -1.129934779e-04f, -3.317321082e-05f, +4.840319232e-05f, +1.274190627e-04f, +1.997516844e-04f, +2.617813169e-04f, +3.106537038e-04f, +3.444725018e-04f, +3.624054162e-04f, +3.646967662e-04f, +3.525887067e-04f, +3.281623292e-04f, +2.941173722e-04f, +2.535145019e-04f, +2.095065816e-04f, +1.650848794e-04f, +1.228629477e-04f, +8.491546506e-05f, +5.268237913e-05f, +2.694112611e-05f, +7.842411460e-06f, -5.001158613e-06f, -1.238878055e-05f, -1.538504899e-05f, -1.517117127e-05f, -1.290966885e-05f, + -2.788802465e-05f, -4.097207601e-05f, -4.923593954e-05f, -4.601335413e-05f, -2.456582673e-05f, +1.989597317e-05f, +8.803407223e-05f, +1.746359106e-04f, +2.679104263e-04f, +3.502934252e-04f, +4.009203018e-04f, +3.995137393e-04f, +3.310179034e-04f, +1.900013194e-04f, -1.625373835e-05f, -2.669020884e-04f, -5.294465871e-04f, -7.643463472e-04f, -9.316296518e-04f, -9.982944087e-04f, -9.449969818e-04f, -7.705765934e-04f, -4.933462266e-04f, -1.487280397e-04f, +2.164200722e-04f, +5.517261887e-04f, +8.119218791e-04f, +9.644499142e-04f, +9.945786815e-04f, +9.070842565e-04f, +7.242989091e-04f, +4.810836044e-04f, +2.178888888e-04f, -2.660775875e-05f, -2.218184512e-04f, -3.493816578e-04f, -4.045413228e-04f, -3.948227641e-04f, -3.366180478e-04f, -2.506570728e-04f, -1.574458887e-04f, -7.360514409e-05f, -9.703881282e-06f, +3.023963922e-05f, +4.781607847e-05f, +4.834879674e-05f, +3.870367843e-05f, +2.535104299e-05f, + /* 1, 7 (48) */ + -3.822212396e-04f, -6.142202869e-04f, -8.621748988e-04f, -1.081207953e-03f, -1.207504287e-03f, -1.159408903e-03f, -8.408479463e-04f, -1.471247758e-04f, +1.027132034e-03f, +2.778376263e-03f, +5.183673213e-03f, +8.290314726e-03f, +1.210659227e-02f, +1.659479686e-02f, +2.166739050e-02f, +2.718705429e-02f, +3.297098241e-02f, +3.879939050e-02f, +4.442778408e-02f, +4.960213187e-02f, +5.407575776e-02f, +5.762654220e-02f, +6.007293718e-02f, +6.128736347e-02f, +6.120577010e-02f, +5.983247500e-02f, +5.723983792e-02f, +5.356279575e-02f, +4.898876714e-02f, +4.374385568e-02f, +3.807660555e-02f, +3.224075735e-02f, +2.647849724e-02f, +2.100558777e-02f, +1.599953041e-02f, +1.159156778e-02f, +7.862927288e-03f, +4.845285496e-03f, +2.525037573e-03f, +8.506311264e-04f, -2.580024657e-04f, -8.989949112e-04f, -1.178130546e-03f, -1.199422426e-03f, -1.057411285e-03f, -8.316600224e-04f, -5.836312653e-04f, -3.558634551e-04f, + +5.269848029e-04f, +1.073812746e-03f, +1.801943836e-03f, +2.585487318e-03f, +3.188975729e-03f, +3.280826776e-03f, +2.481022568e-03f, +4.412441800e-04f, -3.054103367e-03f, -7.986474273e-03f, -1.402720415e-02f, -2.051233184e-02f, -2.648635586e-02f, -3.081983044e-02f, -3.238895626e-02f, -3.028881553e-02f, -2.403982567e-02f, -1.374287967e-02f, -1.444076651e-04f, +1.541215157e-02f, +3.114999476e-02f, +4.511513832e-02f, +5.548178137e-02f, +6.085096604e-02f, +6.048561815e-02f, +5.443614390e-02f, +4.353180549e-02f, +2.923958303e-02f, +1.341833798e-02f, -1.983895928e-03f, -1.523202942e-02f, -2.505054105e-02f, -3.077348167e-02f, -3.237822794e-02f, -3.040748210e-02f, -2.580538150e-02f, -1.970775489e-02f, -1.323106518e-02f, -7.299330287e-03f, -2.535467581e-03f, +7.732591374e-04f, +2.642507175e-03f, +3.310236568e-03f, +3.133990291e-03f, +2.491518953e-03f, +1.704274692e-03f, +9.941048444e-04f, +4.737527678e-04f, + +1.326725904e-05f, +1.533288052e-05f, +1.521062582e-05f, +1.172902759e-05f, +3.713643442e-06f, -9.875198106e-06f, -2.979298624e-05f, -5.636615021e-05f, -8.936953796e-05f, -1.279436332e-04f, -1.705662467e-04f, -2.150887015e-04f, -2.588401603e-04f, -2.987963721e-04f, -3.318015757e-04f, -3.548254937e-04f, -3.652321423e-04f, -3.610342947e-04f, -3.411073257e-04f, -3.053389846e-04f, -2.546971958e-04f, -1.912057239e-04f, -1.178266614e-04f, -3.825818285e-05f, +4.333519473e-05f, +1.226355145e-04f, +1.954985477e-04f, +2.582648130e-04f, +3.080257478e-04f, +3.428210784e-04f, +3.617506595e-04f, +3.649929210e-04f, +3.537315574e-04f, +3.300011559e-04f, +2.964700822e-04f, +2.561843375e-04f, +2.122987367e-04f, +1.678214700e-04f, +1.253950564e-04f, +8.713136950e-05f, +5.451153963e-05f, +2.835397865e-05f, +8.846445392e-06f, -4.368217600e-06f, -1.206764059e-05f, -1.530425055e-05f, -1.525614110e-05f, -1.309052541e-05f, + -2.703900717e-05f, -4.023226211e-05f, -4.898271918e-05f, -4.668399238e-05f, -2.654723195e-05f, +1.640363429e-05f, +8.314744426e-05f, +1.688730729e-04f, +2.621942529e-04f, +3.458521059e-04f, +3.990865308e-04f, +4.014510391e-04f, +3.374265890e-04f, +2.008707909e-04f, -1.780494609e-06f, -2.505034276e-04f, -5.134198790e-04f, -7.512510354e-04f, -9.238362079e-04f, -9.975266025e-04f, -9.519634345e-04f, -7.847744671e-04f, -5.130870425e-04f, -1.713898858e-04f, +1.939579981e-04f, +5.325504297e-04f, +7.985583642e-04f, +9.584483003e-04f, +9.962869878e-04f, +9.156520545e-04f, +7.378987183e-04f, +4.972955074e-04f, +2.341627031e-04f, -1.250881596e-05f, -2.114775483e-04f, -3.435477730e-04f, -4.031259119e-04f, -3.970524453e-04f, -3.412918803e-04f, -2.564415329e-04f, -1.631418845e-04f, -7.833716240e-05f, -1.300615846e-05f, +2.843820685e-05f, +4.728437245e-05f, +4.868642484e-05f, +3.947563984e-05f, +2.619302792e-05f, + /* 1, 8 (48) */ + -3.689539805e-04f, -5.988874064e-04f, -8.469642730e-04f, -1.069478926e-03f, -1.203790643e-03f, -1.169284101e-03f, -8.706409326e-04f, -2.034909260e-04f, +9.377624959e-04f, +2.650432629e-03f, +5.013106966e-03f, +8.075226025e-03f, +1.184775211e-02f, +1.629600049e-02f, +2.133558892e-02f, +2.683222880e-02f, +3.260575027e-02f, +3.843835620e-02f, +4.408667676e-02f, +4.929679288e-02f, +5.382106056e-02f, +5.743533647e-02f, +5.995511052e-02f, +6.124910529e-02f, +6.124910529e-02f, +5.995511052e-02f, +5.743533647e-02f, +5.382106056e-02f, +4.929679288e-02f, +4.408667676e-02f, +3.843835620e-02f, +3.260575027e-02f, +2.683222880e-02f, +2.133558892e-02f, +1.629600049e-02f, +1.184775211e-02f, +8.075226025e-03f, +5.013106966e-03f, +2.650432629e-03f, +9.377624959e-04f, -2.034909260e-04f, -8.706409326e-04f, -1.169284101e-03f, -1.203790643e-03f, -1.069478926e-03f, -8.469642730e-04f, -5.988874064e-04f, -3.689539805e-04f, + +4.999457957e-04f, +1.033580484e-03f, +1.752961117e-03f, +2.538803326e-03f, +3.162428497e-03f, +3.297230410e-03f, +2.564170012e-03f, +6.101172529e-04f, -2.791909114e-03f, -7.640622167e-03f, -1.362811762e-02f, -2.011088080e-02f, -2.614892927e-02f, -3.061895965e-02f, -3.239073675e-02f, -3.053931896e-02f, -2.455324555e-02f, -1.449413070e-02f, -1.068243873e-03f, +1.441462496e-02f, +3.019803133e-02f, +4.433036385e-02f, +5.496869433e-02f, +6.067957615e-02f, +6.067957615e-02f, +5.496869433e-02f, +4.433036385e-02f, +3.019803133e-02f, +1.441462496e-02f, -1.068243873e-03f, -1.449413070e-02f, -2.455324555e-02f, -3.053931896e-02f, -3.239073675e-02f, -3.061895965e-02f, -2.614892927e-02f, -2.011088080e-02f, -1.362811762e-02f, -7.640622167e-03f, -2.791909114e-03f, +6.101172529e-04f, +2.564170012e-03f, +3.297230410e-03f, +3.162428497e-03f, +2.538803326e-03f, +1.752961117e-03f, +1.033580484e-03f, +4.999457957e-04f, + +1.309052541e-05f, +1.525614110e-05f, +1.530425055e-05f, +1.206764059e-05f, +4.368217600e-06f, -8.846445392e-06f, -2.835397865e-05f, -5.451153963e-05f, -8.713136950e-05f, -1.253950564e-04f, -1.678214700e-04f, -2.122987367e-04f, -2.561843375e-04f, -2.964700822e-04f, -3.300011559e-04f, -3.537315574e-04f, -3.649929210e-04f, -3.617506595e-04f, -3.428210784e-04f, -3.080257478e-04f, -2.582648130e-04f, -1.954985477e-04f, -1.226355145e-04f, -4.333519473e-05f, +3.825818285e-05f, +1.178266614e-04f, +1.912057239e-04f, +2.546971958e-04f, +3.053389846e-04f, +3.411073257e-04f, +3.610342947e-04f, +3.652321423e-04f, +3.548254937e-04f, +3.318015757e-04f, +2.987963721e-04f, +2.588401603e-04f, +2.150887015e-04f, +1.705662467e-04f, +1.279436332e-04f, +8.936953796e-05f, +5.636615021e-05f, +2.979298624e-05f, +9.875198106e-06f, -3.713643442e-06f, -1.172902759e-05f, -1.521062582e-05f, -1.533288052e-05f, -1.326725904e-05f, + -2.619302792e-05f, -3.947563984e-05f, -4.868642484e-05f, -4.728437245e-05f, -2.843820685e-05f, +1.300615846e-05f, +7.833716240e-05f, +1.631418845e-04f, +2.564415329e-04f, +3.412918803e-04f, +3.970524453e-04f, +4.031259119e-04f, +3.435477730e-04f, +2.114775483e-04f, +1.250881596e-05f, -2.341627031e-04f, -4.972955074e-04f, -7.378987183e-04f, -9.156520545e-04f, -9.962869878e-04f, -9.584483003e-04f, -7.985583642e-04f, -5.325504297e-04f, -1.939579981e-04f, +1.713898858e-04f, +5.130870425e-04f, +7.847744671e-04f, +9.519634345e-04f, +9.975266025e-04f, +9.238362079e-04f, +7.512510354e-04f, +5.134198790e-04f, +2.505034276e-04f, +1.780494609e-06f, -2.008707909e-04f, -3.374265890e-04f, -4.014510391e-04f, -3.990865308e-04f, -3.458521059e-04f, -2.621942529e-04f, -1.688730729e-04f, -8.314744426e-05f, -1.640363429e-05f, +2.654723195e-05f, +4.668399238e-05f, +4.898271918e-05f, +4.023226211e-05f, +2.703900717e-05f, + /* 1, 9 (48) */ + -3.558634551e-04f, -5.836312653e-04f, -8.316600224e-04f, -1.057411285e-03f, -1.199422426e-03f, -1.178130546e-03f, -8.989949112e-04f, -2.580024657e-04f, +8.506311264e-04f, +2.525037573e-03f, +4.845285496e-03f, +7.862927288e-03f, +1.159156778e-02f, +1.599953041e-02f, +2.100558777e-02f, +2.647849724e-02f, +3.224075735e-02f, +3.807660555e-02f, +4.374385568e-02f, +4.898876714e-02f, +5.356279575e-02f, +5.723983792e-02f, +5.983247500e-02f, +6.120577010e-02f, +6.128736347e-02f, +6.007293718e-02f, +5.762654220e-02f, +5.407575776e-02f, +4.960213187e-02f, +4.442778408e-02f, +3.879939050e-02f, +3.297098241e-02f, +2.718705429e-02f, +2.166739050e-02f, +1.659479686e-02f, +1.210659227e-02f, +8.290314726e-03f, +5.183673213e-03f, +2.778376263e-03f, +1.027132034e-03f, -1.471247758e-04f, -8.408479463e-04f, -1.159408903e-03f, -1.207504287e-03f, -1.081207953e-03f, -8.621748988e-04f, -6.142202869e-04f, -3.822212396e-04f, + +4.737527678e-04f, +9.941048444e-04f, +1.704274692e-03f, +2.491518953e-03f, +3.133990291e-03f, +3.310236568e-03f, +2.642507175e-03f, +7.732591374e-04f, -2.535467581e-03f, -7.299330287e-03f, -1.323106518e-02f, -1.970775489e-02f, -2.580538150e-02f, -3.040748210e-02f, -3.237822794e-02f, -3.077348167e-02f, -2.505054105e-02f, -1.523202942e-02f, -1.983895928e-03f, +1.341833798e-02f, +2.923958303e-02f, +4.353180549e-02f, +5.443614390e-02f, +6.048561815e-02f, +6.085096604e-02f, +5.548178137e-02f, +4.511513832e-02f, +3.114999476e-02f, +1.541215157e-02f, -1.444076651e-04f, -1.374287967e-02f, -2.403982567e-02f, -3.028881553e-02f, -3.238895626e-02f, -3.081983044e-02f, -2.648635586e-02f, -2.051233184e-02f, -1.402720415e-02f, -7.986474273e-03f, -3.054103367e-03f, +4.412441800e-04f, +2.481022568e-03f, +3.280826776e-03f, +3.188975729e-03f, +2.585487318e-03f, +1.801943836e-03f, +1.073812746e-03f, +5.269848029e-04f, + +1.290966885e-05f, +1.517117127e-05f, +1.538504899e-05f, +1.238878055e-05f, +5.001158613e-06f, -7.842411460e-06f, -2.694112611e-05f, -5.268237913e-05f, -8.491546506e-05f, -1.228629477e-04f, -1.650848794e-04f, -2.095065816e-04f, -2.535145019e-04f, -2.941173722e-04f, -3.281623292e-04f, -3.525887067e-04f, -3.646967662e-04f, -3.624054162e-04f, -3.444725018e-04f, -3.106537038e-04f, -2.617813169e-04f, -1.997516844e-04f, -1.274190627e-04f, -4.840319232e-05f, +3.317321082e-05f, +1.129934779e-04f, +1.868740351e-04f, +2.510790765e-04f, +3.025937756e-04f, +3.393313383e-04f, +3.602561561e-04f, +3.654140322e-04f, +3.558699317e-04f, +3.335628777e-04f, +3.010954694e-04f, +2.614812022e-04f, +2.178757715e-04f, +1.733186168e-04f, +1.305082307e-04f, +9.162968470e-05f, +5.824608692e-05f, +3.125817198e-05f, +1.092881336e-05f, -3.037205637e-06f, -1.137266132e-05f, -1.510388072e-05f, -1.540111268e-05f, -1.343963384e-05f, + -2.535104299e-05f, -3.870367843e-05f, -4.834879674e-05f, -4.781607847e-05f, -3.023963922e-05f, +9.703881282e-06f, +7.360514409e-05f, +1.574458887e-04f, +2.506570728e-04f, +3.366180478e-04f, +3.948227641e-04f, +4.045413228e-04f, +3.493816578e-04f, +2.218184512e-04f, +2.660775875e-05f, -2.178888888e-04f, -4.810836044e-04f, -7.242989091e-04f, -9.070842565e-04f, -9.945786815e-04f, -9.644499142e-04f, -8.119218791e-04f, -5.517261887e-04f, -2.164200722e-04f, +1.487280397e-04f, +4.933462266e-04f, +7.705765934e-04f, +9.449969818e-04f, +9.982944087e-04f, +9.316296518e-04f, +7.643463472e-04f, +5.294465871e-04f, +2.669020884e-04f, +1.625373835e-05f, -1.900013194e-04f, -3.310179034e-04f, -3.995137393e-04f, -4.009203018e-04f, -3.502934252e-04f, -2.679104263e-04f, -1.746359106e-04f, -8.803407223e-05f, -1.989597317e-05f, +2.456582673e-05f, +4.601335413e-05f, +4.923593954e-05f, +4.097207601e-05f, +2.788802465e-05f, + /* 1,10 (48) */ + -3.429537863e-04f, -5.684600940e-04f, -8.162749735e-04f, -1.045022505e-03f, -1.194421267e-03f, -1.185972958e-03f, -9.259360373e-04f, -3.106848448e-04f, +7.657156613e-04f, +2.402174625e-03f, +4.680200617e-03f, +7.653420706e-03f, +1.133805327e-02f, +1.570541304e-02f, +2.067742544e-02f, +2.612590854e-02f, +3.187606058e-02f, +3.771420013e-02f, +4.339938318e-02f, +4.867811343e-02f, +5.330101443e-02f, +5.704008624e-02f, +5.970505594e-02f, +6.115736690e-02f, +6.132053668e-02f, +6.018593065e-02f, +5.781341623e-02f, +5.432683683e-02f, +4.990472564e-02f, +4.476711542e-02f, +3.915964666e-02f, +3.333639644e-02f, +2.754292423e-02f, +2.200095338e-02f, +1.689589233e-02f, +1.236807348e-02f, +8.508190498e-03f, +5.356991830e-03f, +2.908884493e-03f, +1.118761719e-03f, -8.887868891e-05f, -8.095897743e-04f, -1.148480090e-03f, -1.210541492e-03f, -1.092580615e-03f, -8.772787795e-04f, -6.296213996e-04f, -3.956608734e-04f, + +4.484017248e-04f, +9.554011660e-04f, +1.655925896e-03f, +2.443702875e-03f, +3.103750651e-03f, +3.319940450e-03f, +2.716112319e-03f, +9.307050260e-04f, -2.284810508e-03f, -6.962712239e-03f, -1.283624241e-02f, -1.930321357e-02f, -2.545599984e-02f, -3.018566365e-02f, -3.235162018e-02f, -3.099137055e-02f, -2.553162466e-02f, -1.595632833e-02f, -2.890980184e-03f, +1.242375929e-02f, +2.827513312e-02f, +4.271988361e-02f, +5.388441771e-02f, +6.026919808e-02f, +6.099969408e-02f, +5.597512760e-02f, +4.588571491e-02f, +3.209499175e-02f, +1.641044598e-02f, +7.872219866e-04f, -1.297853332e-02f, -2.351037908e-02f, -3.002191345e-02f, -3.237270252e-02f, -3.100983176e-02f, -2.681737377e-02f, -2.091184558e-02f, -1.442812445e-02f, -8.336767698e-03f, -3.322013793e-03f, +2.666082695e-04f, +2.392988496e-03f, +3.260930802e-03f, +3.213541556e-03f, +2.631500672e-03f, +1.851179776e-03f, +1.114784822e-03f, +5.548728275e-04f, + +1.272492213e-05f, +1.507824593e-05f, +1.545331501e-05f, +1.269272958e-05f, +5.612701183e-06f, -6.862946083e-06f, -2.555439710e-05f, -5.087878289e-05f, -8.272210008e-05f, -1.203477449e-04f, -1.623570592e-04f, -2.067129352e-04f, -2.508314194e-04f, -2.917390162e-04f, -3.262858124e-04f, -3.513975353e-04f, -3.643440891e-04f, -3.629987460e-04f, -3.460615178e-04f, -3.132225075e-04f, -2.652461110e-04f, -2.039643239e-04f, -1.321763393e-04f, -5.346112415e-05f, +2.808133519e-05f, +1.081369454e-04f, +1.825043147e-04f, +2.474110810e-04f, +2.997904985e-04f, +3.374932277e-04f, +3.594160939e-04f, +3.655382063e-04f, +3.568642973e-04f, +3.352843568e-04f, +3.033666037e-04f, +2.641066927e-04f, +2.206592368e-04f, +1.760779795e-04f, +1.330883916e-04f, +9.391151370e-05f, +6.015121602e-05f, +3.274955044e-05f, +1.200742830e-05f, -2.338678028e-06f, -1.099826356e-05f, -1.498372103e-05f, -1.546055886e-05f, -1.360741082e-05f, + -2.451397293e-05f, -3.791782005e-05f, -4.797156900e-05f, -4.828071952e-05f, -3.195247673e-05f, +6.497048873e-06f, +6.895320271e-05f, +1.517885333e-04f, +2.448456191e-04f, +3.318359064e-04f, +3.924022771e-04f, +4.057003792e-04f, +3.549286412e-04f, +2.318905738e-04f, +4.051009021e-05f, -2.016908352e-04f, -4.647942795e-04f, -7.104612148e-04f, -8.981400810e-04f, -9.924050797e-04f, -9.699669182e-04f, -8.248588837e-04f, -5.706043144e-04f, -2.387638760e-04f, +1.259848280e-04f, +4.733383682e-04f, +7.559714225e-04f, +9.375509149e-04f, +9.985875726e-04f, +9.390255295e-04f, +7.771752413e-04f, +5.453654837e-04f, +2.833495928e-04f, +3.090429259e-05f, -1.788724890e-04f, -3.243217116e-04f, -3.973111934e-04f, -4.025491149e-04f, -3.546105412e-04f, -2.735851890e-04f, -1.804267603e-04f, -9.299502465e-05f, -2.348274851e-05f, +2.249316533e-05f, +4.527090066e-05f, +4.944434125e-05f, +4.169358615e-05f, +2.873908892e-05f, + /* 1,11 (48) */ + -3.302288642e-04f, -5.533818481e-04f, -8.008216584e-04f, -1.032329775e-03f, -1.188808566e-03f, -1.192835904e-03f, -9.514904344e-04f, -3.615636277e-04f, +6.829935612e-04f, +2.281826881e-03f, +4.517843558e-03f, +7.446707771e-03f, +1.108722185e-02f, +1.541367402e-02f, +2.035113962e-02f, +2.577451100e-02f, +3.151171649e-02f, +3.735120138e-02f, +4.305332166e-02f, +4.836489092e-02f, +5.303576832e-02f, +5.683612192e-02f, +5.957287960e-02f, +6.110390578e-02f, +6.134861802e-02f, +6.029406760e-02f, +5.799592054e-02f, +5.457424791e-02f, +5.020451614e-02f, +4.510460865e-02f, +3.951906275e-02f, +3.370193465e-02f, +2.789978852e-02f, +2.233623773e-02f, +1.719925894e-02f, +1.263218017e-02f, +8.728849735e-03f, +5.533069809e-03f, +3.041972885e-03f, +1.212673232e-03f, -2.872747289e-05f, -7.768402239e-04f, -1.136472661e-03f, -1.212880170e-03f, -1.103578878e-03f, -8.922625006e-04f, -6.450819584e-04f, -4.092682842e-04f, + +4.238877519e-04f, +9.174833459e-04f, +1.607954327e-03f, +2.395422155e-03f, +3.071798175e-03f, +3.326437498e-03f, +2.785065521e-03f, +1.082493559e-03f, -2.039964889e-03f, -6.630876333e-03f, -1.244384013e-02f, -1.889751319e-02f, -2.510107120e-02f, -2.995377308e-02f, -3.231111009e-02f, -3.119306139e-02f, -2.599641894e-02f, -1.666678955e-02f, -3.789120265e-03f, +1.143135421e-02f, +2.730516620e-02f, +4.189502473e-02f, +5.331381339e-02f, +6.003043421e-02f, +6.112567891e-02f, +5.644846596e-02f, +4.664168634e-02f, +3.303254266e-02f, +1.740903355e-02f, +1.726247516e-03f, -1.220135808e-02f, -2.296501360e-02f, -2.973856385e-02f, -3.234179823e-02f, -3.118870425e-02f, -2.714169548e-02f, -2.130915678e-02f, -1.483067357e-02f, -8.691378240e-03f, -3.595598982e-03f, +8.618150913e-05f, +2.299993471e-03f, +3.237448054e-03f, +3.236034722e-03f, +2.676771573e-03f, +1.900624117e-03f, +1.156478409e-03f, +5.836119165e-04f, + +1.253651480e-05f, +1.497763796e-05f, +1.550934211e-05f, +1.297977154e-05f, +6.203084070e-06f, -5.907892698e-06f, -2.419375182e-05f, -4.910085537e-05f, -8.055153976e-05f, -1.178498758e-04f, -1.596385855e-04f, -2.039184901e-04f, -2.481358533e-04f, -2.893357895e-04f, -3.243723279e-04f, -3.501586466e-04f, -3.639353135e-04f, -3.635308455e-04f, -3.475880652e-04f, -3.157318305e-04f, -2.686586134e-04f, -2.081356675e-04f, -1.369063854e-04f, -5.850794175e-05f, +2.298361455e-05f, +1.032580523e-04f, +1.780974071e-04f, +2.436938494e-04f, +2.969295472e-04f, +3.355931220e-04f, +3.585139737e-04f, +3.656042935e-04f, +3.578080270e-04f, +3.369653145e-04f, +3.056090065e-04f, +2.667158598e-04f, +2.234383818e-04f, +1.788437260e-04f, +1.356836490e-04f, +9.621471868e-05f, +6.208139387e-05f, +3.426712759e-05f, +1.311117335e-05f, -1.617838952e-06f, -1.060555829e-05f, -1.484985257e-05f, -1.551093858e-05f, -1.377034793e-05f, + -2.368270267e-05f, -3.711947890e-05f, -4.755646799e-05f, -4.867992751e-05f, -3.357772476e-05f, +3.385819329e-06f, +6.438304794e-05f, +1.461731693e-04f, +2.390118549e-04f, +3.269507481e-04f, +3.897958401e-04f, +4.066063268e-04f, +3.601893137e-04f, +2.416912049e-04f, +5.420976061e-05f, -1.855772631e-04f, -4.484376120e-04f, -6.963953288e-04f, -8.888269914e-04f, -9.897698548e-04f, -9.749982615e-04f, -8.373635309e-04f, -5.891750020e-04f, -2.609772578e-04f, +1.031726744e-04f, +4.530740344e-04f, +7.409659036e-04f, +9.296275127e-04f, +9.984035460e-04f, +9.460171984e-04f, +7.897284134e-04f, +5.611664122e-04f, +2.998367356e-04f, +4.572534974e-05f, -1.674878689e-04f, -3.173382086e-04f, -3.948407330e-04f, -4.039684070e-04f, -3.587981640e-04f, -2.792136228e-04f, -1.862418924e-04f, -9.802817553e-05f, -2.716344140e-05f, +2.032848599e-05f, +4.445510421e-05f, +4.960617699e-05f, +4.239527205e-05f, +2.959117339e-05f, + /* 1,12 (48) */ + -3.176923494e-04f, -5.384042101e-04f, -7.853123163e-04f, -1.019350004e-03f, -1.182605482e-03f, -1.198743797e-03f, -9.756841862e-04f, -4.106644831e-04f, +6.024420215e-04f, +2.163977005e-03f, +4.358204972e-03f, +7.242789281e-03f, +1.083908600e-02f, +1.512433823e-02f, +2.002676730e-02f, +2.542435236e-02f, +3.114778118e-02f, +3.698767054e-02f, +4.270573360e-02f, +4.804915909e-02f, +5.276710971e-02f, +5.662798625e-02f, +5.943597321e-02f, +6.104539784e-02f, +6.137160163e-02f, +6.039732565e-02f, +5.817401795e-02f, +5.481794176e-02f, +5.050144569e-02f, +4.544020177e-02f, +3.987757672e-02f, +3.406753894e-02f, +2.825759655e-02f, +2.267320305e-02f, +1.750486794e-02f, +1.289889603e-02f, +8.952288116e-03f, +5.711913535e-03f, +3.177656534e-03f, +1.308887951e-03f, +3.335392098e-05f, -7.425730963e-04f, -1.123361488e-03f, -1.214498009e-03f, -1.114184437e-03f, -9.071123531e-04f, -6.605928970e-04f, -4.230386322e-04f, + +4.002050492e-04f, +8.803638670e-04f, +1.560397859e-03f, +2.346742228e-03f, +3.038220450e-03f, +3.329823318e-03f, +2.849448569e-03f, +1.228666729e-03f, -1.800953034e-03f, -6.303925585e-03f, -1.205404429e-02f, -1.849090686e-02f, -2.474088189e-02f, -2.971208187e-02f, -3.225690033e-02f, -3.137863865e-02f, -2.644485655e-02f, -1.736318488e-02f, -4.677947257e-03f, +1.044158436e-02f, +2.633016794e-02f, +4.105766120e-02f, +5.272463839e-02f, +5.976945695e-02f, +6.122885158e-02f, +5.690154000e-02f, +4.738265224e-02f, +3.396217017e-02f, +1.840743709e-02f, +2.672264714e-03f, -1.141162967e-02f, -2.240384718e-02f, -2.943872712e-02f, -3.229607288e-02f, -3.135619212e-02f, -2.745903369e-02f, -2.170399751e-02f, -1.523464198e-02f, -9.050176404e-03f, -3.874812605e-03f, -1.000603833e-04f, +2.201965296e-03f, +3.210284612e-03f, +3.256363208e-03f, +2.721226677e-03f, +1.950230294e-03f, +1.198873681e-03f, +6.132030899e-04f, + +1.234467317e-05f, +1.486961808e-05f, +1.555342333e-05f, +1.325019189e-05f, +6.772549939e-06f, -4.977088548e-06f, -2.285914223e-05f, -4.734869143e-05f, -7.840403901e-05f, -1.153697583e-04f, -1.569300258e-04f, -2.011239334e-04f, -2.454285640e-04f, -2.869084686e-04f, -3.224226032e-04f, -3.488726530e-04f, -3.634708763e-04f, -3.640019265e-04f, -3.490520992e-04f, -3.181813609e-04f, -2.720182574e-04f, -2.122649289e-04f, -1.416082500e-04f, -6.354259999e-05f, +1.788110924e-05f, +9.835779378e-05f, +1.736541678e-04f, +2.399280361e-04f, +2.940113321e-04f, +3.336311662e-04f, +3.575496773e-04f, +3.656119364e-04f, +3.587005674e-04f, +3.386050587e-04f, +3.078219119e-04f, +2.693079297e-04f, +2.262124861e-04f, +1.816152396e-04f, +1.382935265e-04f, +9.853898309e-05f, +6.403646691e-05f, +3.581090067e-05f, +1.424017206e-05f, -8.744713867e-07f, -1.019427178e-05f, -1.470198130e-05f, -1.555196970e-05f, -1.392820018e-05f, + -2.285808138e-05f, -3.631004035e-05f, -4.710521070e-05f, -4.901535501e-05f, -3.511644428e-05f, +3.702643188e-07f, +5.989628606e-05f, +1.406030499e-04f, +2.331603972e-04f, +3.219678548e-04f, +3.870083707e-04f, +4.072625452e-04f, +3.651644562e-04f, +2.512178480e-04f, +6.770091667e-05f, -1.695567592e-04f, -4.320236446e-04f, -6.821110234e-04f, -8.791526409e-04f, -9.866769511e-04f, -9.795432004e-04f, -8.494302580e-04f, -6.074286538e-04f, -2.830481549e-04f, +8.030404950e-05f, +4.325639655e-04f, +7.255672513e-04f, +9.212293605e-04f, +9.977400699e-04f, +9.525982357e-04f, +8.019966748e-04f, +5.768392143e-04f, +3.163542042e-04f, +6.070992062e-05f, -1.558512420e-04f, -3.100677915e-04f, -3.920998434e-04f, -4.051736998e-04f, -3.628510148e-04f, -2.847907589e-04f, -1.920774861e-04f, -1.031312945e-04f, -3.093743924e-05f, +1.807109303e-05f, +4.356446846e-05f, +4.971969849e-05f, +4.307558912e-05f, +3.044321659e-05f, + /* 1,13 (48) */ + -3.053476762e-04f, -5.235345920e-04f, -7.697588930e-04f, -1.006099812e-03f, -1.175832932e-03f, -1.203720885e-03f, -9.985433285e-04f, -4.580131745e-04f, +5.240379825e-04f, +2.048607246e-03f, +4.201274946e-03f, +7.041665348e-03f, +1.059365744e-02f, +1.483742976e-02f, +1.970434469e-02f, +2.507547970e-02f, +3.078431030e-02f, +3.662366861e-02f, +4.235668150e-02f, +4.773097773e-02f, +5.249509145e-02f, +5.641572132e-02f, +5.929436496e-02f, +6.098185524e-02f, +6.138948274e-02f, +6.049568345e-02f, +5.834767212e-02f, +5.505786980e-02f, +5.079545702e-02f, +4.577383294e-02f, +4.023512640e-02f, +3.443315088e-02f, +2.861629712e-02f, +2.301180811e-02f, +1.781268985e-02f, +1.316820396e-02f, +9.178500602e-03f, +5.893528775e-03f, +3.315950061e-03f, +1.407426934e-03f, +9.739038789e-05f, -7.067621956e-04f, -1.109121316e-03f, -1.215372481e-03f, -1.124378708e-03f, -9.218143344e-04f, -6.761448667e-04f, -4.369668323e-04f, + +3.773469678e-04f, +8.440538267e-04f, +1.513292648e-03f, +2.297726873e-03f, +3.003104006e-03f, +3.330193582e-03f, +2.909344855e-03f, +1.369269778e-03f, -1.567792637e-03f, -5.981957730e-03f, -1.166703592e-02f, -1.808364432e-02f, -2.437571743e-02f, -2.946086403e-02f, -3.218919941e-02f, -3.154819541e-02f, -2.687688019e-02f, -1.804529590e-02f, -5.557099897e-03f, +9.454907409e-03f, +2.535062474e-02f, +4.020823094e-02f, +5.211720974e-02f, +5.948640879e-02f, +6.130915563e-02f, +5.733410396e-02f, +4.810821949e-02f, +3.488339953e-02f, +1.940517716e-02f, +3.624862950e-03f, -1.060963299e-02f, -2.182700797e-02f, -2.912237291e-02f, -3.223536296e-02f, -3.151204336e-02f, -2.776910148e-02f, -2.209609735e-02f, -1.563981567e-02f, -9.413027418e-03f, -4.159603364e-03f, -2.921378694e-04f, +2.098834001e-03f, +3.179347173e-03f, +3.274434301e-03f, +2.764791145e-03f, +1.999949993e-03f, +1.241949270e-03f, +6.436463064e-04f, + +1.214962021e-05f, +1.475445480e-05f, +1.558585112e-05f, +1.350427756e-05f, +7.321345221e-06f, -4.070364810e-06f, -2.155051224e-05f, -4.562237634e-05f, -7.627984250e-05f, -1.129078005e-04f, -1.542319388e-04f, -1.983299454e-04f, -2.427103092e-04f, -2.844578309e-04f, -3.204373710e-04f, -3.475401762e-04f, -3.629512268e-04f, -3.644122164e-04f, -3.504535917e-04f, -3.205708032e-04f, -2.753244915e-04f, -2.163513340e-04f, -1.462809907e-04f, -6.856405736e-05f, +1.277488105e-05f, +9.343717126e-05f, +1.691754631e-04f, +2.361143096e-04f, +2.910362794e-04f, +3.316075217e-04f, +3.565231022e-04f, +3.655607915e-04f, +3.595413759e-04f, +3.402029042e-04f, +3.100045565e-04f, +2.718821271e-04f, +2.289808241e-04f, +1.843918961e-04f, +1.409175379e-04f, +1.008839801e-04f, +6.601627161e-05f, +3.738085809e-05f, +1.539454099e-05f, -1.083630892e-07f, -9.764132757e-06f, -1.453981342e-05f, -1.558336850e-05f, -1.408071968e-05f, + -2.204092248e-05f, -3.549086016e-05f, -4.661950316e-05f, -4.928867322e-05f, -3.656974964e-05f, -2.549629309e-06f, +5.549442053e-05f, +1.350813291e-04f, +2.272957940e-04f, +3.168924946e-04f, +3.840448432e-04f, +4.076725437e-04f, +3.698550369e-04f, +2.604682208e-04f, +8.097790407e-05f, -1.536377706e-04f, -4.155623762e-04f, -6.676181426e-04f, -8.691248663e-04f, -9.831305814e-04f, -9.836012974e-04f, -8.610537897e-04f, -6.253558851e-04f, -3.049646014e-04f, +5.739146255e-05f, +4.118190680e-04f, +7.097829418e-04f, +9.123593490e-04f, +9.965951766e-04f, +9.587624439e-04f, +8.139709591e-04f, +5.923737374e-04f, +3.328925852e-04f, +7.585083792e-05f, -1.439666045e-04f, -3.025110613e-04f, -3.890861680e-04f, -4.061606045e-04f, -3.667638307e-04f, -2.903115805e-04f, -1.979296317e-04f, -1.083020469e-04f, -3.480403449e-05f, +1.572035894e-05f, +4.259753072e-05f, +4.978315839e-05f, +4.373296981e-05f, +3.129412251e-05f, + /* 1,14 (48) */ + -2.931980560e-04f, -5.087801372e-04f, -7.541730419e-04f, -9.925955341e-04f, -1.168511587e-03f, -1.207791250e-03f, -1.020093841e-03f, -5.036355508e-04f, +4.477581400e-04f, +1.935699446e-03f, +4.047043008e-03f, +6.843335402e-03f, +1.035094713e-02f, +1.455297193e-02f, +1.938390732e-02f, +2.472793953e-02f, +3.042135907e-02f, +3.625925639e-02f, +4.200622791e-02f, +4.741040693e-02f, +5.221976696e-02f, +5.619936998e-02f, +5.914808397e-02f, +6.091329118e-02f, +6.140225762e-02f, +6.058912062e-02f, +5.851684758e-02f, +5.529398411e-02f, +5.108649330e-02f, +4.610544046e-02f, +4.059164950e-02f, +3.479871167e-02f, +2.897583849e-02f, +2.335201101e-02f, +1.812269441e-02f, +1.344008609e-02f, +9.407481427e-03f, +6.077920671e-03f, +3.456867598e-03f, +1.508310914e-03f, +1.634066595e-04f, -6.693813375e-04f, -1.093726775e-03f, -1.215480844e-03f, -1.134142841e-03f, -9.363541479e-04f, -6.917282352e-04f, -4.510475520e-04f, + +3.553060453e-04f, +8.085629665e-04f, +1.466673145e-03f, +2.248438199e-03f, +2.966534256e-03f, +3.327643953e-03f, +2.964839276e-03f, +1.504351108e-03f, -1.340496843e-03f, -5.665065235e-03f, -1.128299108e-02f, -1.767597177e-02f, -2.400586239e-02f, -2.920039581e-02f, -3.210822151e-02f, -3.170183318e-02f, -2.729244257e-02f, -1.871291404e-02f, -6.426224764e-03f, +8.471776828e-03f, +2.436702344e-02f, +3.934717715e-02f, +5.149185385e-02f, +5.918144419e-02f, +6.136654709e-02f, +5.774592303e-02f, +4.881800243e-02f, +3.579575888e-02f, +2.040177234e-02f, +4.583625394e-03f, -9.795662033e-03f, -2.123463423e-02f, -2.878948033e-02f, -3.215951212e-02f, -3.165600997e-02f, -2.807161254e-02f, -2.248518352e-02f, -1.604597628e-02f, -9.779791249e-03f, -4.449914944e-03f, -4.900675011e-04f, +1.990531954e-03f, +3.144543139e-03f, +3.290154659e-03f, +2.807388676e-03f, +2.049733151e-03f, +1.285682239e-03f, +6.749404290e-04f, + +1.195157556e-05f, +1.463241434e-05f, +1.560691722e-05f, +1.374231680e-05f, +7.849719961e-06f, -3.187546744e-06f, -2.026779777e-05f, -4.392198589e-05f, -7.417918467e-05f, -1.104644002e-04f, -1.515448748e-04f, -1.955372004e-04f, -2.399818431e-04f, -2.819846545e-04f, -3.184173686e-04f, -3.461618466e-04f, -3.623768266e-04f, -3.647619571e-04f, -3.517925311e-04f, -3.228998788e-04f, -2.785767791e-04f, -2.203941213e-04f, -1.509236733e-04f, -7.357127629e-05f, +7.665992852e-06f, +8.849719227e-05f, +1.646621696e-04f, +2.322533521e-04f, +2.880048316e-04f, +3.295223672e-04f, +3.554341621e-04f, +3.654505292e-04f, +3.603299209e-04f, +3.417581727e-04f, +3.121561799e-04f, +2.744376758e-04f, +2.317426657e-04f, +1.871730634e-04f, +1.435551879e-04f, +1.032493727e-04f, +6.802063440e-05f, +3.897697936e-05f, +1.657438954e-05f, +6.806932534e-07f, -9.314872538e-06f, -1.436305556e-05f, -1.560484981e-05f, -1.422765568e-05f, + -2.123200363e-05f, -3.466326372e-05f, -4.610103897e-05f, -4.950156984e-05f, -3.793880645e-05f, -5.373957843e-06f, +5.117885245e-05f, +1.296110609e-04f, +2.214225220e-04f, +3.117299173e-04f, +3.809102841e-04f, +4.078399572e-04f, +3.742622091e-04f, +2.694402545e-04f, +9.403526962e-05f, -1.378286001e-04f, -3.990637556e-04f, -6.529265948e-04f, -8.587516819e-04f, -9.791352228e-04f, -9.871724207e-04f, -8.722291410e-04f, -6.429475305e-04f, -3.267147364e-04f, +3.444745270e-05f, +3.908504078e-04f, +6.936207075e-04f, +9.030206730e-04f, +9.949671927e-04f, +9.645038563e-04f, +8.256423296e-04f, +6.077598419e-04f, +3.494423697e-04f, +9.114075986e-05f, -1.318381643e-04f, -2.946688243e-04f, -3.857975120e-04f, -4.069248265e-04f, -3.705313687e-04f, -2.957710268e-04f, -2.037943320e-04f, -1.135379940e-04f, -3.876242354e-05f, +1.327572638e-05f, +4.155286413e-05f, +4.979481204e-05f, +4.436582473e-05f, +3.214276087e-05f, + /* 1,15 (48) */ + -2.812464804e-04f, -4.941477229e-04f, -7.385661247e-04f, -9.788532173e-04f, -1.160661867e-03f, -1.210978797e-03f, -1.040361638e-03f, -5.475575367e-04f, +3.735789553e-04f, +1.825235046e-03f, +3.895498133e-03f, +6.647798202e-03f, +1.011096528e-02f, +1.427098728e-02f, +1.906548995e-02f, +2.438177768e-02f, +3.005898225e-02f, +3.589449444e-02f, +4.165443537e-02f, +4.708750705e-02f, +5.194119018e-02f, +5.597897586e-02f, +5.899716030e-02f, +6.083971990e-02f, +6.140992362e-02f, +6.067761781e-02f, +5.868150975e-02f, +5.552623746e-02f, +5.137449813e-02f, +4.643496283e-02f, +4.094708366e-02f, +3.516416220e-02f, +2.933616842e-02f, +2.369376918e-02f, +1.843485059e-02f, +1.371452376e-02f, +9.639224092e-03f, +6.265093734e-03f, +3.600422786e-03f, +1.611560287e-03f, +2.314272939e-04f, -6.304043582e-04f, -1.077152385e-03f, -1.214800150e-03f, -1.143457714e-03f, -9.507172034e-04f, -7.073330850e-04f, -4.652752077e-04f, + +3.340740417e-04f, +7.738997028e-04f, +1.420572106e-03f, +2.198936630e-03f, +2.928595450e-03f, +3.322269995e-03f, +3.016018128e-03f, +1.633962169e-03f, -1.119074321e-03f, -5.353335318e-03f, -1.090208080e-02f, -1.726813182e-02f, -2.363160019e-02f, -2.893095555e-02f, -3.201418624e-02f, -3.183966178e-02f, -2.769150633e-02f, -1.936584064e-02f, -7.284976446e-03f, +7.492641605e-03f, +2.337985102e-02f, +3.847494801e-02f, +5.084890632e-02f, +5.885472945e-02f, +6.140099454e-02f, +5.813677344e-02f, +4.951162314e-02f, +3.669877956e-02f, +2.139673953e-02f, +5.548129250e-03f, -8.970019704e-03f, -2.062687439e-02f, -2.844003796e-02f, -3.206837136e-02f, -3.178784813e-02f, -2.836628136e-02f, -2.287098103e-02f, -1.645290111e-02f, -1.015032262e-02f, -4.745685971e-03f, -6.938618331e-04f, +1.876993960e-03f, +3.105780715e-03f, +3.303430386e-03f, +2.848941540e-03f, +2.099527963e-03f, +1.330048064e-03f, +7.070831898e-04f, + +1.175075544e-05f, +1.450376051e-05f, +1.561691254e-05f, +1.396459906e-05f, +8.357927672e-06f, -2.328453823e-06f, -1.901092689e-05f, -4.224758644e-05f, -7.210228972e-05f, -1.080399453e-04f, -1.488693749e-04f, -1.927463657e-04f, -2.372439164e-04f, -2.794897176e-04f, -3.163633379e-04f, -3.447383033e-04f, -3.617481497e-04f, -3.650514058e-04f, -3.530689224e-04f, -3.251683254e-04f, -2.817745994e-04f, -2.243925418e-04f, -1.555353731e-04f, -7.856322346e-05f, +2.555508337e-06f, +8.353887009e-05f, +1.601151740e-04f, +2.283458597e-04f, +2.849174469e-04f, +3.273758978e-04f, +3.542827868e-04f, +3.652808343e-04f, +3.610656819e-04f, +3.432701935e-04f, +3.142760250e-04f, +2.769737986e-04f, +2.344972762e-04f, +1.899581021e-04f, +1.462059716e-04f, +1.056348136e-04f, +7.004937168e-05f, +4.059923501e-05f, +1.777981991e-05f, +1.492899882e-06f, -8.846225192e-06f, -1.417141484e-05f, -1.561612709e-05f, -1.436875469e-05f, + -2.043206678e-05f, -3.382854534e-05f, -4.555149778e-05f, -4.965574704e-05f, -3.922482936e-05f, -8.102898992e-06f, +4.695088128e-05f, +1.241951985e-04f, +2.155449835e-04f, +3.064853506e-04f, +3.776097676e-04f, +4.077685417e-04f, +3.783873075e-04f, +2.781320935e-04f, +1.068677635e-04f, -1.221374013e-04f, -3.825376741e-04f, -6.380463451e-04f, -8.480412722e-04f, -9.746956122e-04f, -9.902567432e-04f, -8.829516200e-04f, -6.601946496e-04f, -3.482868123e-04f, +1.148458052e-05f, +3.696692020e-04f, +6.770885329e-04f, +8.932168303e-04f, +9.928547411e-04f, +9.698167423e-04f, +8.370019861e-04f, +6.229874085e-04f, +3.659939596e-04f, +1.065721740e-04f, -1.194703409e-04f, -2.865420942e-04f, -3.822318455e-04f, -4.074621699e-04f, -3.741484107e-04f, -3.011639964e-04f, -2.096675045e-04f, -1.188365932e-04f, -4.281170552e-05f, +1.073671011e-05f, +4.042907987e-05f, +4.975291943e-05f, +4.497254386e-05f, +3.298796763e-05f, + /* 2, 0 (48) */ + +2.604271951e-04f, +6.520713960e-04f, +1.184392264e-03f, +1.737066681e-03f, +2.100859845e-03f, +2.003596444e-03f, +1.168352244e-03f, -6.020526720e-04f, -3.329654867e-03f, -6.777842271e-03f, -1.040531144e-02f, -1.337949151e-02f, -1.466132590e-02f, -1.315819186e-02f, -7.924759808e-03f, +1.623190098e-03f, +1.552555605e-02f, +3.316834873e-02f, +5.328028472e-02f, +7.404900985e-02f, +9.334657971e-02f, +1.090303366e-01f, +1.192675993e-01f, +1.228249582e-01f, +1.192675993e-01f, +1.090303366e-01f, +9.334657971e-02f, +7.404900985e-02f, +5.328028472e-02f, +3.316834873e-02f, +1.552555605e-02f, +1.623190098e-03f, -7.924759808e-03f, -1.315819186e-02f, -1.466132590e-02f, -1.337949151e-02f, -1.040531144e-02f, -6.777842271e-03f, -3.329654867e-03f, -6.020526720e-04f, +1.168352244e-03f, +2.003596444e-03f, +2.100859845e-03f, +1.737066681e-03f, +1.184392264e-03f, +6.520713960e-04f, +2.604271951e-04f, +4.414624996e-05f, + +7.781537535e-05f, -5.172646125e-04f, -1.673334699e-03f, -3.203343269e-03f, -4.525223175e-03f, -4.733635501e-03f, -2.892950492e-03f, +1.502882723e-03f, +8.068686861e-03f, +1.529267543e-02f, +2.072324747e-02f, +2.163579289e-02f, +1.603304991e-02f, +3.643522741e-03f, -1.349956937e-02f, -3.123170394e-02f, -4.427068528e-02f, -4.783283965e-02f, -3.933589198e-02f, -1.956599624e-02f, +7.183458326e-03f, +3.415533317e-02f, +5.408068209e-02f, +6.141247912e-02f, +5.408068209e-02f, +3.415533317e-02f, +7.183458326e-03f, -1.956599624e-02f, -3.933589198e-02f, -4.783283965e-02f, -4.427068528e-02f, -3.123170394e-02f, -1.349956937e-02f, +3.643522741e-03f, +1.603304991e-02f, +2.163579289e-02f, +2.072324747e-02f, +1.529267543e-02f, +8.068686861e-03f, +1.502882723e-03f, -2.892950492e-03f, -4.733635501e-03f, -4.525223175e-03f, -3.203343269e-03f, -1.673334699e-03f, -5.172646125e-04f, +7.781537535e-05f, +2.181178524e-04f, + -1.861921294e-05f, -2.935641677e-05f, -3.558150459e-05f, -3.158285468e-05f, -1.222960999e-05f, +2.503188561e-05f, +7.823735817e-05f, +1.396181328e-04f, +1.955291828e-04f, +2.279424392e-04f, +2.175040677e-04f, +1.477345693e-04f, +9.568295641e-06f, -1.948056840e-04f, -4.498423675e-04f, -7.270596416e-04f, -9.882682428e-04f, -1.191284773e-03f, -1.297192640e-03f, -1.277772188e-03f, -1.121562690e-03f, -8.372037069e-04f, -4.532080721e-04f, -1.404008886e-05f, +4.268500357e-04f, +8.157300226e-04f, +1.107344162e-03f, +1.272031343e-03f, +1.299863938e-03f, +1.201110195e-03f, +1.003097751e-03f, +7.442858238e-04f, +4.668757046e-04f, +2.094955744e-04f, +1.357624045e-06f, -1.411433911e-04f, -2.150221760e-04f, -2.287403927e-04f, -1.984454053e-04f, -1.434426938e-04f, -8.194761206e-05f, -2.793995439e-05f, +1.043135282e-05f, +3.086690169e-05f, +3.569114798e-05f, +2.993458524e-05f, +1.932478483e-05f, +8.681311338e-06f, + +1.998192572e-05f, +5.366299909e-05f, +8.706161150e-05f, +9.756320015e-05f, +6.036928359e-05f, -3.840748395e-05f, -1.882964467e-04f, -3.478457341e-04f, -4.509453262e-04f, -4.276011519e-04f, -2.339151312e-04f, +1.199645104e-04f, +5.572247964e-04f, +9.466604647e-04f, +1.140419444e-03f, +1.026779123e-03f, +5.791249940e-04f, -1.192580046e-04f, -8.880415694e-04f, -1.500328102e-03f, -1.755708558e-03f, -1.550547714e-03f, -9.192008225e-04f, -2.934142660e-05f, +8.688298676e-04f, +1.522442131e-03f, +1.756756523e-03f, +1.528432751e-03f, +9.332679948e-04f, +1.675029973e-04f, -5.413682538e-04f, -1.008289421e-03f, -1.143110919e-03f, -9.659588702e-04f, -5.845172747e-04f, -1.459931441e-04f, +2.160313154e-04f, +4.206999836e-04f, +4.538433513e-04f, +3.567067284e-04f, +1.985764530e-04f, +4.655048215e-05f, -5.603767555e-05f, -9.686533432e-05f, -8.865826890e-05f, -5.595251495e-05f, -2.179569405e-05f, +3.782715170e-07f, + /* 2, 1 (48) */ + +2.418079821e-04f, +6.227149792e-04f, +1.148810760e-03f, +1.705483827e-03f, +2.088630235e-03f, +2.028628330e-03f, +1.246589602e-03f, -4.624345392e-04f, -3.134125684e-03f, -6.549899832e-03f, -1.018780737e-02f, -1.323175694e-02f, -1.465175760e-02f, -1.335299754e-02f, -8.374602175e-03f, +8.961304561e-04f, +1.453728781e-02f, +3.197706396e-02f, +5.198309208e-02f, +7.277123767e-02f, +9.222501702e-02f, +1.081931329e-01f, +1.188143913e-01f, +1.228109182e-01f, +1.196944494e-01f, +1.098460666e-01f, +9.445392387e-02f, +7.532104120e-02f, +5.458014866e-02f, +3.436945893e-02f, +1.652865380e-02f, +2.367475921e-03f, -7.457884103e-03f, -1.294869628e-02f, -1.465996827e-02f, -1.352063490e-02f, -1.062033362e-02f, -7.006582663e-03f, -3.528100272e-03f, -7.454953658e-04f, +1.086404632e-03f, +1.975656490e-03f, +2.111291198e-03f, +1.767933583e-03f, +1.220083412e-03f, +6.820059812e-04f, +2.797519799e-04f, +5.282756130e-05f, + +9.779730107e-05f, -4.636016135e-04f, -1.586273087e-03f, -3.105780069e-03f, -4.464853891e-03f, -4.772042985e-03f, -3.081246939e-03f, +1.155036989e-03f, +7.617741535e-03f, +1.486507428e-02f, +2.048933234e-02f, +2.175575740e-02f, +1.659027470e-02f, +4.590183206e-03f, -1.235914992e-02f, -3.020492482e-02f, -4.369156029e-02f, -4.795209765e-02f, -4.022393355e-02f, -2.106632434e-02f, +5.427749768e-03f, +3.260478545e-02f, +5.316148127e-02f, +6.138313770e-02f, +5.494951196e-02f, +3.567777530e-02f, +8.940214849e-03f, -1.803756349e-02f, -3.840262399e-02f, -4.766533665e-02f, -4.481205354e-02f, -3.223999336e-02f, -1.464268029e-02f, +2.677563871e-03f, +1.544853263e-02f, +2.148979975e-02f, +2.093927879e-02f, +1.571337542e-02f, +8.522530212e-03f, +1.859589451e-03f, -2.694374039e-03f, -4.687085019e-03f, -4.581260851e-03f, -3.300208604e-03f, -1.761992968e-03f, -5.732171275e-04f, +5.601968130e-05f, +2.184961239e-04f, + -1.791510520e-05f, -2.876097492e-05f, -3.543175649e-05f, -3.223799159e-05f, -1.395641963e-05f, +2.218803400e-05f, +7.456101461e-05f, +1.357736976e-04f, +1.925216541e-04f, +2.269761809e-04f, +2.197517632e-04f, +1.540548463e-04f, +2.023114846e-05f, -1.803180156e-04f, -4.328989326e-04f, -7.097722906e-04f, -9.732103711e-04f, -1.181076492e-03f, -1.294026224e-03f, -1.282972024e-03f, -1.135274025e-03f, -8.582828770e-04f, -4.793476000e-04f, -4.211344555e-05f, +4.002860127e-04f, +7.938712038e-04f, +1.092623262e-03f, +1.265749200e-03f, +1.302035102e-03f, +1.210544213e-03f, +1.017688552e-03f, +7.614405822e-04f, +4.839904468e-04f, +2.243820990e-04f, +1.254439996e-05f, -1.342803661e-04f, -2.123027569e-04f, -2.293654093e-04f, -2.012655171e-04f, -1.472433373e-04f, -8.568907504e-05f, -3.091105468e-05f, +8.561504587e-06f, +3.008908649e-05f, +3.575925304e-05f, +3.049412176e-05f, +2.003084938e-05f, +9.280428073e-06f, + +1.822048807e-05f, +5.137590333e-05f, +8.537648151e-05f, +9.807124983e-05f, +6.445213413e-05f, -3.047478144e-05f, -1.780628463e-04f, -3.387659360e-04f, -4.475448477e-04f, -4.338187090e-04f, -2.511504331e-04f, +9.428040187e-05f, +5.297516141e-04f, +9.265858312e-04f, +1.136498499e-03f, +1.043926723e-03f, +6.158691211e-04f, -7.130416767e-05f, -8.421951268e-04f, -1.470796584e-03f, -1.752814755e-03f, -1.576943159e-03f, -9.685338654e-04f, -8.799090204e-05f, +8.174770020e-04f, +1.492653966e-03f, +1.755950062e-03f, +1.555070467e-03f, +9.778176877e-04f, +2.159849825e-04f, -5.026339086e-04f, -9.884649509e-04f, -1.144554210e-03f, -9.844462429e-04f, -6.115918602e-04f, -1.723388697e-04f, +1.975100473e-04f, +4.131101015e-04f, +4.562232692e-04f, +3.653305944e-04f, +2.088886799e-04f, +5.489725793e-05f, -5.145637092e-05f, -9.597211052e-05f, -9.015996227e-05f, -5.823979708e-05f, -2.366005660e-05f, -5.623598792e-07f, + /* 2, 2 (48) */ + +2.238928769e-04f, +5.939540043e-04f, +1.113379003e-03f, +1.673245835e-03f, +2.074673816e-03f, +2.050816364e-03f, +1.321150617e-03f, -3.266608416e-04f, -2.941604030e-03f, -6.322923651e-03f, -9.968055609e-03f, -1.307770209e-02f, -1.463152645e-02f, -1.353331556e-02f, -8.807501108e-03f, +1.863581655e-04f, +1.356407744e-02f, +3.079598747e-02f, +5.068906585e-02f, +7.148826564e-02f, +9.108974299e-02f, +1.073348500e-01f, +1.183350437e-01f, +1.227688047e-01f, +1.200947354e-01f, +1.106399378e-01f, +9.554654713e-02f, +7.658679040e-02f, +5.588218376e-02f, +3.558000314e-02f, +1.754634235e-02f, +3.128916504e-03f, -6.973893657e-03f, -1.272431418e-02f, -1.464742387e-02f, -1.365491527e-02f, -1.083263637e-02f, -7.235948073e-03f, -3.729365789e-03f, -8.927387031e-04f, +1.000715557e-03f, +1.944745435e-03f, +2.119852703e-03f, +1.798022669e-03f, +1.255842665e-03f, +7.125001030e-04f, +2.997828293e-04f, +6.210798937e-05f, + +1.160177891e-04f, -4.122257101e-04f, -1.500896606e-03f, -3.007708819e-03f, -4.400401757e-03f, -4.802517767e-03f, -3.259309785e-03f, +8.162710528e-04f, +7.170196687e-03f, +1.443125557e-02f, +2.023818191e-02f, +2.185003780e-02f, +1.712002632e-02f, +5.516769037e-03f, -1.122265142e-02f, -2.916099810e-02f, -4.307569117e-02f, -4.802340182e-02f, -4.106612868e-02f, -2.253712093e-02f, +3.674935013e-03f, +3.102784229e-02f, +5.219294740e-02f, +6.129514680e-02f, +5.576698896e-02f, +3.717042926e-02f, +1.069616491e-02f, -1.648249302e-02f, -3.742480630e-02f, -4.744935167e-02f, -4.531468744e-02f, -3.322845831e-02f, -1.578723449e-02f, +1.693117628e-03f, +1.483694077e-02f, +2.131746088e-02f, +2.113678884e-02f, +1.612648552e-02f, +8.978753482e-03f, +2.224920046e-03f, -2.485485359e-03f, -4.632187761e-03f, -4.632717222e-03f, -3.396180714e-03f, -1.852152930e-03f, -6.314569246e-04f, +3.235962470e-05f, +2.179337640e-04f, + -1.721340283e-05f, -2.814960131e-05f, -3.524334497e-05f, -3.283339796e-05f, -1.561199585e-05f, +1.940949351e-05f, +7.092118880e-05f, +1.319133601e-04f, +1.894276004e-04f, +2.258462928e-04f, +2.217687085e-04f, +1.601053439e-04f, +3.062893417e-05f, -1.660379520e-04f, -4.160537421e-04f, -6.924339611e-04f, -9.579345288e-04f, -1.170494061e-03f, -1.290369966e-03f, -1.287631456e-03f, -1.148473659e-03f, -8.789584049e-04f, -5.052562393e-04f, -7.016634360e-05f, +3.735286588e-04f, +7.716368758e-04f, +1.077405124e-03f, +1.258925789e-03f, +1.303701385e-03f, +1.219578458e-03f, +1.032030359e-03f, +7.785136030e-04f, +5.011779468e-04f, +2.394594669e-04f, +2.398961014e-05f, -1.271447277e-04f, -2.093425983e-04f, -2.298129043e-04f, -2.039846941e-04f, -1.510159515e-04f, -8.945895274e-05f, -3.394390829e-05f, +6.619994119e-06f, +2.924840441e-05f, +3.578439566e-05f, +3.103365204e-05f, +2.073640537e-05f, +9.891302271e-06f, + +1.651293895e-05f, +4.909571189e-05f, +8.360932158e-05f, +9.839518974e-05f, +6.828755564e-05f, -2.275838507e-05f, -1.678894210e-04f, -3.294855733e-04f, -4.436579724e-04f, -4.393586230e-04f, -2.677272441e-04f, +6.896735240e-05f, +5.021346199e-04f, +9.057703350e-04f, +1.131368162e-03f, +1.059726664e-03f, +6.515672104e-04f, -2.369487665e-05f, -7.957857930e-04f, -1.439879816e-03f, -1.748085931e-03f, -1.601603067e-03f, -1.016774333e-03f, -1.465402875e-04f, +7.651994937e-04f, +1.461212903e-03f, +1.753282834e-03f, +1.580202800e-03f, +1.021634421e-03f, +2.646490911e-04f, -4.629585158e-04f, -9.673148316e-04f, -1.144732003e-03f, -1.002088393e-03f, -6.384111173e-04f, -1.989733799e-04f, +1.783634743e-04f, +4.048272910e-04f, +4.580698598e-04f, +3.736989491e-04f, +2.192185398e-04f, +6.344078426e-05f, -4.662483179e-05f, -9.487816622e-05f, -9.156016257e-05f, -6.052002625e-05f, -2.557309600e-05f, -1.562413851e-06f, + /* 2, 3 (48) */ + +2.066794741e-04f, +5.658044030e-04f, +1.078135658e-03f, +1.640412437e-03f, +2.059061820e-03f, +2.070225857e-03f, +1.392071805e-03f, -1.947474815e-04f, -2.752176430e-03f, -6.097077358e-03f, -9.746286900e-03f, -1.291759675e-02f, -1.460089752e-02f, -1.369935351e-02f, -9.223554850e-03f, -5.060757957e-04f, +1.260614291e-02f, +2.962549341e-02f, +4.939869589e-02f, +7.020063419e-02f, +8.994126933e-02f, +1.064558916e-01f, +1.178297874e-01f, +1.226986384e-01f, +1.204682640e-01f, +1.114115747e-01f, +9.662395226e-02f, +7.784571619e-02f, +5.718588514e-02f, +3.679958160e-02f, +1.857837271e-02f, +3.907430107e-03f, -6.472715710e-03f, -1.248485472e-02f, -1.462343426e-02f, -1.378205999e-02f, -1.104197897e-02f, -7.465760977e-03f, -3.933350484e-03f, -1.043754655e-03f, +9.112566040e-04f, +1.910801527e-03f, +2.126472697e-03f, +1.827271074e-03f, +1.291627061e-03f, +7.435337550e-04f, +3.205192346e-04f, +7.199929164e-05f, + +1.325307281e-04f, -3.631299982e-04f, -1.417287284e-03f, -2.909313630e-03f, -4.332114202e-03f, -4.825276152e-03f, -3.427199206e-03f, +4.867854796e-04f, +6.726538715e-03f, +1.399189695e-02f, +1.997045467e-02f, +2.191900516e-02f, +1.762216094e-02f, +6.422539372e-03f, -1.009128326e-02f, -2.810127143e-02f, -4.242412396e-02f, -4.804709670e-02f, -4.186191447e-02f, -2.397700074e-02f, +1.926849082e-03f, +2.942623922e-02f, +5.117617307e-02f, +6.114860651e-02f, +5.653218845e-02f, +3.863164217e-02f, +1.244944774e-02f, -1.490229022e-02f, -3.640317188e-02f, -4.718470258e-02f, -4.577764596e-02f, -3.419577315e-02f, -1.693196650e-02f, +6.910292352e-04f, +1.419852965e-02f, +2.111848750e-02f, +2.131515231e-02f, +1.653131281e-02f, +9.436823341e-03f, +2.598618995e-03f, -2.266266820e-03f, -4.568746977e-03f, -4.679342053e-03f, -3.491058880e-03f, -1.943713093e-03f, -6.919769508e-04f, +6.786528698e-06f, +2.163713502e-04f, + -1.651501641e-05f, -2.752361942e-05f, -3.501771719e-05f, -3.337019667e-05f, -1.719662164e-05f, +1.669726717e-05f, +6.732039382e-05f, +1.280410192e-04f, +1.862517758e-04f, +2.245574884e-04f, +2.235584601e-04f, +1.658873573e-04f, +4.075986188e-05f, -1.519706699e-04f, -3.993149794e-04f, -6.750547716e-04f, -9.424511507e-04f, -1.159546352e-03f, -1.286229402e-03f, -1.291751402e-03f, -1.161157397e-03f, -8.992214192e-04f, -5.309217592e-04f, -9.818515874e-05f, +3.465907549e-04f, +7.490369039e-04f, +1.061695187e-03f, +1.251561458e-03f, +1.304858312e-03f, +1.228204740e-03f, +1.046112950e-03f, +7.954945209e-04f, +5.184294122e-04f, +2.547216865e-04f, +3.569062057e-05f, -1.197358921e-04f, -2.061386118e-04f, -2.300783449e-04f, -2.065980965e-04f, -1.547563581e-04f, -9.325435845e-05f, -3.703714383e-05f, +4.606824229e-06f, +2.834389434e-05f, +3.576516312e-05f, +3.155178736e-05f, +2.144042228e-05f, +1.051340821e-05f, + +1.486066013e-05f, +4.682673567e-05f, +8.176651482e-05f, +9.854087592e-05f, +7.187725374e-05f, -1.526379959e-05f, -1.577895109e-04f, -3.200227729e-04f, -4.393011265e-04f, -4.442277028e-04f, -2.836366688e-04f, +4.405097132e-05f, +4.744103624e-04f, +8.842498455e-04f, +1.125049832e-03f, +1.074175161e-03f, +6.861874516e-04f, +2.351731614e-05f, -7.488710269e-04f, -1.407620910e-03f, -1.741535112e-03f, -1.624504230e-03f, -1.063868971e-03f, -2.049230008e-04f, +7.120558050e-04f, +1.428150722e-03f, +1.748750765e-03f, +1.603792974e-03f, +1.064662533e-03f, +3.134398161e-04f, -4.223801457e-04f, -9.448499737e-04f, -1.143628431e-03f, -1.018851802e-03f, -6.649374122e-04f, -2.258675223e-04f, +1.586048292e-04f, +3.958482481e-04f, +4.593683694e-04f, +3.817933795e-04f, +2.295510580e-04f, +7.217352485e-05f, -4.154293279e-05f, -9.357833311e-05f, -9.285231470e-05f, -6.278822237e-05f, -2.753271206e-05f, -2.622325768e-06f, + /* 2, 4 (48) */ + +1.901644577e-04f, +5.382807835e-04f, +1.043117941e-03f, +1.607042240e-03f, +2.041865198e-03f, +2.086923125e-03f, +1.459392199e-03f, -6.670646231e-05f, -2.565924654e-03f, -5.872519870e-03f, -9.522728440e-03f, -1.275170939e-02f, -1.456013766e-02f, -1.385132418e-02f, -9.622869830e-03f, -1.181130567e-03f, +1.166369176e-02f, +2.846594706e-02f, +4.811246649e-02f, +6.890888278e-02f, +8.878011194e-02f, +1.055566702e-01f, +1.172988657e-01f, +1.226004532e-01f, +1.208148548e-01f, +1.121606116e-01f, +9.768564744e-02f, +7.909727764e-02f, +5.849074345e-02f, +3.802778634e-02f, +1.962448566e-02f, +4.702924628e-03f, -5.954286298e-03f, -1.223013303e-02f, -1.458774364e-02f, -1.390179589e-02f, -1.124811758e-02f, -7.695839322e-03f, -4.139948580e-03f, -1.198511013e-03f, +8.180022455e-04f, +1.873764383e-03f, +2.131079521e-03f, +1.855614968e-03f, +1.327392224e-03f, +7.750855424e-04f, +3.419596569e-04f, +8.251269985e-05f, + +1.473913882e-04f, -3.163032626e-04f, -1.335520770e-03f, -2.810772754e-03f, -4.260236948e-03f, -4.840539951e-03f, -3.584988717e-03f, +1.667627067e-04f, +6.287237588e-03f, +1.354766925e-02f, +1.968681800e-02f, +2.196305613e-02f, +1.809657130e-02f, +7.306789218e-03f, -8.966233429e-03f, -2.702709627e-02f, -4.173793651e-02f, -4.802357938e-02f, -4.261078550e-02f, -2.538462165e-02f, +1.853139707e-04f, +2.780173499e-02f, +5.011230410e-02f, +6.094368351e-02f, +5.724424426e-02f, +4.005979289e-02f, +1.419819851e-02f, -1.329849725e-02f, -3.533850934e-02f, -4.687126276e-02f, -4.620002611e-02f, -3.514062312e-02f, -1.807559493e-02f, -3.278225666e-04f, +1.353359224e-02f, +2.089261998e-02f, +2.147375714e-02f, +1.692716106e-02f, +9.896191711e-03f, +2.980412374e-03f, -2.036715762e-03f, -4.496573452e-03f, -4.720884986e-03f, -3.584637213e-03f, -2.036565407e-03f, -7.547651732e-04f, -2.074618336e-05f, +2.137490244e-04f, + -1.582082546e-05f, -2.688433347e-05f, -3.475632442e-05f, -3.384954591e-05f, -1.871064704e-05f, +1.405226805e-05f, +6.376104794e-05f, +1.241604985e-04f, +1.829989042e-04f, +2.231145150e-04f, +2.251246810e-04f, +1.714023512e-04f, +5.062234878e-05f, -1.381211376e-04f, -3.826906643e-04f, -6.576447625e-04f, -9.267707057e-04f, -1.148242387e-03f, -1.281610320e-03f, -1.295333093e-03f, -1.173321362e-03f, -9.190633106e-04f, -5.563320867e-04f, -1.261562889e-04f, +3.194851996e-04f, +7.260813874e-04f, +1.045499198e-03f, +1.243656875e-03f, +1.305501685e-03f, +1.236415057e-03f, +1.059926174e-03f, +8.123729255e-04f, +5.357359097e-04f, +2.701625673e-04f, +4.764458457e-05f, -1.120534605e-04f, -2.026878366e-04f, -2.301572546e-04f, -2.091008723e-04f, -1.584603151e-04f, -9.707231393e-05f, -4.018929612e-05f, +2.522073369e-06f, +2.737464070e-05f, +3.570015596e-05f, +3.204712588e-05f, +2.214184094e-05f, +1.114618787e-05f, + +1.326486022e-05f, +4.457310904e-05f, +7.985437440e-05f, +9.851429947e-05f, +7.522329867e-05f, -7.996027043e-06f, -1.477760152e-04f, -3.103955235e-04f, -4.344910750e-04f, -4.484335740e-04f, -2.988708887e-04f, +1.955592078e-05f, +4.466149993e-04f, +8.620606813e-04f, +1.117566187e-03f, +1.087270186e-03f, +7.196996783e-04f, +7.028076002e-05f, -7.015085432e-04f, -1.374064408e-03f, -1.733177506e-03f, -1.645625650e-03f, -1.109765997e-03f, -2.630726757e-04f, +6.581055171e-04f, +1.393501261e-03f, +1.742352059e-03f, +1.625805940e-03f, +1.106847003e-03f, +3.623010820e-04f, -3.809383425e-04f, -9.210830791e-04f, -1.141229105e-03f, -1.034703675e-03f, -6.911329643e-04f, -2.529913283e-04f, +1.382484285e-04f, +3.861705995e-04f, +4.601045415e-04f, +3.895954709e-04f, +2.398708882e-04f, +8.108743468e-05f, -3.621097189e-05f, -9.206765198e-05f, -9.402984937e-05f, -6.503924966e-05f, -2.953662015e-05f, -3.742405081e-06f, + /* 2, 5 (48) */ + +1.743436322e-04f, +5.113964501e-04f, +1.008361617e-03f, +1.573192694e-03f, +2.023154551e-03f, +2.100975393e-03f, +1.523153247e-03f, +5.745403624e-05f, -2.382925750e-03f, -5.649405355e-03f, -9.297603759e-03f, -1.258030704e-02f, -1.450951531e-02f, -1.398944532e-02f, -1.000556049e-02f, -1.838775330e-03f, +1.073692105e-02f, +2.731770467e-02f, +4.683085617e-02f, +6.761354969e-02f, +8.760679058e-02f, +1.046376069e-01f, +1.167425336e-01f, +1.224742969e-01f, +1.211343400e-01f, +1.128866930e-01f, +9.873114664e-02f, +8.034093452e-02f, +5.979624514e-02f, +3.926420140e-02f, +2.068441184e-02f, +5.515297553e-03f, -5.418550388e-03f, -1.195997046e-02f, -1.454009906e-02f, -1.401384935e-02f, -1.145080542e-02f, -7.925996577e-03f, -4.349049452e-03f, -1.356971328e-03f, +7.209299316e-04f, +1.833575087e-03f, +2.133601595e-03f, +1.882989609e-03f, +1.363092380e-03f, +8.071326683e-04f, +3.641014979e-04f, +9.365888772e-05f, + +1.606562484e-04f, -2.717301535e-04f, -1.255666395e-03f, -2.712258454e-03f, -4.185013649e-03f, -4.848535978e-03f, -3.732764732e-03f, -1.436328168e-04f, +5.852746513e-03f, +1.309923567e-02f, +1.938794711e-02f, +2.198261205e-02f, +1.854318630e-02f, +8.168849899e-03f, -7.848667242e-03f, -2.593982609e-02f, -4.101823683e-02f, -4.795329862e-02f, -4.331229404e-02f, -2.675868606e-02f, -1.547863536e-03f, +2.615610935e-02f, +4.900253810e-02f, +6.068061083e-02f, +5.790234977e-02f, +4.145329415e-02f, +1.594055057e-02f, -1.167269131e-02f, -3.423166234e-02f, -4.650896168e-02f, -4.658096445e-02f, -3.606170620e-02f, -1.921682403e-02f, -1.362526242e-03f, +1.284245928e-02f, +2.063962865e-02f, +2.161200557e-02f, +1.731333166e-02f, +1.035629625e-02f, +3.370007845e-03f, -1.796844873e-03f, -4.415486017e-03f, -4.757095958e-03f, -3.676704865e-03f, -2.130595257e-03f, -8.198044229e-04f, -5.028280352e-05f, +2.100066193e-04f, + -1.513167810e-05f, -2.623302729e-05f, -3.446062022e-05f, -3.427263710e-05f, -2.015448731e-05f, +1.147532021e-05f, +6.024547421e-05f, +1.202755443e-04f, +1.796736753e-04f, +2.215221496e-04f, +2.264711354e-04f, +1.766519567e-04f, +6.021501885e-05f, -1.244941147e-04f, -3.661886494e-04f, -6.402138901e-04f, -9.109036901e-04f, -1.136591335e-03f, -1.276518757e-03f, -1.298378071e-03f, -1.184961996e-03f, -9.384757372e-04f, -5.814753136e-04f, -1.540661632e-04f, +2.922250001e-04f, +7.027806537e-04f, +1.028823208e-03f, +1.235213029e-03f, +1.305627587e-03f, +1.244201599e-03f, +1.073459961e-03f, +8.291383686e-04f, +5.530883705e-04f, +2.857757222e-04f, +5.984844242e-05f, -1.040972218e-04f, -1.989874440e-04f, -2.300452179e-04f, -2.114881615e-04f, -1.621235190e-04f, -1.009097504e-04f, -4.339880561e-05f, +3.658972101e-07f, +2.633977555e-05f, +3.558798994e-05f, +3.251825399e-05f, +2.283957411e-05f, +1.178905081e-05f, + +1.172657779e-05f, +4.233878694e-05f, +7.787913356e-05f, +9.832157191e-05f, +7.832811222e-05f, -9.595703742e-07f, -1.378613810e-04f, -3.006216502e-04f, -4.292448886e-04f, -4.519846527e-04f, -3.134231564e-04f, -4.494105415e-06f, +4.187842527e-04f, +8.392395538e-04f, +1.108941136e-03f, +1.099011452e-03f, +7.520753944e-04f, +1.165447678e-04f, -6.537562347e-04f, -1.339256215e-03f, -1.723030478e-03f, -1.664948562e-03f, -1.154415171e-03f, -3.209232485e-04f, +6.034092543e-04f, +1.357300375e-03f, +1.734087204e-03f, +1.646208432e-03f, +1.148133531e-03f, +4.111763155e-04f, -3.386740834e-04f, -8.960286417e-04f, -1.137521149e-03f, -1.049611999e-03f, -7.169598973e-04f, -2.803140446e-04f, +1.173096685e-04f, +3.757929232e-04f, +4.602646486e-04f, +3.970868359e-04f, +2.501623294e-04f, +9.017396144e-05f, -3.062968081e-05f, -9.034138753e-05f, -9.508619534e-05f, -6.726782211e-05f, -3.158234997e-05f, -4.922830113e-06f, + /* 2, 6 (48) */ + +1.592119541e-04f, +4.851634228e-04f, +9.739009964e-04f, +1.538920057e-03f, +2.003000064e-03f, +2.112450713e-03f, +1.583398721e-03f, +1.777295806e-04f, -2.203252074e-03f, -5.427883205e-03f, -9.071132624e-03f, -1.240365508e-02f, -1.444930029e-02f, -1.411393943e-02f, -1.037174914e-02f, -2.478989220e-03f, +9.826017361e-03f, +2.618111333e-02f, +4.555433741e-02f, +6.631517162e-02f, +8.642182858e-02f, +1.036991311e-01f, +1.161610583e-01f, +1.223202308e-01f, +1.214265650e-01f, +1.135894736e-01f, +9.975996985e-02f, +8.157614755e-02f, +6.110187273e-02f, +4.050840299e-02f, +2.175787180e-02f, +6.344435922e-03f, -4.865462017e-03f, -1.167419474e-02f, -1.448025062e-02f, -1.411794657e-02f, -1.164979286e-02f, -8.156041794e-03f, -4.560537614e-03f, -1.519094847e-03f, +6.200201812e-04f, +1.790176281e-03f, +2.133967492e-03f, +1.909329384e-03f, +1.398680370e-03f, +8.396509222e-04f, +3.869410720e-04f, +1.054479385e-04f, + +1.723828262e-04f, -2.293913666e-04f, -1.177787262e-03f, -2.613936882e-03f, -4.106685537e-03f, -4.849495549e-03f, -3.870626113e-03f, -4.442544670e-04f, +5.423501625e-03f, +1.264725102e-02f, +1.907452395e-02f, +2.197811794e-02f, +1.896197055e-02f, +9.008089453e-03f, -6.739726106e-03f, -2.484081463e-02f, -4.026616143e-02f, -4.783675385e-02f, -4.396605027e-02f, -2.809794228e-02f, -3.270894013e-03f, +2.449116078e-02f, +4.784812293e-02f, +6.035968758e-02f, +5.850575903e-02f, +4.281059452e-02f, +1.767463777e-02f, -1.002648288e-02f, -3.308352881e-02f, -4.609778536e-02f, -4.691963853e-02f, -3.695773484e-02f, -2.035434518e-02f, -2.412138240e-03f, +1.212549938e-02f, +2.035931460e-02f, +2.172931524e-02f, +1.768912458e-02f, +1.081656090e-02f, +3.767094681e-03f, -1.546682544e-03f, -4.325312056e-03f, -4.787725639e-03f, -3.767046253e-03f, -2.225681452e-03f, -8.870722450e-04f, -8.186515349e-05f, +2.050837892e-04f, + -1.444839081e-05f, -2.557096333e-05f, -3.413205882e-05f, -3.464069281e-05f, -2.152862109e-05f, +8.967159811e-06f, +5.677590025e-05f, +1.163898236e-04f, +1.762807416e-04f, +2.197851945e-04f, +2.276016850e-04f, +1.816379677e-04f, +6.953670123e-05f, -1.110941500e-04f, -3.498166160e-04f, -6.227720201e-04f, -8.948606193e-04f, -1.124602503e-03f, -1.270960990e-03f, -1.300888184e-03f, -1.196076058e-03f, -9.574506285e-04f, -6.063397045e-04f, -1.819012505e-04f, +2.648232645e-04f, +6.791452514e-04f, +1.011673564e-03f, +1.226231231e-03f, +1.305232385e-03f, +1.251556758e-03f, +1.086704325e-03f, +8.457803707e-04f, +5.704775955e-04f, +3.015545704e-04f, +7.229892102e-05f, -9.586715591e-05f, -1.950347411e-04f, -2.297378848e-04f, -2.137551001e-04f, -1.657416077e-04f, -1.047635095e-04f, -4.666401798e-05f, -1.861469822e-06f, +2.523848061e-05f, +3.542729791e-05f, +3.296374774e-05f, +2.353250716e-05f, +1.244137414e-05f, + +1.024668483e-05f, +4.012754261e-05f, +7.584693604e-05f, +9.796891076e-05f, +8.119445455e-05f, +5.841562069e-06f, -1.280575934e-04f, -2.907187900e-04f, -4.235799126e-04f, -4.548901188e-04f, -3.272877877e-04f, -2.807640121e-05f, +3.909533641e-04f, +8.158235121e-04f, +1.099199776e-03f, +1.109400401e-03f, +7.832877974e-04f, +1.622596761e-04f, -6.056720947e-04f, -1.303243534e-03f, -1.711113513e-03f, -1.682456455e-03f, -1.197767855e-03f, -3.784090436e-04f, +5.480286059e-04f, +1.319585894e-03f, +1.723958986e-03f, +1.664969016e-03f, +1.188468608e-03f, +4.600085176e-04f, -2.956297347e-04f, -8.697029437e-04f, -1.132493239e-03f, -1.063545591e-03f, -7.423802916e-04f, -3.078041660e-04f, +9.580501968e-05f, +3.647147665e-04f, +4.598355234e-04f, +4.042491442e-04f, +2.604093438e-04f, +9.942404785e-05f, -2.480023478e-05f, -8.839504320e-05f, -9.601479198e-05f, -6.946850955e-05f, -3.366724465e-05f, -6.163642991e-06f, + /* 2, 7 (48) */ + +1.447635633e-04f, +4.595924595e-04f, +9.397689376e-04f, +1.504279365e-03f, +1.981471443e-03f, +2.121417873e-03f, +1.640174622e-03f, +2.941194042e-04f, -2.026971333e-03f, -5.208098011e-03f, -8.843530939e-03f, -1.222201712e-02f, -1.437976359e-02f, -1.422503358e-02f, -1.072156576e-02f, -3.101761240e-03f, +8.931156742e-03f, +2.505651083e-02f, +4.428337642e-02f, +6.501428343e-02f, +8.522575252e-02f, +1.027416805e-01f, +1.155547185e-01f, +1.221383295e-01f, +1.216913882e-01f, +1.142686189e-01f, +1.007716434e-01f, +8.280237878e-02f, +6.240710511e-02f, +4.175995975e-02f, +2.284457612e-02f, +7.190216292e-03f, -4.294984422e-03f, -1.137264017e-02f, -1.440795170e-02f, -1.421381372e-02f, -1.184482760e-02f, -8.385779679e-03f, -4.774292714e-03f, -1.684836455e-03f, +5.152566717e-04f, +1.743512263e-03f, +2.132106022e-03f, +1.934567865e-03f, +1.434107668e-03f, +8.726146700e-04f, +4.104735791e-04f, +1.178893127e-04f, + +1.826295111e-04f, -1.892638240e-04f, -1.101940326e-03f, -2.515967971e-03f, -4.025491083e-03f, -4.843653987e-03f, -3.998683707e-03f, -7.349732570e-04f, +4.999921712e-03f, +1.219236090e-02f, +1.874723616e-02f, +2.195004154e-02f, +1.935292392e-02f, +9.823912965e-03f, -5.640526330e-03f, -2.373141423e-02f, -3.948287364e-02f, -4.767449418e-02f, -4.457172237e-02f, -2.940118581e-02f, -4.982007526e-03f, +2.280870433e-02f, +4.665035507e-02f, +5.998127854e-02f, +5.905378763e-02f, +4.413018042e-02f, +1.939859676e-02f, -8.361513860e-03f, -3.189506020e-02f, -4.563777685e-02f, -4.721526827e-02f, -3.782743778e-02f, -2.148683842e-02f, -3.475683831e-03f, +1.138311909e-02f, +2.005151044e-02f, +2.182512026e-02f, +1.805383935e-02f, +1.127639642e-02f, +4.171343825e-03f, -1.286273200e-03f, -4.225888008e-03f, -4.812525874e-03f, -3.855441296e-03f, -2.321696244e-03f, -9.565407545e-04f, -1.155323981e-04f, +1.989201462e-04f, + -1.377174813e-05f, -2.489938159e-05f, -3.377209336e-05f, -3.495496479e-05f, -2.283358851e-05f, +6.528436185e-06f, +5.335445802e-05f, +1.125069226e-04f, +1.728247150e-04f, +2.179084727e-04f, +2.285202841e-04f, +1.863623376e-04f, +7.858642862e-05f, -9.792558119e-05f, -3.335820703e-04f, -6.053289213e-04f, -8.786520212e-04f, -1.112285330e-03f, -1.264943534e-03f, -1.302865587e-03f, -1.206660630e-03f, -9.759801910e-04f, -6.309137040e-04f, -2.096480687e-04f, +2.372931928e-04f, +6.551859441e-04f, +9.940569119e-04f, +1.216713113e-03f, +1.304312736e-03f, +1.258473133e-03f, +1.099649378e-03f, +8.622884283e-04f, +5.878942605e-04f, +3.174923399e-04f, +8.499253389e-05f, -8.736343546e-05f, -1.908271752e-04f, -2.292309753e-04f, -2.158968239e-04f, -1.693101634e-04f, -1.086303448e-04f, -4.998318375e-05f, -4.159713064e-06f, +2.406998925e-05f, +3.521673185e-05f, +3.338217428e-05f, +2.421949874e-05f, +1.310250252e-05f, + +8.825890435e-06f, +3.794296559e-05f, +7.376382695e-05f, +9.746262523e-05f, +8.382541052e-05f, +1.240385132e-05f, -1.183761664e-04f, -2.807043682e-04f, -4.175137344e-04f, -4.571598891e-04f, -3.404601524e-04f, -5.116926590e-05f, +3.631570519e-04f, +7.918498873e-04f, +1.088368341e-03f, +1.118440182e-03f, +8.133118003e-04f, +2.073769032e-04f, -5.573141404e-04f, -1.266074797e-03f, -1.697448191e-03f, -1.698135084e-03f, -1.239777076e-03f, -4.354648582e-04f, +4.920260470e-04f, +1.280397580e-03f, +1.711972486e-03f, +1.682058143e-03f, +1.227799595e-03f, +5.087403362e-04f, -2.518490062e-04f, -8.421240501e-04f, -1.126135628e-03f, -1.076474157e-03f, -7.673562372e-04f, -3.354294698e-04f, +7.375202007e-05f, +3.529366637e-04f, +4.588045889e-04f, +4.110641523e-04f, +2.705955750e-04f, +1.088281350e-04f, -1.872426182e-05f, -8.622437589e-05f, -9.680910213e-05f, -7.163574407e-05f, -3.578846024e-05f, -7.464744720e-06f, + /* 2, 8 (48) */ + +1.309918152e-04f, +4.346930779e-04f, +9.059968443e-04f, +1.469324400e-03f, +1.958637854e-03f, +2.127946309e-03f, +1.693529080e-03f, +4.066263268e-04f, -1.854146618e-03f, -4.990189538e-03f, -8.615010654e-03f, -1.203565478e-02f, -1.430117716e-02f, -1.432295916e-02f, -1.105514783e-02f, -3.707090161e-03f, +8.052504721e-03f, +2.394422550e-02f, +4.301843289e-02f, +6.371141785e-02f, +8.401909189e-02f, +1.017657003e-01f, +1.149238048e-01f, +1.219286814e-01f, +1.219286814e-01f, +1.149238048e-01f, +1.017657003e-01f, +8.401909189e-02f, +6.371141785e-02f, +4.301843289e-02f, +2.394422550e-02f, +8.052504721e-03f, -3.707090161e-03f, -1.105514783e-02f, -1.432295916e-02f, -1.430117716e-02f, -1.203565478e-02f, -8.615010654e-03f, -4.990189538e-03f, -1.854146618e-03f, +4.066263268e-04f, +1.693529080e-03f, +2.127946309e-03f, +1.958637854e-03f, +1.469324400e-03f, +9.059968443e-04f, +4.346930779e-04f, +1.309918152e-04f, + +1.914554015e-04f, -1.513208584e-04f, -1.028176499e-03f, -2.418505346e-03f, -3.941665672e-03f, -4.831250135e-03f, -4.117059873e-03f, -1.015677625e-03f, +4.582407978e-03f, +1.173520101e-02f, +1.840677601e-02f, +2.189887228e-02f, +1.971608097e-02f, +1.061576285e-02f, -4.552157989e-03f, -2.261297405e-02f, -3.866956183e-02f, -4.746711727e-02f, -4.512903651e-02f, -3.066726061e-02f, -6.679455717e-03f, +2.111056924e-02f, +4.541057800e-02f, +5.954581368e-02f, +5.954581368e-02f, +4.541057800e-02f, +2.111056924e-02f, -6.679455717e-03f, -3.066726061e-02f, -4.512903651e-02f, -4.746711727e-02f, -3.866956183e-02f, -2.261297405e-02f, -4.552157989e-03f, +1.061576285e-02f, +1.971608097e-02f, +2.189887228e-02f, +1.840677601e-02f, +1.173520101e-02f, +4.582407978e-03f, -1.015677625e-03f, -4.117059873e-03f, -4.831250135e-03f, -3.941665672e-03f, -2.418505346e-03f, -1.028176499e-03f, -1.513208584e-04f, +1.914554015e-04f, + -1.310250252e-05f, -2.421949874e-05f, -3.338217428e-05f, -3.521673185e-05f, -2.406998925e-05f, +4.159713064e-06f, +4.998318375e-05f, +1.086303448e-04f, +1.693101634e-04f, +2.158968239e-04f, +2.292309753e-04f, +1.908271752e-04f, +8.736343546e-05f, -8.499253389e-05f, -3.174923399e-04f, -5.878942605e-04f, -8.622884283e-04f, -1.099649378e-03f, -1.258473133e-03f, -1.304312736e-03f, -1.216713113e-03f, -9.940569119e-04f, -6.551859441e-04f, -2.372931928e-04f, +2.096480687e-04f, +6.309137040e-04f, +9.759801910e-04f, +1.206660630e-03f, +1.302865587e-03f, +1.264943534e-03f, +1.112285330e-03f, +8.786520212e-04f, +6.053289213e-04f, +3.335820703e-04f, +9.792558119e-05f, -7.858642862e-05f, -1.863623376e-04f, -2.285202841e-04f, -2.179084727e-04f, -1.728247150e-04f, -1.125069226e-04f, -5.335445802e-05f, -6.528436185e-06f, +2.283358851e-05f, +3.495496479e-05f, +3.377209336e-05f, +2.489938159e-05f, +1.377174813e-05f, + +7.464744720e-06f, +3.578846024e-05f, +7.163574407e-05f, +9.680910213e-05f, +8.622437589e-05f, +1.872426182e-05f, -1.088281350e-04f, -2.705955750e-04f, -4.110641523e-04f, -4.588045889e-04f, -3.529366637e-04f, -7.375202007e-05f, +3.354294698e-04f, +7.673562372e-04f, +1.076474157e-03f, +1.126135628e-03f, +8.421240501e-04f, +2.518490062e-04f, -5.087403362e-04f, -1.227799595e-03f, -1.682058143e-03f, -1.711972486e-03f, -1.280397580e-03f, -4.920260470e-04f, +4.354648582e-04f, +1.239777076e-03f, +1.698135084e-03f, +1.697448191e-03f, +1.266074797e-03f, +5.573141404e-04f, -2.073769032e-04f, -8.133118003e-04f, -1.118440182e-03f, -1.088368341e-03f, -7.918498873e-04f, -3.631570519e-04f, +5.116926590e-05f, +3.404601524e-04f, +4.571598891e-04f, +4.175137344e-04f, +2.807043682e-04f, +1.183761664e-04f, -1.240385132e-05f, -8.382541052e-05f, -9.746262523e-05f, -7.376382695e-05f, -3.794296559e-05f, -8.825890435e-06f, + /* 2, 9 (48) */ + +1.178893127e-04f, +4.104735791e-04f, +8.726146700e-04f, +1.434107668e-03f, +1.934567865e-03f, +2.132106022e-03f, +1.743512263e-03f, +5.152566717e-04f, -1.684836455e-03f, -4.774292714e-03f, -8.385779679e-03f, -1.184482760e-02f, -1.421381372e-02f, -1.440795170e-02f, -1.137264017e-02f, -4.294984422e-03f, +7.190216292e-03f, +2.284457612e-02f, +4.175995975e-02f, +6.240710511e-02f, +8.280237878e-02f, +1.007716434e-01f, +1.142686189e-01f, +1.216913882e-01f, +1.221383295e-01f, +1.155547185e-01f, +1.027416805e-01f, +8.522575252e-02f, +6.501428343e-02f, +4.428337642e-02f, +2.505651083e-02f, +8.931156742e-03f, -3.101761240e-03f, -1.072156576e-02f, -1.422503358e-02f, -1.437976359e-02f, -1.222201712e-02f, -8.843530939e-03f, -5.208098011e-03f, -2.026971333e-03f, +2.941194042e-04f, +1.640174622e-03f, +2.121417873e-03f, +1.981471443e-03f, +1.504279365e-03f, +9.397689376e-04f, +4.595924595e-04f, +1.447635633e-04f, + +1.989201462e-04f, -1.155323981e-04f, -9.565407545e-04f, -2.321696244e-03f, -3.855441296e-03f, -4.812525874e-03f, -4.225888008e-03f, -1.286273200e-03f, +4.171343825e-03f, +1.127639642e-02f, +1.805383935e-02f, +2.182512026e-02f, +2.005151044e-02f, +1.138311909e-02f, -3.475683831e-03f, -2.148683842e-02f, -3.782743778e-02f, -4.721526827e-02f, -4.563777685e-02f, -3.189506020e-02f, -8.361513860e-03f, +1.939859676e-02f, +4.413018042e-02f, +5.905378763e-02f, +5.998127854e-02f, +4.665035507e-02f, +2.280870433e-02f, -4.982007526e-03f, -2.940118581e-02f, -4.457172237e-02f, -4.767449418e-02f, -3.948287364e-02f, -2.373141423e-02f, -5.640526330e-03f, +9.823912965e-03f, +1.935292392e-02f, +2.195004154e-02f, +1.874723616e-02f, +1.219236090e-02f, +4.999921712e-03f, -7.349732570e-04f, -3.998683707e-03f, -4.843653987e-03f, -4.025491083e-03f, -2.515967971e-03f, -1.101940326e-03f, -1.892638240e-04f, +1.826295111e-04f, + -1.244137414e-05f, -2.353250716e-05f, -3.296374774e-05f, -3.542729791e-05f, -2.523848061e-05f, +1.861469822e-06f, +4.666401798e-05f, +1.047635095e-04f, +1.657416077e-04f, +2.137551001e-04f, +2.297378848e-04f, +1.950347411e-04f, +9.586715591e-05f, -7.229892102e-05f, -3.015545704e-04f, -5.704775955e-04f, -8.457803707e-04f, -1.086704325e-03f, -1.251556758e-03f, -1.305232385e-03f, -1.226231231e-03f, -1.011673564e-03f, -6.791452514e-04f, -2.648232645e-04f, +1.819012505e-04f, +6.063397045e-04f, +9.574506285e-04f, +1.196076058e-03f, +1.300888184e-03f, +1.270960990e-03f, +1.124602503e-03f, +8.948606193e-04f, +6.227720201e-04f, +3.498166160e-04f, +1.110941500e-04f, -6.953670123e-05f, -1.816379677e-04f, -2.276016850e-04f, -2.197851945e-04f, -1.762807416e-04f, -1.163898236e-04f, -5.677590025e-05f, -8.967159811e-06f, +2.152862109e-05f, +3.464069281e-05f, +3.413205882e-05f, +2.557096333e-05f, +1.444839081e-05f, + +6.163642991e-06f, +3.366724465e-05f, +6.946850955e-05f, +9.601479198e-05f, +8.839504320e-05f, +2.480023478e-05f, -9.942404785e-05f, -2.604093438e-04f, -4.042491442e-04f, -4.598355234e-04f, -3.647147665e-04f, -9.580501968e-05f, +3.078041660e-04f, +7.423802916e-04f, +1.063545591e-03f, +1.132493239e-03f, +8.697029437e-04f, +2.956297347e-04f, -4.600085176e-04f, -1.188468608e-03f, -1.664969016e-03f, -1.723958986e-03f, -1.319585894e-03f, -5.480286059e-04f, +3.784090436e-04f, +1.197767855e-03f, +1.682456455e-03f, +1.711113513e-03f, +1.303243534e-03f, +6.056720947e-04f, -1.622596761e-04f, -7.832877974e-04f, -1.109400401e-03f, -1.099199776e-03f, -8.158235121e-04f, -3.909533641e-04f, +2.807640121e-05f, +3.272877877e-04f, +4.548901188e-04f, +4.235799126e-04f, +2.907187900e-04f, +1.280575934e-04f, -5.841562069e-06f, -8.119445455e-05f, -9.796891076e-05f, -7.584693604e-05f, -4.012754261e-05f, -1.024668483e-05f, + /* 2,10 (48) */ + +1.054479385e-04f, +3.869410720e-04f, +8.396509222e-04f, +1.398680370e-03f, +1.909329384e-03f, +2.133967492e-03f, +1.790176281e-03f, +6.200201812e-04f, -1.519094847e-03f, -4.560537614e-03f, -8.156041794e-03f, -1.164979286e-02f, -1.411794657e-02f, -1.448025062e-02f, -1.167419474e-02f, -4.865462017e-03f, +6.344435922e-03f, +2.175787180e-02f, +4.050840299e-02f, +6.110187273e-02f, +8.157614755e-02f, +9.975996985e-02f, +1.135894736e-01f, +1.214265650e-01f, +1.223202308e-01f, +1.161610583e-01f, +1.036991311e-01f, +8.642182858e-02f, +6.631517162e-02f, +4.555433741e-02f, +2.618111333e-02f, +9.826017361e-03f, -2.478989220e-03f, -1.037174914e-02f, -1.411393943e-02f, -1.444930029e-02f, -1.240365508e-02f, -9.071132624e-03f, -5.427883205e-03f, -2.203252074e-03f, +1.777295806e-04f, +1.583398721e-03f, +2.112450713e-03f, +2.003000064e-03f, +1.538920057e-03f, +9.739009964e-04f, +4.851634228e-04f, +1.592119541e-04f, + +2.050837892e-04f, -8.186515349e-05f, -8.870722450e-04f, -2.225681452e-03f, -3.767046253e-03f, -4.787725639e-03f, -4.325312056e-03f, -1.546682544e-03f, +3.767094681e-03f, +1.081656090e-02f, +1.768912458e-02f, +2.172931524e-02f, +2.035931460e-02f, +1.212549938e-02f, -2.412138240e-03f, -2.035434518e-02f, -3.695773484e-02f, -4.691963853e-02f, -4.609778536e-02f, -3.308352881e-02f, -1.002648288e-02f, +1.767463777e-02f, +4.281059452e-02f, +5.850575903e-02f, +6.035968758e-02f, +4.784812293e-02f, +2.449116078e-02f, -3.270894013e-03f, -2.809794228e-02f, -4.396605027e-02f, -4.783675385e-02f, -4.026616143e-02f, -2.484081463e-02f, -6.739726106e-03f, +9.008089453e-03f, +1.896197055e-02f, +2.197811794e-02f, +1.907452395e-02f, +1.264725102e-02f, +5.423501625e-03f, -4.442544670e-04f, -3.870626113e-03f, -4.849495549e-03f, -4.106685537e-03f, -2.613936882e-03f, -1.177787262e-03f, -2.293913666e-04f, +1.723828262e-04f, + -1.178905081e-05f, -2.283957411e-05f, -3.251825399e-05f, -3.558798994e-05f, -2.633977555e-05f, -3.658972101e-07f, +4.339880561e-05f, +1.009097504e-04f, +1.621235190e-04f, +2.114881615e-04f, +2.300452179e-04f, +1.989874440e-04f, +1.040972218e-04f, -5.984844242e-05f, -2.857757222e-04f, -5.530883705e-04f, -8.291383686e-04f, -1.073459961e-03f, -1.244201599e-03f, -1.305627587e-03f, -1.235213029e-03f, -1.028823208e-03f, -7.027806537e-04f, -2.922250001e-04f, +1.540661632e-04f, +5.814753136e-04f, +9.384757372e-04f, +1.184961996e-03f, +1.298378071e-03f, +1.276518757e-03f, +1.136591335e-03f, +9.109036901e-04f, +6.402138901e-04f, +3.661886494e-04f, +1.244941147e-04f, -6.021501885e-05f, -1.766519567e-04f, -2.264711354e-04f, -2.215221496e-04f, -1.796736753e-04f, -1.202755443e-04f, -6.024547421e-05f, -1.147532021e-05f, +2.015448731e-05f, +3.427263710e-05f, +3.446062022e-05f, +2.623302729e-05f, +1.513167810e-05f, + +4.922830113e-06f, +3.158234997e-05f, +6.726782211e-05f, +9.508619534e-05f, +9.034138753e-05f, +3.062968081e-05f, -9.017396144e-05f, -2.501623294e-04f, -3.970868359e-04f, -4.602646486e-04f, -3.757929232e-04f, -1.173096685e-04f, +2.803140446e-04f, +7.169598973e-04f, +1.049611999e-03f, +1.137521149e-03f, +8.960286417e-04f, +3.386740834e-04f, -4.111763155e-04f, -1.148133531e-03f, -1.646208432e-03f, -1.734087204e-03f, -1.357300375e-03f, -6.034092543e-04f, +3.209232485e-04f, +1.154415171e-03f, +1.664948562e-03f, +1.723030478e-03f, +1.339256215e-03f, +6.537562347e-04f, -1.165447678e-04f, -7.520753944e-04f, -1.099011452e-03f, -1.108941136e-03f, -8.392395538e-04f, -4.187842527e-04f, +4.494105415e-06f, +3.134231564e-04f, +4.519846527e-04f, +4.292448886e-04f, +3.006216502e-04f, +1.378613810e-04f, +9.595703742e-07f, -7.832811222e-05f, -9.832157191e-05f, -7.787913356e-05f, -4.233878694e-05f, -1.172657779e-05f, + /* 2,11 (48) */ + +9.365888772e-05f, +3.641014979e-04f, +8.071326683e-04f, +1.363092380e-03f, +1.882989609e-03f, +2.133601595e-03f, +1.833575087e-03f, +7.209299316e-04f, -1.356971328e-03f, -4.349049452e-03f, -7.925996577e-03f, -1.145080542e-02f, -1.401384935e-02f, -1.454009906e-02f, -1.195997046e-02f, -5.418550388e-03f, +5.515297553e-03f, +2.068441184e-02f, +3.926420140e-02f, +5.979624514e-02f, +8.034093452e-02f, +9.873114664e-02f, +1.128866930e-01f, +1.211343400e-01f, +1.224742969e-01f, +1.167425336e-01f, +1.046376069e-01f, +8.760679058e-02f, +6.761354969e-02f, +4.683085617e-02f, +2.731770467e-02f, +1.073692105e-02f, -1.838775330e-03f, -1.000556049e-02f, -1.398944532e-02f, -1.450951531e-02f, -1.258030704e-02f, -9.297603759e-03f, -5.649405355e-03f, -2.382925750e-03f, +5.745403624e-05f, +1.523153247e-03f, +2.100975393e-03f, +2.023154551e-03f, +1.573192694e-03f, +1.008361617e-03f, +5.113964501e-04f, +1.743436322e-04f, + +2.100066193e-04f, -5.028280352e-05f, -8.198044229e-04f, -2.130595257e-03f, -3.676704865e-03f, -4.757095958e-03f, -4.415486017e-03f, -1.796844873e-03f, +3.370007845e-03f, +1.035629625e-02f, +1.731333166e-02f, +2.161200557e-02f, +2.063962865e-02f, +1.284245928e-02f, -1.362526242e-03f, -1.921682403e-02f, -3.606170620e-02f, -4.658096445e-02f, -4.650896168e-02f, -3.423166234e-02f, -1.167269131e-02f, +1.594055057e-02f, +4.145329415e-02f, +5.790234977e-02f, +6.068061083e-02f, +4.900253810e-02f, +2.615610935e-02f, -1.547863536e-03f, -2.675868606e-02f, -4.331229404e-02f, -4.795329862e-02f, -4.101823683e-02f, -2.593982609e-02f, -7.848667242e-03f, +8.168849899e-03f, +1.854318630e-02f, +2.198261205e-02f, +1.938794711e-02f, +1.309923567e-02f, +5.852746513e-03f, -1.436328168e-04f, -3.732764732e-03f, -4.848535978e-03f, -4.185013649e-03f, -2.712258454e-03f, -1.255666395e-03f, -2.717301535e-04f, +1.606562484e-04f, + -1.114618787e-05f, -2.214184094e-05f, -3.204712588e-05f, -3.570015596e-05f, -2.737464070e-05f, -2.522073369e-06f, +4.018929612e-05f, +9.707231393e-05f, +1.584603151e-04f, +2.091008723e-04f, +2.301572546e-04f, +2.026878366e-04f, +1.120534605e-04f, -4.764458457e-05f, -2.701625673e-04f, -5.357359097e-04f, -8.123729255e-04f, -1.059926174e-03f, -1.236415057e-03f, -1.305501685e-03f, -1.243656875e-03f, -1.045499198e-03f, -7.260813874e-04f, -3.194851996e-04f, +1.261562889e-04f, +5.563320867e-04f, +9.190633106e-04f, +1.173321362e-03f, +1.295333093e-03f, +1.281610320e-03f, +1.148242387e-03f, +9.267707057e-04f, +6.576447625e-04f, +3.826906643e-04f, +1.381211376e-04f, -5.062234878e-05f, -1.714023512e-04f, -2.251246810e-04f, -2.231145150e-04f, -1.829989042e-04f, -1.241604985e-04f, -6.376104794e-05f, -1.405226805e-05f, +1.871064704e-05f, +3.384954591e-05f, +3.475632442e-05f, +2.688433347e-05f, +1.582082546e-05f, + +3.742405081e-06f, +2.953662015e-05f, +6.503924966e-05f, +9.402984937e-05f, +9.206765198e-05f, +3.621097189e-05f, -8.108743468e-05f, -2.398708882e-04f, -3.895954709e-04f, -4.601045415e-04f, -3.861705995e-04f, -1.382484285e-04f, +2.529913283e-04f, +6.911329643e-04f, +1.034703675e-03f, +1.141229105e-03f, +9.210830791e-04f, +3.809383425e-04f, -3.623010820e-04f, -1.106847003e-03f, -1.625805940e-03f, -1.742352059e-03f, -1.393501261e-03f, -6.581055171e-04f, +2.630726757e-04f, +1.109765997e-03f, +1.645625650e-03f, +1.733177506e-03f, +1.374064408e-03f, +7.015085432e-04f, -7.028076002e-05f, -7.196996783e-04f, -1.087270186e-03f, -1.117566187e-03f, -8.620606813e-04f, -4.466149993e-04f, -1.955592078e-05f, +2.988708887e-04f, +4.484335740e-04f, +4.344910750e-04f, +3.103955235e-04f, +1.477760152e-04f, +7.996027043e-06f, -7.522329867e-05f, -9.851429947e-05f, -7.985437440e-05f, -4.457310904e-05f, -1.326486022e-05f, + /* 2,12 (48) */ + +8.251269985e-05f, +3.419596569e-04f, +7.750855424e-04f, +1.327392224e-03f, +1.855614968e-03f, +2.131079521e-03f, +1.873764383e-03f, +8.180022455e-04f, -1.198511013e-03f, -4.139948580e-03f, -7.695839322e-03f, -1.124811758e-02f, -1.390179589e-02f, -1.458774364e-02f, -1.223013303e-02f, -5.954286298e-03f, +4.702924628e-03f, +1.962448566e-02f, +3.802778634e-02f, +5.849074345e-02f, +7.909727764e-02f, +9.768564744e-02f, +1.121606116e-01f, +1.208148548e-01f, +1.226004532e-01f, +1.172988657e-01f, +1.055566702e-01f, +8.878011194e-02f, +6.890888278e-02f, +4.811246649e-02f, +2.846594706e-02f, +1.166369176e-02f, -1.181130567e-03f, -9.622869830e-03f, -1.385132418e-02f, -1.456013766e-02f, -1.275170939e-02f, -9.522728440e-03f, -5.872519870e-03f, -2.565924654e-03f, -6.670646231e-05f, +1.459392199e-03f, +2.086923125e-03f, +2.041865198e-03f, +1.607042240e-03f, +1.043117941e-03f, +5.382807835e-04f, +1.901644577e-04f, + +2.137490244e-04f, -2.074618336e-05f, -7.547651732e-04f, -2.036565407e-03f, -3.584637213e-03f, -4.720884986e-03f, -4.496573452e-03f, -2.036715762e-03f, +2.980412374e-03f, +9.896191711e-03f, +1.692716106e-02f, +2.147375714e-02f, +2.089261998e-02f, +1.353359224e-02f, -3.278225666e-04f, -1.807559493e-02f, -3.514062312e-02f, -4.620002611e-02f, -4.687126276e-02f, -3.533850934e-02f, -1.329849725e-02f, +1.419819851e-02f, +4.005979289e-02f, +5.724424426e-02f, +6.094368351e-02f, +5.011230410e-02f, +2.780173499e-02f, +1.853139707e-04f, -2.538462165e-02f, -4.261078550e-02f, -4.802357938e-02f, -4.173793651e-02f, -2.702709627e-02f, -8.966233429e-03f, +7.306789218e-03f, +1.809657130e-02f, +2.196305613e-02f, +1.968681800e-02f, +1.354766925e-02f, +6.287237588e-03f, +1.667627067e-04f, -3.584988717e-03f, -4.840539951e-03f, -4.260236948e-03f, -2.810772754e-03f, -1.335520770e-03f, -3.163032626e-04f, +1.473913882e-04f, + -1.051340821e-05f, -2.144042228e-05f, -3.155178736e-05f, -3.576516312e-05f, -2.834389434e-05f, -4.606824229e-06f, +3.703714383e-05f, +9.325435845e-05f, +1.547563581e-04f, +2.065980965e-04f, +2.300783449e-04f, +2.061386118e-04f, +1.197358921e-04f, -3.569062057e-05f, -2.547216865e-04f, -5.184294122e-04f, -7.954945209e-04f, -1.046112950e-03f, -1.228204740e-03f, -1.304858312e-03f, -1.251561458e-03f, -1.061695187e-03f, -7.490369039e-04f, -3.465907549e-04f, +9.818515874e-05f, +5.309217592e-04f, +8.992214192e-04f, +1.161157397e-03f, +1.291751402e-03f, +1.286229402e-03f, +1.159546352e-03f, +9.424511507e-04f, +6.750547716e-04f, +3.993149794e-04f, +1.519706699e-04f, -4.075986188e-05f, -1.658873573e-04f, -2.235584601e-04f, -2.245574884e-04f, -1.862517758e-04f, -1.280410192e-04f, -6.732039382e-05f, -1.669726717e-05f, +1.719662164e-05f, +3.337019667e-05f, +3.501771719e-05f, +2.752361942e-05f, +1.651501641e-05f, + +2.622325768e-06f, +2.753271206e-05f, +6.278822237e-05f, +9.285231470e-05f, +9.357833311e-05f, +4.154293279e-05f, -7.217352485e-05f, -2.295510580e-04f, -3.817933795e-04f, -4.593683694e-04f, -3.958482481e-04f, -1.586048292e-04f, +2.258675223e-04f, +6.649374122e-04f, +1.018851802e-03f, +1.143628431e-03f, +9.448499737e-04f, +4.223801457e-04f, -3.134398161e-04f, -1.064662533e-03f, -1.603792974e-03f, -1.748750765e-03f, -1.428150722e-03f, -7.120558050e-04f, +2.049230008e-04f, +1.063868971e-03f, +1.624504230e-03f, +1.741535112e-03f, +1.407620910e-03f, +7.488710269e-04f, -2.351731614e-05f, -6.861874516e-04f, -1.074175161e-03f, -1.125049832e-03f, -8.842498455e-04f, -4.744103624e-04f, -4.405097132e-05f, +2.836366688e-04f, +4.442277028e-04f, +4.393011265e-04f, +3.200227729e-04f, +1.577895109e-04f, +1.526379959e-05f, -7.187725374e-05f, -9.854087592e-05f, -8.176651482e-05f, -4.682673567e-05f, -1.486066013e-05f, + /* 2,13 (48) */ + +7.199929164e-05f, +3.205192346e-04f, +7.435337550e-04f, +1.291627061e-03f, +1.827271074e-03f, +2.126472697e-03f, +1.910801527e-03f, +9.112566040e-04f, -1.043754655e-03f, -3.933350484e-03f, -7.465760977e-03f, -1.104197897e-02f, -1.378205999e-02f, -1.462343426e-02f, -1.248485472e-02f, -6.472715710e-03f, +3.907430107e-03f, +1.857837271e-02f, +3.679958160e-02f, +5.718588514e-02f, +7.784571619e-02f, +9.662395226e-02f, +1.114115747e-01f, +1.204682640e-01f, +1.226986384e-01f, +1.178297874e-01f, +1.064558916e-01f, +8.994126933e-02f, +7.020063419e-02f, +4.939869589e-02f, +2.962549341e-02f, +1.260614291e-02f, -5.060757957e-04f, -9.223554850e-03f, -1.369935351e-02f, -1.460089752e-02f, -1.291759675e-02f, -9.746286900e-03f, -6.097077358e-03f, -2.752176430e-03f, -1.947474815e-04f, +1.392071805e-03f, +2.070225857e-03f, +2.059061820e-03f, +1.640412437e-03f, +1.078135658e-03f, +5.658044030e-04f, +2.066794741e-04f, + +2.163713502e-04f, +6.786528698e-06f, -6.919769508e-04f, -1.943713093e-03f, -3.491058880e-03f, -4.679342053e-03f, -4.568746977e-03f, -2.266266820e-03f, +2.598618995e-03f, +9.436823341e-03f, +1.653131281e-02f, +2.131515231e-02f, +2.111848750e-02f, +1.419852965e-02f, +6.910292352e-04f, -1.693196650e-02f, -3.419577315e-02f, -4.577764596e-02f, -4.718470258e-02f, -3.640317188e-02f, -1.490229022e-02f, +1.244944774e-02f, +3.863164217e-02f, +5.653218845e-02f, +6.114860651e-02f, +5.117617307e-02f, +2.942623922e-02f, +1.926849082e-03f, -2.397700074e-02f, -4.186191447e-02f, -4.804709670e-02f, -4.242412396e-02f, -2.810127143e-02f, -1.009128326e-02f, +6.422539372e-03f, +1.762216094e-02f, +2.191900516e-02f, +1.997045467e-02f, +1.399189695e-02f, +6.726538715e-03f, +4.867854796e-04f, -3.427199206e-03f, -4.825276152e-03f, -4.332114202e-03f, -2.909313630e-03f, -1.417287284e-03f, -3.631299982e-04f, +1.325307281e-04f, + -9.891302271e-06f, -2.073640537e-05f, -3.103365204e-05f, -3.578439566e-05f, -2.924840441e-05f, -6.619994119e-06f, +3.394390829e-05f, +8.945895274e-05f, +1.510159515e-04f, +2.039846941e-04f, +2.298129043e-04f, +2.093425983e-04f, +1.271447277e-04f, -2.398961014e-05f, -2.394594669e-04f, -5.011779468e-04f, -7.785136030e-04f, -1.032030359e-03f, -1.219578458e-03f, -1.303701385e-03f, -1.258925789e-03f, -1.077405124e-03f, -7.716368758e-04f, -3.735286588e-04f, +7.016634360e-05f, +5.052562393e-04f, +8.789584049e-04f, +1.148473659e-03f, +1.287631456e-03f, +1.290369966e-03f, +1.170494061e-03f, +9.579345288e-04f, +6.924339611e-04f, +4.160537421e-04f, +1.660379520e-04f, -3.062893417e-05f, -1.601053439e-04f, -2.217687085e-04f, -2.258462928e-04f, -1.894276004e-04f, -1.319133601e-04f, -7.092118880e-05f, -1.940949351e-05f, +1.561199585e-05f, +3.283339796e-05f, +3.524334497e-05f, +2.814960131e-05f, +1.721340283e-05f, + +1.562413851e-06f, +2.557309600e-05f, +6.052002625e-05f, +9.156016257e-05f, +9.487816622e-05f, +4.662483179e-05f, -6.344078426e-05f, -2.192185398e-04f, -3.736989491e-04f, -4.580698598e-04f, -4.048272910e-04f, -1.783634743e-04f, +1.989733799e-04f, +6.384111173e-04f, +1.002088393e-03f, +1.144732003e-03f, +9.673148316e-04f, +4.629585158e-04f, -2.646490911e-04f, -1.021634421e-03f, -1.580202800e-03f, -1.753282834e-03f, -1.461212903e-03f, -7.651994937e-04f, +1.465402875e-04f, +1.016774333e-03f, +1.601603067e-03f, +1.748085931e-03f, +1.439879816e-03f, +7.957857930e-04f, +2.369487665e-05f, -6.515672104e-04f, -1.059726664e-03f, -1.131368162e-03f, -9.057703350e-04f, -5.021346199e-04f, -6.896735240e-05f, +2.677272441e-04f, +4.393586230e-04f, +4.436579724e-04f, +3.294855733e-04f, +1.678894210e-04f, +2.275838507e-05f, -6.828755564e-05f, -9.839518974e-05f, -8.360932158e-05f, -4.909571189e-05f, -1.651293895e-05f, + /* 2,14 (48) */ + +6.210798937e-05f, +2.997828293e-04f, +7.125001030e-04f, +1.255842665e-03f, +1.798022669e-03f, +2.119852703e-03f, +1.944745435e-03f, +1.000715557e-03f, -8.927387031e-04f, -3.729365789e-03f, -7.235948073e-03f, -1.083263637e-02f, -1.365491527e-02f, -1.464742387e-02f, -1.272431418e-02f, -6.973893657e-03f, +3.128916504e-03f, +1.754634235e-02f, +3.558000314e-02f, +5.588218376e-02f, +7.658679040e-02f, +9.554654713e-02f, +1.106399378e-01f, +1.200947354e-01f, +1.227688047e-01f, +1.183350437e-01f, +1.073348500e-01f, +9.108974299e-02f, +7.148826564e-02f, +5.068906585e-02f, +3.079598747e-02f, +1.356407744e-02f, +1.863581655e-04f, -8.807501108e-03f, -1.353331556e-02f, -1.463152645e-02f, -1.307770209e-02f, -9.968055609e-03f, -6.322923651e-03f, -2.941604030e-03f, -3.266608416e-04f, +1.321150617e-03f, +2.050816364e-03f, +2.074673816e-03f, +1.673245835e-03f, +1.113379003e-03f, +5.939540043e-04f, +2.238928769e-04f, + +2.179337640e-04f, +3.235962470e-05f, -6.314569246e-04f, -1.852152930e-03f, -3.396180714e-03f, -4.632717222e-03f, -4.632187761e-03f, -2.485485359e-03f, +2.224920046e-03f, +8.978753482e-03f, +1.612648552e-02f, +2.113678884e-02f, +2.131746088e-02f, +1.483694077e-02f, +1.693117628e-03f, -1.578723449e-02f, -3.322845831e-02f, -4.531468744e-02f, -4.744935167e-02f, -3.742480630e-02f, -1.648249302e-02f, +1.069616491e-02f, +3.717042926e-02f, +5.576698896e-02f, +6.129514680e-02f, +5.219294740e-02f, +3.102784229e-02f, +3.674935013e-03f, -2.253712093e-02f, -4.106612868e-02f, -4.802340182e-02f, -4.307569117e-02f, -2.916099810e-02f, -1.122265142e-02f, +5.516769037e-03f, +1.712002632e-02f, +2.185003780e-02f, +2.023818191e-02f, +1.443125557e-02f, +7.170196687e-03f, +8.162710528e-04f, -3.259309785e-03f, -4.802517767e-03f, -4.400401757e-03f, -3.007708819e-03f, -1.500896606e-03f, -4.122257101e-04f, +1.160177891e-04f, + -9.280428073e-06f, -2.003084938e-05f, -3.049412176e-05f, -3.575925304e-05f, -3.008908649e-05f, -8.561504587e-06f, +3.091105468e-05f, +8.568907504e-05f, +1.472433373e-04f, +2.012655171e-04f, +2.293654093e-04f, +2.123027569e-04f, +1.342803661e-04f, -1.254439996e-05f, -2.243820990e-04f, -4.839904468e-04f, -7.614405822e-04f, -1.017688552e-03f, -1.210544213e-03f, -1.302035102e-03f, -1.265749200e-03f, -1.092623262e-03f, -7.938712038e-04f, -4.002860127e-04f, +4.211344555e-05f, +4.793476000e-04f, +8.582828770e-04f, +1.135274025e-03f, +1.282972024e-03f, +1.294026224e-03f, +1.181076492e-03f, +9.732103711e-04f, +7.097722906e-04f, +4.328989326e-04f, +1.803180156e-04f, -2.023114846e-05f, -1.540548463e-04f, -2.197517632e-04f, -2.269761809e-04f, -1.925216541e-04f, -1.357736976e-04f, -7.456101461e-05f, -2.218803400e-05f, +1.395641963e-05f, +3.223799159e-05f, +3.543175649e-05f, +2.876097492e-05f, +1.791510520e-05f, + +5.623598792e-07f, +2.366005660e-05f, +5.823979708e-05f, +9.015996227e-05f, +9.597211052e-05f, +5.145637092e-05f, -5.489725793e-05f, -2.088886799e-04f, -3.653305944e-04f, -4.562232692e-04f, -4.131101015e-04f, -1.975100473e-04f, +1.723388697e-04f, +6.115918602e-04f, +9.844462429e-04f, +1.144554210e-03f, +9.884649509e-04f, +5.026339086e-04f, -2.159849825e-04f, -9.778176877e-04f, -1.555070467e-03f, -1.755950062e-03f, -1.492653966e-03f, -8.174770020e-04f, +8.799090204e-05f, +9.685338654e-04f, +1.576943159e-03f, +1.752814755e-03f, +1.470796584e-03f, +8.421951268e-04f, +7.130416767e-05f, -6.158691211e-04f, -1.043926723e-03f, -1.136498499e-03f, -9.265858312e-04f, -5.297516141e-04f, -9.428040187e-05f, +2.511504331e-04f, +4.338187090e-04f, +4.475448477e-04f, +3.387659360e-04f, +1.780628463e-04f, +3.047478144e-05f, -6.445213413e-05f, -9.807124983e-05f, -8.537648151e-05f, -5.137590333e-05f, -1.822048807e-05f, + /* 2,15 (48) */ + +5.282756130e-05f, +2.797519799e-04f, +6.820059812e-04f, +1.220083412e-03f, +1.767933583e-03f, +2.111291198e-03f, +1.975656490e-03f, +1.086404632e-03f, -7.454953658e-04f, -3.528100272e-03f, -7.006582663e-03f, -1.062033362e-02f, -1.352063490e-02f, -1.465996827e-02f, -1.294869628e-02f, -7.457884103e-03f, +2.367475921e-03f, +1.652865380e-02f, +3.436945893e-02f, +5.458014866e-02f, +7.532104120e-02f, +9.445392387e-02f, +1.098460666e-01f, +1.196944494e-01f, +1.228109182e-01f, +1.188143913e-01f, +1.081931329e-01f, +9.222501702e-02f, +7.277123767e-02f, +5.198309208e-02f, +3.197706396e-02f, +1.453728781e-02f, +8.961304561e-04f, -8.374602175e-03f, -1.335299754e-02f, -1.465175760e-02f, -1.323175694e-02f, -1.018780737e-02f, -6.549899832e-03f, -3.134125684e-03f, -4.624345392e-04f, +1.246589602e-03f, +2.028628330e-03f, +2.088630235e-03f, +1.705483827e-03f, +1.148810760e-03f, +6.227149792e-04f, +2.418079821e-04f, + +2.184961239e-04f, +5.601968130e-05f, -5.732171275e-04f, -1.761992968e-03f, -3.300208604e-03f, -4.581260851e-03f, -4.687085019e-03f, -2.694374039e-03f, +1.859589451e-03f, +8.522530212e-03f, +1.571337542e-02f, +2.093927879e-02f, +2.148979975e-02f, +1.544853263e-02f, +2.677563871e-03f, -1.464268029e-02f, -3.223999336e-02f, -4.481205354e-02f, -4.766533665e-02f, -3.840262399e-02f, -1.803756349e-02f, +8.940214849e-03f, +3.567777530e-02f, +5.494951196e-02f, +6.138313770e-02f, +5.316148127e-02f, +3.260478545e-02f, +5.427749768e-03f, -2.106632434e-02f, -4.022393355e-02f, -4.795209765e-02f, -4.369156029e-02f, -3.020492482e-02f, -1.235914992e-02f, +4.590183206e-03f, +1.659027470e-02f, +2.175575740e-02f, +2.048933234e-02f, +1.486507428e-02f, +7.617741535e-03f, +1.155036989e-03f, -3.081246939e-03f, -4.772042985e-03f, -4.464853891e-03f, -3.105780069e-03f, -1.586273087e-03f, -4.636016135e-04f, +9.779730107e-05f, + -8.681311338e-06f, -1.932478483e-05f, -2.993458524e-05f, -3.569114798e-05f, -3.086690169e-05f, -1.043135282e-05f, +2.793995439e-05f, +8.194761206e-05f, +1.434426938e-04f, +1.984454053e-04f, +2.287403927e-04f, +2.150221760e-04f, +1.411433911e-04f, -1.357624045e-06f, -2.094955744e-04f, -4.668757046e-04f, -7.442858238e-04f, -1.003097751e-03f, -1.201110195e-03f, -1.299863938e-03f, -1.272031343e-03f, -1.107344162e-03f, -8.157300226e-04f, -4.268500357e-04f, +1.404008886e-05f, +4.532080721e-04f, +8.372037069e-04f, +1.121562690e-03f, +1.277772188e-03f, +1.297192640e-03f, +1.191284773e-03f, +9.882682428e-04f, +7.270596416e-04f, +4.498423675e-04f, +1.948056840e-04f, -9.568295641e-06f, -1.477345693e-04f, -2.175040677e-04f, -2.279424392e-04f, -1.955291828e-04f, -1.396181328e-04f, -7.823735817e-05f, -2.503188561e-05f, +1.222960999e-05f, +3.158285468e-05f, +3.558150459e-05f, +2.935641677e-05f, +1.861921294e-05f, + -3.782715170e-07f, +2.179569405e-05f, +5.595251495e-05f, +8.865826890e-05f, +9.686533432e-05f, +5.603767555e-05f, -4.655048215e-05f, -1.985764530e-04f, -3.567067284e-04f, -4.538433513e-04f, -4.206999836e-04f, -2.160313154e-04f, +1.459931441e-04f, +5.845172747e-04f, +9.659588702e-04f, +1.143110919e-03f, +1.008289421e-03f, +5.413682538e-04f, -1.675029973e-04f, -9.332679948e-04f, -1.528432751e-03f, -1.756756523e-03f, -1.522442131e-03f, -8.688298676e-04f, +2.934142660e-05f, +9.192008225e-04f, +1.550547714e-03f, +1.755708558e-03f, +1.500328102e-03f, +8.880415694e-04f, +1.192580046e-04f, -5.791249940e-04f, -1.026779123e-03f, -1.140419444e-03f, -9.466604647e-04f, -5.572247964e-04f, -1.199645104e-04f, +2.339151312e-04f, +4.276011519e-04f, +4.509453262e-04f, +3.478457341e-04f, +1.882964467e-04f, +3.840748395e-05f, -6.036928359e-05f, -9.756320015e-05f, -8.706161150e-05f, -5.366299909e-05f, -1.998192572e-05f, + /* 3, 0 (48) */ + +3.382425704e-04f, +1.348067834e-04f, -4.889424346e-04f, -1.466276588e-03f, -2.424363330e-03f, -2.730039057e-03f, -1.724598248e-03f, +9.008300509e-04f, +4.739031994e-03f, +8.514833164e-03f, +1.031793603e-02f, +8.256301383e-03f, +1.371724009e-03f, -9.514669115e-03f, -2.142432917e-02f, -2.960851385e-02f, -2.874512923e-02f, -1.466449091e-02f, +1.394439274e-02f, +5.448301361e-02f, +1.005300380e-01f, +1.431856698e-01f, +1.733482814e-01f, +1.842374374e-01f, +1.733482814e-01f, +1.431856698e-01f, +1.005300380e-01f, +5.448301361e-02f, +1.394439274e-02f, -1.466449091e-02f, -2.874512923e-02f, -2.960851385e-02f, -2.142432917e-02f, -9.514669115e-03f, +1.371724009e-03f, +8.256301383e-03f, +1.031793603e-02f, +8.514833164e-03f, +4.739031994e-03f, +9.008300509e-04f, -1.724598248e-03f, -2.730039057e-03f, -2.424363330e-03f, -1.466276588e-03f, -4.889424346e-04f, +1.348067834e-04f, +3.382425704e-04f, +2.622641023e-04f, + -7.823217465e-04f, -9.084685290e-04f, -9.527730581e-05f, +1.939581772e-03f, +4.521325238e-03f, +5.889778654e-03f, +3.972523948e-03f, -2.097746258e-03f, -1.059839761e-02f, -1.714075782e-02f, -1.654476645e-02f, -6.064599171e-03f, +1.185220802e-02f, +2.935028356e-02f, +3.641246564e-02f, +2.636698292e-02f, +6.586074871e-04f, -3.028063400e-02f, -5.133665227e-02f, -5.043564613e-02f, -2.556515975e-02f, +1.309926646e-02f, +4.764810534e-02f, +6.141247912e-02f, +4.764810534e-02f, +1.309926646e-02f, -2.556515975e-02f, -5.043564613e-02f, -5.133665227e-02f, -3.028063400e-02f, +6.586074871e-04f, +2.636698292e-02f, +3.641246564e-02f, +2.935028356e-02f, +1.185220802e-02f, -6.064599171e-03f, -1.654476645e-02f, -1.714075782e-02f, -1.059839761e-02f, -2.097746258e-03f, +3.972523948e-03f, +5.889778654e-03f, +4.521325238e-03f, +1.939581772e-03f, -9.527730581e-05f, -9.084685290e-04f, -7.823217465e-04f, -3.493719860e-04f, + +1.362712782e-06f, +2.430658232e-05f, +5.148010691e-05f, +6.598034546e-05f, +4.813967360e-05f, -1.337559834e-05f, -1.100590885e-04f, -2.082276012e-04f, -2.554161433e-04f, -1.996587127e-04f, -1.641106349e-05f, +2.676990797e-04f, +5.667930921e-04f, +7.518547806e-04f, +6.905770765e-04f, +2.997194817e-04f, -4.091432488e-04f, -1.310542778e-03f, -2.185234209e-03f, -2.778100290e-03f, -2.877271248e-03f, -2.387751421e-03f, -1.372408895e-03f, -4.338151546e-05f, +1.295679903e-03f, +2.338172154e-03f, +2.864100685e-03f, +2.800464093e-03f, +2.233131932e-03f, +1.368613192e-03f, +4.617294971e-04f, -2.640035975e-04f, -6.762352148e-04f, -7.564632958e-04f, -5.831596506e-04f, -2.871365353e-04f, +1.009139408e-06f, +1.919595909e-04f, +2.553979460e-04f, +2.132640346e-04f, +1.166288410e-04f, +1.861052776e-05f, -4.560632273e-05f, -6.599843263e-05f, -5.296712092e-05f, -2.601792971e-05f, -2.470909225e-06f, +9.059582855e-06f, + +2.441236253e-05f, -1.343848373e-05f, -8.745817246e-05f, -1.562071244e-04f, -1.482428810e-04f, -8.250122829e-06f, +2.434767633e-04f, +4.836305458e-04f, +5.292736097e-04f, +2.484931299e-04f, -3.204885507e-04f, -9.285345060e-04f, -1.209960521e-03f, -8.872633042e-04f, +2.426784483e-05f, +1.150386728e-03f, +1.905650109e-03f, +1.803120048e-03f, +7.585646875e-04f, -8.012388243e-04f, -2.118524642e-03f, -2.496316882e-03f, -1.688026227e-03f, -5.612345016e-05f, +1.603375858e-03f, +2.479825823e-03f, +2.175131749e-03f, +8.991349016e-04f, -6.693020372e-04f, -1.763498582e-03f, -1.927767583e-03f, -1.214731161e-03f, -9.390924656e-05f, +8.453833775e-04f, +1.209137816e-03f, +9.595032747e-04f, +3.609011358e-04f, -2.198020113e-04f, -5.219487723e-04f, -4.940825608e-04f, -2.605996306e-04f, -4.978456466e-06f, +1.436426421e-04f, +1.587387043e-04f, +9.256208576e-05f, +1.721600120e-05f, -2.329239317e-05f, -2.574298666e-05f, + /* 3, 1 (48) */ + +3.396052832e-04f, +1.591133657e-04f, -4.374623277e-04f, -1.400296242e-03f, -2.376223656e-03f, -2.743414655e-03f, -1.834657337e-03f, +6.926024496e-04f, +4.483615851e-03f, +8.315174451e-03f, +1.030152497e-02f, +8.524000463e-03f, +1.938517101e-03f, -8.762814334e-03f, -2.073375210e-02f, -2.930879436e-02f, -2.915427248e-02f, -1.597503369e-02f, +1.175915853e-02f, +5.170491332e-02f, +9.765276679e-02f, +1.407979183e-01f, +1.719758725e-01f, +1.841940559e-01f, +1.746439613e-01f, +1.455238419e-01f, +1.033941387e-01f, +5.728347771e-02f, +1.617752467e-02f, -1.329587772e-02f, -2.828339973e-02f, -2.987251744e-02f, -2.210056439e-02f, -1.027113241e-02f, +7.885643586e-04f, +7.969164848e-03f, +1.031894517e-02f, +8.706792755e-03f, +4.994429940e-03f, +1.114094085e-03f, -1.607969408e-03f, -2.711428529e-03f, -2.469969652e-03f, -1.532275021e-03f, -5.419095556e-04f, +1.087888537e-04f, +3.357716612e-04f, +2.713236852e-04f, + -7.579093840e-04f, -9.219070127e-04f, -1.827354783e-04f, +1.783374647e-03f, +4.373082357e-03f, +5.881528531e-03f, +4.216000711e-03f, -1.614115712e-03f, -1.006912400e-02f, -1.689226469e-02f, -1.686525500e-02f, -6.993133677e-03f, +1.064224750e-02f, +2.846302026e-02f, +3.643673348e-02f, +2.751736964e-02f, +2.564257596e-03f, -2.847751395e-02f, -5.057808759e-02f, -5.123688496e-02f, -2.768368439e-02f, +1.060294958e-02f, +4.596007912e-02f, +6.135635567e-02f, +4.925148120e-02f, +1.557909228e-02f, -2.339002800e-02f, -4.953651123e-02f, -5.200595431e-02f, -3.204413258e-02f, -1.269160096e-03f, +2.515225176e-02f, +3.631855639e-02f, +3.019566694e-02f, +1.306134584e-02f, -5.105095897e-03f, -1.618386532e-02f, -1.736055983e-02f, -1.112034638e-02f, -2.591828819e-03f, +3.711924318e-03f, +5.884800197e-03f, +4.664967880e-03f, +2.098320476e-03f, -2.715220056e-06f, -8.912525278e-04f, -8.056141397e-04f, -3.751149726e-04f, + +3.053828783e-07f, +2.261492841e-05f, +4.994472502e-05f, +6.583325824e-05f, +5.049571450e-05f, -8.286747443e-06f, -1.035018317e-04f, -2.029922384e-04f, -2.550231936e-04f, -2.068425282e-04f, -3.139866995e-05f, +2.483352481e-04f, +5.499827626e-04f, +7.462678156e-04f, +7.035995661e-04f, +3.341544321e-04f, -3.573412500e-04f, -1.252380659e-03f, -2.136221350e-03f, -2.753768608e-03f, -2.888088780e-03f, -2.435226036e-03f, -1.447881465e-03f, -1.301043476e-04f, +1.217763015e-03f, +2.286525170e-03f, +2.848573324e-03f, +2.820819667e-03f, +2.279852789e-03f, +1.426529195e-03f, +5.150546432e-04f, -2.270243687e-04f, -6.605637628e-04f, -7.600641439e-04f, -5.990474603e-04f, -3.066192357e-04f, -1.479270955e-05f, +1.837446921e-04f, +2.549577521e-04f, +2.180872571e-04f, +1.231996048e-04f, +2.398620325e-05f, -4.289486633e-05f, -6.588302403e-05f, -5.440070923e-05f, -2.774567533e-05f, -3.629207216e-06f, +8.718068193e-06f, + +2.537955790e-05f, -9.816694012e-06f, -8.234517685e-05f, -1.533714251e-04f, -1.523014450e-04f, -2.100545850e-05f, +2.263313703e-04f, +4.724027832e-04f, +5.352645915e-04f, +2.759836047e-04f, -2.802718001e-04f, -8.962615228e-04f, -1.208321983e-03f, -9.267164761e-04f, -4.445893301e-05f, +1.084561664e-03f, +1.880042092e-03f, +1.838882264e-03f, +8.456970987e-04f, -7.023757360e-04f, -2.058090656e-03f, -2.507961371e-03f, -1.769307145e-03f, -1.682574121e-04f, +1.515521846e-03f, +2.458507842e-03f, +2.227781133e-03f, +9.958594564e-04f, -5.780763036e-04f, -1.720065970e-03f, -1.946313220e-03f, -1.277443204e-03f, -1.643306246e-04f, +8.011294892e-04f, +1.205814231e-03f, +9.890754911e-04f, +4.014233099e-04f, -1.899484114e-04f, -5.132739533e-04f, -5.037125890e-04f, -2.776568924e-04f, -1.866172927e-05f, +1.384937071e-04f, +1.609470350e-04f, +9.764105202e-05f, +2.114422789e-05f, -2.201572656e-05f, -2.635586685e-05f, + /* 3, 2 (48) */ + +3.399106661e-04f, +1.817282941e-04f, -3.875176027e-04f, -1.334462984e-03f, -2.325727942e-03f, -2.751701403e-03f, -1.938159169e-03f, +4.896102112e-04f, +4.228592657e-03f, +8.108331923e-03f, +1.027012630e-02f, +8.772335711e-03f, +2.488499864e-03f, -8.016546519e-03f, -2.003015253e-02f, -2.897463993e-02f, -2.951161373e-02f, -1.722741435e-02f, +9.622937179e-03f, +4.895114472e-02f, +9.476467801e-02f, +1.383626923e-01f, +1.705279911e-01f, +1.840639515e-01f, +1.758617243e-01f, +1.478103671e-01f, +1.062427120e-01f, +6.010429737e-02f, +1.845737746e-02f, -1.186934853e-02f, -2.776834509e-02f, -3.009954181e-02f, -2.276112815e-02f, -1.103119655e-02f, +1.895168983e-04f, +7.662545612e-03f, +1.030415246e-02f, +8.890537447e-03f, +5.249387692e-03f, +1.332181343e-03f, -1.484769803e-03f, -2.687442326e-03f, -2.512864519e-03f, -1.598158045e-03f, -5.963102648e-04f, +8.104317839e-05f, +3.321424540e-04f, +2.800417534e-04f, + -7.325298261e-04f, -9.317237067e-04f, -2.650806551e-04f, +1.630003222e-03f, +4.220780912e-03f, +5.860523072e-03f, +4.442332082e-03f, -1.141712929e-03f, -9.533859405e-03f, -1.661628108e-02f, -1.714552680e-02f, -7.889395200e-03f, +9.433925520e-03f, +2.753630378e-02f, +3.639227455e-02f, +2.860193131e-02f, +4.444299688e-03f, -2.663863169e-02f, -4.973239049e-02f, -5.193926069e-02f, -2.974177505e-02f, +8.094988206e-03f, +4.419077197e-02f, +6.118809826e-02f, +5.076700305e-02f, +1.803760013e-02f, -2.116224687e-02f, -4.854065178e-02f, -5.258403061e-02f, -3.376419855e-02f, -3.215473316e-03f, +2.387480855e-02f, +3.615422576e-02f, +3.099679643e-02f, +1.426716007e-02f, -4.116020405e-03f, -1.578244201e-02f, -1.755050824e-02f, -1.163362033e-02f, -3.095541408e-03f, +3.434267425e-03f, +5.866138468e-03f, +4.803461587e-03f, +2.259267511e-03f, +9.492583196e-05f, -8.701082999e-04f, -8.276298662e-04f, -4.014708395e-04f, + -7.004638822e-07f, +2.094611058e-05f, +4.836597661e-05f, +6.556179178e-05f, +5.267555978e-05f, -3.348891556e-06f, -9.696823219e-05f, -1.975722132e-04f, -2.542303720e-04f, -2.135123302e-04f, -4.595853568e-05f, +2.290726963e-04f, +5.327635541e-04f, +7.397323830e-04f, +7.153144195e-04f, +3.672927030e-04f, -3.063673185e-04f, -1.194188938e-03f, -2.086155759e-03f, -2.727511272e-03f, -2.896559589e-03f, -2.480561472e-03f, -1.522030573e-03f, -2.167066311e-04f, +1.138728152e-03f, +2.232849779e-03f, +2.830687958e-03f, +2.839128589e-03f, +2.325335806e-03f, +1.484227549e-03f, +5.690718432e-04f, -1.888012286e-04f, -6.435540565e-04f, -7.626289262e-04f, -6.144215072e-04f, -3.261181077e-04f, -3.097912402e-05f, +1.750143867e-04f, +2.540851657e-04f, +2.226829976e-04f, +1.297595871e-04f, +2.949687597e-05f, -4.000483767e-05f, -6.562976180e-05f, -5.577576691e-05f, -2.948637421e-05f, -4.836690636e-06f, +8.328888420e-06f, + +2.619825575e-05f, -6.354954773e-06f, -7.723840020e-05f, -1.502509361e-04f, -1.558265929e-04f, -3.327077228e-05f, +2.092054228e-04f, +4.604462536e-04f, +5.399406518e-04f, +3.022388744e-04f, -2.403350278e-04f, -8.627779927e-04f, -1.204266684e-03f, -9.636961824e-04f, -1.121401310e-04f, +1.017409233e-03f, +1.851031519e-03f, +1.870745738e-03f, +9.305377716e-04f, -6.027510728e-04f, -1.993968156e-03f, -2.514749879e-03f, -1.847060106e-03f, -2.800528054e-04f, +1.424636953e-03f, +2.432392809e-03f, +2.276349786e-03f, +1.091209358e-03f, -4.850599651e-04f, -1.672878888e-03f, -1.961212656e-03f, -1.338372963e-03f, -2.353939035e-04f, +7.545604759e-04f, +1.199955147e-03f, +1.017160390e-03f, +4.419668961e-04f, -1.589740718e-04f, -5.032359372e-04f, -5.124752704e-04f, -2.946044465e-04f, -3.277937540e-05f, +1.327903489e-04f, +1.628132499e-04f, +1.026786732e-04f, +2.521744019e-05f, -2.057882056e-05f, -2.689529487e-05f, + /* 3, 3 (48) */ + +3.392102022e-04f, +2.026744047e-04f, -3.391516261e-04f, -1.268901192e-03f, -2.273052382e-03f, -2.755050294e-03f, -2.035127401e-03f, +2.920379980e-04f, +3.974362285e-03f, +7.894819592e-03f, +1.022416777e-02f, +9.001408407e-03f, +3.021263418e-03f, -7.276814136e-03f, -1.931483811e-02f, -2.860734723e-02f, -2.981798105e-02f, -1.842160329e-02f, +7.536781420e-03f, +4.622363344e-02f, +9.186811842e-02f, +1.358821308e-01f, +1.690059605e-01f, +1.838472449e-01f, +1.770004525e-01f, +1.500432169e-01f, +1.090734000e-01f, +6.294342596e-02f, +2.078271327e-02f, -1.038512098e-02f, -2.719927325e-02f, -3.028834304e-02f, -2.340468221e-02f, -1.179382548e-02f, -4.249046089e-04f, +7.336427504e-03f, +1.027317334e-02f, +9.065551833e-03f, +5.503472858e-03f, +1.554864340e-03f, -1.355010216e-03f, -2.657945450e-03f, -2.552869356e-03f, -1.663787806e-03f, -6.520860317e-04f, +5.155680418e-05f, +3.273057633e-04f, +2.883706418e-04f, + -7.063315703e-04f, -9.380786615e-04f, -3.423190553e-04f, +1.479752286e-03f, +4.064954319e-03f, +5.827252300e-03f, +4.651537505e-03f, -6.812666753e-04f, -8.993918753e-03f, -1.631404221e-02f, -1.738586183e-02f, -8.752173193e-03f, +8.229658837e-03f, +2.657260760e-02f, +3.628013442e-02f, +2.961934054e-02f, +6.295331207e-03f, -2.476788595e-02f, -4.880185272e-02f, -5.254201177e-02f, -3.173574321e-02f, +5.580238328e-03f, +4.234371187e-02f, +6.090804546e-02f, +5.219164000e-02f, +2.046999293e-02f, -1.888589709e-02f, -4.744944242e-02f, -5.306909058e-02f, -3.543707744e-02f, -5.176685972e-03f, +2.253643559e-02f, +3.591883186e-02f, +3.175135691e-02f, +1.546711522e-02f, -3.098860015e-03f, -1.534047511e-02f, -1.770948231e-02f, -1.213685627e-02f, -3.608016678e-03f, +3.139662979e-03f, +5.833359092e-03f, +4.936251936e-03f, +2.422080761e-03f, +1.976045052e-04f, -8.448908597e-04f, -8.482086868e-04f, -4.283661344e-04f, + -1.654356283e-06f, +1.930311625e-05f, +4.674879763e-05f, +6.517067925e-05f, +5.468063210e-05f, +1.433467579e-06f, -9.046911708e-05f, -1.919817537e-04f, -2.530493507e-04f, -2.196702144e-04f, -6.007820864e-05f, +2.099383286e-04f, +5.151702243e-04f, +7.322791757e-04f, +7.257348527e-04f, +3.991203899e-04f, -2.562636991e-04f, -1.136029036e-03f, -2.035100429e-03f, -2.699372312e-03f, -2.902692508e-03f, -2.523725649e-03f, -1.594790730e-03f, -3.031081595e-04f, +1.058646560e-03f, +2.177187626e-03f, +2.810445952e-03f, +2.855354432e-03f, +2.369520845e-03f, +1.541644556e-03f, +6.237328043e-04f, -1.493554528e-04f, -6.251990193e-04f, -7.641301153e-04f, -6.292467916e-04f, -3.456034145e-04f, -4.753378261e-05f, +1.657699032e-04f, +2.527702729e-04f, +2.270370214e-04f, +1.362966996e-04f, +3.513638102e-05f, -3.693610856e-05f, -6.523443877e-05f, -5.708715158e-05f, -3.123643501e-05f, -6.092289786e-06f, +7.891082444e-06f, + +2.687305772e-05f, -3.056904113e-06f, -7.215255303e-05f, -1.468651244e-04f, -1.588277613e-04f, -4.503105467e-05f, +1.921397021e-04f, +4.478085433e-04f, +5.433234257e-04f, +3.272279914e-04f, -2.007601133e-04f, -8.281786720e-04f, -1.197843781e-03f, -9.981618200e-04f, -1.786487368e-04f, +9.490838417e-04f, +1.818712806e-03f, +1.898679610e-03f, +1.012931182e-03f, -5.025707398e-04f, -1.926302692e-03f, -2.516683224e-03f, -1.921134244e-03f, -3.912847393e-04f, +1.330900520e-03f, +2.401520771e-03f, +2.320722836e-03f, +1.184983313e-03f, -3.904304742e-04f, -1.622002527e-03f, -1.972398693e-03f, -1.397372766e-03f, -3.069578549e-04f, +7.057411623e-04f, +1.191531114e-03f, +1.043669022e-03f, +4.824419647e-04f, -1.269242815e-04f, -4.918245151e-04f, -5.203262624e-04f, -3.113972596e-04f, -4.730931145e-05f, +1.265281901e-04f, +1.643188099e-04f, +1.076580508e-04f, +2.942920216e-05f, -1.897854157e-05f, -2.735491682e-05f, + /* 3, 4 (48) */ + +3.375558459e-04f, +2.219775210e-04f, -2.924028285e-04f, -1.203730513e-03f, -2.218371750e-03f, -2.753616827e-03f, -2.125596518e-03f, +1.000562444e-04f, +3.721312934e-03f, +7.675149378e-03f, +1.016408956e-02f, +9.211346736e-03f, +3.536433642e-03f, -6.544534960e-03f, -1.858910326e-02f, -2.820822684e-02f, -3.007424475e-02f, -1.955763232e-02f, +5.501680991e-03f, +4.352426113e-02f, +8.896542591e-02f, +1.333584052e-01f, +1.674111697e-01f, +1.835441367e-01f, +1.780590990e-01f, +1.522204045e-01f, +1.118838460e-01f, +6.579878040e-02f, +2.315223411e-02f, -8.843476421e-03f, -2.657554044e-02f, -3.043769849e-02f, -2.402988123e-02f, -1.255795560e-02f, -1.054151401e-03f, +6.990824090e-03f, +1.022563956e-02f, +9.231321737e-03f, +5.756243131e-03f, +1.781901362e-03f, -1.218713516e-03f, -2.622809069e-03f, -2.589805465e-03f, -1.729022245e-03f, -7.091731833e-04f, +2.032036918e-05f, +3.212134736e-04f, +2.962617242e-04f, + -6.794585126e-04f, -9.411355656e-04f, -4.144716084e-04f, +1.332887162e-03f, +3.906126557e-03f, +5.782221245e-03f, +4.843677207e-03f, -2.334581321e-04f, -8.450595327e-03f, -1.598681422e-02f, -1.758662195e-02f, -9.580351865e-03f, +7.031815056e-03f, +2.557444578e-02f, +3.610148568e-02f, +3.056842438e-02f, +8.114044013e-03f, -2.286920634e-02f, -4.778892153e-02f, -5.304458251e-02f, -3.366204590e-02f, +3.063555103e-03f, +4.042257762e-02f, +6.051676072e-02f, +5.352254052e-02f, +2.287151370e-02f, -1.656517425e-02f, -4.626445911e-02f, -5.345952105e-02f, -3.705907997e-02f, -7.149084665e-03f, +2.113906282e-02f, +3.561187401e-02f, +3.245709807e-02f, +1.665864633e-02f, -2.055190993e-03f, -1.485803315e-02f, -1.783640660e-02f, -1.262868078e-02f, -4.128342940e-03f, +2.828265719e-03f, +5.786049781e-03f, +5.062780126e-03f, +2.586399571e-03f, +3.052625560e-04f, -8.154616576e-04f, -8.671872283e-04f, -4.557210512e-04f, + -2.555965243e-06f, +1.768877557e-05f, +4.509804999e-05f, +6.466475356e-05f, +5.651265163e-05f, +6.056241004e-06f, -8.401496727e-05f, -1.862350249e-04f, -2.514921708e-04f, -2.253190591e-04f, -7.374620772e-05f, +1.909582720e-04f, +4.972373481e-04f, +7.239395436e-04f, +7.348755228e-04f, +4.296254235e-04f, -2.070710274e-04f, -1.077961627e-03f, -1.983118864e-03f, -2.669397502e-03f, -2.906498868e-03f, -2.564688960e-03f, -1.666098084e-03f, -3.892289646e-04f, +9.775907166e-04f, +2.119582649e-03f, +2.787851257e-03f, +2.869462815e-03f, +2.412348689e-03f, +1.598716139e-03f, +6.789878318e-04f, -1.087101536e-04f, -6.054931951e-04f, -7.645411078e-04f, -6.434883797e-04f, -3.650447888e-04f, -6.443940815e-05f, +1.560133449e-04f, +2.510036692e-04f, +2.311351558e-04f, +1.427985743e-04f, +4.089813856e-05f, -3.368889852e-05f, -6.469301128e-05f, -5.832969341e-05f, -3.299212377e-05f, -7.394779215e-06f, +7.403782787e-06f, + +2.740886232e-05f, +7.449142443e-08f, -6.710173023e-05f, -1.432335341e-04f, -1.613155044e-04f, -5.627305695e-05f, +1.751737233e-04f, +4.345377090e-04f, +5.454371371e-04f, +3.509236252e-04f, -1.616265181e-04f, -7.925591648e-04f, -1.189106918e-03f, -1.030078903e-03f, -2.438619218e-04f, +8.797406818e-04f, +1.783186529e-03f, +1.922661652e-03f, +1.092728083e-03f, -4.020406563e-04f, -1.855246655e-03f, -2.513772428e-03f, -1.991386654e-03f, -5.017295534e-04f, +1.234498089e-03f, +2.365941895e-03f, +2.360793830e-03f, +1.276982314e-03f, -2.943698963e-04f, -1.567510509e-03f, -1.979811515e-03f, -1.454297523e-03f, -3.788783831e-04f, +6.547422921e-04f, +1.180518003e-03f, +1.068514493e-03f, +5.227570188e-04f, -9.384783611e-05f, -4.790325759e-04f, -5.272223775e-04f, -3.279894630e-04f, -6.222770278e-05f, +1.197042549e-04f, +1.654455694e-04f, +1.125618207e-04f, +3.377236041e-05f, -1.721219165e-05f, -2.772838204e-05f, + /* 3, 5 (48) */ + +3.349998807e-04f, +2.396662965e-04f, -2.473047785e-04f, -1.139065760e-03f, -2.161859098e-03f, -2.747560586e-03f, -2.209611485e-03f, -8.617878055e-05f, +3.469820763e-03f, +7.449830319e-03f, +1.009034335e-02f, +9.402305008e-03f, +4.033670990e-03f, -5.820595416e-03f, -1.785422774e-02f, -2.777860141e-02f, -3.028131578e-02f, -2.063559395e-02f, +3.518562128e-03f, +4.085486363e-02f, +8.605892704e-02f, +1.307937162e-01f, +1.657450717e-01f, +1.831549078e-01f, +1.790366898e-01f, +1.543399871e-01f, +1.146716972e-01f, +6.866824321e-02f, +2.556458280e-02f, -7.244760282e-03f, -2.589655261e-02f, -3.054640865e-02f, -2.463537442e-02f, -1.332249670e-02f, -1.697639780e-03f, +6.625779301e-03f, +1.016120015e-02f, +9.387335081e-03f, +6.007246800e-03f, +2.013036517e-03f, -1.075914942e-03f, -2.581910930e-03f, -2.623494363e-03f, -1.793715256e-03f, -7.675028767e-04f, -1.267175460e-05f, +3.138186943e-04f, +3.036655070e-04f, + -6.520496503e-04f, -9.410610742e-04f, -4.815733386e-04f, +1.189653627e-03f, +3.744811053e-03f, +5.725948188e-03f, +5.018850930e-03f, +2.010795769e-04f, -7.905158190e-03f, -1.563589059e-02f, -1.774824846e-02f, -1.037291103e-02f, +5.842708137e-03f, +2.454436688e-02f, +3.585762376e-02f, +3.144816507e-02f, +9.897230542e-03f, -2.094654469e-02f, -4.669619345e-02f, -5.344662316e-02f, -3.551729255e-02f, +5.497826750e-04f, +3.843119097e-02f, +6.001503116e-02f, +5.475703861e-02f, +2.523745560e-02f, -1.420438042e-02f, -4.498747679e-02f, -5.375389095e-02f, -3.862659048e-02f, -9.128896180e-03f, +1.968476530e-02f, +3.523299562e-02f, +3.311184036e-02f, +1.783916434e-02f, -9.866765005e-04f, -1.433527613e-02f, -1.793025443e-02f, -1.310771336e-02f, -4.655565318e-03f, +2.500276256e-03f, +5.723822078e-03f, +5.182484381e-03f, +2.751845140e-03f, +4.178243766e-04f, -7.816892972e-04f, -8.843994200e-04f, -4.834494332e-04f, + -3.405100316e-06f, +1.610575965e-05f, +4.341851334e-05f, +6.404893482e-05f, +5.817362492e-05f, +1.051574984e-05f, -7.761590678e-05f, -1.803461058e-04f, -2.495712134e-04f, -2.304625031e-04f, -8.695202101e-05f, +1.721578512e-04f, +4.789992715e-04f, +7.147454391e-04f, +7.427524870e-04f, +4.587975622e-04f, -1.588282957e-04f, -1.020046567e-03f, -1.930274992e-03f, -2.637634286e-03f, -2.907992474e-03f, -2.603424299e-03f, -1.735890485e-03f, -4.749894117e-04f, +8.956342544e-04f, +2.060081029e-03f, +2.762910412e-03f, +2.881421461e-03f, +2.453761118e-03f, +1.655377914e-03f, +7.347858775e-04f, -6.689027310e-05f, -5.844327786e-04f, -7.638362764e-04f, -6.571114549e-04f, -3.844112664e-04f, -8.167777557e-05f, +1.457477053e-04f, +2.487764871e-04f, +2.349633169e-04f, +1.492525790e-04f, +4.677515583e-05f, -3.026378360e-05f, -6.400161198e-05f, -5.949820540e-05f, -3.474956812e-05f, -8.742775860e-06f, +6.866220693e-06f, + +2.781083669e-05f, +3.036922064e-06f, -6.209938901e-05f, -1.393757265e-04f, -1.633014308e-04f, -6.698527863e-05f, +1.583456646e-04f, +4.206821447e-04f, +5.463084825e-04f, +3.733020566e-04f, -1.230111396e-04f, -7.560156839e-04f, -1.178114037e-03f, -1.059419058e-03f, -3.076612684e-04f, +8.095353725e-04f, +1.744559142e-03f, +1.942678244e-03f, +1.169785795e-03f, -3.013663031e-04f, -1.780958912e-03f, -2.506038658e-03f, -2.057682689e-03f, -6.111653058e-04f, +1.135620996e-03f, +2.325716381e-03f, +2.396464998e-03f, +1.367010098e-03f, -1.970645351e-04f, -1.509484792e-03f, -1.983398884e-03f, -1.509005084e-03f, -4.510088204e-04f, +6.016404427e-04f, +1.166897134e-03f, +1.091612204e-03f, +5.628191870e-04f, -5.979698620e-05f, -4.648561908e-04f, -5.331217223e-04f, -3.443344526e-04f, -7.750898066e-05f, +1.123170193e-04f, +1.661758416e-04f, +1.173721915e-04f, +3.823904117e-05f, -1.527753494e-05f, -2.800936709e-05f, + /* 3, 6 (48) */ + +3.315947804e-04f, +2.557720562e-04f, -2.038862651e-04f, -1.075016825e-03f, -2.103685473e-03f, -2.737044836e-03f, -2.287227392e-03f, -2.665248864e-04f, +3.220249550e-03f, +7.219367816e-03f, +1.000339133e-02f, +9.574462859e-03f, +4.512670262e-03f, -5.105849977e-03f, -1.711147525e-02f, -2.731980385e-02f, -3.044014407e-02f, -2.165564052e-02f, +1.588287136e-03f, +3.821722934e-02f, +8.315093457e-02f, +1.281902919e-01f, +1.640091812e-01f, +1.826799183e-01f, +1.799323240e-01f, +1.564000682e-01f, +1.174346076e-01f, +7.154966467e-02f, +2.801834392e-02f, -5.589382368e-03f, -2.516176673e-02f, -3.061329892e-02f, -2.521980720e-02f, -1.408633298e-02f, -2.354751235e-03f, +6.241368035e-03f, +1.007952237e-02f, +9.533082787e-03f, +6.256023287e-03f, +2.247999834e-03f, -9.266623627e-04f, -2.535135775e-03f, -2.653758147e-03f, -1.857716868e-03f, -8.270010821e-04f, -4.742132272e-05f, +3.050759185e-04f, +3.105317277e-04f, + -6.242388136e-04f, -9.380241521e-04f, -5.436727276e-04f, +1.050277901e-03f, +3.581509622e-03f, +5.658962910e-03f, +5.177196595e-03f, +6.217617216e-04f, -7.358849707e-03f, -1.526258854e-02f, -1.787125960e-02f, -1.112892671e-02f, +4.664594100e-03f, +2.348494782e-02f, +3.554996249e-02f, +3.225770044e-02f, +1.164178968e-02f, -1.900386645e-02f, -4.552640766e-02f, -5.374798947e-02f, -3.729825146e-02f, -1.956255983e-03f, +3.637350828e-02f, +5.940386586e-02f, +5.589265961e-02f, +2.756317198e-02f, -1.180791542e-02f, -4.362046669e-02f, -5.395095548e-02f, -4.013607527e-02f, -1.111229506e-02f, +1.817576022e-02f, +3.478198680e-02f, +3.371348080e-02f, +1.900606147e-02f, +1.049357040e-04f, -1.377245694e-02f, -1.799005142e-02f, -1.357256955e-02f, -5.188687040e-03f, +2.155941804e-03f, +5.646313098e-03f, +5.294801400e-03f, +2.918020982e-03f, +5.351965681e-04f, -7.434502560e-04f, -8.996769549e-04f, -5.114588003e-04f, + -4.201705979e-06f, +1.455657929e-05f, +4.171487722e-05f, +6.332821795e-05f, +5.966583346e-05f, +1.480872188e-05f, -7.128169313e-05f, -1.743289664e-04f, -2.472991710e-04f, -2.351049243e-04f, -9.968610268e-05f, +1.535615665e-04f, +4.604900653e-04f, +7.047293621e-04f, +7.493831600e-04f, +4.866283813e-04f, -1.115728219e-04f, -9.623428273e-04f, -1.876633085e-03f, -2.604131718e-03f, -2.907189572e-03f, -2.639907083e-03f, -1.804107560e-03f, -5.603102941e-04f, +8.128518704e-04f, +1.998731146e-03f, +2.735632550e-03f, +2.891200247e-03f, +2.493700993e-03f, +1.711565276e-03f, +7.910745906e-04f, -2.392257303e-05f, -5.620156431e-04f, -7.619910206e-04f, -6.700813706e-04f, -4.036713219e-04f, -9.922972144e-05f, +1.349768817e-04f, +2.460804233e-04f, +2.385075365e-04f, +1.556458342e-04f, +5.276002987e-05f, -2.666170461e-05f, -6.315656259e-05f, -6.058749407e-05f, -3.650476181e-05f, -1.013473749e-05f, +6.277731151e-06f, + +2.808438836e-05f, +5.828718348e-06f, -5.715832945e-05f, -1.353112227e-04f, -1.647981405e-04f, -7.715795035e-05f, +1.416923013e-04f, +4.062904505e-04f, +5.459665106e-04f, +3.943431627e-04f, -8.498817533e-05f, -7.186448143e-04f, -1.164927174e-03f, -1.086160006e-03f, -3.699329842e-04f, +7.386236059e-04f, +1.702942683e-03f, +1.958724338e-03f, +1.243968472e-03f, -2.007522737e-04f, -1.703604432e-03f, -2.493513154e-03f, -2.119896241e-03f, -7.193722573e-04f, +1.034465965e-03f, +2.280914348e-03f, +2.427647501e-03f, +1.454873583e-03f, -9.870454600e-05f, -1.448015545e-03f, -1.983116330e-03f, -1.561356583e-03f, -5.232002321e-04f, +5.465179258e-04f, +1.150655407e-03f, +1.112880096e-03f, +6.025344230e-04f, -2.482737724e-05f, -4.492946910e-04f, -5.379838352e-04f, -3.603849945e-04f, -9.312586483e-05f, +1.043664581e-04f, +1.664924659e-04f, +1.220709847e-04f, +4.282064965e-05f, -1.317282348e-05f, -2.819160034e-05f, + /* 3, 7 (48) */ + +3.273930744e-04f, +2.703286355e-04f, -1.621713879e-04f, -1.011688607e-03f, -2.044019640e-03f, -2.722236114e-03f, -2.358509085e-03f, -4.408538528e-04f, +2.972950379e-03f, +6.984262892e-03f, +9.903705225e-03f, +9.728024426e-03f, +4.973160327e-03f, -4.401120615e-03f, -1.636209209e-02f, -2.683317547e-02f, -3.055171689e-02f, -2.261798335e-02f, -2.883459489e-04f, +3.561309763e-02f, +8.024374500e-02f, +1.255503848e-01f, +1.622050736e-01f, +1.821196081e-01f, +1.807451759e-01f, +1.583987993e-01f, +1.201702402e-01f, +7.444086492e-02f, +3.051204491e-02f, -3.877817092e-03f, -2.437069214e-02f, -3.063722149e-02f, -2.578182284e-02f, -1.484832400e-02f, -3.024832606e-03f, +5.837696713e-03f, +9.980292652e-03f, +9.668059669e-03f, +6.502103710e-03f, +2.486507371e-03f, -7.710165285e-04f, -2.482375745e-03f, -2.680419852e-03f, -1.920873431e-03f, -8.875885761e-04f, -8.392608453e-05f, +2.949411810e-04f, +3.168094589e-04f, + -5.961544252e-04f, -9.321954338e-04f, -6.008310570e-04f, +9.149666782e-04f, +3.416711482e-03f, +5.581804959e-03f, +5.318888896e-03f, +1.028052172e-03f, -6.812883197e-03f, -1.486824537e-02f, -1.795624778e-02f, -1.184757153e-02f, +3.499666927e-03f, +2.239878781e-02f, +3.518002950e-02f, +3.299632404e-02f, +1.334473237e-02f, -1.704514211e-02f, -4.428243918e-02f, -5.394874174e-02f, -3.900185590e-02f, -4.449769137e-03f, +3.425361204e-02f, +5.868449360e-02f, +5.692712557e-02f, +2.984408633e-02f, -9.380267921e-03f, -4.216559311e-02f, -5.404966003e-02f, -4.158409081e-02f, -1.309541139e-02f, +1.661440363e-02f, +3.425878657e-02f, +3.425999873e-02f, +2.015671688e-02f, +1.217815800e-03f, -1.316992252e-02f, -1.801487879e-02f, -1.402186424e-02f, -5.726670876e-03f, +1.795556809e-03f, +5.553187233e-03f, +5.399167858e-03f, +3.084513448e-03f, +6.572675528e-04f, -7.006296063e-04f, -9.128497784e-04f, -5.396504007e-04f, + -4.945857699e-06f, +1.304358400e-05f, +3.999173360e-05f, +6.250766044e-05f, +6.099182201e-05f, +1.893228750e-05f, -6.502170838e-05f, -1.681974456e-04f, -2.446890194e-04f, -2.392514164e-04f, -1.119398682e-04f, +1.351930717e-04f, +4.417434806e-04f, +6.939243061e-04f, +7.547862708e-04f, +5.131112602e-04f, -6.534022092e-05f, -9.049084268e-04f, -1.822257674e-03f, -2.568940384e-03f, -2.904108821e-03f, -2.674115275e-03f, -1.870690780e-03f, -6.451129269e-04f, +7.293192398e-04f, +1.935583524e-03f, +2.706029398e-03f, +2.898771256e-03f, +2.532112331e-03f, +1.767213469e-03f, +8.478003715e-04f, +2.016437824e-05f, -5.382413675e-04f, -7.589818174e-04f, -6.823637033e-04f, -4.227929053e-04f, -1.170751551e-04f, +1.237056884e-04f, +2.429077650e-04f, +2.417539890e-04f, +1.619652302e-04f, +5.884495123e-05f, -2.288397489e-05f, -6.215438664e-05f, -6.159237027e-05f, -3.825356979e-05f, -1.156896150e-05f, +5.637757799e-06f, + +2.823513717e-05f, +8.448833148e-06f, -5.229067766e-05f, -1.310594480e-04f, -1.658191595e-04f, -8.678301235e-05f, +1.252489455e-04f, +3.914113038e-04f, +5.444424981e-04f, +4.140303935e-04f, -4.762899468e-05f, -6.805432797e-04f, -1.149612253e-03f, -1.110285526e-03f, -4.305681031e-04f, +6.671607956e-04f, +1.658454472e-03f, +1.970803397e-03f, +1.315147357e-03f, -1.004018296e-04f, -1.623353899e-03f, -2.476237130e-03f, -2.177910002e-03f, -8.261333500e-04f, +9.312346806e-04f, +2.231615706e-03f, +2.454261653e-03f, +1.540383314e-03f, +5.164610520e-07f, -1.383201013e-03f, -1.978927318e-03f, -1.611216795e-03f, -5.953017304e-04f, +4.894626724e-04f, +1.131785412e-03f, +1.132238874e-03f, +6.418077115e-04f, +1.100202104e-05f, -4.323507393e-04f, -5.417698232e-04f, -3.760933330e-04f, -1.090493913e-04f, +9.585408879e-05f, +1.663788745e-04f, +1.266396775e-04f, +4.750787164e-05f, -1.089682223e-05f, -2.826888741e-05f, + /* 3, 8 (48) */ + +3.224472167e-04f, +2.833722195e-04f, -1.221796543e-04f, -9.491809464e-04f, -1.983027818e-03f, -2.703303827e-03f, -2.423530794e-03f, -6.090512983e-04f, +2.728261360e-03f, +6.745011475e-03f, +9.791765357e-03f, +9.863217497e-03f, +5.414903808e-03f, -3.707196309e-03f, -1.560730582e-02f, -2.632006421e-02f, -3.061705711e-02f, -2.352289177e-02f, -2.110603623e-03f, +3.304415724e-02f, +7.733963617e-02f, +1.228762696e-01f, +1.603343828e-01f, +1.814744951e-01f, +1.814744951e-01f, +1.603343828e-01f, +1.228762696e-01f, +7.733963617e-02f, +3.304415724e-02f, -2.110603623e-03f, -2.352289177e-02f, -3.061705711e-02f, -2.632006421e-02f, -1.560730582e-02f, -3.707196309e-03f, +5.414903808e-03f, +9.863217497e-03f, +9.791765357e-03f, +6.745011475e-03f, +2.728261360e-03f, -6.090512983e-04f, -2.423530794e-03f, -2.703303827e-03f, -1.983027818e-03f, -9.491809464e-04f, -1.221796543e-04f, +2.833722195e-04f, +3.224472167e-04f, + -5.679192881e-04f, -9.237466006e-04f, -6.531217347e-04f, +7.839072303e-04f, +3.250892322e-03f, +5.495021947e-03f, +5.444137841e-03f, +1.419463476e-03f, -6.268440699e-03f, -1.445421498e-02f, -1.800387677e-02f, -1.252811481e-02f, +2.350054674e-03f, +2.128850229e-02f, +3.474946140e-02f, +3.366348484e-02f, +1.500318684e-02f, -1.507433871e-02f, -4.296729183e-02f, -5.404914357e-02f, -4.062520980e-02f, -6.926006268e-03f, +3.207570204e-02f, +5.785836025e-02f, +5.785836025e-02f, +3.207570204e-02f, -6.926006268e-03f, -4.062520980e-02f, -5.404914357e-02f, -4.296729183e-02f, -1.507433871e-02f, +1.500318684e-02f, +3.366348484e-02f, +3.474946140e-02f, +2.128850229e-02f, +2.350054674e-03f, -1.252811481e-02f, -1.800387677e-02f, -1.445421498e-02f, -6.268440699e-03f, +1.419463476e-03f, +5.444137841e-03f, +5.495021947e-03f, +3.250892322e-03f, +7.839072303e-04f, -6.531217347e-04f, -9.237466006e-04f, -5.679192881e-04f, + -5.637757799e-06f, +1.156896150e-05f, +3.825356979e-05f, +6.159237027e-05f, +6.215438664e-05f, +2.288397489e-05f, -5.884495123e-05f, -1.619652302e-04f, -2.417539890e-04f, -2.429077650e-04f, -1.237056884e-04f, +1.170751551e-04f, +4.227929053e-04f, +6.823637033e-04f, +7.589818174e-04f, +5.382413675e-04f, -2.016437824e-05f, -8.478003715e-04f, -1.767213469e-03f, -2.532112331e-03f, -2.898771256e-03f, -2.706029398e-03f, -1.935583524e-03f, -7.293192398e-04f, +6.451129269e-04f, +1.870690780e-03f, +2.674115275e-03f, +2.904108821e-03f, +2.568940384e-03f, +1.822257674e-03f, +9.049084268e-04f, +6.534022092e-05f, -5.131112602e-04f, -7.547862708e-04f, -6.939243061e-04f, -4.417434806e-04f, -1.351930717e-04f, +1.119398682e-04f, +2.392514164e-04f, +2.446890194e-04f, +1.681974456e-04f, +6.502170838e-05f, -1.893228750e-05f, -6.099182201e-05f, -6.250766044e-05f, -3.999173360e-05f, -1.304358400e-05f, +4.945857699e-06f, + +2.826888741e-05f, +1.089682223e-05f, -4.750787164e-05f, -1.266396775e-04f, -1.663788745e-04f, -9.585408879e-05f, +1.090493913e-04f, +3.760933330e-04f, +5.417698232e-04f, +4.323507393e-04f, -1.100202104e-05f, -6.418077115e-04f, -1.132238874e-03f, -1.131785412e-03f, -4.894626724e-04f, +5.953017304e-04f, +1.611216795e-03f, +1.978927318e-03f, +1.383201013e-03f, -5.164610520e-07f, -1.540383314e-03f, -2.454261653e-03f, -2.231615706e-03f, -9.312346806e-04f, +8.261333500e-04f, +2.177910002e-03f, +2.476237130e-03f, +1.623353899e-03f, +1.004018296e-04f, -1.315147357e-03f, -1.970803397e-03f, -1.658454472e-03f, -6.671607956e-04f, +4.305681031e-04f, +1.110285526e-03f, +1.149612253e-03f, +6.805432797e-04f, +4.762899468e-05f, -4.140303935e-04f, -5.444424981e-04f, -3.914113038e-04f, -1.252489455e-04f, +8.678301235e-05f, +1.658191595e-04f, +1.310594480e-04f, +5.229067766e-05f, -8.448833148e-06f, -2.823513717e-05f, + /* 3, 9 (48) */ + +3.168094589e-04f, +2.949411810e-04f, -8.392608453e-05f, -8.875885761e-04f, -1.920873431e-03f, -2.680419852e-03f, -2.482375745e-03f, -7.710165285e-04f, +2.486507371e-03f, +6.502103710e-03f, +9.668059669e-03f, +9.980292652e-03f, +5.837696713e-03f, -3.024832606e-03f, -1.484832400e-02f, -2.578182284e-02f, -3.063722149e-02f, -2.437069214e-02f, -3.877817092e-03f, +3.051204491e-02f, +7.444086492e-02f, +1.201702402e-01f, +1.583987993e-01f, +1.807451759e-01f, +1.821196081e-01f, +1.622050736e-01f, +1.255503848e-01f, +8.024374500e-02f, +3.561309763e-02f, -2.883459489e-04f, -2.261798335e-02f, -3.055171689e-02f, -2.683317547e-02f, -1.636209209e-02f, -4.401120615e-03f, +4.973160327e-03f, +9.728024426e-03f, +9.903705225e-03f, +6.984262892e-03f, +2.972950379e-03f, -4.408538528e-04f, -2.358509085e-03f, -2.722236114e-03f, -2.044019640e-03f, -1.011688607e-03f, -1.621713879e-04f, +2.703286355e-04f, +3.273930744e-04f, + -5.396504007e-04f, -9.128497784e-04f, -7.006296063e-04f, +6.572675528e-04f, +3.084513448e-03f, +5.399167858e-03f, +5.553187233e-03f, +1.795556809e-03f, -5.726670876e-03f, -1.402186424e-02f, -1.801487879e-02f, -1.316992252e-02f, +1.217815800e-03f, +2.015671688e-02f, +3.425999873e-02f, +3.425878657e-02f, +1.661440363e-02f, -1.309541139e-02f, -4.158409081e-02f, -5.404966003e-02f, -4.216559311e-02f, -9.380267921e-03f, +2.984408633e-02f, +5.692712557e-02f, +5.868449360e-02f, +3.425361204e-02f, -4.449769137e-03f, -3.900185590e-02f, -5.394874174e-02f, -4.428243918e-02f, -1.704514211e-02f, +1.334473237e-02f, +3.299632404e-02f, +3.518002950e-02f, +2.239878781e-02f, +3.499666927e-03f, -1.184757153e-02f, -1.795624778e-02f, -1.486824537e-02f, -6.812883197e-03f, +1.028052172e-03f, +5.318888896e-03f, +5.581804959e-03f, +3.416711482e-03f, +9.149666782e-04f, -6.008310570e-04f, -9.321954338e-04f, -5.961544252e-04f, + -6.277731151e-06f, +1.013473749e-05f, +3.650476181e-05f, +6.058749407e-05f, +6.315656259e-05f, +2.666170461e-05f, -5.276002987e-05f, -1.556458342e-04f, -2.385075365e-04f, -2.460804233e-04f, -1.349768817e-04f, +9.922972144e-05f, +4.036713219e-04f, +6.700813706e-04f, +7.619910206e-04f, +5.620156431e-04f, +2.392257303e-05f, -7.910745906e-04f, -1.711565276e-03f, -2.493700993e-03f, -2.891200247e-03f, -2.735632550e-03f, -1.998731146e-03f, -8.128518704e-04f, +5.603102941e-04f, +1.804107560e-03f, +2.639907083e-03f, +2.907189572e-03f, +2.604131718e-03f, +1.876633085e-03f, +9.623428273e-04f, +1.115728219e-04f, -4.866283813e-04f, -7.493831600e-04f, -7.047293621e-04f, -4.604900653e-04f, -1.535615665e-04f, +9.968610268e-05f, +2.351049243e-04f, +2.472991710e-04f, +1.743289664e-04f, +7.128169313e-05f, -1.480872188e-05f, -5.966583346e-05f, -6.332821795e-05f, -4.171487722e-05f, -1.455657929e-05f, +4.201705979e-06f, + +2.819160034e-05f, +1.317282348e-05f, -4.282064965e-05f, -1.220709847e-04f, -1.664924659e-04f, -1.043664581e-04f, +9.312586483e-05f, +3.603849945e-04f, +5.379838352e-04f, +4.492946910e-04f, +2.482737724e-05f, -6.025344230e-04f, -1.112880096e-03f, -1.150655407e-03f, -5.465179258e-04f, +5.232002321e-04f, +1.561356583e-03f, +1.983116330e-03f, +1.448015545e-03f, +9.870454600e-05f, -1.454873583e-03f, -2.427647501e-03f, -2.280914348e-03f, -1.034465965e-03f, +7.193722573e-04f, +2.119896241e-03f, +2.493513154e-03f, +1.703604432e-03f, +2.007522737e-04f, -1.243968472e-03f, -1.958724338e-03f, -1.702942683e-03f, -7.386236059e-04f, +3.699329842e-04f, +1.086160006e-03f, +1.164927174e-03f, +7.186448143e-04f, +8.498817533e-05f, -3.943431627e-04f, -5.459665106e-04f, -4.062904505e-04f, -1.416923013e-04f, +7.715795035e-05f, +1.647981405e-04f, +1.353112227e-04f, +5.715832945e-05f, -5.828718348e-06f, -2.808438836e-05f, + /* 3,10 (48) */ + +3.105317277e-04f, +3.050759185e-04f, -4.742132272e-05f, -8.270010821e-04f, -1.857716868e-03f, -2.653758147e-03f, -2.535135775e-03f, -9.266623627e-04f, +2.247999834e-03f, +6.256023287e-03f, +9.533082787e-03f, +1.007952237e-02f, +6.241368035e-03f, -2.354751235e-03f, -1.408633298e-02f, -2.521980720e-02f, -3.061329892e-02f, -2.516176673e-02f, -5.589382368e-03f, +2.801834392e-02f, +7.154966467e-02f, +1.174346076e-01f, +1.564000682e-01f, +1.799323240e-01f, +1.826799183e-01f, +1.640091812e-01f, +1.281902919e-01f, +8.315093457e-02f, +3.821722934e-02f, +1.588287136e-03f, -2.165564052e-02f, -3.044014407e-02f, -2.731980385e-02f, -1.711147525e-02f, -5.105849977e-03f, +4.512670262e-03f, +9.574462859e-03f, +1.000339133e-02f, +7.219367816e-03f, +3.220249550e-03f, -2.665248864e-04f, -2.287227392e-03f, -2.737044836e-03f, -2.103685473e-03f, -1.075016825e-03f, -2.038862651e-04f, +2.557720562e-04f, +3.315947804e-04f, + -5.114588003e-04f, -8.996769549e-04f, -7.434502560e-04f, +5.351965681e-04f, +2.918020982e-03f, +5.294801400e-03f, +5.646313098e-03f, +2.155941804e-03f, -5.188687040e-03f, -1.357256955e-02f, -1.799005142e-02f, -1.377245694e-02f, +1.049357040e-04f, +1.900606147e-02f, +3.371348080e-02f, +3.478198680e-02f, +1.817576022e-02f, -1.111229506e-02f, -4.013607527e-02f, -5.395095548e-02f, -4.362046669e-02f, -1.180791542e-02f, +2.756317198e-02f, +5.589265961e-02f, +5.940386586e-02f, +3.637350828e-02f, -1.956255983e-03f, -3.729825146e-02f, -5.374798947e-02f, -4.552640766e-02f, -1.900386645e-02f, +1.164178968e-02f, +3.225770044e-02f, +3.554996249e-02f, +2.348494782e-02f, +4.664594100e-03f, -1.112892671e-02f, -1.787125960e-02f, -1.526258854e-02f, -7.358849707e-03f, +6.217617216e-04f, +5.177196595e-03f, +5.658962910e-03f, +3.581509622e-03f, +1.050277901e-03f, -5.436727276e-04f, -9.380241521e-04f, -6.242388136e-04f, + -6.866220693e-06f, +8.742775860e-06f, +3.474956812e-05f, +5.949820540e-05f, +6.400161198e-05f, +3.026378360e-05f, -4.677515583e-05f, -1.492525790e-04f, -2.349633169e-04f, -2.487764871e-04f, -1.457477053e-04f, +8.167777557e-05f, +3.844112664e-04f, +6.571114549e-04f, +7.638362764e-04f, +5.844327786e-04f, +6.689027310e-05f, -7.347858775e-04f, -1.655377914e-03f, -2.453761118e-03f, -2.881421461e-03f, -2.762910412e-03f, -2.060081029e-03f, -8.956342544e-04f, +4.749894117e-04f, +1.735890485e-03f, +2.603424299e-03f, +2.907992474e-03f, +2.637634286e-03f, +1.930274992e-03f, +1.020046567e-03f, +1.588282957e-04f, -4.587975622e-04f, -7.427524870e-04f, -7.147454391e-04f, -4.789992715e-04f, -1.721578512e-04f, +8.695202101e-05f, +2.304625031e-04f, +2.495712134e-04f, +1.803461058e-04f, +7.761590678e-05f, -1.051574984e-05f, -5.817362492e-05f, -6.404893482e-05f, -4.341851334e-05f, -1.610575965e-05f, +3.405100316e-06f, + +2.800936709e-05f, +1.527753494e-05f, -3.823904117e-05f, -1.173721915e-04f, -1.661758416e-04f, -1.123170193e-04f, +7.750898066e-05f, +3.443344526e-04f, +5.331217223e-04f, +4.648561908e-04f, +5.979698620e-05f, -5.628191870e-04f, -1.091612204e-03f, -1.166897134e-03f, -6.016404427e-04f, +4.510088204e-04f, +1.509005084e-03f, +1.983398884e-03f, +1.509484792e-03f, +1.970645351e-04f, -1.367010098e-03f, -2.396464998e-03f, -2.325716381e-03f, -1.135620996e-03f, +6.111653058e-04f, +2.057682689e-03f, +2.506038658e-03f, +1.780958912e-03f, +3.013663031e-04f, -1.169785795e-03f, -1.942678244e-03f, -1.744559142e-03f, -8.095353725e-04f, +3.076612684e-04f, +1.059419058e-03f, +1.178114037e-03f, +7.560156839e-04f, +1.230111396e-04f, -3.733020566e-04f, -5.463084825e-04f, -4.206821447e-04f, -1.583456646e-04f, +6.698527863e-05f, +1.633014308e-04f, +1.393757265e-04f, +6.209938901e-05f, -3.036922064e-06f, -2.781083669e-05f, + /* 3,11 (48) */ + +3.036655070e-04f, +3.138186943e-04f, -1.267175460e-05f, -7.675028767e-04f, -1.793715256e-03f, -2.623494363e-03f, -2.581910930e-03f, -1.075914942e-03f, +2.013036517e-03f, +6.007246800e-03f, +9.387335081e-03f, +1.016120015e-02f, +6.625779301e-03f, -1.697639780e-03f, -1.332249670e-02f, -2.463537442e-02f, -3.054640865e-02f, -2.589655261e-02f, -7.244760282e-03f, +2.556458280e-02f, +6.866824321e-02f, +1.146716972e-01f, +1.543399871e-01f, +1.790366898e-01f, +1.831549078e-01f, +1.657450717e-01f, +1.307937162e-01f, +8.605892704e-02f, +4.085486363e-02f, +3.518562128e-03f, -2.063559395e-02f, -3.028131578e-02f, -2.777860141e-02f, -1.785422774e-02f, -5.820595416e-03f, +4.033670990e-03f, +9.402305008e-03f, +1.009034335e-02f, +7.449830319e-03f, +3.469820763e-03f, -8.617878055e-05f, -2.209611485e-03f, -2.747560586e-03f, -2.161859098e-03f, -1.139065760e-03f, -2.473047785e-04f, +2.396662965e-04f, +3.349998807e-04f, + -4.834494332e-04f, -8.843994200e-04f, -7.816892972e-04f, +4.178243766e-04f, +2.751845140e-03f, +5.182484381e-03f, +5.723822078e-03f, +2.500276256e-03f, -4.655565318e-03f, -1.310771336e-02f, -1.793025443e-02f, -1.433527613e-02f, -9.866765005e-04f, +1.783916434e-02f, +3.311184036e-02f, +3.523299562e-02f, +1.968476530e-02f, -9.128896180e-03f, -3.862659048e-02f, -5.375389095e-02f, -4.498747679e-02f, -1.420438042e-02f, +2.523745560e-02f, +5.475703861e-02f, +6.001503116e-02f, +3.843119097e-02f, +5.497826750e-04f, -3.551729255e-02f, -5.344662316e-02f, -4.669619345e-02f, -2.094654469e-02f, +9.897230542e-03f, +3.144816507e-02f, +3.585762376e-02f, +2.454436688e-02f, +5.842708137e-03f, -1.037291103e-02f, -1.774824846e-02f, -1.563589059e-02f, -7.905158190e-03f, +2.010795769e-04f, +5.018850930e-03f, +5.725948188e-03f, +3.744811053e-03f, +1.189653627e-03f, -4.815733386e-04f, -9.410610742e-04f, -6.520496503e-04f, + -7.403782787e-06f, +7.394779215e-06f, +3.299212377e-05f, +5.832969341e-05f, +6.469301128e-05f, +3.368889852e-05f, -4.089813856e-05f, -1.427985743e-04f, -2.311351558e-04f, -2.510036692e-04f, -1.560133449e-04f, +6.443940815e-05f, +3.650447888e-04f, +6.434883797e-04f, +7.645411078e-04f, +6.054931951e-04f, +1.087101536e-04f, -6.789878318e-04f, -1.598716139e-03f, -2.412348689e-03f, -2.869462815e-03f, -2.787851257e-03f, -2.119582649e-03f, -9.775907166e-04f, +3.892289646e-04f, +1.666098084e-03f, +2.564688960e-03f, +2.906498868e-03f, +2.669397502e-03f, +1.983118864e-03f, +1.077961627e-03f, +2.070710274e-04f, -4.296254235e-04f, -7.348755228e-04f, -7.239395436e-04f, -4.972373481e-04f, -1.909582720e-04f, +7.374620772e-05f, +2.253190591e-04f, +2.514921708e-04f, +1.862350249e-04f, +8.401496727e-05f, -6.056241004e-06f, -5.651265163e-05f, -6.466475356e-05f, -4.509804999e-05f, -1.768877557e-05f, +2.555965243e-06f, + +2.772838204e-05f, +1.721219165e-05f, -3.377236041e-05f, -1.125618207e-04f, -1.654455694e-04f, -1.197042549e-04f, +6.222770278e-05f, +3.279894630e-04f, +5.272223775e-04f, +4.790325759e-04f, +9.384783611e-05f, -5.227570188e-04f, -1.068514493e-03f, -1.180518003e-03f, -6.547422921e-04f, +3.788783831e-04f, +1.454297523e-03f, +1.979811515e-03f, +1.567510509e-03f, +2.943698963e-04f, -1.276982314e-03f, -2.360793830e-03f, -2.365941895e-03f, -1.234498089e-03f, +5.017295534e-04f, +1.991386654e-03f, +2.513772428e-03f, +1.855246655e-03f, +4.020406563e-04f, -1.092728083e-03f, -1.922661652e-03f, -1.783186529e-03f, -8.797406818e-04f, +2.438619218e-04f, +1.030078903e-03f, +1.189106918e-03f, +7.925591648e-04f, +1.616265181e-04f, -3.509236252e-04f, -5.454371371e-04f, -4.345377090e-04f, -1.751737233e-04f, +5.627305695e-05f, +1.613155044e-04f, +1.432335341e-04f, +6.710173023e-05f, -7.449142443e-08f, -2.740886232e-05f, + /* 3,12 (48) */ + +2.962617242e-04f, +3.212134736e-04f, +2.032036918e-05f, -7.091731833e-04f, -1.729022245e-03f, -2.589805465e-03f, -2.622809069e-03f, -1.218713516e-03f, +1.781901362e-03f, +5.756243131e-03f, +9.231321737e-03f, +1.022563956e-02f, +6.990824090e-03f, -1.054151401e-03f, -1.255795560e-02f, -2.402988123e-02f, -3.043769849e-02f, -2.657554044e-02f, -8.843476421e-03f, +2.315223411e-02f, +6.579878040e-02f, +1.118838460e-01f, +1.522204045e-01f, +1.780590990e-01f, +1.835441367e-01f, +1.674111697e-01f, +1.333584052e-01f, +8.896542591e-02f, +4.352426113e-02f, +5.501680991e-03f, -1.955763232e-02f, -3.007424475e-02f, -2.820822684e-02f, -1.858910326e-02f, -6.544534960e-03f, +3.536433642e-03f, +9.211346736e-03f, +1.016408956e-02f, +7.675149378e-03f, +3.721312934e-03f, +1.000562444e-04f, -2.125596518e-03f, -2.753616827e-03f, -2.218371750e-03f, -1.203730513e-03f, -2.924028285e-04f, +2.219775210e-04f, +3.375558459e-04f, + -4.557210512e-04f, -8.671872283e-04f, -8.154616576e-04f, +3.052625560e-04f, +2.586399571e-03f, +5.062780126e-03f, +5.786049781e-03f, +2.828265719e-03f, -4.128342940e-03f, -1.262868078e-02f, -1.783640660e-02f, -1.485803315e-02f, -2.055190993e-03f, +1.665864633e-02f, +3.245709807e-02f, +3.561187401e-02f, +2.113906282e-02f, -7.149084665e-03f, -3.705907997e-02f, -5.345952105e-02f, -4.626445911e-02f, -1.656517425e-02f, +2.287151370e-02f, +5.352254052e-02f, +6.051676072e-02f, +4.042257762e-02f, +3.063555103e-03f, -3.366204590e-02f, -5.304458251e-02f, -4.778892153e-02f, -2.286920634e-02f, +8.114044013e-03f, +3.056842438e-02f, +3.610148568e-02f, +2.557444578e-02f, +7.031815056e-03f, -9.580351865e-03f, -1.758662195e-02f, -1.598681422e-02f, -8.450595327e-03f, -2.334581321e-04f, +4.843677207e-03f, +5.782221245e-03f, +3.906126557e-03f, +1.332887162e-03f, -4.144716084e-04f, -9.411355656e-04f, -6.794585126e-04f, + -7.891082444e-06f, +6.092289786e-06f, +3.123643501e-05f, +5.708715158e-05f, +6.523443877e-05f, +3.693610856e-05f, -3.513638102e-05f, -1.362966996e-04f, -2.270370214e-04f, -2.527702729e-04f, -1.657699032e-04f, +4.753378261e-05f, +3.456034145e-04f, +6.292467916e-04f, +7.641301153e-04f, +6.251990193e-04f, +1.493554528e-04f, -6.237328043e-04f, -1.541644556e-03f, -2.369520845e-03f, -2.855354432e-03f, -2.810445952e-03f, -2.177187626e-03f, -1.058646560e-03f, +3.031081595e-04f, +1.594790730e-03f, +2.523725649e-03f, +2.902692508e-03f, +2.699372312e-03f, +2.035100429e-03f, +1.136029036e-03f, +2.562636991e-04f, -3.991203899e-04f, -7.257348527e-04f, -7.322791757e-04f, -5.151702243e-04f, -2.099383286e-04f, +6.007820864e-05f, +2.196702144e-04f, +2.530493507e-04f, +1.919817537e-04f, +9.046911708e-05f, -1.433467579e-06f, -5.468063210e-05f, -6.517067925e-05f, -4.674879763e-05f, -1.930311625e-05f, +1.654356283e-06f, + +2.735491682e-05f, +1.897854157e-05f, -2.942920216e-05f, -1.076580508e-04f, -1.643188099e-04f, -1.265281901e-04f, +4.730931145e-05f, +3.113972596e-04f, +5.203262624e-04f, +4.918245151e-04f, +1.269242815e-04f, -4.824419647e-04f, -1.043669022e-03f, -1.191531114e-03f, -7.057411623e-04f, +3.069578549e-04f, +1.397372766e-03f, +1.972398693e-03f, +1.622002527e-03f, +3.904304742e-04f, -1.184983313e-03f, -2.320722836e-03f, -2.401520771e-03f, -1.330900520e-03f, +3.912847393e-04f, +1.921134244e-03f, +2.516683224e-03f, +1.926302692e-03f, +5.025707398e-04f, -1.012931182e-03f, -1.898679610e-03f, -1.818712806e-03f, -9.490838417e-04f, +1.786487368e-04f, +9.981618200e-04f, +1.197843781e-03f, +8.281786720e-04f, +2.007601133e-04f, -3.272279914e-04f, -5.433234257e-04f, -4.478085433e-04f, -1.921397021e-04f, +4.503105467e-05f, +1.588277613e-04f, +1.468651244e-04f, +7.215255303e-05f, +3.056904113e-06f, -2.687305772e-05f, + /* 3,13 (48) */ + +2.883706418e-04f, +3.273057633e-04f, +5.155680418e-05f, -6.520860317e-04f, -1.663787806e-03f, -2.552869356e-03f, -2.657945450e-03f, -1.355010216e-03f, +1.554864340e-03f, +5.503472858e-03f, +9.065551833e-03f, +1.027317334e-02f, +7.336427504e-03f, -4.249046089e-04f, -1.179382548e-02f, -2.340468221e-02f, -3.028834304e-02f, -2.719927325e-02f, -1.038512098e-02f, +2.078271327e-02f, +6.294342596e-02f, +1.090734000e-01f, +1.500432169e-01f, +1.770004525e-01f, +1.838472449e-01f, +1.690059605e-01f, +1.358821308e-01f, +9.186811842e-02f, +4.622363344e-02f, +7.536781420e-03f, -1.842160329e-02f, -2.981798105e-02f, -2.860734723e-02f, -1.931483811e-02f, -7.276814136e-03f, +3.021263418e-03f, +9.001408407e-03f, +1.022416777e-02f, +7.894819592e-03f, +3.974362285e-03f, +2.920379980e-04f, -2.035127401e-03f, -2.755050294e-03f, -2.273052382e-03f, -1.268901192e-03f, -3.391516261e-04f, +2.026744047e-04f, +3.392102022e-04f, + -4.283661344e-04f, -8.482086868e-04f, -8.448908597e-04f, +1.976045052e-04f, +2.422080761e-03f, +4.936251936e-03f, +5.833359092e-03f, +3.139662979e-03f, -3.608016678e-03f, -1.213685627e-02f, -1.770948231e-02f, -1.534047511e-02f, -3.098860015e-03f, +1.546711522e-02f, +3.175135691e-02f, +3.591883186e-02f, +2.253643559e-02f, -5.176685972e-03f, -3.543707744e-02f, -5.306909058e-02f, -4.744944242e-02f, -1.888589709e-02f, +2.046999293e-02f, +5.219164000e-02f, +6.090804546e-02f, +4.234371187e-02f, +5.580238328e-03f, -3.173574321e-02f, -5.254201177e-02f, -4.880185272e-02f, -2.476788595e-02f, +6.295331207e-03f, +2.961934054e-02f, +3.628013442e-02f, +2.657260760e-02f, +8.229658837e-03f, -8.752173193e-03f, -1.738586183e-02f, -1.631404221e-02f, -8.993918753e-03f, -6.812666753e-04f, +4.651537505e-03f, +5.827252300e-03f, +4.064954319e-03f, +1.479752286e-03f, -3.423190553e-04f, -9.380786615e-04f, -7.063315703e-04f, + -8.328888420e-06f, +4.836690636e-06f, +2.948637421e-05f, +5.577576691e-05f, +6.562976180e-05f, +4.000483767e-05f, -2.949687597e-05f, -1.297595871e-04f, -2.226829976e-04f, -2.540851657e-04f, -1.750143867e-04f, +3.097912402e-05f, +3.261181077e-04f, +6.144215072e-04f, +7.626289262e-04f, +6.435540565e-04f, +1.888012286e-04f, -5.690718432e-04f, -1.484227549e-03f, -2.325335806e-03f, -2.839128589e-03f, -2.830687958e-03f, -2.232849779e-03f, -1.138728152e-03f, +2.167066311e-04f, +1.522030573e-03f, +2.480561472e-03f, +2.896559589e-03f, +2.727511272e-03f, +2.086155759e-03f, +1.194188938e-03f, +3.063673185e-04f, -3.672927030e-04f, -7.153144195e-04f, -7.397323830e-04f, -5.327635541e-04f, -2.290726963e-04f, +4.595853568e-05f, +2.135123302e-04f, +2.542303720e-04f, +1.975722132e-04f, +9.696823219e-05f, +3.348891556e-06f, -5.267555978e-05f, -6.556179178e-05f, -4.836597661e-05f, -2.094611058e-05f, +7.004638822e-07f, + +2.689529487e-05f, +2.057882056e-05f, -2.521744019e-05f, -1.026786732e-04f, -1.628132499e-04f, -1.327903489e-04f, +3.277937540e-05f, +2.946044465e-04f, +5.124752704e-04f, +5.032359372e-04f, +1.589740718e-04f, -4.419668961e-04f, -1.017160390e-03f, -1.199955147e-03f, -7.545604759e-04f, +2.353939035e-04f, +1.338372963e-03f, +1.961212656e-03f, +1.672878888e-03f, +4.850599651e-04f, -1.091209358e-03f, -2.276349786e-03f, -2.432392809e-03f, -1.424636953e-03f, +2.800528054e-04f, +1.847060106e-03f, +2.514749879e-03f, +1.993968156e-03f, +6.027510728e-04f, -9.305377716e-04f, -1.870745738e-03f, -1.851031519e-03f, -1.017409233e-03f, +1.121401310e-04f, +9.636961824e-04f, +1.204266684e-03f, +8.627779927e-04f, +2.403350278e-04f, -3.022388744e-04f, -5.399406518e-04f, -4.604462536e-04f, -2.092054228e-04f, +3.327077228e-05f, +1.558265929e-04f, +1.502509361e-04f, +7.723840020e-05f, +6.354954773e-06f, -2.619825575e-05f, + /* 3,14 (48) */ + +2.800417534e-04f, +3.321424540e-04f, +8.104317839e-05f, -5.963102648e-04f, -1.598158045e-03f, -2.512864519e-03f, -2.687442326e-03f, -1.484769803e-03f, +1.332181343e-03f, +5.249387692e-03f, +8.890537447e-03f, +1.030415246e-02f, +7.662545612e-03f, +1.895168983e-04f, -1.103119655e-02f, -2.276112815e-02f, -3.009954181e-02f, -2.776834509e-02f, -1.186934853e-02f, +1.845737746e-02f, +6.010429737e-02f, +1.062427120e-01f, +1.478103671e-01f, +1.758617243e-01f, +1.840639515e-01f, +1.705279911e-01f, +1.383626923e-01f, +9.476467801e-02f, +4.895114472e-02f, +9.622937179e-03f, -1.722741435e-02f, -2.951161373e-02f, -2.897463993e-02f, -2.003015253e-02f, -8.016546519e-03f, +2.488499864e-03f, +8.772335711e-03f, +1.027012630e-02f, +8.108331923e-03f, +4.228592657e-03f, +4.896102112e-04f, -1.938159169e-03f, -2.751701403e-03f, -2.325727942e-03f, -1.334462984e-03f, -3.875176027e-04f, +1.817282941e-04f, +3.399106661e-04f, + -4.014708395e-04f, -8.276298662e-04f, -8.701082999e-04f, +9.492583196e-05f, +2.259267511e-03f, +4.803461587e-03f, +5.866138468e-03f, +3.434267425e-03f, -3.095541408e-03f, -1.163362033e-02f, -1.755050824e-02f, -1.578244201e-02f, -4.116020405e-03f, +1.426716007e-02f, +3.099679643e-02f, +3.615422576e-02f, +2.387480855e-02f, -3.215473316e-03f, -3.376419855e-02f, -5.258403061e-02f, -4.854065178e-02f, -2.116224687e-02f, +1.803760013e-02f, +5.076700305e-02f, +6.118809826e-02f, +4.419077197e-02f, +8.094988206e-03f, -2.974177505e-02f, -5.193926069e-02f, -4.973239049e-02f, -2.663863169e-02f, +4.444299688e-03f, +2.860193131e-02f, +3.639227455e-02f, +2.753630378e-02f, +9.433925520e-03f, -7.889395200e-03f, -1.714552680e-02f, -1.661628108e-02f, -9.533859405e-03f, -1.141712929e-03f, +4.442332082e-03f, +5.860523072e-03f, +4.220780912e-03f, +1.630003222e-03f, -2.650806551e-04f, -9.317237067e-04f, -7.325298261e-04f, + -8.718068193e-06f, +3.629207216e-06f, +2.774567533e-05f, +5.440070923e-05f, +6.588302403e-05f, +4.289486633e-05f, -2.398620325e-05f, -1.231996048e-04f, -2.180872571e-04f, -2.549577521e-04f, -1.837446921e-04f, +1.479270955e-05f, +3.066192357e-04f, +5.990474603e-04f, +7.600641439e-04f, +6.605637628e-04f, +2.270243687e-04f, -5.150546432e-04f, -1.426529195e-03f, -2.279852789e-03f, -2.820819667e-03f, -2.848573324e-03f, -2.286525170e-03f, -1.217763015e-03f, +1.301043476e-04f, +1.447881465e-03f, +2.435226036e-03f, +2.888088780e-03f, +2.753768608e-03f, +2.136221350e-03f, +1.252380659e-03f, +3.573412500e-04f, -3.341544321e-04f, -7.035995661e-04f, -7.462678156e-04f, -5.499827626e-04f, -2.483352481e-04f, +3.139866995e-05f, +2.068425282e-04f, +2.550231936e-04f, +2.029922384e-04f, +1.035018317e-04f, +8.286747443e-06f, -5.049571450e-05f, -6.583325824e-05f, -4.994472502e-05f, -2.261492841e-05f, -3.053828783e-07f, + +2.635586685e-05f, +2.201572656e-05f, -2.114422789e-05f, -9.764105202e-05f, -1.609470350e-04f, -1.384937071e-04f, +1.866172927e-05f, +2.776568924e-04f, +5.037125890e-04f, +5.132739533e-04f, +1.899484114e-04f, -4.014233099e-04f, -9.890754911e-04f, -1.205814231e-03f, -8.011294892e-04f, +1.643306246e-04f, +1.277443204e-03f, +1.946313220e-03f, +1.720065970e-03f, +5.780763036e-04f, -9.958594564e-04f, -2.227781133e-03f, -2.458507842e-03f, -1.515521846e-03f, +1.682574121e-04f, +1.769307145e-03f, +2.507961371e-03f, +2.058090656e-03f, +7.023757360e-04f, -8.456970987e-04f, -1.838882264e-03f, -1.880042092e-03f, -1.084561664e-03f, +4.445893301e-05f, +9.267164761e-04f, +1.208321983e-03f, +8.962615228e-04f, +2.802718001e-04f, -2.759836047e-04f, -5.352645915e-04f, -4.724027832e-04f, -2.263313703e-04f, +2.100545850e-05f, +1.523014450e-04f, +1.533714251e-04f, +8.234517685e-05f, +9.816694012e-06f, -2.537955790e-05f, + /* 3,15 (48) */ + +2.713236852e-04f, +3.357716612e-04f, +1.087888537e-04f, -5.419095556e-04f, -1.532275021e-03f, -2.469969652e-03f, -2.711428529e-03f, -1.607969408e-03f, +1.114094085e-03f, +4.994429940e-03f, +8.706792755e-03f, +1.031894517e-02f, +7.969164848e-03f, +7.885643586e-04f, -1.027113241e-02f, -2.210056439e-02f, -2.987251744e-02f, -2.828339973e-02f, -1.329587772e-02f, +1.617752467e-02f, +5.728347771e-02f, +1.033941387e-01f, +1.455238419e-01f, +1.746439613e-01f, +1.841940559e-01f, +1.719758725e-01f, +1.407979183e-01f, +9.765276679e-02f, +5.170491332e-02f, +1.175915853e-02f, -1.597503369e-02f, -2.915427248e-02f, -2.930879436e-02f, -2.073375210e-02f, -8.762814334e-03f, +1.938517101e-03f, +8.524000463e-03f, +1.030152497e-02f, +8.315174451e-03f, +4.483615851e-03f, +6.926024496e-04f, -1.834657337e-03f, -2.743414655e-03f, -2.376223656e-03f, -1.400296242e-03f, -4.374623277e-04f, +1.591133657e-04f, +3.396052832e-04f, + -3.751149726e-04f, -8.056141397e-04f, -8.912525278e-04f, -2.715220056e-06f, +2.098320476e-03f, +4.664967880e-03f, +5.884800197e-03f, +3.711924318e-03f, -2.591828819e-03f, -1.112034638e-02f, -1.736055983e-02f, -1.618386532e-02f, -5.105095897e-03f, +1.306134584e-02f, +3.019566694e-02f, +3.631855639e-02f, +2.515225176e-02f, -1.269160096e-03f, -3.204413258e-02f, -5.200595431e-02f, -4.953651123e-02f, -2.339002800e-02f, +1.557909228e-02f, +4.925148120e-02f, +6.135635567e-02f, +4.596007912e-02f, +1.060294958e-02f, -2.768368439e-02f, -5.123688496e-02f, -5.057808759e-02f, -2.847751395e-02f, +2.564257596e-03f, +2.751736964e-02f, +3.643673348e-02f, +2.846302026e-02f, +1.064224750e-02f, -6.993133677e-03f, -1.686525500e-02f, -1.689226469e-02f, -1.006912400e-02f, -1.614115712e-03f, +4.216000711e-03f, +5.881528531e-03f, +4.373082357e-03f, +1.783374647e-03f, -1.827354783e-04f, -9.219070127e-04f, -7.579093840e-04f, + -9.059582855e-06f, +2.470909225e-06f, +2.601792971e-05f, +5.296712092e-05f, +6.599843263e-05f, +4.560632273e-05f, -1.861052776e-05f, -1.166288410e-04f, -2.132640346e-04f, -2.553979460e-04f, -1.919595909e-04f, -1.009139408e-06f, +2.871365353e-04f, +5.831596506e-04f, +7.564632958e-04f, +6.762352148e-04f, +2.640035975e-04f, -4.617294971e-04f, -1.368613192e-03f, -2.233131932e-03f, -2.800464093e-03f, -2.864100685e-03f, -2.338172154e-03f, -1.295679903e-03f, +4.338151546e-05f, +1.372408895e-03f, +2.387751421e-03f, +2.877271248e-03f, +2.778100290e-03f, +2.185234209e-03f, +1.310542778e-03f, +4.091432488e-04f, -2.997194817e-04f, -6.905770765e-04f, -7.518547806e-04f, -5.667930921e-04f, -2.676990797e-04f, +1.641106349e-05f, +1.996587127e-04f, +2.554161433e-04f, +2.082276012e-04f, +1.100590885e-04f, +1.337559834e-05f, -4.813967360e-05f, -6.598034546e-05f, -5.148010691e-05f, -2.430658232e-05f, -1.362712782e-06f, + +2.574298666e-05f, +2.329239317e-05f, -1.721600120e-05f, -9.256208576e-05f, -1.587387043e-04f, -1.436426421e-04f, +4.978456466e-06f, +2.605996306e-04f, +4.940825608e-04f, +5.219487723e-04f, +2.198020113e-04f, -3.609011358e-04f, -9.595032747e-04f, -1.209137816e-03f, -8.453833775e-04f, +9.390924656e-05f, +1.214731161e-03f, +1.927767583e-03f, +1.763498582e-03f, +6.693020372e-04f, -8.991349016e-04f, -2.175131749e-03f, -2.479825823e-03f, -1.603375858e-03f, +5.612345016e-05f, +1.688026227e-03f, +2.496316882e-03f, +2.118524642e-03f, +8.012388243e-04f, -7.585646875e-04f, -1.803120048e-03f, -1.905650109e-03f, -1.150386728e-03f, -2.426784483e-05f, +8.872633042e-04f, +1.209960521e-03f, +9.285345060e-04f, +3.204885507e-04f, -2.484931299e-04f, -5.292736097e-04f, -4.836305458e-04f, -2.434767633e-04f, +8.250122829e-06f, +1.482428810e-04f, +1.562071244e-04f, +8.745817246e-05f, +1.343848373e-05f, -2.441236253e-05f, + /* 4, 0 (48) */ + -4.440791761e-04f, -7.736617456e-04f, -5.842197404e-04f, +4.733051837e-04f, +2.096961908e-03f, +3.159739597e-03f, +2.247925700e-03f, -1.196916207e-03f, -5.859365612e-03f, -8.625924656e-03f, -6.226830420e-03f, +2.191702212e-03f, +1.322393203e-02f, +1.983561445e-02f, +1.498813646e-02f, -3.241530928e-03f, -2.808652174e-02f, -4.494512491e-02f, -3.739225953e-02f, +4.047367480e-03f, +7.496487828e-02f, +1.562849362e-01f, +2.209963868e-01f, +2.456499165e-01f, +2.209963868e-01f, +1.562849362e-01f, +7.496487828e-02f, +4.047367480e-03f, -3.739225953e-02f, -4.494512491e-02f, -2.808652174e-02f, -3.241530928e-03f, +1.498813646e-02f, +1.983561445e-02f, +1.322393203e-02f, +2.191702212e-03f, -6.226830420e-03f, -8.625924656e-03f, -5.859365612e-03f, -1.196916207e-03f, +2.247925700e-03f, +3.159739597e-03f, +2.096961908e-03f, +4.733051837e-04f, -5.842197404e-04f, -7.736617456e-04f, -4.440791761e-04f, -8.710788365e-05f, + +3.469535659e-04f, +1.336667044e-03f, +1.790286751e-03f, +2.794767810e-04f, -3.303519821e-03f, -6.405731284e-03f, -4.976271198e-03f, +2.686342793e-03f, +1.248168983e-02f, +1.571582859e-02f, +5.946321108e-03f, -1.341789307e-02f, -2.845267002e-02f, -2.424163753e-02f, +1.494761300e-03f, +3.267286932e-02f, +4.455848173e-02f, +2.351503337e-02f, -1.915629477e-02f, -5.272885293e-02f, -4.998568337e-02f, -9.883103547e-03f, +3.944741130e-02f, +6.141247912e-02f, +3.944741130e-02f, -9.883103547e-03f, -4.998568337e-02f, -5.272885293e-02f, -1.915629477e-02f, +2.351503337e-02f, +4.455848173e-02f, +3.267286932e-02f, +1.494761300e-03f, -2.424163753e-02f, -2.845267002e-02f, -1.341789307e-02f, +5.946321108e-03f, +1.571582859e-02f, +1.248168983e-02f, +2.686342793e-03f, -4.976271198e-03f, -6.405731284e-03f, -3.303519821e-03f, +2.794767810e-04f, +1.790286751e-03f, +1.336667044e-03f, +3.469535659e-04f, -1.608870261e-04f, + +2.577507531e-05f, +1.086809859e-05f, -3.597806555e-05f, -9.022677896e-05f, -1.001032074e-04f, -2.162572117e-05f, +1.334176747e-04f, +2.754029446e-04f, +2.738574663e-04f, +4.883441716e-05f, -3.368996142e-04f, -6.608354264e-04f, -6.431674293e-04f, -1.354085236e-04f, +7.148449213e-04f, +1.450106209e-03f, +1.496506860e-03f, +4.925772700e-04f, -1.426669522e-03f, -3.579339114e-03f, -4.995795890e-03f, -4.884068303e-03f, -3.060435122e-03f, -9.950496562e-05f, +2.899055761e-03f, +4.817997977e-03f, +5.039232434e-03f, +3.699598995e-03f, +1.563829895e-03f, -3.948853898e-04f, -1.466038086e-03f, -1.478734758e-03f, -7.701444613e-04f, +8.892008168e-05f, +6.259781652e-04f, +6.723667394e-04f, +3.619102752e-04f, -2.784242037e-05f, -2.665508263e-04f, -2.808185262e-04f, -1.439707896e-04f, +1.363207129e-05f, +9.803631935e-05f, +9.274027171e-05f, +3.959496484e-05f, -8.801928510e-06f, -2.576330239e-05f, -1.668340381e-05f, + -5.085810041e-05f, -6.144595631e-05f, +1.679698635e-05f, +1.663740391e-04f, +2.496456082e-04f, +1.009428352e-04f, -2.793890885e-04f, -6.160780337e-04f, -5.172287092e-04f, +1.495552505e-04f, +9.893104132e-04f, +1.261605930e-03f, +4.928695846e-04f, -9.652920767e-04f, -2.014235506e-03f, -1.627372799e-03f, +1.931735069e-04f, +2.197939940e-03f, +2.758983809e-03f, +1.218866689e-03f, -1.422640286e-03f, -3.172656367e-03f, -2.613289263e-03f, -9.182675706e-05f, +2.499132998e-03f, +3.211843143e-03f, +1.579224448e-03f, -1.067547924e-03f, -2.722308581e-03f, -2.289606150e-03f, -3.308495136e-04f, +1.548140897e-03f, +2.038819890e-03f, +1.056102385e-03f, -4.132185360e-04f, -1.245245151e-03f, -1.030716273e-03f, -2.038784127e-04f, +4.909277589e-04f, +6.261909334e-04f, +3.058451921e-04f, -8.247435647e-05f, -2.483969291e-04f, -1.754542022e-04f, -2.490941987e-05f, +5.954958857e-05f, +5.310929686e-05f, +1.285012779e-05f, + /* 4, 1 (48) */ + -4.183041008e-04f, -7.627936470e-04f, -6.201978060e-04f, +3.830784047e-04f, +1.996858701e-03f, +3.138113875e-03f, +2.381343374e-03f, -9.215132624e-04f, -5.585508145e-03f, -8.577090238e-03f, -6.563730034e-03f, +1.530866785e-03f, +1.258076460e-02f, +1.970020593e-02f, +1.570298138e-02f, -1.791424718e-03f, -2.659001489e-02f, -4.445254764e-02f, -3.881892906e-02f, +4.680283662e-04f, +6.996908239e-02f, +1.514008679e-01f, +2.179359516e-01f, +2.455504115e-01f, +2.238954425e-01f, +1.611029342e-01f, +8.000411071e-02f, +7.746966475e-03f, -3.582842964e-02f, -4.534001030e-02f, -2.955255983e-02f, -4.720265686e-03f, +1.421799200e-02f, +1.992453453e-02f, +1.384991020e-02f, +2.864068951e-03f, -5.864920145e-03f, -8.653767076e-03f, -6.125916438e-03f, -1.477734733e-03f, +2.103954910e-03f, +3.173371668e-03f, +2.194998227e-03f, +5.660454554e-04f, -5.446247756e-04f, -7.824636741e-04f, -4.698424785e-04f, -1.037912875e-04f, + +2.960954655e-04f, +1.275221087e-03f, +1.807083737e-03f, +4.458508201e-04f, -3.053874213e-03f, -6.304788449e-03f, -5.255660287e-03f, +2.070264759e-03f, +1.196446112e-02f, +1.586538384e-02f, +6.935631522e-03f, -1.215628714e-02f, -2.795980043e-02f, -2.520692960e-02f, -5.194742057e-04f, +3.104549652e-02f, +4.475165524e-02f, +2.571297331e-02f, -1.639731096e-02f, -5.150998624e-02f, -5.140832366e-02f, -1.305575991e-02f, +3.683412204e-02f, +6.132065237e-02f, +4.194654430e-02f, -6.671260404e-03f, -4.840645892e-02f, -5.379640085e-02f, -2.187860335e-02f, +2.122542722e-02f, +4.422763222e-02f, +3.422101022e-02f, +3.533581191e-03f, -2.318553514e-02f, -2.886588855e-02f, -1.466313822e-02f, +4.915604835e-03f, +1.551195017e-02f, +1.297261759e-02f, +3.312533726e-03f, -4.670426006e-03f, -6.488205641e-03f, -3.551916750e-03f, +1.040225788e-04f, +1.765377331e-03f, +1.396216632e-03f, +4.000628628e-04f, -1.480368983e-04f, + +2.568494077e-05f, +1.279823439e-05f, -3.240045182e-05f, -8.753816689e-05f, -1.018057305e-04f, -2.929220594e-05f, +1.228295386e-04f, +2.694105448e-04f, +2.802413978e-04f, +6.914107652e-05f, -3.116704700e-04f, -6.479262746e-04f, -6.583392203e-04f, -1.804486605e-04f, +6.591406331e-04f, +1.418716096e-03f, +1.522700842e-03f, +5.865016042e-04f, -1.290524252e-03f, -3.456144344e-03f, -4.946179436e-03f, -4.943187407e-03f, -3.217188611e-03f, -2.983617596e-04f, +2.733284861e-03f, +4.745033012e-03f, +5.076354457e-03f, +3.816679123e-03f, +1.701776486e-03f, -2.935367743e-04f, -1.431258577e-03f, -1.504467573e-03f, -8.248943874e-04f, +4.106534528e-05f, +6.067667708e-04f, +6.824562554e-04f, +3.866306003e-04f, -6.203719232e-06f, -2.583162013e-04f, -2.856253319e-04f, -1.544572875e-04f, +5.324473980e-06f, +9.559884073e-05f, +9.506401101e-05f, +4.324034279e-05f, -6.601447436e-06f, -2.564493378e-05f, -1.763779865e-05f, + -4.849702512e-05f, -6.296872165e-05f, +9.009032545e-06f, +1.570497127e-04f, +2.499307227e-04f, +1.184039648e-04f, -2.528121168e-04f, -6.041753047e-04f, -5.411178559e-04f, +9.604230733e-05f, +9.456000801e-04f, +1.273601320e-03f, +5.695474258e-04f, -8.728683017e-04f, -1.983672901e-03f, -1.700545044e-03f, +5.636515345e-05f, +2.100287318e-03f, +2.786846348e-03f, +1.365515110e-03f, -1.262369016e-03f, -3.123805670e-03f, -2.719216202e-03f, -2.751886192e-04f, +2.377098497e-03f, +3.241213287e-03f, +1.731605663e-03f, -9.120159997e-04f, -2.676873833e-03f, -2.374936970e-03f, -4.689556004e-04f, +1.463034725e-03f, +2.057262883e-03f, +1.144973117e-03f, -3.308092521e-04f, -1.224490089e-03f, -1.069626454e-03f, -2.588417395e-04f, +4.622457530e-04f, +6.344264800e-04f, +3.320784716e-04f, -6.303458543e-05f, -2.461532424e-04f, -1.842423113e-04f, -3.332559610e-05f, +5.726948053e-05f, +5.523260112e-05f, +1.514649021e-05f, + /* 4, 2 (48) */ + -3.926191600e-04f, -7.499954126e-04f, -6.525982578e-04f, +2.955402379e-04f, +1.895052970e-03f, +3.108821669e-03f, +2.504172913e-03f, -6.521027177e-04f, -5.305266748e-03f, -8.507949162e-03f, -6.875400504e-03f, +8.829405108e-04f, +1.192242538e-02f, +1.951975726e-02f, +1.636212202e-02f, -3.727086224e-04f, -2.506731404e-02f, -4.386604604e-02f, -4.010945331e-02f, -2.988115978e-03f, +6.502290296e-02f, +1.464576805e-01f, +2.147187630e-01f, +2.452520498e-01f, +2.266287274e-01f, +1.658479672e-01f, +8.508046517e-02f, +1.156364560e-02f, -3.412665315e-02f, -4.563354708e-02f, -3.098381841e-02f, -6.224733259e-03f, +1.339309761e-02f, +1.996559988e-02f, +1.445667697e-02f, +3.546525207e-03f, -5.478289544e-03f, -8.659970795e-03f, -6.384232639e-03f, -1.763360065e-03f, +1.949497623e-03f, +3.178696142e-03f, +2.290597068e-03f, +6.611094664e-04f, -5.013844328e-04f, -7.890651215e-04f, -4.954874122e-04f, -1.214290861e-04f, + +2.475984404e-04f, +1.212252366e-03f, +1.816092770e-03f, +6.029005328e-04f, -2.803943490e-03f, -6.186384484e-03f, -5.508472404e-03f, +1.466089454e-03f, +1.142334327e-02f, +1.596142614e-02f, +7.881231602e-03f, -1.088268582e-02f, -2.739025301e-02f, -2.607979791e-02f, -2.503147107e-03f, +2.934495148e-02f, +4.480802039e-02f, +2.781326063e-02f, -1.361046461e-02f, -5.014447113e-02f, -5.267069267e-02f, -1.617956558e-02f, +3.411490584e-02f, +6.104546375e-02f, +4.432364280e-02f, -3.430047117e-03f, -4.667485326e-02f, -5.470841685e-02f, -2.455547718e-02f, +1.885049025e-02f, +4.375867662e-02f, +3.568404494e-02f, +5.590844074e-03f, -2.204056203e-02f, -2.919669781e-02f, -1.588762831e-02f, +3.845978381e-03f, +1.525310843e-02f, +1.343486335e-02f, +3.946960206e-03f, -4.338347535e-03f, -6.551240226e-03f, -3.798069993e-03f, -8.021973253e-05f, +1.732051735e-03f, +1.453486113e-03f, +4.552954639e-04f, -1.328904081e-04f, + +2.549779187e-05f, +1.459115580e-05f, -2.887242359e-05f, -8.468914430e-05f, -1.031510331e-04f, -3.661966384e-05f, +1.122371906e-04f, +2.628740404e-04f, +2.857102798e-04f, +8.872654422e-05f, -2.862935634e-04f, -6.337052964e-04f, -6.715031297e-04f, -2.239637995e-04f, +6.031742885e-04f, +1.384701936e-03f, +1.544664201e-03f, +6.765567998e-04f, -1.155617987e-03f, -3.330262345e-03f, -4.890527745e-03f, -4.995311351e-03f, -3.369090678e-03f, -4.967594365e-04f, +2.563365105e-03f, +4.665242587e-03f, +5.107037743e-03f, +3.930337947e-03f, +1.840275841e-03f, -1.886513393e-04f, -1.392140813e-03f, -1.527174191e-03f, -8.789479600e-04f, -8.068450342e-06f, +5.855336396e-04f, +6.910422827e-04f, +4.109877721e-04f, +1.604031493e-05f, -2.491507715e-04f, -2.897922728e-04f, -1.648448594e-04f, -3.282499426e-06f, +9.278551127e-05f, +9.718348809e-05f, +4.690290633e-05f, -4.268934018e-06f, -2.541551119e-05f, -1.856640645e-05f, + -4.604377184e-05f, -6.412929389e-05f, +1.564053316e-06f, +1.475283405e-04f, +2.492864582e-04f, +1.348266799e-04f, -2.262137482e-04f, -5.905744836e-04f, -5.625738223e-04f, +4.350302225e-05f, +8.997806223e-04f, +1.281274664e-03f, +6.430507441e-04f, -7.791577591e-04f, -1.947313080e-03f, -1.767494544e-03f, -7.914526029e-05f, +1.997013978e-03f, +2.805872340e-03f, +1.507053898e-03f, -1.098936335e-03f, -3.065474889e-03f, -2.816590098e-03f, -4.576765036e-04f, +2.247563083e-03f, +3.260645812e-03f, +1.879279726e-03f, -7.527445461e-04f, -2.622762061e-03f, -2.453601469e-03f, -6.070483377e-04f, +1.372261576e-03f, +2.069419948e-03f, +1.231579914e-03f, -2.458698177e-04f, -1.199326656e-03f, -1.105854670e-03f, -3.142690478e-04f, +4.312229160e-04f, +6.407018084e-04f, +3.579848182e-04f, -4.266457517e-05f, -2.428860696e-04f, -1.926898844e-04f, -4.202254467e-05f, +5.459686724e-05f, +5.720976625e-05f, +1.752542097e-05f, + /* 4, 3 (48) */ + -3.671213681e-04f, -7.354042568e-04f, -6.814706814e-04f, +2.108510936e-04f, +1.791901937e-03f, +3.072202006e-03f, +2.616410104e-03f, -3.892286773e-04f, -5.019556468e-03f, -8.419222618e-03f, -7.161694067e-03f, +2.492352145e-04f, +1.125092225e-02f, +1.929579347e-02f, +1.696529630e-02f, +1.011993314e-03f, -2.352264984e-02f, -4.318948924e-02f, -4.126507130e-02f, -6.318378323e-03f, +6.013237521e-02f, +1.414623692e-01f, +2.113496723e-01f, +2.447552903e-01f, +2.291920925e-01f, +1.705132098e-01f, +9.018750292e-02f, +1.549398355e-02f, -3.228637731e-02f, -4.582219842e-02f, -3.237595922e-02f, -7.751907450e-03f, +1.251414965e-02f, +1.995753143e-02f, +1.504221061e-02f, +4.237567489e-03f, -5.067301772e-03f, -8.643930480e-03f, -6.633383411e-03f, -2.053152338e-03f, +1.784652763e-03f, +3.175413642e-03f, +2.383382579e-03f, +7.582929545e-04f, -4.544815265e-04f, -7.933340555e-04f, -5.209029234e-04f, -1.399954926e-04f, + +2.015546685e-04f, +1.148123072e-03f, +1.817656823e-03f, +7.504288733e-04f, -2.554657032e-03f, -6.051557804e-03f, -5.734686152e-03f, +8.755149706e-04f, +1.086076945e-02f, +1.600492917e-02f, +8.781012224e-03f, -9.601411153e-03f, -2.674720226e-02f, -2.685895566e-02f, -4.450460187e-03f, +2.757745693e-02f, +4.472887513e-02f, +2.981027461e-02f, -1.080459227e-02f, -4.863741723e-02f, -5.376962901e-02f, -1.924504047e-02f, +3.129831574e-02f, +6.058778724e-02f, +4.657120588e-02f, -1.694013043e-04f, -4.479557353e-02f, -5.546116140e-02f, -2.717823924e-02f, +1.639688878e-02f, +4.315162828e-02f, +3.705630652e-02f, +7.660264021e-03f, -2.080898211e-02f, -2.944256762e-02f, -1.708695496e-02f, +2.740123711e-03f, +1.493883939e-02f, +1.386608626e-02f, +4.587662014e-03f, -3.980362717e-03f, -6.593904801e-03f, -4.040956062e-03f, -2.729096169e-04f, +1.690029190e-03f, +1.508082980e-03f, +5.125052301e-04f, -1.153649871e-04f, + +2.521870143e-05f, +1.624621214e-05f, -2.540375540e-05f, -8.169444519e-05f, -1.041471292e-04f, -4.359758709e-05f, +1.016705850e-04f, +2.558267896e-04f, +2.902740750e-04f, +1.075577770e-04f, -2.608383219e-04f, -6.182403434e-04f, -6.826735565e-04f, -2.658826444e-04f, +5.470861159e-04f, +1.348204232e-03f, +1.562449107e-03f, +7.626505743e-04f, -1.022169247e-03f, -3.201943052e-03f, -4.828995200e-03f, -5.040408874e-03f, -3.515924974e-03f, -6.943928988e-04f, +2.389547080e-03f, +4.578708397e-03f, +5.131168788e-03f, +4.040337745e-03f, +1.979090371e-03f, -8.035797108e-05f, -1.348665889e-03f, -1.546728218e-03f, -9.321568742e-04f, -5.838895299e-05f, +5.622843227e-04f, +6.980656076e-04f, +4.349081821e-04f, +3.884562163e-05f, -2.390542422e-04f, -2.932892410e-04f, -1.751005601e-04f, -1.217293043e-05f, +8.959208158e-05f, +9.908437117e-05f, +5.057089919e-05f, -1.807232852e-06f, -2.507083135e-05f, -1.946383437e-05f, + -4.351565455e-05f, -6.494024989e-05f, -5.521696940e-06f, +1.378560946e-04f, +2.477495159e-04f, +1.501848820e-04f, -1.996906535e-04f, -5.753710700e-04f, -5.815844655e-04f, -7.906233985e-06f, +8.520507510e-04f, +1.284683345e-03f, +7.131923655e-04f, -6.844865997e-04f, -1.905354028e-03f, -1.828080810e-03f, -2.129361260e-04f, +1.888500953e-03f, +2.816067114e-03f, +1.643063030e-03f, -9.328759901e-04f, -2.997878283e-03f, -2.905115653e-03f, -6.387110148e-04f, +2.110929078e-03f, +3.270051945e-03f, +2.021755815e-03f, -5.902221241e-04f, -2.560085015e-03f, -2.525288040e-03f, -7.446799040e-04f, +1.276050184e-03f, +2.075165918e-03f, +1.315601324e-03f, -1.586408310e-04f, -1.169755890e-03f, -1.139220329e-03f, -3.699785465e-04f, +3.979090191e-04f, +6.449391495e-04f, +3.834583218e-04f, -2.141035931e-05f, -2.385701128e-04f, -2.007480380e-04f, -5.097508111e-05f, +5.152445542e-05f, +5.902239499e-05f, +1.997819080e-05f, + /* 4, 4 (48) */ + -3.419026667e-04f, -7.191580447e-04f, -7.068744368e-04f, +1.291566484e-04f, +1.687754808e-03f, +3.028604419e-03f, +2.718080689e-03f, -1.334018877e-04f, -4.729282393e-03f, -8.311664841e-03f, -7.422532389e-03f, -3.690051289e-04f, +1.056824870e-02f, +1.902991082e-02f, +1.751238242e-02f, +2.360197545e-03f, -2.196020074e-02f, -4.242683867e-02f, -4.228724054e-02f, -9.520321375e-03f, +5.530338001e-02f, +1.364219603e-01f, +2.078337474e-01f, +2.440608974e-01f, +2.315816396e-01f, +1.750919182e-01f, +9.531867170e-02f, +1.953432129e-02f, -3.030728694e-02f, -4.590255639e-02f, -3.372462511e-02f, -9.298635668e-03f, +1.158199278e-02f, +1.989914247e-02f, +1.560449493e-02f, +4.935633097e-03f, -4.632393590e-03f, -8.605084859e-03f, -6.872437653e-03f, -2.346441579e-03f, +1.609552203e-03f, +3.163240712e-03f, +2.472974661e-03f, +8.573773257e-04f, -4.039106273e-04f, -7.951412884e-04f, -5.459737548e-04f, -1.594593269e-04f, + +1.580390140e-04f, +1.083182822e-03f, +1.812135126e-03f, +8.882849680e-04f, -2.306907516e-03f, -5.901372922e-03f, -5.934376806e-03f, +3.001439006e-04f, +1.027918498e-02f, +1.599702293e-02f, +9.633062975e-03f, -8.316727808e-03f, -2.603400990e-02f, -2.754344226e-02f, -6.355814215e-03f, +2.574937612e-02f, +4.451593900e-02f, +3.169877556e-02f, -7.988525159e-03f, -4.699435420e-02f, -5.470250500e-02f, -2.224291876e-02f, +2.839320009e-02f, +5.994907623e-02f, +4.868213496e-02f, +3.100650641e-03f, -4.277381772e-02f, -5.605138352e-02f, -2.973832426e-02f, +1.387160074e-02f, +4.240694837e-02f, +3.833235670e-02f, +9.735429939e-03f, -1.949338079e-02f, -2.960120845e-02f, -1.825671085e-02f, +1.600903381e-03f, +1.456886084e-02f, +1.426399528e-02f, +5.232601164e-03f, -3.596904395e-03f, -6.615315161e-03f, -4.279526175e-03f, -4.736576549e-04f, +1.639054109e-03f, +1.559607435e-03f, +5.715276251e-04f, -9.538679632e-05f, + +2.485289707e-05f, +1.776326699e-05f, -2.200368024e-05f, -7.856878056e-05f, -1.048028527e-04f, -5.021681594e-05f, +9.115875605e-05f, +2.483026841e-04f, +2.939449663e-04f, +1.256045662e-04f, -2.353727258e-04f, -6.016008928e-04f, -6.918695702e-04f, -3.061393594e-04f, +4.910136010e-04f, +1.309366105e-03f, +1.576115501e-03f, +8.447000245e-04f, -8.903907804e-04f, -3.071438158e-03f, -4.761745523e-03f, -5.078461389e-03f, -3.657484738e-03f, -8.909585180e-04f, +2.212088805e-03f, +4.485524544e-03f, +5.148645087e-03f, +4.146445129e-03f, +2.117978792e-03f, +3.120562914e-05f, -1.300823683e-03f, -1.563007677e-03f, -9.843715783e-04f, -1.097988158e-04f, +5.370296229e-04f, +7.034697038e-04f, +4.583176107e-04f, +6.216550883e-05f, -2.280289067e-04f, -2.960872217e-04f, -1.851908887e-04f, -2.132956422e-05f, +8.601535640e-05f, +1.007525581e-04f, +5.423212726e-05f, +7.802366320e-07f, -2.460697086e-05f, -2.032459926e-05f, + -4.092953074e-05f, -6.541522858e-05f, -1.223419269e-05f, +1.280780387e-04f, +2.453588821e-04f, +1.644573947e-04f, -1.733364085e-04f, -5.586638714e-04f, -5.981467065e-04f, -5.803657589e-05f, +8.026117632e-04f, +1.283898334e-03f, +7.797996862e-04f, -5.891793017e-04f, -1.858009816e-03f, -1.882186182e-03f, -3.445958614e-04f, +1.775143192e-03f, +2.817464960e-03f, +1.773143062e-03f, -7.647279520e-04f, -2.921259728e-03f, -2.984526936e-03f, -8.177176306e-04f, +1.967622483e-03f, +3.269375510e-03f, +2.158558199e-03f, -4.249506554e-04f, -2.488983513e-03f, -2.589705622e-03f, -8.813995793e-04f, +1.174650167e-03f, +2.074395682e-03f, +1.396719979e-03f, -6.937474964e-05f, -1.135794214e-03f, -1.169549304e-03f, -4.257833885e-04f, +3.623634157e-04f, +6.470662585e-04f, +4.083916371e-04f, +6.770848861e-07f, -2.331834640e-04f, -2.083676856e-04f, -6.015583712e-05f, +4.804651873e-05f, +6.065202711e-05f, +2.249519359e-05f, + /* 4, 5 (48) */ + -3.170497696e-04f, -7.013947777e-04f, -7.288781171e-04f, +5.058786781e-05f, +1.582951955e-03f, +2.978387603e-03f, +2.809239445e-03f, +1.149007964e-04f, -4.435337427e-03f, -8.186060275e-03f, -7.657905115e-03f, -9.706060217e-04f, +9.876379128e-03f, +1.872377146e-02f, +1.800339602e-02f, +3.669563650e-03f, -2.038408523e-02f, -4.158213864e-02f, -4.317763132e-02f, -1.259175953e-02f, +5.054163449e-02f, +1.313434989e-01f, +2.041762626e-01f, +2.431699389e-01f, +2.337937284e-01f, +1.795774427e-01f, +1.004673168e-01f, +2.368076642e-02f, -2.818930815e-02f, -4.587135076e-02f, -3.502544879e-02f, -1.086164335e-02f, +1.059762120e-02f, +1.978934366e-02f, +1.614152455e-02f, +5.639102801e-03f, -4.174075979e-03f, -8.542919350e-03f, -7.100466560e-03f, -2.642528801e-03f, +1.424361314e-03f, +3.141911148e-03f, +2.558990017e-03f, +9.581298838e-04f, -3.496785000e-04f, -7.943610518e-04f, -5.705807257e-04f, -1.797839262e-04f, + +1.171094832e-04f, +1.017767593e-03f, +1.799900934e-03f, +1.016363007e-03f, -2.061548634e-03f, -5.736915528e-03f, -6.107713214e-03f, -2.585199707e-04f, +9.681038274e-03f, +1.593898636e-02f, +1.043567474e-02f, -7.032829474e-03f, -2.525421021e-02f, -2.813262157e-02f, -8.213824032e-03f, +2.386718994e-02f, +4.417134314e-02f, +3.347391875e-02f, -5.171060199e-03f, -4.522121114e-02f, -5.546723295e-02f, -2.516417848e-02f, +2.540867315e-02f, +5.913135860e-02f, +5.064975744e-02f, +6.370026151e-03f, -4.061525952e-02f, -5.647633418e-02f, -3.222730777e-02f, +1.128189512e-02f, +4.152554879e-02f, +3.950700687e-02f, +1.180982562e-02f, -1.809666081e-02f, -2.967058320e-02f, -1.939250507e-02f, +4.313540776e-04f, +1.414307745e-02f, +1.462635870e-02f, +5.879667422e-03f, -3.188512758e-03f, -6.614638076e-03f, -4.512709639e-03f, -6.820253404e-04f, +1.578898272e-03f, +1.607653954e-03f, +6.321796522e-04f, -7.289160273e-05f, + +2.440573637e-05f, +1.914268171e-05f, -1.868087567e-05f, -7.532679167e-05f, -1.051278059e-04f, -5.646952880e-05f, +8.072975785e-05f, +2.403360389e-04f, +2.967372692e-04f, +1.428395536e-04f, -2.099631606e-04f, -5.838578326e-04f, -6.991147656e-04f, -3.446736192e-04f, +4.350912186e-04f, +1.268332935e-03f, +1.585730846e-03f, +9.226316762e-04f, -7.604891965e-04f, -2.939000589e-03f, -4.688951385e-03f, -5.109462957e-03f, -3.793573174e-03f, -1.086154718e-03f, +2.031255250e-03f, +4.385797410e-03f, +5.159375410e-03f, +4.248431559e-03f, +2.256696583e-03f, +1.458931227e-04f, -1.248613006e-03f, -1.575895357e-03f, -1.035441599e-03f, -1.621958337e-04f, +5.097856788e-04f, +7.072009381e-04f, +4.811414114e-04f, +8.595071913e-05f, -2.160797036e-04f, -2.981584054e-04f, -1.950818736e-04f, -3.073382484e-05f, +8.205323572e-05f, +1.021742297e-04f, +5.787398607e-05f, +3.489473056e-06f, -2.402031080e-05f, -2.114314640e-05f, + -3.830173685e-05f, -6.556882424e-05f, -1.856161600e-05f, +1.182379750e-04f, +2.421555950e-04f, +1.776279014e-04f, -1.472412174e-04f, -5.405545465e-04f, -6.122663293e-04f, -1.067469839e-04f, +7.516667697e-04f, +1.279003693e-03f, +8.427150406e-04f, -4.935575695e-04f, -1.805509649e-03f, -1.929715963e-03f, -4.737242104e-04f, +1.657348110e-03f, +2.810128809e-03f, +1.896916352e-03f, -5.950365752e-04f, -2.835891805e-03f, -3.054588224e-03f, -9.941286267e-04f, +1.818091573e-03f, +3.258593194e-03f, +2.289227892e-03f, -2.574437953e-04f, -2.409627157e-03f, -2.646584855e-03f, -1.016755263e-03f, +1.068331401e-03f, +2.067024802e-03f, +1.474623762e-03f, +2.166481680e-05f, -1.097473649e-03f, -1.196674685e-03f, -4.814922535e-04f, +3.246550398e-04f, +6.470168316e-04f, +4.326763660e-04f, +2.354189483e-05f, -2.267078061e-04f, -2.154997430e-04f, -6.953530181e-05f, +4.415898908e-05f, +6.208023054e-05f, +2.506595819e-05f, + /* 4, 6 (48) */ + -2.926440332e-04f, -6.822520959e-04f, -7.475589927e-04f, -2.473892386e-05f, +1.477824149e-03f, +2.921918074e-03f, +2.889969203e-03f, +3.552368352e-04f, -4.138600157e-03f, -8.043220721e-03f, -7.867868276e-03f, -1.554463854e-03f, +9.177264362e-03f, +1.837909784e-02f, +1.843848724e-02f, +4.937896585e-03f, -1.879835439e-02f, -4.065950696e-02f, -4.393812052e-02f, -1.553076012e-02f, +4.585268310e-02f, +1.262340359e-01f, +2.003826895e-01f, +2.420837842e-01f, +2.358249836e-01f, +1.839632402e-01f, +1.056266922e-01f, +2.792919798e-02f, -2.593261157e-02f, -4.572545764e-02f, -3.627406180e-02f, -1.243753870e-02f, +9.562179601e-03f, +1.962714782e-02f, +1.665131023e-02f, +6.346303739e-03f, -3.692934568e-03f, -8.456968631e-03f, -7.316546263e-03f, -2.940687206e-03f, +1.229279441e-03f, +3.111177323e-03f, +2.641043253e-03f, +1.060304113e-03f, -2.918045140e-04f, -7.908715787e-04f, -5.946010365e-04f, -2.009270726e-04f, + +7.880774639e-05f, +9.521987690e-04f, +1.781339318e-03f, +1.134600982e-03f, -1.819393039e-03f, -5.559287626e-03f, -6.254954431e-03f, -7.990745172e-04f, +9.068771944e-03f, +1.583223937e-02f, +1.118734151e-02f, -5.753825781e-03f, -2.441149517e-02f, -2.862617914e-02f, -1.001933368e-02f, +2.193747398e-02f, +4.369761893e-02f, +3.513126686e-02f, -2.360931390e-03f, -4.332429479e-02f, -5.606226953e-02f, -2.800007029e-02f, +2.235408493e-02f, +5.813722997e-02f, +5.246784902e-02f, +9.628619345e-03f, -3.832603163e-02f, -5.673377797e-02f, -3.463693493e-02f, +8.635310265e-03f, +4.050879353e-02f, +4.057533827e-02f, +1.387685042e-02f, -1.662203705e-02f, -2.964891839e-02f, -2.048997872e-02f, -7.653206070e-04f, +1.366158520e-02f, +1.495101374e-02f, +6.526684254e-03f, -2.755836392e-03f, -6.591096181e-03f, -4.739417445e-03f, -8.975250834e-04f, +1.509362970e-03f, +1.651812943e-03f, +6.942598828e-04f, -4.782564454e-05f, + +2.388268238e-05f, +2.038529763e-05f, -1.544345222e-05f, -7.198300477e-05f, -1.051323070e-04f, -6.234922847e-05f, +7.041060820e-05f, +2.319614842e-04f, +2.986673396e-04f, +1.592382384e-04f, -1.846742780e-04f, -5.650832478e-04f, -7.044371083e-04f, -3.814306438e-04f, +3.794501758e-04f, +1.225251987e-03f, +1.591369861e-03f, +9.963815105e-04f, -6.326646124e-04f, -2.804883992e-03f, -4.610794003e-03f, -5.133420237e-03f, -3.924003801e-03f, -1.279682551e-03f, +1.847317835e-03f, +4.279645494e-03f, +5.163280051e-03f, +4.346073830e-03f, +2.394996447e-03f, +2.635497313e-04f, -1.192041739e-03f, -1.585279156e-03f, -1.085215875e-03f, -2.154730948e-04f, +4.805740365e-04f, +7.092087738e-04f, +5.033047016e-04f, +1.101495045e-04f, -2.032142678e-04f, -2.994762987e-04f, -2.047391603e-04f, -4.036583496e-05f, +7.770475349e-05f, +1.033359034e-04f, +6.148349062e-05f, +6.315887839e-06f, -2.330756098e-05f, -2.191386919e-05f, + -3.564802872e-05f, -6.541647930e-05f, -2.449432609e-05f, +1.083783024e-04f, +2.381825098e-04f, +1.896848636e-04f, -1.214916587e-04f, -5.211471490e-04f, -6.239577516e-04f, -1.539046480e-04f, +6.994199307e-04f, +1.270096047e-03f, +9.017960107e-04f, -3.979392574e-04f, -1.748096881e-03f, -1.970598482e-03f, -5.999334907e-04f, +1.535534094e-03f, +2.794149814e-03f, +2.014028202e-03f, -4.243487494e-04f, -2.742074807e-03f, -3.115094746e-03f, -1.167384978e-03f, +1.662805419e-03f, +3.237714706e-03f, +2.413324272e-03f, -8.822525744e-05f, -2.322213947e-03f, -2.695679175e-03f, -1.150295009e-03f, +9.573833096e-04f, +2.052990060e-03f, +1.549006979e-03f, +1.142038653e-04f, -1.054841968e-03f, -1.220437529e-03f, -5.369099587e-04f, +2.848623687e-04f, +6.447309089e-04f, +4.562034539e-04f, +4.712340274e-05f, -2.191286046e-04f, -2.220953406e-04f, -7.908187432e-05f, +3.985954338e-05f, +6.328869589e-05f, +2.767916530e-05f, + /* 4, 7 (48) */ + -2.687613508e-04f, -6.618667983e-04f, -7.630024450e-04f, -9.672192862e-05f, +1.372691842e-03f, +2.859568845e-03f, +2.960379811e-03f, +5.871983194e-04f, -3.839932818e-03f, -7.883982483e-03f, -8.052542554e-03f, -2.119547102e-03f, +8.472827254e-03f, +1.799766720e-02f, +1.881793742e-02f, +6.163148572e-03f, -1.720698453e-02f, -3.966312545e-02f, -4.457078513e-02f, -1.833564411e-02f, +4.124188910e-02f, +1.211006157e-01f, +1.964586857e-01f, +2.408041017e-01f, +2.376723015e-01f, +1.882428856e-01f, +1.107899723e-01f, +3.227527181e-02f, -2.353761512e-02f, -4.546190791e-02f, -3.746610354e-02f, -1.402281786e-02f, +8.476963726e-03f, +1.941167473e-02f, +1.713188427e-02f, +7.055512513e-03f, -3.189629866e-03f, -8.346819126e-03f, -7.519760531e-03f, -3.240163505e-03f, +1.024540281e-03f, +3.070811488e-03f, +2.718748007e-03f, +1.163640017e-03f, -2.303210233e-04f, -7.845556909e-04f, -6.179085974e-04f, -2.228409418e-04f, + +4.315971767e-05f, +8.867822897e-04f, +1.756844992e-03f, +1.242979284e-03f, -1.581210529e-03f, -5.369602763e-03f, -6.376446090e-03f, -1.320221666e-03f, +8.444814193e-03f, +1.567833472e-02f, +1.188676144e-02f, -4.483729733e-03f, -2.350969916e-02f, -2.902411839e-02f, -1.176743056e-02f, +1.996687550e-02f, +4.309768544e-02f, +3.666680095e-02f, +4.332184234e-04f, -4.131026659e-02f, -5.648661828e-02f, -3.074214510e-02f, +1.923899018e-02f, +5.696984499e-02f, +5.413065444e-02f, +1.286633405e-02f, -3.591270736e-02f, -5.682200323e-02f, -3.695914888e-02f, +5.939631090e-03f, +3.935849852e-02f, +4.153272158e-02f, +1.592984048e-02f, -1.507303007e-02f, -2.953471452e-02f, -2.154482068e-02f, -1.985758136e-03f, +1.312467524e-02f, +1.523587610e-02f, +7.171415163e-03f, -2.299632938e-03f, -6.543972778e-03f, -4.958546050e-03f, -1.119620424e-03f, +1.430281096e-03f, +1.691672486e-03f, +7.575485786e-04f, -2.014647924e-05f, + +2.328927947e-05f, +2.149241715e-05f, -1.229894406e-05f, -6.855178752e-05f, -1.048273375e-04f, -6.785072484e-05f, +6.022723717e-05f, +2.232138583e-04f, +2.997534787e-04f, +1.747789771e-04f, -1.595688629e-04f, -5.453502079e-04f, -7.078687720e-04f, -4.163612200e-04f, +3.242181677e-04f, +1.180272056e-03f, +1.593114251e-03f, +1.065894971e-03f, -5.071103173e-04f, -2.669342214e-03f, -4.527462721e-03f, -5.150352405e-03f, -4.048600782e-03f, -1.471246277e-03f, +1.660553920e-03f, +4.167199231e-03f, +5.160291051e-03f, +4.439154570e-03f, +2.532628792e-03f, +3.840124563e-04f, -1.131126946e-03f, -1.591052417e-03f, -1.133543098e-03f, -2.695191451e-04f, +4.494217083e-04f, +7.094459692e-04f, +5.247325564e-04f, +1.347077095e-04f, -1.894429744e-04f, -3.000158343e-04f, -2.141281029e-04f, -5.020444006e-05f, +7.297011391e-05f, +1.042244879e-04f, +6.504730720e-05f, +9.254301850e-06f, -2.246578373e-05f, -2.263112961e-05f, + -3.298352728e-05f, -6.497437691e-05f, -3.002482001e-05f, +9.853988425e-05f, +2.334840638e-04f, +2.006214236e-04f, -9.617045035e-05f, -5.005476724e-04f, -6.332437672e-04f, -1.993852731e-04f, +6.460757027e-04f, +1.257284011e-03f, +9.569156754e-04f, -3.026373218e-04f, -1.686027989e-03f, -2.004785068e-03f, -7.228497856e-04f, +1.410128991e-03f, +2.769646834e-03f, +2.124147921e-03f, -2.532120519e-04f, -2.640135635e-03f, -3.165873309e-03f, -1.336938230e-03f, +1.502252330e-03f, +3.206782822e-03f, +2.530426625e-03f, +8.217290435e-05f, -2.226969791e-03f, -2.736765832e-03f, -1.281568578e-03f, +8.421140762e-04f, +2.032249947e-03f, +1.619571516e-03f, +2.079588070e-04f, -1.007962800e-03f, -1.240687586e-03f, -5.918380977e-04f, +2.430733469e-04f, +6.401552626e-04f, +4.788635990e-04f, +7.135623777e-05f, -2.104352892e-04f, -2.281060413e-04f, -8.876192768e-05f, +3.514768506e-05f, +6.425933412e-05f, +3.032266962e-05f, + /* 4, 8 (48) */ + -2.454720714e-04f, -6.403743812e-04f, -7.753013890e-04f, -1.652737161e-04f, +1.267864505e-03f, +2.791718120e-03f, +3.020607048e-03f, +8.104121777e-04f, -3.540179339e-03f, -7.709203505e-03f, -8.212111417e-03f, -2.664897310e-03f, +7.764958482e-03f, +1.758130598e-02f, +1.914215558e-02f, +7.343420628e-03f, -1.561387028e-02f, -3.859723048e-02f, -4.507789545e-02f, -2.100498633e-02f, +3.671442638e-02f, +1.159502633e-01f, +1.924100849e-01f, +2.393328554e-01f, +2.393328554e-01f, +1.924100849e-01f, +1.159502633e-01f, +3.671442638e-02f, -2.100498633e-02f, -4.507789545e-02f, -3.859723048e-02f, -1.561387028e-02f, +7.343420628e-03f, +1.914215558e-02f, +1.758130598e-02f, +7.764958482e-03f, -2.664897310e-03f, -8.212111417e-03f, -7.709203505e-03f, -3.540179339e-03f, +8.104121777e-04f, +3.020607048e-03f, +2.791718120e-03f, +1.267864505e-03f, -1.652737161e-04f, -7.753013890e-04f, -6.403743812e-04f, -2.454720714e-04f, + +1.017619038e-05f, +8.218079128e-04f, +1.726820172e-03f, +1.341519168e-03f, -1.347726465e-03f, -5.168981339e-03f, -6.472616540e-03f, -1.820769339e-03f, +7.811570426e-03f, +1.547894945e-02f, +1.253283714e-02f, -3.226445722e-03f, -2.255278348e-02f, -2.932675571e-02f, -1.345345855e-02f, +1.796209043e-02f, +4.237483565e-02f, +3.807692994e-02f, +3.202865258e-03f, -3.918611867e-02f, -5.673983033e-02f, -3.338228073e-02f, +1.607311687e-02f, +5.563290677e-02f, +5.563290677e-02f, +1.607311687e-02f, -3.338228073e-02f, -5.673983033e-02f, -3.918611867e-02f, +3.202865258e-03f, +3.807692994e-02f, +4.237483565e-02f, +1.796209043e-02f, -1.345345855e-02f, -2.932675571e-02f, -2.255278348e-02f, -3.226445722e-03f, +1.253283714e-02f, +1.547894945e-02f, +7.811570426e-03f, -1.820769339e-03f, -6.472616540e-03f, -5.168981339e-03f, -1.347726465e-03f, +1.341519168e-03f, +1.726820172e-03f, +8.218079128e-04f, +1.017619038e-05f, + +2.263112961e-05f, +2.246578373e-05f, -9.254301850e-06f, -6.504730720e-05f, -1.042244879e-04f, -7.297011391e-05f, +5.020444006e-05f, +2.141281029e-04f, +3.000158343e-04f, +1.894429744e-04f, -1.347077095e-04f, -5.247325564e-04f, -7.094459692e-04f, -4.494217083e-04f, +2.695191451e-04f, +1.133543098e-03f, +1.591052417e-03f, +1.131126946e-03f, -3.840124563e-04f, -2.532628792e-03f, -4.439154570e-03f, -5.160291051e-03f, -4.167199231e-03f, -1.660553920e-03f, +1.471246277e-03f, +4.048600782e-03f, +5.150352405e-03f, +4.527462721e-03f, +2.669342214e-03f, +5.071103173e-04f, -1.065894971e-03f, -1.593114251e-03f, -1.180272056e-03f, -3.242181677e-04f, +4.163612200e-04f, +7.078687720e-04f, +5.453502079e-04f, +1.595688629e-04f, -1.747789771e-04f, -2.997534787e-04f, -2.232138583e-04f, -6.022723717e-05f, +6.785072484e-05f, +1.048273375e-04f, +6.855178752e-05f, +1.229894406e-05f, -2.149241715e-05f, -2.328927947e-05f, + -3.032266962e-05f, -6.425933412e-05f, -3.514768506e-05f, +8.876192768e-05f, +2.281060413e-04f, +2.104352892e-04f, -7.135623777e-05f, -4.788635990e-04f, -6.401552626e-04f, -2.430733469e-04f, +5.918380977e-04f, +1.240687586e-03f, +1.007962800e-03f, -2.079588070e-04f, -1.619571516e-03f, -2.032249947e-03f, -8.421140762e-04f, +1.281568578e-03f, +2.736765832e-03f, +2.226969791e-03f, -8.217290435e-05f, -2.530426625e-03f, -3.206782822e-03f, -1.502252330e-03f, +1.336938230e-03f, +3.165873309e-03f, +2.640135635e-03f, +2.532120519e-04f, -2.124147921e-03f, -2.769646834e-03f, -1.410128991e-03f, +7.228497856e-04f, +2.004785068e-03f, +1.686027989e-03f, +3.026373218e-04f, -9.569156754e-04f, -1.257284011e-03f, -6.460757027e-04f, +1.993852731e-04f, +6.332437672e-04f, +5.005476724e-04f, +9.617045035e-05f, -2.006214236e-04f, -2.334840638e-04f, -9.853988425e-05f, +3.002482001e-05f, +6.497437691e-05f, +3.298352728e-05f, + /* 4, 9 (48) */ + -2.228409418e-04f, -6.179085974e-04f, -7.845556909e-04f, -2.303210233e-04f, +1.163640017e-03f, +2.718748007e-03f, +3.070811488e-03f, +1.024540281e-03f, -3.240163505e-03f, -7.519760531e-03f, -8.346819126e-03f, -3.189629866e-03f, +7.055512513e-03f, +1.713188427e-02f, +1.941167473e-02f, +8.476963726e-03f, -1.402281786e-02f, -3.746610354e-02f, -4.546190791e-02f, -2.353761512e-02f, +3.227527181e-02f, +1.107899723e-01f, +1.882428856e-01f, +2.376723015e-01f, +2.408041017e-01f, +1.964586857e-01f, +1.211006157e-01f, +4.124188910e-02f, -1.833564411e-02f, -4.457078513e-02f, -3.966312545e-02f, -1.720698453e-02f, +6.163148572e-03f, +1.881793742e-02f, +1.799766720e-02f, +8.472827254e-03f, -2.119547102e-03f, -8.052542554e-03f, -7.883982483e-03f, -3.839932818e-03f, +5.871983194e-04f, +2.960379811e-03f, +2.859568845e-03f, +1.372691842e-03f, -9.672192862e-05f, -7.630024450e-04f, -6.618667983e-04f, -2.687613508e-04f, + -2.014647924e-05f, +7.575485786e-04f, +1.691672486e-03f, +1.430281096e-03f, -1.119620424e-03f, -4.958546050e-03f, -6.543972778e-03f, -2.299632938e-03f, +7.171415163e-03f, +1.523587610e-02f, +1.312467524e-02f, -1.985758136e-03f, -2.154482068e-02f, -2.953471452e-02f, -1.507303007e-02f, +1.592984048e-02f, +4.153272158e-02f, +3.935849852e-02f, +5.939631090e-03f, -3.695914888e-02f, -5.682200323e-02f, -3.591270736e-02f, +1.286633405e-02f, +5.413065444e-02f, +5.696984499e-02f, +1.923899018e-02f, -3.074214510e-02f, -5.648661828e-02f, -4.131026659e-02f, +4.332184234e-04f, +3.666680095e-02f, +4.309768544e-02f, +1.996687550e-02f, -1.176743056e-02f, -2.902411839e-02f, -2.350969916e-02f, -4.483729733e-03f, +1.188676144e-02f, +1.567833472e-02f, +8.444814193e-03f, -1.320221666e-03f, -6.376446090e-03f, -5.369602763e-03f, -1.581210529e-03f, +1.242979284e-03f, +1.756844992e-03f, +8.867822897e-04f, +4.315971767e-05f, + +2.191386919e-05f, +2.330756098e-05f, -6.315887839e-06f, -6.148349062e-05f, -1.033359034e-04f, -7.770475349e-05f, +4.036583496e-05f, +2.047391603e-04f, +2.994762987e-04f, +2.032142678e-04f, -1.101495045e-04f, -5.033047016e-04f, -7.092087738e-04f, -4.805740365e-04f, +2.154730948e-04f, +1.085215875e-03f, +1.585279156e-03f, +1.192041739e-03f, -2.635497313e-04f, -2.394996447e-03f, -4.346073830e-03f, -5.163280051e-03f, -4.279645494e-03f, -1.847317835e-03f, +1.279682551e-03f, +3.924003801e-03f, +5.133420237e-03f, +4.610794003e-03f, +2.804883992e-03f, +6.326646124e-04f, -9.963815105e-04f, -1.591369861e-03f, -1.225251987e-03f, -3.794501758e-04f, +3.814306438e-04f, +7.044371083e-04f, +5.650832478e-04f, +1.846742780e-04f, -1.592382384e-04f, -2.986673396e-04f, -2.319614842e-04f, -7.041060820e-05f, +6.234922847e-05f, +1.051323070e-04f, +7.198300477e-05f, +1.544345222e-05f, -2.038529763e-05f, -2.388268238e-05f, + -2.767916530e-05f, -6.328869589e-05f, -3.985954338e-05f, +7.908187432e-05f, +2.220953406e-04f, +2.191286046e-04f, -4.712340274e-05f, -4.562034539e-04f, -6.447309089e-04f, -2.848623687e-04f, +5.369099587e-04f, +1.220437529e-03f, +1.054841968e-03f, -1.142038653e-04f, -1.549006979e-03f, -2.052990060e-03f, -9.573833096e-04f, +1.150295009e-03f, +2.695679175e-03f, +2.322213947e-03f, +8.822525744e-05f, -2.413324272e-03f, -3.237714706e-03f, -1.662805419e-03f, +1.167384978e-03f, +3.115094746e-03f, +2.742074807e-03f, +4.243487494e-04f, -2.014028202e-03f, -2.794149814e-03f, -1.535534094e-03f, +5.999334907e-04f, +1.970598482e-03f, +1.748096881e-03f, +3.979392574e-04f, -9.017960107e-04f, -1.270096047e-03f, -6.994199307e-04f, +1.539046480e-04f, +6.239577516e-04f, +5.211471490e-04f, +1.214916587e-04f, -1.896848636e-04f, -2.381825098e-04f, -1.083783024e-04f, +2.449432609e-05f, +6.541647930e-05f, +3.564802872e-05f, + /* 4,10 (48) */ + -2.009270726e-04f, -5.946010365e-04f, -7.908715787e-04f, -2.918045140e-04f, +1.060304113e-03f, +2.641043253e-03f, +3.111177323e-03f, +1.229279441e-03f, -2.940687206e-03f, -7.316546263e-03f, -8.456968631e-03f, -3.692934568e-03f, +6.346303739e-03f, +1.665131023e-02f, +1.962714782e-02f, +9.562179601e-03f, -1.243753870e-02f, -3.627406180e-02f, -4.572545764e-02f, -2.593261157e-02f, +2.792919798e-02f, +1.056266922e-01f, +1.839632402e-01f, +2.358249836e-01f, +2.420837842e-01f, +2.003826895e-01f, +1.262340359e-01f, +4.585268310e-02f, -1.553076012e-02f, -4.393812052e-02f, -4.065950696e-02f, -1.879835439e-02f, +4.937896585e-03f, +1.843848724e-02f, +1.837909784e-02f, +9.177264362e-03f, -1.554463854e-03f, -7.867868276e-03f, -8.043220721e-03f, -4.138600157e-03f, +3.552368352e-04f, +2.889969203e-03f, +2.921918074e-03f, +1.477824149e-03f, -2.473892386e-05f, -7.475589927e-04f, -6.822520959e-04f, -2.926440332e-04f, + -4.782564454e-05f, +6.942598828e-04f, +1.651812943e-03f, +1.509362970e-03f, -8.975250834e-04f, -4.739417445e-03f, -6.591096181e-03f, -2.755836392e-03f, +6.526684254e-03f, +1.495101374e-02f, +1.366158520e-02f, -7.653206070e-04f, -2.048997872e-02f, -2.964891839e-02f, -1.662203705e-02f, +1.387685042e-02f, +4.057533827e-02f, +4.050879353e-02f, +8.635310265e-03f, -3.463693493e-02f, -5.673377797e-02f, -3.832603163e-02f, +9.628619345e-03f, +5.246784902e-02f, +5.813722997e-02f, +2.235408493e-02f, -2.800007029e-02f, -5.606226953e-02f, -4.332429479e-02f, -2.360931390e-03f, +3.513126686e-02f, +4.369761893e-02f, +2.193747398e-02f, -1.001933368e-02f, -2.862617914e-02f, -2.441149517e-02f, -5.753825781e-03f, +1.118734151e-02f, +1.583223937e-02f, +9.068771944e-03f, -7.990745172e-04f, -6.254954431e-03f, -5.559287626e-03f, -1.819393039e-03f, +1.134600982e-03f, +1.781339318e-03f, +9.521987690e-04f, +7.880774639e-05f, + +2.114314640e-05f, +2.402031080e-05f, -3.489473056e-06f, -5.787398607e-05f, -1.021742297e-04f, -8.205323572e-05f, +3.073382484e-05f, +1.950818736e-04f, +2.981584054e-04f, +2.160797036e-04f, -8.595071913e-05f, -4.811414114e-04f, -7.072009381e-04f, -5.097856788e-04f, +1.621958337e-04f, +1.035441599e-03f, +1.575895357e-03f, +1.248613006e-03f, -1.458931227e-04f, -2.256696583e-03f, -4.248431559e-03f, -5.159375410e-03f, -4.385797410e-03f, -2.031255250e-03f, +1.086154718e-03f, +3.793573174e-03f, +5.109462957e-03f, +4.688951385e-03f, +2.939000589e-03f, +7.604891965e-04f, -9.226316762e-04f, -1.585730846e-03f, -1.268332935e-03f, -4.350912186e-04f, +3.446736192e-04f, +6.991147656e-04f, +5.838578326e-04f, +2.099631606e-04f, -1.428395536e-04f, -2.967372692e-04f, -2.403360389e-04f, -8.072975785e-05f, +5.646952880e-05f, +1.051278059e-04f, +7.532679167e-05f, +1.868087567e-05f, -1.914268171e-05f, -2.440573637e-05f, + -2.506595819e-05f, -6.208023054e-05f, -4.415898908e-05f, +6.953530181e-05f, +2.154997430e-04f, +2.267078061e-04f, -2.354189483e-05f, -4.326763660e-04f, -6.470168316e-04f, -3.246550398e-04f, +4.814922535e-04f, +1.196674685e-03f, +1.097473649e-03f, -2.166481680e-05f, -1.474623762e-03f, -2.067024802e-03f, -1.068331401e-03f, +1.016755263e-03f, +2.646584855e-03f, +2.409627157e-03f, +2.574437953e-04f, -2.289227892e-03f, -3.258593194e-03f, -1.818091573e-03f, +9.941286267e-04f, +3.054588224e-03f, +2.835891805e-03f, +5.950365752e-04f, -1.896916352e-03f, -2.810128809e-03f, -1.657348110e-03f, +4.737242104e-04f, +1.929715963e-03f, +1.805509649e-03f, +4.935575695e-04f, -8.427150406e-04f, -1.279003693e-03f, -7.516667697e-04f, +1.067469839e-04f, +6.122663293e-04f, +5.405545465e-04f, +1.472412174e-04f, -1.776279014e-04f, -2.421555950e-04f, -1.182379750e-04f, +1.856161600e-05f, +6.556882424e-05f, +3.830173685e-05f, + /* 4,11 (48) */ + -1.797839262e-04f, -5.705807257e-04f, -7.943610518e-04f, -3.496785000e-04f, +9.581298838e-04f, +2.558990017e-03f, +3.141911148e-03f, +1.424361314e-03f, -2.642528801e-03f, -7.100466560e-03f, -8.542919350e-03f, -4.174075979e-03f, +5.639102801e-03f, +1.614152455e-02f, +1.978934366e-02f, +1.059762120e-02f, -1.086164335e-02f, -3.502544879e-02f, -4.587135076e-02f, -2.818930815e-02f, +2.368076642e-02f, +1.004673168e-01f, +1.795774427e-01f, +2.337937284e-01f, +2.431699389e-01f, +2.041762626e-01f, +1.313434989e-01f, +5.054163449e-02f, -1.259175953e-02f, -4.317763132e-02f, -4.158213864e-02f, -2.038408523e-02f, +3.669563650e-03f, +1.800339602e-02f, +1.872377146e-02f, +9.876379128e-03f, -9.706060217e-04f, -7.657905115e-03f, -8.186060275e-03f, -4.435337427e-03f, +1.149007964e-04f, +2.809239445e-03f, +2.978387603e-03f, +1.582951955e-03f, +5.058786781e-05f, -7.288781171e-04f, -7.013947777e-04f, -3.170497696e-04f, + -7.289160273e-05f, +6.321796522e-04f, +1.607653954e-03f, +1.578898272e-03f, -6.820253404e-04f, -4.512709639e-03f, -6.614638076e-03f, -3.188512758e-03f, +5.879667422e-03f, +1.462635870e-02f, +1.414307745e-02f, +4.313540776e-04f, -1.939250507e-02f, -2.967058320e-02f, -1.809666081e-02f, +1.180982562e-02f, +3.950700687e-02f, +4.152554879e-02f, +1.128189512e-02f, -3.222730777e-02f, -5.647633418e-02f, -4.061525952e-02f, +6.370026151e-03f, +5.064975744e-02f, +5.913135860e-02f, +2.540867315e-02f, -2.516417848e-02f, -5.546723295e-02f, -4.522121114e-02f, -5.171060199e-03f, +3.347391875e-02f, +4.417134314e-02f, +2.386718994e-02f, -8.213824032e-03f, -2.813262157e-02f, -2.525421021e-02f, -7.032829474e-03f, +1.043567474e-02f, +1.593898636e-02f, +9.681038274e-03f, -2.585199707e-04f, -6.107713214e-03f, -5.736915528e-03f, -2.061548634e-03f, +1.016363007e-03f, +1.799900934e-03f, +1.017767593e-03f, +1.171094832e-04f, + +2.032459926e-05f, +2.460697086e-05f, -7.802366320e-07f, -5.423212726e-05f, -1.007525581e-04f, -8.601535640e-05f, +2.132956422e-05f, +1.851908887e-04f, +2.960872217e-04f, +2.280289067e-04f, -6.216550883e-05f, -4.583176107e-04f, -7.034697038e-04f, -5.370296229e-04f, +1.097988158e-04f, +9.843715783e-04f, +1.563007677e-03f, +1.300823683e-03f, -3.120562914e-05f, -2.117978792e-03f, -4.146445129e-03f, -5.148645087e-03f, -4.485524544e-03f, -2.212088805e-03f, +8.909585180e-04f, +3.657484738e-03f, +5.078461389e-03f, +4.761745523e-03f, +3.071438158e-03f, +8.903907804e-04f, -8.447000245e-04f, -1.576115501e-03f, -1.309366105e-03f, -4.910136010e-04f, +3.061393594e-04f, +6.918695702e-04f, +6.016008928e-04f, +2.353727258e-04f, -1.256045662e-04f, -2.939449663e-04f, -2.483026841e-04f, -9.115875605e-05f, +5.021681594e-05f, +1.048028527e-04f, +7.856878056e-05f, +2.200368024e-05f, -1.776326699e-05f, -2.485289707e-05f, + -2.249519359e-05f, -6.065202711e-05f, -4.804651873e-05f, +6.015583712e-05f, +2.083676856e-04f, +2.331834640e-04f, -6.770848861e-07f, -4.083916371e-04f, -6.470662585e-04f, -3.623634157e-04f, +4.257833885e-04f, +1.169549304e-03f, +1.135794214e-03f, +6.937474964e-05f, -1.396719979e-03f, -2.074395682e-03f, -1.174650167e-03f, +8.813995793e-04f, +2.589705622e-03f, +2.488983513e-03f, +4.249506554e-04f, -2.158558199e-03f, -3.269375510e-03f, -1.967622483e-03f, +8.177176306e-04f, +2.984526936e-03f, +2.921259728e-03f, +7.647279520e-04f, -1.773143062e-03f, -2.817464960e-03f, -1.775143192e-03f, +3.445958614e-04f, +1.882186182e-03f, +1.858009816e-03f, +5.891793017e-04f, -7.797996862e-04f, -1.283898334e-03f, -8.026117632e-04f, +5.803657589e-05f, +5.981467065e-04f, +5.586638714e-04f, +1.733364085e-04f, -1.644573947e-04f, -2.453588821e-04f, -1.280780387e-04f, +1.223419269e-05f, +6.541522858e-05f, +4.092953074e-05f, + /* 4,12 (48) */ + -1.594593269e-04f, -5.459737548e-04f, -7.951412884e-04f, -4.039106273e-04f, +8.573773257e-04f, +2.472974661e-03f, +3.163240712e-03f, +1.609552203e-03f, -2.346441579e-03f, -6.872437653e-03f, -8.605084859e-03f, -4.632393590e-03f, +4.935633097e-03f, +1.560449493e-02f, +1.989914247e-02f, +1.158199278e-02f, -9.298635668e-03f, -3.372462511e-02f, -4.590255639e-02f, -3.030728694e-02f, +1.953432129e-02f, +9.531867170e-02f, +1.750919182e-01f, +2.315816396e-01f, +2.440608974e-01f, +2.078337474e-01f, +1.364219603e-01f, +5.530338001e-02f, -9.520321375e-03f, -4.228724054e-02f, -4.242683867e-02f, -2.196020074e-02f, +2.360197545e-03f, +1.751238242e-02f, +1.902991082e-02f, +1.056824870e-02f, -3.690051289e-04f, -7.422532389e-03f, -8.311664841e-03f, -4.729282393e-03f, -1.334018877e-04f, +2.718080689e-03f, +3.028604419e-03f, +1.687754808e-03f, +1.291566484e-04f, -7.068744368e-04f, -7.191580447e-04f, -3.419026667e-04f, + -9.538679632e-05f, +5.715276251e-04f, +1.559607435e-03f, +1.639054109e-03f, -4.736576549e-04f, -4.279526175e-03f, -6.615315161e-03f, -3.596904395e-03f, +5.232601164e-03f, +1.426399528e-02f, +1.456886084e-02f, +1.600903381e-03f, -1.825671085e-02f, -2.960120845e-02f, -1.949338079e-02f, +9.735429939e-03f, +3.833235670e-02f, +4.240694837e-02f, +1.387160074e-02f, -2.973832426e-02f, -5.605138352e-02f, -4.277381772e-02f, +3.100650641e-03f, +4.868213496e-02f, +5.994907623e-02f, +2.839320009e-02f, -2.224291876e-02f, -5.470250500e-02f, -4.699435420e-02f, -7.988525159e-03f, +3.169877556e-02f, +4.451593900e-02f, +2.574937612e-02f, -6.355814215e-03f, -2.754344226e-02f, -2.603400990e-02f, -8.316727808e-03f, +9.633062975e-03f, +1.599702293e-02f, +1.027918498e-02f, +3.001439006e-04f, -5.934376806e-03f, -5.901372922e-03f, -2.306907516e-03f, +8.882849680e-04f, +1.812135126e-03f, +1.083182822e-03f, +1.580390140e-04f, + +1.946383437e-05f, +2.507083135e-05f, +1.807232852e-06f, -5.057089919e-05f, -9.908437117e-05f, -8.959208158e-05f, +1.217293043e-05f, +1.751005601e-04f, +2.932892410e-04f, +2.390542422e-04f, -3.884562163e-05f, -4.349081821e-04f, -6.980656076e-04f, -5.622843227e-04f, +5.838895299e-05f, +9.321568742e-04f, +1.546728218e-03f, +1.348665889e-03f, +8.035797108e-05f, -1.979090371e-03f, -4.040337745e-03f, -5.131168788e-03f, -4.578708397e-03f, -2.389547080e-03f, +6.943928988e-04f, +3.515924974e-03f, +5.040408874e-03f, +4.828995200e-03f, +3.201943052e-03f, +1.022169247e-03f, -7.626505743e-04f, -1.562449107e-03f, -1.348204232e-03f, -5.470861159e-04f, +2.658826444e-04f, +6.826735565e-04f, +6.182403434e-04f, +2.608383219e-04f, -1.075577770e-04f, -2.902740750e-04f, -2.558267896e-04f, -1.016705850e-04f, +4.359758709e-05f, +1.041471292e-04f, +8.169444519e-05f, +2.540375540e-05f, -1.624621214e-05f, -2.521870143e-05f, + -1.997819080e-05f, -5.902239499e-05f, -5.152445542e-05f, +5.097508111e-05f, +2.007480380e-04f, +2.385701128e-04f, +2.141035931e-05f, -3.834583218e-04f, -6.449391495e-04f, -3.979090191e-04f, +3.699785465e-04f, +1.139220329e-03f, +1.169755890e-03f, +1.586408310e-04f, -1.315601324e-03f, -2.075165918e-03f, -1.276050184e-03f, +7.446799040e-04f, +2.525288040e-03f, +2.560085015e-03f, +5.902221241e-04f, -2.021755815e-03f, -3.270051945e-03f, -2.110929078e-03f, +6.387110148e-04f, +2.905115653e-03f, +2.997878283e-03f, +9.328759901e-04f, -1.643063030e-03f, -2.816067114e-03f, -1.888500953e-03f, +2.129361260e-04f, +1.828080810e-03f, +1.905354028e-03f, +6.844865997e-04f, -7.131923655e-04f, -1.284683345e-03f, -8.520507510e-04f, +7.906233985e-06f, +5.815844655e-04f, +5.753710700e-04f, +1.996906535e-04f, -1.501848820e-04f, -2.477495159e-04f, -1.378560946e-04f, +5.521696940e-06f, +6.494024989e-05f, +4.351565455e-05f, + /* 4,13 (48) */ + -1.399954926e-04f, -5.209029234e-04f, -7.933340555e-04f, -4.544815265e-04f, +7.582929545e-04f, +2.383382579e-03f, +3.175413642e-03f, +1.784652763e-03f, -2.053152338e-03f, -6.633383411e-03f, -8.643930480e-03f, -5.067301772e-03f, +4.237567489e-03f, +1.504221061e-02f, +1.995753143e-02f, +1.251414965e-02f, -7.751907450e-03f, -3.237595922e-02f, -4.582219842e-02f, -3.228637731e-02f, +1.549398355e-02f, +9.018750292e-02f, +1.705132098e-01f, +2.291920925e-01f, +2.447552903e-01f, +2.113496723e-01f, +1.414623692e-01f, +6.013237521e-02f, -6.318378323e-03f, -4.126507130e-02f, -4.318948924e-02f, -2.352264984e-02f, +1.011993314e-03f, +1.696529630e-02f, +1.929579347e-02f, +1.125092225e-02f, +2.492352145e-04f, -7.161694067e-03f, -8.419222618e-03f, -5.019556468e-03f, -3.892286773e-04f, +2.616410104e-03f, +3.072202006e-03f, +1.791901937e-03f, +2.108510936e-04f, -6.814706814e-04f, -7.354042568e-04f, -3.671213681e-04f, + -1.153649871e-04f, +5.125052301e-04f, +1.508082980e-03f, +1.690029190e-03f, -2.729096169e-04f, -4.040956062e-03f, -6.593904801e-03f, -3.980362717e-03f, +4.587662014e-03f, +1.386608626e-02f, +1.493883939e-02f, +2.740123711e-03f, -1.708695496e-02f, -2.944256762e-02f, -2.080898211e-02f, +7.660264021e-03f, +3.705630652e-02f, +4.315162828e-02f, +1.639688878e-02f, -2.717823924e-02f, -5.546116140e-02f, -4.479557353e-02f, -1.694013043e-04f, +4.657120588e-02f, +6.058778724e-02f, +3.129831574e-02f, -1.924504047e-02f, -5.376962901e-02f, -4.863741723e-02f, -1.080459227e-02f, +2.981027461e-02f, +4.472887513e-02f, +2.757745693e-02f, -4.450460187e-03f, -2.685895566e-02f, -2.674720226e-02f, -9.601411153e-03f, +8.781012224e-03f, +1.600492917e-02f, +1.086076945e-02f, +8.755149706e-04f, -5.734686152e-03f, -6.051557804e-03f, -2.554657032e-03f, +7.504288733e-04f, +1.817656823e-03f, +1.148123072e-03f, +2.015546685e-04f, + +1.856640645e-05f, +2.541551119e-05f, +4.268934018e-06f, -4.690290633e-05f, -9.718348809e-05f, -9.278551127e-05f, +3.282499426e-06f, +1.648448594e-04f, +2.897922728e-04f, +2.491507715e-04f, -1.604031493e-05f, -4.109877721e-04f, -6.910422827e-04f, -5.855336396e-04f, +8.068450342e-06f, +8.789479600e-04f, +1.527174191e-03f, +1.392140813e-03f, +1.886513393e-04f, -1.840275841e-03f, -3.930337947e-03f, -5.107037743e-03f, -4.665242587e-03f, -2.563365105e-03f, +4.967594365e-04f, +3.369090678e-03f, +4.995311351e-03f, +4.890527745e-03f, +3.330262345e-03f, +1.155617987e-03f, -6.765567998e-04f, -1.544664201e-03f, -1.384701936e-03f, -6.031742885e-04f, +2.239637995e-04f, +6.715031297e-04f, +6.337052964e-04f, +2.862935634e-04f, -8.872654422e-05f, -2.857102798e-04f, -2.628740404e-04f, -1.122371906e-04f, +3.661966384e-05f, +1.031510331e-04f, +8.468914430e-05f, +2.887242359e-05f, -1.459115580e-05f, -2.549779187e-05f, + -1.752542097e-05f, -5.720976625e-05f, -5.459686724e-05f, +4.202254467e-05f, +1.926898844e-04f, +2.428860696e-04f, +4.266457517e-05f, -3.579848182e-04f, -6.407018084e-04f, -4.312229160e-04f, +3.142690478e-04f, +1.105854670e-03f, +1.199326656e-03f, +2.458698177e-04f, -1.231579914e-03f, -2.069419948e-03f, -1.372261576e-03f, +6.070483377e-04f, +2.453601469e-03f, +2.622762061e-03f, +7.527445461e-04f, -1.879279726e-03f, -3.260645812e-03f, -2.247563083e-03f, +4.576765036e-04f, +2.816590098e-03f, +3.065474889e-03f, +1.098936335e-03f, -1.507053898e-03f, -2.805872340e-03f, -1.997013978e-03f, +7.914526029e-05f, +1.767494544e-03f, +1.947313080e-03f, +7.791577591e-04f, -6.430507441e-04f, -1.281274664e-03f, -8.997806223e-04f, -4.350302225e-05f, +5.625738223e-04f, +5.905744836e-04f, +2.262137482e-04f, -1.348266799e-04f, -2.492864582e-04f, -1.475283405e-04f, -1.564053316e-06f, +6.412929389e-05f, +4.604377184e-05f, + /* 4,14 (48) */ + -1.214290861e-04f, -4.954874122e-04f, -7.890651215e-04f, -5.013844328e-04f, +6.611094664e-04f, +2.290597068e-03f, +3.178696142e-03f, +1.949497623e-03f, -1.763360065e-03f, -6.384232639e-03f, -8.659970795e-03f, -5.478289544e-03f, +3.546525207e-03f, +1.445667697e-02f, +1.996559988e-02f, +1.339309761e-02f, -6.224733259e-03f, -3.098381841e-02f, -4.563354708e-02f, -3.412665315e-02f, +1.156364560e-02f, +8.508046517e-02f, +1.658479672e-01f, +2.266287274e-01f, +2.452520498e-01f, +2.147187630e-01f, +1.464576805e-01f, +6.502290296e-02f, -2.988115978e-03f, -4.010945331e-02f, -4.386604604e-02f, -2.506731404e-02f, -3.727086224e-04f, +1.636212202e-02f, +1.951975726e-02f, +1.192242538e-02f, +8.829405108e-04f, -6.875400504e-03f, -8.507949162e-03f, -5.305266748e-03f, -6.521027177e-04f, +2.504172913e-03f, +3.108821669e-03f, +1.895052970e-03f, +2.955402379e-04f, -6.525982578e-04f, -7.499954126e-04f, -3.926191600e-04f, + -1.328904081e-04f, +4.552954639e-04f, +1.453486113e-03f, +1.732051735e-03f, -8.021973253e-05f, -3.798069993e-03f, -6.551240226e-03f, -4.338347535e-03f, +3.946960206e-03f, +1.343486335e-02f, +1.525310843e-02f, +3.845978381e-03f, -1.588762831e-02f, -2.919669781e-02f, -2.204056203e-02f, +5.590844074e-03f, +3.568404494e-02f, +4.375867662e-02f, +1.885049025e-02f, -2.455547718e-02f, -5.470841685e-02f, -4.667485326e-02f, -3.430047117e-03f, +4.432364280e-02f, +6.104546375e-02f, +3.411490584e-02f, -1.617956558e-02f, -5.267069267e-02f, -5.014447113e-02f, -1.361046461e-02f, +2.781326063e-02f, +4.480802039e-02f, +2.934495148e-02f, -2.503147107e-03f, -2.607979791e-02f, -2.739025301e-02f, -1.088268582e-02f, +7.881231602e-03f, +1.596142614e-02f, +1.142334327e-02f, +1.466089454e-03f, -5.508472404e-03f, -6.186384484e-03f, -2.803943490e-03f, +6.029005328e-04f, +1.816092770e-03f, +1.212252366e-03f, +2.475984404e-04f, + +1.763779865e-05f, +2.564493378e-05f, +6.601447436e-06f, -4.324034279e-05f, -9.506401101e-05f, -9.559884073e-05f, -5.324473980e-06f, +1.544572875e-04f, +2.856253319e-04f, +2.583162013e-04f, +6.203719232e-06f, -3.866306003e-04f, -6.824562554e-04f, -6.067667708e-04f, -4.106534528e-05f, +8.248943874e-04f, +1.504467573e-03f, +1.431258577e-03f, +2.935367743e-04f, -1.701776486e-03f, -3.816679123e-03f, -5.076354457e-03f, -4.745033012e-03f, -2.733284861e-03f, +2.983617596e-04f, +3.217188611e-03f, +4.943187407e-03f, +4.946179436e-03f, +3.456144344e-03f, +1.290524252e-03f, -5.865016042e-04f, -1.522700842e-03f, -1.418716096e-03f, -6.591406331e-04f, +1.804486605e-04f, +6.583392203e-04f, +6.479262746e-04f, +3.116704700e-04f, -6.914107652e-05f, -2.802413978e-04f, -2.694105448e-04f, -1.228295386e-04f, +2.929220594e-05f, +1.018057305e-04f, +8.753816689e-05f, +3.240045182e-05f, -1.279823439e-05f, -2.568494077e-05f, + -1.514649021e-05f, -5.523260112e-05f, -5.726948053e-05f, +3.332559610e-05f, +1.842423113e-04f, +2.461532424e-04f, +6.303458543e-05f, -3.320784716e-04f, -6.344264800e-04f, -4.622457530e-04f, +2.588417395e-04f, +1.069626454e-03f, +1.224490089e-03f, +3.308092521e-04f, -1.144973117e-03f, -2.057262883e-03f, -1.463034725e-03f, +4.689556004e-04f, +2.374936970e-03f, +2.676873833e-03f, +9.120159997e-04f, -1.731605663e-03f, -3.241213287e-03f, -2.377098497e-03f, +2.751886192e-04f, +2.719216202e-03f, +3.123805670e-03f, +1.262369016e-03f, -1.365515110e-03f, -2.786846348e-03f, -2.100287318e-03f, -5.636515345e-05f, +1.700545044e-03f, +1.983672901e-03f, +8.728683017e-04f, -5.695474258e-04f, -1.273601320e-03f, -9.456000801e-04f, -9.604230733e-05f, +5.411178559e-04f, +6.041753047e-04f, +2.528121168e-04f, -1.184039648e-04f, -2.499307227e-04f, -1.570497127e-04f, -9.009032545e-06f, +6.296872165e-05f, +4.849702512e-05f, + /* 4,15 (48) */ + -1.037912875e-04f, -4.698424785e-04f, -7.824636741e-04f, -5.446247756e-04f, +5.660454554e-04f, +2.194998227e-03f, +3.173371668e-03f, +2.103954910e-03f, -1.477734733e-03f, -6.125916438e-03f, -8.653767076e-03f, -5.864920145e-03f, +2.864068951e-03f, +1.384991020e-02f, +1.992453453e-02f, +1.421799200e-02f, -4.720265686e-03f, -2.955255983e-02f, -4.534001030e-02f, -3.582842964e-02f, +7.746966475e-03f, +8.000411071e-02f, +1.611029342e-01f, +2.238954425e-01f, +2.455504115e-01f, +2.179359516e-01f, +1.514008679e-01f, +6.996908239e-02f, +4.680283662e-04f, -3.881892906e-02f, -4.445254764e-02f, -2.659001489e-02f, -1.791424718e-03f, +1.570298138e-02f, +1.970020593e-02f, +1.258076460e-02f, +1.530866785e-03f, -6.563730034e-03f, -8.577090238e-03f, -5.585508145e-03f, -9.215132624e-04f, +2.381343374e-03f, +3.138113875e-03f, +1.996858701e-03f, +3.830784047e-04f, -6.201978060e-04f, -7.627936470e-04f, -4.183041008e-04f, + -1.480368983e-04f, +4.000628628e-04f, +1.396216632e-03f, +1.765377331e-03f, +1.040225788e-04f, -3.551916750e-03f, -6.488205641e-03f, -4.670426006e-03f, +3.312533726e-03f, +1.297261759e-02f, +1.551195017e-02f, +4.915604835e-03f, -1.466313822e-02f, -2.886588855e-02f, -2.318553514e-02f, +3.533581191e-03f, +3.422101022e-02f, +4.422763222e-02f, +2.122542722e-02f, -2.187860335e-02f, -5.379640085e-02f, -4.840645892e-02f, -6.671260404e-03f, +4.194654430e-02f, +6.132065237e-02f, +3.683412204e-02f, -1.305575991e-02f, -5.140832366e-02f, -5.150998624e-02f, -1.639731096e-02f, +2.571297331e-02f, +4.475165524e-02f, +3.104549652e-02f, -5.194742057e-04f, -2.520692960e-02f, -2.795980043e-02f, -1.215628714e-02f, +6.935631522e-03f, +1.586538384e-02f, +1.196446112e-02f, +2.070264759e-03f, -5.255660287e-03f, -6.304788449e-03f, -3.053874213e-03f, +4.458508201e-04f, +1.807083737e-03f, +1.275221087e-03f, +2.960954655e-04f, + +1.668340381e-05f, +2.576330239e-05f, +8.801928510e-06f, -3.959496484e-05f, -9.274027171e-05f, -9.803631935e-05f, -1.363207129e-05f, +1.439707896e-04f, +2.808185262e-04f, +2.665508263e-04f, +2.784242037e-05f, -3.619102752e-04f, -6.723667394e-04f, -6.259781652e-04f, -8.892008168e-05f, +7.701444613e-04f, +1.478734758e-03f, +1.466038086e-03f, +3.948853898e-04f, -1.563829895e-03f, -3.699598995e-03f, -5.039232434e-03f, -4.817997977e-03f, -2.899055761e-03f, +9.950496562e-05f, +3.060435122e-03f, +4.884068303e-03f, +4.995795890e-03f, +3.579339114e-03f, +1.426669522e-03f, -4.925772700e-04f, -1.496506860e-03f, -1.450106209e-03f, -7.148449213e-04f, +1.354085236e-04f, +6.431674293e-04f, +6.608354264e-04f, +3.368996142e-04f, -4.883441716e-05f, -2.738574663e-04f, -2.754029446e-04f, -1.334176747e-04f, +2.162572117e-05f, +1.001032074e-04f, +9.022677896e-05f, +3.597806555e-05f, -1.086809859e-05f, -2.577507531e-05f, + -1.285012779e-05f, -5.310929686e-05f, -5.954958857e-05f, +2.490941987e-05f, +1.754542022e-04f, +2.483969291e-04f, +8.247435647e-05f, -3.058451921e-04f, -6.261909334e-04f, -4.909277589e-04f, +2.038784127e-04f, +1.030716273e-03f, +1.245245151e-03f, +4.132185360e-04f, -1.056102385e-03f, -2.038819890e-03f, -1.548140897e-03f, +3.308495136e-04f, +2.289606150e-03f, +2.722308581e-03f, +1.067547924e-03f, -1.579224448e-03f, -3.211843143e-03f, -2.499132998e-03f, +9.182675706e-05f, +2.613289263e-03f, +3.172656367e-03f, +1.422640286e-03f, -1.218866689e-03f, -2.758983809e-03f, -2.197939940e-03f, -1.931735069e-04f, +1.627372799e-03f, +2.014235506e-03f, +9.652920767e-04f, -4.928695846e-04f, -1.261605930e-03f, -9.893104132e-04f, -1.495552505e-04f, +5.172287092e-04f, +6.160780337e-04f, +2.793890885e-04f, -1.009428352e-04f, -2.496456082e-04f, -1.663740391e-04f, -1.679698635e-05f, +6.144595631e-05f, +5.085810041e-05f, + /* 5, 0 (48) */ + -9.712561017e-05f, +5.630052980e-04f, +1.206067011e-03f, +7.527819647e-04f, -1.206557913e-03f, -3.245991688e-03f, -2.728345499e-03f, +1.489426586e-03f, +6.622324221e-03f, +7.089903931e-03f, -2.805093114e-04f, -1.122619085e-02f, -1.522873798e-02f, -4.406023078e-03f, +1.648289776e-02f, +2.943133839e-02f, +1.647195998e-02f, -2.143009154e-02f, -5.654855430e-02f, -4.868148545e-02f, +2.497919491e-02f, +1.464018327e-01f, +2.604437981e-01f, +3.070623956e-01f, +2.604437981e-01f, +1.464018327e-01f, +2.497919491e-02f, -4.868148545e-02f, -5.654855430e-02f, -2.143009154e-02f, +1.647195998e-02f, +2.943133839e-02f, +1.648289776e-02f, -4.406023078e-03f, -1.522873798e-02f, -1.122619085e-02f, -2.805093114e-04f, +7.089903931e-03f, +6.622324221e-03f, +1.489426586e-03f, -2.728345499e-03f, -3.245991688e-03f, -1.206557913e-03f, +7.527819647e-04f, +1.206067011e-03f, +5.630052980e-04f, -9.712561017e-05f, -2.479949097e-04f, + +5.939400487e-04f, -2.971519080e-04f, -2.102283883e-03f, -2.360885377e-03f, +1.198769271e-03f, +6.225411832e-03f, +5.885033052e-03f, -3.266913899e-03f, -1.360369760e-02f, -1.128997664e-02f, +6.959510654e-03f, +2.424665836e-02f, +1.796260386e-02f, -1.233743150e-02f, -3.690527276e-02f, -2.458115068e-02f, +1.881243249e-02f, +4.916511396e-02f, +2.951026661e-02f, -2.514630357e-02f, -5.812289420e-02f, -3.141212080e-02f, +2.978290985e-02f, +6.141247912e-02f, +2.978290985e-02f, -3.141212080e-02f, -5.812289420e-02f, -2.514630357e-02f, +2.951026661e-02f, +4.916511396e-02f, +1.881243249e-02f, -2.458115068e-02f, -3.690527276e-02f, -1.233743150e-02f, +1.796260386e-02f, +2.424665836e-02f, +6.959510654e-03f, -1.128997664e-02f, -1.360369760e-02f, -3.266913899e-03f, +5.885033052e-03f, +6.225411832e-03f, +1.198769271e-03f, -2.360885377e-03f, -2.102283883e-03f, -2.971519080e-04f, +5.939400487e-04f, +3.757269824e-04f, + -2.508302509e-05f, -5.057785772e-05f, -1.918107920e-05f, +7.614726015e-05f, +1.495424008e-04f, +7.931711402e-05f, -1.459714138e-04f, -3.406750891e-04f, -2.433712429e-04f, +1.983896676e-04f, +6.524107990e-04f, +6.007705035e-04f, -1.502978448e-04f, -1.100700600e-03f, -1.299390585e-03f, -1.772665892e-04f, +1.689680367e-03f, +2.690517210e-03f, +1.332314287e-03f, -2.360472425e-03f, -6.418436176e-03f, -8.056724670e-03f, -5.673724385e-03f, -1.913317227e-04f, +5.398188759e-03f, +8.029841120e-03f, +6.618456882e-03f, +2.632051071e-03f, -1.158478686e-03f, -2.684491539e-03f, -1.796887600e-03f, +6.940613874e-05f, +1.268675429e-03f, +1.145022466e-03f, +2.127596292e-04f, -5.728784120e-04f, -6.688059981e-04f, -2.317208331e-04f, +2.243769326e-04f, +3.453724072e-04f, +1.618744025e-04f, -6.884228518e-05f, -1.503606098e-04f, -8.271393049e-05f, +1.468554497e-05f, +5.074766006e-05f, +2.734599447e-05f, -3.833276021e-06f, + +1.008568569e-05f, +9.639225967e-05f, +1.014076270e-04f, -8.748225870e-05f, -3.212645130e-04f, -2.329728192e-04f, +2.917425243e-04f, +7.442576965e-04f, +4.046105230e-04f, -6.801120963e-04f, -1.372439335e-03f, -5.665968633e-04f, +1.265687754e-03f, +2.132658970e-03f, +6.521483036e-04f, -1.987873747e-03f, -2.875817282e-03f, -6.074058072e-04f, +2.711331088e-03f, +3.420033908e-03f, +4.211150561e-04f, -3.262185724e-03f, -3.617154996e-03f, -1.364461560e-04f, +3.490126337e-03f, +3.411893142e-03f, -1.638129533e-04f, -3.328507442e-03f, -2.864275019e-03f, +3.923144403e-04f, +2.822614710e-03f, +2.124180390e-03f, -4.941334060e-04f, -2.111330779e-03f, -1.371270310e-03f, +4.663515915e-04f, +1.371323979e-03f, +7.501865082e-04f, -3.514638438e-04f, -7.515829083e-04f, -3.304016101e-04f, +2.109512166e-04f, +3.288820696e-04f, +1.041165060e-04f, -9.544071803e-05f, -1.008885095e-04f, -1.481360237e-05f, +2.719430556e-05f, + /* 5, 1 (48) */ + -1.222086353e-04f, +5.124274402e-04f, +1.186885931e-03f, +8.289292249e-04f, -1.057015512e-03f, -3.166674574e-03f, -2.874316912e-03f, +1.148751496e-03f, +6.378952979e-03f, +7.288293598e-03f, +3.719014876e-04f, -1.062542035e-02f, -1.537903583e-02f, -5.506723678e-03f, +1.518350718e-02f, +2.925407180e-02f, +1.816164035e-02f, -1.873957433e-02f, -5.521624002e-02f, -5.104195788e-02f, +1.856075873e-02f, +1.383451080e-01f, +2.547700737e-01f, +3.068710639e-01f, +2.658419868e-01f, +1.544316738e-01f, +3.159765179e-02f, -4.604943438e-02f, -5.770703299e-02f, -2.411458308e-02f, +1.467507238e-02f, +2.950074453e-02f, +1.775157319e-02f, -3.261000612e-03f, -1.501597835e-02f, -1.179906927e-02f, -9.493153096e-04f, +6.858183098e-03f, +6.846701154e-03f, +1.834798993e-03f, -2.566471096e-03f, -3.314833973e-03f, -1.356918523e-03f, +6.700680342e-04f, +1.220752556e-03f, +6.137529580e-04f, -6.977961571e-05f, -2.518281858e-04f, + +6.040257344e-04f, -2.007596483e-04f, -2.000876256e-03f, -2.448367636e-03f, +8.775047576e-04f, +5.992439012e-03f, +6.176775576e-03f, -2.522656203e-03f, -1.319908707e-02f, -1.197008873e-02f, +5.587071319e-03f, +2.368006150e-02f, +1.922829162e-02f, -1.020477253e-02f, -3.625312446e-02f, -2.656902443e-02f, +1.593661521e-02f, +4.855770816e-02f, +3.222159770e-02f, -2.172626967e-02f, -5.770177914e-02f, -3.467430652e-02f, +2.616575485e-02f, +6.127603297e-02f, +3.327303618e-02f, -2.800022766e-02f, -5.828670715e-02f, -2.847481101e-02f, +2.664599159e-02f, +4.955742841e-02f, +2.163504720e-02f, -2.245697029e-02f, -3.739940617e-02f, -1.444876228e-02f, +1.659133356e-02f, +2.471300995e-02f, +8.330834633e-03f, -1.053979013e-02f, -1.395516144e-02f, -4.018496808e-03f, +5.554631442e-03f, +6.436363048e-03f, +1.527651340e-03f, -2.256768871e-03f, -2.197724601e-03f, -3.980404175e-04f, +5.791264463e-04f, +4.029212880e-04f, + -2.281208434e-05f, -5.017048726e-05f, -2.339141928e-05f, +6.951154581e-05f, +1.481249922e-04f, +8.911175882e-05f, -1.299825782e-04f, -3.347647599e-04f, -2.608764580e-04f, +1.651833839e-04f, +6.339296100e-04f, +6.256750450e-04f, -8.879179446e-05f, -1.053316962e-03f, -1.324532268e-03f, -2.818289479e-04f, +1.579065996e-03f, +2.686788922e-03f, +1.496322096e-03f, -2.090629234e-03f, -6.208548452e-03f, -8.066993076e-03f, -5.936404813e-03f, -5.735503789e-04f, +5.110383358e-03f, +7.986246299e-03f, +6.807960120e-03f, +2.904663123e-03f, -9.750973470e-04f, -2.668473744e-03f, -1.900214177e-03f, -4.143284789e-05f, +1.232368496e-03f, +1.186038462e-03f, +2.759575187e-04f, -5.420338332e-04f, -6.829958540e-04f, -2.650454587e-04f, +2.039295517e-04f, +3.488011481e-04f, +1.776211840e-04f, -5.771011145e-05f, -1.505544017e-04f, -8.917830032e-05f, +9.914746689e-06f, +5.066803309e-05f, +2.958766734e-05f, -2.491308441e-06f, + +5.600138690e-06f, +9.158013602e-05f, +1.065180250e-04f, -7.111861119e-05f, -3.123047380e-04f, -2.530462502e-04f, +2.529040111e-04f, +7.335582551e-04f, +4.544147255e-04f, -6.085229571e-04f, -1.367108885e-03f, -6.622257906e-04f, +1.156134388e-03f, +2.143836296e-03f, +8.049429437e-04f, -1.844174763e-03f, -2.915341338e-03f, -8.177702581e-04f, +2.547228180e-03f, +3.495490471e-03f, +6.753471971e-04f, -3.098138979e-03f, -3.727586997e-03f, -4.087067610e-04f, +3.347065450e-03f, +3.546524520e-03f, +9.537642794e-05f, -3.221242552e-03f, -3.005262188e-03f, +1.734621290e-04f, +2.755838884e-03f, +2.252359276e-03f, -3.315766088e-04f, -2.079793499e-03f, -1.472302924e-03f, +3.618865460e-04f, +1.363627926e-03f, +8.183617051e-04f, -2.951538003e-04f, -7.553980289e-04f, -3.686736639e-04f, +1.870303451e-04f, +3.350629867e-04f, +1.209377896e-04f, -8.861192429e-05f, -1.050228857e-04f, -1.976523353e-05f, +2.669965649e-05f, + /* 5, 2 (48) */ + -1.450207196e-04f, +4.622569530e-04f, +1.163494512e-03f, +8.984407707e-04f, -9.088905201e-04f, -3.077562815e-03f, -3.004299491e-03f, +8.139867365e-04f, +6.118076521e-03f, +7.453476982e-03f, +1.005831098e-03f, -9.999745306e-03f, -1.546782762e-02f, -6.560040640e-03f, +1.385897491e-02f, +2.897224286e-02f, +1.974070635e-02f, -1.605278541e-02f, -5.371991792e-02f, -5.313258711e-02f, +1.235221028e-02f, +1.302781149e-01f, +2.488336689e-01f, +3.062975135e-01f, +2.709523702e-01f, +1.624179201e-01f, +3.840561191e-02f, -4.314477126e-02f, -5.868213034e-02f, -2.678305683e-02f, +1.277485821e-02f, +2.945931168e-02f, +1.898394169e-02f, -2.074962149e-03f, -1.474002084e-02f, -1.234110310e-02f, -1.632311164e-03f, +6.593137639e-03f, +7.050630706e-03f, +2.183600141e-03f, -2.388849912e-03f, -3.372544084e-03f, -1.507472925e-03f, +5.808897339e-04f, +1.230667302e-03f, +6.644209911e-04f, -4.019194836e-05f, -2.543194942e-04f, + +6.096258730e-04f, -1.091795123e-04f, -1.894358231e-03f, -2.519486247e-03f, +5.652000196e-04f, +5.739392762e-03f, +6.429679587e-03f, -1.789097948e-03f, -1.274467235e-02f, -1.257861169e-02f, +4.219962434e-03f, +2.301783571e-02f, +2.038442601e-02f, -8.060936232e-03f, -3.544818151e-02f, -2.841319919e-02f, +1.302127387e-02f, +4.773993790e-02f, +3.476882588e-02f, -1.823077919e-02f, -5.702643195e-02f, -3.777244550e-02f, +2.243816785e-02f, +6.086732621e-02f, +3.662010163e-02f, -2.445370314e-02f, -5.819133072e-02f, -3.169605357e-02f, +2.364072940e-02f, +4.973089053e-02f, +2.439088608e-02f, -2.020461102e-02f, -3.773098278e-02f, -1.652855578e-02f, +1.511903063e-02f, +2.507489650e-02f, +9.694462559e-03f, -9.721428422e-03f, -1.425031524e-02f, -4.773894837e-03f, +5.185957778e-03f, +6.623393393e-03f, +1.862714327e-03f, -2.135831082e-03f, -2.286336525e-03f, -5.030633032e-04f, +5.593612128e-04f, +4.296209445e-04f, + -2.054597997e-05f, -4.953813809e-05f, -2.730837028e-05f, +6.283919623e-05f, +1.461354251e-04f, +9.820701606e-05f, -1.139765576e-04f, -3.277004432e-04f, -2.768635425e-04f, +1.322295665e-04f, +6.134870589e-04f, +6.475693674e-04f, -2.845238567e-05f, -1.003121559e-03f, -1.344138791e-03f, -3.827926075e-04f, +1.465518940e-03f, +2.673570778e-03f, +1.650254353e-03f, -1.823208447e-03f, -5.989464080e-03f, -8.060786240e-03f, -6.185680776e-03f, -9.544359400e-04f, +4.810928188e-03f, +7.925888400e-03f, +6.986317469e-03f, +3.177593401e-03f, -7.824862200e-04f, -2.642252808e-03f, -1.999189150e-03f, -1.549126151e-04f, +1.190471988e-03f, +1.223511463e-03f, +3.396638220e-04f, -5.082843731e-04f, -6.948668979e-04f, -2.982287329e-04f, +1.820721445e-04f, +3.509095356e-04f, +1.931399588e-04f, -4.594707460e-05f, -1.501005583e-04f, -9.550639630e-05f, +4.880361657e-06f, +5.032793323e-05f, +3.179425506e-05f, -1.040985477e-06f, + +1.373031687e-06f, +8.649795645e-05f, +1.107821223e-04f, -5.510432378e-05f, -3.021011351e-04f, -2.711345839e-04f, +2.140883933e-04f, +7.196339889e-04f, +5.007186730e-04f, -5.358023371e-04f, -1.355496472e-03f, -7.528718237e-04f, +1.043198748e-03f, +2.144969009e-03f, +9.518731857e-04f, -1.693845381e-03f, -2.941147774e-03f, -1.022472742e-03f, +2.372811083e-03f, +3.554623527e-03f, +9.253463350e-04f, -2.920555137e-03f, -3.820937052e-03f, -6.790752835e-04f, +3.188613303e-03f, +3.665412401e-03f, +3.552563934e-04f, -3.098647428e-03f, -3.133546031e-03f, -4.815868112e-05f, +2.675661381e-03f, +2.371705449e-03f, -1.651875793e-04f, -2.038037948e-03f, -1.568218952e-03f, +2.536268595e-04f, +1.349246533e-03f, +8.842539332e-04f, -2.358804181e-04f, -7.555818373e-04f, -4.063467844e-04f, +1.612711930e-04f, +3.397174985e-04f, +1.378580622e-04f, -8.092094178e-05f, -1.087495025e-04f, -2.491934601e-05f, +2.594761520e-05f, + /* 5, 3 (48) */ + -1.655666996e-04f, +4.127188149e-04f, +1.136186142e-03f, +9.612799669e-04f, -7.627550950e-04f, -2.979355799e-03f, -3.118276048e-03f, +4.862862933e-04f, +5.841212978e-03f, +7.585706549e-03f, +1.619318156e-03f, -9.352175938e-03f, -1.549628001e-02f, -7.563162199e-03f, +1.251483612e-02f, +2.858945025e-02f, +2.120622529e-02f, -1.337921463e-02f, -5.206966357e-02f, -5.495579556e-02f, +6.362746202e-03f, +1.222173287e-01f, +2.426479881e-01f, +3.053430776e-01f, +2.757632984e-01f, +1.703438085e-01f, +4.539192938e-02f, -3.996717785e-02f, -5.946461656e-02f, -2.942530964e-02f, +1.077566906e-02f, +2.930439907e-02f, +2.017441367e-02f, -8.514506861e-04f, -1.440035701e-02f, -1.284938747e-02f, -2.327178061e-03f, +6.294908906e-03f, +7.232702850e-03f, +2.534509676e-03f, -2.195709953e-03f, -3.418491159e-03f, -1.657573483e-03f, +4.853833376e-04f, +1.235547664e-03f, +7.147489243e-04f, -8.397693308e-06f, -2.553604797e-04f, + +6.109989047e-04f, -2.268155584e-05f, -1.783576109e-03f, -2.574590571e-03f, +2.630988845e-04f, +5.468258178e-03f, +6.643767981e-03f, -1.069463959e-03f, -1.224395368e-02f, -1.311441403e-02f, +2.864465963e-03f, +2.226496388e-02f, +2.142762475e-02f, -5.915967223e-03f, -3.449630833e-02f, -3.010704457e-02f, +1.008012610e-02f, +4.671746516e-02f, +3.714163696e-02f, -1.467615567e-02f, -5.610108561e-02f, -4.069300064e-02f, +1.861723080e-02f, +6.018825092e-02f, +3.980871493e-02f, -2.078829074e-02f, -5.783607433e-02f, -3.479470099e-02f, +2.050718337e-02f, +4.968273185e-02f, +2.706654746e-02f, -1.783290557e-02f, -3.789617035e-02f, -1.856659372e-02f, +1.355081168e-02f, +2.532852336e-02f, +1.104370909e-02f, -8.837174489e-03f, -1.448619566e-02f, -5.529476674e-03f, +4.779610994e-03f, +6.784664586e-03f, +2.202431825e-03f, -1.997973020e-03f, -2.367257467e-03f, -6.118128057e-04f, +5.344418668e-04f, +4.555685597e-04f, + -1.829695311e-05f, -4.869403775e-05f, -3.092545234e-05f, +5.616164946e-05f, +1.436023867e-04f, +1.065872949e-04f, -9.802006855e-05f, -3.195442804e-04f, -2.913103906e-04f, +9.965154298e-05f, +5.912124291e-04f, +6.664430018e-04f, +3.051880904e-05f, -9.503692440e-04f, -1.358267912e-03f, -4.798765786e-04f, +1.349512981e-03f, +2.651151527e-03f, +1.793897867e-03f, -1.558880023e-03f, -5.761871190e-03f, -8.038287157e-03f, -6.421040627e-03f, -1.333103914e-03f, +4.500476158e-03f, +7.848760342e-03f, +7.152924603e-03f, +3.450115621e-03f, -5.809946439e-04f, -2.605646011e-03f, -2.093345793e-03f, -2.706780347e-04f, +1.143009043e-03f, +1.257212371e-03f, +4.036434917e-04f, -4.716902823e-04f, -7.043121473e-04f, -3.311329249e-04f, +1.588547770e-04f, +3.516499085e-04f, +2.083577617e-04f, -3.358328975e-05f, -1.489780312e-04f, -1.016636668e-04f, -4.041819234e-07f, +4.971722257e-05f, +3.395156363e-05f, +5.143564259e-07f, + -2.582138931e-06f, +8.119107346e-05f, +1.142147107e-04f, -3.951307321e-05f, -2.907553767e-04f, -2.872126999e-04f, +1.754917821e-04f, +7.026467049e-04f, +5.433862206e-04f, -4.623303147e-04f, -1.337793488e-03f, -8.381997143e-04f, +9.274757092e-04f, +2.136210154e-03f, +1.092331806e-03f, -1.537670045e-03f, -2.953263164e-03f, -1.220613385e-03f, +2.188967178e-03f, +3.597258120e-03f, +1.169974583e-03f, -2.730297901e-03f, -3.896801234e-03f, -9.463004484e-04f, +3.015484417e-03f, +3.767961988e-03f, +6.146219611e-04f, -2.961205417e-03f, -3.248435191e-03f, -2.715336861e-04f, +2.582319918e-03f, +2.481548241e-03f, +4.295809510e-06f, -1.986104763e-03f, -1.658467293e-03f, +1.420245927e-04f, +1.328106554e-03f, +9.474821865e-04f, -1.738640922e-04f, -7.520287966e-04f, -4.432058116e-04f, +1.337468773e-04f, +3.427611766e-04f, +1.547851520e-04f, -7.237274682e-05f, -1.120228962e-04f, -3.025215391e-05f, +2.492684353e-05f, + /* 5, 4 (48) */ + -1.838636527e-04f, +3.640247771e-04f, +1.105260690e-03f, +1.017441616e-03f, -6.191527084e-04f, -2.872768504e-03f, -3.216296117e-03f, +1.667420129e-04f, +5.549902587e-03f, +7.685358092e-03f, +2.210530586e-03f, -8.685732937e-03f, -1.546576120e-02f, -8.513531443e-03f, +1.115656820e-02f, +2.810957367e-02f, +2.255573827e-02f, -1.072806311e-02f, -5.027576570e-02f, -5.651467558e-02f, +6.008750117e-04f, +1.141790415e-01f, +2.362269475e-01f, +3.040099737e-01f, +2.802637745e-01f, +1.781925688e-01f, +5.254485398e-02f, -3.651706223e-02f, -6.004561120e-02f, -3.203095565e-02f, +8.682323264e-03f, +2.903372103e-02f, +2.131742272e-02f, +4.057616846e-04f, -1.399671352e-02f, -1.332107775e-02f, -3.031490209e-03f, +5.963775981e-03f, +7.391557627e-03f, +2.886159585e-03f, -1.987352192e-03f, -3.452074449e-03f, -1.806551514e-03f, +3.837196708e-04f, +1.235143482e-03f, +7.644661469e-04f, +2.555387032e-05f, -2.548461232e-04f, + +6.084167658e-04f, +5.850951761e-05f, -1.669361398e-03f, -2.614103644e-03f, -2.765649223e-05f, +5.181045478e-03f, +6.819259763e-03f, -3.668172540e-04f, -1.170056746e-02f, -1.357674434e-02f, +1.526672475e-03f, +2.142676417e-02f, +2.235510046e-02f, -3.779757068e-03f, -3.340397652e-02f, -3.164471462e-02f, +7.126862931e-03f, +4.549685177e-02f, +3.933060414e-02f, -1.107889755e-02f, -5.493111103e-02f, -4.342329854e-02f, +1.472042957e-02f, +5.924195048e-02f, +4.282419935e-02f, -1.702032875e-02f, -5.722145237e-02f, -3.775590641e-02f, +1.725874818e-02f, +4.941119817e-02f, +2.964886738e-02f, -1.535135733e-02f, -3.789187454e-02f, -2.055269849e-02f, +1.189234439e-02f, +2.547054795e-02f, +1.237181565e-02f, -7.889692302e-03f, -1.466005975e-02f, -6.281505470e-03f, +4.336405182e-03f, +6.918411464e-03f, +2.545193002e-03f, -1.843187868e-03f, -2.439630214e-03f, -7.238357019e-04f, +5.041897128e-04f, +4.804954032e-04f, + -1.607663367e-05f, -4.765196158e-05f, -3.423787293e-05f, +4.950925812e-05f, +1.405560294e-04f, +1.142405788e-04f, -8.217765240e-05f, -3.103611873e-04f, -3.042017402e-04f, +6.756799030e-05f, +5.672390375e-04f, +6.822974410e-04f, +8.793011604e-05f, -8.953186611e-04f, -1.366996215e-03f, -5.728200767e-04f, +1.231519640e-03f, +2.619843217e-03f, +1.927074180e-03f, -1.298295096e-03f, -5.526473475e-03f, -7.999721116e-03f, -6.642011674e-03f, -1.708676149e-03f, +4.179711288e-03f, +7.754900054e-03f, +7.307203285e-03f, +3.721494474e-03f, -3.710047202e-04f, -2.558499992e-03f, -2.182223262e-03f, -3.883575103e-04f, +1.090024104e-03f, +1.286921163e-03f, +4.676548732e-04f, -4.323245107e-04f, -7.112316931e-04f, -3.636178797e-04f, +1.343345090e-04f, +3.509790369e-04f, +2.232007484e-04f, -2.065247933e-05f, -1.471681076e-04f, -1.076151274e-04f, -5.923709862e-06f, +4.882675536e-05f, +3.604505625e-05f, +2.170594329e-06f, + -6.254422861e-06f, +7.570410508e-05f, +1.168348903e-04f, -2.441321203e-05f, -2.783717331e-04f, -3.012670491e-04f, +1.373032065e-04f, +6.827694336e-04f, +5.823030335e-04f, -3.884819314e-04f, -1.314217345e-03f, -9.179066134e-04f, +8.095634262e-04f, +2.117758113e-03f, +1.225750979e-03f, -1.376451619e-03f, -2.951778960e-03f, -1.411331538e-03f, +1.996621844e-03f, +3.623298329e-03f, +1.408124574e-03f, -2.528288105e-03f, -3.954858788e-03f, -1.209146098e-03f, +2.828463513e-03f, +3.853654204e-03f, +8.722656489e-04f, -2.809473102e-03f, -3.349297257e-03f, -4.956314854e-04f, +2.476117843e-03f, +2.581254969e-03f, +1.761107648e-04f, -1.924084932e-03f, -1.742515420e-03f, +2.755693267e-05f, +1.300167151e-03f, +1.007670250e-03f, -1.093449204e-04f, -7.446500392e-04f, -4.790334108e-04f, +1.045426173e-04f, +3.441156022e-04f, +1.716231578e-04f, -6.297778107e-05f, -1.147983424e-04f, -3.573736284e-05f, +2.362740894e-05f, + /* 5, 5 (48) */ + -1.999402864e-04f, +3.163728156e-04f, +1.071022817e-03f, +1.066950874e-03f, -4.785966790e-04f, -2.758527925e-03f, -3.298473769e-03f, -1.436191744e-04f, +5.245700847e-03f, +7.752926082e-03f, +2.777769623e-03f, -8.003435496e-03f, -1.537783108e-02f, -9.408850104e-03f, +9.789571990e-03f, +2.753675359e-02f, +2.378725791e-02f, -8.108219891e-03f, -4.834869152e-02f, -5.781297067e-02f, -4.925598463e-03f, +1.061793204e-01f, +2.295849358e-01f, +3.023012975e-01f, +2.844434858e-01f, +1.859474689e-01f, +5.985205727e-02f, -3.279556776e-02f, -6.041661592e-02f, -3.458945564e-02f, +6.500100002e-03f, +2.864536352e-02f, +2.240744682e-02f, +1.692682847e-03f, -1.352905865e-02f, -1.375340227e-02f, -3.742721902e-03f, +5.600158101e-03f, +7.525892136e-03f, +3.237138622e-03f, -1.764151443e-03f, -3.472726928e-03f, -1.953719622e-03f, +2.761045433e-04f, +1.229219772e-03f, +8.132929023e-04f, +6.159892657e-05f, -2.526755289e-04f, + +6.021623429e-04f, +1.342136227e-04f, -1.552526508e-03f, -2.638516856e-03f, -3.060282253e-04f, +4.879778429e-03f, +6.956562969e-03f, +3.159521796e-04f, -1.111826442e-02f, -1.396522627e-02f, +2.124551303e-04f, +2.050885756e-02f, +2.316466389e-02f, -1.661998956e-03f, -3.217822554e-02f, -3.302116624e-02f, +4.175083971e-03f, +4.408552023e-02f, +4.132722598e-02f, -7.455599217e-03f, -5.352298645e-02f, -4.595158665e-02f, +1.076557078e-02f, +5.803280438e-02f, +4.565266287e-02f, -1.316667454e-02f, -5.634918672e-02f, -4.056537951e-02f, +1.390945093e-02f, +4.891556668e-02f, +3.212498523e-02f, -1.277010236e-02f, -3.771576378e-02f, -2.247678342e-02f, +1.014982897e-02f, +2.549810488e-02f, +1.367198280e-02f, -6.882022052e-03f, -1.476940467e-02f, -7.026155510e-03f, +3.857371771e-03f, +7.022954081e-03f, +2.889308604e-03f, -1.671564710e-03f, -2.502607995e-03f, -8.386340443e-04f, +4.684523500e-04f, +5.041228121e-04f, + -1.389600048e-05f, -4.642614253e-05f, -3.724249168e-05f, +4.291118337e-05f, +1.370277891e-04f, +1.211583726e-04f, -6.651145955e-05f, -3.002185076e-04f, -3.155290602e-04f, +3.609256965e-05f, +5.417036090e-04f, +6.951458607e-04f, +1.436002750e-04f, -8.382311887e-04f, -1.370418431e-03f, -6.613830285e-04f, +1.112006636e-03f, +2.579979786e-03f, +2.049639612e-03f, -1.042084238e-03f, -5.283987960e-03f, -7.945354762e-03f, -6.848161398e-03f, -2.080283344e-03f, +3.849346823e-03f, +7.644390604e-03f, +7.448603302e-03f, +3.990987763e-03f, -1.529305739e-04f, -2.500691732e-03f, -2.265368269e-03f, -5.075639558e-04f, +1.031583203e-03f, +1.312427929e-03f, +5.314504956e-04f, -3.902727112e-04f, -7.155332732e-04f, -3.955415343e-04f, +1.085753362e-04f, +3.488584262e-04f, +2.375944924e-04f, -7.191930005e-06f, -1.446545704e-04f, -1.133255133e-04f, -1.166131574e-05f, +4.764846214e-05f, +3.805991974e-05f, +3.922811791e-06f, + -9.635371862e-06f, +7.008068125e-05f, +1.186657797e-04f, -9.867568066e-06f, -2.650563955e-04f, -3.132953637e-04f, +9.970380601e-05f, +6.601852187e-04f, +6.173766457e-04f, -3.146253892e-04f, -1.285009845e-03f, -9.917229840e-04f, +6.900603119e-04f, +2.089854939e-03f, +1.351604527e-03f, -1.211007247e-03f, -2.936850373e-03f, -1.593809598e-03f, +1.796733710e-03f, +3.632727262e-03f, +1.638724650e-03f, -2.315499119e-03f, -3.994873537e-03f, -1.466397133e-03f, +2.628401821e-03f, +3.922048391e-03f, +1.126983296e-03f, -2.644077995e-03f, -3.435562247e-03f, -7.194084680e-04f, +2.357423304e-03f, +2.670234486e-03f, +3.494730274e-04f, -1.852120081e-03f, -1.819852361e-03f, -8.927577200e-05f, +1.265420760e-03f, +1.064448760e-03f, -4.258191508e-05f, -7.333742859e-04f, -5.136111991e-04f, +7.375563930e-05f, +3.437090248e-04f, +1.882728830e-04f, -5.275210890e-05f, -1.170321815e-04f, -4.134623355e-05f, +2.204093044e-05f, + /* 5, 6 (48) */ + -2.138362868e-04f, +2.699466730e-04f, +1.033780325e-03f, +1.109862058e-03f, -3.415688898e-04f, -2.637369552e-03f, -3.364985229e-03f, -4.438376820e-04f, +4.930171787e-03f, +7.789018652e-03f, +3.319473232e-03f, -7.308289635e-03f, -1.523423081e-02f, -1.024708129e-02f, +8.419153559e-03f, +2.687537056e-02f, +2.489926454e-02f, -5.528240104e-03f, -4.629905191e-02f, -5.885505491e-02f, -1.020958642e-02f, +9.823396566e-02f, +2.227367744e-01f, +3.002210142e-01f, +2.882928326e-01f, +1.935918595e-01f, +6.730066057e-02f, -2.880458000e-02f, -6.056954650e-02f, -3.709014737e-02f, +4.234731733e-03f, +2.813779957e-02f, +2.343903002e-02f, +3.005110776e-03f, -1.299760815e-02f, -1.414367498e-02f, -4.458255175e-03f, +5.204616567e-03f, +7.634467472e-03f, +3.585997048e-03f, -1.526556951e-03f, -3.479918858e-03f, -2.098374192e-03f, +1.627790300e-04f, +1.217558456e-03f, +8.609413644e-04f, +9.965884631e-05f, -2.487527171e-04f, + +5.925269711e-04f, +2.042943039e-04f, -1.433860728e-03f, -2.648384424e-03f, -5.710846208e-04f, +4.566483066e-03f, +7.056266775e-03f, +9.761373983e-04f, -1.050088778e-02f, -1.427985166e-02f, -1.072554714e-03f, +1.951713457e-02f, +2.385472420e-02f, +4.278559834e-04f, -3.082662102e-02f, -3.423217348e-02f, +1.238233598e-03f, +4.249171064e-02f, +4.312395969e-02f, -3.822871955e-03f, -5.188426180e-02f, -4.826708576e-02f, +6.770697241e-03f, +5.656640725e-02f, +4.828106469e-02f, -9.244626154e-03f, -5.522220343e-02f, -4.320945751e-02f, +1.047388868e-02f, +4.819615821e-02f, +3.448240853e-02f, -1.009986787e-02f, -3.736629075e-02f, -2.432890350e-02f, +8.329976605e-03f, +2.540882911e-02f, +1.493740356e-02f, -5.817573292e-03f, -1.481198659e-02f, -7.759529796e-03f, +3.343760572e-03f, +7.096709720e-03f, +3.233017629e-03f, -1.483291827e-03f, -2.555360104e-03f, -9.556662258e-04f, +4.271061165e-04f, +5.261637426e-04f, + -1.176534634e-05f, -4.503118166e-05f, -3.993777832e-05f, +3.639529768e-05f, +1.330502028e-04f, +1.273356352e-04f, -5.108105047e-05f, -2.891856649e-04f, -3.252904120e-04f, +5.333590443e-06f, +5.147456527e-04f, +7.050127996e-04f, +1.973589024e-04f, -7.793699012e-04f, -1.368646705e-03f, -7.453464948e-04f, +9.914363706e-04f, +2.531915604e-03f, +2.161485201e-03f, -7.908557901e-04f, -5.035142753e-03f, -7.875495044e-03f, -7.039098547e-03f, -2.447067529e-03f, +3.510123255e-03f, +7.517360200e-03f, +7.576604323e-03f, +4.257848572e-03f, +7.278250009e-05f, -2.432129444e-03f, -2.342336748e-03f, -6.278958467e-04f, +9.677741847e-04f, +1.333533885e-03f, +5.947779018e-04f, -3.456331944e-04f, -7.171328272e-04f, -4.267604542e-04f, +8.164810093e-05f, +3.452546102e-04f, +2.514642936e-04f, +6.757567778e-06f, -1.414238512e-04f, -1.187594373e-04f, -1.759838370e-05f, +4.617543122e-05f, +3.998113491e-05f, +5.765296115e-06f, + -1.271898053e-05f, +6.436320670e-05f, +1.197342126e-04f, +4.066716365e-06f, -2.509168103e-04f, -3.233063110e-04f, +6.286608877e-05f, +6.350858861e-04f, +6.485364007e-04f, -2.411203233e-04f, -1.250435457e-03f, -1.059413327e-03f, +5.695620628e-04f, +2.052784506e-03f, +1.469409935e-03f, -1.042164199e-03f, -2.908694961e-03f, -1.767276576e-03f, +1.590289783e-03f, +3.625606667e-03f, +1.860743862e-03f, -2.092951993e-03f, -4.016694866e-03f, -1.716865348e-03f, +2.416213044e-03f, +3.972784618e-03f, +1.377579891e-03f, -2.465715883e-03f, -3.506725792e-03f, -9.418137984e-04f, +2.226668070e-03f, +2.747940555e-03f, +5.235804775e-04f, -1.770402507e-03f, -1.889991623e-03f, -2.079521297e-04f, +1.223893792e-03f, +1.117457274e-03f, +2.614790518e-05f, -7.181486913e-04f, -5.467209090e-04f, +4.149500913e-05f, +3.414770032e-04f, +2.046323028e-04f, -4.171754544e-05f, -1.186821501e-04f, -4.704766528e-05f, +2.016071959e-05f, + /* 5, 7 (48) */ + -2.256016332e-04f, +2.249154914e-04f, +9.938425466e-04f, +1.146257356e-03f, -2.085186870e-04f, -2.510033917e-03f, -3.416066279e-03f, -7.330233469e-04f, +4.604881375e-03f, +7.794352242e-03f, +3.834218885e-03f, -6.603276835e-03f, -1.503687191e-02f, -1.102645119e-02f, +7.050506854e-03f, +2.613002407e-02f, +2.589070091e-02f, -2.996324500e-03f, -4.413756671e-02f, -5.964591070e-02f, -1.524472918e-02f, +9.035847061e-02f, +2.156976758e-01f, +2.977739466e-01f, +2.918029559e-01f, +2.011092197e-01f, +7.487726489e-02f, -2.454673142e-02f, -6.049676400e-02f, -3.952227682e-02f, +1.892394985e-03f, +2.750990372e-02f, +2.440680421e-02f, +4.338644661e-03f, -1.240283025e-02f, -1.448930817e-02f, -5.175388002e-03f, +4.777856113e-03f, +7.716115573e-03f, +3.931251658e-03f, -1.275092657e-03f, -3.473161290e-03f, -2.239798043e-03f, +4.401959277e-05f, +1.199960073e-03f, +9.071167956e-04f, +1.396399812e-04f, -2.429874210e-04f, + +5.798079906e-04f, +2.686575106e-04f, -1.314126515e-03f, -2.644317708e-03f, -8.220014310e-04f, +4.243176755e-03f, +7.119132864e-03f, +1.611223284e-03f, -9.852351375e-03f, -1.452097198e-02f, -2.322990171e-03f, +1.845772125e-02f, +2.442428626e-02f, +2.480640490e-03f, -2.935721108e-02f, -3.527433768e-02f, -1.670461363e-03f, +4.072443406e-02f, +4.471424948e-02f, -1.972652877e-04f, -5.002351794e-02f, -5.036003776e-02f, +2.754002374e-03f, +5.484954190e-02f, +5.069727773e-02f, -5.271841536e-03f, -5.384462353e-02f, -4.567517339e-02f, +6.967162887e-03f, +4.725434442e-02f, +3.670907660e-02f, -7.351927317e-03f, -3.684271028e-02f, -2.609930601e-02f, +6.439984982e-03f, +2.520087698e-02f, +1.616129735e-02f, -4.700116019e-03f, -1.478583868e-02f, -8.477678487e-03f, +2.797039663e-03f, +7.138204729e-03f, +3.574494632e-03f, -1.278659524e-03f, -2.597077649e-03f, -1.074348376e-03f, +3.800584512e-04f, +5.463244622e-04f, + -9.694247817e-06f, -4.348195976e-05f, -4.232376407e-05f, +2.998809673e-05f, +1.286567263e-04f, +1.327706987e-04f, -3.594321318e-05f, -2.773338142e-04f, -3.334902885e-04f, -2.460629603e-05f, +4.865068398e-04f, +7.119338031e-04f, +2.490469033e-04f, -7.189985418e-04f, -1.361809822e-03f, -8.245130117e-04f, +8.702644658e-04f, +2.476023961e-03f, +2.262536517e-03f, -5.451942925e-04f, -4.780674772e-03f, -7.790488041e-03f, -7.214474091e-03f, -2.808184507e-03f, +3.162806250e-03f, +7.373982052e-03f, +7.690717676e-03f, +4.521327475e-03f, +3.056590003e-04f, -2.352753376e-03f, -2.412695524e-03f, -7.489383407e-04f, +8.987068488e-04f, +1.350052371e-03f, +6.573805153e-04f, -2.985168311e-04f, -7.159550299e-04f, -4.571303882e-04f, +5.363037253e-05f, +3.401394283e-04f, +2.647354962e-04f, +2.115179771e-05f, -1.374651753e-04f, -1.238815535e-04f, -2.371462048e-05f, +4.440198691e-05f, +4.179355039e-05f, +7.691540014e-06f, + -1.550161284e-05f, +5.859264138e-05f, +1.200704223e-04f, +1.733830566e-05f, -2.360610272e-04f, -3.313190975e-04f, +2.695325785e-05f, +6.076707952e-04f, +6.757332781e-04f, -1.683161561e-04f, -1.210779515e-03f, -1.120776721e-03f, +4.486587473e-04f, +2.006870463e-03f, +1.578730122e-03f, -8.707557173e-04f, -2.867590910e-03f, -1.931011420e-03f, +1.378300460e-03f, +3.602076150e-03f, +2.073196738e-03f, -1.861710401e-03f, -4.020258295e-03f, -1.959395137e-03f, +2.192869030e-03f, +4.005585615e-03f, +1.622875376e-03f, -2.275147812e-03f, -3.562352025e-03f, -1.161794479e-03f, +2.084346041e-03f, +2.813875044e-03f, +6.976168748e-04f, -1.679174953e-03f, -1.952474029e-03f, -3.279319705e-04f, +1.175647175e-03f, +1.166346332e-03f, +9.655054157e-05f, -6.989396102e-04f, -5.781455835e-04f, +7.881392525e-06f, +3.373630248e-04f, +2.205970658e-04f, -2.990175319e-05f, -1.197077173e-04f, -5.280829914e-05f, +1.798191556e-05f, + /* 5, 8 (48) */ + -2.352958810e-04f, +1.814335316e-04f, +9.515187825e-04f, +1.176245452e-03f, -7.986196071e-05f, -2.377263219e-03f, -3.452009492e-03f, -1.010357161e-03f, +4.271391087e-03f, +7.769745946e-03f, +4.320725725e-03f, -5.891343032e-03f, -1.478782500e-02f, -1.174544974e-02f, +5.688697032e-03f, +2.530551106e-02f, +2.676096538e-02f, -5.203005390e-04f, -4.187503019e-02f, -6.019110499e-02f, -2.002540395e-02f, +8.256798257e-02f, +2.084832017e-01f, +2.949657621e-01f, +2.949657621e-01f, +2.084832017e-01f, +8.256798257e-02f, -2.002540395e-02f, -6.019110499e-02f, -4.187503019e-02f, -5.203005390e-04f, +2.676096538e-02f, +2.530551106e-02f, +5.688697032e-03f, -1.174544974e-02f, -1.478782500e-02f, -5.891343032e-03f, +4.320725725e-03f, +7.769745946e-03f, +4.271391087e-03f, -1.010357161e-03f, -3.452009492e-03f, -2.377263219e-03f, -7.986196071e-05f, +1.176245452e-03f, +9.515187825e-04f, +1.814335316e-04f, -2.352958810e-04f, + +5.643063777e-04f, +3.272501520e-04f, -1.194056093e-03f, -2.626979402e-03f, -1.058062458e-03f, +3.911857657e-03f, +7.146086122e-03f, +2.218894080e-03f, -9.176618097e-03f, -1.468928814e-02f, -3.533769686e-03f, +1.733694452e-02f, +2.487294501e-02f, +4.487510953e-03f, -2.777848096e-02f, -3.614509340e-02f, -4.538052273e-03f, +3.879342264e-02f, +4.609254994e-02f, +3.404810862e-03f, -4.795032120e-02f, -5.222174816e-02f, -1.266255920e-03f, +5.289014676e-02f, +5.289014676e-02f, -1.266255920e-03f, -5.222174816e-02f, -4.795032120e-02f, +3.404810862e-03f, +4.609254994e-02f, +3.879342264e-02f, -4.538052273e-03f, -3.614509340e-02f, -2.777848096e-02f, +4.487510953e-03f, +2.487294501e-02f, +1.733694452e-02f, -3.533769686e-03f, -1.468928814e-02f, -9.176618097e-03f, +2.218894080e-03f, +7.146086122e-03f, +3.911857657e-03f, -1.058062458e-03f, -2.626979402e-03f, -1.194056093e-03f, +3.272501520e-04f, +5.643063777e-04f, + -7.691540014e-06f, -4.179355039e-05f, -4.440198691e-05f, +2.371462048e-05f, +1.238815535e-04f, +1.374651753e-04f, -2.115179771e-05f, -2.647354962e-04f, -3.401394283e-04f, -5.363037253e-05f, +4.571303882e-04f, +7.159550299e-04f, +2.985168311e-04f, -6.573805153e-04f, -1.350052371e-03f, -8.987068488e-04f, +7.489383407e-04f, +2.412695524e-03f, +2.352753376e-03f, -3.056590003e-04f, -4.521327475e-03f, -7.690717676e-03f, -7.373982052e-03f, -3.162806250e-03f, +2.808184507e-03f, +7.214474091e-03f, +7.790488041e-03f, +4.780674772e-03f, +5.451942925e-04f, -2.262536517e-03f, -2.476023961e-03f, -8.702644658e-04f, +8.245130117e-04f, +1.361809822e-03f, +7.189985418e-04f, -2.490469033e-04f, -7.119338031e-04f, -4.865068398e-04f, +2.460629603e-05f, +3.334902885e-04f, +2.773338142e-04f, +3.594321318e-05f, -1.327706987e-04f, -1.286567263e-04f, -2.998809673e-05f, +4.232376407e-05f, +4.348195976e-05f, +9.694247817e-06f, + -1.798191556e-05f, +5.280829914e-05f, +1.197077173e-04f, +2.990175319e-05f, -2.205970658e-04f, -3.373630248e-04f, -7.881392525e-06f, +5.781455835e-04f, +6.989396102e-04f, -9.655054157e-05f, -1.166346332e-03f, -1.175647175e-03f, +3.279319705e-04f, +1.952474029e-03f, +1.679174953e-03f, -6.976168748e-04f, -2.813875044e-03f, -2.084346041e-03f, +1.161794479e-03f, +3.562352025e-03f, +2.275147812e-03f, -1.622875376e-03f, -4.005585615e-03f, -2.192869030e-03f, +1.959395137e-03f, +4.020258295e-03f, +1.861710401e-03f, -2.073196738e-03f, -3.602076150e-03f, -1.378300460e-03f, +1.931011420e-03f, +2.867590910e-03f, +8.707557173e-04f, -1.578730122e-03f, -2.006870463e-03f, -4.486587473e-04f, +1.120776721e-03f, +1.210779515e-03f, +1.683161561e-04f, -6.757332781e-04f, -6.076707952e-04f, -2.695325785e-05f, +3.313190975e-04f, +2.360610272e-04f, -1.733830566e-05f, -1.200704223e-04f, -5.859264138e-05f, +1.550161284e-05f, + /* 5, 9 (48) */ + -2.429874210e-04f, +1.396399812e-04f, +9.071167956e-04f, +1.199960073e-03f, +4.401959277e-05f, -2.239798043e-03f, -3.473161290e-03f, -1.275092657e-03f, +3.931251658e-03f, +7.716115573e-03f, +4.777856113e-03f, -5.175388002e-03f, -1.448930817e-02f, -1.240283025e-02f, +4.338644661e-03f, +2.440680421e-02f, +2.750990372e-02f, +1.892394985e-03f, -3.952227682e-02f, -6.049676400e-02f, -2.454673142e-02f, +7.487726489e-02f, +2.011092197e-01f, +2.918029559e-01f, +2.977739466e-01f, +2.156976758e-01f, +9.035847061e-02f, -1.524472918e-02f, -5.964591070e-02f, -4.413756671e-02f, -2.996324500e-03f, +2.589070091e-02f, +2.613002407e-02f, +7.050506854e-03f, -1.102645119e-02f, -1.503687191e-02f, -6.603276835e-03f, +3.834218885e-03f, +7.794352242e-03f, +4.604881375e-03f, -7.330233469e-04f, -3.416066279e-03f, -2.510033917e-03f, -2.085186870e-04f, +1.146257356e-03f, +9.938425466e-04f, +2.249154914e-04f, -2.256016332e-04f, + +5.463244622e-04f, +3.800584512e-04f, -1.074348376e-03f, -2.597077649e-03f, -1.278659524e-03f, +3.574494632e-03f, +7.138204729e-03f, +2.797039663e-03f, -8.477678487e-03f, -1.478583868e-02f, -4.700116019e-03f, +1.616129735e-02f, +2.520087698e-02f, +6.439984982e-03f, -2.609930601e-02f, -3.684271028e-02f, -7.351927317e-03f, +3.670907660e-02f, +4.725434442e-02f, +6.967162887e-03f, -4.567517339e-02f, -5.384462353e-02f, -5.271841536e-03f, +5.069727773e-02f, +5.484954190e-02f, +2.754002374e-03f, -5.036003776e-02f, -5.002351794e-02f, -1.972652877e-04f, +4.471424948e-02f, +4.072443406e-02f, -1.670461363e-03f, -3.527433768e-02f, -2.935721108e-02f, +2.480640490e-03f, +2.442428626e-02f, +1.845772125e-02f, -2.322990171e-03f, -1.452097198e-02f, -9.852351375e-03f, +1.611223284e-03f, +7.119132864e-03f, +4.243176755e-03f, -8.220014310e-04f, -2.644317708e-03f, -1.314126515e-03f, +2.686575106e-04f, +5.798079906e-04f, + -5.765296115e-06f, -3.998113491e-05f, -4.617543122e-05f, +1.759838370e-05f, +1.187594373e-04f, +1.414238512e-04f, -6.757567778e-06f, -2.514642936e-04f, -3.452546102e-04f, -8.164810093e-05f, +4.267604542e-04f, +7.171328272e-04f, +3.456331944e-04f, -5.947779018e-04f, -1.333533885e-03f, -9.677741847e-04f, +6.278958467e-04f, +2.342336748e-03f, +2.432129444e-03f, -7.278250009e-05f, -4.257848572e-03f, -7.576604323e-03f, -7.517360200e-03f, -3.510123255e-03f, +2.447067529e-03f, +7.039098547e-03f, +7.875495044e-03f, +5.035142753e-03f, +7.908557901e-04f, -2.161485201e-03f, -2.531915604e-03f, -9.914363706e-04f, +7.453464948e-04f, +1.368646705e-03f, +7.793699012e-04f, -1.973589024e-04f, -7.050127996e-04f, -5.147456527e-04f, -5.333590443e-06f, +3.252904120e-04f, +2.891856649e-04f, +5.108105047e-05f, -1.273356352e-04f, -1.330502028e-04f, -3.639529768e-05f, +3.993777832e-05f, +4.503118166e-05f, +1.176534634e-05f, + -2.016071959e-05f, +4.704766528e-05f, +1.186821501e-04f, +4.171754544e-05f, -2.046323028e-04f, -3.414770032e-04f, -4.149500913e-05f, +5.467209090e-04f, +7.181486913e-04f, -2.614790518e-05f, -1.117457274e-03f, -1.223893792e-03f, +2.079521297e-04f, +1.889991623e-03f, +1.770402507e-03f, -5.235804775e-04f, -2.747940555e-03f, -2.226668070e-03f, +9.418137984e-04f, +3.506725792e-03f, +2.465715883e-03f, -1.377579891e-03f, -3.972784618e-03f, -2.416213044e-03f, +1.716865348e-03f, +4.016694866e-03f, +2.092951993e-03f, -1.860743862e-03f, -3.625606667e-03f, -1.590289783e-03f, +1.767276576e-03f, +2.908694961e-03f, +1.042164199e-03f, -1.469409935e-03f, -2.052784506e-03f, -5.695620628e-04f, +1.059413327e-03f, +1.250435457e-03f, +2.411203233e-04f, -6.485364007e-04f, -6.350858861e-04f, -6.286608877e-05f, +3.233063110e-04f, +2.509168103e-04f, -4.066716365e-06f, -1.197342126e-04f, -6.436320670e-05f, +1.271898053e-05f, + /* 5,10 (48) */ + -2.487527171e-04f, +9.965884631e-05f, +8.609413644e-04f, +1.217558456e-03f, +1.627790300e-04f, -2.098374192e-03f, -3.479918858e-03f, -1.526556951e-03f, +3.585997048e-03f, +7.634467472e-03f, +5.204616567e-03f, -4.458255175e-03f, -1.414367498e-02f, -1.299760815e-02f, +3.005110776e-03f, +2.343903002e-02f, +2.813779957e-02f, +4.234731733e-03f, -3.709014737e-02f, -6.056954650e-02f, -2.880458000e-02f, +6.730066057e-02f, +1.935918595e-01f, +2.882928326e-01f, +3.002210142e-01f, +2.227367744e-01f, +9.823396566e-02f, -1.020958642e-02f, -5.885505491e-02f, -4.629905191e-02f, -5.528240104e-03f, +2.489926454e-02f, +2.687537056e-02f, +8.419153559e-03f, -1.024708129e-02f, -1.523423081e-02f, -7.308289635e-03f, +3.319473232e-03f, +7.789018652e-03f, +4.930171787e-03f, -4.438376820e-04f, -3.364985229e-03f, -2.637369552e-03f, -3.415688898e-04f, +1.109862058e-03f, +1.033780325e-03f, +2.699466730e-04f, -2.138362868e-04f, + +5.261637426e-04f, +4.271061165e-04f, -9.556662258e-04f, -2.555360104e-03f, -1.483291827e-03f, +3.233017629e-03f, +7.096709720e-03f, +3.343760572e-03f, -7.759529796e-03f, -1.481198659e-02f, -5.817573292e-03f, +1.493740356e-02f, +2.540882911e-02f, +8.329976605e-03f, -2.432890350e-02f, -3.736629075e-02f, -1.009986787e-02f, +3.448240853e-02f, +4.819615821e-02f, +1.047388868e-02f, -4.320945751e-02f, -5.522220343e-02f, -9.244626154e-03f, +4.828106469e-02f, +5.656640725e-02f, +6.770697241e-03f, -4.826708576e-02f, -5.188426180e-02f, -3.822871955e-03f, +4.312395969e-02f, +4.249171064e-02f, +1.238233598e-03f, -3.423217348e-02f, -3.082662102e-02f, +4.278559834e-04f, +2.385472420e-02f, +1.951713457e-02f, -1.072554714e-03f, -1.427985166e-02f, -1.050088778e-02f, +9.761373983e-04f, +7.056266775e-03f, +4.566483066e-03f, -5.710846208e-04f, -2.648384424e-03f, -1.433860728e-03f, +2.042943039e-04f, +5.925269711e-04f, + -3.922811791e-06f, -3.805991974e-05f, -4.764846214e-05f, +1.166131574e-05f, +1.133255133e-04f, +1.446545704e-04f, +7.191930005e-06f, -2.375944924e-04f, -3.488584262e-04f, -1.085753362e-04f, +3.955415343e-04f, +7.155332732e-04f, +3.902727112e-04f, -5.314504956e-04f, -1.312427929e-03f, -1.031583203e-03f, +5.075639558e-04f, +2.265368269e-03f, +2.500691732e-03f, +1.529305739e-04f, -3.990987763e-03f, -7.448603302e-03f, -7.644390604e-03f, -3.849346823e-03f, +2.080283344e-03f, +6.848161398e-03f, +7.945354762e-03f, +5.283987960e-03f, +1.042084238e-03f, -2.049639612e-03f, -2.579979786e-03f, -1.112006636e-03f, +6.613830285e-04f, +1.370418431e-03f, +8.382311887e-04f, -1.436002750e-04f, -6.951458607e-04f, -5.417036090e-04f, -3.609256965e-05f, +3.155290602e-04f, +3.002185076e-04f, +6.651145955e-05f, -1.211583726e-04f, -1.370277891e-04f, -4.291118337e-05f, +3.724249168e-05f, +4.642614253e-05f, +1.389600048e-05f, + -2.204093044e-05f, +4.134623355e-05f, +1.170321815e-04f, +5.275210890e-05f, -1.882728830e-04f, -3.437090248e-04f, -7.375563930e-05f, +5.136111991e-04f, +7.333742859e-04f, +4.258191508e-05f, -1.064448760e-03f, -1.265420760e-03f, +8.927577200e-05f, +1.819852361e-03f, +1.852120081e-03f, -3.494730274e-04f, -2.670234486e-03f, -2.357423304e-03f, +7.194084680e-04f, +3.435562247e-03f, +2.644077995e-03f, -1.126983296e-03f, -3.922048391e-03f, -2.628401821e-03f, +1.466397133e-03f, +3.994873537e-03f, +2.315499119e-03f, -1.638724650e-03f, -3.632727262e-03f, -1.796733710e-03f, +1.593809598e-03f, +2.936850373e-03f, +1.211007247e-03f, -1.351604527e-03f, -2.089854939e-03f, -6.900603119e-04f, +9.917229840e-04f, +1.285009845e-03f, +3.146253892e-04f, -6.173766457e-04f, -6.601852187e-04f, -9.970380601e-05f, +3.132953637e-04f, +2.650563955e-04f, +9.867568066e-06f, -1.186657797e-04f, -7.008068125e-05f, +9.635371862e-06f, + /* 5,11 (48) */ + -2.526755289e-04f, +6.159892657e-05f, +8.132929023e-04f, +1.229219772e-03f, +2.761045433e-04f, -1.953719622e-03f, -3.472726928e-03f, -1.764151443e-03f, +3.237138622e-03f, +7.525892136e-03f, +5.600158101e-03f, -3.742721902e-03f, -1.375340227e-02f, -1.352905865e-02f, +1.692682847e-03f, +2.240744682e-02f, +2.864536352e-02f, +6.500100002e-03f, -3.458945564e-02f, -6.041661592e-02f, -3.279556776e-02f, +5.985205727e-02f, +1.859474689e-01f, +2.844434858e-01f, +3.023012975e-01f, +2.295849358e-01f, +1.061793204e-01f, -4.925598463e-03f, -5.781297067e-02f, -4.834869152e-02f, -8.108219891e-03f, +2.378725791e-02f, +2.753675359e-02f, +9.789571990e-03f, -9.408850104e-03f, -1.537783108e-02f, -8.003435496e-03f, +2.777769623e-03f, +7.752926082e-03f, +5.245700847e-03f, -1.436191744e-04f, -3.298473769e-03f, -2.758527925e-03f, -4.785966790e-04f, +1.066950874e-03f, +1.071022817e-03f, +3.163728156e-04f, -1.999402864e-04f, + +5.041228121e-04f, +4.684523500e-04f, -8.386340443e-04f, -2.502607995e-03f, -1.671564710e-03f, +2.889308604e-03f, +7.022954081e-03f, +3.857371771e-03f, -7.026155510e-03f, -1.476940467e-02f, -6.882022052e-03f, +1.367198280e-02f, +2.549810488e-02f, +1.014982897e-02f, -2.247678342e-02f, -3.771576378e-02f, -1.277010236e-02f, +3.212498523e-02f, +4.891556668e-02f, +1.390945093e-02f, -4.056537951e-02f, -5.634918672e-02f, -1.316667454e-02f, +4.565266287e-02f, +5.803280438e-02f, +1.076557078e-02f, -4.595158665e-02f, -5.352298645e-02f, -7.455599217e-03f, +4.132722598e-02f, +4.408552023e-02f, +4.175083971e-03f, -3.302116624e-02f, -3.217822554e-02f, -1.661998956e-03f, +2.316466389e-02f, +2.050885756e-02f, +2.124551303e-04f, -1.396522627e-02f, -1.111826442e-02f, +3.159521796e-04f, +6.956562969e-03f, +4.879778429e-03f, -3.060282253e-04f, -2.638516856e-03f, -1.552526508e-03f, +1.342136227e-04f, +6.021623429e-04f, + -2.170594329e-06f, -3.604505625e-05f, -4.882675536e-05f, +5.923709862e-06f, +1.076151274e-04f, +1.471681076e-04f, +2.065247933e-05f, -2.232007484e-04f, -3.509790369e-04f, -1.343345090e-04f, +3.636178797e-04f, +7.112316931e-04f, +4.323245107e-04f, -4.676548732e-04f, -1.286921163e-03f, -1.090024104e-03f, +3.883575103e-04f, +2.182223262e-03f, +2.558499992e-03f, +3.710047202e-04f, -3.721494474e-03f, -7.307203285e-03f, -7.754900054e-03f, -4.179711288e-03f, +1.708676149e-03f, +6.642011674e-03f, +7.999721116e-03f, +5.526473475e-03f, +1.298295096e-03f, -1.927074180e-03f, -2.619843217e-03f, -1.231519640e-03f, +5.728200767e-04f, +1.366996215e-03f, +8.953186611e-04f, -8.793011604e-05f, -6.822974410e-04f, -5.672390375e-04f, -6.756799030e-05f, +3.042017402e-04f, +3.103611873e-04f, +8.217765240e-05f, -1.142405788e-04f, -1.405560294e-04f, -4.950925812e-05f, +3.423787293e-05f, +4.765196158e-05f, +1.607663367e-05f, + -2.362740894e-05f, +3.573736284e-05f, +1.147983424e-04f, +6.297778107e-05f, -1.716231578e-04f, -3.441156022e-04f, -1.045426173e-04f, +4.790334108e-04f, +7.446500392e-04f, +1.093449204e-04f, -1.007670250e-03f, -1.300167151e-03f, -2.755693267e-05f, +1.742515420e-03f, +1.924084932e-03f, -1.761107648e-04f, -2.581254969e-03f, -2.476117843e-03f, +4.956314854e-04f, +3.349297257e-03f, +2.809473102e-03f, -8.722656489e-04f, -3.853654204e-03f, -2.828463513e-03f, +1.209146098e-03f, +3.954858788e-03f, +2.528288105e-03f, -1.408124574e-03f, -3.623298329e-03f, -1.996621844e-03f, +1.411331538e-03f, +2.951778960e-03f, +1.376451619e-03f, -1.225750979e-03f, -2.117758113e-03f, -8.095634262e-04f, +9.179066134e-04f, +1.314217345e-03f, +3.884819314e-04f, -5.823030335e-04f, -6.827694336e-04f, -1.373032065e-04f, +3.012670491e-04f, +2.783717331e-04f, +2.441321203e-05f, -1.168348903e-04f, -7.570410508e-05f, +6.254422861e-06f, + /* 5,12 (48) */ + -2.548461232e-04f, +2.555387032e-05f, +7.644661469e-04f, +1.235143482e-03f, +3.837196708e-04f, -1.806551514e-03f, -3.452074449e-03f, -1.987352192e-03f, +2.886159585e-03f, +7.391557627e-03f, +5.963775981e-03f, -3.031490209e-03f, -1.332107775e-02f, -1.399671352e-02f, +4.057616846e-04f, +2.131742272e-02f, +2.903372103e-02f, +8.682323264e-03f, -3.203095565e-02f, -6.004561120e-02f, -3.651706223e-02f, +5.254485398e-02f, +1.781925688e-01f, +2.802637745e-01f, +3.040099737e-01f, +2.362269475e-01f, +1.141790415e-01f, +6.008750117e-04f, -5.651467558e-02f, -5.027576570e-02f, -1.072806311e-02f, +2.255573827e-02f, +2.810957367e-02f, +1.115656820e-02f, -8.513531443e-03f, -1.546576120e-02f, -8.685732937e-03f, +2.210530586e-03f, +7.685358092e-03f, +5.549902587e-03f, +1.667420129e-04f, -3.216296117e-03f, -2.872768504e-03f, -6.191527084e-04f, +1.017441616e-03f, +1.105260690e-03f, +3.640247771e-04f, -1.838636527e-04f, + +4.804954032e-04f, +5.041897128e-04f, -7.238357019e-04f, -2.439630214e-03f, -1.843187868e-03f, +2.545193002e-03f, +6.918411464e-03f, +4.336405182e-03f, -6.281505470e-03f, -1.466005975e-02f, -7.889692302e-03f, +1.237181565e-02f, +2.547054795e-02f, +1.189234439e-02f, -2.055269849e-02f, -3.789187454e-02f, -1.535135733e-02f, +2.964886738e-02f, +4.941119817e-02f, +1.725874818e-02f, -3.775590641e-02f, -5.722145237e-02f, -1.702032875e-02f, +4.282419935e-02f, +5.924195048e-02f, +1.472042957e-02f, -4.342329854e-02f, -5.493111103e-02f, -1.107889755e-02f, +3.933060414e-02f, +4.549685177e-02f, +7.126862931e-03f, -3.164471462e-02f, -3.340397652e-02f, -3.779757068e-03f, +2.235510046e-02f, +2.142676417e-02f, +1.526672475e-03f, -1.357674434e-02f, -1.170056746e-02f, -3.668172540e-04f, +6.819259763e-03f, +5.181045478e-03f, -2.765649223e-05f, -2.614103644e-03f, -1.669361398e-03f, +5.850951761e-05f, +6.084167658e-04f, + -5.143564259e-07f, -3.395156363e-05f, -4.971722257e-05f, +4.041819234e-07f, +1.016636668e-04f, +1.489780312e-04f, +3.358328975e-05f, -2.083577617e-04f, -3.516499085e-04f, -1.588547770e-04f, +3.311329249e-04f, +7.043121473e-04f, +4.716902823e-04f, -4.036434917e-04f, -1.257212371e-03f, -1.143009043e-03f, +2.706780347e-04f, +2.093345793e-03f, +2.605646011e-03f, +5.809946439e-04f, -3.450115621e-03f, -7.152924603e-03f, -7.848760342e-03f, -4.500476158e-03f, +1.333103914e-03f, +6.421040627e-03f, +8.038287157e-03f, +5.761871190e-03f, +1.558880023e-03f, -1.793897867e-03f, -2.651151527e-03f, -1.349512981e-03f, +4.798765786e-04f, +1.358267912e-03f, +9.503692440e-04f, -3.051880904e-05f, -6.664430018e-04f, -5.912124291e-04f, -9.965154298e-05f, +2.913103906e-04f, +3.195442804e-04f, +9.802006855e-05f, -1.065872949e-04f, -1.436023867e-04f, -5.616164946e-05f, +3.092545234e-05f, +4.869403775e-05f, +1.829695311e-05f, + -2.492684353e-05f, +3.025215391e-05f, +1.120228962e-04f, +7.237274682e-05f, -1.547851520e-04f, -3.427611766e-04f, -1.337468773e-04f, +4.432058116e-04f, +7.520287966e-04f, +1.738640922e-04f, -9.474821865e-04f, -1.328106554e-03f, -1.420245927e-04f, +1.658467293e-03f, +1.986104763e-03f, -4.295809510e-06f, -2.481548241e-03f, -2.582319918e-03f, +2.715336861e-04f, +3.248435191e-03f, +2.961205417e-03f, -6.146219611e-04f, -3.767961988e-03f, -3.015484417e-03f, +9.463004484e-04f, +3.896801234e-03f, +2.730297901e-03f, -1.169974583e-03f, -3.597258120e-03f, -2.188967178e-03f, +1.220613385e-03f, +2.953263164e-03f, +1.537670045e-03f, -1.092331806e-03f, -2.136210154e-03f, -9.274757092e-04f, +8.381997143e-04f, +1.337793488e-03f, +4.623303147e-04f, -5.433862206e-04f, -7.026467049e-04f, -1.754917821e-04f, +2.872126999e-04f, +2.907553767e-04f, +3.951307321e-05f, -1.142147107e-04f, -8.119107346e-05f, +2.582138931e-06f, + /* 5,13 (48) */ + -2.553604797e-04f, -8.397693308e-06f, +7.147489243e-04f, +1.235547664e-03f, +4.853833376e-04f, -1.657573483e-03f, -3.418491159e-03f, -2.195709953e-03f, +2.534509676e-03f, +7.232702850e-03f, +6.294908906e-03f, -2.327178061e-03f, -1.284938747e-02f, -1.440035701e-02f, -8.514506861e-04f, +2.017441367e-02f, +2.930439907e-02f, +1.077566906e-02f, -2.942530964e-02f, -5.946461656e-02f, -3.996717785e-02f, +4.539192938e-02f, +1.703438085e-01f, +2.757632984e-01f, +3.053430776e-01f, +2.426479881e-01f, +1.222173287e-01f, +6.362746202e-03f, -5.495579556e-02f, -5.206966357e-02f, -1.337921463e-02f, +2.120622529e-02f, +2.858945025e-02f, +1.251483612e-02f, -7.563162199e-03f, -1.549628001e-02f, -9.352175938e-03f, +1.619318156e-03f, +7.585706549e-03f, +5.841212978e-03f, +4.862862933e-04f, -3.118276048e-03f, -2.979355799e-03f, -7.627550950e-04f, +9.612799669e-04f, +1.136186142e-03f, +4.127188149e-04f, -1.655666996e-04f, + +4.555685597e-04f, +5.344418668e-04f, -6.118128057e-04f, -2.367257467e-03f, -1.997973020e-03f, +2.202431825e-03f, +6.784664586e-03f, +4.779610994e-03f, -5.529476674e-03f, -1.448619566e-02f, -8.837174489e-03f, +1.104370909e-02f, +2.532852336e-02f, +1.355081168e-02f, -1.856659372e-02f, -3.789617035e-02f, -1.783290557e-02f, +2.706654746e-02f, +4.968273185e-02f, +2.050718337e-02f, -3.479470099e-02f, -5.783607433e-02f, -2.078829074e-02f, +3.980871493e-02f, +6.018825092e-02f, +1.861723080e-02f, -4.069300064e-02f, -5.610108561e-02f, -1.467615567e-02f, +3.714163696e-02f, +4.671746516e-02f, +1.008012610e-02f, -3.010704457e-02f, -3.449630833e-02f, -5.915967223e-03f, +2.142762475e-02f, +2.226496388e-02f, +2.864465963e-03f, -1.311441403e-02f, -1.224395368e-02f, -1.069463959e-03f, +6.643767981e-03f, +5.468258178e-03f, +2.630988845e-04f, -2.574590571e-03f, -1.783576109e-03f, -2.268155584e-05f, +6.109989047e-04f, + +1.040985477e-06f, -3.179425506e-05f, -5.032793323e-05f, -4.880361657e-06f, +9.550639630e-05f, +1.501005583e-04f, +4.594707460e-05f, -1.931399588e-04f, -3.509095356e-04f, -1.820721445e-04f, +2.982287329e-04f, +6.948668979e-04f, +5.082843731e-04f, -3.396638220e-04f, -1.223511463e-03f, -1.190471988e-03f, +1.549126151e-04f, +1.999189150e-03f, +2.642252808e-03f, +7.824862200e-04f, -3.177593401e-03f, -6.986317469e-03f, -7.925888400e-03f, -4.810928188e-03f, +9.544359400e-04f, +6.185680776e-03f, +8.060786240e-03f, +5.989464080e-03f, +1.823208447e-03f, -1.650254353e-03f, -2.673570778e-03f, -1.465518940e-03f, +3.827926075e-04f, +1.344138791e-03f, +1.003121559e-03f, +2.845238567e-05f, -6.475693674e-04f, -6.134870589e-04f, -1.322295665e-04f, +2.768635425e-04f, +3.277004432e-04f, +1.139765576e-04f, -9.820701606e-05f, -1.461354251e-04f, -6.283919623e-05f, +2.730837028e-05f, +4.953813809e-05f, +2.054597997e-05f, + -2.594761520e-05f, +2.491934601e-05f, +1.087495025e-04f, +8.092094178e-05f, -1.378580622e-04f, -3.397174985e-04f, -1.612711930e-04f, +4.063467844e-04f, +7.555818373e-04f, +2.358804181e-04f, -8.842539332e-04f, -1.349246533e-03f, -2.536268595e-04f, +1.568218952e-03f, +2.038037948e-03f, +1.651875793e-04f, -2.371705449e-03f, -2.675661381e-03f, +4.815868112e-05f, +3.133546031e-03f, +3.098647428e-03f, -3.552563934e-04f, -3.665412401e-03f, -3.188613303e-03f, +6.790752835e-04f, +3.820937052e-03f, +2.920555137e-03f, -9.253463350e-04f, -3.554623527e-03f, -2.372811083e-03f, +1.022472742e-03f, +2.941147774e-03f, +1.693845381e-03f, -9.518731857e-04f, -2.144969009e-03f, -1.043198748e-03f, +7.528718237e-04f, +1.355496472e-03f, +5.358023371e-04f, -5.007186730e-04f, -7.196339889e-04f, -2.140883933e-04f, +2.711345839e-04f, +3.021011351e-04f, +5.510432378e-05f, -1.107821223e-04f, -8.649795645e-05f, -1.373031687e-06f, + /* 5,14 (48) */ + -2.543194942e-04f, -4.019194836e-05f, +6.644209911e-04f, +1.230667302e-03f, +5.808897339e-04f, -1.507472925e-03f, -3.372544084e-03f, -2.388849912e-03f, +2.183600141e-03f, +7.050630706e-03f, +6.593137639e-03f, -1.632311164e-03f, -1.234110310e-02f, -1.474002084e-02f, -2.074962149e-03f, +1.898394169e-02f, +2.945931168e-02f, +1.277485821e-02f, -2.678305683e-02f, -5.868213034e-02f, -4.314477126e-02f, +3.840561191e-02f, +1.624179201e-01f, +2.709523702e-01f, +3.062975135e-01f, +2.488336689e-01f, +1.302781149e-01f, +1.235221028e-02f, -5.313258711e-02f, -5.371991792e-02f, -1.605278541e-02f, +1.974070635e-02f, +2.897224286e-02f, +1.385897491e-02f, -6.560040640e-03f, -1.546782762e-02f, -9.999745306e-03f, +1.005831098e-03f, +7.453476982e-03f, +6.118076521e-03f, +8.139867365e-04f, -3.004299491e-03f, -3.077562815e-03f, -9.088905201e-04f, +8.984407707e-04f, +1.163494512e-03f, +4.622569530e-04f, -1.450207196e-04f, + +4.296209445e-04f, +5.593612128e-04f, -5.030633032e-04f, -2.286336525e-03f, -2.135831082e-03f, +1.862714327e-03f, +6.623393393e-03f, +5.185957778e-03f, -4.773894837e-03f, -1.425031524e-02f, -9.721428422e-03f, +9.694462559e-03f, +2.507489650e-02f, +1.511903063e-02f, -1.652855578e-02f, -3.773098278e-02f, -2.020461102e-02f, +2.439088608e-02f, +4.973089053e-02f, +2.364072940e-02f, -3.169605357e-02f, -5.819133072e-02f, -2.445370314e-02f, +3.662010163e-02f, +6.086732621e-02f, +2.243816785e-02f, -3.777244550e-02f, -5.702643195e-02f, -1.823077919e-02f, +3.476882588e-02f, +4.773993790e-02f, +1.302127387e-02f, -2.841319919e-02f, -3.544818151e-02f, -8.060936232e-03f, +2.038442601e-02f, +2.301783571e-02f, +4.219962434e-03f, -1.257861169e-02f, -1.274467235e-02f, -1.789097948e-03f, +6.429679587e-03f, +5.739392762e-03f, +5.652000196e-04f, -2.519486247e-03f, -1.894358231e-03f, -1.091795123e-04f, +6.096258730e-04f, + +2.491308441e-06f, -2.958766734e-05f, -5.066803309e-05f, -9.914746689e-06f, +8.917830032e-05f, +1.505544017e-04f, +5.771011145e-05f, -1.776211840e-04f, -3.488011481e-04f, -2.039295517e-04f, +2.650454587e-04f, +6.829958540e-04f, +5.420338332e-04f, -2.759575187e-04f, -1.186038462e-03f, -1.232368496e-03f, +4.143284789e-05f, +1.900214177e-03f, +2.668473744e-03f, +9.750973470e-04f, -2.904663123e-03f, -6.807960120e-03f, -7.986246299e-03f, -5.110383358e-03f, +5.735503789e-04f, +5.936404813e-03f, +8.066993076e-03f, +6.208548452e-03f, +2.090629234e-03f, -1.496322096e-03f, -2.686788922e-03f, -1.579065996e-03f, +2.818289479e-04f, +1.324532268e-03f, +1.053316962e-03f, +8.879179446e-05f, -6.256750450e-04f, -6.339296100e-04f, -1.651833839e-04f, +2.608764580e-04f, +3.347647599e-04f, +1.299825782e-04f, -8.911175882e-05f, -1.481249922e-04f, -6.951154581e-05f, +2.339141928e-05f, +5.017048726e-05f, +2.281208434e-05f, + -2.669965649e-05f, +1.976523353e-05f, +1.050228857e-04f, +8.861192429e-05f, -1.209377896e-04f, -3.350629867e-04f, -1.870303451e-04f, +3.686736639e-04f, +7.553980289e-04f, +2.951538003e-04f, -8.183617051e-04f, -1.363627926e-03f, -3.618865460e-04f, +1.472302924e-03f, +2.079793499e-03f, +3.315766088e-04f, -2.252359276e-03f, -2.755838884e-03f, -1.734621290e-04f, +3.005262188e-03f, +3.221242552e-03f, -9.537642794e-05f, -3.546524520e-03f, -3.347065450e-03f, +4.087067610e-04f, +3.727586997e-03f, +3.098138979e-03f, -6.753471971e-04f, -3.495490471e-03f, -2.547228180e-03f, +8.177702581e-04f, +2.915341338e-03f, +1.844174763e-03f, -8.049429437e-04f, -2.143836296e-03f, -1.156134388e-03f, +6.622257906e-04f, +1.367108885e-03f, +6.085229571e-04f, -4.544147255e-04f, -7.335582551e-04f, -2.529040111e-04f, +2.530462502e-04f, +3.123047380e-04f, +7.111861119e-05f, -1.065180250e-04f, -9.158013602e-05f, -5.600138690e-06f, + /* 5,15 (48) */ + -2.518281858e-04f, -6.977961571e-05f, +6.137529580e-04f, +1.220752556e-03f, +6.700680342e-04f, -1.356918523e-03f, -3.314833973e-03f, -2.566471096e-03f, +1.834798993e-03f, +6.846701154e-03f, +6.858183098e-03f, -9.493153096e-04f, -1.179906927e-02f, -1.501597835e-02f, -3.261000612e-03f, +1.775157319e-02f, +2.950074453e-02f, +1.467507238e-02f, -2.411458308e-02f, -5.770703299e-02f, -4.604943438e-02f, +3.159765179e-02f, +1.544316738e-01f, +2.658419868e-01f, +3.068710639e-01f, +2.547700737e-01f, +1.383451080e-01f, +1.856075873e-02f, -5.104195788e-02f, -5.521624002e-02f, -1.873957433e-02f, +1.816164035e-02f, +2.925407180e-02f, +1.518350718e-02f, -5.506723678e-03f, -1.537903583e-02f, -1.062542035e-02f, +3.719014876e-04f, +7.288293598e-03f, +6.378952979e-03f, +1.148751496e-03f, -2.874316912e-03f, -3.166674574e-03f, -1.057015512e-03f, +8.289292249e-04f, +1.186885931e-03f, +5.124274402e-04f, -1.222086353e-04f, + +4.029212880e-04f, +5.791264463e-04f, -3.980404175e-04f, -2.197724601e-03f, -2.256768871e-03f, +1.527651340e-03f, +6.436363048e-03f, +5.554631442e-03f, -4.018496808e-03f, -1.395516144e-02f, -1.053979013e-02f, +8.330834633e-03f, +2.471300995e-02f, +1.659133356e-02f, -1.444876228e-02f, -3.739940617e-02f, -2.245697029e-02f, +2.163504720e-02f, +4.955742841e-02f, +2.664599159e-02f, -2.847481101e-02f, -5.828670715e-02f, -2.800022766e-02f, +3.327303618e-02f, +6.127603297e-02f, +2.616575485e-02f, -3.467430652e-02f, -5.770177914e-02f, -2.172626967e-02f, +3.222159770e-02f, +4.855770816e-02f, +1.593661521e-02f, -2.656902443e-02f, -3.625312446e-02f, -1.020477253e-02f, +1.922829162e-02f, +2.368006150e-02f, +5.587071319e-03f, -1.197008873e-02f, -1.319908707e-02f, -2.522656203e-03f, +6.176775576e-03f, +5.992439012e-03f, +8.775047576e-04f, -2.448367636e-03f, -2.000876256e-03f, -2.007596483e-04f, +6.040257344e-04f, + +3.833276021e-06f, -2.734599447e-05f, -5.074766006e-05f, -1.468554497e-05f, +8.271393049e-05f, +1.503606098e-04f, +6.884228518e-05f, -1.618744025e-04f, -3.453724072e-04f, -2.243769326e-04f, +2.317208331e-04f, +6.688059981e-04f, +5.728784120e-04f, -2.127596292e-04f, -1.145022466e-03f, -1.268675429e-03f, -6.940613874e-05f, +1.796887600e-03f, +2.684491539e-03f, +1.158478686e-03f, -2.632051071e-03f, -6.618456882e-03f, -8.029841120e-03f, -5.398188759e-03f, +1.913317227e-04f, +5.673724385e-03f, +8.056724670e-03f, +6.418436176e-03f, +2.360472425e-03f, -1.332314287e-03f, -2.690517210e-03f, -1.689680367e-03f, +1.772665892e-04f, +1.299390585e-03f, +1.100700600e-03f, +1.502978448e-04f, -6.007705035e-04f, -6.524107990e-04f, -1.983896676e-04f, +2.433712429e-04f, +3.406750891e-04f, +1.459714138e-04f, -7.931711402e-05f, -1.495424008e-04f, -7.614726015e-05f, +1.918107920e-05f, +5.057785772e-05f, +2.508302509e-05f, + -2.719430556e-05f, +1.481360237e-05f, +1.008885095e-04f, +9.544071803e-05f, -1.041165060e-04f, -3.288820696e-04f, -2.109512166e-04f, +3.304016101e-04f, +7.515829083e-04f, +3.514638438e-04f, -7.501865082e-04f, -1.371323979e-03f, -4.663515915e-04f, +1.371270310e-03f, +2.111330779e-03f, +4.941334060e-04f, -2.124180390e-03f, -2.822614710e-03f, -3.923144403e-04f, +2.864275019e-03f, +3.328507442e-03f, +1.638129533e-04f, -3.411893142e-03f, -3.490126337e-03f, +1.364461560e-04f, +3.617154996e-03f, +3.262185724e-03f, -4.211150561e-04f, -3.420033908e-03f, -2.711331088e-03f, +6.074058072e-04f, +2.875817282e-03f, +1.987873747e-03f, -6.521483036e-04f, -2.132658970e-03f, -1.265687754e-03f, +5.665968633e-04f, +1.372439335e-03f, +6.801120963e-04f, -4.046105230e-04f, -7.442576965e-04f, -2.917425243e-04f, +2.329728192e-04f, +3.212645130e-04f, +8.748225870e-05f, -1.014076270e-04f, -9.639225967e-05f, -1.008568569e-05f, + /* 6, 0 (48) */ + +4.968144385e-04f, +2.658533900e-04f, -8.962168723e-04f, -1.608103413e-03f, -7.788642489e-06f, +2.979420144e-03f, +3.156687553e-03f, -1.777487314e-03f, -6.981373376e-03f, -4.200072704e-03f, +6.679001343e-03f, +1.302046751e-02f, +2.733865881e-03f, -1.674345458e-02f, -2.042237500e-02f, +4.850187710e-03f, +3.528439247e-02f, +2.773502242e-02f, -2.703828769e-02f, -7.382778902e-02f, -3.314369929e-02f, +1.149897119e-01f, +2.902267079e-01f, +3.684748747e-01f, +2.902267079e-01f, +1.149897119e-01f, -3.314369929e-02f, -7.382778902e-02f, -2.703828769e-02f, +2.773502242e-02f, +3.528439247e-02f, +4.850187710e-03f, -2.042237500e-02f, -1.674345458e-02f, +2.733865881e-03f, +1.302046751e-02f, +6.679001343e-03f, -4.200072704e-03f, -6.981373376e-03f, -1.777487314e-03f, +3.156687553e-03f, +2.979420144e-03f, -7.788642489e-06f, -1.608103413e-03f, -8.962168723e-04f, +2.658533900e-04f, +4.968144385e-04f, +1.277320727e-04f, + -4.968144385e-04f, -7.842817921e-04f, +8.994291019e-04f, +2.915640051e-03f, +8.438649895e-04f, -5.098406932e-03f, -6.009425829e-03f, +3.886651395e-03f, +1.308708603e-02f, +4.180565853e-03f, -1.651382305e-02f, -1.845487053e-02f, +9.460496445e-03f, +3.171517895e-02f, +1.017220246e-02f, -3.304107863e-02f, -3.524088677e-02f, +1.560130303e-02f, +5.143354543e-02f, +1.625027633e-02f, -4.622585189e-02f, -4.721341238e-02f, +1.858986948e-02f, +6.004110985e-02f, +1.858986948e-02f, -4.721341238e-02f, -4.622585189e-02f, +1.625027633e-02f, +5.143354543e-02f, +1.560130303e-02f, -3.524088677e-02f, -3.304107863e-02f, +1.017220246e-02f, +3.171517895e-02f, +9.460496445e-03f, -1.845487053e-02f, -1.651382305e-02f, +4.180565853e-03f, +1.308708603e-02f, +3.886651395e-03f, -6.009425829e-03f, -5.098406932e-03f, +8.438649895e-04f, +2.915640051e-03f, +8.994291019e-04f, -7.842817921e-04f, -6.202569526e-04f, -1.277320727e-04f, + -1.499733940e-05f, +4.581440195e-05f, +8.222654775e-05f, -1.133499855e-05f, -1.717221122e-04f, -1.536557052e-04f, +1.457711105e-04f, +4.035826075e-04f, +1.612392801e-04f, -4.817224287e-04f, -7.200285364e-04f, +3.417364024e-05f, +1.115389910e-03f, +1.031958370e-03f, -6.472422812e-04f, -2.165140336e-03f, -1.186136915e-03f, +2.083111403e-03f, +4.043645375e-03f, +1.059561482e-03f, -5.997321120e-03f, -1.131891039e-02f, -9.290879382e-03f, -3.277778787e-04f, +8.888315096e-03f, +1.144173426e-02f, +6.454643929e-03f, -6.964563701e-04f, -4.022753705e-03f, -2.292177099e-03f, +1.025727110e-03f, +2.193586529e-03f, +7.745420228e-04f, -9.663083127e-04f, -1.158510680e-03f, -1.065268205e-04f, +7.025179806e-04f, +5.184656751e-04f, -1.270869112e-04f, -4.062105010e-04f, -1.685272076e-04f, +1.421089314e-04f, +1.785214599e-04f, +2.140257552e-05f, -8.075517306e-05f, -5.014084945e-05f, +1.253239210e-05f, +2.336102954e-05f, + +1.499733940e-05f, -3.604833932e-05f, -1.540456612e-04f, -4.913805713e-05f, +2.946836819e-04f, +3.408706404e-04f, -2.734518864e-04f, -8.054712459e-04f, -1.611983499e-04f, +1.144424426e-03f, +1.076495704e-03f, -8.825186526e-04f, -2.120794780e-03f, -2.820117937e-04f, +2.572434168e-03f, +2.088618093e-03f, -1.773533212e-03f, -3.658041246e-03f, -3.037498356e-04f, +3.951088380e-03f, +2.828652722e-03f, -2.493092796e-03f, -4.507857853e-03f, -1.857454068e-04f, +4.399660011e-03f, +2.793451027e-03f, -2.554869886e-03f, -4.076700728e-03f, -1.409849475e-05f, +3.595489982e-03f, +2.013737730e-03f, -1.908679696e-03f, -2.674543436e-03f, +8.678704201e-05f, +2.100891351e-03f, +1.018351270e-03f, -9.962403305e-04f, -1.200978750e-03f, +8.125534378e-05f, +8.058829803e-04f, +3.226831859e-04f, -3.204820592e-04f, -3.135467573e-04f, +3.155727048e-05f, +1.567596241e-04f, +4.438067365e-05f, -4.015609728e-05f, -2.336102954e-05f, + /* 6, 1 (48) */ + +4.818170991e-04f, +3.116677919e-04f, -8.139903245e-04f, -1.619438411e-03f, -1.795107547e-04f, +2.825764439e-03f, +3.302458664e-03f, -1.373904706e-03f, -6.820134096e-03f, -4.681795133e-03f, +5.958972806e-03f, +1.305464115e-02f, +3.849255791e-03f, -1.571149621e-02f, -2.106961728e-02f, +2.685047373e-03f, +3.409825556e-02f, +2.981813382e-02f, -2.299464232e-02f, -7.276822754e-02f, -3.914102041e-02f, +1.036708015e-01f, +2.809358285e-01f, +3.681470969e-01f, +2.991150230e-01f, +1.264314461e-01f, -2.668905536e-02f, -7.452424539e-02f, -3.106104140e-02f, +2.544284532e-02f, +3.631011958e-02f, +7.043774239e-03f, -1.964783298e-02f, -1.770976289e-02f, +1.575355201e-03f, +1.291394069e-02f, +7.381519323e-03f, -3.681607029e-03f, -7.108460287e-03f, -2.183697815e-03f, +2.988160346e-03f, +3.121529075e-03f, +1.707328174e-04f, -1.586700837e-03f, -9.769720453e-04f, +2.157125405e-04f, +5.093468306e-04f, +1.510931022e-04f, + -4.818170991e-04f, -8.203301315e-04f, +7.453834406e-04f, +2.866501994e-03f, +1.138548671e-03f, -4.757536292e-03f, -6.282877715e-03f, +3.081180149e-03f, +1.292588768e-02f, +5.324990279e-03f, -1.543732735e-02f, -1.933738918e-02f, +7.339701665e-03f, +3.143316715e-02f, +1.274463663e-02f, -3.095246054e-02f, -3.701441998e-02f, +1.194326179e-02f, +5.112979559e-02f, +2.020136471e-02f, -4.339719917e-02f, -4.970650518e-02f, +1.408201163e-02f, +5.985536445e-02f, +2.298952949e-02f, -4.441996135e-02f, -4.878072178e-02f, +1.217357560e-02f, +5.141944693e-02f, +1.919679302e-02f, -3.322714904e-02f, -3.494975833e-02f, +7.497659026e-03f, +3.180196599e-02f, +1.156138780e-02f, -1.743651926e-02f, -1.751006338e-02f, +2.979587103e-03f, +1.316834138e-02f, +4.692534375e-03f, -5.686742643e-03f, -5.418888992e-03f, +5.303182322e-04f, +2.947197322e-03f, +1.056188726e-03f, -7.399011185e-04f, -6.604130498e-04f, -1.510931022e-04f, + -1.721194565e-05f, +4.140964876e-05f, +8.312660570e-05f, -1.607065380e-06f, -1.641797458e-04f, -1.639344914e-04f, +1.229214328e-04f, +3.987934951e-04f, +1.935382675e-04f, -4.433395733e-04f, -7.331792745e-04f, -3.655074561e-05f, +1.067342593e-03f, +1.090519334e-03f, -5.195893246e-04f, -2.126003711e-03f, -1.336275342e-03f, +1.869018664e-03f, +4.043550276e-03f, +1.404861238e-03f, -5.533201255e-03f, -1.116513206e-02f, -9.663991810e-03f, -9.822571399e-04f, +8.457448808e-03f, +1.153277082e-02f, +6.903336548e-03f, -3.165794289e-04f, -3.980359535e-03f, -2.495011615e-03f, +8.556247074e-04f, +2.210926428e-03f, +9.007918871e-04f, -8.937550365e-04f, -1.196345405e-03f, -1.801472872e-04f, +6.806320721e-04f, +5.533162464e-04f, -9.122424856e-05f, -4.065968808e-04f, -1.910524798e-04f, +1.293202336e-04f, +1.845085850e-04f, +3.175948924e-05f, -7.869717760e-05f, -5.435485258e-05f, +9.822433814e-06f, +2.420834805e-05f, + +1.721194565e-05f, -2.797302899e-05f, -1.503786526e-04f, -6.554580609e-05f, +2.746236972e-04f, +3.582266926e-04f, -2.240947659e-04f, -7.998354702e-04f, -2.378849854e-04f, +1.081948821e-03f, +1.148058766e-03f, -7.438547548e-04f, -2.126892192e-03f, -4.722485472e-04f, +2.455585875e-03f, +2.253106908e-03f, -1.524831037e-03f, -3.697023187e-03f, -6.172201198e-04f, +3.801456149e-03f, +3.083415824e-03f, -2.178016822e-03f, -4.587581862e-03f, -5.560515546e-04f, +4.263636073e-03f, +3.077127272e-03f, -2.263733107e-03f, -4.177340741e-03f, -3.343157089e-04f, +3.509552640e-03f, +2.243798546e-03f, -1.714262142e-03f, -2.761034460e-03f, -1.122302159e-04f, +2.067058655e-03f, +1.150395214e-03f, -9.076298295e-04f, -1.251081896e-03f, -1.491478018e-06f, +8.009066393e-04f, +3.714402944e-04f, -2.970911118e-04f, -3.310245125e-04f, +1.288020430e-05f, +1.584475354e-04f, +5.291577035e-05f, -3.845865258e-05f, -2.420834805e-05f, + /* 6, 2 (48) */ + +4.646051534e-04f, +3.530774407e-04f, -7.308637188e-04f, -1.621045477e-03f, -3.436905005e-04f, +2.661829947e-03f, +3.425380097e-03f, -9.751112112e-04f, -6.626595828e-03f, -5.125134706e-03f, +5.225793532e-03f, +1.301809040e-02f, +4.916598384e-03f, -1.462097687e-02f, -2.158920660e-02f, +5.590436624e-04f, +3.276198022e-02f, +3.168715249e-02f, -1.895109204e-02f, -7.136336630e-02f, -4.467422166e-02f, +9.250566943e-02f, +2.712718367e-01f, +3.671648397e-01f, +3.075724718e-01f, +1.379642170e-01f, -1.978571881e-02f, -7.484082482e-02f, -3.504140093e-02f, +2.294783371e-02f, +3.716574429e-02f, +9.254700667e-03f, -1.874704109e-02f, -1.860351792e-02f, +3.790097958e-04f, +1.273379340e-02f, +8.062151396e-03f, -3.128290783e-03f, -7.199684535e-03f, -2.590294696e-03f, +2.797107866e-03f, +3.250849309e-03f, +3.552414023e-04f, -1.554941348e-03f, -1.055669223e-03f, +1.613576880e-04f, +5.191692644e-04f, +1.753014503e-04f, + -4.646051534e-04f, -8.483031605e-04f, +5.950047880e-04f, +2.800956188e-03f, +1.413172369e-03f, -4.399309599e-03f, -6.506972481e-03f, +2.281344679e-03f, +1.268800270e-02f, +6.406939100e-03f, -1.428926858e-02f, -2.008124393e-02f, +5.212809473e-03f, +3.096091860e-02f, +1.520022250e-02f, -2.869935363e-02f, -3.853925102e-02f, +8.246238601e-03f, +5.051257547e-02f, +2.400282086e-02f, -4.031378334e-02f, -5.188452200e-02f, +9.494429766e-03f, +5.929931289e-02f, +2.725316557e-02f, -4.134283408e-02f, -5.104445488e-02f, +7.996234859e-03f, +5.108513123e-02f, +2.270634566e-02f, -3.098335049e-02f, -3.666402047e-02f, +4.736624566e-03f, +3.168973577e-02f, +1.362844645e-02f, -1.628612404e-02f, -1.841769321e-02f, +1.728505206e-03f, +1.316684990e-02f, +5.493441015e-03f, -5.315302348e-03f, -5.715980103e-03f, +1.992937197e-04f, +2.960077526e-03f, +1.214636261e-03f, -6.869853482e-04f, -6.988717024e-04f, -1.753014503e-04f, + -1.917294829e-05f, +3.695981836e-05f, +8.347375200e-05f, +7.734872448e-06f, -1.559657101e-04f, -1.729275679e-04f, +1.001118357e-04f, +3.919335456e-04f, +2.238551306e-04f, -4.035727706e-04f, -7.420094127e-04f, -1.053024563e-04f, +1.014746362e-03f, +1.141847450e-03f, -3.922656056e-04f, -2.076637988e-03f, -1.475628833e-03f, +1.651098036e-03f, +4.023065436e-03f, +1.731415080e-03f, -5.064117745e-03f, -1.098134138e-02f, -1.000661783e-02f, -1.633511224e-03f, +7.999541491e-03f, +1.159130080e-02f, +7.341573863e-03f, +7.894597345e-05f, -3.916032251e-03f, -2.690411489e-03f, +6.764722311e-04f, +2.216792834e-03f, +1.025284408e-03f, -8.145264851e-04f, -1.228555130e-03f, -2.546575136e-04f, +6.543796353e-04f, +5.860252003e-04f, -5.380827359e-05f, -4.046723017e-04f, -2.132068256e-04f, +1.153241184e-04f, +1.896169401e-04f, +4.235166595e-05f, -7.604058012e-05f, -5.842156927e-05f, +6.874909048e-06f, +2.490662972e-05f, + +1.917294829e-05f, -2.020393344e-05f, -1.458354689e-04f, -8.071584242e-05f, +2.535564812e-04f, +3.725425543e-04f, -1.749498460e-04f, -7.891706437e-04f, -3.108967826e-04f, +1.014108723e-03f, +1.210657585e-03f, -6.033167163e-04f, -2.119395490e-03f, -6.563535789e-04f, +2.324961565e-03f, +2.401288390e-03f, -1.269314706e-03f, -3.712407093e-03f, -9.243468054e-04f, +3.628906158e-03f, +3.317623958e-03f, -1.850276583e-03f, -4.638369466e-03f, -9.228114822e-04f, +4.100614958e-03f, +3.342259702e-03f, -1.957028337e-03f, -4.252212819e-03f, -6.548620144e-04f, +3.400567182e-03f, +2.462118457e-03f, -1.506443431e-03f, -2.831118909e-03f, -3.137999908e-04f, +2.019264512e-03f, +1.277699413e-03f, -8.110657220e-04f, -1.294235224e-03f, -8.655777873e-05f, +7.904112298e-04f, +4.193667154e-04f, -2.707510300e-04f, -3.469313050e-04f, -6.804394093e-06f, +1.590410464e-04f, +6.159451063e-05f, -3.628430681e-05f, -2.490662972e-05f, + /* 6, 3 (48) */ + +4.454322052e-04f, +3.900372591e-04f, -6.473899668e-04f, -1.613310604e-03f, -4.996562106e-04f, +2.488902380e-03f, +3.525491932e-03f, -5.831776656e-04f, -6.402740698e-03f, -5.528707477e-03f, +4.483784119e-03f, +1.291278795e-02f, +5.931344747e-03f, -1.347912942e-02f, -2.198147221e-02f, -1.517594326e-03f, +3.128635138e-02f, +3.333825052e-02f, -1.492802661e-02f, -6.963195122e-02f, -4.973833941e-02f, +8.152432805e-02f, +2.612652189e-01f, +3.655313285e-01f, +3.155720133e-01f, +1.495555178e-01f, -1.244414495e-02f, -7.476187885e-02f, -3.895743318e-02f, +2.025742222e-02f, +3.784221652e-02f, +1.147149350e-02f, -1.772175668e-02f, -1.941804441e-02f, -8.495453346e-04f, +1.247913589e-02f, +8.716531031e-03f, -2.542265583e-03f, -7.253492809e-03f, -2.994966997e-03f, +2.583901040e-03f, +3.366173427e-03f, +5.448583425e-04f, -1.512589682e-03f, -1.131709803e-03f, +1.029361187e-04f, +5.260441735e-04f, +2.002080800e-04f, + -4.454322052e-04f, -8.685070939e-04f, +4.491693191e-04f, +2.720240346e-03f, +1.666728850e-03f, -4.026767045e-03f, -6.681922327e-03f, +1.492174035e-03f, +1.237710592e-02f, +7.421047823e-03f, -1.307861100e-02f, -2.068456065e-02f, +3.093413984e-03f, +3.030456503e-02f, +1.752518407e-02f, -2.629806524e-02f, -3.980856572e-02f, +4.533831508e-03f, +4.958822867e-02f, +2.763172701e-02f, -3.699615939e-02f, -5.373479858e-02f, +4.856060301e-03f, +5.837650141e-02f, +3.135378052e-02f, -3.800057438e-02f, -5.300148322e-02f, +3.744022040e-03f, +5.043026921e-02f, +2.610691284e-02f, -2.852123204e-02f, -3.817046390e-02f, +1.905505657e-03f, +3.137593578e-02f, +1.564771096e-02f, -1.500842463e-02f, -1.922875894e-02f, +4.342699829e-04f, +1.308029212e-02f, +6.283852244e-03f, -4.895935633e-03f, -5.986731133e-03f, -1.476375854e-04f, +2.953273132e-03f, +1.373677308e-03f, -6.253908375e-04f, -7.351560092e-04f, -2.002080800e-04f, + -2.087909205e-05f, +3.249703570e-05f, +8.328925833e-05f, +1.664857625e-05f, -1.471529901e-04f, -1.806254050e-04f, +7.747171356e-05f, +3.831024246e-04f, +2.520758300e-04f, -3.626787717e-04f, -7.465810587e-04f, -1.717567126e-04f, +9.579945182e-04f, +1.185840910e-03f, -2.659361064e-04f, -2.017546624e-03f, -1.603750184e-03f, +1.430538142e-03f, +3.982865045e-03f, +2.038378098e-03f, -4.591896607e-03f, -1.076858506e-02f, -1.031784186e-02f, -2.279404362e-03f, +7.515960575e-03f, +1.161672233e-02f, +7.767546564e-03f, +4.889102033e-04f, -3.829429834e-03f, -2.877179697e-03f, +4.889741247e-04f, +2.210870206e-03f, +1.147304853e-03f, -7.288923924e-04f, -1.254823802e-03f, -3.296656896e-04f, +6.237944064e-04f, +6.163492617e-04f, -1.500931522e-05f, -4.003788880e-04f, -2.348480499e-04f, +1.001635876e-04f, +1.937831454e-04f, +5.312148518e-05f, -7.277692874e-05f, -6.230567366e-05f, +3.699409719e-06f, +2.544119995e-05f, + +2.087909205e-05f, -1.278501217e-05f, -1.404960552e-04f, -9.459557017e-05f, +2.316715232e-04f, +3.838323497e-04f, -1.263427196e-04f, -7.737004654e-04f, -3.798513683e-04f, +9.414833671e-04f, +1.264085916e-03f, -4.618549811e-04f, -2.098602257e-03f, -8.332417435e-04f, +2.181600471e-03f, +2.532421760e-03f, -1.008693674e-03f, -3.704317578e-03f, -1.223220544e-03f, +3.434682070e-03f, +3.529881935e-03f, -1.512001046e-03f, -4.659946008e-03f, -1.283686914e-03f, +3.911601571e-03f, +3.587101452e-03f, -1.636650437e-03f, -4.300684389e-03f, -9.736802695e-04f, +3.269025430e-03f, +2.667160254e-03f, -1.286403228e-03f, -2.884105909e-03f, -5.166454864e-04f, +1.957569632e-03f, +1.399325762e-03f, -7.070124832e-04f, -1.329975583e-03f, -1.734300341e-04f, +7.743006998e-04f, +4.661001774e-04f, -2.415385252e-04f, -3.610857945e-04f, -2.739598337e-05f, +1.584772530e-04f, +7.035318574e-05f, -3.361875474e-05f, -2.544119995e-05f, + /* 6, 4 (48) */ + +4.245531131e-04f, +4.225342948e-04f, -5.641007085e-04f, -1.596662028e-03f, -6.468092006e-04f, +2.308276975e-03f, +3.602963646e-03f, -2.000752410e-04f, -6.150664868e-03f, -5.891386249e-03f, +3.737203061e-03f, +1.274103123e-02f, +6.889339265e-03f, -1.229328851e-02f, -2.224740832e-02f, -3.535140950e-03f, +2.968260120e-02f, +3.476878867e-02f, -1.094516156e-02f, -6.759357313e-02f, -5.433023602e-02f, +7.075574299e-02f, +2.509473770e-01f, +3.632519241e-01f, +3.230879739e-01f, +1.611722401e-01f, -4.676598387e-03f, -7.427296864e-02f, -4.278686302e-02f, +1.738024252e-02f, +3.833119065e-02f, +1.368236371e-02f, -1.657445183e-02f, -2.014693680e-02f, -2.104369136e-03f, +1.214947020e-02f, +9.340325437e-03f, -1.925916321e-03f, -7.268502124e-03f, -3.395345886e-03f, +2.349052990e-03f, +3.466337015e-03f, +7.386414879e-04f, -1.459468197e-03f, -1.204486732e-03f, +4.063044502e-05f, +5.297435832e-04f, +2.256492799e-04f, + -4.245531131e-04f, -8.812921061e-04f, +3.086732639e-04f, +2.625644776e-03f, +1.898400373e-03f, -3.642934695e-03f, -6.808265047e-03f, +7.184735700e-04f, +1.199725455e-02f, +8.362531190e-03f, -1.181452508e-02f, -2.114641563e-02f, +9.948117267e-04f, +2.947132328e-02f, +1.970678454e-02f, -2.376564348e-02f, -4.081725940e-02f, +8.295139303e-04f, +4.836500812e-02f, +3.106640908e-02f, -3.346627745e-02f, -5.524679963e-02f, +1.961142931e-04f, +5.709281450e-02f, +3.526538209e-02f, -3.441347293e-02f, -5.463813366e-02f, -5.566623497e-04f, +4.945658894e-02f, +2.937593827e-02f, -2.585407178e-02f, -3.945686713e-02f, -9.786002519e-04f, +3.085929029e-02f, +1.760528059e-02f, -1.360909887e-02f, -1.993577142e-02f, -8.957056000e-04f, +1.290686209e-02f, +7.058152944e-03f, -4.429835456e-03f, -6.228269659e-03f, -5.087233799e-04f, +2.925877149e-03f, +1.532154561e-03f, -5.550376518e-04f, -7.687747640e-04f, -2.256492799e-04f, + -2.233105653e-05f, +2.805214350e-05f, +8.259701733e-05f, +2.509604609e-05f, -1.378157037e-04f, -1.870264704e-04f, +5.512555411e-05f, +3.724082463e-04f, +2.781012933e-04f, -3.209139411e-04f, -7.469783072e-04f, -2.356091725e-04f, +8.974935422e-04f, +1.222439452e-03f, -1.412452366e-04f, -1.949271696e-03f, -1.720259320e-03f, +1.208511679e-03f, +3.923696023e-03f, +2.325003233e-03f, -4.118348902e-03f, -1.052800922e-02f, -1.059687046e-02f, -2.917822246e-03f, +7.008174801e-03f, +1.160855426e-02f, +8.179468934e-03f, +9.120213723e-04f, -3.720301977e-03f, -3.054131478e-03f, +2.938945811e-04f, +2.192897459e-03f, +1.266134869e-03f, -6.371637688e-04f, -1.274860546e-03f, -4.047675780e-04f, +5.889354579e-04f, +6.440523703e-04f, +2.498958862e-05f, -3.936710023e-04f, -2.558326624e-04f, +8.389013798e-05f, +1.969474946e-04f, +6.400803040e-05f, -6.890149093e-05f, -6.597158708e-05f, +3.076934037e-07f, +2.579800327e-05f, + +2.233105653e-05f, -5.754885180e-06f, -1.344426504e-04f, -1.071443738e-04f, +2.091567200e-04f, +3.921311355e-04f, -7.858462338e-05f, -7.536749521e-04f, -4.444041660e-04f, +8.646699359e-04f, +1.308203188e-03f, -3.204070220e-04f, -2.064892248e-03f, -1.001892781e-03f, +2.026610082e-03f, +2.645886660e-03f, -7.446917873e-04f, -3.673030348e-03f, -1.512000316e-03f, +3.220160048e-03f, +3.718943121e-03f, -1.165380464e-03f, -4.652226236e-03f, -1.636378197e-03f, +3.697770427e-03f, +3.810032420e-03f, -1.304591153e-03f, -4.322291018e-03f, -1.288709475e-03f, +3.115571159e-03f, +2.857457604e-03f, -1.055416203e-03f, -2.919408038e-03f, -7.194611602e-04f, +1.882128834e-03f, +1.514355818e-03f, -5.959956855e-04f, -1.357879403e-03f, -2.615684034e-04f, +7.525156364e-04f, +5.112751002e-04f, -2.095540331e-04f, -3.733125000e-04f, -4.878252667e-05f, +1.566994726e-04f, +7.912381790e-05f, -3.045138455e-05f, -2.579800327e-05f, + /* 6, 5 (48) */ + +4.022220566e-04f, +4.505864383e-04f, -4.815036912e-04f, -1.571565982e-03f, -7.846249043e-04f, +2.121250504e-03f, +3.658089200e-03f, +1.723330052e-04f, -5.872563574e-03f, -6.212300190e-03f, +2.990224753e-03f, +1.250542206e-02f, +7.786832807e-03f, -1.107084906e-02f, -2.238865355e-02f, -5.484412646e-03f, +2.796234188e-02f, +3.597730034e-02f, -7.021465538e-03f, -6.526856989e-02f, -5.844858492e-02f, +6.022773377e-02f, +2.403505066e-01f, +3.603341019e-01f, +3.300961487e-01f, +1.727807943e-01f, +3.502870548e-03f, -7.336094727e-02f, -4.650716500e-02f, +1.432611104e-02f, +3.862508523e-02f, +1.587526117e-02f, -1.530831696e-02f, -2.078410057e-02f, -3.379229683e-03f, +1.174470262e-02f, +9.929260895e-03f, -1.281863951e-03f, -7.243512536e-03f, -3.789016888e-03f, +2.093220328e-03f, +3.550227153e-03f, +9.355889825e-04f, -1.395460166e-03f, -1.273388223e-03f, -2.534114206e-05f, +5.300512766e-04f, +2.514472832e-04f, + -4.022220566e-04f, -8.870469913e-04f, +1.742306135e-04f, +2.518500402e-03f, +2.107557093e-03f, -3.250803560e-03f, -6.886849670e-03f, -3.520138210e-05f, +1.155285038e-02f, +9.227201126e-03f, -1.050632189e-02f, -2.146682265e-02f, -1.070080522e-03f, +2.846943050e-02f, +2.173339462e-02f, -2.111975682e-02f, -4.156195119e-02f, -2.843516418e-03f, +4.685300781e-02f, +3.428656913e-02f, -2.974733433e-02f, -5.641218009e-02f, -4.456111943e-03f, +5.545643630e-02f, +3.896315252e-02f, -3.060344051e-02f, -5.594272481e-02f, -4.878953368e-03f, +4.816787947e-02f, +3.249150943e-02f, -2.299661418e-02f, -4.051228333e-02f, -3.898008290e-03f, +3.013982913e-02f, +1.948740943e-02f, -1.209474305e-02f, -2.053176710e-02f, -2.253585003e-03f, +1.264529368e-02f, +7.810668581e-03f, -3.918560355e-03f, -6.437823692e-03f, -8.820358799e-04f, +2.877094622e-03f, +1.688854033e-03f, -4.759138339e-04f, -7.992261485e-04f, -2.514472832e-04f, + -2.353137234e-05f, +2.365453872e-05f, +8.142328803e-05f, +3.304361531e-05f, -1.280286063e-04f, -1.921369911e-04f, +3.319234646e-05f, +3.599667111e-04f, +3.018475856e-04f, -2.785328196e-04f, -7.433062355e-04f, -2.965771233e-04f, +8.336605869e-04f, +1.251623750e-03f, -1.881390406e-05f, -1.872390275e-03f, -1.824843738e-03f, +9.861701888e-04f, +3.846373323e-03f, +2.590643025e-03f, -3.645263310e-03f, -1.026085388e-02f, -1.084303494e-02f, -3.546680477e-03f, +6.477748644e-03f, +1.156643899e-02f, +8.575586598e-03f, +1.346909768e-03f, -3.588492821e-03f, -3.220100200e-03f, +9.205503488e-05f, +2.162670530e-03f, +1.381056230e-03f, -5.396921521e-04f, -1.288401865e-03f, -4.795484832e-04f, +5.498874868e-04f, +6.689072257e-04f, +6.599342113e-05f, -3.845158597e-04f, -2.760167067e-04f, +6.656370929e-05f, +1.990544543e-04f, +7.494736970e-05f, -6.441342463e-05f, -6.938371933e-05f, -3.286313808e-06f, +2.596374223e-05f, + +2.353137234e-05f, +8.532242424e-07f, -1.277590202e-04f, -1.183334294e-04f, +1.861970369e-04f, +3.974939200e-04f, -3.197067399e-05f, -7.293679253e-04f, -5.042497876e-04f, +7.842790341e-04f, +1.342934023e-03f, -1.798912746e-04f, -2.018723382e-03f, -1.161357086e-03f, +1.861157813e-03f, +2.741185758e-03f, -4.790357470e-04f, -3.618968992e-03f, -1.788925009e-03f, +2.986838906e-03f, +3.883716922e-03f, -8.126518140e-04f, -4.615314533e-03f, -1.978639386e-03f, +3.460458135e-03f, +4.009570271e-03f, -9.629263980e-04f, -4.316740431e-03f, -1.597898392e-03f, +2.940997155e-03f, +3.031625551e-03f, -8.148446463e-04f, -2.936546701e-03f, -9.209211050e-04f, +1.793191621e-03f, +1.621897476e-03f, -4.785996723e-04f, -1.377566587e-03f, -3.504098630e-04f, +7.250347421e-04f, +5.545251612e-04f, -1.749217869e-04f, -3.834433674e-04f, -7.084089497e-05f, +1.536580014e-04f, +8.783453419e-05f, -2.677558788e-05f, -2.596374223e-05f, + /* 6, 6 (48) */ + +3.786906842e-04f, +4.742409770e-04f, -4.000804031e-04f, -1.538522367e-03f, -9.126535106e-04f, +1.929113513e-03f, +3.691281546e-03f, +5.322997163e-04f, -5.570715989e-03f, -6.490833009e-03f, +2.246918518e-03f, +1.220884494e-02f, +8.620493394e-03f, -9.819225309e-03f, -2.240746746e-02f, -7.356802921e-03f, +2.613749814e-02f, +3.696347053e-02f, -3.175092215e-03f, -6.267792687e-02f, -6.209384823e-02f, +4.996687989e-02f, +2.295074716e-01f, +3.567874214e-01f, +3.365738973e-01f, +1.843472333e-01f, +1.207845715e-02f, -7.201403750e-02f, -5.009565782e-02f, +1.110601084e-02f, +3.871714026e-02f, +1.803793170e-02f, -1.392726073e-02f, -2.132379272e-02f, -4.667631548e-03f, +1.126515414e-02f, +1.047914838e-02f, -6.129567250e-04f, -7.177519115e-03f, -4.173532748e-03f, +1.817203621e-03f, +3.616790862e-03f, +1.134643437e-03f, -1.320512797e-03f, -1.337801647e-03f, -9.472486139e-05f, +5.267649628e-04f, +2.774110254e-04f, + -3.786906842e-04f, -8.861937670e-04f, +4.647159335e-05f, +2.400166972e-03f, +2.293754130e-03f, -2.853309640e-03f, -6.918820344e-03f, -7.645693074e-04f, +1.104860059e-02f, +1.001148016e-02f, -9.163387871e-03f, -2.164671393e-02f, -3.088803903e-03f, +2.730807342e-02f, +2.359455243e-02f, -1.837857106e-02f, -4.204098693e-02f, -6.462485410e-03f, +4.506408280e-02f, +3.727340804e-02f, -2.586361741e-02f, -5.722483191e-02f, -9.071426476e-03f, +5.347779691e-02f, +4.242361066e-02f, -2.659387024e-02f, -5.690565121e-02f, -9.195693798e-03f, +4.656998107e-02f, +3.543250658e-02f, -1.996498863e-02f, -4.132712798e-02f, -6.834554991e-03f, +2.921890803e-02f, +2.128060105e-02f, -1.047284557e-02f, -2.101036678e-02f, -3.631151590e-03f, +1.229488382e-02f, +8.535703323e-03f, -3.364035194e-03f, -6.612745479e-03f, -1.265479247e-03f, +2.806253727e-03f, +1.842512035e-03f, -3.880792997e-04f, -8.260017364e-04f, -2.774110254e-04f, + -2.448432686e-05f, +1.933202504e-05f, +7.979643430e-05f, +4.046201405e-05f, -1.178666074e-04f, -1.959706758e-04f, +1.178503831e-05f, +3.459002212e-04f, +3.232459887e-04f, -2.357867328e-04f, -7.356898046e-04f, -3.544005275e-04f, +7.669209652e-04f, +1.273414605e-03f, +1.007632299e-04f, -1.787510694e-03f, -1.917258590e-03f, +7.646390276e-04f, +3.751774984e-03f, +2.834750877e-03f, -3.174398890e-03f, -9.968447037e-03f, -1.105579341e-02f, -4.163932878e-03f, +5.926336299e-03f, +1.149014482e-02f, +8.954184214e-03f, +1.792132689e-03f, -3.433943292e-03f, -3.373943242e-03f, -1.156686781e-04f, +2.120044708e-03f, +1.491354662e-03f, -4.368686223e-04f, -1.295213721e-03f, -5.535853241e-04f, +5.067609651e-04f, +6.906968193e-04f, +1.077960061e-04f, -3.728940811e-04f, -2.952566154e-04f, +4.825257690e-05f, +2.000531521e-04f, +8.587286552e-05f, -5.931592914e-05f, -7.250671886e-05f, -7.066530373e-06f, +2.592601571e-05f, + +2.448432686e-05f, +7.011497458e-06f, -1.205297111e-04f, -1.281454301e-04f, +1.629732380e-04f, +3.999945670e-04f, +1.322172512e-05f, -7.010743988e-04f, -5.591231130e-04f, +7.009301813e-04f, +1.368267321e-03f, -4.120131989e-05f, -1.960627270e-03f, -1.310760908e-03f, +1.686462397e-03f, +2.817946487e-03f, -2.134436808e-04f, -3.542700803e-03f, -2.052324376e-03f, +2.736329489e-03f, +4.023275194e-03f, -4.560839640e-04f, -4.549503884e-03f, -2.308292966e-03f, +3.201154799e-03f, +4.184380535e-03f, -6.138029170e-04f, -4.283915400e-03f, -1.899219181e-03f, +2.746241242e-03f, +3.188370580e-03f, -5.661303949e-04f, -2.935156821e-03f, -1.119687697e-03f, +1.691102124e-03f, +1.721091589e-03f, -3.554647702e-04f, -1.388704191e-03f, -4.393715858e-04f, +6.918760735e-04f, +5.954859446e-04f, -1.377897108e-04f, -3.913193363e-04f, -9.343737580e-05f, +1.493108471e-04f, +9.640999259e-05f, -2.258904820e-05f, -2.592601571e-05f, + /* 6, 7 (48) */ + +3.542063574e-04f, +4.935730020e-04f, -3.202839688e-04f, -1.498060353e-03f, -1.030520118e-03f, +1.733142837e-03f, +3.703066585e-03f, +8.781999375e-04f, -5.247470000e-03f, -6.726619742e-03f, +1.511228713e-03f, +1.185444441e-02f, +9.387414359e-03f, -8.545810704e-03f, -2.230670423e-02f, -9.144313614e-03f, +2.422023955e-02f, +3.772810956e-02f, +5.766827686e-04f, -5.984317599e-02f, -6.526824712e-02f, +3.999843285e-02f, +2.184516782e-01f, +3.526234885e-01f, +3.425002336e-01f, +1.958373782e-01f, +2.103264136e-02f, -7.022190482e-02f, -5.352960111e-02f, +7.732067600e-03f, +3.860147158e-02f, +2.015797640e-02f, -1.243590607e-02f, -2.176066135e-02f, -5.962845269e-03f, +1.071156881e-02f, +1.098590935e-02f, +7.774009424e-05f, -7.069723108e-03f, -4.546426829e-03f, +1.521947006e-03f, +3.665043439e-03f, +1.334696589e-03f, -1.234639931e-03f, -1.397117576e-03f, -1.672315802e-04f, +5.196984324e-04f, +3.033370412e-04f, + -3.542063574e-04f, -8.791822696e-04f, -7.405811770e-05f, +2.272021542e-03f, +2.456727368e-03f, -2.453315073e-03f, -6.905598619e-03f, -1.465643706e-03f, +1.048947748e-02f, +1.071241034e-02f, -7.795120550e-03f, -2.168791525e-02f, -5.049431174e-03f, +2.599731251e-02f, +2.528101483e-02f, -1.556062457e-02f, -4.225443061e-02f, -1.000518621e-02f, +4.301175842e-02f, +4.000973753e-02f, -2.184034221e-02f, -5.768091587e-02f, -1.362093036e-02f, +5.116950395e-02f, +4.562476546e-02f, -2.240948970e-02f, -5.751945412e-02f, -1.347960920e-02f, +4.467076189e-02f, +3.817874782e-02f, -1.677661805e-02f, -4.189325837e-02f, -9.769711812e-03f, +2.809922033e-02f, +2.297170317e-02f, -8.751753984e-03f, -2.136583155e-02f, -5.019855781e-03f, +1.185551223e-02f, +9.227579396e-03f, -2.768549250e-03f, -6.750535189e-03f, -1.656798584e-03f, +2.712816351e-03f, +1.991822882e-03f, -2.916693071e-04f, -8.485907846e-04f, -3.033370412e-04f, + -2.519586065e-05f, +1.511068163e-05f, +7.774665823e-05f, +4.732640238e-05f, -1.074043009e-04f, -1.985483987e-04f, -8.989955332e-06f, +3.303369810e-04f, +3.422429896e-04f, -1.929224521e-04f, -7.242726748e-04f, -4.088429183e-04f, +6.977056506e-04f, +1.287871922e-03f, +2.169203000e-04f, -1.695268729e-03f, -1.997326444e-03f, +5.450125416e-04f, +3.640836977e-03f, +3.056881857e-03f, -2.707478034e-03f, -9.652198442e-03f, -1.123473239e-02f, -4.767579644e-03f, +5.355675280e-03f, +1.137956767e-02f, +9.313593052e-03f, +2.246179663e-03f, -3.256693025e-03f, -3.514547854e-03f, -3.283494830e-04f, +2.064936703e-03f, +1.596323724e-03f, -3.291225817e-04f, -1.295093514e-03f, -6.264488016e-04f, +4.596921448e-04f, +7.092159442e-04f, +1.501809141e-04f, -3.588001819e-04f, -3.134100873e-04f, +2.903319024e-05f, +1.998978496e-04f, +9.671551233e-05f, -5.361637368e-05f, -7.530573035e-05f, -1.101474876e-05f, +2.567345557e-05f, + +2.519586065e-05f, +1.269748124e-05f, -1.128393307e-04f, -1.365742325e-04f, +1.396606961e-04f, +3.997245964e-04f, +5.673429862e-05f, -6.691078869e-04f, -6.088000572e-04f, +6.152473448e-04f, +1.384254920e-03f, +9.479965023e-05f, -1.891204326e-03f, -1.449310955e-03f, +1.503785046e-03f, +2.875921927e-03f, +5.038610774e-05f, -3.444931680e-03f, -2.300629299e-03f, +2.470343376e-03f, +4.136857541e-03f, -9.796268044e-05f, -4.455273590e-03f, -2.623244109e-03f, +2.921494382e-03f, +4.333285752e-03f, -2.594244262e-04f, -4.223875475e-03f, -2.190680989e-03f, +2.532381300e-03f, +3.326500154e-03f, -3.107861333e-04f, -2.914990835e-03f, -1.314420454e-03f, +1.576298379e-03f, +1.811118485e-03f, -2.272840501e-04f, -1.391009849e-03f, -5.278545486e-04f, +6.530980272e-04f, +6.337976565e-04f, -9.832913091e-05f, -3.967918929e-04f, -1.164282873e-04f, +1.436244281e-04f, +1.047718587e-04f, -1.789400372e-05f, -2.567345557e-05f, + /* 6, 8 (48) */ + +3.290104967e-04f, +5.086836836e-04f, -2.425373106e-04f, -1.450733950e-03f, -1.137924419e-03f, +1.534594438e-03f, +3.694076629e-03f, +1.208536918e-03f, -4.905227010e-03f, -6.919542194e-03f, +7.869560385e-04f, +1.144560149e-02f, +1.008512001e-02f, -7.257938783e-03f, -2.208978393e-02f, -1.083958234e-02f, +2.222291311e-02f, +3.827312210e-02f, +4.217519746e-03f, -5.678629413e-02f, -6.797572515e-02f, +3.034623441e-02f, +2.072169458e-01f, +3.478559089e-01f, +3.478559089e-01f, +2.072169458e-01f, +3.034623441e-02f, -6.797572515e-02f, -5.678629413e-02f, +4.217519746e-03f, +3.827312210e-02f, +2.222291311e-02f, -1.083958234e-02f, -2.208978393e-02f, -7.257938783e-03f, +1.008512001e-02f, +1.144560149e-02f, +7.869560385e-04f, -6.919542194e-03f, -4.905227010e-03f, +1.208536918e-03f, +3.694076629e-03f, +1.534594438e-03f, -1.137924419e-03f, -1.450733950e-03f, -2.425373106e-04f, +5.086836836e-04f, +3.290104967e-04f, + -3.290104967e-04f, -8.664847883e-04f, -1.868974484e-04f, +2.135447310e-03f, +2.596388064e-03f, -2.053590476e-03f, -6.848864320e-03f, -2.134751593e-03f, +9.880677424e-03f, +1.132765769e-02f, -6.410865630e-03f, -2.159311560e-02f, -6.940635500e-03f, +2.454800155e-02f, +2.678479988e-02f, -1.268470265e-02f, -4.220404451e-02f, -1.345011789e-02f, +4.071112912e-02f, +4.248008090e-02f, -1.770348467e-02f, -5.777887855e-02f, -1.807620395e-02f, +4.854625984e-02f, +4.854625984e-02f, -1.807620395e-02f, -5.777887855e-02f, -1.770348467e-02f, +4.248008090e-02f, +4.071112912e-02f, -1.345011789e-02f, -4.220404451e-02f, -1.268470265e-02f, +2.678479988e-02f, +2.454800155e-02f, -6.940635500e-03f, -2.159311560e-02f, -6.410865630e-03f, +1.132765769e-02f, +9.880677424e-03f, -2.134751593e-03f, -6.848864320e-03f, -2.053590476e-03f, +2.596388064e-03f, +2.135447310e-03f, -1.868974484e-04f, -8.664847883e-04f, -3.290104967e-04f, + -2.567345557e-05f, +1.101474876e-05f, +7.530573035e-05f, +5.361637368e-05f, -9.671551233e-05f, -1.998978496e-04f, -2.903319024e-05f, +3.134100873e-04f, +3.588001819e-04f, -1.501809141e-04f, -7.092159442e-04f, -4.596921448e-04f, +6.264488016e-04f, +1.295093514e-03f, +3.291225817e-04f, -1.596323724e-03f, -2.064936703e-03f, +3.283494830e-04f, +3.514547854e-03f, +3.256693025e-03f, -2.246179663e-03f, -9.313593052e-03f, -1.137956767e-02f, -5.355675280e-03f, +4.767579644e-03f, +1.123473239e-02f, +9.652198442e-03f, +2.707478034e-03f, -3.056881857e-03f, -3.640836977e-03f, -5.450125416e-04f, +1.997326444e-03f, +1.695268729e-03f, -2.169203000e-04f, -1.287871922e-03f, -6.977056506e-04f, +4.088429183e-04f, +7.242726748e-04f, +1.929224521e-04f, -3.422429896e-04f, -3.303369810e-04f, +8.989955332e-06f, +1.985483987e-04f, +1.074043009e-04f, -4.732640238e-05f, -7.774665823e-05f, -1.511068163e-05f, +2.519586065e-05f, + +2.567345557e-05f, +1.789400372e-05f, -1.047718587e-04f, -1.436244281e-04f, +1.164282873e-04f, +3.967918929e-04f, +9.832913091e-05f, -6.337976565e-04f, -6.530980272e-04f, +5.278545486e-04f, +1.391009849e-03f, +2.272840501e-04f, -1.811118485e-03f, -1.576298379e-03f, +1.314420454e-03f, +2.914990835e-03f, +3.107861333e-04f, -3.326500154e-03f, -2.532381300e-03f, +2.190680989e-03f, +4.223875475e-03f, +2.594244262e-04f, -4.333285752e-03f, -2.921494382e-03f, +2.623244109e-03f, +4.455273590e-03f, +9.796268044e-05f, -4.136857541e-03f, -2.470343376e-03f, +2.300629299e-03f, +3.444931680e-03f, -5.038610774e-05f, -2.875921927e-03f, -1.503785046e-03f, +1.449310955e-03f, +1.891204326e-03f, -9.479965023e-05f, -1.384254920e-03f, -6.152473448e-04f, +6.088000572e-04f, +6.691078869e-04f, -5.673429862e-05f, -3.997245964e-04f, -1.396606961e-04f, +1.365742325e-04f, +1.128393307e-04f, -1.269748124e-05f, -2.519586065e-05f, + /* 6, 9 (48) */ + +3.033370412e-04f, +5.196984324e-04f, -1.672315802e-04f, -1.397117576e-03f, -1.234639931e-03f, +1.334696589e-03f, +3.665043439e-03f, +1.521947006e-03f, -4.546426829e-03f, -7.069723108e-03f, +7.774009424e-05f, +1.098590935e-02f, +1.071156881e-02f, -5.962845269e-03f, -2.176066135e-02f, -1.243590607e-02f, +2.015797640e-02f, +3.860147158e-02f, +7.732067600e-03f, -5.352960111e-02f, -7.022190482e-02f, +2.103264136e-02f, +1.958373782e-01f, +3.425002336e-01f, +3.526234885e-01f, +2.184516782e-01f, +3.999843285e-02f, -6.526824712e-02f, -5.984317599e-02f, +5.766827686e-04f, +3.772810956e-02f, +2.422023955e-02f, -9.144313614e-03f, -2.230670423e-02f, -8.545810704e-03f, +9.387414359e-03f, +1.185444441e-02f, +1.511228713e-03f, -6.726619742e-03f, -5.247470000e-03f, +8.781999375e-04f, +3.703066585e-03f, +1.733142837e-03f, -1.030520118e-03f, -1.498060353e-03f, -3.202839688e-04f, +4.935730020e-04f, +3.542063574e-04f, + -3.033370412e-04f, -8.485907846e-04f, -2.916693071e-04f, +1.991822882e-03f, +2.712816351e-03f, -1.656798584e-03f, -6.750535189e-03f, -2.768549250e-03f, +9.227579396e-03f, +1.185551223e-02f, -5.019855781e-03f, -2.136583155e-02f, -8.751753984e-03f, +2.297170317e-02f, +2.809922033e-02f, -9.769711812e-03f, -4.189325837e-02f, -1.677661805e-02f, +3.817874782e-02f, +4.467076189e-02f, -1.347960920e-02f, -5.751945412e-02f, -2.240948970e-02f, +4.562476546e-02f, +5.116950395e-02f, -1.362093036e-02f, -5.768091587e-02f, -2.184034221e-02f, +4.000973753e-02f, +4.301175842e-02f, -1.000518621e-02f, -4.225443061e-02f, -1.556062457e-02f, +2.528101483e-02f, +2.599731251e-02f, -5.049431174e-03f, -2.168791525e-02f, -7.795120550e-03f, +1.071241034e-02f, +1.048947748e-02f, -1.465643706e-03f, -6.905598619e-03f, -2.453315073e-03f, +2.456727368e-03f, +2.272021542e-03f, -7.405811770e-05f, -8.791822696e-04f, -3.542063574e-04f, + -2.592601571e-05f, +7.066530373e-06f, +7.250671886e-05f, +5.931592914e-05f, -8.587286552e-05f, -2.000531521e-04f, -4.825257690e-05f, +2.952566154e-04f, +3.728940811e-04f, -1.077960061e-04f, -6.906968193e-04f, -5.067609651e-04f, +5.535853241e-04f, +1.295213721e-03f, +4.368686223e-04f, -1.491354662e-03f, -2.120044708e-03f, +1.156686781e-04f, +3.373943242e-03f, +3.433943292e-03f, -1.792132689e-03f, -8.954184214e-03f, -1.149014482e-02f, -5.926336299e-03f, +4.163932878e-03f, +1.105579341e-02f, +9.968447037e-03f, +3.174398890e-03f, -2.834750877e-03f, -3.751774984e-03f, -7.646390276e-04f, +1.917258590e-03f, +1.787510694e-03f, -1.007632299e-04f, -1.273414605e-03f, -7.669209652e-04f, +3.544005275e-04f, +7.356898046e-04f, +2.357867328e-04f, -3.232459887e-04f, -3.459002212e-04f, -1.178503831e-05f, +1.959706758e-04f, +1.178666074e-04f, -4.046201405e-05f, -7.979643430e-05f, -1.933202504e-05f, +2.448432686e-05f, + +2.592601571e-05f, +2.258904820e-05f, -9.640999259e-05f, -1.493108471e-04f, +9.343737580e-05f, +3.913193363e-04f, +1.377897108e-04f, -5.954859446e-04f, -6.918760735e-04f, +4.393715858e-04f, +1.388704191e-03f, +3.554647702e-04f, -1.721091589e-03f, -1.691102124e-03f, +1.119687697e-03f, +2.935156821e-03f, +5.661303949e-04f, -3.188370580e-03f, -2.746241242e-03f, +1.899219181e-03f, +4.283915400e-03f, +6.138029170e-04f, -4.184380535e-03f, -3.201154799e-03f, +2.308292966e-03f, +4.549503884e-03f, +4.560839640e-04f, -4.023275194e-03f, -2.736329489e-03f, +2.052324376e-03f, +3.542700803e-03f, +2.134436808e-04f, -2.817946487e-03f, -1.686462397e-03f, +1.310760908e-03f, +1.960627270e-03f, +4.120131989e-05f, -1.368267321e-03f, -7.009301813e-04f, +5.591231130e-04f, +7.010743988e-04f, -1.322172512e-05f, -3.999945670e-04f, -1.629732380e-04f, +1.281454301e-04f, +1.205297111e-04f, -7.011497458e-06f, -2.448432686e-05f, + /* 6,10 (48) */ + +2.774110254e-04f, +5.267649628e-04f, -9.472486139e-05f, -1.337801647e-03f, -1.320512797e-03f, +1.134643437e-03f, +3.616790862e-03f, +1.817203621e-03f, -4.173532748e-03f, -7.177519115e-03f, -6.129567250e-04f, +1.047914838e-02f, +1.126515414e-02f, -4.667631548e-03f, -2.132379272e-02f, -1.392726073e-02f, +1.803793170e-02f, +3.871714026e-02f, +1.110601084e-02f, -5.009565782e-02f, -7.201403750e-02f, +1.207845715e-02f, +1.843472333e-01f, +3.365738973e-01f, +3.567874214e-01f, +2.295074716e-01f, +4.996687989e-02f, -6.209384823e-02f, -6.267792687e-02f, -3.175092215e-03f, +3.696347053e-02f, +2.613749814e-02f, -7.356802921e-03f, -2.240746746e-02f, -9.819225309e-03f, +8.620493394e-03f, +1.220884494e-02f, +2.246918518e-03f, -6.490833009e-03f, -5.570715989e-03f, +5.322997163e-04f, +3.691281546e-03f, +1.929113513e-03f, -9.126535106e-04f, -1.538522367e-03f, -4.000804031e-04f, +4.742409770e-04f, +3.786906842e-04f, + -2.774110254e-04f, -8.260017364e-04f, -3.880792997e-04f, +1.842512035e-03f, +2.806253727e-03f, -1.265479247e-03f, -6.612745479e-03f, -3.364035194e-03f, +8.535703323e-03f, +1.229488382e-02f, -3.631151590e-03f, -2.101036678e-02f, -1.047284557e-02f, +2.128060105e-02f, +2.921890803e-02f, -6.834554991e-03f, -4.132712798e-02f, -1.996498863e-02f, +3.543250658e-02f, +4.656998107e-02f, -9.195693798e-03f, -5.690565121e-02f, -2.659387024e-02f, +4.242361066e-02f, +5.347779691e-02f, -9.071426476e-03f, -5.722483191e-02f, -2.586361741e-02f, +3.727340804e-02f, +4.506408280e-02f, -6.462485410e-03f, -4.204098693e-02f, -1.837857106e-02f, +2.359455243e-02f, +2.730807342e-02f, -3.088803903e-03f, -2.164671393e-02f, -9.163387871e-03f, +1.001148016e-02f, +1.104860059e-02f, -7.645693074e-04f, -6.918820344e-03f, -2.853309640e-03f, +2.293754130e-03f, +2.400166972e-03f, +4.647159335e-05f, -8.861937670e-04f, -3.786906842e-04f, + -2.596374223e-05f, +3.286313808e-06f, +6.938371933e-05f, +6.441342463e-05f, -7.494736970e-05f, -1.990544543e-04f, -6.656370929e-05f, +2.760167067e-04f, +3.845158597e-04f, -6.599342113e-05f, -6.689072257e-04f, -5.498874868e-04f, +4.795484832e-04f, +1.288401865e-03f, +5.396921521e-04f, -1.381056230e-03f, -2.162670530e-03f, -9.205503488e-05f, +3.220100200e-03f, +3.588492821e-03f, -1.346909768e-03f, -8.575586598e-03f, -1.156643899e-02f, -6.477748644e-03f, +3.546680477e-03f, +1.084303494e-02f, +1.026085388e-02f, +3.645263310e-03f, -2.590643025e-03f, -3.846373323e-03f, -9.861701888e-04f, +1.824843738e-03f, +1.872390275e-03f, +1.881390406e-05f, -1.251623750e-03f, -8.336605869e-04f, +2.965771233e-04f, +7.433062355e-04f, +2.785328196e-04f, -3.018475856e-04f, -3.599667111e-04f, -3.319234646e-05f, +1.921369911e-04f, +1.280286063e-04f, -3.304361531e-05f, -8.142328803e-05f, -2.365453872e-05f, +2.353137234e-05f, + +2.596374223e-05f, +2.677558788e-05f, -8.783453419e-05f, -1.536580014e-04f, +7.084089497e-05f, +3.834433674e-04f, +1.749217869e-04f, -5.545251612e-04f, -7.250347421e-04f, +3.504098630e-04f, +1.377566587e-03f, +4.785996723e-04f, -1.621897476e-03f, -1.793191621e-03f, +9.209211050e-04f, +2.936546701e-03f, +8.148446463e-04f, -3.031625551e-03f, -2.940997155e-03f, +1.597898392e-03f, +4.316740431e-03f, +9.629263980e-04f, -4.009570271e-03f, -3.460458135e-03f, +1.978639386e-03f, +4.615314533e-03f, +8.126518140e-04f, -3.883716922e-03f, -2.986838906e-03f, +1.788925009e-03f, +3.618968992e-03f, +4.790357470e-04f, -2.741185758e-03f, -1.861157813e-03f, +1.161357086e-03f, +2.018723382e-03f, +1.798912746e-04f, -1.342934023e-03f, -7.842790341e-04f, +5.042497876e-04f, +7.293679253e-04f, +3.197067399e-05f, -3.974939200e-04f, -1.861970369e-04f, +1.183334294e-04f, +1.277590202e-04f, -8.532242424e-07f, -2.353137234e-05f, + /* 6,11 (48) */ + +2.514472832e-04f, +5.300512766e-04f, -2.534114206e-05f, -1.273388223e-03f, -1.395460166e-03f, +9.355889825e-04f, +3.550227153e-03f, +2.093220328e-03f, -3.789016888e-03f, -7.243512536e-03f, -1.281863951e-03f, +9.929260895e-03f, +1.174470262e-02f, -3.379229683e-03f, -2.078410057e-02f, -1.530831696e-02f, +1.587526117e-02f, +3.862508523e-02f, +1.432611104e-02f, -4.650716500e-02f, -7.336094727e-02f, +3.502870548e-03f, +1.727807943e-01f, +3.300961487e-01f, +3.603341019e-01f, +2.403505066e-01f, +6.022773377e-02f, -5.844858492e-02f, -6.526856989e-02f, -7.021465538e-03f, +3.597730034e-02f, +2.796234188e-02f, -5.484412646e-03f, -2.238865355e-02f, -1.107084906e-02f, +7.786832807e-03f, +1.250542206e-02f, +2.990224753e-03f, -6.212300190e-03f, -5.872563574e-03f, +1.723330052e-04f, +3.658089200e-03f, +2.121250504e-03f, -7.846249043e-04f, -1.571565982e-03f, -4.815036912e-04f, +4.505864383e-04f, +4.022220566e-04f, + -2.514472832e-04f, -7.992261485e-04f, -4.759138339e-04f, +1.688854033e-03f, +2.877094622e-03f, -8.820358799e-04f, -6.437823692e-03f, -3.918560355e-03f, +7.810668581e-03f, +1.264529368e-02f, -2.253585003e-03f, -2.053176710e-02f, -1.209474305e-02f, +1.948740943e-02f, +3.013982913e-02f, -3.898008290e-03f, -4.051228333e-02f, -2.299661418e-02f, +3.249150943e-02f, +4.816787947e-02f, -4.878953368e-03f, -5.594272481e-02f, -3.060344051e-02f, +3.896315252e-02f, +5.545643630e-02f, -4.456111943e-03f, -5.641218009e-02f, -2.974733433e-02f, +3.428656913e-02f, +4.685300781e-02f, -2.843516418e-03f, -4.156195119e-02f, -2.111975682e-02f, +2.173339462e-02f, +2.846943050e-02f, -1.070080522e-03f, -2.146682265e-02f, -1.050632189e-02f, +9.227201126e-03f, +1.155285038e-02f, -3.520138210e-05f, -6.886849670e-03f, -3.250803560e-03f, +2.107557093e-03f, +2.518500402e-03f, +1.742306135e-04f, -8.870469913e-04f, -4.022220566e-04f, + -2.579800327e-05f, -3.076934037e-07f, +6.597158708e-05f, +6.890149093e-05f, -6.400803040e-05f, -1.969474946e-04f, -8.389013798e-05f, +2.558326624e-04f, +3.936710023e-04f, -2.498958862e-05f, -6.440523703e-04f, -5.889354579e-04f, +4.047675780e-04f, +1.274860546e-03f, +6.371637688e-04f, -1.266134869e-03f, -2.192897459e-03f, -2.938945811e-04f, +3.054131478e-03f, +3.720301977e-03f, -9.120213723e-04f, -8.179468934e-03f, -1.160855426e-02f, -7.008174801e-03f, +2.917822246e-03f, +1.059687046e-02f, +1.052800922e-02f, +4.118348902e-03f, -2.325003233e-03f, -3.923696023e-03f, -1.208511679e-03f, +1.720259320e-03f, +1.949271696e-03f, +1.412452366e-04f, -1.222439452e-03f, -8.974935422e-04f, +2.356091725e-04f, +7.469783072e-04f, +3.209139411e-04f, -2.781012933e-04f, -3.724082463e-04f, -5.512555411e-05f, +1.870264704e-04f, +1.378157037e-04f, -2.509604609e-05f, -8.259701733e-05f, -2.805214350e-05f, +2.233105653e-05f, + +2.579800327e-05f, +3.045138455e-05f, -7.912381790e-05f, -1.566994726e-04f, +4.878252667e-05f, +3.733125000e-04f, +2.095540331e-04f, -5.112751002e-04f, -7.525156364e-04f, +2.615684034e-04f, +1.357879403e-03f, +5.959956855e-04f, -1.514355818e-03f, -1.882128834e-03f, +7.194611602e-04f, +2.919408038e-03f, +1.055416203e-03f, -2.857457604e-03f, -3.115571159e-03f, +1.288709475e-03f, +4.322291018e-03f, +1.304591153e-03f, -3.810032420e-03f, -3.697770427e-03f, +1.636378197e-03f, +4.652226236e-03f, +1.165380464e-03f, -3.718943121e-03f, -3.220160048e-03f, +1.512000316e-03f, +3.673030348e-03f, +7.446917873e-04f, -2.645886660e-03f, -2.026610082e-03f, +1.001892781e-03f, +2.064892248e-03f, +3.204070220e-04f, -1.308203188e-03f, -8.646699359e-04f, +4.444041660e-04f, +7.536749521e-04f, +7.858462338e-05f, -3.921311355e-04f, -2.091567200e-04f, +1.071443738e-04f, +1.344426504e-04f, +5.754885180e-06f, -2.233105653e-05f, + /* 6,12 (48) */ + +2.256492799e-04f, +5.297435832e-04f, +4.063044502e-05f, -1.204486732e-03f, -1.459468197e-03f, +7.386414879e-04f, +3.466337015e-03f, +2.349052990e-03f, -3.395345886e-03f, -7.268502124e-03f, -1.925916321e-03f, +9.340325437e-03f, +1.214947020e-02f, -2.104369136e-03f, -2.014693680e-02f, -1.657445183e-02f, +1.368236371e-02f, +3.833119065e-02f, +1.738024252e-02f, -4.278686302e-02f, -7.427296864e-02f, -4.676598387e-03f, +1.611722401e-01f, +3.230879739e-01f, +3.632519241e-01f, +2.509473770e-01f, +7.075574299e-02f, -5.433023602e-02f, -6.759357313e-02f, -1.094516156e-02f, +3.476878867e-02f, +2.968260120e-02f, -3.535140950e-03f, -2.224740832e-02f, -1.229328851e-02f, +6.889339265e-03f, +1.274103123e-02f, +3.737203061e-03f, -5.891386249e-03f, -6.150664868e-03f, -2.000752410e-04f, +3.602963646e-03f, +2.308276975e-03f, -6.468092006e-04f, -1.596662028e-03f, -5.641007085e-04f, +4.225342948e-04f, +4.245531131e-04f, + -2.256492799e-04f, -7.687747640e-04f, -5.550376518e-04f, +1.532154561e-03f, +2.925877149e-03f, -5.087233799e-04f, -6.228269659e-03f, -4.429835456e-03f, +7.058152944e-03f, +1.290686209e-02f, -8.957056000e-04f, -1.993577142e-02f, -1.360909887e-02f, +1.760528059e-02f, +3.085929029e-02f, -9.786002519e-04f, -3.945686713e-02f, -2.585407178e-02f, +2.937593827e-02f, +4.945658894e-02f, -5.566623497e-04f, -5.463813366e-02f, -3.441347293e-02f, +3.526538209e-02f, +5.709281450e-02f, +1.961142931e-04f, -5.524679963e-02f, -3.346627745e-02f, +3.106640908e-02f, +4.836500812e-02f, +8.295139303e-04f, -4.081725940e-02f, -2.376564348e-02f, +1.970678454e-02f, +2.947132328e-02f, +9.948117267e-04f, -2.114641563e-02f, -1.181452508e-02f, +8.362531190e-03f, +1.199725455e-02f, +7.184735700e-04f, -6.808265047e-03f, -3.642934695e-03f, +1.898400373e-03f, +2.625644776e-03f, +3.086732639e-04f, -8.812921061e-04f, -4.245531131e-04f, + -2.544119995e-05f, -3.699409719e-06f, +6.230567366e-05f, +7.277692874e-05f, -5.312148518e-05f, -1.937831454e-04f, -1.001635876e-04f, +2.348480499e-04f, +4.003788880e-04f, +1.500931522e-05f, -6.163492617e-04f, -6.237944064e-04f, +3.296656896e-04f, +1.254823802e-03f, +7.288923924e-04f, -1.147304853e-03f, -2.210870206e-03f, -4.889741247e-04f, +2.877179697e-03f, +3.829429834e-03f, -4.889102033e-04f, -7.767546564e-03f, -1.161672233e-02f, -7.515960575e-03f, +2.279404362e-03f, +1.031784186e-02f, +1.076858506e-02f, +4.591896607e-03f, -2.038378098e-03f, -3.982865045e-03f, -1.430538142e-03f, +1.603750184e-03f, +2.017546624e-03f, +2.659361064e-04f, -1.185840910e-03f, -9.579945182e-04f, +1.717567126e-04f, +7.465810587e-04f, +3.626787717e-04f, -2.520758300e-04f, -3.831024246e-04f, -7.747171356e-05f, +1.806254050e-04f, +1.471529901e-04f, -1.664857625e-05f, -8.328925833e-05f, -3.249703570e-05f, +2.087909205e-05f, + +2.544119995e-05f, +3.361875474e-05f, -7.035318574e-05f, -1.584772530e-04f, +2.739598337e-05f, +3.610857945e-04f, +2.415385252e-04f, -4.661001774e-04f, -7.743006998e-04f, +1.734300341e-04f, +1.329975583e-03f, +7.070124832e-04f, -1.399325762e-03f, -1.957569632e-03f, +5.166454864e-04f, +2.884105909e-03f, +1.286403228e-03f, -2.667160254e-03f, -3.269025430e-03f, +9.736802695e-04f, +4.300684389e-03f, +1.636650437e-03f, -3.587101452e-03f, -3.911601571e-03f, +1.283686914e-03f, +4.659946008e-03f, +1.512001046e-03f, -3.529881935e-03f, -3.434682070e-03f, +1.223220544e-03f, +3.704317578e-03f, +1.008693674e-03f, -2.532421760e-03f, -2.181600471e-03f, +8.332417435e-04f, +2.098602257e-03f, +4.618549811e-04f, -1.264085916e-03f, -9.414833671e-04f, +3.798513683e-04f, +7.737004654e-04f, +1.263427196e-04f, -3.838323497e-04f, -2.316715232e-04f, +9.459557017e-05f, +1.404960552e-04f, +1.278501217e-05f, -2.087909205e-05f, + /* 6,13 (48) */ + +2.002080800e-04f, +5.260441735e-04f, +1.029361187e-04f, -1.131709803e-03f, -1.512589682e-03f, +5.448583425e-04f, +3.366173427e-03f, +2.583901040e-03f, -2.994966997e-03f, -7.253492809e-03f, -2.542265583e-03f, +8.716531031e-03f, +1.247913589e-02f, -8.495453346e-04f, -1.941804441e-02f, -1.772175668e-02f, +1.147149350e-02f, +3.784221652e-02f, +2.025742222e-02f, -3.895743318e-02f, -7.476187885e-02f, -1.244414495e-02f, +1.495555178e-01f, +3.155720133e-01f, +3.655313285e-01f, +2.612652189e-01f, +8.152432805e-02f, -4.973833941e-02f, -6.963195122e-02f, -1.492802661e-02f, +3.333825052e-02f, +3.128635138e-02f, -1.517594326e-03f, -2.198147221e-02f, -1.347912942e-02f, +5.931344747e-03f, +1.291278795e-02f, +4.483784119e-03f, -5.528707477e-03f, -6.402740698e-03f, -5.831776656e-04f, +3.525491932e-03f, +2.488902380e-03f, -4.996562106e-04f, -1.613310604e-03f, -6.473899668e-04f, +3.900372591e-04f, +4.454322052e-04f, + -2.002080800e-04f, -7.351560092e-04f, -6.253908375e-04f, +1.373677308e-03f, +2.953273132e-03f, -1.476375854e-04f, -5.986731133e-03f, -4.895935633e-03f, +6.283852244e-03f, +1.308029212e-02f, +4.342699829e-04f, -1.922875894e-02f, -1.500842463e-02f, +1.564771096e-02f, +3.137593578e-02f, +1.905505657e-03f, -3.817046390e-02f, -2.852123204e-02f, +2.610691284e-02f, +5.043026921e-02f, +3.744022040e-03f, -5.300148322e-02f, -3.800057438e-02f, +3.135378052e-02f, +5.837650141e-02f, +4.856060301e-03f, -5.373479858e-02f, -3.699615939e-02f, +2.763172701e-02f, +4.958822867e-02f, +4.533831508e-03f, -3.980856572e-02f, -2.629806524e-02f, +1.752518407e-02f, +3.030456503e-02f, +3.093413984e-03f, -2.068456065e-02f, -1.307861100e-02f, +7.421047823e-03f, +1.237710592e-02f, +1.492174035e-03f, -6.681922327e-03f, -4.026767045e-03f, +1.666728850e-03f, +2.720240346e-03f, +4.491693191e-04f, -8.685070939e-04f, -4.454322052e-04f, + -2.490662972e-05f, -6.874909048e-06f, +5.842156927e-05f, +7.604058012e-05f, -4.235166595e-05f, -1.896169401e-04f, -1.153241184e-04f, +2.132068256e-04f, +4.046723017e-04f, +5.380827359e-05f, -5.860252003e-04f, -6.543796353e-04f, +2.546575136e-04f, +1.228555130e-03f, +8.145264851e-04f, -1.025284408e-03f, -2.216792834e-03f, -6.764722311e-04f, +2.690411489e-03f, +3.916032251e-03f, -7.894597345e-05f, -7.341573863e-03f, -1.159130080e-02f, -7.999541491e-03f, +1.633511224e-03f, +1.000661783e-02f, +1.098134138e-02f, +5.064117745e-03f, -1.731415080e-03f, -4.023065436e-03f, -1.651098036e-03f, +1.475628833e-03f, +2.076637988e-03f, +3.922656056e-04f, -1.141847450e-03f, -1.014746362e-03f, +1.053024563e-04f, +7.420094127e-04f, +4.035727706e-04f, -2.238551306e-04f, -3.919335456e-04f, -1.001118357e-04f, +1.729275679e-04f, +1.559657101e-04f, -7.734872448e-06f, -8.347375200e-05f, -3.695981836e-05f, +1.917294829e-05f, + +2.490662972e-05f, +3.628430681e-05f, -6.159451063e-05f, -1.590410464e-04f, +6.804394093e-06f, +3.469313050e-04f, +2.707510300e-04f, -4.193667154e-04f, -7.904112298e-04f, +8.655777873e-05f, +1.294235224e-03f, +8.110657220e-04f, -1.277699413e-03f, -2.019264512e-03f, +3.137999908e-04f, +2.831118909e-03f, +1.506443431e-03f, -2.462118457e-03f, -3.400567182e-03f, +6.548620144e-04f, +4.252212819e-03f, +1.957028337e-03f, -3.342259702e-03f, -4.100614958e-03f, +9.228114822e-04f, +4.638369466e-03f, +1.850276583e-03f, -3.317623958e-03f, -3.628906158e-03f, +9.243468054e-04f, +3.712407093e-03f, +1.269314706e-03f, -2.401288390e-03f, -2.324961565e-03f, +6.563535789e-04f, +2.119395490e-03f, +6.033167163e-04f, -1.210657585e-03f, -1.014108723e-03f, +3.108967826e-04f, +7.891706437e-04f, +1.749498460e-04f, -3.725425543e-04f, -2.535564812e-04f, +8.071584242e-05f, +1.458354689e-04f, +2.020393344e-05f, -1.917294829e-05f, + /* 6,14 (48) */ + +1.753014503e-04f, +5.191692644e-04f, +1.613576880e-04f, -1.055669223e-03f, -1.554941348e-03f, +3.552414023e-04f, +3.250849309e-03f, +2.797107866e-03f, -2.590294696e-03f, -7.199684535e-03f, -3.128290783e-03f, +8.062151396e-03f, +1.273379340e-02f, +3.790097958e-04f, -1.860351792e-02f, -1.874704109e-02f, +9.254700667e-03f, +3.716574429e-02f, +2.294783371e-02f, -3.504140093e-02f, -7.484082482e-02f, -1.978571881e-02f, +1.379642170e-01f, +3.075724718e-01f, +3.671648397e-01f, +2.712718367e-01f, +9.250566943e-02f, -4.467422166e-02f, -7.136336630e-02f, -1.895109204e-02f, +3.168715249e-02f, +3.276198022e-02f, +5.590436624e-04f, -2.158920660e-02f, -1.462097687e-02f, +4.916598384e-03f, +1.301809040e-02f, +5.225793532e-03f, -5.125134706e-03f, -6.626595828e-03f, -9.751112112e-04f, +3.425380097e-03f, +2.661829947e-03f, -3.436905005e-04f, -1.621045477e-03f, -7.308637188e-04f, +3.530774407e-04f, +4.646051534e-04f, + -1.753014503e-04f, -6.988717024e-04f, -6.869853482e-04f, +1.214636261e-03f, +2.960077526e-03f, +1.992937197e-04f, -5.715980103e-03f, -5.315302348e-03f, +5.493441015e-03f, +1.316684990e-02f, +1.728505206e-03f, -1.841769321e-02f, -1.628612404e-02f, +1.362844645e-02f, +3.168973577e-02f, +4.736624566e-03f, -3.666402047e-02f, -3.098335049e-02f, +2.270634566e-02f, +5.108513123e-02f, +7.996234859e-03f, -5.104445488e-02f, -4.134283408e-02f, +2.725316557e-02f, +5.929931289e-02f, +9.494429766e-03f, -5.188452200e-02f, -4.031378334e-02f, +2.400282086e-02f, +5.051257547e-02f, +8.246238601e-03f, -3.853925102e-02f, -2.869935363e-02f, +1.520022250e-02f, +3.096091860e-02f, +5.212809473e-03f, -2.008124393e-02f, -1.428926858e-02f, +6.406939100e-03f, +1.268800270e-02f, +2.281344679e-03f, -6.506972481e-03f, -4.399309599e-03f, +1.413172369e-03f, +2.800956188e-03f, +5.950047880e-04f, -8.483031605e-04f, -4.646051534e-04f, + -2.420834805e-05f, -9.822433814e-06f, +5.435485258e-05f, +7.869717760e-05f, -3.175948924e-05f, -1.845085850e-04f, -1.293202336e-04f, +1.910524798e-04f, +4.065968808e-04f, +9.122424856e-05f, -5.533162464e-04f, -6.806320721e-04f, +1.801472872e-04f, +1.196345405e-03f, +8.937550365e-04f, -9.007918871e-04f, -2.210926428e-03f, -8.556247074e-04f, +2.495011615e-03f, +3.980359535e-03f, +3.165794289e-04f, -6.903336548e-03f, -1.153277082e-02f, -8.457448808e-03f, +9.822571399e-04f, +9.663991810e-03f, +1.116513206e-02f, +5.533201255e-03f, -1.404861238e-03f, -4.043550276e-03f, -1.869018664e-03f, +1.336275342e-03f, +2.126003711e-03f, +5.195893246e-04f, -1.090519334e-03f, -1.067342593e-03f, +3.655074561e-05f, +7.331792745e-04f, +4.433395733e-04f, -1.935382675e-04f, -3.987934951e-04f, -1.229214328e-04f, +1.639344914e-04f, +1.641797458e-04f, +1.607065380e-06f, -8.312660570e-05f, -4.140964876e-05f, +1.721194565e-05f, + +2.420834805e-05f, +3.845865258e-05f, -5.291577035e-05f, -1.584475354e-04f, -1.288020430e-05f, +3.310245125e-04f, +2.970911118e-04f, -3.714402944e-04f, -8.009066393e-04f, +1.491478018e-06f, +1.251081896e-03f, +9.076298295e-04f, -1.150395214e-03f, -2.067058655e-03f, +1.122302159e-04f, +2.761034460e-03f, +1.714262142e-03f, -2.243798546e-03f, -3.509552640e-03f, +3.343157089e-04f, +4.177340741e-03f, +2.263733107e-03f, -3.077127272e-03f, -4.263636073e-03f, +5.560515546e-04f, +4.587581862e-03f, +2.178016822e-03f, -3.083415824e-03f, -3.801456149e-03f, +6.172201198e-04f, +3.697023187e-03f, +1.524831037e-03f, -2.253106908e-03f, -2.455585875e-03f, +4.722485472e-04f, +2.126892192e-03f, +7.438547548e-04f, -1.148058766e-03f, -1.081948821e-03f, +2.378849854e-04f, +7.998354702e-04f, +2.240947659e-04f, -3.582266926e-04f, -2.746236972e-04f, +6.554580609e-05f, +1.503786526e-04f, +2.797302899e-05f, -1.721194565e-05f, + /* 6,15 (48) */ + +1.510931022e-04f, +5.093468306e-04f, +2.157125405e-04f, -9.769720453e-04f, -1.586700837e-03f, +1.707328174e-04f, +3.121529075e-03f, +2.988160346e-03f, -2.183697815e-03f, -7.108460287e-03f, -3.681607029e-03f, +7.381519323e-03f, +1.291394069e-02f, +1.575355201e-03f, -1.770976289e-02f, -1.964783298e-02f, +7.043774239e-03f, +3.631011958e-02f, +2.544284532e-02f, -3.106104140e-02f, -7.452424539e-02f, -2.668905536e-02f, +1.264314461e-01f, +2.991150230e-01f, +3.681470969e-01f, +2.809358285e-01f, +1.036708015e-01f, -3.914102041e-02f, -7.276822754e-02f, -2.299464232e-02f, +2.981813382e-02f, +3.409825556e-02f, +2.685047373e-03f, -2.106961728e-02f, -1.571149621e-02f, +3.849255791e-03f, +1.305464115e-02f, +5.958972806e-03f, -4.681795133e-03f, -6.820134096e-03f, -1.373904706e-03f, +3.302458664e-03f, +2.825764439e-03f, -1.795107547e-04f, -1.619438411e-03f, -8.139903245e-04f, +3.116677919e-04f, +4.818170991e-04f, + -1.510931022e-04f, -6.604130498e-04f, -7.399011185e-04f, +1.056188726e-03f, +2.947197322e-03f, +5.303182322e-04f, -5.418888992e-03f, -5.686742643e-03f, +4.692534375e-03f, +1.316834138e-02f, +2.979587103e-03f, -1.751006338e-02f, -1.743651926e-02f, +1.156138780e-02f, +3.180196599e-02f, +7.497659026e-03f, -3.494975833e-02f, -3.322714904e-02f, +1.919679302e-02f, +5.141944693e-02f, +1.217357560e-02f, -4.878072178e-02f, -4.441996135e-02f, +2.298952949e-02f, +5.985536445e-02f, +1.408201163e-02f, -4.970650518e-02f, -4.339719917e-02f, +2.020136471e-02f, +5.112979559e-02f, +1.194326179e-02f, -3.701441998e-02f, -3.095246054e-02f, +1.274463663e-02f, +3.143316715e-02f, +7.339701665e-03f, -1.933738918e-02f, -1.543732735e-02f, +5.324990279e-03f, +1.292588768e-02f, +3.081180149e-03f, -6.282877715e-03f, -4.757536292e-03f, +1.138548671e-03f, +2.866501994e-03f, +7.453834406e-04f, -8.203301315e-04f, -4.818170991e-04f, + -2.336102954e-05f, -1.253239210e-05f, +5.014084945e-05f, +8.075517306e-05f, -2.140257552e-05f, -1.785214599e-04f, -1.421089314e-04f, +1.685272076e-04f, +4.062105010e-04f, +1.270869112e-04f, -5.184656751e-04f, -7.025179806e-04f, +1.065268205e-04f, +1.158510680e-03f, +9.663083127e-04f, -7.745420228e-04f, -2.193586529e-03f, -1.025727110e-03f, +2.292177099e-03f, +4.022753705e-03f, +6.964563701e-04f, -6.454643929e-03f, -1.144173426e-02f, -8.888315096e-03f, +3.277778787e-04f, +9.290879382e-03f, +1.131891039e-02f, +5.997321120e-03f, -1.059561482e-03f, -4.043645375e-03f, -2.083111403e-03f, +1.186136915e-03f, +2.165140336e-03f, +6.472422812e-04f, -1.031958370e-03f, -1.115389910e-03f, -3.417364024e-05f, +7.200285364e-04f, +4.817224287e-04f, -1.612392801e-04f, -4.035826075e-04f, -1.457711105e-04f, +1.536557052e-04f, +1.717221122e-04f, +1.133499855e-05f, -8.222654775e-05f, -4.581440195e-05f, +1.499733940e-05f, + +2.336102954e-05f, +4.015609728e-05f, -4.438067365e-05f, -1.567596241e-04f, -3.155727048e-05f, +3.135467573e-04f, +3.204820592e-04f, -3.226831859e-04f, -8.058829803e-04f, -8.125534378e-05f, +1.200978750e-03f, +9.962403305e-04f, -1.018351270e-03f, -2.100891351e-03f, -8.678704201e-05f, +2.674543436e-03f, +1.908679696e-03f, -2.013737730e-03f, -3.595489982e-03f, +1.409849475e-05f, +4.076700728e-03f, +2.554869886e-03f, -2.793451027e-03f, -4.399660011e-03f, +1.857454068e-04f, +4.507857853e-03f, +2.493092796e-03f, -2.828652722e-03f, -3.951088380e-03f, +3.037498356e-04f, +3.658041246e-03f, +1.773533212e-03f, -2.088618093e-03f, -2.572434168e-03f, +2.820117937e-04f, +2.120794780e-03f, +8.825186526e-04f, -1.076495704e-03f, -1.144424426e-03f, +1.611983499e-04f, +8.054712459e-04f, +2.734518864e-04f, -3.408706404e-04f, -2.946836819e-04f, +4.913805713e-05f, +1.540456612e-04f, +3.604833932e-05f, -1.499733940e-05f, + /* 7, 0 (48) */ + +0.000000000e+00f, -5.184284022e-04f, +3.212229602e-06f, +1.307536639e-03f, +8.360763470e-04f, -2.118986788e-03f, -2.852738276e-03f, +2.109164081e-03f, +6.105712658e-03f, -1.950685165e-05f, -9.834821711e-03f, -5.434403018e-03f, +1.219436233e-02f, +1.497172437e-02f, -1.025017254e-02f, -2.819089092e-02f, +4.350570367e-05f, +4.333632545e-02f, +2.439525774e-02f, -5.757751269e-02f, -7.936955118e-02f, +6.777629950e-02f, +3.088165774e-01f, +4.285159846e-01f, +3.088165774e-01f, +6.777629950e-02f, -7.936955118e-02f, -5.757751269e-02f, +2.439525774e-02f, +4.333632545e-02f, +4.350570367e-05f, -2.819089092e-02f, -1.025017254e-02f, +1.497172437e-02f, +1.219436233e-02f, -5.434403018e-03f, -9.834821711e-03f, -1.950685165e-05f, +6.105712658e-03f, +2.109164081e-03f, -2.852738276e-03f, -2.118986788e-03f, +8.360763470e-04f, +1.307536639e-03f, +3.212229602e-06f, -5.184284022e-04f, -1.234425141e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.184284022e-04f, -3.212229602e-06f, -1.888597505e-03f, -1.236145466e-03f, +3.592023527e-03f, +4.047052782e-03f, -4.982450802e-03f, -8.918259580e-03f, +4.834186303e-03f, +1.556156622e-02f, -1.810767405e-03f, -2.277524083e-02f, -4.954253986e-03f, +2.859390823e-02f, +1.529315124e-02f, -3.084300852e-02f, -2.774230592e-02f, +2.793154400e-02f, +3.977726494e-02f, -1.956380632e-02f, -4.852880250e-02f, +7.038976371e-03f, +5.173229864e-02f, +7.038976371e-03f, -4.852880250e-02f, -1.956380632e-02f, +3.977726494e-02f, +2.793154400e-02f, -2.774230592e-02f, -3.084300852e-02f, +1.529315124e-02f, +2.859390823e-02f, -4.954253986e-03f, -2.277524083e-02f, -1.810767405e-03f, +1.556156622e-02f, +4.834186303e-03f, -8.918259580e-03f, -4.982450802e-03f, +4.047052782e-03f, +3.592023527e-03f, -1.236145466e-03f, -1.888597505e-03f, +7.853369693e-05f, +5.184284022e-04f, +1.234425141e-04f, +0.000000000e+00f, + +0.000000000e+00f, +9.766062624e-06f, -7.181911347e-05f, -6.047305568e-05f, +1.229615697e-04f, +1.872149352e-04f, -1.276807758e-04f, -4.018886385e-04f, +4.093019403e-08f, +6.627019978e-04f, +3.564671675e-04f, -8.483450124e-04f, -1.005404870e-03f, +7.499465761e-04f, +1.925191887e-03f, -7.652224290e-05f, -2.959670128e-03f, -1.574929844e-03f, +3.739895539e-03f, +5.010649862e-03f, -3.168668398e-03f, -1.381200319e-02f, -1.379873723e-02f, -5.135232855e-04f, +1.328797511e-02f, +1.423518529e-02f, +3.899774043e-03f, -4.773157098e-03f, -4.036852200e-03f, +1.303312883e-03f, +3.039464840e-03f, +2.849068333e-04f, -1.900001413e-03f, -8.795212707e-04f, +9.423806704e-04f, +9.118244494e-04f, -2.937223500e-04f, -6.825130750e-04f, -4.583156740e-05f, +3.996724792e-04f, +1.541559783e-04f, -1.783731277e-04f, -1.350252974e-04f, +5.295984601e-05f, +7.600445101e-05f, -5.760175807e-06f, -2.762370518e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.766062624e-06f, +7.181911347e-05f, +1.023278982e-04f, -1.976870227e-04f, -2.974200642e-04f, +2.890575428e-04f, +6.463004974e-04f, -2.837752888e-04f, -1.144536630e-03f, +7.830175331e-05f, +1.720893812e-03f, +4.102685728e-04f, -2.237880283e-03f, -1.198305879e-03f, +2.523595232e-03f, +2.204745980e-03f, -2.428286484e-03f, -3.253878147e-03f, +1.885076851e-03f, +4.117691368e-03f, -9.485163500e-04f, -4.585739218e-03f, -2.087601736e-04f, +4.536250409e-03f, +1.343972107e-03f, -3.979342386e-03f, -2.219794955e-03f, +3.053928932e-03f, +2.678080675e-03f, -1.979513937e-03f, -2.682938861e-03f, +9.831294547e-04f, +2.318231147e-03f, -2.310718362e-04f, -1.744439505e-03f, -2.092633706e-04f, +1.136155430e-03f, +3.673118035e-04f, -6.267404753e-04f, -3.348125527e-04f, +2.796685582e-04f, +2.185893392e-04f, -9.151332350e-05f, -1.016996062e-04f, +5.760175807e-06f, +2.762370518e-05f, +0.000000000e+00f, + /* 7, 1 (48) */ + +0.000000000e+00f, -5.086623395e-04f, -6.860688387e-05f, +1.247063583e-03f, +9.590379168e-04f, -1.931771853e-03f, -2.980419051e-03f, +1.707275443e-03f, +6.105753588e-03f, +6.431951462e-04f, -9.478354543e-03f, -6.282748031e-03f, +1.118895746e-02f, +1.572167095e-02f, -8.324980651e-03f, -2.826741316e-02f, -2.916164424e-03f, +4.176139561e-02f, +2.813515328e-02f, -5.256686283e-02f, -8.253821958e-02f, +5.396429631e-02f, +2.950178402e-01f, +4.280024613e-01f, +3.221045525e-01f, +8.201148479e-02f, -7.546977714e-02f, -6.235066979e-02f, +2.035840554e-02f, +4.463963834e-02f, +3.082970544e-03f, -2.790598409e-02f, -1.215017395e-02f, +1.409220310e-02f, +1.313674300e-02f, -4.522578569e-03f, -1.012854406e-02f, -7.020199266e-04f, +6.059881091e-03f, +2.508836561e-03f, -2.698582297e-03f, -2.297359916e-03f, +7.010510496e-04f, +1.360496485e-03f, +7.921668061e-05f, -5.241885780e-04f, -1.510662193e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.086623395e-04f, +6.860688387e-05f, -1.786269607e-03f, -1.433832489e-03f, +3.294603463e-03f, +4.336110325e-03f, -4.336150304e-03f, -9.202034869e-03f, +3.689649672e-03f, +1.563986797e-02f, -8.987359339e-05f, -2.236497226e-02f, -7.192134268e-03f, +2.739560235e-02f, +1.781674647e-02f, -2.863826254e-02f, -3.017059240e-02f, +2.467766585e-02f, +4.166234180e-02f, -1.544611496e-02f, -4.947731885e-02f, +2.453237153e-03f, +5.152353847e-02f, +1.157522678e-02f, -4.718483039e-02f, -2.354314871e-02f, +3.755746999e-02f, +3.098547293e-02f, -2.506422524e-02f, -3.282252246e-02f, +1.261021237e-02f, +2.957703769e-02f, -2.636022839e-03f, -2.300631267e-02f, -3.555206910e-03f, +1.535230285e-02f, +5.970341733e-03f, -8.550947777e-03f, -5.609191277e-03f, +3.712240230e-03f, +3.871692085e-03f, -1.017556127e-03f, -1.980110829e-03f, -2.316590932e-05f, +5.241885780e-04f, +1.510662193e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.343661977e-05f, -6.725204694e-05f, -6.715287147e-05f, +1.104439513e-04f, +1.942922012e-04f, -1.011733331e-04f, -4.010419751e-04f, -4.434671800e-05f, +6.386092476e-04f, +4.148794920e-04f, -7.804055004e-04f, -1.059549598e-03f, +6.182707865e-04f, +1.935996551e-03f, +1.271031969e-04f, -2.861106379e-03f, -1.828004523e-03f, +3.426330156e-03f, +5.206317386e-03f, -2.449785430e-03f, -1.334314888e-02f, -1.425157367e-02f, -1.538308694e-03f, +1.272108488e-02f, +1.460989809e-02f, +4.639603441e-03f, -4.493920170e-03f, -4.314675244e-03f, +1.014541025e-03f, +3.099423254e-03f, +4.966642856e-04f, -1.860242573e-03f, -1.005985252e-03f, +8.707132496e-04f, +9.702479273e-04f, -2.269977574e-04f, -6.977656499e-04f, -9.271572658e-05f, +3.943097584e-04f, +1.803878146e-04f, -1.677708782e-04f, -1.465159276e-04f, +4.463969354e-05f, +7.975035777e-05f, -1.439082229e-06f, -2.863621876e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.343661977e-05f, +6.725204694e-05f, +1.116228722e-04f, -1.760565584e-04f, -3.118785642e-04f, +2.425642658e-04f, +6.597919536e-04f, -2.003800356e-04f, -1.143213222e-03f, -5.012793022e-05f, +1.683708230e-03f, +5.826009958e-04f, -2.140599143e-03f, -1.400372094e-03f, +2.345782207e-03f, +2.409356830e-03f, -2.161148111e-03f, -3.425650924e-03f, +1.537159529e-03f, +4.221775386e-03f, -5.466049358e-04f, -4.597704255e-03f, -6.245539774e-04f, +4.449587916e-03f, +1.729674275e-03f, -3.807712082e-03f, -2.538446195e-03f, +2.827239875e-03f, +2.908274395e-03f, -1.735306302e-03f, -2.822226078e-03f, +7.564539392e-04f, +2.380676125e-03f, -4.639975854e-05f, -1.753844383e-03f, -3.416912839e-04f, +1.117877985e-03f, +4.502613259e-04f, -6.010806214e-04f, -3.793884526e-04f, +2.586479351e-04f, +2.385297552e-04f, -7.920246515e-05f, -1.088454893e-04f, +1.439082229e-06f, +2.863621876e-05f, +0.000000000e+00f, + /* 7, 2 (48) */ + +0.000000000e+00f, -4.952257198e-04f, -1.358589308e-04f, +1.179910712e-03f, +1.069481868e-03f, -1.737479652e-03f, -3.081592384e-03f, +1.306233468e-03f, +6.061406870e-03f, +1.281804394e-03f, -9.063475051e-03f, -7.063153531e-03f, +1.012940786e-02f, +1.633994173e-02f, -6.388984100e-03f, -2.814030997e-02f, -5.777270803e-03f, +3.993339109e-02f, +3.156148343e-02f, -4.736054545e-02f, -8.498800501e-02f, +4.062114743e-02f, +2.807662665e-01f, +4.264641526e-01f, +3.348256374e-01f, +9.662138288e-02f, -7.083017370e-02f, -6.684458996e-02f, +1.604373029e-02f, +4.565417936e-02f, +6.182393798e-03f, -2.740931980e-02f, -1.401041652e-02f, +1.308621785e-02f, +1.400745625e-02f, -3.552330642e-03f, -1.035554182e-02f, -1.399785577e-03f, +5.967165364e-03f, +2.903146319e-03f, -2.518194483e-03f, -2.465130794e-03f, +5.545351220e-04f, +1.405136178e-03f, +1.589670384e-04f, -5.256276602e-04f, -1.797024380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.952257198e-04f, +1.358589308e-04f, -1.674646735e-03f, -1.609889047e-03f, +2.982724899e-03f, +4.578674591e-03f, -3.676358351e-03f, -9.402414905e-03f, +2.546436450e-03f, +1.558974004e-02f, +1.593834637e-03f, -2.178237126e-02f, -9.332733411e-03f, +2.599523026e-02f, +2.016252867e-02f, -2.622890571e-02f, -3.233174051e-02f, +2.125201493e-02f, +4.319950132e-02f, -1.122433957e-02f, -5.002392379e-02f, -2.144467102e-03f, +5.089898449e-02f, +1.602481470e-02f, -4.545515612e-02f, -2.735086079e-02f, +3.501902379e-02f, +3.381271281e-02f, -2.215595085e-02f, -3.455782876e-02f, +9.787986297e-03f, +3.033349163e-02f, -2.553467138e-04f, -2.305271243e-02f, -5.309051293e-03f, +1.501061156e-02f, +7.088219717e-03f, -8.100686451e-03f, -6.210271898e-03f, +3.332851777e-03f, +4.130340021e-03f, -7.790263715e-04f, -2.059313294e-03f, -1.320113986e-04f, +5.256276602e-04f, +1.797024380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.675588491e-05f, -6.236171686e-05f, -7.298096997e-05f, +9.759077119e-05f, +1.996149864e-04f, -7.483801030e-05f, -3.972370981e-04f, -8.704165206e-05f, +6.105359519e-04f, +4.686481720e-04f, -7.086191726e-04f, -1.104649127e-03f, +4.854938715e-04f, +1.932695959e-03f, +3.246504017e-04f, -2.744943539e-03f, -2.061309057e-03f, +3.098718631e-03f, +5.360321239e-03f, -1.746493787e-03f, -1.283161796e-02f, -1.464498729e-02f, -2.556322706e-03f, +1.210015645e-02f, +1.493356050e-02f, +5.384545525e-03f, -4.173266846e-03f, -4.570894266e-03f, +7.101556934e-04f, +3.138590688e-03f, +7.103494024e-04f, -1.805834501e-03f, -1.128326476e-03f, +7.907093813e-04f, +1.023041899e-03f, -1.566860867e-04f, -7.082100232e-04f, -1.403660523e-04f, +3.857389280e-04f, +2.061598898e-04f, -1.554269116e-04f, -1.573143649e-04f, +3.554727186e-05f, +8.300046623e-05f, +3.172941354e-06f, -2.940939777e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.675588491e-05f, +6.236171686e-05f, +1.193909001e-04f, -1.539281953e-04f, -3.230510926e-04f, +1.957644976e-04f, +6.672984590e-04f, -1.178320026e-04f, -1.132455450e-03f, -1.750068552e-04f, +1.633489118e-03f, +7.467647766e-04f, -2.027489676e-03f, -1.587851634e-03f, +2.151220976e-03f, +2.591892616e-03f, -1.879045199e-03f, -3.568057956e-03f, +1.179002679e-03f, +4.290901969e-03f, -1.415792325e-04f, -4.572109842e-03f, -1.035182771e-03f, +4.326413757e-03f, +2.102396482e-03f, -3.604068283e-03f, -2.838279978e-03f, +2.575484564e-03f, +3.116755210e-03f, -1.473948446e-03f, -2.940019494e-03f, +5.200131665e-04f, +2.424376583e-03f, +1.422846034e-04f, -1.748719610e-03f, -4.744814268e-04f, +1.089595050e-03f, +5.318792988e-04f, -5.693439858e-04f, -4.223391725e-04f, +2.344139914e-04f, +2.572731998e-04f, -6.543514523e-05f, -1.153866087e-04f, -3.172941354e-06f, +2.940939777e-05f, +0.000000000e+00f, + /* 7, 3 (48) */ + +0.000000000e+00f, -4.784698349e-04f, -1.982206477e-04f, +1.106929742e-03f, +1.167072639e-03f, -1.537864666e-03f, -3.156430395e-03f, +9.089963697e-04f, +5.974365218e-03f, +1.892340346e-03f, -8.594826879e-03f, -7.771772704e-03f, +9.024758730e-03f, +1.682543560e-02f, -4.456288141e-03f, -2.781565957e-02f, -8.522214343e-03f, +3.787208203e-02f, +3.466020206e-02f, -4.200022421e-02f, -8.673449879e-02f, +2.778952947e-02f, +2.661212792e-01f, +4.239078299e-01f, +3.469257938e-01f, +1.115549434e-01f, -6.544562817e-02f, -7.101785681e-02f, +1.147283603e-02f, +4.636433506e-02f, +9.320984485e-03f, -2.669897040e-02f, -1.581625102e-02f, +1.195789137e-02f, +1.479816563e-02f, -2.529288742e-03f, -1.051222790e-02f, -2.107995600e-03f, +5.826799312e-03f, +3.288885247e-03f, -2.312034593e-03f, -2.620557706e-03f, +3.972207571e-04f, +1.440683450e-03f, +2.419675046e-04f, -5.224547188e-04f, -2.091118358e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.784698349e-04f, +1.982206477e-04f, -1.555255835e-03f, -1.763817242e-03f, +2.659673806e-03f, +4.774439089e-03f, -3.009059891e-03f, -9.520246907e-03f, +1.413981001e-03f, +1.541473318e-02f, +3.227323755e-03f, -2.103560649e-02f, -1.136022309e-02f, +2.440737863e-02f, +2.231374965e-02f, -2.363701309e-02f, -3.421078571e-02f, +1.768395697e-02f, +4.437850400e-02f, -6.933437601e-03f, -5.016550302e-02f, -6.716576944e-03f, +4.986380172e-02f, +2.035122845e-02f, -4.335275964e-02f, -3.095492907e-02f, +3.218074382e-02f, +3.638819737e-02f, -1.903919564e-02f, -3.603177721e-02f, +6.847966803e-03f, +3.085350479e-02f, +2.169029869e-03f, -2.291042782e-02f, -7.057770904e-03f, +1.453613013e-02f, +8.177814767e-03f, -7.568807152e-03f, -6.779615884e-03f, +2.910512605e-03f, +4.364754012e-03f, -5.217531717e-04f, -2.124748439e-03f, -2.473980074e-04f, +5.224547188e-04f, +2.091118358e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.971202353e-05f, -5.720679688e-05f, -7.794699392e-05f, +8.451853313e-05f, +2.032069447e-04f, -4.887100603e-05f, -3.905980408e-04f, -1.277755383e-04f, +5.788045953e-04f, +5.175048575e-04f, -6.336116937e-04f, -1.140607739e-03f, +3.525991669e-04f, +1.915664365e-03f, +5.148751356e-04f, -2.612443858e-03f, -2.273779436e-03f, +2.759644501e-03f, +5.473060168e-03f, -1.062014672e-03f, -1.228058610e-02f, -1.497778787e-02f, -3.563091276e-03f, +1.142756215e-02f, +1.520382378e-02f, +6.130896128e-03f, -3.811774186e-03f, -4.803110104e-03f, +3.918457334e-04f, +3.156134378e-03f, +9.244669781e-04f, -1.736801056e-03f, -1.245537879e-03f, +7.027458309e-04f, +1.069660072e-03f, -8.321807681e-05f, -7.136263213e-04f, -1.884393493e-04f, +3.739218118e-04f, +2.312521275e-04f, -1.413749376e-04f, -1.673026491e-04f, +2.572550181e-05f, +8.570032428e-05f, +8.047512082e-06f, -2.991934502e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.971202353e-05f, +5.720679688e-05f, +1.256399360e-04f, -1.315266148e-04f, -3.309743637e-04f, +1.490773181e-04f, +6.689535921e-04f, -3.680922803e-05f, -1.112607779e-03f, -2.953707904e-04f, +1.570940809e-03f, +9.015498578e-04f, -1.899768601e-03f, -1.759413283e-03f, +1.941750497e-03f, +2.751101370e-03f, -1.584459375e-03f, -3.680165329e-03f, +8.136323987e-04f, +4.324674288e-03f, +2.632043609e-04f, -4.509234495e-03f, -1.437251817e-03f, +4.167696725e-03f, +2.459011507e-03f, -3.369953529e-03f, -3.116686908e-03f, +2.300561152e-03f, +3.301574000e-03f, -1.197431855e-03f, -3.035045686e-03f, +2.756505008e-04f, +2.448640478e-03f, +3.334555235e-04f, -1.728794241e-03f, -6.065002292e-04f, +1.051282896e-03f, +6.114111721e-04f, -5.316094506e-04f, -4.632174361e-04f, +2.070551399e-04f, +2.745855725e-04f, -5.026807306e-05f, -1.212155758e-04f, -8.047512082e-06f, +2.991934502e-05f, +0.000000000e+00f, + /* 7, 4 (48) */ + +0.000000000e+00f, -4.587578113e-04f, -2.554274445e-04f, +1.028982748e-03f, +1.251591172e-03f, -1.334657721e-03f, -3.205301401e-03f, +5.183983289e-04f, +5.846589680e-03f, +2.471144941e-03f, -8.077322022e-03f, -8.405384397e-03f, +7.884150992e-03f, +1.717803477e-02f, -2.540623776e-03f, -2.730078443e-02f, -1.113465820e-02f, +3.559830260e-02f, +3.741984656e-02f, -3.652716404e-02f, -8.779651347e-02f, +1.550894337e-02f, +2.511434913e-01f, +4.203447386e-01f, +3.583533560e-01f, +1.267587672e-01f, -5.931473204e-02f, -7.482963099e-02f, +6.669725923e-03f, +4.675618079e-02f, +1.247711886e-02f, -2.577450342e-02f, -1.755305208e-02f, +1.071235349e-02f, +1.550091146e-02f, -1.459628670e-03f, -1.059544598e-02f, -2.821621921e-03f, +5.638359962e-03f, +3.662807059e-03f, -2.080782465e-03f, -2.761932644e-03f, +2.299181080e-04f, +1.466408952e-03f, +3.276678289e-04f, -5.144072068e-04f, -2.390311808e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.587578113e-04f, +2.554274445e-04f, -1.429615899e-03f, -1.895343857e-03f, +2.328699442e-03f, +4.923516407e-03f, -2.340106299e-03f, -9.557056136e-03f, +3.013732217e-04f, +1.511936239e-02f, +4.798264564e-03f, -2.013405663e-02f, -1.325999169e-02f, +2.264796534e-02f, +2.425550015e-02f, -2.088591172e-02f, -3.579524509e-02f, +1.400379164e-02f, +4.519213640e-02f, -2.608763314e-03f, -4.990229866e-02f, -1.122581144e-02f, +4.842654990e-02f, +2.451892518e-02f, -4.089374813e-02f, -3.432488260e-02f, +2.906405691e-02f, +3.868875852e-02f, -1.573762164e-02f, -3.722920906e-02f, +3.812921116e-03f, +3.112915529e-02f, +4.617670347e-03f, -2.257697230e-02f, -8.786565145e-03f, +1.392962991e-02f, +9.229097663e-03f, -6.957395980e-03f, -7.311225335e-03f, +2.447295169e-03f, +4.571809152e-03f, -2.471675992e-04f, -2.175016512e-03f, -3.686135832e-04f, +5.144072068e-04f, +2.390311808e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.229725832e-05f, -5.184563309e-05f, -8.204832773e-05f, +7.134101637e-05f, +2.051046652e-04f, -2.345906927e-05f, -3.812667058e-04f, -1.663028728e-04f, +5.437559948e-04f, +5.612248810e-04f, -5.560161944e-04f, -1.167398706e-03f, +2.205466708e-04f, +1.885364845e-03f, +6.966149643e-04f, -2.464951107e-03f, -2.464518670e-03f, +2.411695707e-03f, +5.545163282e-03f, -3.994057809e-04f, -1.169338969e-02f, -1.524909670e-02f, -4.554200443e-03f, +1.070594523e-02f, +1.541858668e-02f, +6.874877781e-03f, -3.410269646e-03f, -5.009011453e-03f, +6.143968142e-05f, +3.151352185e-03f, +1.137481256e-03f, -1.653273170e-03f, -1.356624929e-03f, +6.072682878e-04f, +1.109588240e-03f, -7.060227675e-06f, -7.138270327e-04f, -2.365788148e-04f, +3.588446341e-04f, +2.554424378e-04f, -1.256638951e-04f, -1.763650054e-04f, +1.522550372e-05f, +8.779798166e-05f, +1.315223083e-05f, -3.014369114e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.229725832e-05f, +5.184563309e-05f, +1.303924354e-04f, -1.090690042e-04f, -3.357132912e-04f, +1.029057219e-04f, +6.649381238e-04f, +4.204338890e-05f, -1.084083954e-03f, -4.103172188e-04f, +1.496857454e-03f, +1.045849078e-03f, -1.758755042e-03f, -1.913880253e-03f, +1.719310276e-03f, +2.885941360e-03f, -1.279952204e-03f, -3.761300367e-03f, +4.441151534e-04f, +4.322993071e-03f, +6.644028583e-04f, -4.409668015e-03f, -1.827438844e-03f, +3.974704598e-03f, +2.796518107e-03f, -3.107173204e-03f, -3.371221869e-03f, +2.004577893e-03f, +3.460963170e-03f, -9.078988784e-04f, -3.106208297e-03f, +2.530449539e-05f, +2.452930830e-03f, +5.255367885e-04f, -1.693920083e-03f, -7.365940119e-04f, +1.003005735e-03f, +6.880989818e-04f, -4.880127681e-04f, -5.015789302e-04f, +1.766928219e-04f, +2.902361166e-04f, -3.377506652e-05f, -1.262264773e-04f, -1.315223083e-05f, +3.014369114e-05f, +0.000000000e+00f, + /* 7, 5 (48) */ + +0.000000000e+00f, -4.364605530e-04f, -3.072730776e-04f, +9.469344199e-04f, +1.322932189e-03f, -1.129553056e-03f, -3.228760470e-03f, +1.371316231e-04f, +5.680286807e-03f, +3.014900936e-03f, -7.516097141e-03f, -8.961400592e-03f, +6.716752286e-03f, +1.739858144e-02f, -6.552589311e-04f, -2.660416947e-02f, -1.359960931e-02f, +3.313378393e-02f, +3.983154227e-02f, -3.098200076e-02f, -8.819591925e-02f, +3.815553680e-03f, +2.358943946e-01f, +4.157905382e-01f, +3.690593012e-01f, +1.421773538e-01f, -5.243985426e-02f, -7.823990064e-02f, +1.660714471e-03f, +4.681762047e-02f, +1.562847105e-02f, -2.463702217e-02f, -1.920632525e-02f, +9.355728563e-03f, +1.610817975e-02f, -3.500404306e-04f, -1.060250621e-02f, -3.535448954e-03f, +5.401781148e-03f, +4.021651693e-03f, -1.825340028e-03f, -2.887596539e-03f, +5.355310260e-05f, +1.481634456e-03f, +4.154658105e-04f, -5.012549759e-04f, -2.691748720e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.364605530e-04f, +3.072730776e-04f, -1.299223464e-03f, -2.004412861e-03f, +1.992986151e-03f, +5.026422129e-03f, -1.675168176e-03f, -9.515012747e-03f, -7.827107325e-04f, +1.470904517e-02f, +6.295122018e-03f, -1.908820755e-02f, -1.501874673e-02f, +2.073408509e-02f, +2.597481042e-02f, -1.799997036e-02f, -3.707519729e-02f, +1.024249128e-02f, +4.563625156e-02f, +1.714229757e-03f, -4.923789580e-02f, -1.563547945e-02f, +4.659911106e-02f, +2.849362978e-02f, -3.809723002e-02f, -3.743205581e-02f, +2.569283504e-02f, +4.069333641e-02f, -1.227665847e-02f, -3.813710794e-02f, +7.067128194e-04f, +3.115445979e-02f, +7.070601177e-03f, -2.205143551e-02f, -1.048048523e-02f, +1.319303589e-02f, +1.023210340e-02f, -6.269296998e-03f, -7.799238103e-03f, +1.945716238e-03f, +4.748501974e-03f, +4.306851739e-05f, -2.208791579e-03f, -4.948400605e-04f, +5.012549759e-04f, +2.691748720e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.450776296e-05f, -4.633573213e-05f, -8.528981405e-05f, +5.816843057e-05f, +2.053569289e-04f, +1.221672470e-06f, -3.694012142e-04f, -2.024022021e-04f, +5.057462146e-04f, +5.996277874e-04f, -4.764683979e-04f, -1.185062795e-03f, +9.026666474e-05f, +1.842343909e-03f, +8.687954834e-04f, -2.303879485e-03f, -2.632798804e-03f, +2.057448314e-03f, +5.577481931e-03f, +2.384536114e-04f, -1.107350569e-02f, -1.545834947e-02f, -5.525319863e-03f, +9.938206779e-03f, +1.557600927e-02f, +7.612660200e-03f, -2.969830662e-03f, -5.186391212e-03f, -2.791030453e-04f, +3.123680586e-03f, +1.347825884e-03f, -1.555490471e-03f, -1.460613257e-03f, +5.047897562e-04f, +1.142348993e-03f, +7.128781453e-05f, -7.086593613e-04f, -2.844164418e-04f, +3.405188824e-04f, +2.785084545e-04f, -1.083580776e-04f, -1.843889131e-04f, +4.106474726e-06f, +8.924457674e-05f, +1.845081486e-05f, -3.006190168e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.450776296e-05f, +4.633573213e-05f, +1.336844431e-04f, -8.676328082e-05f, -3.373592935e-04f, +5.763349266e-05f, +6.554768997e-04f, +1.181188622e-04f, -1.047361566e-03f, -5.190117488e-04f, +1.412114242e-03f, +1.178665739e-03f, -1.605857472e-03f, -2.050237899e-03f, +1.485922522e-03f, +2.995587507e-03f, -9.681426814e-04f, -3.811055189e-03f, +7.353155228e-05f, +4.286055964e-03f, +1.058714921e-03f, -4.274305924e-03f, -2.202522148e-03f, +3.748993771e-03f, +3.112066827e-03f, -2.817781351e-03f, -3.599625827e-03f, +1.689836756e-03f, +3.593353469e-03f, -6.076260051e-04f, -3.152599747e-03f, -2.290064906e-04f, +2.436872970e-03f, +7.169145526e-04f, -1.644075557e-03f, -8.635987773e-04f, +9.449173978e-04f, +7.611881432e-04f, -4.387470956e-04f, -5.369865850e-04f, +1.434816127e-04f, +3.039998545e-04f, -1.604710306e-05f, -1.303161153e-04f, -1.845081486e-05f, +3.006190168e-05f, +0.000000000e+00f, + /* 7, 6 (48) */ + +0.000000000e+00f, -4.119527900e-04f, -3.536088098e-04f, +8.616446058e-04f, +1.381100619e-03f, -9.241961269e-04f, -3.227538798e-03f, -2.322695911e-04f, +5.477884605e-03f, +3.520647150e-03f, -6.916469353e-03f, -9.437868990e-03f, +5.531689491e-03f, +1.748884811e-02f, +1.187084978e-03f, -2.573537398e-02f, -1.590348879e-02f, +3.050098512e-02f, +4.188899058e-02f, -2.540451883e-02f, -8.795746564e-02f, -7.257952015e-03f, +2.204360452e-01f, +4.102652183e-01f, +3.789975080e-01f, +1.577533631e-01f, -4.482719406e-02f, -8.120973130e-02f, -3.525676742e-03f, +4.653851743e-02f, +1.875215164e-02f, -2.328919628e-02f, -2.076181572e-02f, +7.895115306e-03f, +1.661296950e-02f, +7.923085621e-04f, -1.053121839e-02f, -4.244108315e-03f, +5.117364706e-03f, +4.362170575e-03f, -1.546831573e-03f, -2.995954616e-03f, -1.308358105e-04f, +1.485740930e-03f, +5.047103873e-04f, -4.828041611e-04f, -2.992367736e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.119527900e-04f, +3.536088098e-04f, -1.165539020e-03f, -2.091176142e-03f, +1.655626858e-03f, +5.084055621e-03f, -1.019691276e-03f, -9.396893884e-03f, -1.830072298e-03f, +1.419003343e-02f, +7.707236260e-03f, -1.790954181e-02f, -1.662460420e-02f, +1.868384719e-02f, +2.746073294e-02f, -1.500438286e-02f, -3.804333997e-02f, +6.431436087e-03f, +4.570978311e-02f, +6.000285721e-03f, -4.817918088e-02f, -1.990978538e-02f, +4.439658891e-02f, +3.224262355e-02f, -3.498516320e-02f, -4.024983716e-02f, +2.209320921e-02f, +4.238317317e-02f, -8.683305000e-03f, -3.874473394e-02f, -2.445886927e-03f, +3.092545330e-02f, +9.507474147e-03f, -2.133452096e-02f, -1.212456078e-02f, +1.232943712e-02f, +1.117702080e-02f, -5.508108855e-03f, -8.237985198e-03f, +1.408729653e-03f, +4.891983586e-03f, +3.470683719e-04f, -2.224838682e-03f, -6.251561758e-04f, +4.828041611e-04f, +2.992367736e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.634352250e-05f, -4.073327675e-05f, -8.768341605e-05f, +4.510663056e-05f, +2.040238912e-04f, +2.500676342e-05f, -3.551741776e-04f, -2.358771244e-04f, +4.651434485e-04f, +6.325775162e-04f, -3.956018474e-04f, -1.193706305e-03f, -3.734630268e-05f, +1.787225627e-03f, +1.030435793e-03f, -2.130702271e-03f, -2.778061776e-03f, +1.699450608e-03f, +5.571080366e-03f, +8.488763033e-04f, -1.042453100e-02f, -1.560529730e-02f, -6.472225843e-03f, +9.127491098e-03f, +1.567452535e-02f, +8.340381297e-03f, -2.491782711e-03f, -5.333162472e-03f, -6.277020005e-04f, +3.072701901e-03f, +1.553914313e-03f, -1.443802159e-03f, -1.556556319e-03f, +3.958884027e-04f, +1.167506265e-03f, +1.512961948e-04f, -6.980073717e-04f, -3.315755797e-04f, +3.189819924e-04f, +3.002293292e-04f, -8.953713388e-05f, -1.912661842e-04f, -7.564510283e-06f, +8.999491795e-05f, +2.390327373e-05f, -2.965557857e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.634352250e-05f, +4.073327675e-05f, +1.355645836e-04f, -6.480648075e-05f, -3.360284079e-04f, +1.362236142e-05f, +6.408354129e-04f, +1.908524170e-04f, -1.002976181e-03f, -6.206937747e-04f, +1.317658095e-03f, +1.299120064e-03f, -1.442560106e-03f, -2.167639909e-03f, +1.243673803e-03f, +3.079435871e-03f, -6.516844366e-04f, -3.829287972e-03f, -2.950498220e-04f, +4.214354349e-03f, +1.442908639e-03f, -4.104341299e-03f, -2.559407831e-03f, +3.492396405e-03f, +3.402984597e-03f, -2.504064289e-03f, -3.799846157e-03f, +1.358815244e-03f, +3.697389241e-03f, -2.990057852e-04f, -3.173511451e-03f, -4.852005956e-04f, +2.400260476e-03f, +9.059507605e-04f, -1.579368513e-03f, -9.863503137e-04f, +8.772622431e-04f, +8.299343997e-04f, -3.840630086e-04f, -5.690149289e-04f, +1.076090043e-04f, +3.156600646e-04f, +2.807807247e-06f, -1.333852764e-04f, -2.390327373e-05f, +2.965557857e-05f, +0.000000000e+00f, + /* 7, 7 (48) */ + +0.000000000e+00f, -3.856092675e-04f, -3.943420865e-04f, +7.739611898e-04f, +1.426207250e-03f, -7.201722357e-04f, -3.202532034e-03f, -5.874437687e-04f, +5.242007481e-03f, +3.985790599e-03f, -6.283891837e-03f, -9.833470837e-03f, +4.337983186e-03f, +1.745150180e-02f, +2.974310605e-03f, -2.470493819e-02f, -1.803419106e-02f, +2.772292335e-02f, +4.358844119e-02f, -1.983343846e-02f, -8.710858933e-02f, -1.768248302e-02f, +2.048307479e-01f, +4.037929925e-01f, +3.881249991e-01f, +1.734278885e-01f, -3.648681276e-02f, -8.370151401e-02f, -8.858839214e-03f, +4.591081542e-02f, +2.182485354e-02f, -2.173528197e-02f, -2.220561788e-02f, +6.338558987e-03f, +1.700885791e-02f, +1.959814827e-03f, -1.037992220e-02f, -4.942115687e-03f, +4.785789126e-03f, +4.681152568e-03f, -1.246602244e-03f, -3.085491750e-03f, -3.221019947e-04f, +1.478176420e-03f, +5.947053052e-04f, -4.589008873e-04f, -3.288923522e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.856092675e-04f, +3.943420865e-04f, -1.029974437e-03f, -2.155982623e-03f, +1.319598450e-03f, +5.097677983e-03f, -3.788558631e-04f, -9.206041467e-03f, -2.833048479e-03f, +1.356933965e-02f, +9.024894355e-03f, -1.661042175e-02f, -1.806716431e-02f, +1.651620728e-02f, +2.870440675e-02f, -1.192494699e-02f, -3.869502441e-02f, +2.602148116e-03f, +4.541473329e-02f, +1.021464007e-02f, -4.673627224e-02f, -2.401412668e-02f, +4.183718108e-02f, +3.573501995e-02f, -3.158217860e-02f, -4.275390145e-02f, +1.829336305e-02f, +4.374198841e-02f, -4.985915759e-03f, -3.904373973e-02f, -5.619398378e-03f, +3.044025270e-02f, +1.190773462e-02f, -2.042857020e-02f, -1.370392930e-02f, +1.134308680e-02f, +1.205428304e-02f, -4.678174456e-03f, -8.622048207e-03f, +8.397147245e-04f, +4.999592591e-03f, +6.627284365e-04f, -2.222030875e-03f, -7.585414522e-04f, +4.589008873e-04f, +3.288923522e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.780816287e-05f, -3.509267250e-05f, -8.924783014e-05f, +3.225639524e-05f, +2.011761977e-04f, +4.774434328e-05f, -3.387709059e-04f, -2.665570676e-04f, +4.223248927e-04f, +6.599822455e-04f, -3.140432681e-04f, -1.193498675e-03f, -1.614390333e-04f, +1.720705346e-03f, +1.180653198e-03f, -1.946940336e-03f, -2.899919139e-03f, +1.340207678e-03f, +5.527225233e-03f, +1.429379508e-03f, -9.750161122e-03f, -1.569000598e-02f, -7.390823752e-03f, +8.277169662e-03f, +1.571285342e-02f, +9.054168626e-03f, -1.977695812e-03f, -5.447374015e-03f, -9.821665543e-04f, +2.998150671e-03f, +1.754150570e-03f, -1.318667112e-03f, -1.643543036e-03f, +2.812048656e-04f, +1.184669683e-03f, +2.324080947e-04f, -6.817939050e-04f, -3.776736345e-04f, +2.942978454e-04f, +3.203875692e-04f, -6.929594067e-05f, -1.968940433e-04f, -1.971277493e-05f, +9.000805441e-05f, +2.946612832e-05f, -2.890875247e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.780816287e-05f, +3.509267250e-05f, +1.360929656e-04f, -4.338331920e-05f, -3.318592401e-04f, -2.879053179e-05f, +6.213161109e-04f, +2.597252849e-04f, -9.515151096e-04f, -7.146813517e-04f, +1.214497919e-03f, +1.406454515e-03f, -1.270408862e-03f, -2.265412945e-03f, +9.946964071e-04f, +3.137106184e-03f, -3.332428752e-04f, -3.816121917e-03f, -6.585983085e-04f, +4.108667669e-03f, +1.813848623e-03f, -3.901254063e-03f, -2.895155927e-03f, +3.207005202e-03f, +3.666797860e-03f, -2.168522171e-03f, -3.970055315e-03f, +1.014146564e-03f, +3.771941957e-03f, +1.547244324e-05f, -3.168442424e-03f, -7.411495481e-04f, +2.343059715e-03f, +1.090997027e-03f, -1.500037935e-03f, -1.103694528e-03f, +8.003752606e-04f, +8.936108672e-04f, -3.242679756e-04f, -5.972544766e-04f, +6.929486011e-05f, +3.250107733e-04f, +2.266493267e-05f, -1.353400191e-04f, -2.946612832e-05f, +2.890875247e-05f, +0.000000000e+00f, + /* 7, 8 (48) */ + +0.000000000e+00f, -3.578011047e-04f, -4.294347590e-04f, +6.847133596e-04f, +1.458463645e-03f, -5.189960380e-04f, -3.154787691e-03f, -9.262146746e-04f, +4.975450413e-03f, +4.408115492e-03f, -5.623909592e-03f, -1.014751411e-02f, +3.144484510e-03f, +1.729006277e-02f, +4.695015951e-03f, -2.352428499e-02f, -1.998113140e-02f, +2.482300421e-02f, +4.492864887e-02f, -1.430621323e-02f, -8.567920983e-02f, -2.743264414e-02f, +1.891407419e-01f, +3.964021687e-01f, +3.964021687e-01f, +1.891407419e-01f, -2.743264414e-02f, -8.567920983e-02f, -1.430621323e-02f, +4.492864887e-02f, +2.482300421e-02f, -1.998113140e-02f, -2.352428499e-02f, +4.695015951e-03f, +1.729006277e-02f, +3.144484510e-03f, -1.014751411e-02f, -5.623909592e-03f, +4.408115492e-03f, +4.975450413e-03f, -9.262146746e-04f, -3.154787691e-03f, -5.189960380e-04f, +1.458463645e-03f, +6.847133596e-04f, -4.294347590e-04f, -3.578011047e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.578011047e-04f, +4.294347590e-04f, -8.938814713e-04f, -2.199365942e-03f, +9.877392098e-04f, +5.068887451e-03f, +2.424602479e-04f, -8.946316183e-03f, -3.784563588e-03f, +1.285465830e-02f, +1.023939227e-02f, -1.520396723e-02f, -1.933757317e-02f, +1.425079434e-02f, +2.969910316e-02f, -8.787840802e-03f, -3.902826729e-02f, -1.213973801e-03f, +4.475613498e-02f, +1.432330774e-02f, -4.492242362e-02f, -2.791538074e-02f, +3.894202515e-02f, +3.894202515e-02f, -2.791538074e-02f, -4.492242362e-02f, +1.432330774e-02f, +4.475613498e-02f, -1.213973801e-03f, -3.902826729e-02f, -8.787840802e-03f, +2.969910316e-02f, +1.425079434e-02f, -1.933757317e-02f, -1.520396723e-02f, +1.023939227e-02f, +1.285465830e-02f, -3.784563588e-03f, -8.946316183e-03f, +2.424602479e-04f, +5.068887451e-03f, +9.877392098e-04f, -2.199365942e-03f, -8.938814713e-04f, +4.294347590e-04f, +3.578011047e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.890875247e-05f, -2.946612832e-05f, -9.000805441e-05f, +1.971277493e-05f, +1.968940433e-04f, +6.929594067e-05f, -3.203875692e-04f, -2.942978454e-04f, +3.776736345e-04f, +6.817939050e-04f, -2.324080947e-04f, -1.184669683e-03f, -2.812048656e-04f, +1.643543036e-03f, +1.318667112e-03f, -1.754150570e-03f, -2.998150671e-03f, +9.821665543e-04f, +5.447374015e-03f, +1.977695812e-03f, -9.054168626e-03f, -1.571285342e-02f, -8.277169662e-03f, +7.390823752e-03f, +1.569000598e-02f, +9.750161122e-03f, -1.429379508e-03f, -5.527225233e-03f, -1.340207678e-03f, +2.899919139e-03f, +1.946940336e-03f, -1.180653198e-03f, -1.720705346e-03f, +1.614390333e-04f, +1.193498675e-03f, +3.140432681e-04f, -6.599822455e-04f, -4.223248927e-04f, +2.665570676e-04f, +3.387709059e-04f, -4.774434328e-05f, -2.011761977e-04f, -3.225639524e-05f, +8.924783014e-05f, +3.509267250e-05f, -2.780816287e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.890875247e-05f, +2.946612832e-05f, +1.353400191e-04f, -2.266493267e-05f, -3.250107733e-04f, -6.929486011e-05f, +5.972544766e-04f, +3.242679756e-04f, -8.936108672e-04f, -8.003752606e-04f, +1.103694528e-03f, +1.500037935e-03f, -1.090997027e-03f, -2.343059715e-03f, +7.411495481e-04f, +3.168442424e-03f, -1.547244324e-05f, -3.771941957e-03f, -1.014146564e-03f, +3.970055315e-03f, +2.168522171e-03f, -3.666797860e-03f, -3.207005202e-03f, +2.895155927e-03f, +3.901254063e-03f, -1.813848623e-03f, -4.108667669e-03f, +6.585983085e-04f, +3.816121917e-03f, +3.332428752e-04f, -3.137106184e-03f, -9.946964071e-04f, +2.265412945e-03f, +1.270408862e-03f, -1.406454515e-03f, -1.214497919e-03f, +7.146813517e-04f, +9.515151096e-04f, -2.597252849e-04f, -6.213161109e-04f, +2.879053179e-05f, +3.318592401e-04f, +4.338331920e-05f, -1.360929656e-04f, -3.509267250e-05f, +2.780816287e-05f, +0.000000000e+00f, + /* 7, 9 (48) */ + +0.000000000e+00f, -3.288923522e-04f, -4.589008873e-04f, +5.947053052e-04f, +1.478176420e-03f, -3.221019947e-04f, -3.085491750e-03f, -1.246602244e-03f, +4.681152568e-03f, +4.785789126e-03f, -4.942115687e-03f, -1.037992220e-02f, +1.959814827e-03f, +1.700885791e-02f, +6.338558987e-03f, -2.220561788e-02f, -2.173528197e-02f, +2.182485354e-02f, +4.591081542e-02f, -8.858839214e-03f, -8.370151401e-02f, -3.648681276e-02f, +1.734278885e-01f, +3.881249991e-01f, +4.037929925e-01f, +2.048307479e-01f, -1.768248302e-02f, -8.710858933e-02f, -1.983343846e-02f, +4.358844119e-02f, +2.772292335e-02f, -1.803419106e-02f, -2.470493819e-02f, +2.974310605e-03f, +1.745150180e-02f, +4.337983186e-03f, -9.833470837e-03f, -6.283891837e-03f, +3.985790599e-03f, +5.242007481e-03f, -5.874437687e-04f, -3.202532034e-03f, -7.201722357e-04f, +1.426207250e-03f, +7.739611898e-04f, -3.943420865e-04f, -3.856092675e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.288923522e-04f, +4.589008873e-04f, -7.585414522e-04f, -2.222030875e-03f, +6.627284365e-04f, +4.999592591e-03f, +8.397147245e-04f, -8.622048207e-03f, -4.678174456e-03f, +1.205428304e-02f, +1.134308680e-02f, -1.370392930e-02f, -2.042857020e-02f, +1.190773462e-02f, +3.044025270e-02f, -5.619398378e-03f, -3.904373973e-02f, -4.985915759e-03f, +4.374198841e-02f, +1.829336305e-02f, -4.275390145e-02f, -3.158217860e-02f, +3.573501995e-02f, +4.183718108e-02f, -2.401412668e-02f, -4.673627224e-02f, +1.021464007e-02f, +4.541473329e-02f, +2.602148116e-03f, -3.869502441e-02f, -1.192494699e-02f, +2.870440675e-02f, +1.651620728e-02f, -1.806716431e-02f, -1.661042175e-02f, +9.024894355e-03f, +1.356933965e-02f, -2.833048479e-03f, -9.206041467e-03f, -3.788558631e-04f, +5.097677983e-03f, +1.319598450e-03f, -2.155982623e-03f, -1.029974437e-03f, +3.943420865e-04f, +3.856092675e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.965557857e-05f, -2.390327373e-05f, -8.999491795e-05f, +7.564510283e-06f, +1.912661842e-04f, +8.953713388e-05f, -3.002293292e-04f, -3.189819924e-04f, +3.315755797e-04f, +6.980073717e-04f, -1.512961948e-04f, -1.167506265e-03f, -3.958884027e-04f, +1.556556319e-03f, +1.443802159e-03f, -1.553914313e-03f, -3.072701901e-03f, +6.277020005e-04f, +5.333162472e-03f, +2.491782711e-03f, -8.340381297e-03f, -1.567452535e-02f, -9.127491098e-03f, +6.472225843e-03f, +1.560529730e-02f, +1.042453100e-02f, -8.488763033e-04f, -5.571080366e-03f, -1.699450608e-03f, +2.778061776e-03f, +2.130702271e-03f, -1.030435793e-03f, -1.787225627e-03f, +3.734630268e-05f, +1.193706305e-03f, +3.956018474e-04f, -6.325775162e-04f, -4.651434485e-04f, +2.358771244e-04f, +3.551741776e-04f, -2.500676342e-05f, -2.040238912e-04f, -4.510663056e-05f, +8.768341605e-05f, +4.073327675e-05f, -2.634352250e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.965557857e-05f, +2.390327373e-05f, +1.333852764e-04f, -2.807807247e-06f, -3.156600646e-04f, -1.076090043e-04f, +5.690149289e-04f, +3.840630086e-04f, -8.299343997e-04f, -8.772622431e-04f, +9.863503137e-04f, +1.579368513e-03f, -9.059507605e-04f, -2.400260476e-03f, +4.852005956e-04f, +3.173511451e-03f, +2.990057852e-04f, -3.697389241e-03f, -1.358815244e-03f, +3.799846157e-03f, +2.504064289e-03f, -3.402984597e-03f, -3.492396405e-03f, +2.559407831e-03f, +4.104341299e-03f, -1.442908639e-03f, -4.214354349e-03f, +2.950498220e-04f, +3.829287972e-03f, +6.516844366e-04f, -3.079435871e-03f, -1.243673803e-03f, +2.167639909e-03f, +1.442560106e-03f, -1.299120064e-03f, -1.317658095e-03f, +6.206937747e-04f, +1.002976181e-03f, -1.908524170e-04f, -6.408354129e-04f, -1.362236142e-05f, +3.360284079e-04f, +6.480648075e-05f, -1.355645836e-04f, -4.073327675e-05f, +2.634352250e-05f, +0.000000000e+00f, + /* 7,10 (48) */ + +0.000000000e+00f, -2.992367736e-04f, -4.828041611e-04f, +5.047103873e-04f, +1.485740930e-03f, -1.308358105e-04f, -2.995954616e-03f, -1.546831573e-03f, +4.362170575e-03f, +5.117364706e-03f, -4.244108315e-03f, -1.053121839e-02f, +7.923085621e-04f, +1.661296950e-02f, +7.895115306e-03f, -2.076181572e-02f, -2.328919628e-02f, +1.875215164e-02f, +4.653851743e-02f, -3.525676742e-03f, -8.120973130e-02f, -4.482719406e-02f, +1.577533631e-01f, +3.789975080e-01f, +4.102652183e-01f, +2.204360452e-01f, -7.257952015e-03f, -8.795746564e-02f, -2.540451883e-02f, +4.188899058e-02f, +3.050098512e-02f, -1.590348879e-02f, -2.573537398e-02f, +1.187084978e-03f, +1.748884811e-02f, +5.531689491e-03f, -9.437868990e-03f, -6.916469353e-03f, +3.520647150e-03f, +5.477884605e-03f, -2.322695911e-04f, -3.227538798e-03f, -9.241961269e-04f, +1.381100619e-03f, +8.616446058e-04f, -3.536088098e-04f, -4.119527900e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.992367736e-04f, +4.828041611e-04f, -6.251561758e-04f, -2.224838682e-03f, +3.470683719e-04f, +4.891983586e-03f, +1.408729653e-03f, -8.237985198e-03f, -5.508108855e-03f, +1.117702080e-02f, +1.232943712e-02f, -1.212456078e-02f, -2.133452096e-02f, +9.507474147e-03f, +3.092545330e-02f, -2.445886927e-03f, -3.874473394e-02f, -8.683305000e-03f, +4.238317317e-02f, +2.209320921e-02f, -4.024983716e-02f, -3.498516320e-02f, +3.224262355e-02f, +4.439658891e-02f, -1.990978538e-02f, -4.817918088e-02f, +6.000285721e-03f, +4.570978311e-02f, +6.431436087e-03f, -3.804333997e-02f, -1.500438286e-02f, +2.746073294e-02f, +1.868384719e-02f, -1.662460420e-02f, -1.790954181e-02f, +7.707236260e-03f, +1.419003343e-02f, -1.830072298e-03f, -9.396893884e-03f, -1.019691276e-03f, +5.084055621e-03f, +1.655626858e-03f, -2.091176142e-03f, -1.165539020e-03f, +3.536088098e-04f, +4.119527900e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.006190168e-05f, -1.845081486e-05f, -8.924457674e-05f, -4.106474726e-06f, +1.843889131e-04f, +1.083580776e-04f, -2.785084545e-04f, -3.405188824e-04f, +2.844164418e-04f, +7.086593613e-04f, -7.128781453e-05f, -1.142348993e-03f, -5.047897562e-04f, +1.460613257e-03f, +1.555490471e-03f, -1.347825884e-03f, -3.123680586e-03f, +2.791030453e-04f, +5.186391212e-03f, +2.969830662e-03f, -7.612660200e-03f, -1.557600927e-02f, -9.938206779e-03f, +5.525319863e-03f, +1.545834947e-02f, +1.107350569e-02f, -2.384536114e-04f, -5.577481931e-03f, -2.057448314e-03f, +2.632798804e-03f, +2.303879485e-03f, -8.687954834e-04f, -1.842343909e-03f, -9.026666474e-05f, +1.185062795e-03f, +4.764683979e-04f, -5.996277874e-04f, -5.057462146e-04f, +2.024022021e-04f, +3.694012142e-04f, -1.221672470e-06f, -2.053569289e-04f, -5.816843057e-05f, +8.528981405e-05f, +4.633573213e-05f, -2.450776296e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.006190168e-05f, +1.845081486e-05f, +1.303161153e-04f, +1.604710306e-05f, -3.039998545e-04f, -1.434816127e-04f, +5.369865850e-04f, +4.387470956e-04f, -7.611881432e-04f, -9.449173978e-04f, +8.635987773e-04f, +1.644075557e-03f, -7.169145526e-04f, -2.436872970e-03f, +2.290064906e-04f, +3.152599747e-03f, +6.076260051e-04f, -3.593353469e-03f, -1.689836756e-03f, +3.599625827e-03f, +2.817781351e-03f, -3.112066827e-03f, -3.748993771e-03f, +2.202522148e-03f, +4.274305924e-03f, -1.058714921e-03f, -4.286055964e-03f, -7.353155228e-05f, +3.811055189e-03f, +9.681426814e-04f, -2.995587507e-03f, -1.485922522e-03f, +2.050237899e-03f, +1.605857472e-03f, -1.178665739e-03f, -1.412114242e-03f, +5.190117488e-04f, +1.047361566e-03f, -1.181188622e-04f, -6.554768997e-04f, -5.763349266e-05f, +3.373592935e-04f, +8.676328082e-05f, -1.336844431e-04f, -4.633573213e-05f, +2.450776296e-05f, +0.000000000e+00f, + /* 7,11 (48) */ + +0.000000000e+00f, -2.691748720e-04f, -5.012549759e-04f, +4.154658105e-04f, +1.481634456e-03f, +5.355310260e-05f, -2.887596539e-03f, -1.825340028e-03f, +4.021651693e-03f, +5.401781148e-03f, -3.535448954e-03f, -1.060250621e-02f, -3.500404306e-04f, +1.610817975e-02f, +9.355728563e-03f, -1.920632525e-02f, -2.463702217e-02f, +1.562847105e-02f, +4.681762047e-02f, +1.660714471e-03f, -7.823990064e-02f, -5.243985426e-02f, +1.421773538e-01f, +3.690593012e-01f, +4.157905382e-01f, +2.358943946e-01f, +3.815553680e-03f, -8.819591925e-02f, -3.098200076e-02f, +3.983154227e-02f, +3.313378393e-02f, -1.359960931e-02f, -2.660416947e-02f, -6.552589311e-04f, +1.739858144e-02f, +6.716752286e-03f, -8.961400592e-03f, -7.516097141e-03f, +3.014900936e-03f, +5.680286807e-03f, +1.371316231e-04f, -3.228760470e-03f, -1.129553056e-03f, +1.322932189e-03f, +9.469344199e-04f, -3.072730776e-04f, -4.364605530e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.691748720e-04f, +5.012549759e-04f, -4.948400605e-04f, -2.208791579e-03f, +4.306851739e-05f, +4.748501974e-03f, +1.945716238e-03f, -7.799238103e-03f, -6.269296998e-03f, +1.023210340e-02f, +1.319303589e-02f, -1.048048523e-02f, -2.205143551e-02f, +7.070601177e-03f, +3.115445979e-02f, +7.067128194e-04f, -3.813710794e-02f, -1.227665847e-02f, +4.069333641e-02f, +2.569283504e-02f, -3.743205581e-02f, -3.809723002e-02f, +2.849362978e-02f, +4.659911106e-02f, -1.563547945e-02f, -4.923789580e-02f, +1.714229757e-03f, +4.563625156e-02f, +1.024249128e-02f, -3.707519729e-02f, -1.799997036e-02f, +2.597481042e-02f, +2.073408509e-02f, -1.501874673e-02f, -1.908820755e-02f, +6.295122018e-03f, +1.470904517e-02f, -7.827107325e-04f, -9.515012747e-03f, -1.675168176e-03f, +5.026422129e-03f, +1.992986151e-03f, -2.004412861e-03f, -1.299223464e-03f, +3.072730776e-04f, +4.364605530e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.014369114e-05f, -1.315223083e-05f, -8.779798166e-05f, -1.522550372e-05f, +1.763650054e-04f, +1.256638951e-04f, -2.554424378e-04f, -3.588446341e-04f, +2.365788148e-04f, +7.138270327e-04f, +7.060227675e-06f, -1.109588240e-03f, -6.072682878e-04f, +1.356624929e-03f, +1.653273170e-03f, -1.137481256e-03f, -3.151352185e-03f, -6.143968142e-05f, +5.009011453e-03f, +3.410269646e-03f, -6.874877781e-03f, -1.541858668e-02f, -1.070594523e-02f, +4.554200443e-03f, +1.524909670e-02f, +1.169338969e-02f, +3.994057809e-04f, -5.545163282e-03f, -2.411695707e-03f, +2.464518670e-03f, +2.464951107e-03f, -6.966149643e-04f, -1.885364845e-03f, -2.205466708e-04f, +1.167398706e-03f, +5.560161944e-04f, -5.612248810e-04f, -5.437559948e-04f, +1.663028728e-04f, +3.812667058e-04f, +2.345906927e-05f, -2.051046652e-04f, -7.134101637e-05f, +8.204832773e-05f, +5.184563309e-05f, -2.229725832e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.014369114e-05f, +1.315223083e-05f, +1.262264773e-04f, +3.377506652e-05f, -2.902361166e-04f, -1.766928219e-04f, +5.015789302e-04f, +4.880127681e-04f, -6.880989818e-04f, -1.003005735e-03f, +7.365940119e-04f, +1.693920083e-03f, -5.255367885e-04f, -2.452930830e-03f, -2.530449539e-05f, +3.106208297e-03f, +9.078988784e-04f, -3.460963170e-03f, -2.004577893e-03f, +3.371221869e-03f, +3.107173204e-03f, -2.796518107e-03f, -3.974704598e-03f, +1.827438844e-03f, +4.409668015e-03f, -6.644028583e-04f, -4.322993071e-03f, -4.441151534e-04f, +3.761300367e-03f, +1.279952204e-03f, -2.885941360e-03f, -1.719310276e-03f, +1.913880253e-03f, +1.758755042e-03f, -1.045849078e-03f, -1.496857454e-03f, +4.103172188e-04f, +1.084083954e-03f, -4.204338890e-05f, -6.649381238e-04f, -1.029057219e-04f, +3.357132912e-04f, +1.090690042e-04f, -1.303924354e-04f, -5.184563309e-05f, +2.229725832e-05f, +0.000000000e+00f, + /* 7,12 (48) */ + +0.000000000e+00f, -2.390311808e-04f, -5.144072068e-04f, +3.276678289e-04f, +1.466408952e-03f, +2.299181080e-04f, -2.761932644e-03f, -2.080782465e-03f, +3.662807059e-03f, +5.638359962e-03f, -2.821621921e-03f, -1.059544598e-02f, -1.459628670e-03f, +1.550091146e-02f, +1.071235349e-02f, -1.755305208e-02f, -2.577450342e-02f, +1.247711886e-02f, +4.675618079e-02f, +6.669725923e-03f, -7.482963099e-02f, -5.931473204e-02f, +1.267587672e-01f, +3.583533560e-01f, +4.203447386e-01f, +2.511434913e-01f, +1.550894337e-02f, -8.779651347e-02f, -3.652716404e-02f, +3.741984656e-02f, +3.559830260e-02f, -1.113465820e-02f, -2.730078443e-02f, -2.540623776e-03f, +1.717803477e-02f, +7.884150992e-03f, -8.405384397e-03f, -8.077322022e-03f, +2.471144941e-03f, +5.846589680e-03f, +5.183983289e-04f, -3.205301401e-03f, -1.334657721e-03f, +1.251591172e-03f, +1.028982748e-03f, -2.554274445e-04f, -4.587578113e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.390311808e-04f, +5.144072068e-04f, -3.686135832e-04f, -2.175016512e-03f, -2.471675992e-04f, +4.571809152e-03f, +2.447295169e-03f, -7.311225335e-03f, -6.957395980e-03f, +9.229097663e-03f, +1.392962991e-02f, -8.786565145e-03f, -2.257697230e-02f, +4.617670347e-03f, +3.112915529e-02f, +3.812921116e-03f, -3.722920906e-02f, -1.573762164e-02f, +3.868875852e-02f, +2.906405691e-02f, -3.432488260e-02f, -4.089374813e-02f, +2.451892518e-02f, +4.842654990e-02f, -1.122581144e-02f, -4.990229866e-02f, -2.608763314e-03f, +4.519213640e-02f, +1.400379164e-02f, -3.579524509e-02f, -2.088591172e-02f, +2.425550015e-02f, +2.264796534e-02f, -1.325999169e-02f, -2.013405663e-02f, +4.798264564e-03f, +1.511936239e-02f, +3.013732217e-04f, -9.557056136e-03f, -2.340106299e-03f, +4.923516407e-03f, +2.328699442e-03f, -1.895343857e-03f, -1.429615899e-03f, +2.554274445e-04f, +4.587578113e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.991934502e-05f, -8.047512082e-06f, -8.570032428e-05f, -2.572550181e-05f, +1.673026491e-04f, +1.413749376e-04f, -2.312521275e-04f, -3.739218118e-04f, +1.884393493e-04f, +7.136263213e-04f, +8.321807681e-05f, -1.069660072e-03f, -7.027458309e-04f, +1.245537879e-03f, +1.736801056e-03f, -9.244669781e-04f, -3.156134378e-03f, -3.918457334e-04f, +4.803110104e-03f, +3.811774186e-03f, -6.130896128e-03f, -1.520382378e-02f, -1.142756215e-02f, +3.563091276e-03f, +1.497778787e-02f, +1.228058610e-02f, +1.062014672e-03f, -5.473060168e-03f, -2.759644501e-03f, +2.273779436e-03f, +2.612443858e-03f, -5.148751356e-04f, -1.915664365e-03f, -3.525991669e-04f, +1.140607739e-03f, +6.336116937e-04f, -5.175048575e-04f, -5.788045953e-04f, +1.277755383e-04f, +3.905980408e-04f, +4.887100603e-05f, -2.032069447e-04f, -8.451853313e-05f, +7.794699392e-05f, +5.720679688e-05f, -1.971202353e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.991934502e-05f, +8.047512082e-06f, +1.212155758e-04f, +5.026807306e-05f, -2.745855725e-04f, -2.070551399e-04f, +4.632174361e-04f, +5.316094506e-04f, -6.114111721e-04f, -1.051282896e-03f, +6.065002292e-04f, +1.728794241e-03f, -3.334555235e-04f, -2.448640478e-03f, -2.756505008e-04f, +3.035045686e-03f, +1.197431855e-03f, -3.301574000e-03f, -2.300561152e-03f, +3.116686908e-03f, +3.369953529e-03f, -2.459011507e-03f, -4.167696725e-03f, +1.437251817e-03f, +4.509234495e-03f, -2.632043609e-04f, -4.324674288e-03f, -8.136323987e-04f, +3.680165329e-03f, +1.584459375e-03f, -2.751101370e-03f, -1.941750497e-03f, +1.759413283e-03f, +1.899768601e-03f, -9.015498578e-04f, -1.570940809e-03f, +2.953707904e-04f, +1.112607779e-03f, +3.680922803e-05f, -6.689535921e-04f, -1.490773181e-04f, +3.309743637e-04f, +1.315266148e-04f, -1.256399360e-04f, -5.720679688e-05f, +1.971202353e-05f, +0.000000000e+00f, + /* 7,13 (48) */ + +0.000000000e+00f, -2.091118358e-04f, -5.224547188e-04f, +2.419675046e-04f, +1.440683450e-03f, +3.972207571e-04f, -2.620557706e-03f, -2.312034593e-03f, +3.288885247e-03f, +5.826799312e-03f, -2.107995600e-03f, -1.051222790e-02f, -2.529288742e-03f, +1.479816563e-02f, +1.195789137e-02f, -1.581625102e-02f, -2.669897040e-02f, +9.320984485e-03f, +4.636433506e-02f, +1.147283603e-02f, -7.101785681e-02f, -6.544562817e-02f, +1.115549434e-01f, +3.469257938e-01f, +4.239078299e-01f, +2.661212792e-01f, +2.778952947e-02f, -8.673449879e-02f, -4.200022421e-02f, +3.466020206e-02f, +3.787208203e-02f, -8.522214343e-03f, -2.781565957e-02f, -4.456288141e-03f, +1.682543560e-02f, +9.024758730e-03f, -7.771772704e-03f, -8.594826879e-03f, +1.892340346e-03f, +5.974365218e-03f, +9.089963697e-04f, -3.156430395e-03f, -1.537864666e-03f, +1.167072639e-03f, +1.106929742e-03f, -1.982206477e-04f, -4.784698349e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.091118358e-04f, +5.224547188e-04f, -2.473980074e-04f, -2.124748439e-03f, -5.217531717e-04f, +4.364754012e-03f, +2.910512605e-03f, -6.779615884e-03f, -7.568807152e-03f, +8.177814767e-03f, +1.453613013e-02f, -7.057770904e-03f, -2.291042782e-02f, +2.169029869e-03f, +3.085350479e-02f, +6.847966803e-03f, -3.603177721e-02f, -1.903919564e-02f, +3.638819737e-02f, +3.218074382e-02f, -3.095492907e-02f, -4.335275964e-02f, +2.035122845e-02f, +4.986380172e-02f, -6.716576944e-03f, -5.016550302e-02f, -6.933437601e-03f, +4.437850400e-02f, +1.768395697e-02f, -3.421078571e-02f, -2.363701309e-02f, +2.231374965e-02f, +2.440737863e-02f, -1.136022309e-02f, -2.103560649e-02f, +3.227323755e-03f, +1.541473318e-02f, +1.413981001e-03f, -9.520246907e-03f, -3.009059891e-03f, +4.774439089e-03f, +2.659673806e-03f, -1.763817242e-03f, -1.555255835e-03f, +1.982206477e-04f, +4.784698349e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.940939777e-05f, -3.172941354e-06f, -8.300046623e-05f, -3.554727186e-05f, +1.573143649e-04f, +1.554269116e-04f, -2.061598898e-04f, -3.857389280e-04f, +1.403660523e-04f, +7.082100232e-04f, +1.566860867e-04f, -1.023041899e-03f, -7.907093813e-04f, +1.128326476e-03f, +1.805834501e-03f, -7.103494024e-04f, -3.138590688e-03f, -7.101556934e-04f, +4.570894266e-03f, +4.173266846e-03f, -5.384545525e-03f, -1.493356050e-02f, -1.210015645e-02f, +2.556322706e-03f, +1.464498729e-02f, +1.283161796e-02f, +1.746493787e-03f, -5.360321239e-03f, -3.098718631e-03f, +2.061309057e-03f, +2.744943539e-03f, -3.246504017e-04f, -1.932695959e-03f, -4.854938715e-04f, +1.104649127e-03f, +7.086191726e-04f, -4.686481720e-04f, -6.105359519e-04f, +8.704165206e-05f, +3.972370981e-04f, +7.483801030e-05f, -1.996149864e-04f, -9.759077119e-05f, +7.298096997e-05f, +6.236171686e-05f, -1.675588491e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.940939777e-05f, +3.172941354e-06f, +1.153866087e-04f, +6.543514523e-05f, -2.572731998e-04f, -2.344139914e-04f, +4.223391725e-04f, +5.693439858e-04f, -5.318792988e-04f, -1.089595050e-03f, +4.744814268e-04f, +1.748719610e-03f, -1.422846034e-04f, -2.424376583e-03f, -5.200131665e-04f, +2.940019494e-03f, +1.473948446e-03f, -3.116755210e-03f, -2.575484564e-03f, +2.838279978e-03f, +3.604068283e-03f, -2.102396482e-03f, -4.326413757e-03f, +1.035182771e-03f, +4.572109842e-03f, +1.415792325e-04f, -4.290901969e-03f, -1.179002679e-03f, +3.568057956e-03f, +1.879045199e-03f, -2.591892616e-03f, -2.151220976e-03f, +1.587851634e-03f, +2.027489676e-03f, -7.467647766e-04f, -1.633489118e-03f, +1.750068552e-04f, +1.132455450e-03f, +1.178320026e-04f, -6.672984590e-04f, -1.957644976e-04f, +3.230510926e-04f, +1.539281953e-04f, -1.193909001e-04f, -6.236171686e-05f, +1.675588491e-05f, +0.000000000e+00f, + /* 7,14 (48) */ + +0.000000000e+00f, -1.797024380e-04f, -5.256276602e-04f, +1.589670384e-04f, +1.405136178e-03f, +5.545351220e-04f, -2.465130794e-03f, -2.518194483e-03f, +2.903146319e-03f, +5.967165364e-03f, -1.399785577e-03f, -1.035554182e-02f, -3.552330642e-03f, +1.400745625e-02f, +1.308621785e-02f, -1.401041652e-02f, -2.740931980e-02f, +6.182393798e-03f, +4.565417936e-02f, +1.604373029e-02f, -6.684458996e-02f, -7.083017370e-02f, +9.662138288e-02f, +3.348256374e-01f, +4.264641526e-01f, +2.807662665e-01f, +4.062114743e-02f, -8.498800501e-02f, -4.736054545e-02f, +3.156148343e-02f, +3.993339109e-02f, -5.777270803e-03f, -2.814030997e-02f, -6.388984100e-03f, +1.633994173e-02f, +1.012940786e-02f, -7.063153531e-03f, -9.063475051e-03f, +1.281804394e-03f, +6.061406870e-03f, +1.306233468e-03f, -3.081592384e-03f, -1.737479652e-03f, +1.069481868e-03f, +1.179910712e-03f, -1.358589308e-04f, -4.952257198e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.797024380e-04f, +5.256276602e-04f, -1.320113986e-04f, -2.059313294e-03f, -7.790263715e-04f, +4.130340021e-03f, +3.332851777e-03f, -6.210271898e-03f, -8.100686451e-03f, +7.088219717e-03f, +1.501061156e-02f, -5.309051293e-03f, -2.305271243e-02f, -2.553467138e-04f, +3.033349163e-02f, +9.787986297e-03f, -3.455782876e-02f, -2.215595085e-02f, +3.381271281e-02f, +3.501902379e-02f, -2.735086079e-02f, -4.545515612e-02f, +1.602481470e-02f, +5.089898449e-02f, -2.144467102e-03f, -5.002392379e-02f, -1.122433957e-02f, +4.319950132e-02f, +2.125201493e-02f, -3.233174051e-02f, -2.622890571e-02f, +2.016252867e-02f, +2.599523026e-02f, -9.332733411e-03f, -2.178237126e-02f, +1.593834637e-03f, +1.558974004e-02f, +2.546436450e-03f, -9.402414905e-03f, -3.676358351e-03f, +4.578674591e-03f, +2.982724899e-03f, -1.609889047e-03f, -1.674646735e-03f, +1.358589308e-04f, +4.952257198e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.863621876e-05f, +1.439082229e-06f, -7.975035777e-05f, -4.463969354e-05f, +1.465159276e-04f, +1.677708782e-04f, -1.803878146e-04f, -3.943097584e-04f, +9.271572658e-05f, +6.977656499e-04f, +2.269977574e-04f, -9.702479273e-04f, -8.707132496e-04f, +1.005985252e-03f, +1.860242573e-03f, -4.966642856e-04f, -3.099423254e-03f, -1.014541025e-03f, +4.314675244e-03f, +4.493920170e-03f, -4.639603441e-03f, -1.460989809e-02f, -1.272108488e-02f, +1.538308694e-03f, +1.425157367e-02f, +1.334314888e-02f, +2.449785430e-03f, -5.206317386e-03f, -3.426330156e-03f, +1.828004523e-03f, +2.861106379e-03f, -1.271031969e-04f, -1.935996551e-03f, -6.182707865e-04f, +1.059549598e-03f, +7.804055004e-04f, -4.148794920e-04f, -6.386092476e-04f, +4.434671800e-05f, +4.010419751e-04f, +1.011733331e-04f, -1.942922012e-04f, -1.104439513e-04f, +6.715287147e-05f, +6.725204694e-05f, -1.343661977e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.863621876e-05f, -1.439082229e-06f, +1.088454893e-04f, +7.920246515e-05f, -2.385297552e-04f, -2.586479351e-04f, +3.793884526e-04f, +6.010806214e-04f, -4.502613259e-04f, -1.117877985e-03f, +3.416912839e-04f, +1.753844383e-03f, +4.639975854e-05f, -2.380676125e-03f, -7.564539392e-04f, +2.822226078e-03f, +1.735306302e-03f, -2.908274395e-03f, -2.827239875e-03f, +2.538446195e-03f, +3.807712082e-03f, -1.729674275e-03f, -4.449587916e-03f, +6.245539774e-04f, +4.597704255e-03f, +5.466049358e-04f, -4.221775386e-03f, -1.537159529e-03f, +3.425650924e-03f, +2.161148111e-03f, -2.409356830e-03f, -2.345782207e-03f, +1.400372094e-03f, +2.140599143e-03f, -5.826009958e-04f, -1.683708230e-03f, +5.012793022e-05f, +1.143213222e-03f, +2.003800356e-04f, -6.597919536e-04f, -2.425642658e-04f, +3.118785642e-04f, +1.760565584e-04f, -1.116228722e-04f, -6.725204694e-05f, +1.343661977e-05f, +0.000000000e+00f, + /* 7,15 (48) */ + +0.000000000e+00f, -1.510662193e-04f, -5.241885780e-04f, +7.921668061e-05f, +1.360496485e-03f, +7.010510496e-04f, -2.297359916e-03f, -2.698582297e-03f, +2.508836561e-03f, +6.059881091e-03f, -7.020199266e-04f, -1.012854406e-02f, -4.522578569e-03f, +1.313674300e-02f, +1.409220310e-02f, -1.215017395e-02f, -2.790598409e-02f, +3.082970544e-03f, +4.463963834e-02f, +2.035840554e-02f, -6.235066979e-02f, -7.546977714e-02f, +8.201148479e-02f, +3.221045525e-01f, +4.280024613e-01f, +2.950178402e-01f, +5.396429631e-02f, -8.253821958e-02f, -5.256686283e-02f, +2.813515328e-02f, +4.176139561e-02f, -2.916164424e-03f, -2.826741316e-02f, -8.324980651e-03f, +1.572167095e-02f, +1.118895746e-02f, -6.282748031e-03f, -9.478354543e-03f, +6.431951462e-04f, +6.105753588e-03f, +1.707275443e-03f, -2.980419051e-03f, -1.931771853e-03f, +9.590379168e-04f, +1.247063583e-03f, -6.860688387e-05f, -5.086623395e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.510662193e-04f, +5.241885780e-04f, -2.316590932e-05f, -1.980110829e-03f, -1.017556127e-03f, +3.871692085e-03f, +3.712240230e-03f, -5.609191277e-03f, -8.550947777e-03f, +5.970341733e-03f, +1.535230285e-02f, -3.555206910e-03f, -2.300631267e-02f, -2.636022839e-03f, +2.957703769e-02f, +1.261021237e-02f, -3.282252246e-02f, -2.506422524e-02f, +3.098547293e-02f, +3.755746999e-02f, -2.354314871e-02f, -4.718483039e-02f, +1.157522678e-02f, +5.152353847e-02f, +2.453237153e-03f, -4.947731885e-02f, -1.544611496e-02f, +4.166234180e-02f, +2.467766585e-02f, -3.017059240e-02f, -2.863826254e-02f, +1.781674647e-02f, +2.739560235e-02f, -7.192134268e-03f, -2.236497226e-02f, -8.987359339e-05f, +1.563986797e-02f, +3.689649672e-03f, -9.202034869e-03f, -4.336150304e-03f, +4.336110325e-03f, +3.294603463e-03f, -1.433832489e-03f, -1.786269607e-03f, +6.860688387e-05f, +5.086623395e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.762370518e-05f, +5.760175807e-06f, -7.600445101e-05f, -5.295984601e-05f, +1.350252974e-04f, +1.783731277e-04f, -1.541559783e-04f, -3.996724792e-04f, +4.583156740e-05f, +6.825130750e-04f, +2.937223500e-04f, -9.118244494e-04f, -9.423806704e-04f, +8.795212707e-04f, +1.900001413e-03f, -2.849068333e-04f, -3.039464840e-03f, -1.303312883e-03f, +4.036852200e-03f, +4.773157098e-03f, -3.899774043e-03f, -1.423518529e-02f, -1.328797511e-02f, +5.135232855e-04f, +1.379873723e-02f, +1.381200319e-02f, +3.168668398e-03f, -5.010649862e-03f, -3.739895539e-03f, +1.574929844e-03f, +2.959670128e-03f, +7.652224290e-05f, -1.925191887e-03f, -7.499465761e-04f, +1.005404870e-03f, +8.483450124e-04f, -3.564671675e-04f, -6.627019978e-04f, -4.093019403e-08f, +4.018886385e-04f, +1.276807758e-04f, -1.872149352e-04f, -1.229615697e-04f, +6.047305568e-05f, +7.181911347e-05f, -9.766062624e-06f, +0.000000000e+00f, + +0.000000000e+00f, -2.762370518e-05f, -5.760175807e-06f, +1.016996062e-04f, +9.151332350e-05f, -2.185893392e-04f, -2.796685582e-04f, +3.348125527e-04f, +6.267404753e-04f, -3.673118035e-04f, -1.136155430e-03f, +2.092633706e-04f, +1.744439505e-03f, +2.310718362e-04f, -2.318231147e-03f, -9.831294547e-04f, +2.682938861e-03f, +1.979513937e-03f, -2.678080675e-03f, -3.053928932e-03f, +2.219794955e-03f, +3.979342386e-03f, -1.343972107e-03f, -4.536250409e-03f, +2.087601736e-04f, +4.585739218e-03f, +9.485163500e-04f, -4.117691368e-03f, -1.885076851e-03f, +3.253878147e-03f, +2.428286484e-03f, -2.204745980e-03f, -2.523595232e-03f, +1.198305879e-03f, +2.237880283e-03f, -4.102685728e-04f, -1.720893812e-03f, -7.830175331e-05f, +1.144536630e-03f, +2.837752888e-04f, -6.463004974e-04f, -2.890575428e-04f, +2.974200642e-04f, +1.976870227e-04f, -1.023278982e-04f, -7.181911347e-05f, +9.766062624e-06f, +0.000000000e+00f, + /* 8, 0 (44) */ + +0.000000000e+00f, -5.810608668e-04f, -4.000691189e-04f, +1.473036739e-03f, +1.194314507e-03f, -2.873286720e-03f, -2.812546922e-03f, +4.814679451e-03f, +5.726744505e-03f, -7.245170423e-03f, -1.058087851e-02f, +1.001747038e-02f, +1.834373570e-02f, -1.289773969e-02f, -3.079950282e-02f, +1.559401954e-02f, +5.232680174e-02f, -1.780024775e-02f, -9.893335750e-02f, +1.924749700e-02f, +3.158555538e-01f, +4.802482832e-01f, +3.158555538e-01f, +1.924749700e-02f, -9.893335750e-02f, -1.780024775e-02f, +5.232680174e-02f, +1.559401954e-02f, -3.079950282e-02f, -1.289773969e-02f, +1.834373570e-02f, +1.001747038e-02f, -1.058087851e-02f, -7.245170423e-03f, +5.726744505e-03f, +4.814679451e-03f, -2.812546922e-03f, -2.873286720e-03f, +1.194314507e-03f, +1.473036739e-03f, -4.000691189e-04f, -5.810608668e-04f, +8.174592653e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.810608668e-04f, +4.000691189e-04f, -2.174762082e-03f, -1.369356920e-03f, +4.931706478e-03f, +2.614276448e-03f, -9.249493921e-03f, -4.085126069e-03f, +1.521344320e-02f, +5.480993556e-03f, -2.257913432e-02f, -6.427039238e-03f, +3.073327098e-02f, +6.578871207e-03f, -3.875145264e-02f, -5.735049828e-03f, +4.555317997e-02f, +3.918145659e-03f, -5.012182275e-02f, -1.392488435e-03f, +5.173229864e-02f, -1.392488435e-03f, -5.012182275e-02f, +3.918145659e-03f, +4.555317997e-02f, -5.735049828e-03f, -3.875145264e-02f, +6.578871207e-03f, +3.073327098e-02f, -6.427039238e-03f, -2.257913432e-02f, +5.480993556e-03f, +1.521344320e-02f, -4.085126069e-03f, -9.249493921e-03f, +2.614276448e-03f, +4.931706478e-03f, -1.369356920e-03f, -2.174762082e-03f, +5.133746463e-04f, +5.810608668e-04f, -8.174592653e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.185484257e-05f, -7.472545295e-05f, -1.102051290e-04f, +1.613767670e-04f, +2.444118589e-04f, -2.837343586e-04f, -4.818346326e-04f, +4.347689209e-04f, +8.725487992e-04f, -5.951362975e-04f, -1.487933707e-03f, +7.268860082e-04f, +2.447072989e-03f, -7.549241477e-04f, -4.003216328e-03f, +4.860173922e-04f, +6.895726713e-03f, +9.490229708e-04f, -1.476051954e-02f, -1.838447645e-02f, -7.222834590e-04f, +1.782422552e-02f, +1.557915740e-02f, -7.956834231e-05f, -6.992952053e-03f, -9.829232678e-04f, +3.981393558e-03f, +1.059950903e-03f, -2.398032028e-03f, -9.168719580e-04f, +1.438709876e-03f, +7.113088342e-04f, -8.326150558e-04f, -5.029857206e-04f, +4.536423550e-04f, +3.214802361e-04f, -2.270679961e-04f, -1.806565744e-04f, +1.012954305e-04f, +8.356404177e-05f, -3.855347749e-05f, -2.569515524e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.185484257e-05f, +7.472545295e-05f, +1.586424720e-04f, -2.828334246e-04f, -3.191320079e-04f, +6.056212654e-04f, +5.265264426e-04f, -1.095032644e-03f, -7.496963344e-04f, +1.750316290e-03f, +9.422006148e-04f, -2.533177027e-03f, -1.053194813e-03f, +3.366842708e-03f, +1.041971095e-03f, -4.146189187e-03f, -8.914588966e-04f, +4.757638244e-03f, +6.158590596e-04f, -5.104045782e-03f, -2.592907924e-04f, +5.127648687e-03f, -1.146548538e-04f, -4.824253892e-03f, +4.393630174e-04f, +4.244320116e-03f, -6.624116387e-04f, -3.480588537e-03f, +7.580816744e-04f, +2.646049143e-03f, -7.314302511e-04f, -1.848821109e-03f, +6.132254185e-04f, +1.171037534e-03f, -4.481649702e-04f, -6.569929318e-04f, +2.808403007e-04f, +3.124376673e-04f, -1.441699117e-04f, -1.132976271e-04f, +3.855347749e-05f, +2.569515524e-05f, +0.000000000e+00f, + /* 8, 1 (44) */ + +0.000000000e+00f, -5.392060243e-04f, -4.747945719e-04f, +1.362831610e-03f, +1.355691274e-03f, -2.628874861e-03f, -3.096281281e-03f, +4.332844818e-03f, +6.161513426e-03f, -6.372621624e-03f, -1.117601480e-02f, +8.529536678e-03f, +1.907062170e-02f, -1.045066670e-02f, -3.155442696e-02f, +1.159080321e-02f, +5.281281913e-02f, -1.090452104e-02f, -9.798433453e-02f, +4.486977456e-03f, +2.974710773e-01f, +4.795259998e-01f, +3.336797793e-01f, +3.482665439e-02f, -9.901292585e-02f, -2.479319980e-02f, +5.134387847e-02f, +1.957541309e-02f, -2.973955191e-02f, -1.529577171e-02f, +1.742686374e-02f, +1.145618026e-02f, -9.869569671e-03f, -8.077785479e-03f, +5.223758785e-03f, +5.268321806e-03f, -2.491066686e-03f, -3.100354716e-03f, +1.013657932e-03f, +1.574332169e-03f, -3.165050772e-04f, -6.196143443e-04f, +5.605077129e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.392060243e-04f, +4.747945719e-04f, -2.016119610e-03f, -1.652190345e-03f, +4.612574470e-03f, +3.219897714e-03f, -8.722967479e-03f, -5.180158713e-03f, +1.446374686e-02f, +7.231309846e-03f, -2.163693371e-02f, -8.960216265e-03f, +2.968007616e-02f, +9.945713914e-03f, -3.770948155e-02f, -9.881239015e-03f, +4.466172107e-02f, +8.675783903e-03f, -4.950596369e-02f, -6.496534218e-03f, +5.147300785e-02f, +3.735160252e-03f, -5.023647761e-02f, -9.061082325e-04f, +4.599254299e-02f, -1.490729711e-03f, -3.941386428e-02f, +3.098282669e-03f, +3.149135265e-02f, -3.780990095e-03f, -2.331056457e-02f, +3.632172447e-03f, +1.582666861e-02f, -2.914088535e-03f, -9.697658891e-03f, +1.957283516e-03f, +5.212546779e-03f, -1.056919253e-03f, -2.318931993e-03f, +4.000770192e-04f, +6.196143443e-04f, -5.605077129e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.447000076e-05f, -6.561260708e-05f, -1.175863630e-04f, +1.413909328e-04f, +2.587499785e-04f, -2.447267536e-04f, -5.046039744e-04f, +3.647515618e-04f, +9.033027300e-04f, -4.769486025e-04f, -1.522328357e-03f, +5.356244570e-04f, +2.472885404e-03f, -4.517495490e-04f, -3.989152634e-03f, +6.792324100e-07f, +6.743476916e-03f, +1.771989956e-03f, -1.388975381e-02f, -1.884927793e-02f, -2.162862672e-03f, +1.717067280e-02f, +1.633957237e-02f, +8.318913589e-04f, -7.032366365e-03f, -1.487435369e-03f, +3.922815420e-03f, +1.364116952e-03f, -2.325561793e-03f, -1.103788633e-03f, +1.374690872e-03f, +8.243134910e-04f, -7.835964559e-04f, -5.686890412e-04f, +4.201123347e-04f, +3.575455993e-04f, -2.067708630e-04f, -1.990006381e-04f, +9.087705687e-05f, +9.201382764e-05f, -3.456277161e-05f, -2.909513156e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.447000076e-05f, +6.561260708e-05f, +1.705338903e-04f, -2.516281064e-04f, -3.524274318e-04f, +5.498599193e-04f, +5.968357629e-04f, -1.010025620e-03f, -8.748938469e-04f, +1.636274853e-03f, +1.139001349e-03f, -2.396651528e-03f, -1.332909937e-03f, +3.220556109e-03f, +1.406553845e-03f, -4.007037969e-03f, -1.331074280e-03f, +4.643243197e-03f, +1.108914643e-03f, -5.028768897e-03f, -7.752124316e-04f, +5.099238890e-03f, +3.895744136e-04f, -4.842134161e-03f, -2.064217926e-05f, +4.300022554e-03f, -2.716382553e-04f, -3.560161383e-03f, +4.504061946e-04f, +2.733648279e-03f, -5.086205797e-04f, -1.930375961e-03f, +4.666398829e-04f, +1.236949904e-03f, -3.623359676e-04f, -7.032381695e-04f, +2.377710009e-04f, +3.400167222e-04f, -1.271457542e-04f, -1.265129176e-04f, +3.456277161e-05f, +2.909513156e-05f, +0.000000000e+00f, + /* 8, 2 (44) */ + +0.000000000e+00f, -4.947360235e-04f, -5.404071790e-04f, +1.245245247e-03f, +1.497082207e-03f, -2.370124883e-03f, -3.341008035e-03f, +3.828240844e-03f, +6.526264988e-03f, -5.469318894e-03f, -1.165296341e-02f, +7.007208321e-03f, +1.960624616e-02f, -7.977781293e-03f, -3.200617651e-02f, +7.601650574e-03f, +5.281349836e-02f, -4.161044122e-03f, -9.621234458e-02f, -9.402776357e-03f, +2.786217994e-01f, +4.773631371e-01f, +3.508504521e-01f, +5.116622676e-02f, -9.818103449e-02f, -3.182556617e-02f, +4.985644310e-02f, +2.349822851e-02f, -2.837543496e-02f, -1.762133351e-02f, +1.632307510e-02f, +1.283087113e-02f, -9.045256180e-03f, -8.861381935e-03f, +4.655069744e-03f, +5.688434141e-03f, -2.133521087e-03f, -3.307125579e-03f, +8.146572943e-04f, +1.665209226e-03f, -2.244912495e-04f, -6.541771159e-04f, +2.695563973e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.947360235e-04f, +5.404071790e-04f, -1.845585719e-03f, -1.903818451e-03f, +4.260147039e-03f, +3.769757633e-03f, -8.126131716e-03f, -6.190184334e-03f, +1.358885301e-02f, +8.867584699e-03f, -2.049793236e-02f, -1.135686779e-02f, +2.834716623e-02f, +1.316627002e-02f, -3.630292770e-02f, -1.388827698e-02f, +4.333064679e-02f, +1.331902710e-02f, -4.839704905e-02f, -1.152530311e-02f, +5.069779542e-02f, +8.834399142e-03f, -4.984690319e-02f, -5.748242393e-03f, +4.597190081e-02f, +2.809292843e-03f, -3.968550254e-02f, -4.618787135e-04f, +3.194175885e-02f, -1.047341816e-03f, -2.381918515e-02f, +1.701796486e-03f, +1.629330850e-02f, -1.677138632e-03f, -1.005999486e-02f, +1.254045347e-03f, +5.450317780e-03f, -7.169025308e-04f, -2.446077748e-03f, +2.735641016e-04f, +6.541771159e-04f, -2.695563973e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.640993010e-05f, -5.633742412e-05f, -1.234361062e-04f, +1.209264873e-04f, +2.700613610e-04f, -2.048736546e-04f, -5.219194978e-04f, +2.936413168e-04f, +9.248699457e-04f, -3.578843506e-04f, -1.541995804e-03f, +3.448443249e-04f, +2.475871378e-03f, -1.530509239e-04f, -3.940354256e-03f, -4.693393252e-04f, +6.539323918e-03f, +2.544408182e-03f, -1.297319719e-02f, -1.921709714e-02f, -3.591505477e-03f, +1.642657021e-02f, +1.703595698e-02f, +1.780477243e-03f, -7.011546824e-03f, -1.995409702e-03f, +3.826910903e-03f, +1.664642242e-03f, -2.229670092e-03f, -1.285821334e-03f, +1.296050107e-03f, +9.329939847e-04f, -7.256777112e-04f, -6.311675135e-04f, +3.813850264e-04f, +3.915132464e-04f, -1.836050578e-04f, -2.161792827e-04f, +7.898707982e-05f, +9.995883490e-05f, -2.988787338e-05f, -3.238614251e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.640993010e-05f, +5.633742412e-05f, +1.798468566e-04f, -2.192450057e-04f, -3.805723284e-04f, +4.904672768e-04f, +6.586139036e-04f, -9.171717255e-04f, -9.878083628e-04f, +1.508241484e-03f, +1.320087845e-03f, -2.238310358e-03f, -1.594596247e-03f, +3.043677248e-03f, +1.752595690e-03f, -3.828686751e-03f, -1.753801711e-03f, +4.482514405e-03f, +1.588801705e-03f, -4.902691787e-03f, -1.283182136e-03f, +5.019017235e-03f, +8.916550208e-04f, -4.810825532e-03f, -4.838688553e-04f, +4.312319161e-03f, +1.264254265e-04f, -3.604266988e-03f, +1.331817181e-04f, +2.794594309e-03f, -2.758704644e-04f, -1.993717300e-03f, +3.112387393e-04f, +1.291758293e-03f, -2.697264117e-04f, -7.436511503e-04f, +1.902072397e-04f, +3.651508023e-04f, -1.076330211e-04f, -1.390933055e-04f, +2.988787338e-05f, +3.238614251e-05f, +0.000000000e+00f, + /* 8, 3 (44) */ + +0.000000000e+00f, -4.483260934e-04f, -5.967446031e-04f, +1.121809141e-03f, +1.618008694e-03f, -2.100063522e-03f, -3.545881689e-03f, +3.306321346e-03f, +6.819906305e-03f, -4.544448948e-03f, -1.201084776e-02f, +5.465212517e-03f, +1.995109049e-02f, -5.501909915e-03f, -3.215922744e-02f, +3.661296318e-03f, +5.234415903e-02f, +2.378279796e-03f, -9.366793640e-02f, -2.237597355e-02f, +2.594047022e-01f, +4.737716316e-01f, +3.672770223e-01f, +6.820218374e-02f, -9.640055725e-02f, -3.883711299e-02f, +4.786103340e-02f, +2.732513942e-02f, -2.671079272e-02f, -1.985100360e-02f, +1.503725377e-02f, +1.412692124e-02f, -8.112262196e-03f, -9.587059646e-03f, +4.023902230e-03f, +6.069819167e-03f, -1.742007841e-03f, -3.490730637e-03f, +5.984780117e-04f, +1.744196306e-03f, -1.245324146e-04f, -6.840649893e-04f, -5.430502781e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.483260934e-04f, +5.967446031e-04f, -1.665738863e-03f, -2.123063457e-03f, +3.879574710e-03f, +4.260224910e-03f, -7.467517812e-03f, -7.107356059e-03f, +1.260104465e-02f, +1.037582618e-02f, -1.917784451e-02f, -1.359517815e-02f, +2.675256998e-02f, +1.620994727e-02f, -3.455033201e-02f, -1.771696373e-02f, +4.157684508e-02f, +1.780154150e-02f, -4.680824735e-02f, -1.642799490e-02f, +4.941461328e-02f, +1.385341638e-02f, -4.895524817e-02f, -1.055906793e-02f, +4.548803195e-02f, +7.121612003e-03f, -3.955907711e-02f, -4.066145701e-03f, +3.207494056e-02f, +1.747252493e-03f, -2.409505562e-02f, -2.919208143e-04f, +1.660454724e-02f, -3.853803383e-04f, -1.032972127e-02f, +5.103941965e-04f, +5.640525020e-03f, -3.517517285e-04f, -2.553710769e-03f, +1.344707961e-04f, +6.840649893e-04f, +5.430502781e-06f, +0.000000000e+00f, + +0.000000000e+00f, +4.769294207e-05f, -4.700808171e-05f, -1.277674190e-04f, +1.002063120e-04f, +2.783555512e-04f, -1.645847664e-04f, -5.338031835e-04f, +2.221340670e-04f, +9.373291153e-04f, -2.390578810e-04f, -1.547169434e-03f, +1.562510821e-04f, +2.456625632e-03f, +1.386575125e-04f, -3.858238810e-03f, -9.205208281e-04f, +6.286692566e-03f, +3.262659615e-03f, -1.201738174e-02f, -1.948702236e-02f, -5.000343093e-03f, +1.559525887e-02f, +1.766283529e-02f, +2.760942598e-03f, -6.928461094e-03f, -2.502548952e-03f, +3.693419733e-03f, +1.958702524e-03f, -2.110578708e-03f, -1.461150555e-03f, +1.203102599e-03f, +1.036201354e-03f, -6.591341691e-04f, -6.897183060e-04f, +3.376565750e-04f, +4.229718227e-04f, -1.576876388e-04f, -2.319653085e-04f, +6.568020226e-05f, +1.072829234e-04f, -2.454257125e-05f, -3.551525150e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.769294207e-05f, +4.700808171e-05f, +1.866147110e-04f, -1.861016712e-04f, -4.034761595e-04f, +4.282141356e-04f, +7.114893926e-04f, -8.176767188e-04f, -1.087586590e-03f, +1.367872721e-03f, +1.483916041e-03f, -2.060186002e-03f, -1.835852403e-03f, +2.838446164e-03f, +2.076766203e-03f, -3.613344933e-03f, -2.155442434e-03f, +4.277369306e-03f, +2.050656220e-03f, -4.727213046e-03f, -1.777991320e-03f, +4.887722949e-03f, +1.386417312e-03f, -4.730384443e-03f, -9.455611626e-04f, +4.280677796e-03f, +5.277348038e-04f, -3.611967365e-03f, -1.904302771e-04f, +2.827765709e-03f, -3.542794466e-05f, -2.037748604e-03f, +1.484504698e-04f, +1.334543715e-03f, -1.711211164e-04f, -7.775662099e-04f, +1.384958074e-04f, +3.874297558e-04f, -8.572907829e-05f, -1.508342662e-04f, +2.454257125e-05f, +3.551525150e-05f, +0.000000000e+00f, + /* 8, 4 (44) */ + +0.000000000e+00f, -4.006331513e-04f, -6.437526848e-04f, +9.940417215e-04f, +1.718215006e-03f, -1.821707971e-03f, -3.710466456e-03f, +2.772518163e-03f, +7.042040372e-03f, -3.607119833e-03f, -1.224990564e-02f, +3.918043083e-03f, +2.010734157e-02f, -3.045284283e-03f, -3.202056993e-02f, -1.969424922e-04f, +5.142363821e-02f, +8.664972362e-03f, -9.040527678e-02f, -3.439335529e-02f, +2.399176799e-01f, +4.687712885e-01f, +3.828722811e-01f, +8.586501903e-02f, -9.363961465e-02f, -4.576557409e-02f, +4.535848444e-02f, +3.101855915e-02f, -2.475209020e-02f, -2.196158231e-02f, +1.357610321e-02f, +1.533002384e-02f, -7.076060841e-03f, -1.024619382e-02f, +3.334183924e-03f, +6.407475742e-03f, -1.319036018e-03f, -3.648418276e-03f, +3.665127031e-04f, +1.809876508e-03f, -1.724949120e-05f, -7.086075605e-04f, -4.094575428e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.006331513e-04f, +6.437526848e-04f, -1.479124152e-03f, -2.309165128e-03f, +3.476098551e-03f, +4.688439045e-03f, -6.756028420e-03f, -7.925032778e-03f, +1.151345806e-02f, +1.174369890e-02f, -1.769392847e-02f, -1.565536415e-02f, +2.491671758e-02f, +1.904839344e-02f, -3.247356581e-02f, -2.133030867e-02f, +3.942140265e-02f, +2.207891081e-02f, -4.475759113e-02f, -2.115520795e-02f, +4.763662196e-02f, +1.874113933e-02f, -4.756883086e-02f, -1.528945237e-02f, +4.454247079e-02f, +1.140228980e-02f, -3.903134231e-02f, -7.678113066e-03f, +3.188451029e-02f, +4.575018202e-03f, -2.413048356e-02f, -2.329669418e-03f, +1.675299771e-02f, +9.491633768e-04f, -1.050084239e-02f, -2.671720134e-04f, +5.779020827e-03f, +3.567802731e-05f, -2.639439847e-03f, -1.636347006e-05f, +7.086075605e-04f, +4.094575428e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.834410762e-05f, -3.772798779e-05f, -1.306086261e-04f, +7.944665265e-05f, +2.836714180e-04f, -1.242594839e-04f, -5.403279595e-04f, +1.509076622e-04f, +9.408412593e-04f, -1.215496279e-04f, -1.538208371e-03f, -2.851540742e-05f, +2.415925241e-03f, +4.209902531e-04f, -3.744470874e-03f, -1.349604660e-03f, +5.989278435e-03f, +3.923587290e-03f, -1.102898683e-02f, -1.965876471e-02f, -6.381639287e-03f, +1.468064983e-02f, +1.821510479e-02f, +3.767704577e-03f, -6.781491515e-03f, -3.004433560e-03f, +3.522402851e-03f, +2.243453307e-03f, -1.968727041e-03f, -1.627968675e-03f, +1.096305901e-03f, +1.132805076e-03f, -5.843318427e-04f, -7.436542395e-04f, +2.891787024e-04f, +4.515201670e-04f, -1.291681340e-04f, -2.461364923e-04f, +5.102892682e-05f, +1.138711112e-04f, -1.854956279e-05f, -3.842849568e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.834410762e-05f, +3.772798779e-05f, +1.908995503e-04f, -1.526052546e-04f, -4.211106389e-04f, +3.638746578e-04f, +7.551990102e-04f, -7.127823102e-04f, -1.173536764e-03f, +1.216916679e-03f, +1.629154798e-03f, -1.864480710e-03f, -2.054528295e-03f, +2.607366901e-03f, +2.376001048e-03f, -3.363584131e-03f, -2.532048830e-03f, +4.030174318e-03f, +2.489820397e-03f, -4.504240370e-03f, -2.254569416e-03f, +4.706626740e-03f, +1.868750069e-03f, -4.601379392e-03f, -1.400944966e-03f, +4.205021212e-03f, +9.281659166e-04f, -3.582695493e-03f, -5.171517757e-04f, +2.832316186e-03f, +2.103311512e-04f, -2.061556128e-03f, -2.017944628e-05f, +1.364492529e-03f, -6.739694859e-05f, -8.043669378e-04f, +8.304557818e-05f, +4.064584806e-04f, -6.156610171e-05f, -1.615301094e-04f, +1.854956279e-05f, +3.842849568e-05f, +0.000000000e+00f, + /* 8, 5 (44) */ + +0.000000000e+00f, -3.522890437e-04f, -6.814806726e-04f, +8.634330955e-04f, +1.797661659e-03f, -1.538036552e-03f, -3.834725940e-03f, +2.232190203e-03f, +7.192948034e-03f, -2.666278574e-03f, -1.237145527e-02f, +2.379834711e-03f, +2.007882616e-02f, -6.293590427e-04f, -3.159957967e-02f, -3.941413366e-03f, +5.007403355e-02f, +1.465425080e-02f, -8.648168949e-02f, -4.542234212e-02f, +2.202589152e-01f, +4.623896493e-01f, +3.975529310e-01f, +1.040801238e-01f, -8.987191007e-02f, -5.254706560e-02f, +4.235405088e-02f, +3.454096200e-02f, -2.250863689e-02f, -2.393030935e-02f, +1.194813454e-02f, +1.642632974e-02f, -5.943255765e-03f, -1.083052566e-02f, +2.590529685e-03f, +6.696654445e-03f, -8.675158509e-04f, -3.777586410e-03f, +1.203762108e-04f, +1.860905435e-03f, +9.662161999e-05f, -7.271571233e-04f, -7.937424996e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.522890437e-04f, +6.814806726e-04f, -1.288224602e-03f, -2.461770383e-03f, +3.054987912e-03f, +5.052313703e-03f, -6.000829409e-03f, -8.637815088e-03f, +1.033992130e-02f, +1.296061558e-02f, -1.606477367e-02f, -1.751984486e-02f, +2.286218928e-02f, +2.165576034e-02f, -3.009756476e-02f, -2.469389280e-02f, +3.688935382e-02f, +2.610908513e-02f, -4.226777073e-02f, -2.565944832e-02f, +4.538205255e-02f, +2.344776607e-02f, -4.570008079e-02f, -1.989083176e-02f, +4.314152582e-02f, +1.560731101e-02f, -3.810317639e-02f, -1.126080856e-02f, +3.136735851e-02f, +7.407334389e-03f, -2.392015241e-02f, -4.391225546e-03f, +1.673281826e-02f, +2.313655906e-03f, -1.056823934e-02f, -1.071538951e-03f, +5.862066405e-03f, +4.421365079e-04f, -2.701005949e-03f, -1.778935794e-04f, +7.271571233e-04f, +7.937424996e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.839462908e-05f, -2.859485025e-05f, -1.320023646e-04f, +5.885516513e-05f, +2.860756854e-04f, -8.428333986e-05f, -5.416153511e-04f, +8.061603855e-05f, +9.356458443e-04f, -6.397055724e-06f, -1.515590808e-03f, -2.078939901e-04f, +2.354718005e-03f, +6.917080224e-04f, -3.600941485e-03f, -1.753606875e-03f, +5.651013484e-03f, +4.524509575e-03f, -1.001479077e-02f, -1.973265539e-02f, -7.727842011e-03f, +1.368720055e-02f, +1.868807609e-02f, +4.794878850e-03f, -6.569456489e-03f, -3.496554457e-03f, +3.314250424e-03f, +2.516054581e-03f, -1.804773863e-03f, -1.784496961e-03f, +9.762597131e-04f, +1.221704309e-03f, -5.017265645e-04f, -7.923109627e-04f, +2.362580365e-04f, +4.767717013e-04f, -9.822821321e-05f, -2.584781305e-04f, +3.512353509e-05f, +1.196109415e-04f, -1.194062833e-05f, -4.107153860e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.839462908e-05f, +2.859485025e-05f, +1.927900639e-04f, -1.191481753e-04f, -4.335076091e-04f, +2.982175889e-04f, +7.895872538e-04f, -6.037516229e-04f, -1.245131973e-03f, +1.057192249e-03f, +1.754695733e-03f, -1.653540093e-03f, -2.248743779e-03f, +2.353177519e-03f, +2.647531089e-03f, -3.082307693e-03f, -2.879963865e-03f, +3.743717416e-03f, +2.901890653e-03f, -4.236169460e-03f, -2.708037002e-03f, +4.477518245e-03f, +2.333654438e-03f, -4.424887605e-03f, -1.845278111e-03f, +4.085731968e-03f, +1.323558370e-03f, -3.516266209e-03f, -8.436215584e-04f, +2.807688605e-03f, +4.589264150e-04f, -2.064422979e-03f, -1.930026237e-04f, +1.380908477e-03f, +4.048418938e-05f, -8.234949991e-04f, +2.432513126e-05f, +4.218623792e-04f, -3.531111780e-05f, -1.709766679e-04f, +1.194062833e-05f, +4.107153860e-05f, +0.000000000e+00f, + /* 8, 6 (44) */ + +0.000000000e+00f, -3.038944146e-04f, -7.100755228e-04f, +7.314307309e-04f, +1.856516824e-03f, -1.251960867e-03f, -3.919009279e-03f, +1.690574852e-03f, +7.273564073e-03f, -1.730632730e-03f, -1.237785232e-02f, +8.642439036e-04f, +1.987093217e-02f, +1.725358962e-03f, -3.090787165e-02f, -7.542354851e-03f, +4.832042667e-02f, +2.030526428e-02f, -8.195717992e-02f, -5.543713289e-02f, +2.005262598e-01f, +4.546618072e-01f, +4.112401315e-01f, +1.227681999e-01f, -8.507703122e-02f, -5.911652209e-02f, +3.885749643e-02f, +3.785521243e-02f, -1.999258231e-02f, -2.573508321e-02f, +1.016363758e-02f, +1.740258945e-02f, -4.721551456e-03f, -1.133225222e-02f, +1.798218722e-03f, +6.932912481e-03f, -3.907441495e-04f, -3.875814623e-03f, -1.381019197e-04f, +1.896028970e-03f, +2.162325615e-04f, -7.390977517e-04f, -1.204457886e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.038944146e-04f, +7.100755228e-04f, -1.095434538e-03f, -2.580918558e-03f, +2.621480303e-03f, +5.350531292e-03f, -5.211242156e-03f, -9.241566711e-03f, +9.094789324e-03f, +1.401780783e-02f, -1.431007794e-02f, -1.917338496e-02f, +2.061344550e-02f, +2.400893786e-02f, -2.745003367e-02f, -2.777620049e-02f, +3.400938995e-02f, +2.985280254e-02f, -3.936588008e-02f, -2.989561778e-02f, +4.267401554e-02f, +2.792528431e-02f, -4.336642635e-02f, -2.431571937e-02f, +4.129624771e-02f, +1.969304298e-02f, -3.677961802e-02f, -1.477707477e-02f, +3.052373695e-02f, +1.021502299e-02f, -2.346122599e-02f, -6.455648525e-03f, +1.653981564e-02f, +3.694564383e-03f, -1.052775515e-02f, -1.895033950e-03f, +5.886391536e-03f, +8.639988871e-04f, -2.736317066e-03f, -3.488702474e-04f, +7.390977517e-04f, +1.204457886e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.788116752e-05f, -1.969985019e-05f, -1.320045167e-04f, +3.862912484e-05f, +2.856612353e-04f, -4.502470736e-05f, -5.378327322e-04f, +1.188374152e-05f, +9.220562475e-04f, +1.054137594e-04f, -1.479906409e-03f, -3.804142822e-04f, +2.274109596e-03f, +9.487336002e-04f, -3.429746212e-03f, -2.129837364e-03f, +5.276030544e-03f, +5.063230652e-03f, -8.981622363e-03f, -1.970963860e-02f, -9.031633674e-03f, +1.261988750e-02f, +1.907750995e-02f, +5.836317008e-03f, -6.291628868e-03f, -3.974347229e-03f, +3.069687240e-03f, +2.773696116e-03f, -1.619597138e-03f, -1.929002754e-03f, +8.437041567e-04f, +1.301839163e-03f, -4.118622482e-04f, -8.350541189e-04f, +1.792548715e-04f, +4.983588199e-04f, -6.508101615e-05f, -2.687855997e-04f, +1.807187045e-05f, +1.243938803e-04f, -4.756703036e-06f, -4.339035843e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.788116752e-05f, +1.969985019e-05f, +1.923991367e-04f, -8.610414198e-05f, -4.407562983e-04f, +2.319978392e-04f, +8.146046105e-04f, -4.918548230e-04f, -1.302011596e-03f, +8.905679790e-04f, +1.859660446e-03f, -1.429825661e-03f, -2.416904238e-03f, +2.078818033e-03f, +2.888908036e-03f, -2.772716986e-03f, -3.195857155e-03f, +3.421176404e-03f, +3.282762717e-03f, -3.925857803e-03f, -3.133756888e-03f, +4.202687952e-03f, +2.776296846e-03f, -4.202486263e-03f, -2.273900699e-03f, +3.923652468e-03f, +1.709759111e-03f, -3.412883114e-03f, -1.166429934e-03f, +2.753625988e-03f, +7.077976662e-04f, -2.045841319e-03f, -3.682833568e-04f, +1.383223723e-03f, +1.514835683e-04f, -8.344585772e-04f, -3.714043133e-05f, +4.332927888e-04f, -7.165599053e-06f, -1.789741028e-04f, +4.756703036e-06f, +4.339035843e-05f, +0.000000000e+00f, + /* 8, 7 (44) */ + +0.000000000e+00f, -2.560132471e-04f, -7.297753730e-04f, +5.994262142e-04f, +1.895145949e-03f, -9.662996318e-04f, -3.964033987e-03f, +1.152742120e-03f, +7.285447814e-03f, -8.085764820e-04f, -1.227243856e-02f, -6.156625050e-04f, +1.949051789e-02f, +3.999468559e-03f, -2.995913805e-02f, -1.097210106e-02f, +4.619058931e-02f, +2.558129482e-02f, -7.689394926e-02f, -6.441875526e-02f, +1.808166212e-01f, +4.456301736e-01f, +4.238600190e-01f, +1.418457099e-01f, -7.924071421e-02f, -6.540815096e-02f, +3.488314920e-02f, +4.092489967e-02f, -1.721888619e-02f, -2.735468035e-02f, +8.234634824e-03f, +1.824629361e-02f, -3.419712293e-03f, -1.174411447e-02f, +9.631646030e-04f, +7.112167352e-03f, +1.076146704e-04f, -3.940895639e-03f, -4.068875194e-04f, +1.914100841e-03f, +3.406264418e-04f, -7.438544547e-04f, -1.638361470e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.560132471e-04f, +7.297753730e-04f, -9.030354009e-04f, -2.667022700e-03f, +2.180724004e-03f, +5.582529131e-03f, -4.396637545e-03f, -9.733421534e-03f, +7.792777728e-03f, +1.490837581e-02f, -1.245041749e-02f, -2.060321062e-02f, +1.819654127e-02f, +2.608775589e-02f, -2.456112564e-02f, -3.054891748e-02f, +3.081353280e-02f, +3.327397895e-02f, -3.608311736e-02f, -3.382147558e-02f, +3.954025866e-02f, +3.212797226e-02f, -4.059012951e-02f, -2.851820563e-02f, +3.902234701e-02f, +2.361669545e-02f, -3.506985891e-02f, -1.818995788e-02f, +2.935730702e-02f, +1.296864898e-02f, -2.275342833e-02f, -8.501489845e-03f, +1.617153228e-02f, +5.077788106e-03f, -1.037627158e-02f, -2.729492528e-03f, +5.849251105e-03f, +1.297291676e-03f, -2.743482666e-03f, -5.278443502e-04f, +7.438544547e-04f, +1.638361470e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.684513548e-05f, -1.112692396e-05f, -1.306830424e-04f, +1.895381149e-05f, +2.825452050e-04f, -6.831782675e-06f, -5.291902169e-04f, -5.469910617e-05f, +9.004546514e-04f, +2.129558393e-04f, -1.431847895e-03f, -5.447075985e-04f, +2.175349606e-03f, +1.190165848e-03f, -3.233162014e-03f, -2.475914239e-03f, +4.868626925e-03f, +5.538047177e-03f, -7.936312500e-03f, -1.959126004e-02f, -1.028597968e-02f, +1.148417486e-02f, +1.937965128e-02f, +6.885646455e-03f, -5.947751127e-03f, -4.433227450e-03f, +2.789775403e-03f, +3.013623114e-03f, -1.414291854e-03f, -2.059816660e-03f, +6.995166794e-04f, +1.372201893e-03f, -3.153682513e-04f, -8.712864337e-04f, +1.185813556e-04f, +5.159372326e-04f, -2.997013018e-05f, -2.768669074e-04f, -1.080557890e-09f, +1.281167300e-04f, +2.952157736e-06f, -4.533196465e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.684513548e-05f, +1.112692396e-05f, +1.898612599e-04f, -5.382456666e-05f, -4.430000117e-04f, +1.659485128e-04f, +8.303046957e-04f, -3.783550747e-04f, -1.343980885e-03f, +7.189409073e-04f, +1.943405127e-03f, -1.195886599e-03f, -2.557712845e-03f, +1.787396621e-03f, +3.098026373e-03f, -2.438274842e-03f, -3.476757284e-03f, +3.066083240e-03f, +3.628673365e-03f, -3.576593616e-03f, -3.527382605e-03f, +3.884903787e-03f, +3.192060310e-03f, -3.936238367e-03f, -2.682284826e-03f, +3.720080067e-03f, +2.082666591e-03f, -3.273141382e-03f, -1.482154510e-03f, +2.670179440e-03f, +9.543311124e-04f, -2.005522523e-03f, -5.442155608e-04f, +1.371008737e-03f, +2.644949693e-04f, -8.368403219e-04f, -1.007734610e-04f, +4.404323169e-04f, +2.263539879e-05f, -1.853297907e-04f, -2.952157736e-06f, +4.533196465e-05f, +0.000000000e+00f, + /* 8, 8 (44) */ + +0.000000000e+00f, -2.091681116e-04f, -7.409022970e-04f, +4.687431718e-04f, +1.914099760e-03f, -6.837544268e-04f, -3.970865769e-03f, +6.235519031e-04f, +7.230748708e-03f, +9.187816936e-05f, -1.205948272e-02f, -2.047510400e-03f, +1.894581029e-02f, +6.174818164e-03f, -2.876897220e-02f, -1.420526308e-02f, +4.371467507e-02f, +3.044992175e-02f, -7.135590209e-02f, -7.235506776e-02f, +1.612253611e-01f, +4.353441939e-01f, +4.353441939e-01f, +1.612253611e-01f, -7.235506776e-02f, -7.135590209e-02f, +3.044992175e-02f, +4.371467507e-02f, -1.420526308e-02f, -2.876897220e-02f, +6.174818164e-03f, +1.894581029e-02f, -2.047510400e-03f, -1.205948272e-02f, +9.187816936e-05f, +7.230748708e-03f, +6.235519031e-04f, -3.970865769e-03f, -6.837544268e-04f, +1.914099760e-03f, +4.687431718e-04f, -7.409022970e-04f, -2.091681116e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.091681116e-04f, +7.409022970e-04f, -7.131741410e-04f, -2.720847267e-03f, +1.737723993e-03f, +5.748477644e-03f, -3.566332849e-03f, -1.011177661e-02f, +6.448796843e-03f, +1.562731672e-02f, -1.050701237e-02f, -2.179909722e-02f, +1.563882842e-02f, +2.787515251e-02f, -2.146309926e-02f, -3.298719232e-02f, +2.733677551e-02f, +3.634006219e-02f, -3.245444399e-02f, -3.739806920e-02f, +3.601287605e-02f, +3.601287605e-02f, -3.739806920e-02f, -3.245444399e-02f, +3.634006219e-02f, +2.733677551e-02f, -3.298719232e-02f, -2.146309926e-02f, +2.787515251e-02f, +1.563882842e-02f, -2.179909722e-02f, -1.050701237e-02f, +1.562731672e-02f, +6.448796843e-03f, -1.011177661e-02f, -3.566332849e-03f, +5.748477644e-03f, +1.737723993e-03f, -2.720847267e-03f, -7.131741410e-04f, +7.409022970e-04f, +2.091681116e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.533196465e-05f, -2.952157736e-06f, -1.281167300e-04f, +1.080557890e-09f, +2.768669074e-04f, +2.997013018e-05f, -5.159372326e-04f, -1.185813556e-04f, +8.712864337e-04f, +3.153682513e-04f, -1.372201893e-03f, -6.995166794e-04f, +2.059816660e-03f, +1.414291854e-03f, -3.013623114e-03f, -2.789775403e-03f, +4.433227450e-03f, +5.947751127e-03f, -6.885646455e-03f, -1.937965128e-02f, -1.148417486e-02f, +1.028597968e-02f, +1.959126004e-02f, +7.936312500e-03f, -5.538047177e-03f, -4.868626925e-03f, +2.475914239e-03f, +3.233162014e-03f, -1.190165848e-03f, -2.175349606e-03f, +5.447075985e-04f, +1.431847895e-03f, -2.129558393e-04f, -9.004546514e-04f, +5.469910617e-05f, +5.291902169e-04f, +6.831782675e-06f, -2.825452050e-04f, -1.895381149e-05f, +1.306830424e-04f, +1.112692396e-05f, -4.684513548e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.533196465e-05f, +2.952157736e-06f, +1.853297907e-04f, -2.263539879e-05f, -4.404323169e-04f, +1.007734610e-04f, +8.368403219e-04f, -2.644949693e-04f, -1.371008737e-03f, +5.442155608e-04f, +2.005522523e-03f, -9.543311124e-04f, -2.670179440e-03f, +1.482154510e-03f, +3.273141382e-03f, -2.082666591e-03f, -3.720080067e-03f, +2.682284826e-03f, +3.936238367e-03f, -3.192060310e-03f, -3.884903787e-03f, +3.527382605e-03f, +3.576593616e-03f, -3.628673365e-03f, -3.066083240e-03f, +3.476757284e-03f, +2.438274842e-03f, -3.098026373e-03f, -1.787396621e-03f, +2.557712845e-03f, +1.195886599e-03f, -1.943405127e-03f, -7.189409073e-04f, +1.343980885e-03f, +3.783550747e-04f, -8.303046957e-04f, -1.659485128e-04f, +4.430000117e-04f, +5.382456666e-05f, -1.898612599e-04f, -1.112692396e-05f, +4.684513548e-05f, +0.000000000e+00f, + /* 8, 9 (44) */ + +0.000000000e+00f, -1.638361470e-04f, -7.438544547e-04f, +3.406264418e-04f, +1.914100841e-03f, -4.068875194e-04f, -3.940895639e-03f, +1.076146704e-04f, +7.112167352e-03f, +9.631646030e-04f, -1.174411447e-02f, -3.419712293e-03f, +1.824629361e-02f, +8.234634824e-03f, -2.735468035e-02f, -1.721888619e-02f, +4.092489967e-02f, +3.488314920e-02f, -6.540815096e-02f, -7.924071421e-02f, +1.418457099e-01f, +4.238600190e-01f, +4.456301736e-01f, +1.808166212e-01f, -6.441875526e-02f, -7.689394926e-02f, +2.558129482e-02f, +4.619058931e-02f, -1.097210106e-02f, -2.995913805e-02f, +3.999468559e-03f, +1.949051789e-02f, -6.156625050e-04f, -1.227243856e-02f, -8.085764820e-04f, +7.285447814e-03f, +1.152742120e-03f, -3.964033987e-03f, -9.662996318e-04f, +1.895145949e-03f, +5.994262142e-04f, -7.297753730e-04f, -2.560132471e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.638361470e-04f, +7.438544547e-04f, -5.278443502e-04f, -2.743482666e-03f, +1.297291676e-03f, +5.849251105e-03f, -2.729492528e-03f, -1.037627158e-02f, +5.077788106e-03f, +1.617153228e-02f, -8.501489845e-03f, -2.275342833e-02f, +1.296864898e-02f, +2.935730702e-02f, -1.818995788e-02f, -3.506985891e-02f, +2.361669545e-02f, +3.902234701e-02f, -2.851820563e-02f, -4.059012951e-02f, +3.212797226e-02f, +3.954025866e-02f, -3.382147558e-02f, -3.608311736e-02f, +3.327397895e-02f, +3.081353280e-02f, -3.054891748e-02f, -2.456112564e-02f, +2.608775589e-02f, +1.819654127e-02f, -2.060321062e-02f, -1.245041749e-02f, +1.490837581e-02f, +7.792777728e-03f, -9.733421534e-03f, -4.396637545e-03f, +5.582529131e-03f, +2.180724004e-03f, -2.667022700e-03f, -9.030354009e-04f, +7.297753730e-04f, +2.560132471e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.339035843e-05f, +4.756703036e-06f, -1.243938803e-04f, -1.807187045e-05f, +2.687855997e-04f, +6.508101615e-05f, -4.983588199e-04f, -1.792548715e-04f, +8.350541189e-04f, +4.118622482e-04f, -1.301839163e-03f, -8.437041567e-04f, +1.929002754e-03f, +1.619597138e-03f, -2.773696116e-03f, -3.069687240e-03f, +3.974347229e-03f, +6.291628868e-03f, -5.836317008e-03f, -1.907750995e-02f, -1.261988750e-02f, +9.031633674e-03f, +1.970963860e-02f, +8.981622363e-03f, -5.063230652e-03f, -5.276030544e-03f, +2.129837364e-03f, +3.429746212e-03f, -9.487336002e-04f, -2.274109596e-03f, +3.804142822e-04f, +1.479906409e-03f, -1.054137594e-04f, -9.220562475e-04f, -1.188374152e-05f, +5.378327322e-04f, +4.502470736e-05f, -2.856612353e-04f, -3.862912484e-05f, +1.320045167e-04f, +1.969985019e-05f, -4.788116752e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.339035843e-05f, -4.756703036e-06f, +1.789741028e-04f, +7.165599053e-06f, -4.332927888e-04f, +3.714043133e-05f, +8.344585772e-04f, -1.514835683e-04f, -1.383223723e-03f, +3.682833568e-04f, +2.045841319e-03f, -7.077976662e-04f, -2.753625988e-03f, +1.166429934e-03f, +3.412883114e-03f, -1.709759111e-03f, -3.923652468e-03f, +2.273900699e-03f, +4.202486263e-03f, -2.776296846e-03f, -4.202687952e-03f, +3.133756888e-03f, +3.925857803e-03f, -3.282762717e-03f, -3.421176404e-03f, +3.195857155e-03f, +2.772716986e-03f, -2.888908036e-03f, -2.078818033e-03f, +2.416904238e-03f, +1.429825661e-03f, -1.859660446e-03f, -8.905679790e-04f, +1.302011596e-03f, +4.918548230e-04f, -8.146046105e-04f, -2.319978392e-04f, +4.407562983e-04f, +8.610414198e-05f, -1.923991367e-04f, -1.969985019e-05f, +4.788116752e-05f, +0.000000000e+00f, + /* 8,10 (44) */ + +0.000000000e+00f, -1.204457886e-04f, -7.390977517e-04f, +2.162325615e-04f, +1.896028970e-03f, -1.381019197e-04f, -3.875814623e-03f, -3.907441495e-04f, +6.932912481e-03f, +1.798218722e-03f, -1.133225222e-02f, -4.721551456e-03f, +1.740258945e-02f, +1.016363758e-02f, -2.573508321e-02f, -1.999258231e-02f, +3.785521243e-02f, +3.885749643e-02f, -5.911652209e-02f, -8.507703122e-02f, +1.227681999e-01f, +4.112401315e-01f, +4.546618072e-01f, +2.005262598e-01f, -5.543713289e-02f, -8.195717992e-02f, +2.030526428e-02f, +4.832042667e-02f, -7.542354851e-03f, -3.090787165e-02f, +1.725358962e-03f, +1.987093217e-02f, +8.642439036e-04f, -1.237785232e-02f, -1.730632730e-03f, +7.273564073e-03f, +1.690574852e-03f, -3.919009279e-03f, -1.251960867e-03f, +1.856516824e-03f, +7.314307309e-04f, -7.100755228e-04f, -3.038944146e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.204457886e-04f, +7.390977517e-04f, -3.488702474e-04f, -2.736317066e-03f, +8.639988871e-04f, +5.886391536e-03f, -1.895033950e-03f, -1.052775515e-02f, +3.694564383e-03f, +1.653981564e-02f, -6.455648525e-03f, -2.346122599e-02f, +1.021502299e-02f, +3.052373695e-02f, -1.477707477e-02f, -3.677961802e-02f, +1.969304298e-02f, +4.129624771e-02f, -2.431571937e-02f, -4.336642635e-02f, +2.792528431e-02f, +4.267401554e-02f, -2.989561778e-02f, -3.936588008e-02f, +2.985280254e-02f, +3.400938995e-02f, -2.777620049e-02f, -2.745003367e-02f, +2.400893786e-02f, +2.061344550e-02f, -1.917338496e-02f, -1.431007794e-02f, +1.401780783e-02f, +9.094789324e-03f, -9.241566711e-03f, -5.211242156e-03f, +5.350531292e-03f, +2.621480303e-03f, -2.580918558e-03f, -1.095434538e-03f, +7.100755228e-04f, +3.038944146e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.107153860e-05f, +1.194062833e-05f, -1.196109415e-04f, -3.512353509e-05f, +2.584781305e-04f, +9.822821321e-05f, -4.767717013e-04f, -2.362580365e-04f, +7.923109627e-04f, +5.017265645e-04f, -1.221704309e-03f, -9.762597131e-04f, +1.784496961e-03f, +1.804773863e-03f, -2.516054581e-03f, -3.314250424e-03f, +3.496554457e-03f, +6.569456489e-03f, -4.794878850e-03f, -1.868807609e-02f, -1.368720055e-02f, +7.727842011e-03f, +1.973265539e-02f, +1.001479077e-02f, -4.524509575e-03f, -5.651013484e-03f, +1.753606875e-03f, +3.600941485e-03f, -6.917080224e-04f, -2.354718005e-03f, +2.078939901e-04f, +1.515590808e-03f, +6.397055724e-06f, -9.356458443e-04f, -8.061603855e-05f, +5.416153511e-04f, +8.428333986e-05f, -2.860756854e-04f, -5.885516513e-05f, +1.320023646e-04f, +2.859485025e-05f, -4.839462908e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.107153860e-05f, -1.194062833e-05f, +1.709766679e-04f, +3.531111780e-05f, -4.218623792e-04f, -2.432513126e-05f, +8.234949991e-04f, -4.048418938e-05f, -1.380908477e-03f, +1.930026237e-04f, +2.064422979e-03f, -4.589264150e-04f, -2.807688605e-03f, +8.436215584e-04f, +3.516266209e-03f, -1.323558370e-03f, -4.085731968e-03f, +1.845278111e-03f, +4.424887605e-03f, -2.333654438e-03f, -4.477518245e-03f, +2.708037002e-03f, +4.236169460e-03f, -2.901890653e-03f, -3.743717416e-03f, +2.879963865e-03f, +3.082307693e-03f, -2.647531089e-03f, -2.353177519e-03f, +2.248743779e-03f, +1.653540093e-03f, -1.754695733e-03f, -1.057192249e-03f, +1.245131973e-03f, +6.037516229e-04f, -7.895872538e-04f, -2.982175889e-04f, +4.335076091e-04f, +1.191481753e-04f, -1.927900639e-04f, -2.859485025e-05f, +4.839462908e-05f, +0.000000000e+00f, + /* 8,11 (44) */ + +0.000000000e+00f, -7.937424996e-05f, -7.271571233e-04f, +9.662161999e-05f, +1.860905435e-03f, +1.203762108e-04f, -3.777586410e-03f, -8.675158509e-04f, +6.696654445e-03f, +2.590529685e-03f, -1.083052566e-02f, -5.943255765e-03f, +1.642632974e-02f, +1.194813454e-02f, -2.393030935e-02f, -2.250863689e-02f, +3.454096200e-02f, +4.235405088e-02f, -5.254706560e-02f, -8.987191007e-02f, +1.040801238e-01f, +3.975529310e-01f, +4.623896493e-01f, +2.202589152e-01f, -4.542234212e-02f, -8.648168949e-02f, +1.465425080e-02f, +5.007403355e-02f, -3.941413366e-03f, -3.159957967e-02f, -6.293590427e-04f, +2.007882616e-02f, +2.379834711e-03f, -1.237145527e-02f, -2.666278574e-03f, +7.192948034e-03f, +2.232190203e-03f, -3.834725940e-03f, -1.538036552e-03f, +1.797661659e-03f, +8.634330955e-04f, -6.814806726e-04f, -3.522890437e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.937424996e-05f, +7.271571233e-04f, -1.778935794e-04f, -2.701005949e-03f, +4.421365079e-04f, +5.862066405e-03f, -1.071538951e-03f, -1.056823934e-02f, +2.313655906e-03f, +1.673281826e-02f, -4.391225546e-03f, -2.392015241e-02f, +7.407334389e-03f, +3.136735851e-02f, -1.126080856e-02f, -3.810317639e-02f, +1.560731101e-02f, +4.314152582e-02f, -1.989083176e-02f, -4.570008079e-02f, +2.344776607e-02f, +4.538205255e-02f, -2.565944832e-02f, -4.226777073e-02f, +2.610908513e-02f, +3.688935382e-02f, -2.469389280e-02f, -3.009756476e-02f, +2.165576034e-02f, +2.286218928e-02f, -1.751984486e-02f, -1.606477367e-02f, +1.296061558e-02f, +1.033992130e-02f, -8.637815088e-03f, -6.000829409e-03f, +5.052313703e-03f, +3.054987912e-03f, -2.461770383e-03f, -1.288224602e-03f, +6.814806726e-04f, +3.522890437e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.842849568e-05f, +1.854956279e-05f, -1.138711112e-04f, -5.102892682e-05f, +2.461364923e-04f, +1.291681340e-04f, -4.515201670e-04f, -2.891787024e-04f, +7.436542395e-04f, +5.843318427e-04f, -1.132805076e-03f, -1.096305901e-03f, +1.627968675e-03f, +1.968727041e-03f, -2.243453307e-03f, -3.522402851e-03f, +3.004433560e-03f, +6.781491515e-03f, -3.767704577e-03f, -1.821510479e-02f, -1.468064983e-02f, +6.381639287e-03f, +1.965876471e-02f, +1.102898683e-02f, -3.923587290e-03f, -5.989278435e-03f, +1.349604660e-03f, +3.744470874e-03f, -4.209902531e-04f, -2.415925241e-03f, +2.851540742e-05f, +1.538208371e-03f, +1.215496279e-04f, -9.408412593e-04f, -1.509076622e-04f, +5.403279595e-04f, +1.242594839e-04f, -2.836714180e-04f, -7.944665265e-05f, +1.306086261e-04f, +3.772798779e-05f, -4.834410762e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.842849568e-05f, -1.854956279e-05f, +1.615301094e-04f, +6.156610171e-05f, -4.064584806e-04f, -8.304557818e-05f, +8.043669378e-04f, +6.739694859e-05f, -1.364492529e-03f, +2.017944628e-05f, +2.061556128e-03f, -2.103311512e-04f, -2.832316186e-03f, +5.171517757e-04f, +3.582695493e-03f, -9.281659166e-04f, -4.205021212e-03f, +1.400944966e-03f, +4.601379392e-03f, -1.868750069e-03f, -4.706626740e-03f, +2.254569416e-03f, +4.504240370e-03f, -2.489820397e-03f, -4.030174318e-03f, +2.532048830e-03f, +3.363584131e-03f, -2.376001048e-03f, -2.607366901e-03f, +2.054528295e-03f, +1.864480710e-03f, -1.629154798e-03f, -1.216916679e-03f, +1.173536764e-03f, +7.127823102e-04f, -7.551990102e-04f, -3.638746578e-04f, +4.211106389e-04f, +1.526052546e-04f, -1.908995503e-04f, -3.772798779e-05f, +4.834410762e-05f, +0.000000000e+00f, + /* 8,12 (44) */ + +0.000000000e+00f, -4.094575428e-05f, -7.086075605e-04f, -1.724949120e-05f, +1.809876508e-03f, +3.665127031e-04f, -3.648418276e-03f, -1.319036018e-03f, +6.407475742e-03f, +3.334183924e-03f, -1.024619382e-02f, -7.076060841e-03f, +1.533002384e-02f, +1.357610321e-02f, -2.196158231e-02f, -2.475209020e-02f, +3.101855915e-02f, +4.535848444e-02f, -4.576557409e-02f, -9.363961465e-02f, +8.586501903e-02f, +3.828722811e-01f, +4.687712885e-01f, +2.399176799e-01f, -3.439335529e-02f, -9.040527678e-02f, +8.664972362e-03f, +5.142363821e-02f, -1.969424922e-04f, -3.202056993e-02f, -3.045284283e-03f, +2.010734157e-02f, +3.918043083e-03f, -1.224990564e-02f, -3.607119833e-03f, +7.042040372e-03f, +2.772518163e-03f, -3.710466456e-03f, -1.821707971e-03f, +1.718215006e-03f, +9.940417215e-04f, -6.437526848e-04f, -4.006331513e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.094575428e-05f, +7.086075605e-04f, -1.636347006e-05f, -2.639439847e-03f, +3.567802731e-05f, +5.779020827e-03f, -2.671720134e-04f, -1.050084239e-02f, +9.491633768e-04f, +1.675299771e-02f, -2.329669418e-03f, -2.413048356e-02f, +4.575018202e-03f, +3.188451029e-02f, -7.678113066e-03f, -3.903134231e-02f, +1.140228980e-02f, +4.454247079e-02f, -1.528945237e-02f, -4.756883086e-02f, +1.874113933e-02f, +4.763662196e-02f, -2.115520795e-02f, -4.475759113e-02f, +2.207891081e-02f, +3.942140265e-02f, -2.133030867e-02f, -3.247356581e-02f, +1.904839344e-02f, +2.491671758e-02f, -1.565536415e-02f, -1.769392847e-02f, +1.174369890e-02f, +1.151345806e-02f, -7.925032778e-03f, -6.756028420e-03f, +4.688439045e-03f, +3.476098551e-03f, -2.309165128e-03f, -1.479124152e-03f, +6.437526848e-04f, +4.006331513e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.551525150e-05f, +2.454257125e-05f, -1.072829234e-04f, -6.568020226e-05f, +2.319653085e-04f, +1.576876388e-04f, -4.229718227e-04f, -3.376565750e-04f, +6.897183060e-04f, +6.591341691e-04f, -1.036201354e-03f, -1.203102599e-03f, +1.461150555e-03f, +2.110578708e-03f, -1.958702524e-03f, -3.693419733e-03f, +2.502548952e-03f, +6.928461094e-03f, -2.760942598e-03f, -1.766283529e-02f, -1.559525887e-02f, +5.000343093e-03f, +1.948702236e-02f, +1.201738174e-02f, -3.262659615e-03f, -6.286692566e-03f, +9.205208281e-04f, +3.858238810e-03f, -1.386575125e-04f, -2.456625632e-03f, -1.562510821e-04f, +1.547169434e-03f, +2.390578810e-04f, -9.373291153e-04f, -2.221340670e-04f, +5.338031835e-04f, +1.645847664e-04f, -2.783555512e-04f, -1.002063120e-04f, +1.277674190e-04f, +4.700808171e-05f, -4.769294207e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.551525150e-05f, -2.454257125e-05f, +1.508342662e-04f, +8.572907829e-05f, -3.874297558e-04f, -1.384958074e-04f, +7.775662099e-04f, +1.711211164e-04f, -1.334543715e-03f, -1.484504698e-04f, +2.037748604e-03f, +3.542794466e-05f, -2.827765709e-03f, +1.904302771e-04f, +3.611967365e-03f, -5.277348038e-04f, -4.280677796e-03f, +9.455611626e-04f, +4.730384443e-03f, -1.386417312e-03f, -4.887722949e-03f, +1.777991320e-03f, +4.727213046e-03f, -2.050656220e-03f, -4.277369306e-03f, +2.155442434e-03f, +3.613344933e-03f, -2.076766203e-03f, -2.838446164e-03f, +1.835852403e-03f, +2.060186002e-03f, -1.483916041e-03f, -1.367872721e-03f, +1.087586590e-03f, +8.176767188e-04f, -7.114893926e-04f, -4.282141356e-04f, +4.034761595e-04f, +1.861016712e-04f, -1.866147110e-04f, -4.700808171e-05f, +4.769294207e-05f, +0.000000000e+00f, + /* 8,13 (44) */ + +0.000000000e+00f, -5.430502781e-06f, -6.840649893e-04f, -1.245324146e-04f, +1.744196306e-03f, +5.984780117e-04f, -3.490730637e-03f, -1.742007841e-03f, +6.069819167e-03f, +4.023902230e-03f, -9.587059646e-03f, -8.112262196e-03f, +1.412692124e-02f, +1.503725377e-02f, -1.985100360e-02f, -2.671079272e-02f, +2.732513942e-02f, +4.786103340e-02f, -3.883711299e-02f, -9.640055725e-02f, +6.820218374e-02f, +3.672770223e-01f, +4.737716316e-01f, +2.594047022e-01f, -2.237597355e-02f, -9.366793640e-02f, +2.378279796e-03f, +5.234415903e-02f, +3.661296318e-03f, -3.215922744e-02f, -5.501909915e-03f, +1.995109049e-02f, +5.465212517e-03f, -1.201084776e-02f, -4.544448948e-03f, +6.819906305e-03f, +3.306321346e-03f, -3.545881689e-03f, -2.100063522e-03f, +1.618008694e-03f, +1.121809141e-03f, -5.967446031e-04f, -4.483260934e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.430502781e-06f, +6.840649893e-04f, +1.344707961e-04f, -2.553710769e-03f, -3.517517285e-04f, +5.640525020e-03f, +5.103941965e-04f, -1.032972127e-02f, -3.853803383e-04f, +1.660454724e-02f, -2.919208143e-04f, -2.409505562e-02f, +1.747252493e-03f, +3.207494056e-02f, -4.066145701e-03f, -3.955907711e-02f, +7.121612003e-03f, +4.548803195e-02f, -1.055906793e-02f, -4.895524817e-02f, +1.385341638e-02f, +4.941461328e-02f, -1.642799490e-02f, -4.680824735e-02f, +1.780154150e-02f, +4.157684508e-02f, -1.771696373e-02f, -3.455033201e-02f, +1.620994727e-02f, +2.675256998e-02f, -1.359517815e-02f, -1.917784451e-02f, +1.037582618e-02f, +1.260104465e-02f, -7.107356059e-03f, -7.467517812e-03f, +4.260224910e-03f, +3.879574710e-03f, -2.123063457e-03f, -1.665738863e-03f, +5.967446031e-04f, +4.483260934e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.238614251e-05f, +2.988787338e-05f, -9.995883490e-05f, -7.898707982e-05f, +2.161792827e-04f, +1.836050578e-04f, -3.915132464e-04f, -3.813850264e-04f, +6.311675135e-04f, +7.256777112e-04f, -9.329939847e-04f, -1.296050107e-03f, +1.285821334e-03f, +2.229670092e-03f, -1.664642242e-03f, -3.826910903e-03f, +1.995409702e-03f, +7.011546824e-03f, -1.780477243e-03f, -1.703595698e-02f, -1.642657021e-02f, +3.591505477e-03f, +1.921709714e-02f, +1.297319719e-02f, -2.544408182e-03f, -6.539323918e-03f, +4.693393252e-04f, +3.940354256e-03f, +1.530509239e-04f, -2.475871378e-03f, -3.448443249e-04f, +1.541995804e-03f, +3.578843506e-04f, -9.248699457e-04f, -2.936413168e-04f, +5.219194978e-04f, +2.048736546e-04f, -2.700613610e-04f, -1.209264873e-04f, +1.234361062e-04f, +5.633742412e-05f, -4.640993010e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.238614251e-05f, -2.988787338e-05f, +1.390933055e-04f, +1.076330211e-04f, -3.651508023e-04f, -1.902072397e-04f, +7.436511503e-04f, +2.697264117e-04f, -1.291758293e-03f, -3.112387393e-04f, +1.993717300e-03f, +2.758704644e-04f, -2.794594309e-03f, -1.331817181e-04f, +3.604266988e-03f, -1.264254265e-04f, -4.312319161e-03f, +4.838688553e-04f, +4.810825532e-03f, -8.916550208e-04f, -5.019017235e-03f, +1.283182136e-03f, +4.902691787e-03f, -1.588801705e-03f, -4.482514405e-03f, +1.753801711e-03f, +3.828686751e-03f, -1.752595690e-03f, -3.043677248e-03f, +1.594596247e-03f, +2.238310358e-03f, -1.320087845e-03f, -1.508241484e-03f, +9.878083628e-04f, +9.171717255e-04f, -6.586139036e-04f, -4.904672768e-04f, +3.805723284e-04f, +2.192450057e-04f, -1.798468566e-04f, -5.633742412e-05f, +4.640993010e-05f, +0.000000000e+00f, + /* 8,14 (44) */ + +0.000000000e+00f, +2.695563973e-05f, -6.541771159e-04f, -2.244912495e-04f, +1.665209226e-03f, +8.146572943e-04f, -3.307125579e-03f, -2.133521087e-03f, +5.688434141e-03f, +4.655069744e-03f, -8.861381935e-03f, -9.045256180e-03f, +1.283087113e-02f, +1.632307510e-02f, -1.762133351e-02f, -2.837543496e-02f, +2.349822851e-02f, +4.985644310e-02f, -3.182556617e-02f, -9.818103449e-02f, +5.116622676e-02f, +3.508504521e-01f, +4.773631371e-01f, +2.786217994e-01f, -9.402776357e-03f, -9.621234458e-02f, -4.161044122e-03f, +5.281349836e-02f, +7.601650574e-03f, -3.200617651e-02f, -7.977781293e-03f, +1.960624616e-02f, +7.007208321e-03f, -1.165296341e-02f, -5.469318894e-03f, +6.526264988e-03f, +3.828240844e-03f, -3.341008035e-03f, -2.370124883e-03f, +1.497082207e-03f, +1.245245247e-03f, -5.404071790e-04f, -4.947360235e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.695563973e-05f, +6.541771159e-04f, +2.735641016e-04f, -2.446077748e-03f, -7.169025308e-04f, +5.450317780e-03f, +1.254045347e-03f, -1.005999486e-02f, -1.677138632e-03f, +1.629330850e-02f, +1.701796486e-03f, -2.381918515e-02f, -1.047341816e-03f, +3.194175885e-02f, -4.618787135e-04f, -3.968550254e-02f, +2.809292843e-03f, +4.597190081e-02f, -5.748242393e-03f, -4.984690319e-02f, +8.834399142e-03f, +5.069779542e-02f, -1.152530311e-02f, -4.839704905e-02f, +1.331902710e-02f, +4.333064679e-02f, -1.388827698e-02f, -3.630292770e-02f, +1.316627002e-02f, +2.834716623e-02f, -1.135686779e-02f, -2.049793236e-02f, +8.867584699e-03f, +1.358885301e-02f, -6.190184334e-03f, -8.126131716e-03f, +3.769757633e-03f, +4.260147039e-03f, -1.903818451e-03f, -1.845585719e-03f, +5.404071790e-04f, +4.947360235e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.909513156e-05f, +3.456277161e-05f, -9.201382764e-05f, -9.087705687e-05f, +1.990006381e-04f, +2.067708630e-04f, -3.575455993e-04f, -4.201123347e-04f, +5.686890412e-04f, +7.835964559e-04f, -8.243134910e-04f, -1.374690872e-03f, +1.103788633e-03f, +2.325561793e-03f, -1.364116952e-03f, -3.922815420e-03f, +1.487435369e-03f, +7.032366365e-03f, -8.318913589e-04f, -1.633957237e-02f, -1.717067280e-02f, +2.162862672e-03f, +1.884927793e-02f, +1.388975381e-02f, -1.771989956e-03f, -6.743476916e-03f, -6.792324100e-07f, +3.989152634e-03f, +4.517495490e-04f, -2.472885404e-03f, -5.356244570e-04f, +1.522328357e-03f, +4.769486025e-04f, -9.033027300e-04f, -3.647515618e-04f, +5.046039744e-04f, +2.447267536e-04f, -2.587499785e-04f, -1.413909328e-04f, +1.175863630e-04f, +6.561260708e-05f, -4.447000076e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.909513156e-05f, -3.456277161e-05f, +1.265129176e-04f, +1.271457542e-04f, -3.400167222e-04f, -2.377710009e-04f, +7.032381695e-04f, +3.623359676e-04f, -1.236949904e-03f, -4.666398829e-04f, +1.930375961e-03f, +5.086205797e-04f, -2.733648279e-03f, -4.504061946e-04f, +3.560161383e-03f, +2.716382553e-04f, -4.300022554e-03f, +2.064217926e-05f, +4.842134161e-03f, -3.895744136e-04f, -5.099238890e-03f, +7.752124316e-04f, +5.028768897e-03f, -1.108914643e-03f, -4.643243197e-03f, +1.331074280e-03f, +4.007037969e-03f, -1.406553845e-03f, -3.220556109e-03f, +1.332909937e-03f, +2.396651528e-03f, -1.139001349e-03f, -1.636274853e-03f, +8.748938469e-04f, +1.010025620e-03f, -5.968357629e-04f, -5.498599193e-04f, +3.524274318e-04f, +2.516281064e-04f, -1.705338903e-04f, -6.561260708e-05f, +4.447000076e-05f, +0.000000000e+00f, + /* 8,15 (44) */ + +0.000000000e+00f, +5.605077129e-05f, -6.196143443e-04f, -3.165050772e-04f, +1.574332169e-03f, +1.013657932e-03f, -3.100354716e-03f, -2.491066686e-03f, +5.268321806e-03f, +5.223758785e-03f, -8.077785479e-03f, -9.869569671e-03f, +1.145618026e-02f, +1.742686374e-02f, -1.529577171e-02f, -2.973955191e-02f, +1.957541309e-02f, +5.134387847e-02f, -2.479319980e-02f, -9.901292585e-02f, +3.482665439e-02f, +3.336797793e-01f, +4.795259998e-01f, +2.974710773e-01f, +4.486977456e-03f, -9.798433453e-02f, -1.090452104e-02f, +5.281281913e-02f, +1.159080321e-02f, -3.155442696e-02f, -1.045066670e-02f, +1.907062170e-02f, +8.529536678e-03f, -1.117601480e-02f, -6.372621624e-03f, +6.161513426e-03f, +4.332844818e-03f, -3.096281281e-03f, -2.628874861e-03f, +1.355691274e-03f, +1.362831610e-03f, -4.747945719e-04f, -5.392060243e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.605077129e-05f, +6.196143443e-04f, +4.000770192e-04f, -2.318931993e-03f, -1.056919253e-03f, +5.212546779e-03f, +1.957283516e-03f, -9.697658891e-03f, -2.914088535e-03f, +1.582666861e-02f, +3.632172447e-03f, -2.331056457e-02f, -3.780990095e-03f, +3.149135265e-02f, +3.098282669e-03f, -3.941386428e-02f, -1.490729711e-03f, +4.599254299e-02f, -9.061082325e-04f, -5.023647761e-02f, +3.735160252e-03f, +5.147300785e-02f, -6.496534218e-03f, -4.950596369e-02f, +8.675783903e-03f, +4.466172107e-02f, -9.881239015e-03f, -3.770948155e-02f, +9.945713914e-03f, +2.968007616e-02f, -8.960216265e-03f, -2.163693371e-02f, +7.231309846e-03f, +1.446374686e-02f, -5.180158713e-03f, -8.722967479e-03f, +3.219897714e-03f, +4.612574470e-03f, -1.652190345e-03f, -2.016119610e-03f, +4.747945719e-04f, +5.392060243e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.569515524e-05f, +3.855347749e-05f, -8.356404177e-05f, -1.012954305e-04f, +1.806565744e-04f, +2.270679961e-04f, -3.214802361e-04f, -4.536423550e-04f, +5.029857206e-04f, +8.326150558e-04f, -7.113088342e-04f, -1.438709876e-03f, +9.168719580e-04f, +2.398032028e-03f, -1.059950903e-03f, -3.981393558e-03f, +9.829232678e-04f, +6.992952053e-03f, +7.956834231e-05f, -1.557915740e-02f, -1.782422552e-02f, +7.222834590e-04f, +1.838447645e-02f, +1.476051954e-02f, -9.490229708e-04f, -6.895726713e-03f, -4.860173922e-04f, +4.003216328e-03f, +7.549241477e-04f, -2.447072989e-03f, -7.268860082e-04f, +1.487933707e-03f, +5.951362975e-04f, -8.725487992e-04f, -4.347689209e-04f, +4.818346326e-04f, +2.837343586e-04f, -2.444118589e-04f, -1.613767670e-04f, +1.102051290e-04f, +7.472545295e-05f, -4.185484257e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.569515524e-05f, -3.855347749e-05f, +1.132976271e-04f, +1.441699117e-04f, -3.124376673e-04f, -2.808403007e-04f, +6.569929318e-04f, +4.481649702e-04f, -1.171037534e-03f, -6.132254185e-04f, +1.848821109e-03f, +7.314302511e-04f, -2.646049143e-03f, -7.580816744e-04f, +3.480588537e-03f, +6.624116387e-04f, -4.244320116e-03f, -4.393630174e-04f, +4.824253892e-03f, +1.146548538e-04f, -5.127648687e-03f, +2.592907924e-04f, +5.104045782e-03f, -6.158590596e-04f, -4.757638244e-03f, +8.914588966e-04f, +4.146189187e-03f, -1.041971095e-03f, -3.366842708e-03f, +1.053194813e-03f, +2.533177027e-03f, -9.422006148e-04f, -1.750316290e-03f, +7.496963344e-04f, +1.095032644e-03f, -5.265264426e-04f, -6.056212654e-04f, +3.191320079e-04f, +2.828334246e-04f, -1.586424720e-04f, -7.472545295e-05f, +4.185484257e-05f, +0.000000000e+00f, + /* 9, 0 (40) */ + +0.000000000e+00f, -7.017253429e-04f, -1.750424134e-04f, +2.058419758e-03f, -1.982704743e-04f, -4.434814470e-03f, +1.641618436e-03f, +7.968272772e-03f, -5.099884949e-03f, -1.256166394e-02f, +1.191669646e-02f, +1.783553129e-02f, -2.422063161e-02f, -2.315743311e-02f, +4.659175191e-02f, +2.775293222e-02f, -9.501521185e-02f, -3.087432576e-02f, +3.144630653e-01f, +5.319805819e-01f, +3.144630653e-01f, -3.087432576e-02f, -9.501521185e-02f, +2.775293222e-02f, +4.659175191e-02f, -2.315743311e-02f, -2.422063161e-02f, +1.783553129e-02f, +1.191669646e-02f, -1.256166394e-02f, -5.099884949e-03f, +7.968272772e-03f, +1.641618436e-03f, -4.434814470e-03f, -1.982704743e-04f, +2.058419758e-03f, -1.750424134e-04f, -7.017253429e-04f, +1.133055274e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.017253429e-04f, +1.750424134e-04f, -2.819252016e-03f, +1.317047024e-03f, +5.813065763e-03f, -5.638484823e-03f, -8.056056973e-03f, +1.356304760e-02f, +6.644294405e-03f, -2.362138728e-02f, +9.950267494e-04f, +3.194086253e-02f, -1.503480532e-02f, -3.374209658e-02f, +3.210410297e-02f, +2.603063562e-02f, -4.623861285e-02f, -9.813316511e-03f, +5.173229864e-02f, -9.813316511e-03f, -4.623861285e-02f, +2.603063562e-02f, +3.210410297e-02f, -3.374209658e-02f, -1.503480532e-02f, +3.194086253e-02f, +9.950267494e-04f, -2.362138728e-02f, +6.644294405e-03f, +1.356304760e-02f, -8.056056973e-03f, -5.638484823e-03f, +5.813065763e-03f, +1.317047024e-03f, -2.819252016e-03f, +8.373329469e-05f, +7.017253429e-04f, -1.133055274e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.843734294e-05f, -1.214566576e-04f, -7.472014895e-05f, +3.218869068e-04f, +4.469181001e-05f, -6.602637232e-04f, +1.228524648e-04f, +1.155179992e-03f, -5.457330918e-04f, -1.806291018e-03f, +1.393878176e-03f, +2.611918560e-03f, -2.961245233e-03f, -3.660171795e-03f, +6.004267817e-03f, +5.706661215e-03f, -1.414466048e-02f, -2.348852223e-02f, -9.815742514e-04f, +2.295187420e-02f, +1.546450254e-02f, -4.903822234e-03f, -6.553589036e-03f, +3.261396848e-03f, +3.318981920e-03f, -2.420637634e-03f, -1.639950353e-03f, +1.729177185e-03f, +7.072796253e-04f, -1.137512275e-03f, -2.193896372e-04f, +6.680518135e-04f, +5.477384785e-06f, -3.355126957e-04f, +5.377230458e-05f, +1.317810928e-04f, -4.287448115e-05f, -2.973358537e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.843734294e-05f, +1.214566576e-04f, +6.611005247e-05f, -4.953319912e-04f, +1.616505191e-04f, +9.145006501e-04f, -8.057764558e-04f, -1.146118613e-03f, +1.880473749e-03f, +8.100621742e-04f, -3.094701674e-03f, +3.389294331e-04f, +3.899152682e-03f, -2.171261040e-03f, -3.748628172e-03f, +4.130118087e-03f, +2.443118584e-03f, -5.457193385e-03f, -3.156886903e-04f, +5.589460748e-03f, -1.888406059e-03f, -4.477572991e-03f, +3.389085798e-03f, +2.611983874e-03f, -3.769404223e-03f, -7.399153723e-04f, +3.143917298e-03f, -5.342574714e-04f, -2.013366884e-03f, +1.009860492e-03f, +9.358410193e-04f, -8.784127114e-04f, -2.445082970e-04f, +5.043349974e-04f, -3.186974957e-05f, -1.820124374e-04f, +4.287448115e-05f, +2.973358537e-05f, +0.000000000e+00f, + /* 9, 1 (40) */ + +0.000000000e+00f, -6.532880000e-04f, -2.964990710e-04f, +1.983699609e-03f, +1.236164325e-04f, -4.390122660e-03f, +9.813547128e-04f, +8.091125237e-03f, -3.944704957e-03f, -1.310739703e-02f, +1.011040544e-02f, +1.922940947e-02f, -2.160871305e-02f, -2.611867834e-02f, +4.293158011e-02f, +3.375720004e-02f, -8.930855063e-02f, -4.501898624e-02f, +2.909745431e-01f, +5.309990076e-01f, +3.374149395e-01f, -1.540982321e-02f, -9.991903408e-02f, +2.119934318e-02f, +4.985314876e-02f, -1.983845119e-02f, -2.664126924e-02f, +1.619558094e-02f, +1.364587364e-02f, -1.185438431e-02f, -6.237397224e-03f, +7.748883135e-03f, +2.309670250e-03f, -4.429337085e-03f, -5.337831700e-04f, +2.112192063e-03f, -4.326132053e-05f, -7.445998240e-04f, +8.357194200e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.532880000e-04f, +2.964990710e-04f, -2.753141964e-03f, +8.217150332e-04f, +5.974716282e-03f, -4.723984173e-03f, -8.861833429e-03f, +1.241692899e-02f, +8.524768155e-03f, -2.281132511e-02f, -2.099674924e-03f, +3.227979197e-02f, -1.113565264e-02f, -3.591335762e-02f, +2.835547480e-02f, +3.016075371e-02f, -4.379549427e-02f, -1.527050990e-02f, +5.141660995e-02f, -4.223855762e-03f, -4.812701891e-02f, +2.155306263e-02f, +3.549318877e-02f, -3.113011271e-02f, -1.880420955e-02f, +3.120094716e-02f, +4.138944048e-03f, -2.415564475e-02f, +4.630927521e-03f, +1.457290810e-02f, -7.120215954e-03f, -6.516897535e-03f, +5.568557466e-03f, +1.821382022e-03f, -2.851121766e-03f, -9.827914271e-05f, +7.445998240e-04f, -8.357194200e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.294752732e-05f, -1.102371737e-04f, -9.367745324e-05f, +3.051331657e-04f, +9.223178851e-05f, -6.452740583e-04f, +2.840888309e-05f, +1.159326250e-03f, -3.833270077e-04f, -1.861027071e-03f, +1.139975466e-03f, +2.768806560e-03f, -2.582598789e-03f, -4.006358736e-03f, +5.412402635e-03f, +6.415233152e-03f, -1.278083917e-02f, -2.387804682e-02f, -2.938075104e-03f, +2.226991169e-02f, +1.672914678e-02f, -4.010242802e-03f, -7.053008544e-03f, +2.812587184e-03f, +3.651177164e-03f, -2.196044431e-03f, -1.875155598e-03f, +1.629859646e-03f, +8.660702928e-04f, -1.106062470e-03f, -3.169565730e-04f, +6.682608626e-04f, +5.777636716e-05f, -3.456925702e-04f, +3.100013789e-05f, +1.410160841e-04f, -3.626869734e-05f, -3.449908995e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.294752732e-05f, +1.102371737e-04f, +9.746178296e-05f, -4.803221480e-04f, +8.029617568e-05f, +9.376714072e-04f, -6.699201149e-04f, -1.264117719e-03f, +1.727641254e-03f, +1.069656674e-03f, -3.008215065e-03f, -5.954087941e-05f, +3.979018819e-03f, -1.708904058e-03f, -4.058694388e-03f, +3.734171146e-03f, +2.965184200e-03f, -5.257929761e-03f, -9.431245850e-04f, +5.652928597e-03f, -1.307846094e-03f, -4.771847280e-03f, +2.984137637e-03f, +3.025262961e-03f, -3.590713239e-03f, -1.138362217e-03f, +3.154504429e-03f, -2.454207327e-04f, -2.124084753e-03f, +8.565848337e-04f, +1.058200773e-03f, -8.293981165e-04f, -3.278005785e-04f, +5.069019624e-04f, +4.923932350e-06f, -1.949270588e-04f, +3.626869734e-05f, +3.449908995e-05f, +0.000000000e+00f, + /* 9, 2 (40) */ + +0.000000000e+00f, -6.003404726e-04f, -4.067362447e-04f, +1.890022156e-03f, +4.287495982e-04f, -4.297890872e-03f, +3.360806545e-04f, +8.119534120e-03f, -2.785378707e-03f, -1.349072404e-02f, +8.249378367e-03f, +2.036938493e-02f, -1.883990649e-02f, -2.870127713e-02f, +3.892522138e-02f, +3.916960267e-02f, -8.289331748e-02f, -5.779982541e-02f, +2.670964963e-01f, +5.280609325e-01f, +3.596848512e-01f, +1.319323565e-03f, -1.039292769e-01f, +1.414633464e-02f, +5.266573594e-02f, -1.618727402e-02f, -2.883731368e-02f, +1.432042534e-02f, +1.527573329e-02f, -1.098831402e-02f, -7.343459695e-03f, +7.431926562e-03f, +2.977931112e-03f, -4.371560718e-03f, -8.794757402e-04f, +2.143192201e-03f, +9.775476354e-05f, -7.808685214e-04f, +4.907285204e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.003404726e-04f, +4.067362447e-04f, -2.655680181e-03f, +3.413928852e-04f, +6.055012458e-03f, -3.786312766e-03f, -9.531753544e-03f, +1.115281127e-02f, +1.025240941e-02f, -2.174166843e-02f, -5.107889989e-03f, +3.222025109e-02f, -7.156633823e-03f, -3.762226168e-02f, +2.429678041e-02f, +3.389492485e-02f, -4.083031007e-02f, -2.052843966e-02f, +5.047348537e-02f, +1.429072834e-03f, -4.943486501e-02f, +1.678121535e-02f, +3.847732640e-02f, -2.810484974e-02f, -2.239492279e-02f, +3.006258494e-02f, +7.293448477e-03f, -2.440106548e-02f, +2.506842768e-03f, +1.542949293e-02f, -6.062015180e-03f, -7.346295651e-03f, +5.240756887e-03f, +2.328283984e-03f, -2.846197833e-03f, -2.932062015e-04f, +7.808685214e-04f, -4.907285204e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.641075041e-05f, -9.831851840e-05f, -1.105109674e-04f, +2.855936222e-04f, +1.366944058e-04f, -6.235304087e-04f, -6.293841711e-05f, +1.150357134e-03f, -2.219079595e-04f, -1.893466033e-03f, +8.812751314e-04f, +2.890626324e-03f, -2.187758567e-03f, -4.298026076e-03f, +4.785522207e-03f, +7.026922587e-03f, -1.138439549e-02f, -2.411978892e-02f, -4.874687612e-03f, +2.144558744e-02f, +1.792761201e-02f, -3.030348290e-03f, -7.495415680e-03f, +2.316909459e-03f, +3.953336330e-03f, -1.939624746e-03f, -2.096488373e-03f, +1.508772975e-03f, +1.020179643e-03f, -1.060723315e-03f, -4.144389719e-04f, +6.605907798e-04f, +1.116586147e-04f, -3.521379039e-04f, +6.602181892e-06f, +1.489715196e-04f, -2.864594131e-05f, -3.913447055e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.641075041e-05f, +9.831851840e-05f, +1.256487669e-04f, -4.597976294e-04f, +1.450451870e-06f, +9.481045615e-04f, -5.301994246e-04f, -1.362887090e-03f, +1.557305195e-03f, +1.310139011e-03f, -2.886262616e-03f, -4.505553522e-04f, +4.008706317e-03f, -1.230929462e-03f, -4.315874755e-03f, +3.295000408e-03f, +3.448245579e-03f, -4.994314020e-03f, -1.558786322e-03f, +5.646659450e-03f, -7.085952003e-04f, -5.008896046e-03f, +2.538468262e-03f, +3.405572999e-03f, -3.364659660e-03f, -1.529164760e-03f, +3.125579499e-03f, +5.302961668e-05f, -2.210626144e-03f, +6.877948014e-04f, +1.170983701e-03f, -7.676237739e-04f, -4.104073217e-04f, +5.026758498e-04f, +4.387886421e-05f, -2.058395148e-04f, +2.864594131e-05f, +3.913447055e-05f, +0.000000000e+00f, + /* 9, 3 (40) */ + +0.000000000e+00f, -5.439297222e-04f, -5.050547631e-04f, +1.779511189e-03f, +7.143432204e-04f, -4.161196466e-03f, -2.874497542e-04f, +8.056595703e-03f, -1.635021573e-03f, -1.371263200e-02f, +6.355912334e-03f, +2.125066007e-02f, -1.594928017e-02f, -3.088903570e-02f, +3.462719530e-02f, +4.395512488e-02f, -7.586639489e-02f, -6.918422090e-02f, +2.429767073e-01f, +5.231862449e-01f, +3.811304387e-01f, +1.924693557e-02f, -1.069596252e-01f, +6.650918960e-03f, +5.498264540e-02f, -1.223393769e-02f, -3.077693842e-02f, +1.222393697e-02f, +1.678450626e-02f, -9.968134376e-03f, -8.404183010e-03f, +7.017487590e-03f, +3.638521892e-03f, -4.259902104e-03f, -1.231613644e-03f, +2.149794383e-03f, +2.467262831e-04f, -8.095144627e-04f, +9.938381493e-06f, +0.000000000e+00f, + +0.000000000e+00f, +5.439297222e-04f, +5.050547631e-04f, -2.530031414e-03f, -1.184047442e-04f, +6.056462910e-03f, -2.838208205e-03f, -1.006195297e-02f, +9.789924182e-03f, +1.180971460e-02f, -2.043152942e-02f, -7.994152605e-03f, +3.176969573e-02f, -3.147927506e-03f, -3.885319114e-02f, +1.998090565e-02f, +3.718992526e-02f, -3.738206449e-02f, -2.552275368e-02f, +4.891469905e-02f, +7.075732284e-03f, -5.014346021e-02f, +1.177231930e-02f, +4.101579467e-02f, -2.469927675e-02f, -2.575958245e-02f, +2.853342018e-02f, +1.041902798e-02f, -2.434803587e-02f, +2.962166243e-04f, +1.611728773e-02f, -4.891031479e-03f, -8.113919425e-03f, +4.830349566e-03f, +2.830959834e-03f, -2.802318969e-03f, -4.990457162e-04f, +8.095144627e-04f, -9.938381493e-06f, +0.000000000e+00f, + +0.000000000e+00f, +5.884729198e-05f, -8.589535914e-05f, -1.251206083e-04f, +2.636293693e-04f, +1.776862090e-04f, -5.955426518e-04f, -1.502574751e-04f, +1.128814840e-03f, -6.325339340e-05f, -1.903934920e-03f, +6.207732291e-04f, +2.977103677e-03f, -1.781472607e-03f, -4.533865761e-03f, +4.131250132e-03f, +7.540028922e-03f, -9.966725522e-03f, -2.421423541e-02f, -6.778334413e-03f, +2.048298182e-02f, +1.904925260e-02f, -1.969441845e-03f, -7.874022257e-03f, +1.778128844e-03f, +4.221154537e-03f, -1.653264841e-03f, -2.301008985e-03f, +1.366615154e-03f, +1.167674654e-03f, -1.001547249e-03f, -5.106836993e-04f, +6.448254091e-04f, +1.665354586e-04f, -3.545943872e-04f, -1.919183145e-05f, +1.554644473e-04f, -2.004887603e-05f, -4.355134276e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.884729198e-05f, +8.589535914e-05f, +1.504549592e-04f, -4.343038303e-04f, -7.395648112e-05f, +9.461414043e-04f, -3.885302033e-04f, -1.441731981e-03f, +1.372064648e-03f, +1.528915007e-03f, -2.731065440e-03f, -8.293498011e-04f, +3.988557310e-03f, -7.434815445e-04f, -4.517457818e-03f, +2.818382716e-03f, +3.886466567e-03f, -4.669795535e-03f, -2.154991477e-03f, +5.570595356e-03f, -9.807683830e-05f, -5.185374127e-03f, +2.057321567e-03f, +3.747747485e-03f, -3.093451758e-03f, -1.907233017e-03f, +3.056753389e-03f, +3.574748264e-04f, -2.271257013e-03f, +5.052423525e-04f, +1.272385676e-03f, -6.934369816e-04f, -4.911712416e-04f, +4.913803271e-04f, +8.454905082e-05f, -2.144429117e-04f, +2.004887603e-05f, +4.355134276e-05f, +0.000000000e+00f, + /* 9, 4 (40) */ + +0.000000000e+00f, -4.850824302e-04f, -5.909501222e-04f, +1.654390580e-03f, +9.779725896e-04f, -3.983510257e-03f, -8.829924060e-04f, +7.906338228e-03f, -5.062067334e-04f, -1.377588539e-02f, +4.451977414e-03f, +2.187143329e-02f, -1.297217649e-02f, -3.267050830e-02f, +3.009332954e-02f, +4.808637501e-02f, -6.832636597e-02f, -7.915094642e-02f, +2.187624719e-01f, +5.164079105e-01f, +4.016134205e-01f, +3.829618817e-02f, -1.089290670e-01f, -1.223103297e-03f, +5.676077424e-02f, -8.012783156e-03f, -3.243020326e-02f, +9.922927981e-03f, +1.815112142e-02f, -8.800459722e-03f, -9.405730259e-03f, +6.506803891e-03f, +4.283347301e-03f, -4.093366645e-03f, -1.586208031e-03f, +2.130602551e-03f, +4.021907304e-04f, -8.295633387e-04f, -3.361296126e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.850824302e-04f, +5.909501222e-04f, -2.379576454e-03f, -5.527085745e-04f, +5.982506429e-03f, -1.892066800e-03f, -1.045048317e-02f, +8.348192201e-03f, +1.318177925e-02f, -1.890261442e-02f, -1.072521805e-02f, +3.094034593e-02f, +8.406298037e-04f, -3.959667268e-02f, +1.546344784e-02f, +4.000830798e-02f, -3.349559792e-02f, -3.019254921e-02f, +4.675970757e-02f, +1.264632764e-02f, -5.024153705e-02f, +6.586945176e-03f, +4.307311623e-02f, -2.095152926e-02f, -2.885303420e-02f, +2.662618717e-02f, +1.347578136e-02f, -2.399056104e-02f, -1.975040388e-03f, +1.662253008e-02f, -3.618645803e-03f, -8.807356407e-03f, +4.339178324e-03f, +3.322340161e-03f, -2.717769918e-03f, -7.134886279e-04f, +8.295633387e-04f, +3.361296126e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.029092420e-05f, -7.315860199e-05f, -1.374392209e-04f, +2.396151739e-04f, +2.148710507e-04f, -5.618746480e-04f, -2.326955049e-04f, +1.095367052e-03f, +9.094642695e-05f, -1.892996117e-03f, +3.613969454e-04f, +3.028357154e-03f, -1.368469826e-03f, -4.713188790e-03f, +3.457229605e-03f, +7.953761608e-03f, -8.539166431e-03f, -2.416300508e-02f, -8.636208704e-03f, +1.938727657e-02f, +2.008385485e-02f, -8.336748150e-04f, -8.182436481e-03f, +1.200587652e-03f, +4.450568768e-03f, -1.339242186e-03f, -2.485878817e-03f, +1.204347512e-03f, +1.306637052e-03f, -9.287510517e-04f, -6.045112890e-04f, +6.208382892e-04f, +2.217817538e-04f, -3.528467708e-04f, -4.612255583e-05f, +1.603219883e-04f, -1.053717489e-05f, -4.765899818e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.029092420e-05f, +7.315860199e-05f, +1.717246052e-04f, -4.044293024e-04f, -1.450792578e-04f, +9.322746214e-04f, -2.467916037e-04f, -1.500235027e-03f, +1.174644097e-03f, +1.723725133e-03f, -2.545224130e-03f, -1.191394320e-03f, +3.919539164e-03f, -2.527524175e-04f, -4.661458564e-03f, +2.310526380e-03f, +4.274604149e-03f, -4.288582946e-03f, -2.724305859e-03f, +5.425560317e-03f, +5.161124881e-04f, -5.298683465e-03f, +1.546438148e-03f, +4.047049349e-03f, -2.779905960e-03f, -2.267558771e-03f, +2.948145751e-03f, +6.641392795e-04f, -2.304540143e-03f, +3.109115906e-04f, +1.360697223e-03f, -6.073670260e-04f, -5.689127526e-04f, +4.728274703e-04f, +1.264386833e-04f, -2.204480988e-04f, +1.053717489e-05f, +4.765899818e-05f, +0.000000000e+00f, + /* 9, 5 (40) */ + +0.000000000e+00f, -4.247915060e-04f, -6.641087242e-04f, +1.516951359e-03f, +1.217587764e-03f, -3.768639206e-03f, -1.444867054e-03f, +7.673642723e-03f, +5.891603182e-04f, -1.368493896e-02f, +2.558981297e-03f, +2.223283024e-02f, -9.943819336e-03f, -3.403897813e-02f, +2.538014075e-02f, +5.154360462e-02f, -6.037260436e-02f, -8.769011285e-02f, +1.945994668e-01f, +5.077717018e-01f, +4.210006970e-01f, +5.838004303e-02f, -1.097627418e-01f, -9.405539777e-03f, +5.796136190e-02f, -3.562214389e-03f, -3.376944545e-02f, +7.437049164e-03f, +1.935546893e-02f, -7.493822670e-03f, -1.033448131e-02f, +5.902292602e-03f, +4.904185590e-03f, -3.871584891e-03f, -1.939054802e-03f, +2.084479995e-03f, +5.625127187e-04f, -8.401005136e-04f, -8.127195944e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.247915060e-04f, +6.641087242e-04f, -2.207851849e-03f, -9.571378768e-04f, +5.837427171e-03f, -9.597921789e-04f, -1.069727478e-02f, +6.847957174e-03f, +1.435642335e-02f, -1.717888928e-02f, -1.327044218e-02f, +2.974895161e-02f, +4.760168967e-03f, -3.984942510e-02f, +1.080198927e-02f, +4.231883436e-02f, -2.922099377e-02f, -3.448113216e-02f, +4.403540171e-02f, +1.807188796e-02f, -4.972542456e-02f, +1.288261711e-03f, +4.461955438e-02f, -1.690447991e-02f, -3.163294016e-02f, +2.435862839e-02f, +1.642392712e-02f, -2.332642176e-02f, -4.279580531e-03f, +1.693344167e-02f, -2.257948580e-03f, -9.414723433e-03f, +3.770265571e-03f, +3.795167631e-03f, -2.591331235e-03f, -9.339367267e-04f, +8.401005136e-04f, +8.127195944e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.078769928e-05f, -6.029301021e-05f, -1.474319237e-04f, +2.139342490e-04f, +2.479719027e-04f, -5.231355844e-04f, -3.094861283e-04f, +1.050795193e-03f, +2.391049255e-04f, -1.861434083e-03f, +1.059742262e-04f, +3.044885542e-03f, -9.534103962e-04f, -4.835914568e-03f, +2.771049618e-03f, +8.268226991e-03f, -7.112900121e-03f, -2.396882485e-02f, -1.043587901e-02f, +1.816471880e-02f, +2.102173053e-02f, +3.699912449e-04f, -8.414734600e-03f, +5.891775115e-04f, +4.637808794e-03f, -1.000211628e-03f, -2.648395422e-03f, +1.023191644e-03f, +1.435186128e-03f, -8.427186704e-04f, -6.947291882e-04f, +5.885975143e-04f, +2.767422258e-04f, -3.467232978e-04f, -7.390308195e-05f, +1.633842487e-04f, -1.875827134e-07f, -5.136572648e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.078769928e-05f, +6.029301021e-05f, +1.893614946e-04f, -3.707954872e-04f, -2.111655490e-04f, +9.071362565e-04f, -1.068023210e-04f, -1.538253905e-03f, +9.678548124e-04f, +1.892666405e-03f, -2.331677985e-03f, -1.532447546e-03f, +3.803223330e-03f, +2.350976400e-04f, -4.746637006e-03f, +1.777989004e-03f, +4.608072432e-03f, -3.855588534e-03f, -3.259638268e-03f, +5.213251324e-03f, +1.126299759e-03f, -5.347011066e-03f, +1.011985686e-03f, +4.299236737e-03f, -2.427418426e-03f, -2.605282082e-03f, +2.800392844e-03f, +9.691369591e-04f, -2.309361504e-03f, +1.069985000e-04f, +1.434329790e-03f, -5.101242715e-04f, -6.424458079e-04f, +4.469244867e-04f, +1.690071554e-04f, -2.235893425e-04f, +1.875827134e-07f, +5.136572648e-05f, +0.000000000e+00f, + /* 9, 6 (40) */ + +0.000000000e+00f, -3.640038068e-04f, -7.244017344e-04f, +1.369519436e-03f, +1.431522013e-03f, -3.520667303e-03f, -1.968002638e-03f, +7.364156595e-03f, +1.639955511e-03f, -1.344583404e-02f, +6.975472133e-04f, +2.233880447e-02f, -6.898933795e-03f, -3.499238852e-02f, +2.054422618e-02f, +5.431465423e-02f, -5.210437737e-02f, -9.480301297e-02f, +1.706306420e-01f, +4.973358228e-01f, +4.391654158e-01f, +7.940177356e-02f, -1.093927506e-01f, -1.782027438e-02f, +5.855053941e-02f, +1.075594405e-03f, -3.476965708e-02f, +4.788653743e-03f, +2.037866057e-02f, -6.058636542e-03f, -1.117719998e-02f, +5.207563414e-03f, +5.492783105e-03f, -3.594842665e-03f, -2.285778100e-03f, +2.010576913e-03f, +7.258969674e-04f, -8.402880963e-04f, -1.326376859e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.640038068e-04f, +7.244017344e-04f, -2.018490355e-03f, -1.327933364e-03f, +5.626261622e-03f, -5.265592234e-05f, -1.080407710e-02f, +5.309703269e-03f, +1.532427816e-02f, -1.528622288e-02f, -1.560212016e-02f, +2.821650407e-02f, +8.563392298e-03f, -3.961432746e-02f, +6.055352266e-03f, +4.409682336e-02f, -2.461292134e-02f, -3.833672069e-02f, +4.077576344e-02f, +2.328513928e-02f, -4.859912480e-02f, -4.058749355e-03f, +4.563154007e-02f, -1.260524317e-02f, -3.406035859e-02f, +2.175334631e-02f, +1.922431996e-02f, -2.235728480e-02f, -6.588942035e-03f, +1.704044017e-02f, -8.236187902e-04f, -9.924847704e-03f, +3.127819764e-03f, +4.242092118e-03f, -2.422324079e-03f, -1.157526069e-03f, +8.402880963e-04f, +1.326376859e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.039462004e-05f, -4.747501713e-05f, -1.550950630e-04f, +1.869731319e-04f, +2.767718783e-04f, -4.799710815e-04f, -3.799553483e-04f, +9.959817384e-04f, +3.797540378e-04f, -1.810239943e-03f, -1.427946417e-04f, +3.027551634e-03f, -5.408381760e-04f, -4.902554350e-03f, +2.080173389e-03f, +8.484407056e-03f, -5.698859645e-03f, -2.363549640e-02f, -1.216539056e-02f, +1.682257546e-02f, +2.185380679e-02f, +1.633830746e-03f, -8.565529567e-03f, -5.069476091e-05f, +4.779446351e-03f, -6.391869980e-04f, -2.786027072e-03f, +8.246232333e-04f, +1.551501823e-03f, -7.440021563e-04f, -7.801456050e-04f, +5.481696044e-04f, +3.307384398e-04f, -3.360997572e-04f, -1.022214475e-04f, +1.645071892e-04f, +1.090627139e-05f, -5.458022250e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.039462004e-05f, +4.747501713e-05f, +2.033273582e-04f, -3.340464162e-04f, -2.715626713e-04f, +8.714841796e-04f, +2.970164573e-05f, -1.555915397e-03f, +7.545560368e-04f, +2.034209142e-03f, -2.093660601e-03f, -1.848606288e-03f, +3.641756681e-03f, +7.140185025e-04f, -4.772506982e-03f, +1.227591396e-03f, +4.882997857e-03f, -3.376363675e-03f, -3.754330776e-03f, +4.936218116e-03f, +1.724833323e-03f, -5.329357022e-03f, +4.604832095e-04f, +4.500623034e-03f, -2.039928659e-03f, -2.915756870e-03f, +2.614648660e-03f, +1.268520358e-03f, -2.284952881e-03f, -1.041127549e-04f, +1.491841141e-03f, -4.025966696e-04f, -7.105944377e-04f, +4.136793152e-04f, +2.116750094e-04f, -2.236299197e-04f, -1.090627139e-05f, +5.458022250e-05f, +0.000000000e+00f, + /* 9, 7 (40) */ + +0.000000000e+00f, -3.036091867e-04f, -7.718767515e-04f, +1.214424373e-03f, +1.618495145e-03f, -3.243895425e-03f, -2.447973720e-03f, +6.984201246e-03f, +2.635937250e-03f, -1.306608000e-02f, -1.112692730e-03f, +2.219600982e-02f, -3.871382161e-03f, -3.553322670e-02f, +1.564167183e-02f, +5.639482762e-02f, -4.361997031e-02f, -1.005018726e-01f, +1.469951456e-01f, +4.851704322e-01f, +4.559879913e-01f, +1.012555804e-01f, -1.077589198e-01f, -2.638580394e-02f, +5.849984465e-02f, +5.855040756e-03f, -3.540884407e-02f, +2.002626671e-03f, +2.120328381e-02f, -4.507134719e-03f, -1.192120214e-02f, +4.427417809e-03f, +6.040952709e-03f, -3.264104226e-03f, -2.621877857e-03f, +1.908355466e-03f, +8.904041566e-04f, -8.293818249e-04f, -1.872179084e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.036091867e-04f, +7.718767515e-04f, -1.815162996e-03f, -1.661979780e-03f, +5.354698950e-03f, +8.188282573e-04f, -1.077437545e-02f, +3.753787872e-03f, +1.607883420e-02f, -1.325201374e-02f, -1.769578076e-02f, +2.636789778e-02f, +1.220514898e-02f, -3.890030896e-02f, +1.282845284e-03f, +4.532441476e-02f, -1.972992349e-02f, -4.171308437e-02f, +3.702143267e-02f, +2.822135740e-02f, -4.687429148e-02f, -9.388106377e-03f, +4.609202328e-02f, -8.104620140e-03f, -3.610028725e-02f, +1.883758944e-02f, +2.183896862e-02f, -2.108876444e-02f, -8.873894916e-03f, +1.693632742e-02f, +6.682223505e-04f, -1.032744437e-02f, +2.417225326e-03f, +4.655771433e-03f, -2.210649070e-03f, -1.381155989e-03f, +8.293818249e-04f, +1.872179084e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.917821755e-05f, -3.487075517e-05f, -1.604548066e-04f, +1.591167301e-04f, +3.011144788e-04f, -4.330541809e-04f, -4.435262341e-04f, +9.318967466e-04f, +5.115572318e-04f, -1.740594197e-03f, -3.823632391e-04f, +2.977562468e-03f, -1.351356408e-04f, -4.914189081e-03f, +1.391869640e-03f, +8.604130417e-03f, -4.307639135e-03f, -2.316785366e-02f, -1.381336228e-02f, +1.536907865e-02f, +2.257171159e-02f, +2.949408088e-03f, -8.630035953e-03f, -7.131473829e-04f, +4.872441994e-03f, -2.595182674e-04f, -2.896446364e-03f, +6.103627797e-04f, +1.653847792e-03f, -6.333206296e-04f, -8.595838121e-04f, +4.997223034e-04f, +3.830763249e-04f, -3.209030892e-04f, -1.307435912e-04f, +1.635654095e-04f, +2.263431824e-05f, -5.721306075e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.917821755e-05f, +3.487075517e-05f, +2.136394716e-04f, -2.948385299e-04f, -3.257225426e-04f, +8.261872995e-04f, +1.610874226e-04f, -1.553606028e-03f, +5.376164940e-04f, +2.147208443e-03f, -1.834652463e-03f, -2.136349946e-03f, +3.437825781e-03f, +1.178146185e-03f, -4.739335150e-03f, +6.663286819e-04f, +5.096264962e-03f, -2.857026236e-03f, -4.202243378e-03f, +4.597831892e-03f, +2.304180875e-03f, -5.245552147e-03f, -1.012798371e-04f, +4.648130273e-03f, -1.621875525e-03f, -3.194614682e-03f, +2.392579214e-03f, +1.558331221e-03f, -2.230910377e-03f, -3.198767271e-04f, +1.531959494e-03f, -2.858436540e-04f, -7.722097691e-04f, +3.732049744e-04f, +2.538307599e-04f, -2.203675361e-04f, -2.263431824e-05f, +5.721306075e-05f, +0.000000000e+00f, + /* 9, 8 (40) */ + +0.000000000e+00f, -2.444309692e-04f, -8.067475067e-04f, +1.053969566e-03f, +1.777611875e-03f, -2.942780946e-03f, -2.881027901e-03f, +6.540675012e-03f, +3.567833996e-03f, -1.255452277e-02f, -2.853286927e-03f, +2.181364659e-02f, -8.938196926e-04f, -3.566836234e-02f, +1.072748275e-02f, +5.778669726e-02f, -3.501583990e-02f, -1.048095118e-01f, +1.238272919e-01f, +4.713570699e-01f, +4.713570699e-01f, +1.238272919e-01f, -1.048095118e-01f, -3.501583990e-02f, +5.778669726e-02f, +1.072748275e-02f, -3.566836234e-02f, -8.938196926e-04f, +2.181364659e-02f, -2.853286927e-03f, -1.255452277e-02f, +3.567833996e-03f, +6.540675012e-03f, -2.881027901e-03f, -2.942780946e-03f, +1.777611875e-03f, +1.053969566e-03f, -8.067475067e-04f, -2.444309692e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.444309692e-04f, +8.067475067e-04f, -1.601523525e-03f, -1.956818310e-03f, +5.028976408e-03f, +1.645015557e-03f, -1.061328803e-02f, +2.200181844e-03f, +1.661645069e-02f, -1.110480529e-02f, -1.953043322e-02f, +2.423154783e-02f, +1.564297476e-02f, -3.772216277e-02f, -3.456489867e-03f, +4.599074344e-02f, -1.463365852e-02f, -4.457011060e-02f, +3.281918929e-02f, +3.281918929e-02f, -4.457011060e-02f, -1.463365852e-02f, +4.599074344e-02f, -3.456489867e-03f, -3.772216277e-02f, +1.564297476e-02f, +2.423154783e-02f, -1.953043322e-02f, -1.110480529e-02f, +1.661645069e-02f, +2.200181844e-03f, -1.061328803e-02f, +1.645015557e-03f, +5.028976408e-03f, -1.956818310e-03f, -1.601523525e-03f, +8.067475067e-04f, +2.444309692e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.721306075e-05f, -2.263431824e-05f, -1.635654095e-04f, +1.307435912e-04f, +3.209030892e-04f, -3.830763249e-04f, -4.997223034e-04f, +8.595838121e-04f, +6.333206296e-04f, -1.653847792e-03f, -6.103627797e-04f, +2.896446364e-03f, +2.595182674e-04f, -4.872441994e-03f, +7.131473829e-04f, +8.630035953e-03f, -2.949408088e-03f, -2.257171159e-02f, -1.536907865e-02f, +1.381336228e-02f, +2.316785366e-02f, +4.307639135e-03f, -8.604130417e-03f, -1.391869640e-03f, +4.914189081e-03f, +1.351356408e-04f, -2.977562468e-03f, +3.823632391e-04f, +1.740594197e-03f, -5.115572318e-04f, -9.318967466e-04f, +4.435262341e-04f, +4.330541809e-04f, -3.011144788e-04f, -1.591167301e-04f, +1.604548066e-04f, +3.487075517e-05f, -5.917821755e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.721306075e-05f, +2.263431824e-05f, +2.203675361e-04f, -2.538307599e-04f, -3.732049744e-04f, +7.722097691e-04f, +2.858436540e-04f, -1.531959494e-03f, +3.198767271e-04f, +2.230910377e-03f, -1.558331221e-03f, -2.392579214e-03f, +3.194614682e-03f, +1.621875525e-03f, -4.648130273e-03f, +1.012798371e-04f, +5.245552147e-03f, -2.304180875e-03f, -4.597831892e-03f, +4.202243378e-03f, +2.857026236e-03f, -5.096264962e-03f, -6.663286819e-04f, +4.739335150e-03f, -1.178146185e-03f, -3.437825781e-03f, +2.136349946e-03f, +1.834652463e-03f, -2.147208443e-03f, -5.376164940e-04f, +1.553606028e-03f, -1.610874226e-04f, -8.261872995e-04f, +3.257225426e-04f, +2.948385299e-04f, -2.136394716e-04f, -3.487075517e-05f, +5.917821755e-05f, +0.000000000e+00f, + /* 9, 9 (40) */ + +0.000000000e+00f, -1.872179084e-04f, -8.293818249e-04f, +8.904041566e-04f, +1.908355466e-03f, -2.621877857e-03f, -3.264104226e-03f, +6.040952709e-03f, +4.427417809e-03f, -1.192120214e-02f, -4.507134719e-03f, +2.120328381e-02f, +2.002626671e-03f, -3.540884407e-02f, +5.855040756e-03f, +5.849984465e-02f, -2.638580394e-02f, -1.077589198e-01f, +1.012555804e-01f, +4.559879913e-01f, +4.851704322e-01f, +1.469951456e-01f, -1.005018726e-01f, -4.361997031e-02f, +5.639482762e-02f, +1.564167183e-02f, -3.553322670e-02f, -3.871382161e-03f, +2.219600982e-02f, -1.112692730e-03f, -1.306608000e-02f, +2.635937250e-03f, +6.984201246e-03f, -2.447973720e-03f, -3.243895425e-03f, +1.618495145e-03f, +1.214424373e-03f, -7.718767515e-04f, -3.036091867e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.872179084e-04f, +8.293818249e-04f, -1.381155989e-03f, -2.210649070e-03f, +4.655771433e-03f, +2.417225326e-03f, -1.032744437e-02f, +6.682223505e-04f, +1.693632742e-02f, -8.873894916e-03f, -2.108876444e-02f, +2.183896862e-02f, +1.883758944e-02f, -3.610028725e-02f, -8.104620140e-03f, +4.609202328e-02f, -9.388106377e-03f, -4.687429148e-02f, +2.822135740e-02f, +3.702143267e-02f, -4.171308437e-02f, -1.972992349e-02f, +4.532441476e-02f, +1.282845284e-03f, -3.890030896e-02f, +1.220514898e-02f, +2.636789778e-02f, -1.769578076e-02f, -1.325201374e-02f, +1.607883420e-02f, +3.753787872e-03f, -1.077437545e-02f, +8.188282573e-04f, +5.354698950e-03f, -1.661979780e-03f, -1.815162996e-03f, +7.718767515e-04f, +3.036091867e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.458022250e-05f, -1.090627139e-05f, -1.645071892e-04f, +1.022214475e-04f, +3.360997572e-04f, -3.307384398e-04f, -5.481696044e-04f, +7.801456050e-04f, +7.440021563e-04f, -1.551501823e-03f, -8.246232333e-04f, +2.786027072e-03f, +6.391869980e-04f, -4.779446351e-03f, +5.069476091e-05f, +8.565529567e-03f, -1.633830746e-03f, -2.185380679e-02f, -1.682257546e-02f, +1.216539056e-02f, +2.363549640e-02f, +5.698859645e-03f, -8.484407056e-03f, -2.080173389e-03f, +4.902554350e-03f, +5.408381760e-04f, -3.027551634e-03f, +1.427946417e-04f, +1.810239943e-03f, -3.797540378e-04f, -9.959817384e-04f, +3.799553483e-04f, +4.799710815e-04f, -2.767718783e-04f, -1.869731319e-04f, +1.550950630e-04f, +4.747501713e-05f, -6.039462004e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.458022250e-05f, +1.090627139e-05f, +2.236299197e-04f, -2.116750094e-04f, -4.136793152e-04f, +7.105944377e-04f, +4.025966696e-04f, -1.491841141e-03f, +1.041127549e-04f, +2.284952881e-03f, -1.268520358e-03f, -2.614648660e-03f, +2.915756870e-03f, +2.039928659e-03f, -4.500623034e-03f, -4.604832095e-04f, +5.329357022e-03f, -1.724833323e-03f, -4.936218116e-03f, +3.754330776e-03f, +3.376363675e-03f, -4.882997857e-03f, -1.227591396e-03f, +4.772506982e-03f, -7.140185025e-04f, -3.641756681e-03f, +1.848606288e-03f, +2.093660601e-03f, -2.034209142e-03f, -7.545560368e-04f, +1.555915397e-03f, -2.970164573e-05f, -8.714841796e-04f, +2.715626713e-04f, +3.340464162e-04f, -2.033273582e-04f, -4.747501713e-05f, +6.039462004e-05f, +0.000000000e+00f, + /* 9,10 (40) */ + +0.000000000e+00f, -1.326376859e-04f, -8.402880963e-04f, +7.258969674e-04f, +2.010576913e-03f, -2.285778100e-03f, -3.594842665e-03f, +5.492783105e-03f, +5.207563414e-03f, -1.117719998e-02f, -6.058636542e-03f, +2.037866057e-02f, +4.788653743e-03f, -3.476965708e-02f, +1.075594405e-03f, +5.855053941e-02f, -1.782027438e-02f, -1.093927506e-01f, +7.940177356e-02f, +4.391654158e-01f, +4.973358228e-01f, +1.706306420e-01f, -9.480301297e-02f, -5.210437737e-02f, +5.431465423e-02f, +2.054422618e-02f, -3.499238852e-02f, -6.898933795e-03f, +2.233880447e-02f, +6.975472133e-04f, -1.344583404e-02f, +1.639955511e-03f, +7.364156595e-03f, -1.968002638e-03f, -3.520667303e-03f, +1.431522013e-03f, +1.369519436e-03f, -7.244017344e-04f, -3.640038068e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.326376859e-04f, +8.402880963e-04f, -1.157526069e-03f, -2.422324079e-03f, +4.242092118e-03f, +3.127819764e-03f, -9.924847704e-03f, -8.236187902e-04f, +1.704044017e-02f, -6.588942035e-03f, -2.235728480e-02f, +1.922431996e-02f, +2.175334631e-02f, -3.406035859e-02f, -1.260524317e-02f, +4.563154007e-02f, -4.058749355e-03f, -4.859912480e-02f, +2.328513928e-02f, +4.077576344e-02f, -3.833672069e-02f, -2.461292134e-02f, +4.409682336e-02f, +6.055352266e-03f, -3.961432746e-02f, +8.563392298e-03f, +2.821650407e-02f, -1.560212016e-02f, -1.528622288e-02f, +1.532427816e-02f, +5.309703269e-03f, -1.080407710e-02f, -5.265592234e-05f, +5.626261622e-03f, -1.327933364e-03f, -2.018490355e-03f, +7.244017344e-04f, +3.640038068e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.136572648e-05f, +1.875827134e-07f, -1.633842487e-04f, +7.390308195e-05f, +3.467232978e-04f, -2.767422258e-04f, -5.885975143e-04f, +6.947291882e-04f, +8.427186704e-04f, -1.435186128e-03f, -1.023191644e-03f, +2.648395422e-03f, +1.000211628e-03f, -4.637808794e-03f, -5.891775115e-04f, +8.414734600e-03f, -3.699912449e-04f, -2.102173053e-02f, -1.816471880e-02f, +1.043587901e-02f, +2.396882485e-02f, +7.112900121e-03f, -8.268226991e-03f, -2.771049618e-03f, +4.835914568e-03f, +9.534103962e-04f, -3.044885542e-03f, -1.059742262e-04f, +1.861434083e-03f, -2.391049255e-04f, -1.050795193e-03f, +3.094861283e-04f, +5.231355844e-04f, -2.479719027e-04f, -2.139342490e-04f, +1.474319237e-04f, +6.029301021e-05f, -6.078769928e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.136572648e-05f, -1.875827134e-07f, +2.235893425e-04f, -1.690071554e-04f, -4.469244867e-04f, +6.424458079e-04f, +5.101242715e-04f, -1.434329790e-03f, -1.069985000e-04f, +2.309361504e-03f, -9.691369591e-04f, -2.800392844e-03f, +2.605282082e-03f, +2.427418426e-03f, -4.299236737e-03f, -1.011985686e-03f, +5.347011066e-03f, -1.126299759e-03f, -5.213251324e-03f, +3.259638268e-03f, +3.855588534e-03f, -4.608072432e-03f, -1.777989004e-03f, +4.746637006e-03f, -2.350976400e-04f, -3.803223330e-03f, +1.532447546e-03f, +2.331677985e-03f, -1.892666405e-03f, -9.678548124e-04f, +1.538253905e-03f, +1.068023210e-04f, -9.071362565e-04f, +2.111655490e-04f, +3.707954872e-04f, -1.893614946e-04f, -6.029301021e-05f, +6.078769928e-05f, +0.000000000e+00f, + /* 9,11 (40) */ + +0.000000000e+00f, -8.127195944e-05f, -8.401005136e-04f, +5.625127187e-04f, +2.084479995e-03f, -1.939054802e-03f, -3.871584891e-03f, +4.904185590e-03f, +5.902292602e-03f, -1.033448131e-02f, -7.493822670e-03f, +1.935546893e-02f, +7.437049164e-03f, -3.376944545e-02f, -3.562214389e-03f, +5.796136190e-02f, -9.405539777e-03f, -1.097627418e-01f, +5.838004303e-02f, +4.210006970e-01f, +5.077717018e-01f, +1.945994668e-01f, -8.769011285e-02f, -6.037260436e-02f, +5.154360462e-02f, +2.538014075e-02f, -3.403897813e-02f, -9.943819336e-03f, +2.223283024e-02f, +2.558981297e-03f, -1.368493896e-02f, +5.891603182e-04f, +7.673642723e-03f, -1.444867054e-03f, -3.768639206e-03f, +1.217587764e-03f, +1.516951359e-03f, -6.641087242e-04f, -4.247915060e-04f, +0.000000000e+00f, + +0.000000000e+00f, +8.127195944e-05f, +8.401005136e-04f, -9.339367267e-04f, -2.591331235e-03f, +3.795167631e-03f, +3.770265571e-03f, -9.414723433e-03f, -2.257948580e-03f, +1.693344167e-02f, -4.279580531e-03f, -2.332642176e-02f, +1.642392712e-02f, +2.435862839e-02f, -3.163294016e-02f, -1.690447991e-02f, +4.461955438e-02f, +1.288261711e-03f, -4.972542456e-02f, +1.807188796e-02f, +4.403540171e-02f, -3.448113216e-02f, -2.922099377e-02f, +4.231883436e-02f, +1.080198927e-02f, -3.984942510e-02f, +4.760168967e-03f, +2.974895161e-02f, -1.327044218e-02f, -1.717888928e-02f, +1.435642335e-02f, +6.847957174e-03f, -1.069727478e-02f, -9.597921789e-04f, +5.837427171e-03f, -9.571378768e-04f, -2.207851849e-03f, +6.641087242e-04f, +4.247915060e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.765899818e-05f, +1.053717489e-05f, -1.603219883e-04f, +4.612255583e-05f, +3.528467708e-04f, -2.217817538e-04f, -6.208382892e-04f, +6.045112890e-04f, +9.287510517e-04f, -1.306637052e-03f, -1.204347512e-03f, +2.485878817e-03f, +1.339242186e-03f, -4.450568768e-03f, -1.200587652e-03f, +8.182436481e-03f, +8.336748150e-04f, -2.008385485e-02f, -1.938727657e-02f, +8.636208704e-03f, +2.416300508e-02f, +8.539166431e-03f, -7.953761608e-03f, -3.457229605e-03f, +4.713188790e-03f, +1.368469826e-03f, -3.028357154e-03f, -3.613969454e-04f, +1.892996117e-03f, -9.094642695e-05f, -1.095367052e-03f, +2.326955049e-04f, +5.618746480e-04f, -2.148710507e-04f, -2.396151739e-04f, +1.374392209e-04f, +7.315860199e-05f, -6.029092420e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.765899818e-05f, -1.053717489e-05f, +2.204480988e-04f, -1.264386833e-04f, -4.728274703e-04f, +5.689127526e-04f, +6.073670260e-04f, -1.360697223e-03f, -3.109115906e-04f, +2.304540143e-03f, -6.641392795e-04f, -2.948145751e-03f, +2.267558771e-03f, +2.779905960e-03f, -4.047049349e-03f, -1.546438148e-03f, +5.298683465e-03f, -5.161124881e-04f, -5.425560317e-03f, +2.724305859e-03f, +4.288582946e-03f, -4.274604149e-03f, -2.310526380e-03f, +4.661458564e-03f, +2.527524175e-04f, -3.919539164e-03f, +1.191394320e-03f, +2.545224130e-03f, -1.723725133e-03f, -1.174644097e-03f, +1.500235027e-03f, +2.467916037e-04f, -9.322746214e-04f, +1.450792578e-04f, +4.044293024e-04f, -1.717246052e-04f, -7.315860199e-05f, +6.029092420e-05f, +0.000000000e+00f, + /* 9,12 (40) */ + +0.000000000e+00f, -3.361296126e-05f, -8.295633387e-04f, +4.021907304e-04f, +2.130602551e-03f, -1.586208031e-03f, -4.093366645e-03f, +4.283347301e-03f, +6.506803891e-03f, -9.405730259e-03f, -8.800459722e-03f, +1.815112142e-02f, +9.922927981e-03f, -3.243020326e-02f, -8.012783156e-03f, +5.676077424e-02f, -1.223103297e-03f, -1.089290670e-01f, +3.829618817e-02f, +4.016134205e-01f, +5.164079105e-01f, +2.187624719e-01f, -7.915094642e-02f, -6.832636597e-02f, +4.808637501e-02f, +3.009332954e-02f, -3.267050830e-02f, -1.297217649e-02f, +2.187143329e-02f, +4.451977414e-03f, -1.377588539e-02f, -5.062067334e-04f, +7.906338228e-03f, -8.829924060e-04f, -3.983510257e-03f, +9.779725896e-04f, +1.654390580e-03f, -5.909501222e-04f, -4.850824302e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.361296126e-05f, +8.295633387e-04f, -7.134886279e-04f, -2.717769918e-03f, +3.322340161e-03f, +4.339178324e-03f, -8.807356407e-03f, -3.618645803e-03f, +1.662253008e-02f, -1.975040388e-03f, -2.399056104e-02f, +1.347578136e-02f, +2.662618717e-02f, -2.885303420e-02f, -2.095152926e-02f, +4.307311623e-02f, +6.586945176e-03f, -5.024153705e-02f, +1.264632764e-02f, +4.675970757e-02f, -3.019254921e-02f, -3.349559792e-02f, +4.000830798e-02f, +1.546344784e-02f, -3.959667268e-02f, +8.406298037e-04f, +3.094034593e-02f, -1.072521805e-02f, -1.890261442e-02f, +1.318177925e-02f, +8.348192201e-03f, -1.045048317e-02f, -1.892066800e-03f, +5.982506429e-03f, -5.527085745e-04f, -2.379576454e-03f, +5.909501222e-04f, +4.850824302e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.355134276e-05f, +2.004887603e-05f, -1.554644473e-04f, +1.919183145e-05f, +3.545943872e-04f, -1.665354586e-04f, -6.448254091e-04f, +5.106836993e-04f, +1.001547249e-03f, -1.167674654e-03f, -1.366615154e-03f, +2.301008985e-03f, +1.653264841e-03f, -4.221154537e-03f, -1.778128844e-03f, +7.874022257e-03f, +1.969441845e-03f, -1.904925260e-02f, -2.048298182e-02f, +6.778334413e-03f, +2.421423541e-02f, +9.966725522e-03f, -7.540028922e-03f, -4.131250132e-03f, +4.533865761e-03f, +1.781472607e-03f, -2.977103677e-03f, -6.207732291e-04f, +1.903934920e-03f, +6.325339340e-05f, -1.128814840e-03f, +1.502574751e-04f, +5.955426518e-04f, -1.776862090e-04f, -2.636293693e-04f, +1.251206083e-04f, +8.589535914e-05f, -5.884729198e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.355134276e-05f, -2.004887603e-05f, +2.144429117e-04f, -8.454905082e-05f, -4.913803271e-04f, +4.911712416e-04f, +6.934369816e-04f, -1.272385676e-03f, -5.052423525e-04f, +2.271257013e-03f, -3.574748264e-04f, -3.056753389e-03f, +1.907233017e-03f, +3.093451758e-03f, -3.747747485e-03f, -2.057321567e-03f, +5.185374127e-03f, +9.807683830e-05f, -5.570595356e-03f, +2.154991477e-03f, +4.669795535e-03f, -3.886466567e-03f, -2.818382716e-03f, +4.517457818e-03f, +7.434815445e-04f, -3.988557310e-03f, +8.293498011e-04f, +2.731065440e-03f, -1.528915007e-03f, -1.372064648e-03f, +1.441731981e-03f, +3.885302033e-04f, -9.461414043e-04f, +7.395648112e-05f, +4.343038303e-04f, -1.504549592e-04f, -8.589535914e-05f, +5.884729198e-05f, +0.000000000e+00f, + /* 9,13 (40) */ + +0.000000000e+00f, +9.938381493e-06f, -8.095144627e-04f, +2.467262831e-04f, +2.149794383e-03f, -1.231613644e-03f, -4.259902104e-03f, +3.638521892e-03f, +7.017487590e-03f, -8.404183010e-03f, -9.968134376e-03f, +1.678450626e-02f, +1.222393697e-02f, -3.077693842e-02f, -1.223393769e-02f, +5.498264540e-02f, +6.650918960e-03f, -1.069596252e-01f, +1.924693557e-02f, +3.811304387e-01f, +5.231862449e-01f, +2.429767073e-01f, -6.918422090e-02f, -7.586639489e-02f, +4.395512488e-02f, +3.462719530e-02f, -3.088903570e-02f, -1.594928017e-02f, +2.125066007e-02f, +6.355912334e-03f, -1.371263200e-02f, -1.635021573e-03f, +8.056595703e-03f, -2.874497542e-04f, -4.161196466e-03f, +7.143432204e-04f, +1.779511189e-03f, -5.050547631e-04f, -5.439297222e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.938381493e-06f, +8.095144627e-04f, -4.990457162e-04f, -2.802318969e-03f, +2.830959834e-03f, +4.830349566e-03f, -8.113919425e-03f, -4.891031479e-03f, +1.611728773e-02f, +2.962166243e-04f, -2.434803587e-02f, +1.041902798e-02f, +2.853342018e-02f, -2.575958245e-02f, -2.469927675e-02f, +4.101579467e-02f, +1.177231930e-02f, -5.014346021e-02f, +7.075732284e-03f, +4.891469905e-02f, -2.552275368e-02f, -3.738206449e-02f, +3.718992526e-02f, +1.998090565e-02f, -3.885319114e-02f, -3.147927506e-03f, +3.176969573e-02f, -7.994152605e-03f, -2.043152942e-02f, +1.180971460e-02f, +9.789924182e-03f, -1.006195297e-02f, -2.838208205e-03f, +6.056462910e-03f, -1.184047442e-04f, -2.530031414e-03f, +5.050547631e-04f, +5.439297222e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.913447055e-05f, +2.864594131e-05f, -1.489715196e-04f, -6.602181892e-06f, +3.521379039e-04f, -1.116586147e-04f, -6.605907798e-04f, +4.144389719e-04f, +1.060723315e-03f, -1.020179643e-03f, -1.508772975e-03f, +2.096488373e-03f, +1.939624746e-03f, -3.953336330e-03f, -2.316909459e-03f, +7.495415680e-03f, +3.030348290e-03f, -1.792761201e-02f, -2.144558744e-02f, +4.874687612e-03f, +2.411978892e-02f, +1.138439549e-02f, -7.026922587e-03f, -4.785522207e-03f, +4.298026076e-03f, +2.187758567e-03f, -2.890626324e-03f, -8.812751314e-04f, +1.893466033e-03f, +2.219079595e-04f, -1.150357134e-03f, +6.293841711e-05f, +6.235304087e-04f, -1.366944058e-04f, -2.855936222e-04f, +1.105109674e-04f, +9.831851840e-05f, -5.641075041e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.913447055e-05f, -2.864594131e-05f, +2.058395148e-04f, -4.387886421e-05f, -5.026758498e-04f, +4.104073217e-04f, +7.676237739e-04f, -1.170983701e-03f, -6.877948014e-04f, +2.210626144e-03f, -5.302961668e-05f, -3.125579499e-03f, +1.529164760e-03f, +3.364659660e-03f, -3.405572999e-03f, -2.538468262e-03f, +5.008896046e-03f, +7.085952003e-04f, -5.646659450e-03f, +1.558786322e-03f, +4.994314020e-03f, -3.448245579e-03f, -3.295000408e-03f, +4.315874755e-03f, +1.230929462e-03f, -4.008706317e-03f, +4.505553522e-04f, +2.886262616e-03f, -1.310139011e-03f, -1.557305195e-03f, +1.362887090e-03f, +5.301994246e-04f, -9.481045615e-04f, -1.450451870e-06f, +4.597976294e-04f, -1.256487669e-04f, -9.831851840e-05f, +5.641075041e-05f, +0.000000000e+00f, + /* 9,14 (40) */ + +0.000000000e+00f, +4.907285204e-05f, -7.808685214e-04f, +9.775476354e-05f, +2.143192201e-03f, -8.794757402e-04f, -4.371560718e-03f, +2.977931112e-03f, +7.431926562e-03f, -7.343459695e-03f, -1.098831402e-02f, +1.527573329e-02f, +1.432042534e-02f, -2.883731368e-02f, -1.618727402e-02f, +5.266573594e-02f, +1.414633464e-02f, -1.039292769e-01f, +1.319323565e-03f, +3.596848512e-01f, +5.280609325e-01f, +2.670964963e-01f, -5.779982541e-02f, -8.289331748e-02f, +3.916960267e-02f, +3.892522138e-02f, -2.870127713e-02f, -1.883990649e-02f, +2.036938493e-02f, +8.249378367e-03f, -1.349072404e-02f, -2.785378707e-03f, +8.119534120e-03f, +3.360806545e-04f, -4.297890872e-03f, +4.287495982e-04f, +1.890022156e-03f, -4.067362447e-04f, -6.003404726e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.907285204e-05f, +7.808685214e-04f, -2.932062015e-04f, -2.846197833e-03f, +2.328283984e-03f, +5.240756887e-03f, -7.346295651e-03f, -6.062015180e-03f, +1.542949293e-02f, +2.506842768e-03f, -2.440106548e-02f, +7.293448477e-03f, +3.006258494e-02f, -2.239492279e-02f, -2.810484974e-02f, +3.847732640e-02f, +1.678121535e-02f, -4.943486501e-02f, +1.429072834e-03f, +5.047348537e-02f, -2.052843966e-02f, -4.083031007e-02f, +3.389492485e-02f, +2.429678041e-02f, -3.762226168e-02f, -7.156633823e-03f, +3.222025109e-02f, -5.107889989e-03f, -2.174166843e-02f, +1.025240941e-02f, +1.115281127e-02f, -9.531753544e-03f, -3.786312766e-03f, +6.055012458e-03f, +3.413928852e-04f, -2.655680181e-03f, +4.067362447e-04f, +6.003404726e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.449908995e-05f, +3.626869734e-05f, -1.410160841e-04f, -3.100013789e-05f, +3.456925702e-04f, -5.777636716e-05f, -6.682608626e-04f, +3.169565730e-04f, +1.106062470e-03f, -8.660702928e-04f, -1.629859646e-03f, +1.875155598e-03f, +2.196044431e-03f, -3.651177164e-03f, -2.812587184e-03f, +7.053008544e-03f, +4.010242802e-03f, -1.672914678e-02f, -2.226991169e-02f, +2.938075104e-03f, +2.387804682e-02f, +1.278083917e-02f, -6.415233152e-03f, -5.412402635e-03f, +4.006358736e-03f, +2.582598789e-03f, -2.768806560e-03f, -1.139975466e-03f, +1.861027071e-03f, +3.833270077e-04f, -1.159326250e-03f, -2.840888309e-05f, +6.452740583e-04f, -9.223178851e-05f, -3.051331657e-04f, +9.367745324e-05f, +1.102371737e-04f, -5.294752732e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.449908995e-05f, -3.626869734e-05f, +1.949270588e-04f, -4.923932350e-06f, -5.069019624e-04f, +3.278005785e-04f, +8.293981165e-04f, -1.058200773e-03f, -8.565848337e-04f, +2.124084753e-03f, +2.454207327e-04f, -3.154504429e-03f, +1.138362217e-03f, +3.590713239e-03f, -3.025262961e-03f, -2.984137637e-03f, +4.771847280e-03f, +1.307846094e-03f, -5.652928597e-03f, +9.431245850e-04f, +5.257929761e-03f, -2.965184200e-03f, -3.734171146e-03f, +4.058694388e-03f, +1.708904058e-03f, -3.979018819e-03f, +5.954087941e-05f, +3.008215065e-03f, -1.069656674e-03f, -1.727641254e-03f, +1.264117719e-03f, +6.699201149e-04f, -9.376714072e-04f, -8.029617568e-05f, +4.803221480e-04f, -9.746178296e-05f, -1.102371737e-04f, +5.294752732e-05f, +0.000000000e+00f, + /* 9,15 (40) */ + +0.000000000e+00f, +8.357194200e-05f, -7.445998240e-04f, -4.326132053e-05f, +2.112192063e-03f, -5.337831700e-04f, -4.429337085e-03f, +2.309670250e-03f, +7.748883135e-03f, -6.237397224e-03f, -1.185438431e-02f, +1.364587364e-02f, +1.619558094e-02f, -2.664126924e-02f, -1.983845119e-02f, +4.985314876e-02f, +2.119934318e-02f, -9.991903408e-02f, -1.540982321e-02f, +3.374149395e-01f, +5.309990076e-01f, +2.909745431e-01f, -4.501898624e-02f, -8.930855063e-02f, +3.375720004e-02f, +4.293158011e-02f, -2.611867834e-02f, -2.160871305e-02f, +1.922940947e-02f, +1.011040544e-02f, -1.310739703e-02f, -3.944704957e-03f, +8.091125237e-03f, +9.813547128e-04f, -4.390122660e-03f, +1.236164325e-04f, +1.983699609e-03f, -2.964990710e-04f, -6.532880000e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.357194200e-05f, +7.445998240e-04f, -9.827914271e-05f, -2.851121766e-03f, +1.821382022e-03f, +5.568557466e-03f, -6.516897535e-03f, -7.120215954e-03f, +1.457290810e-02f, +4.630927521e-03f, -2.415564475e-02f, +4.138944048e-03f, +3.120094716e-02f, -1.880420955e-02f, -3.113011271e-02f, +3.549318877e-02f, +2.155306263e-02f, -4.812701891e-02f, -4.223855762e-03f, +5.141660995e-02f, -1.527050990e-02f, -4.379549427e-02f, +3.016075371e-02f, +2.835547480e-02f, -3.591335762e-02f, -1.113565264e-02f, +3.227979197e-02f, -2.099674924e-03f, -2.281132511e-02f, +8.524768155e-03f, +1.241692899e-02f, -8.861833429e-03f, -4.723984173e-03f, +5.974716282e-03f, +8.217150332e-04f, -2.753141964e-03f, +2.964990710e-04f, +6.532880000e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.973358537e-05f, +4.287448115e-05f, -1.317810928e-04f, -5.377230458e-05f, +3.355126957e-04f, -5.477384785e-06f, -6.680518135e-04f, +2.193896372e-04f, +1.137512275e-03f, -7.072796253e-04f, -1.729177185e-03f, +1.639950353e-03f, +2.420637634e-03f, -3.318981920e-03f, -3.261396848e-03f, +6.553589036e-03f, +4.903822234e-03f, -1.546450254e-02f, -2.295187420e-02f, +9.815742514e-04f, +2.348852223e-02f, +1.414466048e-02f, -5.706661215e-03f, -6.004267817e-03f, +3.660171795e-03f, +2.961245233e-03f, -2.611918560e-03f, -1.393878176e-03f, +1.806291018e-03f, +5.457330918e-04f, -1.155179992e-03f, -1.228524648e-04f, +6.602637232e-04f, -4.469181001e-05f, -3.218869068e-04f, +7.472014895e-05f, +1.214566576e-04f, -4.843734294e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.973358537e-05f, -4.287448115e-05f, +1.820124374e-04f, +3.186974957e-05f, -5.043349974e-04f, +2.445082970e-04f, +8.784127114e-04f, -9.358410193e-04f, -1.009860492e-03f, +2.013366884e-03f, +5.342574714e-04f, -3.143917298e-03f, +7.399153723e-04f, +3.769404223e-03f, -2.611983874e-03f, -3.389085798e-03f, +4.477572991e-03f, +1.888406059e-03f, -5.589460748e-03f, +3.156886903e-04f, +5.457193385e-03f, -2.443118584e-03f, -4.130118087e-03f, +3.748628172e-03f, +2.171261040e-03f, -3.899152682e-03f, -3.389294331e-04f, +3.094701674e-03f, -8.100621742e-04f, -1.880473749e-03f, +1.146118613e-03f, +8.057764558e-04f, -9.145006501e-04f, -1.616505191e-04f, +4.953319912e-04f, -6.611005247e-05f, -1.214566576e-04f, +4.843734294e-05f, +0.000000000e+00f, + /* 10, 0 (36) */ + +0.000000000e+00f, -7.608322579e-04f, +1.118776550e-03f, +1.378251293e-03f, -3.996866387e-03f, -8.778420085e-05f, +8.463162654e-03f, -5.917369532e-03f, -1.170469082e-02f, +1.883055804e-02f, +7.720230922e-03f, -3.819223843e-02f, +1.284965533e-02f, +5.985703519e-02f, -6.898457622e-02f, -7.711293861e-02f, +3.046497488e-01f, +5.837128805e-01f, +3.046497488e-01f, -7.711293861e-02f, -6.898457622e-02f, +5.985703519e-02f, +1.284965533e-02f, -3.819223843e-02f, +7.720230922e-03f, +1.883055804e-02f, -1.170469082e-02f, -5.917369532e-03f, +8.463162654e-03f, -8.778420085e-05f, -3.996866387e-03f, +1.378251293e-03f, +1.118776550e-03f, -7.608322579e-04f, -9.130911868e-05f, +0.000000000e+00f, + +0.000000000e+00f, +7.608322579e-04f, -1.118776550e-03f, -1.032757977e-03f, +5.537963620e-03f, -3.277985306e-03f, -8.278225430e-03f, +1.383882521e-02f, +1.771302895e-03f, -2.355345110e-02f, +1.719759611e-02f, +1.895372978e-02f, -3.796855404e-02f, +5.697284657e-03f, +4.123561278e-02f, -3.721413273e-02f, -1.801118074e-02f, +5.173229864e-02f, -1.801118074e-02f, -3.721413273e-02f, +4.123561278e-02f, +5.697284657e-03f, -3.796855404e-02f, +1.895372978e-02f, +1.719759611e-02f, -2.355345110e-02f, +1.771302895e-03f, +1.383882521e-02f, -8.278225430e-03f, -3.277985306e-03f, +5.537963620e-03f, -1.032757977e-03f, -1.549282673e-03f, +7.608322579e-04f, +9.130911868e-05f, +0.000000000e+00f, + +0.000000000e+00f, -8.610096471e-06f, -1.734450844e-04f, +2.063423291e-04f, +2.542369269e-04f, -6.829239910e-04f, +9.061379130e-06f, +1.334740657e-03f, -9.962288442e-04f, -1.700823497e-03f, +2.950847993e-03f, +9.379074490e-04f, -5.831432835e-03f, +2.255639644e-03f, +9.836779302e-03f, -1.170154190e-02f, -2.894571562e-02f, -1.297262942e-03f, +2.854133495e-02f, +1.357609648e-02f, -9.381395225e-03f, -3.164503237e-03f, +5.873380723e-03f, -4.504223033e-04f, -3.160553007e-03f, +1.503966945e-03f, +1.194919714e-03f, -1.306087259e-03f, -1.276517827e-04f, +7.164513821e-04f, -2.103608979e-04f, -2.390309122e-04f, +1.688223017e-04f, +2.190255501e-05f, -5.023134456e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.610096471e-06f, +1.734450844e-04f, -3.463027545e-04f, -1.500603778e-04f, +9.815523707e-04f, -7.206449357e-04f, -1.114731918e-03f, +2.286851473e-03f, -3.065756726e-04f, -3.135594535e-03f, +3.100476839e-03f, +1.596989202e-03f, -5.198937536e-03f, +2.172477802e-03f, +4.288541765e-03f, -5.598913174e-03f, -3.783561031e-04f, +5.878377207e-03f, -3.766421654e-03f, -2.797408819e-03f, +5.174551379e-03f, -1.058782302e-03f, -3.437091543e-03f, +2.946312073e-03f, +6.670301471e-04f, -2.380746322e-03f, +9.426127885e-04f, +8.762743588e-04f, -9.760043827e-04f, +7.025519776e-05f, +3.861753858e-04f, -2.019751614e-04f, -2.190255501e-05f, +5.023134456e-05f, +0.000000000e+00f, + /* 10, 1 (36) */ + +0.000000000e+00f, -7.694423543e-04f, +9.453314657e-04f, +1.584593622e-03f, -3.742629460e-03f, -7.707081919e-04f, +8.472224034e-03f, -4.582628874e-03f, -1.270091967e-02f, +1.712973454e-02f, +1.067107892e-02f, -3.725433098e-02f, +7.018222492e-03f, +6.211267483e-02f, -5.914779692e-02f, -8.881448051e-02f, +2.757040332e-01f, +5.824156176e-01f, +3.331910838e-01f, -6.353684213e-02f, -7.836597145e-02f, +5.669253195e-02f, +1.872303605e-02f, -3.864266074e-02f, +4.559677915e-03f, +2.033452499e-02f, -1.050977111e-02f, -7.223456790e-03f, +8.335510872e-03f, +6.286671812e-04f, -4.207227285e-03f, +1.139220381e-03f, +1.287598852e-03f, -7.389297029e-04f, -1.415404632e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.694423543e-04f, -9.453314657e-04f, -1.379060731e-03f, +5.387903242e-03f, -2.296432935e-03f, -8.998870366e-03f, +1.272409329e-02f, +4.058154368e-03f, -2.386002677e-02f, +1.406200157e-02f, +2.205420662e-02f, -3.637156484e-02f, +4.983471210e-04f, +4.340809058e-02f, -3.292559096e-02f, -2.361009391e-02f, +5.135394254e-02f, -1.213280353e-02f, -4.098055438e-02f, +3.843820396e-02f, +1.087183604e-02f, -3.902733634e-02f, +1.551663824e-02f, +2.014390818e-02f, -2.288642095e-02f, -6.094434262e-04f, +1.478143799e-02f, -7.401951071e-03f, -4.253989689e-03f, +5.608218818e-03f, -6.465825911e-04f, -1.751257834e-03f, +7.389297029e-04f, +1.415404632e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.784329719e-06f, -1.751889823e-04f, +1.725279642e-04f, +2.923973489e-04f, -6.415112318e-04f, -1.047914687e-04f, +1.344314247e-03f, -7.913703976e-04f, -1.868239599e-03f, +2.709265681e-03f, +1.396420030e-03f, -5.715262794e-03f, +1.353708248e-03f, +1.014940430e-02f, -9.815654971e-03f, -2.913597658e-02f, -3.881199688e-03f, +2.792284028e-02f, +1.542130069e-02f, -8.782090082e-03f, -4.068870907e-03f, +5.837850146e-03f, +6.046392525e-05f, -3.334406648e-03f, +1.279348831e-03f, +1.384438913e-03f, -1.258014460e-03f, -2.494776366e-04f, +7.412442005e-04f, -1.611372539e-04f, -2.700242113e-04f, +1.612093921e-04f, +3.592407024e-05f, -5.391097472e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.784329719e-06f, +1.751889823e-04f, -3.032592295e-04f, -2.234675677e-04f, +9.718574754e-04f, -5.600141608e-04f, -1.264509408e-03f, +2.161546552e-03f, +4.961619248e-05f, -3.274497897e-03f, +2.723920263e-03f, +2.103880952e-03f, -5.146294832e-03f, +1.520757418e-03f, +4.744380058e-03f, -5.237480478e-03f, -1.129403384e-03f, +6.071456451e-03f, -3.185499788e-03f, -3.385910532e-03f, +5.072635585e-03f, -4.969786261e-04f, -3.727931714e-03f, +2.708498128e-03f, +1.026284678e-03f, -2.440867502e-03f, +7.501245237e-04f, +1.024220164e-03f, -9.546290909e-04f, -1.493482220e-05f, +4.219838745e-04f, -1.880624540e-04f, -3.592407024e-05f, +5.391097472e-05f, +0.000000000e+00f, + /* 10, 2 (36) */ + +0.000000000e+00f, -7.656580246e-04f, +7.701424835e-04f, +1.757121586e-03f, -3.450232112e-03f, -1.412219424e-03f, +8.367432565e-03f, -3.238314627e-03f, -1.349229007e-02f, +1.526149494e-02f, +1.338034460e-02f, -3.585791095e-02f, +1.302959698e-03f, +6.346638308e-02f, -4.899839262e-02f, -9.863013548e-02f, +2.465680566e-01f, +5.785344179e-01f, +3.611139240e-01f, -4.811554144e-02f, -8.714806153e-02f, +5.262366104e-02f, +2.456088620e-02f, -3.858219681e-02f, +1.225271268e-03f, +2.161387382e-02f, -9.125332197e-03f, -8.481471251e-03f, +8.086033235e-03f, +1.369911382e-03f, -4.368364539e-03f, +8.691961692e-04f, +1.448808244e-03f, -7.030056326e-04f, -1.954514380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.656580246e-04f, -7.701424835e-04f, -1.682319961e-03f, +5.164435675e-03f, -1.324575460e-03f, -9.558884527e-03f, +1.145958388e-02f, +6.219700920e-03f, -2.381041058e-02f, +1.078750368e-02f, +2.477812689e-02f, -3.426768389e-02f, -4.647947712e-03f, +4.492884800e-02f, -2.818121091e-02f, -2.884757439e-02f, +5.022453916e-02f, -6.061347078e-03f, -4.416605417e-02f, +3.505229343e-02f, +1.594447162e-02f, -3.952431497e-02f, +1.178870653e-02f, +2.285240631e-02f, -2.186013627e-02f, -3.050310928e-03f, +1.553156252e-02f, -6.377730908e-03f, -5.208618780e-03f, +5.593283996e-03f, -2.245987165e-04f, -1.939320288e-03f, +7.030056326e-04f, +1.954514380e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.513779949e-05f, -1.742040072e-04f, +1.381448576e-04f, +3.245741528e-04f, -5.931378417e-04f, -2.125299559e-04f, +1.335397235e-03f, -5.833270222e-04f, -2.004987484e-03f, +2.440070971e-03f, +1.820947750e-03f, -5.528955538e-03f, +4.696474517e-04f, +1.032192300e-02f, -7.936149909e-03f, -2.911410294e-02f, -6.433473934e-03f, +2.709224689e-02f, +1.721901681e-02f, -8.039244336e-03f, -4.956947418e-03f, +5.722482458e-03f, +5.886766699e-04f, -3.468789506e-03f, +1.029091125e-03f, +1.561802592e-03f, -1.190446501e-03f, -3.729285139e-04f, +7.565447293e-04f, -1.070329941e-04f, -2.987487070e-04f, +1.505379459e-04f, +5.048104610e-05f, -5.686799517e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.513779949e-05f, +1.742040072e-04f, -2.579436044e-04f, -2.896164368e-04f, +9.477237061e-04f, -3.970459732e-04f, -1.390382041e-03f, +2.007613800e-03f, +3.962779854e-04f, -3.361979505e-03f, +2.313761148e-03f, +2.572322046e-03f, -5.018283861e-03f, +8.522127213e-04f, +5.127499849e-03f, -4.799722777e-03f, -1.863542627e-03f, +6.175033338e-03f, -2.554190250e-03f, -3.928819409e-03f, +4.893869695e-03f, +8.023245599e-05f, -3.967771208e-03f, +2.424792516e-03f, +1.378763756e-03f, -2.465319555e-03f, +5.396297686e-04f, +1.161825532e-03f, -9.170806654e-04f, -1.043542233e-04f, +4.528571409e-04f, -1.696619686e-04f, -5.048104610e-05f, +5.686799517e-05f, +0.000000000e+00f, + /* 10, 3 (36) */ + +0.000000000e+00f, -7.505202251e-04f, +5.959384762e-04f, +1.895266444e-03f, -3.125657959e-03f, -2.005357265e-03f, +8.154902609e-03f, -1.902917392e-03f, -1.407561709e-02f, +1.325650746e-02f, +1.582041557e-02f, -3.403696320e-02f, -4.225995840e-03f, +6.393603053e-02f, -3.867646963e-02f, -1.065662854e-01f, +2.174539537e-01f, +5.721009440e-01f, +3.882061709e-01f, -3.089652464e-02f, -9.518730587e-02f, +4.766671363e-02f, +3.028336865e-02f, -3.799352014e-02f, -2.243518239e-03f, +2.264296494e-02f, -7.563529605e-03f, -9.671917752e-03f, +7.713104721e-03f, +2.126456111e-03f, -4.475397533e-03f, +5.704474622e-04f, +1.599346190e-03f, -6.525245865e-04f, -2.523194331e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.505202251e-04f, -5.959384762e-04f, -1.940263565e-03f, +4.874819238e-03f, -3.768517537e-04f, -9.955930500e-03f, +1.006920184e-02f, +8.227314721e-03f, -2.341413259e-02f, +7.425524173e-03f, +2.709188803e-02f, -3.169536184e-02f, -9.666231573e-03f, +4.578106072e-02f, -2.305371106e-02f, -3.364729716e-02f, +4.836099653e-02f, +1.136862607e-04f, -4.672024442e-02f, +3.112347402e-02f, +2.083834132e-02f, -3.944408252e-02f, +7.820935319e-03f, +2.527719883e-02f, -2.048137252e-02f, -5.515630483e-03f, +1.607119229e-02f, -5.215905376e-03f, -6.125699445e-03f, +5.488929773e-03f, +2.282584243e-04f, -2.108982257e-03f, +6.525245865e-04f, +2.523194331e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.533435089e-05f, -1.706744610e-04f, +1.037297279e-04f, +3.505987525e-04f, -5.387876784e-04f, -3.129171415e-04f, +1.308811255e-03f, -3.750199130e-04f, -2.110292211e-03f, +2.147753875e-03f, +2.207084703e-03f, -5.277347306e-03f, -3.862076857e-04f, +1.035841164e-02f, -6.080258955e-03f, -2.888403095e-02f, -8.933325890e-03f, +2.605357718e-02f, +1.895117576e-02f, -7.154815972e-03f, -5.816700690e-03f, +5.525876329e-03f, +1.127702779e-03f, -3.560497858e-03f, +7.557444035e-04f, +1.724089980e-03f, -1.103582358e-03f, -4.963048970e-04f, +7.617019767e-04f, -4.861157251e-05f, -3.246357830e-04f, +1.367859399e-04f, +6.535721937e-05f, -5.897846436e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.533435089e-05f, +1.706744610e-04f, -2.112442972e-04f, -3.478069317e-04f, +9.101527510e-04f, -2.343439974e-04f, -1.491207895e-03f, +1.828199279e-03f, +7.284145239e-04f, -3.397801589e-03f, +1.876739421e-03f, +2.995861166e-03f, -4.817686777e-03f, +1.769787936e-04f, +5.432600469e-03f, -4.292421448e-03f, -2.569789586e-03f, +6.187339930e-03f, -1.881716702e-03f, -4.417593386e-03f, +4.640115837e-03f, +6.643113960e-04f, -4.152082301e-03f, +2.098601618e-03f, +1.718864774e-03f, -2.452718358e-03f, +3.138551405e-04f, +1.286503976e-03f, -8.632675193e-04f, -1.967187451e-04f, +4.779633281e-04f, -1.468021015e-04f, -6.535721937e-05f, +5.897846436e-05f, +0.000000000e+00f, + /* 10, 4 (36) */ + +0.000000000e+00f, -7.251858742e-04f, +4.252640152e-04f, +1.998996172e-03f, -2.775059206e-03f, -2.544144944e-03f, +7.841985467e-03f, -5.941061375e-04f, -1.445063700e-02f, +1.114621525e-02f, +1.796816944e-02f, -3.182987850e-02f, -9.503343145e-03f, +6.354982285e-02f, -2.831805799e-02f, -1.126465443e-01f, +1.885699227e-01f, +5.631676181e-01f, +4.142597481e-01f, -1.194534887e-02f, -1.023421218e-01f, +4.185001294e-02f, +3.580924498e-02f, -3.686581736e-02f, -5.804016097e-03f, +2.339870935e-02f, -5.839439625e-03f, -1.077550011e-02f, +7.216799824e-03f, +2.888158088e-03f, -4.524009106e-03f, +2.458116791e-04f, +1.736132130e-03f, -5.871673671e-04f, -3.112978975e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.251858742e-04f, -4.252640152e-04f, -2.151507862e-03f, +4.527012306e-03f, +5.333009973e-04f, -1.019027450e-02f, +8.577993945e-03f, +1.005551400e-02f, -2.268571807e-02f, +4.027722584e-03f, +2.896862746e-02f, -2.869950068e-02f, -1.448391835e-02f, +4.595803951e-02f, -1.762111059e-02f, -3.793971861e-02f, +4.579120694e-02f, +6.301026190e-03f, -4.860196112e-02f, +2.670588063e-02f, +2.547845715e-02f, -3.877977112e-02f, +3.668853018e-03f, +2.737580044e-02f, -1.876250774e-02f, -7.968348841e-03f, +1.638504743e-02f, -3.929401400e-03f, -6.988966964e-03f, +5.292211027e-03f, +7.062217525e-04f, -2.255784358e-03f, +5.871673671e-04f, +3.112978975e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.428538431e-05f, -1.648141284e-04f, +6.979179289e-05f, +3.703999734e-04f, -4.794871086e-04f, -4.048679758e-04f, +1.265590524e-03f, -1.692709848e-04f, -2.183827185e-03f, +1.836962834e-03f, +2.551069338e-03f, -4.965941208e-03f, -1.204228959e-03f, +1.026428799e-02f, -4.264562282e-03f, -2.845158803e-02f, -1.136051456e-02f, +2.481283688e-02f, +2.059996734e-02f, -6.132358280e-03f, -6.635998333e-03f, +5.247637001e-03f, +1.670662808e-03f, -3.606800958e-03f, +4.622669339e-04f, +1.868486791e-03f, -9.979030911e-04f, -6.178394611e-04f, +7.561859339e-04f, +1.347126320e-05f, -3.471309988e-04f, +1.199806996e-04f, +8.031612747e-05f, -6.012611049e-05f, +0.000000000e+00f, + +0.000000000e+00f, -3.428538431e-05f, +1.648141284e-04f, -1.640243894e-04f, -3.975036781e-04f, +8.603196375e-04f, -7.441197769e-05f, -1.566271235e-03f, +1.626753728e-03f, +1.041374031e-03f, -3.382518597e-03f, +1.419885067e-03f, +3.368820468e-03f, -4.548352097e-03f, -4.947957059e-04f, +5.655591827e-03f, -3.723388442e-03f, -3.237586949e-03f, +6.107988193e-03f, -1.177974736e-03f, -4.844448366e-03f, +4.314402501e-03f, +1.246496406e-03f, -4.277118059e-03f, +1.734060021e-03f, +2.041046287e-03f, -2.402227156e-03f, +7.585826118e-05f, +1.395784589e-03f, -7.933642114e-04f, -2.906317128e-04f, +4.965269876e-04f, -1.195978440e-04f, -8.031612747e-05f, +6.012611049e-05f, +0.000000000e+00f, + /* 10, 5 (36) */ + +0.000000000e+00f, -6.909004899e-04f, +2.604498868e-04f, +2.068787965e-03f, -2.404659233e-03f, -3.023632052e-03f, +7.437117492e-03f, +6.714843867e-04f, -1.461990799e-02f, +8.962388064e-03f, +1.980513228e-02f, -2.927880916e-02f, -1.446928435e-02f, +6.234559389e-02f, -1.805377000e-02f, -1.169111066e-01f, +1.601183347e-01f, +5.518071035e-01f, +4.390725850e-01f, +8.654618468e-03f, -1.084744801e-01f, +3.521401460e-02f, +4.105688198e-02f, -3.519515455e-02f, -9.410817054e-03f, +2.386097628e-02f, -3.970952834e-03f, -1.177340320e-02f, +6.598960363e-03f, +3.644344022e-03f, -4.510537843e-03f, -1.013193196e-04f, +1.856112829e-03f, -5.068512397e-04f, -3.714240080e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.909004899e-04f, -2.604498868e-04f, -2.315532252e-03f, +4.129508628e-03f, +1.393620635e-03f, -1.026468647e-02f, +7.011722709e-03f, +1.168226773e-02f, -2.164434404e-02f, +6.452039870e-04f, +3.038851252e-02f, -2.533068021e-02f, -1.903227045e-02f, +4.546324381e-02f, -1.196551876e-02f, -4.166310706e-02f, +4.255361999e-02f, +1.240901438e-02f, -4.977993586e-02f, +2.186143227e-02f, +2.979285965e-02f, -3.753327471e-02f, -6.082650413e-04f, +2.910986046e-02f, -1.672146145e-02f, -1.037057600e-02f, +1.646090569e-02f, -2.533616811e-03f, -7.782331176e-03f, +5.001579315e-03f, +1.202748740e-03f, -2.375382202e-03f, +5.068512397e-04f, +3.714240080e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.192957089e-05f, -1.568612381e-04f, +3.680635368e-05f, +3.840006722e-04f, -4.162884493e-04f, -4.874587115e-04f, +1.206959738e-03f, +3.123232161e-05f, -2.225703758e-03f, +1.512437996e-03f, +2.849812934e-03f, -4.600816928e-03f, -1.975587388e-03f, +1.004621600e-02f, -2.504827690e-03f, -2.782441339e-02f, -1.369551728e-02f, +2.337797012e-02f, +2.214803029e-02f, -4.977019822e-03f, -7.402748914e-03f, +4.888414249e-03f, +2.210390368e-03f, -3.605493710e-03f, +1.519974222e-04f, +1.992328603e-03f, -8.741753758e-04f, -7.357201704e-04f, +7.396006017e-04f, +7.847324282e-05f, -3.657035821e-04f, +1.002011889e-04f, +9.510407349e-05f, -6.020509376e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.192957089e-05f, +1.568612381e-04f, -1.171078463e-04f, -4.383373773e-04f, +7.995464616e-04f, +8.038279173e-05f, -1.615280415e-03f, +1.406970164e-03f, +1.330912198e-03f, -3.317452385e-03f, +9.504049408e-04f, +3.686371627e-03f, -4.215123603e-03f, -1.153103885e-03f, +5.793649839e-03f, -3.101343533e-03f, -3.856965741e-03f, +5.937978961e-03f, -4.533831067e-04f, -5.202483955e-03f, +3.920889906e-03f, +1.817936591e-03f, -4.339983708e-03f, +1.335979822e-03f, +2.339917301e-03f, -2.313584651e-03f, -1.710116581e-04f, +1.487356930e-03f, -7.078192505e-04f, -3.846031339e-04f, +5.078460812e-04f, -8.825372617e-05f, -9.510407349e-05f, +6.020509376e-05f, +0.000000000e+00f, + /* 10, 6 (36) */ + +0.000000000e+00f, -6.489709190e-04f, +1.035886486e-04f, +2.105594318e-03f, -2.020658561e-03f, -3.439920502e-03f, +6.949658780e-03f, +1.878444125e-03f, -1.458867566e-02f, +6.736684306e-03f, +2.131757027e-02f, -2.642899623e-02f, -1.907010128e-02f, +6.037000650e-02f, -8.007554010e-03f, -1.194159343e-01f, +1.322939213e-01f, +5.381115862e-01f, +4.624505551e-01f, +3.080264876e-02f, -1.134514999e-01f, +2.781126569e-02f, +4.594529623e-02f, -3.298476419e-02f, -1.301631076e-02f, +2.401297370e-02f, -1.978624231e-03f, -1.264757858e-02f, +5.863240193e-03f, +4.383944623e-03f, -4.432064600e-03f, -4.670229017e-04f, +1.956314018e-03f, -4.117471662e-04f, -4.316291017e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.489709190e-04f, -1.035886486e-04f, -2.432640098e-03f, +3.691171251e-03f, +2.193167096e-03f, -1.018430368e-02f, +5.396442294e-03f, +1.308923789e-02f, -2.031343184e-02f, -2.672248398e-03f, +3.133891746e-02f, -2.164430858e-02f, -2.324739405e-02f, +4.431013992e-02f, -6.171868922e-03f, -4.476445059e-02f, +3.869665425e-02f, +1.834699334e-02f, -5.023331897e-02f, +1.665894831e-02f, +3.371374956e-02f, -3.571533812e-02f, -4.948248749e-03f, +3.044584029e-02f, -1.438154415e-02f, -1.268416065e-02f, +1.628989403e-02f, -1.046259880e-03f, -8.490150426e-03f, +4.616976181e-03f, +1.710594821e-03f, -2.463635928e-03f, +4.117471662e-04f, +4.316291017e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.823229520e-05f, -1.470732843e-04f, +5.209207025e-06f, +3.915130981e-04f, -3.502537026e-04f, -5.599336583e-04f, +1.134310075e-03f, +2.239691981e-04f, -2.236455243e-03f, +1.178945346e-03f, +3.100918505e-03f, -4.188535847e-03f, -2.692333594e-03f, +9.711998452e-03f, -8.158617887e-04f, -2.701186007e-02f, -1.591972134e-02f, +2.175879357e-02f, +2.357864012e-02f, -3.695526276e-03f, -8.105046358e-03f, +4.449928273e-03f, +2.739517692e-03f, -3.554943868e-03f, -1.713784116e-04f, +2.093143592e-03f, -7.334510579e-04f, -8.481149112e-04f, +7.116955357e-04f, +1.455729348e-04f, -3.798559979e-04f, +7.757955797e-05f, +1.094535619e-04f, -5.912273056e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.823229520e-05f, +1.470732843e-04f, -7.126711184e-05f, -4.701033003e-04f, +7.292747038e-04f, +2.278425380e-04f, -1.638359030e-03f, +1.172719323e-03f, +1.593248327e-03f, -3.204655905e-03f, +4.755687618e-04f, +3.944597606e-03f, -3.823754627e-03f, -1.788232438e-03f, +5.845251949e-03f, -2.435777920e-03f, -4.418697522e-03f, +5.679689375e-03f, +2.812738550e-04f, -5.485796362e-03f, +3.464817326e-03f, +2.369828215e-03f, -4.338695672e-03f, +9.097881746e-04f, +2.610326149e-03f, -2.187124480e-03f, -4.231592095e-04f, +1.559114740e-03f, -6.073585134e-04f, -4.770712771e-04f, +5.113084792e-04f, -5.306519586e-05f, -1.094535619e-04f, +5.912273056e-05f, +0.000000000e+00f, + /* 10, 7 (36) */ + +0.000000000e+00f, -6.007386238e-04f, -4.348463569e-05f, +2.110803525e-03f, -1.629145463e-03f, -3.790174204e-03f, +6.389725122e-03f, +3.012754199e-03f, -1.436470647e-02f, +4.500229063e-03f, +2.249651562e-02f, -2.332807772e-02f, -2.325863713e-02f, +5.767767291e-02f, +1.704444442e-03f, -1.202317961e-01f, +1.052820612e-01f, +5.221918649e-01f, +4.842093487e-01f, +5.438128888e-02f, -1.171470262e-01f, +1.970621933e-02f, +5.039522451e-02f, -3.024524649e-02f, -1.657125463e-02f, +2.384159529e-02f, +1.145193607e-04f, -1.338102963e-02f, +5.015125282e-03f, +5.095640159e-03f, -4.286491665e-03f, -8.468788996e-04f, +2.033893576e-03f, -3.022936042e-04f, -4.907518323e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.007386238e-04f, +4.348463569e-05f, -2.503907210e-03f, +3.221067951e-03f, +2.922441800e-03f, -9.956461145e-03f, +3.758083264e-03f, +1.426195722e-02f, -1.872018351e-02f, -5.876904303e-03f, +3.181448622e-02f, -1.769971098e-02f, -2.707114868e-02f, +4.252190749e-02f, -3.266169733e-04f, -4.720022851e-02f, +3.427795673e-02f, +2.402668272e-02f, -4.995204511e-02f, +1.117315195e-02f, +3.717856689e-02f, -3.334550991e-02f, -9.286944420e-03f, +3.135562846e-02f, -1.177121800e-02f, -1.487128513e-02f, +1.586673482e-02f, +5.128548594e-04f, -9.097508940e-03f, +4.139904904e-03f, +2.221903300e-03f, -2.516701124e-03f, +3.022936042e-04f, +4.907518323e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.318466494e-05f, -1.357217998e-04f, -2.460806380e-05f, +3.931331187e-04f, -2.824388115e-04f, -6.217092813e-04f, +1.049173726e-03f, +4.066142464e-04f, -2.217015702e-03f, +8.412125227e-04f, +3.302690140e-03f, -3.736042896e-03f, -3.347465510e-03f, +9.270459099e-03f, +7.886258271e-04f, -2.602487989e-02f, -1.801560566e-02f, +1.996691054e-02f, +2.487589246e-02f, -2.296144059e-03f, -8.731315790e-03f, +3.934982890e-03f, +3.250566468e-03f, -3.454132949e-03f, -5.038671492e-04f, +2.168694001e-03f, -5.770625852e-04f, -9.531973567e-04f, +6.723756816e-04f, +2.138786494e-04f, -3.891334442e-04f, +5.230188514e-05f, +1.230871687e-04f, -5.680212660e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.318466494e-05f, +1.357217998e-04f, -2.721223859e-05f, -4.927570272e-04f, +6.510366524e-04f, +3.659681520e-04f, -1.636030674e-03f, +9.279840278e-04f, +1.825112831e-03f, -3.046866177e-03f, +2.596102324e-06f, +4.140539390e-03f, -3.380809234e-03f, -2.390907600e-03f, +5.810192325e-03f, -1.736806368e-03f, -4.914435019e-03f, +5.336838992e-03f, +1.015010234e-03f, -5.689576599e-03f, +2.952433000e-03f, +2.893551996e-03f, -4.272227167e-03f, +4.614538658e-04f, +2.847447523e-03f, -2.023785552e-03f, -6.767935767e-04f, +1.609197730e-03f, -4.929840536e-04f, -5.664264510e-04f, +5.064076230e-04f, -1.441832443e-05f, -1.230871687e-04f, +5.680212660e-05f, +0.000000000e+00f, + /* 10, 8 (36) */ + +0.000000000e+00f, -5.475539589e-04f, -1.792064355e-04f, +2.086195461e-03f, -1.236012344e-03f, -4.072613016e-03f, +5.768015841e-03f, +4.061927925e-03f, -1.395809222e-02f, +2.283213361e-03f, +2.333772814e-02f, -2.002538758e-02f, -2.699468003e-02f, +5.433020740e-02f, +1.097490354e-02f, -1.194431703e-01f, +7.925718134e-02f, +5.041762592e-01f, +5.041762592e-01f, +7.925718134e-02f, -1.194431703e-01f, +1.097490354e-02f, +5.433020740e-02f, -2.699468003e-02f, -2.002538758e-02f, +2.333772814e-02f, +2.283213361e-03f, -1.395809222e-02f, +4.061927925e-03f, +5.768015841e-03f, -4.072613016e-03f, -1.236012344e-03f, +2.086195461e-03f, -1.792064355e-04f, -5.475539589e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.475539589e-04f, +1.792064355e-04f, -2.531119449e-03f, +2.728310923e-03f, +3.573478453e-03f, -9.590492993e-03f, +2.122052590e-03f, +1.518994124e-02f, -1.689507068e-02f, -8.923770481e-03f, +3.181708233e-02f, -1.355917159e-02f, -3.045195791e-02f, +4.013099989e-02f, +5.483575352e-03f, -4.893703488e-02f, +2.936352171e-02f, +2.936352171e-02f, -4.893703488e-02f, +5.483575352e-03f, +4.013099989e-02f, -3.045195791e-02f, -1.355917159e-02f, +3.181708233e-02f, -8.923770481e-03f, -1.689507068e-02f, +1.518994124e-02f, +2.122052590e-03f, -9.590492993e-03f, +3.573478453e-03f, +2.728310923e-03f, -2.531119449e-03f, +1.792064355e-04f, +5.475539589e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.680212660e-05f, -1.230871687e-04f, -5.230188514e-05f, +3.891334442e-04f, -2.138786494e-04f, -6.723756816e-04f, +9.531973567e-04f, +5.770625852e-04f, -2.168694001e-03f, +5.038671492e-04f, +3.454132949e-03f, -3.250566468e-03f, -3.934982890e-03f, +8.731315790e-03f, +2.296144059e-03f, -2.487589246e-02f, -1.996691054e-02f, +1.801560566e-02f, +2.602487989e-02f, -7.886258271e-04f, -9.270459099e-03f, +3.347465510e-03f, +3.736042896e-03f, -3.302690140e-03f, -8.412125227e-04f, +2.217015702e-03f, -4.066142464e-04f, -1.049173726e-03f, +6.217092813e-04f, +2.824388115e-04f, -3.931331187e-04f, +2.460806380e-05f, +1.357217998e-04f, -5.318466494e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.680212660e-05f, +1.230871687e-04f, +1.441832443e-05f, -5.064076230e-04f, +5.664264510e-04f, +4.929840536e-04f, -1.609197730e-03f, +6.767935767e-04f, +2.023785552e-03f, -2.847447523e-03f, -4.614538658e-04f, +4.272227167e-03f, -2.893551996e-03f, -2.952433000e-03f, +5.689576599e-03f, -1.015010234e-03f, -5.336838992e-03f, +4.914435019e-03f, +1.736806368e-03f, -5.810192325e-03f, +2.390907600e-03f, +3.380809234e-03f, -4.140539390e-03f, -2.596102324e-06f, +3.046866177e-03f, -1.825112831e-03f, -9.279840278e-04f, +1.636030674e-03f, -3.659681520e-04f, -6.510366524e-04f, +4.927570272e-04f, +2.721223859e-05f, -1.357217998e-04f, +5.318466494e-05f, +0.000000000e+00f, + /* 10, 9 (36) */ + +0.000000000e+00f, -4.907518323e-04f, -3.022936042e-04f, +2.033893576e-03f, -8.468788996e-04f, -4.286491665e-03f, +5.095640159e-03f, +5.015125282e-03f, -1.338102963e-02f, +1.145193607e-04f, +2.384159529e-02f, -1.657125463e-02f, -3.024524649e-02f, +5.039522451e-02f, +1.970621933e-02f, -1.171470262e-01f, +5.438128888e-02f, +4.842093487e-01f, +5.221918649e-01f, +1.052820612e-01f, -1.202317961e-01f, +1.704444442e-03f, +5.767767291e-02f, -2.325863713e-02f, -2.332807772e-02f, +2.249651562e-02f, +4.500229063e-03f, -1.436470647e-02f, +3.012754199e-03f, +6.389725122e-03f, -3.790174204e-03f, -1.629145463e-03f, +2.110803525e-03f, -4.348463569e-05f, -6.007386238e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.907518323e-04f, +3.022936042e-04f, -2.516701124e-03f, +2.221903300e-03f, +4.139904904e-03f, -9.097508940e-03f, +5.128548594e-04f, +1.586673482e-02f, -1.487128513e-02f, -1.177121800e-02f, +3.135562846e-02f, -9.286944420e-03f, -3.334550991e-02f, +3.717856689e-02f, +1.117315195e-02f, -4.995204511e-02f, +2.402668272e-02f, +3.427795673e-02f, -4.720022851e-02f, -3.266169733e-04f, +4.252190749e-02f, -2.707114868e-02f, -1.769971098e-02f, +3.181448622e-02f, -5.876904303e-03f, -1.872018351e-02f, +1.426195722e-02f, +3.758083264e-03f, -9.956461145e-03f, +2.922441800e-03f, +3.221067951e-03f, -2.503907210e-03f, +4.348463569e-05f, +6.007386238e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.912273056e-05f, -1.094535619e-04f, -7.757955797e-05f, +3.798559979e-04f, -1.455729348e-04f, -7.116955357e-04f, +8.481149112e-04f, +7.334510579e-04f, -2.093143592e-03f, +1.713784116e-04f, +3.554943868e-03f, -2.739517692e-03f, -4.449928273e-03f, +8.105046358e-03f, +3.695526276e-03f, -2.357864012e-02f, -2.175879357e-02f, +1.591972134e-02f, +2.701186007e-02f, +8.158617887e-04f, -9.711998452e-03f, +2.692333594e-03f, +4.188535847e-03f, -3.100918505e-03f, -1.178945346e-03f, +2.236455243e-03f, -2.239691981e-04f, -1.134310075e-03f, +5.599336583e-04f, +3.502537026e-04f, -3.915130981e-04f, -5.209207025e-06f, +1.470732843e-04f, -4.823229520e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.912273056e-05f, +1.094535619e-04f, +5.306519586e-05f, -5.113084792e-04f, +4.770712771e-04f, +6.073585134e-04f, -1.559114740e-03f, +4.231592095e-04f, +2.187124480e-03f, -2.610326149e-03f, -9.097881746e-04f, +4.338695672e-03f, -2.369828215e-03f, -3.464817326e-03f, +5.485796362e-03f, -2.812738550e-04f, -5.679689375e-03f, +4.418697522e-03f, +2.435777920e-03f, -5.845251949e-03f, +1.788232438e-03f, +3.823754627e-03f, -3.944597606e-03f, -4.755687618e-04f, +3.204655905e-03f, -1.593248327e-03f, -1.172719323e-03f, +1.638359030e-03f, -2.278425380e-04f, -7.292747038e-04f, +4.701033003e-04f, +7.126711184e-05f, -1.470732843e-04f, +4.823229520e-05f, +0.000000000e+00f, + /* 10,10 (36) */ + +0.000000000e+00f, -4.316291017e-04f, -4.117471662e-04f, +1.956314018e-03f, -4.670229017e-04f, -4.432064600e-03f, +4.383944623e-03f, +5.863240193e-03f, -1.264757858e-02f, -1.978624231e-03f, +2.401297370e-02f, -1.301631076e-02f, -3.298476419e-02f, +4.594529623e-02f, +2.781126569e-02f, -1.134514999e-01f, +3.080264876e-02f, +4.624505551e-01f, +5.381115862e-01f, +1.322939213e-01f, -1.194159343e-01f, -8.007554010e-03f, +6.037000650e-02f, -1.907010128e-02f, -2.642899623e-02f, +2.131757027e-02f, +6.736684306e-03f, -1.458867566e-02f, +1.878444125e-03f, +6.949658780e-03f, -3.439920502e-03f, -2.020658561e-03f, +2.105594318e-03f, +1.035886486e-04f, -6.489709190e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.316291017e-04f, +4.117471662e-04f, -2.463635928e-03f, +1.710594821e-03f, +4.616976181e-03f, -8.490150426e-03f, -1.046259880e-03f, +1.628989403e-02f, -1.268416065e-02f, -1.438154415e-02f, +3.044584029e-02f, -4.948248749e-03f, -3.571533812e-02f, +3.371374956e-02f, +1.665894831e-02f, -5.023331897e-02f, +1.834699334e-02f, +3.869665425e-02f, -4.476445059e-02f, -6.171868922e-03f, +4.431013992e-02f, -2.324739405e-02f, -2.164430858e-02f, +3.133891746e-02f, -2.672248398e-03f, -2.031343184e-02f, +1.308923789e-02f, +5.396442294e-03f, -1.018430368e-02f, +2.193167096e-03f, +3.691171251e-03f, -2.432640098e-03f, -1.035886486e-04f, +6.489709190e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.020509376e-05f, -9.510407349e-05f, -1.002011889e-04f, +3.657035821e-04f, -7.847324282e-05f, -7.396006017e-04f, +7.357201704e-04f, +8.741753758e-04f, -1.992328603e-03f, -1.519974222e-04f, +3.605493710e-03f, -2.210390368e-03f, -4.888414249e-03f, +7.402748914e-03f, +4.977019822e-03f, -2.214803029e-02f, -2.337797012e-02f, +1.369551728e-02f, +2.782441339e-02f, +2.504827690e-03f, -1.004621600e-02f, +1.975587388e-03f, +4.600816928e-03f, -2.849812934e-03f, -1.512437996e-03f, +2.225703758e-03f, -3.123232161e-05f, -1.206959738e-03f, +4.874587115e-04f, +4.162884493e-04f, -3.840006722e-04f, -3.680635368e-05f, +1.568612381e-04f, -4.192957089e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.020509376e-05f, +9.510407349e-05f, +8.825372617e-05f, -5.078460812e-04f, +3.846031339e-04f, +7.078192505e-04f, -1.487356930e-03f, +1.710116581e-04f, +2.313584651e-03f, -2.339917301e-03f, -1.335979822e-03f, +4.339983708e-03f, -1.817936591e-03f, -3.920889906e-03f, +5.202483955e-03f, +4.533831067e-04f, -5.937978961e-03f, +3.856965741e-03f, +3.101343533e-03f, -5.793649839e-03f, +1.153103885e-03f, +4.215123603e-03f, -3.686371627e-03f, -9.504049408e-04f, +3.317452385e-03f, -1.330912198e-03f, -1.406970164e-03f, +1.615280415e-03f, -8.038279173e-05f, -7.995464616e-04f, +4.383373773e-04f, +1.171078463e-04f, -1.568612381e-04f, +4.192957089e-05f, +0.000000000e+00f, + /* 10,11 (36) */ + +0.000000000e+00f, -3.714240080e-04f, -5.068512397e-04f, +1.856112829e-03f, -1.013193196e-04f, -4.510537843e-03f, +3.644344022e-03f, +6.598960363e-03f, -1.177340320e-02f, -3.970952834e-03f, +2.386097628e-02f, -9.410817054e-03f, -3.519515455e-02f, +4.105688198e-02f, +3.521401460e-02f, -1.084744801e-01f, +8.654618468e-03f, +4.390725850e-01f, +5.518071035e-01f, +1.601183347e-01f, -1.169111066e-01f, -1.805377000e-02f, +6.234559389e-02f, -1.446928435e-02f, -2.927880916e-02f, +1.980513228e-02f, +8.962388064e-03f, -1.461990799e-02f, +6.714843867e-04f, +7.437117492e-03f, -3.023632052e-03f, -2.404659233e-03f, +2.068787965e-03f, +2.604498868e-04f, -6.909004899e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.714240080e-04f, +5.068512397e-04f, -2.375382202e-03f, +1.202748740e-03f, +5.001579315e-03f, -7.782331176e-03f, -2.533616811e-03f, +1.646090569e-02f, -1.037057600e-02f, -1.672146145e-02f, +2.910986046e-02f, -6.082650413e-04f, -3.753327471e-02f, +2.979285965e-02f, +2.186143227e-02f, -4.977993586e-02f, +1.240901438e-02f, +4.255361999e-02f, -4.166310706e-02f, -1.196551876e-02f, +4.546324381e-02f, -1.903227045e-02f, -2.533068021e-02f, +3.038851252e-02f, +6.452039870e-04f, -2.164434404e-02f, +1.168226773e-02f, +7.011722709e-03f, -1.026468647e-02f, +1.393620635e-03f, +4.129508628e-03f, -2.315532252e-03f, -2.604498868e-04f, +6.909004899e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.012611049e-05f, -8.031612747e-05f, -1.199806996e-04f, +3.471309988e-04f, -1.347126320e-05f, -7.561859339e-04f, +6.178394611e-04f, +9.979030911e-04f, -1.868486791e-03f, -4.622669339e-04f, +3.606800958e-03f, -1.670662808e-03f, -5.247637001e-03f, +6.635998333e-03f, +6.132358280e-03f, -2.059996734e-02f, -2.481283688e-02f, +1.136051456e-02f, +2.845158803e-02f, +4.264562282e-03f, -1.026428799e-02f, +1.204228959e-03f, +4.965941208e-03f, -2.551069338e-03f, -1.836962834e-03f, +2.183827185e-03f, +1.692709848e-04f, -1.265590524e-03f, +4.048679758e-04f, +4.794871086e-04f, -3.703999734e-04f, -6.979179289e-05f, +1.648141284e-04f, -3.428538431e-05f, +0.000000000e+00f, + +0.000000000e+00f, -6.012611049e-05f, +8.031612747e-05f, +1.195978440e-04f, -4.965269876e-04f, +2.906317128e-04f, +7.933642114e-04f, -1.395784589e-03f, -7.585826118e-05f, +2.402227156e-03f, -2.041046287e-03f, -1.734060021e-03f, +4.277118059e-03f, -1.246496406e-03f, -4.314402501e-03f, +4.844448366e-03f, +1.177974736e-03f, -6.107988193e-03f, +3.237586949e-03f, +3.723388442e-03f, -5.655591827e-03f, +4.947957059e-04f, +4.548352097e-03f, -3.368820468e-03f, -1.419885067e-03f, +3.382518597e-03f, -1.041374031e-03f, -1.626753728e-03f, +1.566271235e-03f, +7.441197769e-05f, -8.603196375e-04f, +3.975036781e-04f, +1.640243894e-04f, -1.648141284e-04f, +3.428538431e-05f, +0.000000000e+00f, + /* 10,12 (36) */ + +0.000000000e+00f, -3.112978975e-04f, -5.871673671e-04f, +1.736132130e-03f, +2.458116791e-04f, -4.524009106e-03f, +2.888158088e-03f, +7.216799824e-03f, -1.077550011e-02f, -5.839439625e-03f, +2.339870935e-02f, -5.804016097e-03f, -3.686581736e-02f, +3.580924498e-02f, +4.185001294e-02f, -1.023421218e-01f, -1.194534887e-02f, +4.142597481e-01f, +5.631676181e-01f, +1.885699227e-01f, -1.126465443e-01f, -2.831805799e-02f, +6.354982285e-02f, -9.503343145e-03f, -3.182987850e-02f, +1.796816944e-02f, +1.114621525e-02f, -1.445063700e-02f, -5.941061375e-04f, +7.841985467e-03f, -2.544144944e-03f, -2.775059206e-03f, +1.998996172e-03f, +4.252640152e-04f, -7.251858742e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.112978975e-04f, +5.871673671e-04f, -2.255784358e-03f, +7.062217525e-04f, +5.292211027e-03f, -6.988966964e-03f, -3.929401400e-03f, +1.638504743e-02f, -7.968348841e-03f, -1.876250774e-02f, +2.737580044e-02f, +3.668853018e-03f, -3.877977112e-02f, +2.547845715e-02f, +2.670588063e-02f, -4.860196112e-02f, +6.301026190e-03f, +4.579120694e-02f, -3.793971861e-02f, -1.762111059e-02f, +4.595803951e-02f, -1.448391835e-02f, -2.869950068e-02f, +2.896862746e-02f, +4.027722584e-03f, -2.268571807e-02f, +1.005551400e-02f, +8.577993945e-03f, -1.019027450e-02f, +5.333009973e-04f, +4.527012306e-03f, -2.151507862e-03f, -4.252640152e-04f, +7.251858742e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.897846436e-05f, -6.535721937e-05f, -1.367859399e-04f, +3.246357830e-04f, +4.861157251e-05f, -7.617019767e-04f, +4.963048970e-04f, +1.103582358e-03f, -1.724089980e-03f, -7.557444035e-04f, +3.560497858e-03f, -1.127702779e-03f, -5.525876329e-03f, +5.816700690e-03f, +7.154815972e-03f, -1.895117576e-02f, -2.605357718e-02f, +8.933325890e-03f, +2.888403095e-02f, +6.080258955e-03f, -1.035841164e-02f, +3.862076857e-04f, +5.277347306e-03f, -2.207084703e-03f, -2.147753875e-03f, +2.110292211e-03f, +3.750199130e-04f, -1.308811255e-03f, +3.129171415e-04f, +5.387876784e-04f, -3.505987525e-04f, -1.037297279e-04f, +1.706744610e-04f, -2.533435089e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.897846436e-05f, +6.535721937e-05f, +1.468021015e-04f, -4.779633281e-04f, +1.967187451e-04f, +8.632675193e-04f, -1.286503976e-03f, -3.138551405e-04f, +2.452718358e-03f, -1.718864774e-03f, -2.098601618e-03f, +4.152082301e-03f, -6.643113960e-04f, -4.640115837e-03f, +4.417593386e-03f, +1.881716702e-03f, -6.187339930e-03f, +2.569789586e-03f, +4.292421448e-03f, -5.432600469e-03f, -1.769787936e-04f, +4.817686777e-03f, -2.995861166e-03f, -1.876739421e-03f, +3.397801589e-03f, -7.284145239e-04f, -1.828199279e-03f, +1.491207895e-03f, +2.343439974e-04f, -9.101527510e-04f, +3.478069317e-04f, +2.112442972e-04f, -1.706744610e-04f, +2.533435089e-05f, +0.000000000e+00f, + /* 10,13 (36) */ + +0.000000000e+00f, -2.523194331e-04f, -6.525245865e-04f, +1.599346190e-03f, +5.704474622e-04f, -4.475397533e-03f, +2.126456111e-03f, +7.713104721e-03f, -9.671917752e-03f, -7.563529605e-03f, +2.264296494e-02f, -2.243518239e-03f, -3.799352014e-02f, +3.028336865e-02f, +4.766671363e-02f, -9.518730587e-02f, -3.089652464e-02f, +3.882061709e-01f, +5.721009440e-01f, +2.174539537e-01f, -1.065662854e-01f, -3.867646963e-02f, +6.393603053e-02f, -4.225995840e-03f, -3.403696320e-02f, +1.582041557e-02f, +1.325650746e-02f, -1.407561709e-02f, -1.902917392e-03f, +8.154902609e-03f, -2.005357265e-03f, -3.125657959e-03f, +1.895266444e-03f, +5.959384762e-04f, -7.505202251e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.523194331e-04f, +6.525245865e-04f, -2.108982257e-03f, +2.282584243e-04f, +5.488929773e-03f, -6.125699445e-03f, -5.215905376e-03f, +1.607119229e-02f, -5.515630483e-03f, -2.048137252e-02f, +2.527719883e-02f, +7.820935319e-03f, -3.944408252e-02f, +2.083834132e-02f, +3.112347402e-02f, -4.672024442e-02f, +1.136862607e-04f, +4.836099653e-02f, -3.364729716e-02f, -2.305371106e-02f, +4.578106072e-02f, -9.666231573e-03f, -3.169536184e-02f, +2.709188803e-02f, +7.425524173e-03f, -2.341413259e-02f, +8.227314721e-03f, +1.006920184e-02f, -9.955930500e-03f, -3.768517537e-04f, +4.874819238e-03f, -1.940263565e-03f, -5.959384762e-04f, +7.505202251e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.686799517e-05f, -5.048104610e-05f, -1.505379459e-04f, +2.987487070e-04f, +1.070329941e-04f, -7.565447293e-04f, +3.729285139e-04f, +1.190446501e-03f, -1.561802592e-03f, -1.029091125e-03f, +3.468789506e-03f, -5.886766699e-04f, -5.722482458e-03f, +4.956947418e-03f, +8.039244336e-03f, -1.721901681e-02f, -2.709224689e-02f, +6.433473934e-03f, +2.911410294e-02f, +7.936149909e-03f, -1.032192300e-02f, -4.696474517e-04f, +5.528955538e-03f, -1.820947750e-03f, -2.440070971e-03f, +2.004987484e-03f, +5.833270222e-04f, -1.335397235e-03f, +2.125299559e-04f, +5.931378417e-04f, -3.245741528e-04f, -1.381448576e-04f, +1.742040072e-04f, -1.513779949e-05f, +0.000000000e+00f, + +0.000000000e+00f, -5.686799517e-05f, +5.048104610e-05f, +1.696619686e-04f, -4.528571409e-04f, +1.043542233e-04f, +9.170806654e-04f, -1.161825532e-03f, -5.396297686e-04f, +2.465319555e-03f, -1.378763756e-03f, -2.424792516e-03f, +3.967771208e-03f, -8.023245599e-05f, -4.893869695e-03f, +3.928819409e-03f, +2.554190250e-03f, -6.175033338e-03f, +1.863542627e-03f, +4.799722777e-03f, -5.127499849e-03f, -8.522127213e-04f, +5.018283861e-03f, -2.572322046e-03f, -2.313761148e-03f, +3.361979505e-03f, -3.962779854e-04f, -2.007613800e-03f, +1.390382041e-03f, +3.970459732e-04f, -9.477237061e-04f, +2.896164368e-04f, +2.579436044e-04f, -1.742040072e-04f, +1.513779949e-05f, +0.000000000e+00f, + /* 10,14 (36) */ + +0.000000000e+00f, -1.954514380e-04f, -7.030056326e-04f, +1.448808244e-03f, +8.691961692e-04f, -4.368364539e-03f, +1.369911382e-03f, +8.086033235e-03f, -8.481471251e-03f, -9.125332197e-03f, +2.161387382e-02f, +1.225271268e-03f, -3.858219681e-02f, +2.456088620e-02f, +5.262366104e-02f, -8.714806153e-02f, -4.811554144e-02f, +3.611139240e-01f, +5.785344179e-01f, +2.465680566e-01f, -9.863013548e-02f, -4.899839262e-02f, +6.346638308e-02f, +1.302959698e-03f, -3.585791095e-02f, +1.338034460e-02f, +1.526149494e-02f, -1.349229007e-02f, -3.238314627e-03f, +8.367432565e-03f, -1.412219424e-03f, -3.450232112e-03f, +1.757121586e-03f, +7.701424835e-04f, -7.656580246e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.954514380e-04f, +7.030056326e-04f, -1.939320288e-03f, -2.245987165e-04f, +5.593283996e-03f, -5.208618780e-03f, -6.377730908e-03f, +1.553156252e-02f, -3.050310928e-03f, -2.186013627e-02f, +2.285240631e-02f, +1.178870653e-02f, -3.952431497e-02f, +1.594447162e-02f, +3.505229343e-02f, -4.416605417e-02f, -6.061347078e-03f, +5.022453916e-02f, -2.884757439e-02f, -2.818121091e-02f, +4.492884800e-02f, -4.647947712e-03f, -3.426768389e-02f, +2.477812689e-02f, +1.078750368e-02f, -2.381041058e-02f, +6.219700920e-03f, +1.145958388e-02f, -9.558884527e-03f, -1.324575460e-03f, +5.164435675e-03f, -1.682319961e-03f, -7.701424835e-04f, +7.656580246e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.391097472e-05f, -3.592407024e-05f, -1.612093921e-04f, +2.700242113e-04f, +1.611372539e-04f, -7.412442005e-04f, +2.494776366e-04f, +1.258014460e-03f, -1.384438913e-03f, -1.279348831e-03f, +3.334406648e-03f, -6.046392525e-05f, -5.837850146e-03f, +4.068870907e-03f, +8.782090082e-03f, -1.542130069e-02f, -2.792284028e-02f, +3.881199688e-03f, +2.913597658e-02f, +9.815654971e-03f, -1.014940430e-02f, -1.353708248e-03f, +5.715262794e-03f, -1.396420030e-03f, -2.709265681e-03f, +1.868239599e-03f, +7.913703976e-04f, -1.344314247e-03f, +1.047914687e-04f, +6.415112318e-04f, -2.923973489e-04f, -1.725279642e-04f, +1.751889823e-04f, -3.784329719e-06f, +0.000000000e+00f, + +0.000000000e+00f, -5.391097472e-05f, +3.592407024e-05f, +1.880624540e-04f, -4.219838745e-04f, +1.493482220e-05f, +9.546290909e-04f, -1.024220164e-03f, -7.501245237e-04f, +2.440867502e-03f, -1.026284678e-03f, -2.708498128e-03f, +3.727931714e-03f, +4.969786261e-04f, -5.072635585e-03f, +3.385910532e-03f, +3.185499788e-03f, -6.071456451e-03f, +1.129403384e-03f, +5.237480478e-03f, -4.744380058e-03f, -1.520757418e-03f, +5.146294832e-03f, -2.103880952e-03f, -2.723920263e-03f, +3.274497897e-03f, -4.961619248e-05f, -2.161546552e-03f, +1.264509408e-03f, +5.600141608e-04f, -9.718574754e-04f, +2.234675677e-04f, +3.032592295e-04f, -1.751889823e-04f, +3.784329719e-06f, +0.000000000e+00f, + /* 10,15 (36) */ + +0.000000000e+00f, -1.415404632e-04f, -7.389297029e-04f, +1.287598852e-03f, +1.139220381e-03f, -4.207227285e-03f, +6.286671812e-04f, +8.335510872e-03f, -7.223456790e-03f, -1.050977111e-02f, +2.033452499e-02f, +4.559677915e-03f, -3.864266074e-02f, +1.872303605e-02f, +5.669253195e-02f, -7.836597145e-02f, -6.353684213e-02f, +3.331910838e-01f, +5.824156176e-01f, +2.757040332e-01f, -8.881448051e-02f, -5.914779692e-02f, +6.211267483e-02f, +7.018222492e-03f, -3.725433098e-02f, +1.067107892e-02f, +1.712973454e-02f, -1.270091967e-02f, -4.582628874e-03f, +8.472224034e-03f, -7.707081919e-04f, -3.742629460e-03f, +1.584593622e-03f, +9.453314657e-04f, -7.694423543e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.415404632e-04f, +7.389297029e-04f, -1.751257834e-03f, -6.465825911e-04f, +5.608218818e-03f, -4.253989689e-03f, -7.401951071e-03f, +1.478143799e-02f, -6.094434262e-04f, -2.288642095e-02f, +2.014390818e-02f, +1.551663824e-02f, -3.902733634e-02f, +1.087183604e-02f, +3.843820396e-02f, -4.098055438e-02f, -1.213280353e-02f, +5.135394254e-02f, -2.361009391e-02f, -3.292559096e-02f, +4.340809058e-02f, +4.983471210e-04f, -3.637156484e-02f, +2.205420662e-02f, +1.406200157e-02f, -2.386002677e-02f, +4.058154368e-03f, +1.272409329e-02f, -8.998870366e-03f, -2.296432935e-03f, +5.387903242e-03f, -1.379060731e-03f, -9.453314657e-04f, +7.694423543e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.023134456e-05f, -2.190255501e-05f, -1.688223017e-04f, +2.390309122e-04f, +2.103608979e-04f, -7.164513821e-04f, +1.276517827e-04f, +1.306087259e-03f, -1.194919714e-03f, -1.503966945e-03f, +3.160553007e-03f, +4.504223033e-04f, -5.873380723e-03f, +3.164503237e-03f, +9.381395225e-03f, -1.357609648e-02f, -2.854133495e-02f, +1.297262942e-03f, +2.894571562e-02f, +1.170154190e-02f, -9.836779302e-03f, -2.255639644e-03f, +5.831432835e-03f, -9.379074490e-04f, -2.950847993e-03f, +1.700823497e-03f, +9.962288442e-04f, -1.334740657e-03f, -9.061379130e-06f, +6.829239910e-04f, -2.542369269e-04f, -2.063423291e-04f, +1.734450844e-04f, +8.610096471e-06f, +0.000000000e+00f, + +0.000000000e+00f, -5.023134456e-05f, +2.190255501e-05f, +2.019751614e-04f, -3.861753858e-04f, -7.025519776e-05f, +9.760043827e-04f, -8.762743588e-04f, -9.426127885e-04f, +2.380746322e-03f, -6.670301471e-04f, -2.946312073e-03f, +3.437091543e-03f, +1.058782302e-03f, -5.174551379e-03f, +2.797408819e-03f, +3.766421654e-03f, -5.878377207e-03f, +3.783561031e-04f, +5.598913174e-03f, -4.288541765e-03f, -2.172477802e-03f, +5.198937536e-03f, -1.596989202e-03f, -3.100476839e-03f, +3.135594535e-03f, +3.065756726e-04f, -2.286851473e-03f, +1.114731918e-03f, +7.206449357e-04f, -9.815523707e-04f, +1.500603778e-04f, +3.463027545e-04f, -1.734450844e-04f, -8.610096471e-06f, +0.000000000e+00f, + /* 11, 0 (32) */ + +0.000000000e+00f, +3.454933159e-04f, +1.541097233e-03f, -3.365769507e-03f, +1.849372243e-04f, +7.921455674e-03f, -9.933387929e-03f, -4.722893055e-03f, +2.491782703e-02f, -1.923850865e-02f, -2.511889872e-02f, +6.555431985e-02f, -2.774896345e-02f, -1.143270713e-01f, +2.866385681e-01f, +6.354451792e-01f, +2.866385681e-01f, -1.143270713e-01f, -2.774896345e-02f, +6.555431985e-02f, -2.511889872e-02f, -1.923850865e-02f, +2.491782703e-02f, -4.722893055e-03f, -9.933387929e-03f, +7.921455674e-03f, +1.849372243e-04f, -3.365769507e-03f, +1.541097233e-03f, +3.454933159e-04f, -4.305061225e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.454933159e-04f, -1.287417451e-03f, +5.082890229e-03f, -4.452826306e-03f, -5.152110347e-03f, +1.588482173e-02f, -1.131295515e-02f, -1.199676363e-02f, +3.147222030e-02f, -1.942348993e-02f, -1.990214054e-02f, +4.584722208e-02f, -2.506967236e-02f, -2.523864421e-02f, +5.173229864e-02f, -2.523864421e-02f, -2.506967236e-02f, +4.584722208e-02f, -1.990214054e-02f, -1.942348993e-02f, +3.147222030e-02f, -1.199676363e-02f, -1.131295515e-02f, +1.588482173e-02f, -5.152110347e-03f, -4.452826306e-03f, +5.082890229e-03f, -1.287417451e-03f, -7.762310022e-04f, +4.305061225e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.399604254e-04f, +1.041765491e-04f, +2.986283797e-04f, -7.115835566e-04f, +2.200087399e-04f, +1.290622629e-03f, -2.007399170e-03f, -1.847465416e-04f, +4.038384288e-03f, -4.234443633e-03f, -2.943297891e-03f, +1.200925710e-02f, -7.413000132e-03f, -3.454462879e-02f, -1.675619045e-03f, +3.441971216e-02f, +9.809674830e-03f, -1.217880404e-02f, +2.010048142e-03f, +4.814598421e-03f, -3.887513846e-03f, -2.142409335e-04f, +2.170997092e-03f, -1.185826608e-03f, -3.634744702e-04f, +7.486225761e-04f, -2.595530007e-04f, -1.401057002e-04f, +1.471444736e-04f, -3.315285962e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.399604254e-04f, -2.714216420e-04f, -1.520612352e-04f, +9.909186848e-04f, -1.172027193e-03f, -3.022516193e-04f, +2.503704416e-03f, -2.716755794e-03f, -4.456389479e-04f, +4.365791338e-03f, -4.428304910e-03f, -5.070221017e-04f, +5.764277198e-03f, -5.506807710e-03f, -4.425173936e-04f, +5.957741012e-03f, -5.372316216e-03f, -2.775764127e-04f, +4.833429021e-03f, -4.105732234e-03f, -9.342864861e-05f, +2.998386549e-03f, -2.381896629e-03f, +2.989319289e-05f, +1.316518315e-03f, -9.605757532e-04f, +6.507439985e-05f, +3.191257033e-04f, -2.010311674e-04f, +3.315285962e-05f, +0.000000000e+00f, + /* 11, 1 (32) */ + +0.000000000e+00f, +2.055328905e-04f, +1.645273782e-03f, -3.067141127e-03f, -5.266463322e-04f, +8.141464414e-03f, -8.642765300e-03f, -6.730292225e-03f, +2.473308049e-02f, -1.520012436e-02f, -2.935334235e-02f, +6.261102195e-02f, -1.573970634e-02f, -1.217400715e-01f, +2.520939393e-01f, +6.337695601e-01f, +3.210582802e-01f, -1.045173965e-01f, -3.992776749e-02f, +6.756436799e-02f, -2.030430029e-02f, -2.312602249e-02f, +2.470358610e-02f, -2.551895963e-03f, -1.111921454e-02f, +7.557981204e-03f, +9.335598005e-04f, -3.625322507e-03f, +1.400991533e-03f, +4.926377895e-04f, -4.636589821e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.055328905e-04f, -1.558839093e-03f, +4.930828994e-03f, -3.461907621e-03f, -6.324137540e-03f, +1.558257011e-02f, -8.809250736e-03f, -1.471351943e-02f, +3.102658135e-02f, -1.505769859e-02f, -2.433044545e-02f, +4.534019998e-02f, -1.930539516e-02f, -3.074545192e-02f, +5.128978125e-02f, -1.928090320e-02f, -3.044198857e-02f, +4.556964567e-02f, -1.506871152e-02f, -2.352922217e-02f, +3.137879165e-02f, -8.998377082e-03f, -1.369485178e-02f, +1.591471492e-02f, -3.835592032e-03f, -5.413402059e-03f, +5.147964629e-03f, -9.682917474e-04f, -9.772621697e-04f, +4.636589821e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.307312654e-04f, +6.892978118e-05f, +3.303462436e-04f, -6.648056295e-04f, +7.980483913e-05f, +1.370176154e-03f, -1.818623406e-03f, -5.652322161e-04f, +4.120340294e-03f, -3.611381843e-03f, -3.792586585e-03f, +1.167016172e-02f, -5.071274913e-03f, -3.437345706e-02f, -5.010603072e-03f, +3.399429673e-02f, +1.223580090e-02f, -1.216800061e-02f, +1.003764677e-03f, +5.340871520e-03f, -3.667467789e-03f, -6.259085202e-04f, +2.305633509e-03f, -1.056428589e-03f, -5.078899367e-04f, +7.747425269e-04f, -2.133848905e-04f, -1.760720761e-04f, +1.519596632e-04f, -2.685306184e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.307312654e-04f, -2.217972983e-04f, -2.311650394e-04f, +1.001898222e-03f, -1.012712208e-03f, -5.596855127e-04f, +2.578160955e-03f, -2.395085426e-03f, -9.655624416e-04f, +4.545869262e-03f, -3.952208277e-03f, -1.274926019e-03f, +6.054025378e-03f, -4.962195739e-03f, -1.319799421e-03f, +6.306773198e-03f, -4.884366485e-03f, -1.065181453e-03f, +5.159434945e-03f, -3.768946506e-03f, -6.423743823e-04f, +3.233859346e-03f, -2.213529401e-03f, -2.528729306e-04f, +1.442834315e-03f, -9.105023451e-04f, -2.849917238e-05f, +3.637431385e-04f, -2.007290083e-04f, +2.685306184e-05f, +0.000000000e+00f, + /* 11, 2 (32) */ + +0.000000000e+00f, +7.480162519e-05f, +1.714203563e-03f, -2.736794883e-03f, -1.191451962e-03f, +8.221269253e-03f, -7.272589145e-03f, -8.548915631e-03f, +2.416784827e-02f, -1.107978407e-02f, -3.296472419e-02f, +5.881843537e-02f, -4.069544625e-03f, -1.268113464e-01f, +2.177204822e-01f, +6.287589571e-01f, +3.550525770e-01f, -9.228159561e-02f, -5.209576810e-02f, +6.856813267e-02f, -1.496342877e-02f, -2.679349028e-02f, +2.407767758e-02f, -2.462624541e-04f, -1.217564313e-02f, +7.050091267e-03f, +1.708302327e-03f, -3.838707398e-03f, +1.224919457e-03f, +6.445974527e-04f, -4.905120440e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.480162519e-05f, -1.780636391e-03f, +4.699663955e-03f, -2.460009399e-03f, -7.336849749e-03f, +1.502288459e-02f, -6.231089781e-03f, -1.710860485e-02f, +3.006101891e-02f, -1.051182933e-02f, -2.828265373e-02f, +4.406527396e-02f, -1.325136978e-02f, -3.570764766e-02f, +4.996998183e-02f, -1.297413000e-02f, -3.532635506e-02f, +4.450446421e-02f, -9.909276578e-03f, -2.729816867e-02f, +3.073641726e-02f, -5.764517736e-03f, -1.590838118e-02f, +1.566184199e-02f, -2.392757717e-03f, -6.323904404e-03f, +5.119465457e-03f, -6.045486089e-04f, -1.177991178e-03f, +4.905120440e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.197987467e-04f, +3.495771602e-05f, +3.545858643e-04f, -6.095759291e-04f, -5.498480556e-05f, +1.424286778e-03f, -1.608709499e-03f, -9.219085338e-04f, +4.134708898e-03f, -2.956633492e-03f, -4.548636410e-03f, +1.117413572e-02f, -2.808650060e-03f, -3.391382572e-02f, -8.297016562e-03f, +3.326728023e-02f, +1.466482656e-02f, -1.196806374e-02f, -6.307772297e-05f, +5.802714914e-03f, -3.379094539e-03f, -1.043996991e-03f, +2.407854881e-03f, -9.035169628e-04f, -6.508167323e-04f, +7.888970184e-04f, -1.605359360e-04f, -2.113872174e-04f, +1.541084338e-04f, -1.912402271e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.197987467e-04f, -1.713870949e-04f, -3.013125153e-04f, +9.942311033e-04f, -8.420672912e-04f, -7.981028032e-04f, +2.605351521e-03f, -2.040060195e-03f, -1.457607839e-03f, +4.644186430e-03f, -3.414433922e-03f, -2.012878036e-03f, +6.237185937e-03f, -4.333758325e-03f, -2.173962125e-03f, +6.547465475e-03f, -4.308401061e-03f, -1.841917467e-03f, +5.399489258e-03f, -3.360128864e-03f, -1.191560114e-03f, +3.417750004e-03f, -2.000282133e-03f, -5.411772459e-04f, +1.547837769e-03f, -8.407043378e-04f, -1.271556887e-04f, +4.040997418e-04f, -1.956734673e-04f, +1.912402271e-05f, +0.000000000e+00f, + /* 11, 3 (32) */ + +0.000000000e+00f, -4.499712153e-05f, +1.749161279e-03f, -2.382209019e-03f, -1.801027891e-03f, +8.166284447e-03f, -5.848302367e-03f, -1.015762513e-02f, +2.324593974e-02f, -6.945075168e-03f, -3.592135768e-02f, +5.426979896e-02f, +7.104591091e-03f, -1.296199964e-01f, +1.838066565e-01f, +6.204619405e-01f, +3.883198572e-01f, -7.761676906e-02f, -6.406383185e-02f, +6.850505494e-02f, -9.160713861e-03f, -3.017258482e-02f, +2.303368059e-02f, +2.161592427e-03f, -1.307916009e-02f, +6.399274535e-03f, +2.497199346e-03f, -3.999243334e-03f, +1.013532239e-03f, +7.987058865e-04f, -5.096360667e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.499712153e-05f, -1.952023486e-03f, +4.398351440e-03f, -1.465778295e-03f, -8.178917040e-03f, +1.422478179e-02f, -3.625738261e-03f, -1.914866505e-02f, +2.860341107e-02f, -5.867642902e-03f, -3.169708765e-02f, +4.205239592e-02f, -7.014183843e-03f, -4.004140599e-02f, +4.779601970e-02f, -6.426664530e-03f, -3.963475612e-02f, +4.266254675e-02f, -4.509787320e-03f, -3.065829754e-02f, +2.954485715e-02f, -2.346767732e-03f, -1.790866331e-02f, +1.512066474e-02f, -8.449199480e-04f, -7.164608742e-03f, +4.992309768e-03f, -2.004488672e-04f, -1.373664645e-03f, +5.096360667e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.075145692e-04f, +2.791820816e-06f, +3.713650726e-04f, -5.472611389e-04f, -1.823966401e-04f, +1.453179366e-03f, -1.381877687e-03f, -1.250047714e-03f, +4.083824124e-03f, -2.281486140e-03f, -5.203894462e-03f, +1.053539043e-02f, -6.476584866e-04f, -3.317645239e-02f, -1.150311548e-02f, +3.224091711e-02f, +1.706945906e-02f, -1.157240936e-02f, -1.176584853e-03f, +6.190187725e-03f, -3.024379522e-03f, -1.461896240e-03f, +2.474609177e-03f, -7.286283776e-04f, -7.897272177e-04f, +7.901990787e-04f, -1.015655426e-04f, -2.453303176e-04f, +1.533275451e-04f, -1.001616161e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.075145692e-04f, -1.212714302e-04f, -3.616636038e-04f, +9.689545383e-04f, -6.636577527e-04f, -1.013897991e-03f, +2.586211951e-03f, -1.658796092e-03f, -1.913720021e-03f, +4.660445649e-03f, -2.825243912e-03f, -2.708284773e-03f, +6.311299411e-03f, -3.632797577e-03f, -2.990053264e-03f, +6.675283650e-03f, -3.654009310e-03f, -2.593970440e-03f, +5.548211855e-03f, -2.885352155e-03f, -1.731145461e-03f, +3.545446236e-03f, -1.744715690e-03f, -8.298788745e-04f, +1.628674706e-03f, -7.515772681e-04f, -2.292045253e-04f, +4.390390155e-04f, -1.855878775e-04f, +1.001616161e-05f, +0.000000000e+00f, + /* 11, 4 (32) */ + +0.000000000e+00f, -1.525116908e-04f, +1.751953100e-03f, -2.010843946e-03f, -2.348289030e-03f, +7.983887807e-03f, -4.395123001e-03f, -1.153950282e-02f, +2.199589203e-02f, -2.861251044e-03f, -3.820284382e-02f, +4.906590450e-02f, +1.763998152e-02f, -1.302676549e-01f, +1.506302041e-01f, +6.089588250e-01f, +4.205607743e-01f, -6.054731000e-02f, -7.563624121e-02f, +6.732847009e-02f, -2.970526136e-03f, -3.319696434e-02f, +2.157178435e-02f, +4.636201605e-03f, -1.380778847e-02f, +5.609547317e-03f, +3.287398424e-03f, -4.100808877e-03f, +7.682019216e-04f, +9.520334316e-04f, -5.196522283e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.525116908e-04f, -2.073294916e-03f, +4.036687836e-03f, -4.968237572e-04f, -8.842574792e-03f, +1.321088380e-02f, -1.039526309e-03f, -2.080746114e-02f, +2.668969105e-02f, -1.207197253e-03f, -3.452233157e-02f, +3.934411115e-02f, -7.028844317e-04f, -4.367420357e-02f, +4.480596644e-02f, +2.486191205e-04f, -4.328876543e-02f, +4.006857631e-02f, +1.038424535e-03f, -3.354364969e-02f, +2.781371169e-02f, +1.198678504e-03f, -1.965337901e-02f, +1.429078587e-02f, +7.837547575e-04f, -7.916186010e-03f, +4.763105243e-03f, +2.385901483e-04f, -1.559252523e-03f, +5.196522283e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.423259651e-05f, -2.710370466e-05f, +3.808325289e-04f, -4.792799535e-04f, -3.006807112e-04f, +1.457482743e-03f, -1.142453153e-03f, -1.545555763e-03f, +3.970954405e-03f, -1.597120740e-03f, -5.752581056e-03f, +9.769492281e-03f, +1.391029546e-03f, -3.217497647e-02f, -1.459810151e-02f, +3.092082508e-02f, +1.942199261e-02f, -1.097680665e-02f, -2.321595832e-03f, +6.494133407e-03f, -2.606455251e-03f, -1.872740937e-03f, +2.503313221e-03f, -5.337403646e-04f, -9.220448299e-04f, +7.779451282e-04f, -3.717827743e-05f, -2.771604496e-04f, +1.493959888e-04f, +3.828556293e-07f, +0.000000000e+00f, + +0.000000000e+00f, +9.423259651e-05f, -7.245690575e-05f, -4.116164933e-04f, +9.273919632e-04f, -4.810502642e-04f, -1.204002802e-03f, +2.522487056e-03f, -1.258700448e-03f, -2.326654291e-03f, +4.595812404e-03f, -2.195670544e-03f, -3.349435626e-03f, +6.275852711e-03f, -2.871856988e-03f, -3.753802700e-03f, +6.687684854e-03f, -2.932233975e-03f, -3.307838086e-03f, +5.601792117e-03f, -2.351978856e-03f, -2.251264847e-03f, +3.613252870e-03f, -1.450249299e-03f, -1.113654754e-03f, +1.682841202e-03f, -6.439158093e-04f, -3.327938628e-04f, +4.674487560e-04f, -1.702953811e-04f, -3.828556293e-07f, +0.000000000e+00f, + /* 11, 5 (32) */ + +0.000000000e+00f, -2.467442873e-04f, +1.724849395e-03f, -1.630011418e-03f, -2.827568983e-03f, +7.683207096e-03f, -2.937640258e-03f, -1.268195597e-02f, +2.045033626e-02f, +1.109703361e-03f, -3.979996456e-02f, +4.331332344e-02f, +2.740947380e-02f, -1.288766254e-01f, +1.184552276e-01f, +5.943607235e-01f, +4.514815994e-01f, -4.112531739e-02f, -8.661304785e-02f, +6.500687426e-02f, +3.523607271e-03f, -3.580341959e-02f, +1.969904341e-02f, +7.139514826e-03f, -1.434152883e-02f, +4.687502487e-03f, +4.065343553e-03f, -4.137987154e-03f, +4.910414720e-04f, +1.101429420e-03f, -5.192693727e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.467442873e-04f, -2.145751822e-03f, +3.625071342e-03f, +4.305682060e-04f, -9.323625057e-03f, +1.200688100e-02f, +1.482960747e-03f, -2.206616159e-02f, +2.436303675e-02f, +3.388615151e-03f, -3.671800211e-02f, +3.599467552e-02f, +5.572968280e-03f, -4.654606055e-02f, +4.105216374e-02f, +6.936303974e-03f, -4.622099940e-02f, +3.676073822e-02f, +6.640216652e-03f, -3.589562855e-02f, +2.556244684e-02f, +4.811931374e-03f, -2.110362830e-02f, +1.317713111e-02f, +2.466595959e-03f, -8.560101819e-03f, +4.430311380e-03f, +7.060389043e-04f, -1.729547904e-03f, +5.192693727e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.030149258e-05f, -5.433670509e-05f, +3.832580123e-04f, -4.070759198e-04f, -4.083206773e-04f, +1.438202486e-03f, -8.947915600e-04f, -1.805014389e-03f, +3.800217875e-03f, -9.144453014e-04f, -6.190710991e-03f, +8.893112110e-03f, +3.288822149e-03f, -3.092575692e-02f, -1.755248302e-02f, +2.931594908e-02f, +2.169464718e-02f, -1.017950378e-02f, -3.481859008e-03f, +6.706350839e-03f, -2.129593340e-03f, -2.269513888e-03f, +2.491914723e-03f, -3.212560480e-04f, -1.045187034e-03f, +7.516367599e-04f, +3.178135117e-05f, -3.061298911e-04f, +1.421424992e-04f, +1.194746278e-05f, +0.000000000e+00f, + +0.000000000e+00f, +8.030149258e-05f, -2.585919819e-05f, -4.508075312e-04f, +8.711146184e-04f, -2.977454210e-04f, -1.365925069e-03f, +2.416675152e-03f, -8.473300397e-04f, -2.690090414e-03f, +4.452868841e-03f, -1.537307931e-03f, -3.925703444e-03f, +6.132274715e-03f, -2.064492216e-03f, -4.451877688e-03f, +6.584168342e-03f, -2.155380859e-03f, -3.970576614e-03f, +5.558077690e-03f, -1.768547346e-03f, -2.742208475e-03f, +3.618482286e-03f, -1.121120444e-03f, -1.387095215e-03f, +1.708245537e-03f, -5.189155386e-04f, -4.359409679e-04f, +4.882881120e-04f, -1.497297397e-04f, -1.194746278e-05f, +0.000000000e+00f, + /* 11, 6 (32) */ + +0.000000000e+00f, -3.270457799e-04f, +1.670512690e-03f, -1.246753405e-03f, -3.234644903e-03f, +7.274886419e-03f, -1.499437772e-03f, -1.357674753e-02f, +1.864532187e-02f, +4.909921236e-03f, -4.071440986e-02f, +3.712261245e-02f, +3.630258591e-02f, -1.255878032e-01f, +8.752947072e-02f, +5.768082405e-01f, +4.807975485e-01f, -1.943067021e-02f, -9.679255163e-02f, +6.152501525e-02f, +1.022995811e-02f, -3.793301293e-02f, +1.742952952e-02f, +9.631429549e-03f, -1.466278488e-02f, +3.642315453e-03f, +4.816980313e-03f, -4.106205803e-03f, +1.849115809e-04f, +1.243571920e-03f, -5.073219099e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.270457799e-04f, -2.171611020e-03f, +3.174263811e-03f, +1.301682824e-03f, -9.621370478e-03f, +1.064095593e-02f, +3.899635899e-03f, -2.291349163e-02f, +2.167294634e-02f, +7.841483992e-03f, -3.825531004e-02f, +3.206897208e-02f, +1.170524299e-02f, -4.861055277e-02f, +3.660028605e-02f, +1.352047232e-02f, -4.837638026e-02f, +3.279016161e-02f, +1.219829434e-02f, -3.766417590e-02f, +2.282023837e-02f, +8.430413660e-03f, -2.222474875e-02f, +1.179003590e-02f, +4.174841496e-03f, -9.079017358e-03f, +3.994370412e-03f, +1.194327016e-03f, -1.879277644e-03f, +5.073219099e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.605790481e-05f, -7.859020218e-05f, +3.790210013e-04f, -3.320911204e-04f, -5.040489558e-04f, +1.396688521e-03f, -6.432069161e-04f, -2.025710559e-03f, +3.576487267e-03f, -2.439382415e-04f, -6.516088221e-03f, +7.923766014e-03f, +5.029390160e-03f, -2.944763799e-02f, -2.033841886e-02f, +2.743848295e-02f, +2.385991397e-02f, -9.181322639e-03f, -4.640229032e-03f, +6.819756489e-03f, -1.599177980e-03f, -2.645155693e-03f, +2.438947738e-03f, -9.398088869e-05f, -1.156610267e-03f, +7.109998284e-04f, +1.043370223e-04f, -3.314983423e-04f, +1.314524813e-04f, +2.451436211e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.605790481e-05f, +1.771118770e-05f, -4.791062706e-04f, +8.018998884e-04f, -1.171141105e-04f, -1.497775478e-03f, +2.271960141e-03f, -4.322498801e-04f, -2.998727403e-03f, +4.235542723e-03f, -8.620962011e-04f, -4.427723534e-03f, +5.883896733e-03f, -1.225024426e-03f, -5.072121008e-03f, +6.366289365e-03f, -1.336804441e-03f, -4.570039469e-03f, +5.416633899e-03f, -1.144634675e-03f, -3.194603884e-03f, +3.559527997e-03f, -7.623281066e-04f, -1.644804275e-03f, +1.703264485e-03f, -3.781666435e-04f, -5.365666914e-04f, +5.006145340e-04f, -1.239441717e-04f, -2.451436211e-05f, +0.000000000e+00f, + /* 11, 7 (32) */ + +0.000000000e+00f, -3.931036847e-04f, +1.591922488e-03f, -8.677324040e-04f, -3.566736023e-03f, +6.770837463e-03f, -1.027492505e-04f, -1.421995445e-02f, +1.661961131e-02f, +8.486408502e-03f, -4.095834811e-02f, +3.060652423e-02f, +4.422635193e-02f, -1.205584131e-01f, +5.808183272e-02f, +5.564698216e-01f, +5.082360314e-01f, +4.429243765e-03f, -1.059738743e-01f, +5.688478622e-02f, +1.704971460e-02f, -3.953219091e-02f, +1.478437383e-02f, +1.207037729e-02f, -1.475676577e-02f, +2.485705186e-03f, +5.527980141e-03f, -4.001868780e-03f, -1.465867614e-04f, +1.375024401e-03f, -4.828075478e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.931036847e-04f, -2.153899832e-03f, +2.695157541e-03f, +2.103582713e-03f, -9.738484588e-03f, +9.143180449e-03f, +6.171596040e-03f, -2.334574151e-02f, +1.867421894e-02f, +1.207702671e-02f, -3.911740624e-02f, +2.764124854e-02f, +1.758913973e-02f, -4.983557720e-02f, +3.152816504e-02f, +1.988676168e-02f, -4.971318470e-02f, +2.822012214e-02f, +1.761492824e-02f, -3.880881057e-02f, +1.962563448e-02f, +1.198994166e-02f, -2.298707685e-02f, +1.014523162e-02f, +5.878105981e-03f, -9.457184001e-03f, +3.457803721e-03f, +1.694941550e-03f, -2.003221815e-03f, +4.828075478e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.182030238e-05f, -9.962390851e-05f, +3.685978409e-04f, -2.557411293e-04f, -5.868569481e-04f, +1.334598274e-03f, -3.919028713e-04f, -2.205653655e-03f, +3.305286243e-03f, +4.044964937e-04f, -6.728274744e-03f, +6.879551499e-03f, +6.598818152e-03f, -2.776168626e-02f, -2.293004068e-02f, +2.530374954e-02f, +2.589090270e-02f, -7.985720658e-03f, -5.778882790e-03f, +6.828534886e-03f, -1.021660698e-03f, -2.992679084e-03f, +2.343580374e-03f, +1.449084482e-04f, -1.253856162e-03f, +6.560003737e-04f, +1.793916280e-04f, -3.525478016e-04f, +1.172741787e-04f, +3.788356071e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.182030238e-05f, +5.756011899e-05f, -4.966059787e-04f, +7.216873692e-04f, +5.766121231e-05f, -1.598282041e-03f, +2.092132763e-03f, -2.089533043e-05f, -3.248357673e-03f, +3.949013080e-03f, -1.821023717e-04f, -4.847547932e-03f, +5.535878828e-03f, -3.682807604e-04f, -5.603767603e-03f, +6.037635758e-03f, -4.906732555e-04f, -5.095103581e-03f, +5.178772370e-03f, -4.906980429e-04f, -3.599594689e-03f, +3.435919606e-03f, -3.795599826e-04f, -1.881502821e-03f, +1.666792427e-03f, -2.236393745e-04f, -6.325336388e-04f, +5.036100117e-04f, -9.311789802e-05f, -3.788356071e-05f, +0.000000000e+00f, + /* 11, 8 (32) */ + +0.000000000e+00f, -4.449239871e-04f, +1.492298580e-03f, -4.991345630e-04f, -3.822477153e-03f, +6.183980515e-03f, +1.231849024e-03f, -1.461185732e-02f, +1.441395766e-02f, +1.179169475e-02f, -4.055385161e-02f, +2.387824949e-02f, +5.110590343e-02f, -1.139595949e-01f, +3.032014646e-02f, +5.335397809e-01f, +5.335397809e-01f, +3.032014646e-02f, -1.139595949e-01f, +5.110590343e-02f, +2.387824949e-02f, -4.055385161e-02f, +1.179169475e-02f, +1.441395766e-02f, -1.461185732e-02f, +1.231849024e-03f, +6.183980515e-03f, -3.822477153e-03f, -4.991345630e-04f, +1.492298580e-03f, -4.449239871e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.449239871e-04f, -2.096339713e-03f, +2.198551562e-03f, +2.825270082e-03f, -9.680823376e-03f, +7.544898408e-03f, +8.263728803e-03f, -2.336663684e-02f, +1.542586126e-02f, +1.602603979e-02f, -3.929950861e-02f, +2.279370061e-02f, +2.312501856e-02f, -5.020385796e-02f, +2.592439744e-02f, +2.592439744e-02f, -5.020385796e-02f, +2.312501856e-02f, +2.279370061e-02f, -3.929950861e-02f, +1.602603979e-02f, +1.542586126e-02f, -2.336663684e-02f, +8.263728803e-03f, +7.544898408e-03f, -9.680823376e-03f, +2.825270082e-03f, +2.198551562e-03f, -2.096339713e-03f, +4.449239871e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.788356071e-05f, -1.172741787e-04f, +3.525478016e-04f, -1.793916280e-04f, -6.560003737e-04f, +1.253856162e-03f, -1.449084482e-04f, -2.343580374e-03f, +2.992679084e-03f, +1.021660698e-03f, -6.828534886e-03f, +5.778882790e-03f, +7.985720658e-03f, -2.589090270e-02f, -2.530374954e-02f, +2.293004068e-02f, +2.776168626e-02f, -6.598818152e-03f, -6.879551499e-03f, +6.728274744e-03f, -4.044964937e-04f, -3.305286243e-03f, +2.205653655e-03f, +3.919028713e-04f, -1.334598274e-03f, +5.868569481e-04f, +2.557411293e-04f, -3.685978409e-04f, +9.962390851e-05f, +5.182030238e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.788356071e-05f, +9.311789802e-05f, -5.036100117e-04f, +6.325336388e-04f, +2.236393745e-04f, -1.666792427e-03f, +1.881502821e-03f, +3.795599826e-04f, -3.435919606e-03f, +3.599594689e-03f, +4.906980429e-04f, -5.178772370e-03f, +5.095103581e-03f, +4.906732555e-04f, -6.037635758e-03f, +5.603767603e-03f, +3.682807604e-04f, -5.535878828e-03f, +4.847547932e-03f, +1.821023717e-04f, -3.949013080e-03f, +3.248357673e-03f, +2.089533043e-05f, -2.092132763e-03f, +1.598282041e-03f, -5.766121231e-05f, -7.216873692e-04f, +4.966059787e-04f, -5.756011899e-05f, -5.182030238e-05f, +0.000000000e+00f, + /* 11, 9 (32) */ + +0.000000000e+00f, -4.828075478e-04f, +1.375024401e-03f, -1.465867614e-04f, -4.001868780e-03f, +5.527980141e-03f, +2.485705186e-03f, -1.475676577e-02f, +1.207037729e-02f, +1.478437383e-02f, -3.953219091e-02f, +1.704971460e-02f, +5.688478622e-02f, -1.059738743e-01f, +4.429243765e-03f, +5.082360314e-01f, +5.564698216e-01f, +5.808183272e-02f, -1.205584131e-01f, +4.422635193e-02f, +3.060652423e-02f, -4.095834811e-02f, +8.486408502e-03f, +1.661961131e-02f, -1.421995445e-02f, -1.027492505e-04f, +6.770837463e-03f, -3.566736023e-03f, -8.677324040e-04f, +1.591922488e-03f, -3.931036847e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.828075478e-04f, -2.003221815e-03f, +1.694941550e-03f, +3.457803721e-03f, -9.457184001e-03f, +5.878105981e-03f, +1.014523162e-02f, -2.298707685e-02f, +1.198994166e-02f, +1.962563448e-02f, -3.880881057e-02f, +1.761492824e-02f, +2.822012214e-02f, -4.971318470e-02f, +1.988676168e-02f, +3.152816504e-02f, -4.983557720e-02f, +1.758913973e-02f, +2.764124854e-02f, -3.911740624e-02f, +1.207702671e-02f, +1.867421894e-02f, -2.334574151e-02f, +6.171596040e-03f, +9.143180449e-03f, -9.738484588e-03f, +2.103582713e-03f, +2.695157541e-03f, -2.153899832e-03f, +3.931036847e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.451436211e-05f, -1.314524813e-04f, +3.314983423e-04f, -1.043370223e-04f, -7.109998284e-04f, +1.156610267e-03f, +9.398088869e-05f, -2.438947738e-03f, +2.645155693e-03f, +1.599177980e-03f, -6.819756489e-03f, +4.640229032e-03f, +9.181322639e-03f, -2.385991397e-02f, -2.743848295e-02f, +2.033841886e-02f, +2.944763799e-02f, -5.029390160e-03f, -7.923766014e-03f, +6.516088221e-03f, +2.439382415e-04f, -3.576487267e-03f, +2.025710559e-03f, +6.432069161e-04f, -1.396688521e-03f, +5.040489558e-04f, +3.320911204e-04f, -3.790210013e-04f, +7.859020218e-05f, +6.605790481e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.451436211e-05f, +1.239441717e-04f, -5.006145340e-04f, +5.365666914e-04f, +3.781666435e-04f, -1.703264485e-03f, +1.644804275e-03f, +7.623281066e-04f, -3.559527997e-03f, +3.194603884e-03f, +1.144634675e-03f, -5.416633899e-03f, +4.570039469e-03f, +1.336804441e-03f, -6.366289365e-03f, +5.072121008e-03f, +1.225024426e-03f, -5.883896733e-03f, +4.427723534e-03f, +8.620962011e-04f, -4.235542723e-03f, +2.998727403e-03f, +4.322498801e-04f, -2.271960141e-03f, +1.497775478e-03f, +1.171141105e-04f, -8.018998884e-04f, +4.791062706e-04f, -1.771118770e-05f, -6.605790481e-05f, +0.000000000e+00f, + /* 11,10 (32) */ + +0.000000000e+00f, -5.073219099e-04f, +1.243571920e-03f, +1.849115809e-04f, -4.106205803e-03f, +4.816980313e-03f, +3.642315453e-03f, -1.466278488e-02f, +9.631429549e-03f, +1.742952952e-02f, -3.793301293e-02f, +1.022995811e-02f, +6.152501525e-02f, -9.679255163e-02f, -1.943067021e-02f, +4.807975485e-01f, +5.768082405e-01f, +8.752947072e-02f, -1.255878032e-01f, +3.630258591e-02f, +3.712261245e-02f, -4.071440986e-02f, +4.909921236e-03f, +1.864532187e-02f, -1.357674753e-02f, -1.499437772e-03f, +7.274886419e-03f, -3.234644903e-03f, -1.246753405e-03f, +1.670512690e-03f, -3.270457799e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.073219099e-04f, -1.879277644e-03f, +1.194327016e-03f, +3.994370412e-03f, -9.079017358e-03f, +4.174841496e-03f, +1.179003590e-02f, -2.222474875e-02f, +8.430413660e-03f, +2.282023837e-02f, -3.766417590e-02f, +1.219829434e-02f, +3.279016161e-02f, -4.837638026e-02f, +1.352047232e-02f, +3.660028605e-02f, -4.861055277e-02f, +1.170524299e-02f, +3.206897208e-02f, -3.825531004e-02f, +7.841483992e-03f, +2.167294634e-02f, -2.291349163e-02f, +3.899635899e-03f, +1.064095593e-02f, -9.621370478e-03f, +1.301682824e-03f, +3.174263811e-03f, -2.171611020e-03f, +3.270457799e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.194746278e-05f, -1.421424992e-04f, +3.061298911e-04f, -3.178135117e-05f, -7.516367599e-04f, +1.045187034e-03f, +3.212560480e-04f, -2.491914723e-03f, +2.269513888e-03f, +2.129593340e-03f, -6.706350839e-03f, +3.481859008e-03f, +1.017950378e-02f, -2.169464718e-02f, -2.931594908e-02f, +1.755248302e-02f, +3.092575692e-02f, -3.288822149e-03f, -8.893112110e-03f, +6.190710991e-03f, +9.144453014e-04f, -3.800217875e-03f, +1.805014389e-03f, +8.947915600e-04f, -1.438202486e-03f, +4.083206773e-04f, +4.070759198e-04f, -3.832580123e-04f, +5.433670509e-05f, +8.030149258e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.194746278e-05f, +1.497297397e-04f, -4.882881120e-04f, +4.359409679e-04f, +5.189155386e-04f, -1.708245537e-03f, +1.387095215e-03f, +1.121120444e-03f, -3.618482286e-03f, +2.742208475e-03f, +1.768547346e-03f, -5.558077690e-03f, +3.970576614e-03f, +2.155380859e-03f, -6.584168342e-03f, +4.451877688e-03f, +2.064492216e-03f, -6.132274715e-03f, +3.925703444e-03f, +1.537307931e-03f, -4.452868841e-03f, +2.690090414e-03f, +8.473300397e-04f, -2.416675152e-03f, +1.365925069e-03f, +2.977454210e-04f, -8.711146184e-04f, +4.508075312e-04f, +2.585919819e-05f, -8.030149258e-05f, +0.000000000e+00f, + /* 11,11 (32) */ + +0.000000000e+00f, -5.192693727e-04f, +1.101429420e-03f, +4.910414720e-04f, -4.137987154e-03f, +4.065343553e-03f, +4.687502487e-03f, -1.434152883e-02f, +7.139514826e-03f, +1.969904341e-02f, -3.580341959e-02f, +3.523607271e-03f, +6.500687426e-02f, -8.661304785e-02f, -4.112531739e-02f, +4.514815994e-01f, +5.943607235e-01f, +1.184552276e-01f, -1.288766254e-01f, +2.740947380e-02f, +4.331332344e-02f, -3.979996456e-02f, +1.109703361e-03f, +2.045033626e-02f, -1.268195597e-02f, -2.937640258e-03f, +7.683207096e-03f, -2.827568983e-03f, -1.630011418e-03f, +1.724849395e-03f, -2.467442873e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.192693727e-04f, -1.729547904e-03f, +7.060389043e-04f, +4.430311380e-03f, -8.560101819e-03f, +2.466595959e-03f, +1.317713111e-02f, -2.110362830e-02f, +4.811931374e-03f, +2.556244684e-02f, -3.589562855e-02f, +6.640216652e-03f, +3.676073822e-02f, -4.622099940e-02f, +6.936303974e-03f, +4.105216374e-02f, -4.654606055e-02f, +5.572968280e-03f, +3.599467552e-02f, -3.671800211e-02f, +3.388615151e-03f, +2.436303675e-02f, -2.206616159e-02f, +1.482960747e-03f, +1.200688100e-02f, -9.323625057e-03f, +4.305682060e-04f, +3.625071342e-03f, -2.145751822e-03f, +2.467442873e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.828556293e-07f, -1.493959888e-04f, +2.771604496e-04f, +3.717827743e-05f, -7.779451282e-04f, +9.220448299e-04f, +5.337403646e-04f, -2.503313221e-03f, +1.872740937e-03f, +2.606455251e-03f, -6.494133407e-03f, +2.321595832e-03f, +1.097680665e-02f, -1.942199261e-02f, -3.092082508e-02f, +1.459810151e-02f, +3.217497647e-02f, -1.391029546e-03f, -9.769492281e-03f, +5.752581056e-03f, +1.597120740e-03f, -3.970954405e-03f, +1.545555763e-03f, +1.142453153e-03f, -1.457482743e-03f, +3.006807112e-04f, +4.792799535e-04f, -3.808325289e-04f, +2.710370466e-05f, +9.423259651e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.828556293e-07f, +1.702953811e-04f, -4.674487560e-04f, +3.327938628e-04f, +6.439158093e-04f, -1.682841202e-03f, +1.113654754e-03f, +1.450249299e-03f, -3.613252870e-03f, +2.251264847e-03f, +2.351978856e-03f, -5.601792117e-03f, +3.307838086e-03f, +2.932233975e-03f, -6.687684854e-03f, +3.753802700e-03f, +2.871856988e-03f, -6.275852711e-03f, +3.349435626e-03f, +2.195670544e-03f, -4.595812404e-03f, +2.326654291e-03f, +1.258700448e-03f, -2.522487056e-03f, +1.204002802e-03f, +4.810502642e-04f, -9.273919632e-04f, +4.116164933e-04f, +7.245690575e-05f, -9.423259651e-05f, +0.000000000e+00f, + /* 11,12 (32) */ + +0.000000000e+00f, -5.196522283e-04f, +9.520334316e-04f, +7.682019216e-04f, -4.100808877e-03f, +3.287398424e-03f, +5.609547317e-03f, -1.380778847e-02f, +4.636201605e-03f, +2.157178435e-02f, -3.319696434e-02f, -2.970526136e-03f, +6.732847009e-02f, -7.563624121e-02f, -6.054731000e-02f, +4.205607743e-01f, +6.089588250e-01f, +1.506302041e-01f, -1.302676549e-01f, +1.763998152e-02f, +4.906590450e-02f, -3.820284382e-02f, -2.861251044e-03f, +2.199589203e-02f, -1.153950282e-02f, -4.395123001e-03f, +7.983887807e-03f, -2.348289030e-03f, -2.010843946e-03f, +1.751953100e-03f, -1.525116908e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.196522283e-04f, -1.559252523e-03f, +2.385901483e-04f, +4.763105243e-03f, -7.916186010e-03f, +7.837547575e-04f, +1.429078587e-02f, -1.965337901e-02f, +1.198678504e-03f, +2.781371169e-02f, -3.354364969e-02f, +1.038424535e-03f, +4.006857631e-02f, -4.328876543e-02f, +2.486191205e-04f, +4.480596644e-02f, -4.367420357e-02f, -7.028844317e-04f, +3.934411115e-02f, -3.452233157e-02f, -1.207197253e-03f, +2.668969105e-02f, -2.080746114e-02f, -1.039526309e-03f, +1.321088380e-02f, -8.842574792e-03f, -4.968237572e-04f, +4.036687836e-03f, -2.073294916e-03f, +1.525116908e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.001616161e-05f, -1.533275451e-04f, +2.453303176e-04f, +1.015655426e-04f, -7.901990787e-04f, +7.897272177e-04f, +7.286283776e-04f, -2.474609177e-03f, +1.461896240e-03f, +3.024379522e-03f, -6.190187725e-03f, +1.176584853e-03f, +1.157240936e-02f, -1.706945906e-02f, -3.224091711e-02f, +1.150311548e-02f, +3.317645239e-02f, +6.476584866e-04f, -1.053539043e-02f, +5.203894462e-03f, +2.281486140e-03f, -4.083824124e-03f, +1.250047714e-03f, +1.381877687e-03f, -1.453179366e-03f, +1.823966401e-04f, +5.472611389e-04f, -3.713650726e-04f, -2.791820816e-06f, +1.075145692e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.001616161e-05f, +1.855878775e-04f, -4.390390155e-04f, +2.292045253e-04f, +7.515772681e-04f, -1.628674706e-03f, +8.298788745e-04f, +1.744715690e-03f, -3.545446236e-03f, +1.731145461e-03f, +2.885352155e-03f, -5.548211855e-03f, +2.593970440e-03f, +3.654009310e-03f, -6.675283650e-03f, +2.990053264e-03f, +3.632797577e-03f, -6.311299411e-03f, +2.708284773e-03f, +2.825243912e-03f, -4.660445649e-03f, +1.913720021e-03f, +1.658796092e-03f, -2.586211951e-03f, +1.013897991e-03f, +6.636577527e-04f, -9.689545383e-04f, +3.616636038e-04f, +1.212714302e-04f, -1.075145692e-04f, +0.000000000e+00f, + /* 11,13 (32) */ + +0.000000000e+00f, -5.096360667e-04f, +7.987058865e-04f, +1.013532239e-03f, -3.999243334e-03f, +2.497199346e-03f, +6.399274535e-03f, -1.307916009e-02f, +2.161592427e-03f, +2.303368059e-02f, -3.017258482e-02f, -9.160713861e-03f, +6.850505494e-02f, -6.406383185e-02f, -7.761676906e-02f, +3.883198572e-01f, +6.204619405e-01f, +1.838066565e-01f, -1.296199964e-01f, +7.104591091e-03f, +5.426979896e-02f, -3.592135768e-02f, -6.945075168e-03f, +2.324593974e-02f, -1.015762513e-02f, -5.848302367e-03f, +8.166284447e-03f, -1.801027891e-03f, -2.382209019e-03f, +1.749161279e-03f, -4.499712153e-05f, +0.000000000e+00f, + +0.000000000e+00f, +5.096360667e-04f, -1.373664645e-03f, -2.004488672e-04f, +4.992309768e-03f, -7.164608742e-03f, -8.449199480e-04f, +1.512066474e-02f, -1.790866331e-02f, -2.346767732e-03f, +2.954485715e-02f, -3.065829754e-02f, -4.509787320e-03f, +4.266254675e-02f, -3.963475612e-02f, -6.426664530e-03f, +4.779601970e-02f, -4.004140599e-02f, -7.014183843e-03f, +4.205239592e-02f, -3.169708765e-02f, -5.867642902e-03f, +2.860341107e-02f, -1.914866505e-02f, -3.625738261e-03f, +1.422478179e-02f, -8.178917040e-03f, -1.465778295e-03f, +4.398351440e-03f, -1.952023486e-03f, +4.499712153e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.912402271e-05f, -1.541084338e-04f, +2.113872174e-04f, +1.605359360e-04f, -7.888970184e-04f, +6.508167323e-04f, +9.035169628e-04f, -2.407854881e-03f, +1.043996991e-03f, +3.379094539e-03f, -5.802714914e-03f, +6.307772297e-05f, +1.196806374e-02f, -1.466482656e-02f, -3.326728023e-02f, +8.297016562e-03f, +3.391382572e-02f, +2.808650060e-03f, -1.117413572e-02f, +4.548636410e-03f, +2.956633492e-03f, -4.134708898e-03f, +9.219085338e-04f, +1.608709499e-03f, -1.424286778e-03f, +5.498480556e-05f, +6.095759291e-04f, -3.545858643e-04f, -3.495771602e-05f, +1.197987467e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.912402271e-05f, +1.956734673e-04f, -4.040997418e-04f, +1.271556887e-04f, +8.407043378e-04f, -1.547837769e-03f, +5.411772459e-04f, +2.000282133e-03f, -3.417750004e-03f, +1.191560114e-03f, +3.360128864e-03f, -5.399489258e-03f, +1.841917467e-03f, +4.308401061e-03f, -6.547465475e-03f, +2.173962125e-03f, +4.333758325e-03f, -6.237185937e-03f, +2.012878036e-03f, +3.414433922e-03f, -4.644186430e-03f, +1.457607839e-03f, +2.040060195e-03f, -2.605351521e-03f, +7.981028032e-04f, +8.420672912e-04f, -9.942311033e-04f, +3.013125153e-04f, +1.713870949e-04f, -1.197987467e-04f, +0.000000000e+00f, + /* 11,14 (32) */ + +0.000000000e+00f, -4.905120440e-04f, +6.445974527e-04f, +1.224919457e-03f, -3.838707398e-03f, +1.708302327e-03f, +7.050091267e-03f, -1.217564313e-02f, -2.462624541e-04f, +2.407767758e-02f, -2.679349028e-02f, -1.496342877e-02f, +6.856813267e-02f, -5.209576810e-02f, -9.228159561e-02f, +3.550525770e-01f, +6.287589571e-01f, +2.177204822e-01f, -1.268113464e-01f, -4.069544625e-03f, +5.881843537e-02f, -3.296472419e-02f, -1.107978407e-02f, +2.416784827e-02f, -8.548915631e-03f, -7.272589145e-03f, +8.221269253e-03f, -1.191451962e-03f, -2.736794883e-03f, +1.714203563e-03f, +7.480162519e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.905120440e-04f, -1.177991178e-03f, -6.045486089e-04f, +5.119465457e-03f, -6.323904404e-03f, -2.392757717e-03f, +1.566184199e-02f, -1.590838118e-02f, -5.764517736e-03f, +3.073641726e-02f, -2.729816867e-02f, -9.909276578e-03f, +4.450446421e-02f, -3.532635506e-02f, -1.297413000e-02f, +4.996998183e-02f, -3.570764766e-02f, -1.325136978e-02f, +4.406527396e-02f, -2.828265373e-02f, -1.051182933e-02f, +3.006101891e-02f, -1.710860485e-02f, -6.231089781e-03f, +1.502288459e-02f, -7.336849749e-03f, -2.460009399e-03f, +4.699663955e-03f, -1.780636391e-03f, -7.480162519e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.685306184e-05f, -1.519596632e-04f, +1.760720761e-04f, +2.133848905e-04f, -7.747425269e-04f, +5.078899367e-04f, +1.056428589e-03f, -2.305633509e-03f, +6.259085202e-04f, +3.667467789e-03f, -5.340871520e-03f, -1.003764677e-03f, +1.216800061e-02f, -1.223580090e-02f, -3.399429673e-02f, +5.010603072e-03f, +3.437345706e-02f, +5.071274913e-03f, -1.167016172e-02f, +3.792586585e-03f, +3.611381843e-03f, -4.120340294e-03f, +5.652322161e-04f, +1.818623406e-03f, -1.370176154e-03f, -7.980483913e-05f, +6.648056295e-04f, -3.303462436e-04f, -6.892978118e-05f, +1.307312654e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.685306184e-05f, +2.007290083e-04f, -3.637431385e-04f, +2.849917238e-05f, +9.105023451e-04f, -1.442834315e-03f, +2.528729306e-04f, +2.213529401e-03f, -3.233859346e-03f, +6.423743823e-04f, +3.768946506e-03f, -5.159434945e-03f, +1.065181453e-03f, +4.884366485e-03f, -6.306773198e-03f, +1.319799421e-03f, +4.962195739e-03f, -6.054025378e-03f, +1.274926019e-03f, +3.952208277e-03f, -4.545869262e-03f, +9.655624416e-04f, +2.395085426e-03f, -2.578160955e-03f, +5.596855127e-04f, +1.012712208e-03f, -1.001898222e-03f, +2.311650394e-04f, +2.217972983e-04f, -1.307312654e-04f, +0.000000000e+00f, + /* 11,15 (32) */ + +0.000000000e+00f, -4.636589821e-04f, +4.926377895e-04f, +1.400991533e-03f, -3.625322507e-03f, +9.335598005e-04f, +7.557981204e-03f, -1.111921454e-02f, -2.551895963e-03f, +2.470358610e-02f, -2.312602249e-02f, -2.030430029e-02f, +6.756436799e-02f, -3.992776749e-02f, -1.045173965e-01f, +3.210582802e-01f, +6.337695601e-01f, +2.520939393e-01f, -1.217400715e-01f, -1.573970634e-02f, +6.261102195e-02f, -2.935334235e-02f, -1.520012436e-02f, +2.473308049e-02f, -6.730292225e-03f, -8.642765300e-03f, +8.141464414e-03f, -5.266463322e-04f, -3.067141127e-03f, +1.645273782e-03f, +2.055328905e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.636589821e-04f, -9.772621697e-04f, -9.682917474e-04f, +5.147964629e-03f, -5.413402059e-03f, -3.835592032e-03f, +1.591471492e-02f, -1.369485178e-02f, -8.998377082e-03f, +3.137879165e-02f, -2.352922217e-02f, -1.506871152e-02f, +4.556964567e-02f, -3.044198857e-02f, -1.928090320e-02f, +5.128978125e-02f, -3.074545192e-02f, -1.930539516e-02f, +4.534019998e-02f, -2.433044545e-02f, -1.505769859e-02f, +3.102658135e-02f, -1.471351943e-02f, -8.809250736e-03f, +1.558257011e-02f, -6.324137540e-03f, -3.461907621e-03f, +4.930828994e-03f, -1.558839093e-03f, -2.055328905e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.315285962e-05f, -1.471444736e-04f, +1.401057002e-04f, +2.595530007e-04f, -7.486225761e-04f, +3.634744702e-04f, +1.185826608e-03f, -2.170997092e-03f, +2.142409335e-04f, +3.887513846e-03f, -4.814598421e-03f, -2.010048142e-03f, +1.217880404e-02f, -9.809674830e-03f, -3.441971216e-02f, +1.675619045e-03f, +3.454462879e-02f, +7.413000132e-03f, -1.200925710e-02f, +2.943297891e-03f, +4.234443633e-03f, -4.038384288e-03f, +1.847465416e-04f, +2.007399170e-03f, -1.290622629e-03f, -2.200087399e-04f, +7.115835566e-04f, -2.986283797e-04f, -1.041765491e-04f, +1.399604254e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.315285962e-05f, +2.010311674e-04f, -3.191257033e-04f, -6.507439985e-05f, +9.605757532e-04f, -1.316518315e-03f, -2.989319289e-05f, +2.381896629e-03f, -2.998386549e-03f, +9.342864861e-05f, +4.105732234e-03f, -4.833429021e-03f, +2.775764127e-04f, +5.372316216e-03f, -5.957741012e-03f, +4.425173936e-04f, +5.506807710e-03f, -5.764277198e-03f, +5.070221017e-04f, +4.428304910e-03f, -4.365791338e-03f, +4.456389479e-04f, +2.716755794e-03f, -2.503704416e-03f, +3.022516193e-04f, +1.172027193e-03f, -9.909186848e-04f, +1.520612352e-04f, +2.714216420e-04f, -1.399604254e-04f, +0.000000000e+00f, + /* 12, 0 (28) */ + +2.536797823e-04f, +1.717120723e-03f, -4.267889081e-03f, +2.769345327e-03f, +5.951433797e-03f, -1.603584821e-02f, +1.292106340e-02f, +1.223371165e-02f, -4.454238865e-02f, +4.565217930e-02f, +1.809825863e-02f, -1.393967437e-01f, +2.613999239e-01f, +6.871774778e-01f, +2.613999239e-01f, -1.393967437e-01f, +1.809825863e-02f, +4.565217930e-02f, -4.454238865e-02f, +1.223371165e-02f, +1.292106340e-02f, -1.603584821e-02f, +5.951433797e-03f, +2.769345327e-03f, -4.267889081e-03f, +1.717120723e-03f, +2.536797823e-04f, -4.307376863e-04f, + -2.536797823e-04f, -1.150482282e-03f, +5.406716708e-03f, -7.717177369e-03f, +1.823839110e-03f, +1.228216497e-02f, -2.346784071e-02f, +1.698003719e-02f, +9.330273566e-03f, -3.702545451e-02f, +4.007418410e-02f, -9.979930894e-03f, -3.212484989e-02f, +5.173229864e-02f, -3.212484989e-02f, -9.979930894e-03f, +4.007418410e-02f, -3.702545451e-02f, +9.330273566e-03f, +1.698003719e-02f, -2.346784071e-02f, +1.228216497e-02f, +1.823839110e-03f, -7.717177369e-03f, +5.406716708e-03f, -1.150482282e-03f, -7.255512597e-04f, +4.307376863e-04f, + -1.672450930e-04f, +1.465671445e-04f, +2.793351282e-04f, -9.520184531e-04f, +9.883710096e-04f, +4.963052456e-04f, -2.901502336e-03f, +3.592745340e-03f, +1.313477054e-04f, -7.371602801e-03f, +1.150223500e-02f, -1.648722934e-03f, -4.005143650e-02f, -2.118136438e-03f, +4.037745317e-02f, +4.437358614e-03f, -1.245638046e-02f, +6.843477163e-03f, +7.088661868e-04f, -3.980942495e-03f, +2.784145616e-03f, -2.108995370e-04f, -1.155933415e-03f, +9.530438450e-04f, -2.119531771e-04f, -1.944786008e-04f, +1.790200031e-04f, -5.388669386e-05f, + +1.672450930e-04f, -3.563316182e-04f, +3.507095578e-05f, +9.171349744e-04f, -1.851701628e-03f, +1.487106137e-03f, +7.898709170e-04f, -3.683687954e-03f, +4.506693883e-03f, -1.602136959e-03f, -3.509133136e-03f, +6.798018892e-03f, -5.159910641e-03f, -5.150350710e-04f, +5.820531774e-03f, -6.650473100e-03f, +2.745747260e-03f, +2.373496510e-03f, -4.787026885e-03f, +3.430508774e-03f, -3.325370984e-04f, -1.796023473e-03f, +1.894732968e-03f, -8.005610926e-04f, -1.566113751e-04f, +4.126503215e-04f, -2.384888080e-04f, +5.388669386e-05f, + /* 12, 1 (28) */ + +8.643468934e-05f, +1.863687867e-03f, -3.988553953e-03f, +1.817326873e-03f, +6.939804807e-03f, -1.553954296e-02f, +1.001956106e-02f, +1.582645699e-02f, -4.441104094e-02f, +3.828057650e-02f, +2.960049363e-02f, -1.410454666e-01f, +2.213484874e-01f, +6.850593414e-01f, +3.017773770e-01f, -1.349593851e-01f, +5.641878176e-03f, +5.249565646e-02f, -4.383352246e-02f, +8.252769153e-03f, +1.570520902e-02f, -1.624674774e-02f, +4.795500382e-03f, +3.722389172e-03f, -4.479842259e-03f, +1.522642122e-03f, +4.326997854e-04f, -4.846243802e-04f, + -8.643468934e-05f, -1.506813900e-03f, +5.441787664e-03f, -6.800042395e-03f, -2.786251825e-05f, +1.376927111e-02f, -2.267796980e-02f, +1.329634923e-02f, +1.383696745e-02f, -3.862759146e-02f, +3.656505097e-02f, -3.181912001e-03f, -3.728476053e-02f, +5.121726357e-02f, -2.630431811e-02f, -1.663040399e-02f, +4.281993136e-02f, -3.465195799e-02f, +4.543246681e-03f, +2.041054596e-02f, -2.380037781e-02f, +1.048614150e-02f, +3.718572078e-03f, -8.517738462e-03f, +5.250105333e-03f, -7.378319605e-04f, -9.640400678e-04f, +4.846243802e-04f, + -1.528675171e-04f, +9.918120421e-05f, +3.370925927e-04f, -9.329073693e-04f, +8.104906417e-04f, +7.595375484e-04f, -2.960317642e-03f, +3.154777852e-03f, +9.344874199e-04f, -7.744794862e-03f, +1.039523570e-02f, +9.827504653e-04f, -3.933565280e-02f, -6.330402493e-03f, +4.030106993e-02f, +7.351434413e-03f, -1.323318207e-02f, +6.163199623e-03f, +1.571925014e-03f, -4.309842171e-03f, +2.607950826e-03f, +9.210410746e-05f, -1.309301519e-03f, +9.349443780e-04f, -1.357598181e-04f, -2.418840628e-04f, +1.876710624e-04f, -4.876934512e-05f, + +1.528675171e-04f, -2.960898091e-04f, -7.999774610e-05f, +1.008798007e-03f, -1.772390996e-03f, +1.158733635e-03f, +1.217757814e-03f, -3.856401374e-03f, +4.141252984e-03f, -8.106068270e-04f, -4.193209028e-03f, +6.807829665e-03f, -4.398061769e-03f, -1.534608595e-03f, +6.366053508e-03f, -6.367178107e-03f, +1.917844561e-03f, +3.108430015e-03f, -4.974732374e-03f, +3.100196905e-03f, +1.454339456e-04f, -2.078167116e-03f, +1.899015724e-03f, -6.604422352e-04f, -2.821751720e-04f, +4.633554639e-04f, -2.399358804e-04f, +4.876934512e-05f, + /* 12, 2 (28) */ + -6.643282774e-05f, +1.962869071e-03f, -3.651461360e-03f, +8.844195042e-04f, +7.750295448e-03f, -1.478000541e-02f, +7.059243422e-03f, +1.898123484e-02f, -4.347655352e-02f, +3.053578164e-02f, +3.999572933e-02f, -1.400627162e-01f, +1.820128346e-01f, +6.787289389e-01f, +3.420784470e-01f, -1.276079507e-01f, -7.591303891e-03f, +5.865885609e-02f, -4.226159745e-02f, +3.942926982e-03f, +1.831315984e-02f, -1.615464364e-02f, +3.486198863e-03f, +4.657333550e-03f, -4.615602077e-03f, +1.280758059e-03f, +6.203708478e-04f, -5.333937253e-04f, + +6.643282774e-05f, -1.802903709e-03f, +5.361789918e-03f, -5.791244388e-03f, -1.800253514e-03f, +1.492800474e-02f, -2.146021198e-02f, +9.439947860e-03f, +1.797822043e-02f, -3.943819829e-02f, +3.237184194e-02f, +3.625917663e-03f, -4.168282230e-02f, +4.968265498e-02f, -1.993826460e-02f, -2.299758210e-02f, +4.473777593e-02f, -3.154352798e-02f, -4.314856932e-04f, +2.351074287e-02f, -2.365494387e-02f, +8.407974380e-03f, +5.617587802e-03f, -9.178180697e-03f, +4.967930161e-03f, -2.744764966e-04f, -1.203975948e-03f, +5.333937253e-04f, + -1.364293789e-04f, +5.327334902e-05f, +3.846551742e-04f, -8.970520968e-04f, +6.261839747e-04f, +9.966420220e-04f, -2.961968729e-03f, +2.677101059e-03f, +1.687552938e-03f, -7.963070332e-03f, +9.161257681e-03f, +3.428535877e-03f, -3.824758405e-02f, -1.047097869e-02f, +3.981474570e-02f, +1.035642549e-02f, -1.380998121e-02f, +5.336411535e-03f, +2.442586050e-03f, -4.570654653e-03f, +2.373753014e-03f, +4.075727485e-04f, -1.444694209e-03f, +8.970210369e-04f, -5.180731948e-05f, -2.876916247e-04f, +1.927125243e-04f, -4.156503346e-05f, + +1.364293789e-04f, -2.336012648e-04f, -1.864253916e-04f, +1.074791326e-03f, -1.659948055e-03f, +8.183882287e-04f, +1.608253408e-03f, -3.947064486e-03f, +3.699837061e-03f, -1.533015969e-05f, -4.784980729e-03f, +6.680767782e-03f, -3.550887706e-03f, -2.522911013e-03f, +6.784932201e-03f, -5.952947159e-03f, +1.041725762e-03f, +3.791197237e-03f, -5.064095315e-03f, +2.697803545e-03f, +6.345344592e-04f, -2.326549693e-03f, +1.862840948e-03f, -4.987477213e-04f, -4.090791664e-04f, +5.067850506e-04f, -2.349977934e-04f, +4.156503346e-05f, + /* 12, 3 (28) */ + -2.028622066e-04f, +2.016142420e-03f, -3.266806186e-03f, -1.263259257e-05f, +8.376479423e-03f, -1.378336339e-02f, +4.097274693e-03f, +2.165833590e-02f, -4.178900058e-02f, +2.257271131e-02f, +4.915698701e-02f, -1.366341803e-01f, +1.437652505e-01f, +6.682579602e-01f, +3.818931927e-01f, -1.172515252e-01f, -2.140128510e-02f, +6.399526762e-02f, -3.981901140e-02f, -6.277276711e-04f, +2.068691286e-02f, -1.574707089e-02f, +2.041504654e-03f, +5.554354587e-03f, -4.667409396e-03f, +9.930664343e-04f, +8.130833721e-04f, -5.749587588e-04f, + +2.028622066e-04f, -2.036504974e-03f, +5.175364526e-03f, -4.716453062e-03f, -3.460201569e-03f, +1.574639297e-02f, -1.985195857e-02f, +5.492883374e-03f, +2.167805749e-02f, -3.945352845e-02f, +2.758686121e-02f, +1.030668545e-02f, -4.523371000e-02f, +4.715974396e-02f, -1.315333240e-02f, -2.895052926e-02f, +4.577950169e-02f, -2.775233074e-02f, -5.495581009e-03f, +2.620854641e-02f, -2.302040941e-02f, +6.081424687e-03f, +7.480428750e-03f, -9.676928418e-03f, +4.558850994e-03f, +2.323085540e-04f, -1.438973742e-03f, +5.749587588e-04f, + -1.184796094e-04f, +9.701468837e-06f, +4.216933994e-04f, -8.460543928e-04f, +4.392813748e-04f, +1.204334264e-03f, -2.908843806e-03f, +2.170104102e-03f, +2.378959509e-03f, -8.029138375e-03f, +7.827105658e-03f, +5.663640924e-03f, -3.680924997e-02f, -1.449316874e-02f, +3.891620076e-02f, +1.341544975e-02f, -1.416637980e-02f, +4.371627002e-03f, +3.304835570e-03f, -4.755524983e-03f, +2.083549996e-03f, +7.298934870e-04f, -1.558507252e-03f, +8.389474878e-04f, +3.862181063e-05f, -3.307700679e-04f, +1.937086978e-04f, -3.226033240e-05f, + +1.184796094e-04f, -1.704884162e-04f, -2.823571302e-04f, +1.114952786e-03f, -1.518102927e-03f, +4.735502866e-04f, +1.954422772e-03f, -3.955833740e-03f, +3.192970307e-03f, +7.674455337e-04f, -5.273503314e-03f, +6.420504488e-03f, -2.635983122e-03f, -3.459819432e-03f, +7.068201233e-03f, -5.415340130e-03f, +1.348725363e-04f, +4.406913867e-03f, -5.051361226e-03f, +2.230029491e-03f, +1.124745888e-03f, -2.534680436e-03f, +1.785328442e-03f, -3.180323831e-04f, -5.344574970e-04f, +5.413498220e-04f, -2.232547969e-04f, +3.226033240e-05f, + /* 12, 4 (28) */ + -3.213418160e-04f, +2.025843889e-03f, -2.845112787e-03f, -8.586869854e-04f, +8.815760798e-03f, -1.257902913e-02f, +1.188430887e-03f, +2.382844000e-02f, -3.941004108e-02f, +1.454357293e-02f, +5.698409267e-02f, -1.309705394e-01f, +1.069560005e-01f, +6.537647915e-01f, +4.208093934e-01f, -1.038360754e-01f, -3.556766490e-02f, +6.836689462e-02f, -3.651417583e-02f, -5.383252654e-03f, +2.277046285e-02f, -1.501717740e-02f, +4.829974021e-04f, +6.393302074e-03f, -4.628787586e-03f, +6.622963664e-04f, +1.006792070e-03f, -6.072190912e-04f, + +3.213418160e-04f, -2.206993390e-03f, +4.893007396e-03f, -3.601500275e-03f, -4.978304495e-03f, +1.621994326e-02f, -1.789753580e-02f, +1.537049634e-03f, +2.487102780e-02f, -3.868608292e-02f, +2.231335790e-02f, +1.672718993e-02f, -4.786969313e-02f, +4.369992453e-02f, -6.085131171e-03f, -3.436586939e-02f, +4.591437422e-02f, -2.334541688e-02f, -1.054694224e-02f, +2.843857590e-02f, -2.189566352e-02f, +3.546744251e-03f, +9.265757193e-03f, -9.994960801e-03f, +4.024393497e-03f, +7.736583760e-04f, -1.662228538e-03f, +6.072190912e-04f, + -9.956061041e-05f, -3.078396433e-05f, +4.481120097e-04f, -7.817309753e-04f, +2.534799409e-04f, +1.380033903e-03f, -2.804256211e-03f, +1.644300113e-03f, +2.998691664e-03f, -7.948251601e-03f, +6.420056655e-03f, +7.666882257e-03f, -3.504683346e-02f, -1.835190421e-02f, +3.760850993e-02f, +1.648975863e-02f, -1.428464473e-02f, +3.280196285e-03f, +4.142154551e-03f, -4.857720099e-03f, +1.740511933e-03f, +1.053063922e-03f, -1.647395118e-03f, +7.607963719e-04f, +1.340293189e-04f, -3.699721402e-04f, +1.902883064e-04f, -2.089939228e-05f, + +9.956061041e-05f, -1.082834395e-04f, -3.662789776e-04f, +1.129693607e-03f, -1.351064978e-03f, +1.315380212e-04f, +2.250458932e-03f, -3.884562122e-03f, +2.632321013e-03f, +1.521985524e-03f, -5.650085530e-03f, +6.033421815e-03f, -1.672261772e-03f, -4.326281524e-03f, +7.209666429e-03f, -4.764524008e-03f, -7.844076779e-04f, +4.941878812e-03f, -4.934852764e-03f, +1.705119170e-03f, +1.605742504e-03f, -2.696724853e-03f, +1.666478813e-03f, -1.214040926e-04f, -6.553208742e-04f, +5.655782016e-04f, -2.044425160e-04f, +2.089939228e-05f, + /* 12, 5 (28) */ + -4.209024264e-04f, +1.995059925e-03f, -2.397000777e-03f, -1.640417961e-03f, +9.069240739e-03f, -1.119899522e-02f, -1.615825324e-03f, +2.547274011e-02f, -3.641134941e-02f, +6.595321331e-03f, +6.340414933e-02f, -1.233036571e-01f, +7.190916708e-02f, +6.354128872e-01f, +4.584179034e-01f, -8.734631679e-02f, -4.985230963e-02f, +7.164709091e-02f, -3.237202128e-02f, -1.024097275e-02f, +2.451097478e-02f, -1.396411348e-02f, -1.164397716e-03f, +7.154098446e-03f, -4.494758267e-03f, +2.923242262e-04f, +1.197080376e-03f, -6.281184835e-04f, + +4.209024264e-04f, -2.315276830e-03f, +4.526728418e-03f, -2.471806669e-03f, -6.329369473e-03f, +1.635148128e-02f, -1.564707687e-02f, -2.347512488e-03f, +2.750334881e-02f, -3.716409739e-02f, +1.666327237e-02f, +2.276061175e-02f, -4.954195490e-02f, +3.937364301e-02f, +1.124535258e-03f, -3.913039340e-02f, +4.512996655e-02f, -1.840353806e-02f, -1.548179500e-02f, +3.014369507e-02f, -2.028992102e-02f, +8.500193977e-04f, +1.093223601e-02f, -1.011636489e-02f, +3.369072623e-03f, +1.339236578e-03f, -1.866671054e-03f, +6.281184835e-04f, + -8.019590328e-05f, -6.754951886e-05f, +4.640386987e-04f, -7.060660982e-04f, +7.227741654e-05f, +1.521883592e-03f, -2.652344429e-03f, +1.110127461e-03f, +3.538423540e-03f, -7.728018921e-03f, +4.967408666e-03f, +9.421096864e-03f, -3.299024913e-02f, -2.200436071e-02f, +3.590011742e-02f, +1.953926632e-02f, -1.415008039e-02f, +2.076218682e-03f, +4.937803493e-03f, -4.871801814e-03f, +1.348968398e-03f, +1.370794279e-03f, -1.708351263e-03f, +6.630585029e-04f, +2.327212214e-04f, -4.041596167e-04f, +1.821582209e-04f, -7.587240552e-06f, + +8.019590328e-05f, -4.839619892e-05f, -4.370348828e-04f, +1.119963043e-03f, -1.163412236e-03f, -2.006440347e-04f, +2.491773835e-03f, -3.736719578e-03f, +2.030434812e-03f, +2.233388187e-03f, -5.908444404e-03f, +5.528458220e-03f, -6.795572423e-04f, -5.104711725e-03f, +7.206043552e-03f, -4.013077245e-03f, -1.697358098e-03f, +5.383880813e-03f, -4.715043669e-03f, +1.132718703e-03f, +2.067107283e-03f, -2.807654841e-03f, +1.507207368e-03f, +8.752309076e-05f, -7.686218053e-04f, +5.781607922e-04f, -1.784699863e-04f, +7.587240552e-06f, + /* 12, 6 (28) */ + -5.010983297e-04f, +1.927510406e-03f, -1.932962079e-03f, -2.346484059e-03f, +9.141518155e-03f, -9.677111632e-03f, -4.268169753e-03f, +2.658286758e-02f, -3.287292587e-02f, -1.132697590e-03f, +6.837155799e-02f, -1.138825602e-01f, +3.891891795e-02f, +6.134085265e-01f, +4.943180208e-01f, -6.780705047e-02f, -6.400239002e-02f, +7.372330959e-02f, -2.743421778e-02f, -1.511277457e-02f, +2.585994318e-02f, -1.259331920e-02f, -2.872748979e-03f, +7.817156949e-03f, -4.262037045e-03f, -1.118353905e-04f, +1.379238597e-03f, -6.357057240e-04f, + +5.010983297e-04f, -2.363673029e-03f, +4.089693535e-03f, -1.351843626e-03f, -7.492781709e-03f, +1.615083724e-02f, -1.315530303e-02f, -6.084232066e-03f, +2.953378363e-02f, -3.493070921e-02f, +1.075482796e-02f, +2.828906997e-02f, -5.022151214e-02f, +3.426893128e-02f, +8.330578811e-03f, -4.314347064e-02f, +4.343260845e-02f, -1.301965725e-02f, -2.019683867e-02f, +3.127641377e-02f, -1.822281373e-02f, -1.957635444e-03f, +1.243944337e-02f, -1.002884180e-02f, +2.600450818e-03f, +1.917397370e-03f, -2.045141041e-03f, +6.357057240e-04f, + -6.087901448e-05f, -1.000852694e-04f, +4.698087680e-04f, -6.211630663e-04f, -1.010869565e-04f, +1.628753225e-03f, -2.457960440e-03f, +5.777598635e-04f, +3.991604482e-03f, -7.378184422e-03f, +3.496042480e-03f, +1.091328689e-02f, -3.067266242e-02f, -2.541053987e-02f, +3.380477231e-02f, +2.252310953e-02f, -1.375136211e-02f, +7.764048675e-04f, +5.675121813e-03f, -4.793781863e-03f, +9.143723041e-04f, +1.676619631e-03f, -1.738785164e-03f, +5.466542178e-04f, +3.328331849e-04f, -4.322296692e-04f, +1.691161917e-04f, +7.508309613e-06f, + +6.087901448e-05f, +7.912975028e-06f, -4.938345194e-04f, +1.087202388e-03f, -9.599768576e-04f, -5.164447487e-04f, +2.675060557e-03f, -3.517280806e-03f, +1.400454491e-03f, +2.887882799e-03f, -6.044807332e-03f, +4.916901678e-03f, +3.217939208e-04f, -5.779356234e-03f, +7.057034781e-03f, -3.175741825e-03f, -2.585162361e-03f, +5.722477479e-03f, -4.394587711e-03f, +5.237003713e-04f, +2.498555560e-03f, -2.863385525e-03f, +1.309358438e-03f, +3.046896352e-04f, -8.713244713e-04f, +5.779932491e-04f, -1.454340762e-04f, -7.508309613e-06f, + /* 12, 7 (28) */ + -5.619773442e-04f, +1.827425137e-03f, -1.463153310e-03f, -2.967647125e-03f, +9.040431199e-03f, -8.048358407e-03f, -6.726130192e-03f, +2.716062744e-02f, -2.888132139e-02f, -8.510882012e-03f, +7.186760047e-02f, -1.029692733e-01f, +8.246255527e-03f, +5.879979867e-01f, +5.281227931e-01f, -4.528394094e-02f, -7.775375213e-02f, +7.449971446e-02f, -2.175909597e-02f, -1.990655643e-02f, +2.677431549e-02f, -1.091669957e-02f, -4.611534143e-03f, +8.363811167e-03f, -3.929203860e-03f, -5.440650596e-04f, +1.548354789e-03f, -6.281974144e-04f, + +5.619773442e-04f, -2.355760054e-03f, +3.595859016e-03f, -2.646412378e-04f, -8.452758567e-03f, +1.563439249e-02f, -1.048024248e-02f, -9.601512872e-03f, +3.093423812e-02f, -3.204282641e-02f, +4.710020632e-03f, +3.320597165e-02f, -4.989971822e-02f, +2.848957505e-02f, +1.538761359e-02f, -4.631921247e-02f, +4.084744609e-02f, -7.297179773e-03f, -2.459142638e-02f, +3.180011415e-02f, -1.572425817e-02f, -4.821020969e-03f, +1.374880181e-02f, -9.724152168e-03f, +1.729126347e-03f, +2.495390619e-03f, -2.190575117e-03f, +6.281974144e-04f, + -4.206378952e-05f, -1.280081378e-04f, +4.659462400e-04f, -5.291957358e-04f, -2.636837668e-04f, +1.700229892e-03f, -2.226548985e-03f, +5.692856926e-05f, +4.353509573e-03f, -6.910377116e-03f, +2.032003567e-03f, +1.213469698e-02f, -2.812996702e-02f, -2.853380828e-02f, +3.134138529e-02f, +2.540022944e-02f, -1.308082424e-02f, -6.001104200e-04f, +6.337836843e-03f, -4.621255387e-03f, +4.432405220e-04f, +1.964020391e-03f, -1.736594373e-03f, +4.129362652e-04f, +4.323609993e-04f, -4.531420109e-04f, +1.510622100e-04f, +2.415628070e-05f, + +4.206378952e-05f, +5.955524529e-05f, -5.362520523e-04f, +1.033289823e-03f, -7.457293554e-04f, -8.098916005e-04f, +2.798326164e-03f, -3.232583630e-03f, +7.558326327e-04f, +3.473098805e-03f, -6.057960081e-03f, +4.212135032e-03f, +1.311377751e-03f, -6.336619084e-03f, +6.765342374e-03f, -2.269128000e-03f, -3.429339408e-03f, +5.949240323e-03f, -3.978301224e-03f, -1.100433959e-04f, +2.890161670e-03f, -2.860895344e-03f, +1.075699082e-03f, +5.256642457e-04f, -9.604777611e-04f, +5.642163449e-04f, -1.056296913e-04f, -2.415628070e-05f, + /* 12, 8 (28) */ + -6.040411337e-04f, +1.699416999e-03f, -9.972070705e-04f, -3.496842861e-03f, +8.776747432e-03f, -6.348128516e-03f, -8.952679177e-03f, +2.721755601e-02f, -2.452781182e-02f, -1.542125913e-02f, +7.389960404e-02f, -9.083457637e-02f, -1.988371149e-02f, +5.594641784e-01f, +5.594641784e-01f, -1.988371149e-02f, -9.083457637e-02f, +7.389960404e-02f, -1.542125913e-02f, -2.452781182e-02f, +2.721755601e-02f, -8.952679177e-03f, -6.348128516e-03f, +8.776747432e-03f, -3.496842861e-03f, -9.972070705e-04f, +1.699416999e-03f, -6.040411337e-04f, + +6.040411337e-04f, -2.296204808e-03f, +3.059606964e-03f, +7.686485855e-04f, -9.198487922e-03f, +1.482450089e-02f, -7.681916313e-03f, -1.283409650e-02f, +3.169007075e-02f, -2.856972760e-02f, -1.347939449e-03f, +3.741810668e-02f, -4.858834047e-02f, +2.215295597e-02f, +2.215295597e-02f, -4.858834047e-02f, +3.741810668e-02f, -1.347939449e-03f, -2.856972760e-02f, +3.169007075e-02f, -1.283409650e-02f, -7.681916313e-03f, +1.482450089e-02f, -9.198487922e-03f, +7.686485855e-04f, +3.059606964e-03f, -2.296204808e-03f, +6.040411337e-04f, + -2.415628070e-05f, -1.510622100e-04f, +4.531420109e-04f, -4.323609993e-04f, -4.129362652e-04f, +1.736594373e-03f, -1.964020391e-03f, -4.432405220e-04f, +4.621255387e-03f, -6.337836843e-03f, +6.001104200e-04f, +1.308082424e-02f, -2.540022944e-02f, -3.134138529e-02f, +2.853380828e-02f, +2.812996702e-02f, -1.213469698e-02f, -2.032003567e-03f, +6.910377116e-03f, -4.353509573e-03f, -5.692856926e-05f, +2.226548985e-03f, -1.700229892e-03f, +2.636837668e-04f, +5.291957358e-04f, -4.659462400e-04f, +1.280081378e-04f, +4.206378952e-05f, + +2.415628070e-05f, +1.056296913e-04f, -5.642163449e-04f, +9.604777611e-04f, -5.256642457e-04f, -1.075699082e-03f, +2.860895344e-03f, -2.890161670e-03f, +1.100433959e-04f, +3.978301224e-03f, -5.949240323e-03f, +3.429339408e-03f, +2.269128000e-03f, -6.765342374e-03f, +6.336619084e-03f, -1.311377751e-03f, -4.212135032e-03f, +6.057960081e-03f, -3.473098805e-03f, -7.558326327e-04f, +3.232583630e-03f, -2.798326164e-03f, +8.098916005e-04f, +7.457293554e-04f, -1.033289823e-03f, +5.362520523e-04f, -5.955524529e-05f, -4.206378952e-05f, + /* 12, 9 (28) */ + -6.281974144e-04f, +1.548354789e-03f, -5.440650596e-04f, -3.929203860e-03f, +8.363811167e-03f, -4.611534143e-03f, -1.091669957e-02f, +2.677431549e-02f, -1.990655643e-02f, -2.175909597e-02f, +7.449971446e-02f, -7.775375213e-02f, -4.528394094e-02f, +5.281227931e-01f, +5.879979867e-01f, +8.246255527e-03f, -1.029692733e-01f, +7.186760047e-02f, -8.510882012e-03f, -2.888132139e-02f, +2.716062744e-02f, -6.726130192e-03f, -8.048358407e-03f, +9.040431199e-03f, -2.967647125e-03f, -1.463153310e-03f, +1.827425137e-03f, -5.619773442e-04f, + +6.281974144e-04f, -2.190575117e-03f, +2.495390619e-03f, +1.729126347e-03f, -9.724152168e-03f, +1.374880181e-02f, -4.821020969e-03f, -1.572425817e-02f, +3.180011415e-02f, -2.459142638e-02f, -7.297179773e-03f, +4.084744609e-02f, -4.631921247e-02f, +1.538761359e-02f, +2.848957505e-02f, -4.989971822e-02f, +3.320597165e-02f, +4.710020632e-03f, -3.204282641e-02f, +3.093423812e-02f, -9.601512872e-03f, -1.048024248e-02f, +1.563439249e-02f, -8.452758567e-03f, -2.646412378e-04f, +3.595859016e-03f, -2.355760054e-03f, +5.619773442e-04f, + -7.508309613e-06f, -1.691161917e-04f, +4.322296692e-04f, -3.328331849e-04f, -5.466542178e-04f, +1.738785164e-03f, -1.676619631e-03f, -9.143723041e-04f, +4.793781863e-03f, -5.675121813e-03f, -7.764048675e-04f, +1.375136211e-02f, -2.252310953e-02f, -3.380477231e-02f, +2.541053987e-02f, +3.067266242e-02f, -1.091328689e-02f, -3.496042480e-03f, +7.378184422e-03f, -3.991604482e-03f, -5.777598635e-04f, +2.457960440e-03f, -1.628753225e-03f, +1.010869565e-04f, +6.211630663e-04f, -4.698087680e-04f, +1.000852694e-04f, +6.087901448e-05f, + +7.508309613e-06f, +1.454340762e-04f, -5.779932491e-04f, +8.713244713e-04f, -3.046896352e-04f, -1.309358438e-03f, +2.863385525e-03f, -2.498555560e-03f, -5.237003713e-04f, +4.394587711e-03f, -5.722477479e-03f, +2.585162361e-03f, +3.175741825e-03f, -7.057034781e-03f, +5.779356234e-03f, -3.217939208e-04f, -4.916901678e-03f, +6.044807332e-03f, -2.887882799e-03f, -1.400454491e-03f, +3.517280806e-03f, -2.675060557e-03f, +5.164447487e-04f, +9.599768576e-04f, -1.087202388e-03f, +4.938345194e-04f, -7.912975028e-06f, -6.087901448e-05f, + /* 12,10 (28) */ + -6.357057240e-04f, +1.379238597e-03f, -1.118353905e-04f, -4.262037045e-03f, +7.817156949e-03f, -2.872748979e-03f, -1.259331920e-02f, +2.585994318e-02f, -1.511277457e-02f, -2.743421778e-02f, +7.372330959e-02f, -6.400239002e-02f, -6.780705047e-02f, +4.943180208e-01f, +6.134085265e-01f, +3.891891795e-02f, -1.138825602e-01f, +6.837155799e-02f, -1.132697590e-03f, -3.287292587e-02f, +2.658286758e-02f, -4.268169753e-03f, -9.677111632e-03f, +9.141518155e-03f, -2.346484059e-03f, -1.932962079e-03f, +1.927510406e-03f, -5.010983297e-04f, + +6.357057240e-04f, -2.045141041e-03f, +1.917397370e-03f, +2.600450818e-03f, -1.002884180e-02f, +1.243944337e-02f, -1.957635444e-03f, -1.822281373e-02f, +3.127641377e-02f, -2.019683867e-02f, -1.301965725e-02f, +4.343260845e-02f, -4.314347064e-02f, +8.330578811e-03f, +3.426893128e-02f, -5.022151214e-02f, +2.828906997e-02f, +1.075482796e-02f, -3.493070921e-02f, +2.953378363e-02f, -6.084232066e-03f, -1.315530303e-02f, +1.615083724e-02f, -7.492781709e-03f, -1.351843626e-03f, +4.089693535e-03f, -2.363673029e-03f, +5.010983297e-04f, + +7.587240552e-06f, -1.821582209e-04f, +4.041596167e-04f, -2.327212214e-04f, -6.630585029e-04f, +1.708351263e-03f, -1.370794279e-03f, -1.348968398e-03f, +4.871801814e-03f, -4.937803493e-03f, -2.076218682e-03f, +1.415008039e-02f, -1.953926632e-02f, -3.590011742e-02f, +2.200436071e-02f, +3.299024913e-02f, -9.421096864e-03f, -4.967408666e-03f, +7.728018921e-03f, -3.538423540e-03f, -1.110127461e-03f, +2.652344429e-03f, -1.521883592e-03f, -7.227741654e-05f, +7.060660982e-04f, -4.640386987e-04f, +6.754951886e-05f, +8.019590328e-05f, + -7.587240552e-06f, +1.784699863e-04f, -5.781607922e-04f, +7.686218053e-04f, -8.752309076e-05f, -1.507207368e-03f, +2.807654841e-03f, -2.067107283e-03f, -1.132718703e-03f, +4.715043669e-03f, -5.383880813e-03f, +1.697358098e-03f, +4.013077245e-03f, -7.206043552e-03f, +5.104711725e-03f, +6.795572423e-04f, -5.528458220e-03f, +5.908444404e-03f, -2.233388187e-03f, -2.030434812e-03f, +3.736719578e-03f, -2.491773835e-03f, +2.006440347e-04f, +1.163412236e-03f, -1.119963043e-03f, +4.370348828e-04f, +4.839619892e-05f, -8.019590328e-05f, + /* 12,11 (28) */ + -6.281184835e-04f, +1.197080376e-03f, +2.923242262e-04f, -4.494758267e-03f, +7.154098446e-03f, -1.164397716e-03f, -1.396411348e-02f, +2.451097478e-02f, -1.024097275e-02f, -3.237202128e-02f, +7.164709091e-02f, -4.985230963e-02f, -8.734631679e-02f, +4.584179034e-01f, +6.354128872e-01f, +7.190916708e-02f, -1.233036571e-01f, +6.340414933e-02f, +6.595321331e-03f, -3.641134941e-02f, +2.547274011e-02f, -1.615825324e-03f, -1.119899522e-02f, +9.069240739e-03f, -1.640417961e-03f, -2.397000777e-03f, +1.995059925e-03f, -4.209024264e-04f, + +6.281184835e-04f, -1.866671054e-03f, +1.339236578e-03f, +3.369072623e-03f, -1.011636489e-02f, +1.093223601e-02f, +8.500193977e-04f, -2.028992102e-02f, +3.014369507e-02f, -1.548179500e-02f, -1.840353806e-02f, +4.512996655e-02f, -3.913039340e-02f, +1.124535258e-03f, +3.937364301e-02f, -4.954195490e-02f, +2.276061175e-02f, +1.666327237e-02f, -3.716409739e-02f, +2.750334881e-02f, -2.347512488e-03f, -1.564707687e-02f, +1.635148128e-02f, -6.329369473e-03f, -2.471806669e-03f, +4.526728418e-03f, -2.315276830e-03f, +4.209024264e-04f, + +2.089939228e-05f, -1.902883064e-04f, +3.699721402e-04f, -1.340293189e-04f, -7.607963719e-04f, +1.647395118e-03f, -1.053063922e-03f, -1.740511933e-03f, +4.857720099e-03f, -4.142154551e-03f, -3.280196285e-03f, +1.428464473e-02f, -1.648975863e-02f, -3.760850993e-02f, +1.835190421e-02f, +3.504683346e-02f, -7.666882257e-03f, -6.420056655e-03f, +7.948251601e-03f, -2.998691664e-03f, -1.644300113e-03f, +2.804256211e-03f, -1.380033903e-03f, -2.534799409e-04f, +7.817309753e-04f, -4.481120097e-04f, +3.078396433e-05f, +9.956061041e-05f, + -2.089939228e-05f, +2.044425160e-04f, -5.655782016e-04f, +6.553208742e-04f, +1.214040926e-04f, -1.666478813e-03f, +2.696724853e-03f, -1.605742504e-03f, -1.705119170e-03f, +4.934852764e-03f, -4.941878812e-03f, +7.844076779e-04f, +4.764524008e-03f, -7.209666429e-03f, +4.326281524e-03f, +1.672261772e-03f, -6.033421815e-03f, +5.650085530e-03f, -1.521985524e-03f, -2.632321013e-03f, +3.884562122e-03f, -2.250458932e-03f, -1.315380212e-04f, +1.351064978e-03f, -1.129693607e-03f, +3.662789776e-04f, +1.082834395e-04f, -9.956061041e-05f, + /* 12,12 (28) */ + -6.072190912e-04f, +1.006792070e-03f, +6.622963664e-04f, -4.628787586e-03f, +6.393302074e-03f, +4.829974021e-04f, -1.501717740e-02f, +2.277046285e-02f, -5.383252654e-03f, -3.651417583e-02f, +6.836689462e-02f, -3.556766490e-02f, -1.038360754e-01f, +4.208093934e-01f, +6.537647915e-01f, +1.069560005e-01f, -1.309705394e-01f, +5.698409267e-02f, +1.454357293e-02f, -3.941004108e-02f, +2.382844000e-02f, +1.188430887e-03f, -1.257902913e-02f, +8.815760798e-03f, -8.586869854e-04f, -2.845112787e-03f, +2.025843889e-03f, -3.213418160e-04f, + +6.072190912e-04f, -1.662228538e-03f, +7.736583760e-04f, +4.024393497e-03f, -9.994960801e-03f, +9.265757193e-03f, +3.546744251e-03f, -2.189566352e-02f, +2.843857590e-02f, -1.054694224e-02f, -2.334541688e-02f, +4.591437422e-02f, -3.436586939e-02f, -6.085131171e-03f, +4.369992453e-02f, -4.786969313e-02f, +1.672718993e-02f, +2.231335790e-02f, -3.868608292e-02f, +2.487102780e-02f, +1.537049634e-03f, -1.789753580e-02f, +1.621994326e-02f, -4.978304495e-03f, -3.601500275e-03f, +4.893007396e-03f, -2.206993390e-03f, +3.213418160e-04f, + +3.226033240e-05f, -1.937086978e-04f, +3.307700679e-04f, -3.862181063e-05f, -8.389474878e-04f, +1.558507252e-03f, -7.298934870e-04f, -2.083549996e-03f, +4.755524983e-03f, -3.304835570e-03f, -4.371627002e-03f, +1.416637980e-02f, -1.341544975e-02f, -3.891620076e-02f, +1.449316874e-02f, +3.680924997e-02f, -5.663640924e-03f, -7.827105658e-03f, +8.029138375e-03f, -2.378959509e-03f, -2.170104102e-03f, +2.908843806e-03f, -1.204334264e-03f, -4.392813748e-04f, +8.460543928e-04f, -4.216933994e-04f, -9.701468837e-06f, +1.184796094e-04f, + -3.226033240e-05f, +2.232547969e-04f, -5.413498220e-04f, +5.344574970e-04f, +3.180323831e-04f, -1.785328442e-03f, +2.534680436e-03f, -1.124745888e-03f, -2.230029491e-03f, +5.051361226e-03f, -4.406913867e-03f, -1.348725363e-04f, +5.415340130e-03f, -7.068201233e-03f, +3.459819432e-03f, +2.635983122e-03f, -6.420504488e-03f, +5.273503314e-03f, -7.674455337e-04f, -3.192970307e-03f, +3.955833740e-03f, -1.954422772e-03f, -4.735502866e-04f, +1.518102927e-03f, -1.114952786e-03f, +2.823571302e-04f, +1.704884162e-04f, -1.184796094e-04f, + /* 12,13 (28) */ + -5.749587588e-04f, +8.130833721e-04f, +9.930664343e-04f, -4.667409396e-03f, +5.554354587e-03f, +2.041504654e-03f, -1.574707089e-02f, +2.068691286e-02f, -6.277276711e-04f, -3.981901140e-02f, +6.399526762e-02f, -2.140128510e-02f, -1.172515252e-01f, +3.818931927e-01f, +6.682579602e-01f, +1.437652505e-01f, -1.366341803e-01f, +4.915698701e-02f, +2.257271131e-02f, -4.178900058e-02f, +2.165833590e-02f, +4.097274693e-03f, -1.378336339e-02f, +8.376479423e-03f, -1.263259257e-05f, -3.266806186e-03f, +2.016142420e-03f, -2.028622066e-04f, + +5.749587588e-04f, -1.438973742e-03f, +2.323085540e-04f, +4.558850994e-03f, -9.676928418e-03f, +7.480428750e-03f, +6.081424687e-03f, -2.302040941e-02f, +2.620854641e-02f, -5.495581009e-03f, -2.775233074e-02f, +4.577950169e-02f, -2.895052926e-02f, -1.315333240e-02f, +4.715974396e-02f, -4.523371000e-02f, +1.030668545e-02f, +2.758686121e-02f, -3.945352845e-02f, +2.167805749e-02f, +5.492883374e-03f, -1.985195857e-02f, +1.574639297e-02f, -3.460201569e-03f, -4.716453062e-03f, +5.175364526e-03f, -2.036504974e-03f, +2.028622066e-04f, + +4.156503346e-05f, -1.927125243e-04f, +2.876916247e-04f, +5.180731948e-05f, -8.970210369e-04f, +1.444694209e-03f, -4.075727485e-04f, -2.373753014e-03f, +4.570654653e-03f, -2.442586050e-03f, -5.336411535e-03f, +1.380998121e-02f, -1.035642549e-02f, -3.981474570e-02f, +1.047097869e-02f, +3.824758405e-02f, -3.428535877e-03f, -9.161257681e-03f, +7.963070332e-03f, -1.687552938e-03f, -2.677101059e-03f, +2.961968729e-03f, -9.966420220e-04f, -6.261839747e-04f, +8.970520968e-04f, -3.846551742e-04f, -5.327334902e-05f, +1.364293789e-04f, + -4.156503346e-05f, +2.349977934e-04f, -5.067850506e-04f, +4.090791664e-04f, +4.987477213e-04f, -1.862840948e-03f, +2.326549693e-03f, -6.345344592e-04f, -2.697803545e-03f, +5.064095315e-03f, -3.791197237e-03f, -1.041725762e-03f, +5.952947159e-03f, -6.784932201e-03f, +2.522911013e-03f, +3.550887706e-03f, -6.680767782e-03f, +4.784980729e-03f, +1.533015969e-05f, -3.699837061e-03f, +3.947064486e-03f, -1.608253408e-03f, -8.183882287e-04f, +1.659948055e-03f, -1.074791326e-03f, +1.864253916e-04f, +2.336012648e-04f, -1.364293789e-04f, + /* 12,14 (28) */ + -5.333937253e-04f, +6.203708478e-04f, +1.280758059e-03f, -4.615602077e-03f, +4.657333550e-03f, +3.486198863e-03f, -1.615464364e-02f, +1.831315984e-02f, +3.942926982e-03f, -4.226159745e-02f, +5.865885609e-02f, -7.591303891e-03f, -1.276079507e-01f, +3.420784470e-01f, +6.787289389e-01f, +1.820128346e-01f, -1.400627162e-01f, +3.999572933e-02f, +3.053578164e-02f, -4.347655352e-02f, +1.898123484e-02f, +7.059243422e-03f, -1.478000541e-02f, +7.750295448e-03f, +8.844195042e-04f, -3.651461360e-03f, +1.962869071e-03f, -6.643282774e-05f, + +5.333937253e-04f, -1.203975948e-03f, -2.744764966e-04f, +4.967930161e-03f, -9.178180697e-03f, +5.617587802e-03f, +8.407974380e-03f, -2.365494387e-02f, +2.351074287e-02f, -4.314856932e-04f, -3.154352798e-02f, +4.473777593e-02f, -2.299758210e-02f, -1.993826460e-02f, +4.968265498e-02f, -4.168282230e-02f, +3.625917663e-03f, +3.237184194e-02f, -3.943819829e-02f, +1.797822043e-02f, +9.439947860e-03f, -2.146021198e-02f, +1.492800474e-02f, -1.800253514e-03f, -5.791244388e-03f, +5.361789918e-03f, -1.802903709e-03f, +6.643282774e-05f, + +4.876934512e-05f, -1.876710624e-04f, +2.418840628e-04f, +1.357598181e-04f, -9.349443780e-04f, +1.309301519e-03f, -9.210410746e-05f, -2.607950826e-03f, +4.309842171e-03f, -1.571925014e-03f, -6.163199623e-03f, +1.323318207e-02f, -7.351434413e-03f, -4.030106993e-02f, +6.330402493e-03f, +3.933565280e-02f, -9.827504653e-04f, -1.039523570e-02f, +7.744794862e-03f, -9.344874199e-04f, -3.154777852e-03f, +2.960317642e-03f, -7.595375484e-04f, -8.104906417e-04f, +9.329073693e-04f, -3.370925927e-04f, -9.918120421e-05f, +1.528675171e-04f, + -4.876934512e-05f, +2.399358804e-04f, -4.633554639e-04f, +2.821751720e-04f, +6.604422352e-04f, -1.899015724e-03f, +2.078167116e-03f, -1.454339456e-04f, -3.100196905e-03f, +4.974732374e-03f, -3.108430015e-03f, -1.917844561e-03f, +6.367178107e-03f, -6.366053508e-03f, +1.534608595e-03f, +4.398061769e-03f, -6.807829665e-03f, +4.193209028e-03f, +8.106068270e-04f, -4.141252984e-03f, +3.856401374e-03f, -1.217757814e-03f, -1.158733635e-03f, +1.772390996e-03f, -1.008798007e-03f, +7.999774610e-05f, +2.960898091e-04f, -1.528675171e-04f, + /* 12,15 (28) */ + -4.846243802e-04f, +4.326997854e-04f, +1.522642122e-03f, -4.479842259e-03f, +3.722389172e-03f, +4.795500382e-03f, -1.624674774e-02f, +1.570520902e-02f, +8.252769153e-03f, -4.383352246e-02f, +5.249565646e-02f, +5.641878176e-03f, -1.349593851e-01f, +3.017773770e-01f, +6.850593414e-01f, +2.213484874e-01f, -1.410454666e-01f, +2.960049363e-02f, +3.828057650e-02f, -4.441104094e-02f, +1.582645699e-02f, +1.001956106e-02f, -1.553954296e-02f, +6.939804807e-03f, +1.817326873e-03f, -3.988553953e-03f, +1.863687867e-03f, +8.643468934e-05f, + +4.846243802e-04f, -9.640400678e-04f, -7.378319605e-04f, +5.250105333e-03f, -8.517738462e-03f, +3.718572078e-03f, +1.048614150e-02f, -2.380037781e-02f, +2.041054596e-02f, +4.543246681e-03f, -3.465195799e-02f, +4.281993136e-02f, -1.663040399e-02f, -2.630431811e-02f, +5.121726357e-02f, -3.728476053e-02f, -3.181912001e-03f, +3.656505097e-02f, -3.862759146e-02f, +1.383696745e-02f, +1.329634923e-02f, -2.267796980e-02f, +1.376927111e-02f, -2.786251825e-05f, -6.800042395e-03f, +5.441787664e-03f, -1.506813900e-03f, -8.643468934e-05f, + +5.388669386e-05f, -1.790200031e-04f, +1.944786008e-04f, +2.119531771e-04f, -9.530438450e-04f, +1.155933415e-03f, +2.108995370e-04f, -2.784145616e-03f, +3.980942495e-03f, -7.088661868e-04f, -6.843477163e-03f, +1.245638046e-02f, -4.437358614e-03f, -4.037745317e-02f, +2.118136438e-03f, +4.005143650e-02f, +1.648722934e-03f, -1.150223500e-02f, +7.371602801e-03f, -1.313477054e-04f, -3.592745340e-03f, +2.901502336e-03f, -4.963052456e-04f, -9.883710096e-04f, +9.520184531e-04f, -2.793351282e-04f, -1.465671445e-04f, +1.672450930e-04f, + -5.388669386e-05f, +2.384888080e-04f, -4.126503215e-04f, +1.566113751e-04f, +8.005610926e-04f, -1.894732968e-03f, +1.796023473e-03f, +3.325370984e-04f, -3.430508774e-03f, +4.787026885e-03f, -2.373496510e-03f, -2.745747260e-03f, +6.650473100e-03f, -5.820531774e-03f, +5.150350710e-04f, +5.159910641e-03f, -6.798018892e-03f, +3.509133136e-03f, +1.602136959e-03f, -4.506693883e-03f, +3.683687954e-03f, -7.898709170e-04f, -1.487106137e-03f, +1.851701628e-03f, -9.171349744e-04f, -3.507095578e-05f, +3.563316182e-04f, -1.672450930e-04f, + /* 13, 0 (28) */ + +0.000000000e+00f, +5.666384406e-04f, +1.138827626e-03f, -4.947832042e-03f, +7.775272907e-03f, -3.753683238e-03f, -1.054677731e-02f, +2.921374884e-02f, -3.521211508e-02f, +8.626724797e-03f, +5.817244274e-02f, -1.493766746e-01f, +2.292750740e-01f, +7.389097765e-01f, +2.292750740e-01f, -1.493766746e-01f, +5.817244274e-02f, +8.626724797e-03f, -3.521211508e-02f, +2.921374884e-02f, -1.054677731e-02f, -3.753683238e-03f, +7.775272907e-03f, -4.947832042e-03f, +1.138827626e-03f, +5.666384406e-04f, -4.718714774e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.666384406e-04f, +1.805043397e-04f, +3.931653329e-03f, -1.009328495e-02f, +1.316547915e-02f, -6.922639574e-03f, -9.865401789e-03f, +2.934697745e-02f, -3.767009023e-02f, +2.481811038e-02f, +6.027636000e-03f, -3.812597854e-02f, +5.173229864e-02f, -3.812597854e-02f, +6.027636000e-03f, +2.481811038e-02f, -3.767009023e-02f, +2.934697745e-02f, -9.865401789e-03f, -6.922639574e-03f, +1.316547915e-02f, -1.009328495e-02f, +3.931653329e-03f, +1.805043397e-04f, -1.107043555e-03f, +4.718714774e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.097644736e-04f, +3.144060840e-04f, -3.488347878e-05f, -8.633306184e-04f, +1.983411383e-03f, -2.111631419e-03f, -9.094261349e-05f, +4.638041588e-03f, -8.973739761e-03f, +7.993101867e-03f, +5.149295958e-03f, -4.521134714e-02f, -2.633171509e-03f, +4.619798494e-02f, -2.213114486e-03f, -9.710633196e-03f, +9.216973673e-03f, -4.078160698e-03f, -5.504337213e-04f, +2.451608517e-03f, -2.006923010e-03f, +7.387995536e-04f, +1.524827524e-04f, -3.685645521e-04f, +2.181717207e-04f, -5.946880494e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.097644736e-04f, -5.386640945e-04f, +5.864237478e-04f, +6.267133557e-05f, -1.515500253e-03f, +3.078761555e-03f, -3.430546520e-03f, +1.549361071e-03f, +2.213291408e-03f, -5.907735770e-03f, +7.078790914e-03f, -4.533039716e-03f, -5.935089525e-04f, +5.429877442e-03f, -7.280540492e-03f, +5.412653288e-03f, -1.377455760e-03f, -2.272920446e-03f, +3.764398369e-03f, -3.025169814e-03f, +1.264416787e-03f, +1.822393881e-04f, -7.250456053e-04f, +5.797191266e-04f, -2.564322231e-04f, +5.946880494e-05f, +0.000000000e+00f, + /* 13, 1 (28) */ + +0.000000000e+00f, +3.568739670e-04f, +1.453233711e-03f, -4.982715521e-03f, +6.911942288e-03f, -1.770271855e-03f, -1.265840873e-02f, +2.912280622e-02f, -3.057407349e-02f, -3.470149638e-04f, +6.616554460e-02f, -1.442273786e-01f, +1.840637268e-01f, +7.362766049e-01f, +2.754730589e-01f, -1.515897891e-01f, +4.846180954e-02f, +1.784369847e-02f, -3.929027578e-02f, +2.866331511e-02f, -8.095168796e-03f, -5.760606248e-03f, +8.514072460e-03f, -4.795349290e-03f, +7.702630743e-04f, +7.848101613e-04f, -5.313402824e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.568739670e-04f, -3.581597548e-04f, +4.518077077e-03f, -1.003061361e-02f, +1.164997889e-02f, -3.843878019e-03f, -1.329594831e-02f, +3.089633852e-02f, -3.545679882e-02f, +1.891037461e-02f, +1.310642691e-02f, -4.265901826e-02f, +5.113878969e-02f, -3.269610110e-02f, -1.252904492e-03f, +3.023076367e-02f, -3.904754599e-02f, +2.707405700e-02f, -6.101003420e-03f, -9.947809388e-03f, +1.442989593e-02f, -9.911045560e-03f, +3.206607724e-03f, +7.602234664e-04f, -1.363475778e-03f, +5.313402824e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.969086049e-04f, +2.570948466e-04f, +7.589063730e-05f, -9.619003544e-04f, +1.918271183e-03f, -1.742559828e-03f, -7.016235217e-04f, +5.075740404e-03f, -8.555401689e-03f, +6.202026669e-03f, +7.790580130e-03f, -4.373371457e-02f, -7.865011088e-03f, +4.666712344e-02f, +9.842563057e-04f, -1.131533751e-02f, +9.271629637e-03f, -3.402807360e-03f, -1.209645266e-03f, +2.753384771e-03f, -1.986063008e-03f, +5.897142049e-04f, +2.745021427e-04f, -4.179349901e-04f, +2.214714011e-04f, -5.226481803e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.969086049e-04f, -4.867890496e-04f, +4.418095209e-04f, +2.938279412e-04f, -1.720371530e-03f, +3.058478095e-03f, -3.026391735e-03f, +8.065505564e-04f, +2.982793047e-03f, -6.259498197e-03f, +6.714961298e-03f, -3.535159361e-03f, -1.766588182e-03f, +6.204121044e-03f, -7.314035106e-03f, +4.784107531e-03f, -4.940500910e-04f, -2.959375512e-03f, +4.017817410e-03f, -2.896437912e-03f, +9.714624842e-04f, +4.353067917e-04f, -8.535997808e-04f, +6.079668797e-04f, -2.449614229e-04f, +5.226481803e-05f, +0.000000000e+00f, + /* 13, 2 (28) */ + +0.000000000e+00f, +1.599653621e-04f, +1.710328557e-03f, -4.906824884e-03f, +5.950041934e-03f, +1.479993283e-04f, -1.440096856e-02f, +2.842118270e-02f, -2.549833309e-02f, -8.902416653e-03f, +7.236757127e-02f, -1.364367985e-01f, +1.403300123e-01f, +7.284115939e-01f, +3.221401824e-01f, -1.506055328e-01f, +3.714647203e-02f, +2.711532811e-02f, -4.269308314e-02f, +2.745366985e-02f, -5.341784024e-03f, -7.746669256e-03f, +9.103786665e-03f, -4.520847147e-03f, +3.523280842e-04f, +1.006281562e-03f, -5.836051004e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.599653621e-04f, -8.449488044e-04f, +4.959886598e-03f, -9.736785672e-03f, +9.929607362e-03f, -7.853999246e-04f, -1.632234004e-02f, +3.170288907e-02f, -3.247400577e-02f, +1.265087641e-02f, +1.982138821e-02f, -4.619417762e-02f, +4.937220151e-02f, -2.649198006e-02f, -8.566939598e-03f, +3.501487120e-02f, -3.954159608e-02f, +2.411468149e-02f, -2.083186010e-03f, -1.284424730e-02f, +1.540135842e-02f, -9.475738768e-03f, +2.353007943e-03f, +1.368190346e-03f, -1.608437201e-03f, +5.836051004e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.803279158e-04f, +1.982297826e-04f, +1.777392293e-04f, -1.033764080e-03f, +1.815030251e-03f, -1.353715321e-03f, -1.269963427e-03f, +5.387389999e-03f, -7.978400491e-03f, +4.376276951e-03f, +1.010930366e-02f, -4.179847175e-02f, -1.299388970e-02f, +4.659967790e-02f, +4.403478335e-03f, -1.276825545e-02f, +9.127608772e-03f, -2.621509266e-03f, -1.872851108e-03f, +3.008287473e-03f, -1.918976945e-03f, +4.181467393e-04f, +3.982733156e-04f, -4.608864859e-04f, +2.190934259e-04f, -4.228526908e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.803279158e-04f, -4.262449191e-04f, +2.952059116e-04f, +5.062396848e-04f, -1.875992812e-03f, +2.967327785e-03f, -2.563469441e-03f, +6.240126125e-05f, +3.669102029e-03f, -6.461610334e-03f, +6.199014336e-03f, -2.460089821e-03f, -2.898186105e-03f, +6.837049515e-03f, -7.177068805e-03f, +4.035287579e-03f, +4.166820726e-04f, -3.591374182e-03f, +4.182370935e-03f, -2.693134488e-03f, +6.422219079e-04f, +6.904469727e-04f, -9.680474561e-04f, +6.216528191e-04f, -2.246658194e-04f, +4.228526908e-05f, +0.000000000e+00f, + /* 13, 3 (28) */ + +0.000000000e+00f, -2.036255371e-05f, +1.908558340e-03f, -4.729085655e-03f, +4.916277854e-03f, +1.963029579e-03f, -1.575468388e-02f, +2.715121927e-02f, -2.011094309e-02f, -1.688081714e-02f, +7.674384822e-02f, -1.263274948e-01f, +9.853154051e-02f, +7.154177042e-01f, +3.687398603e-01f, -1.462020544e-01f, +2.437821658e-02f, +3.624293688e-02f, -4.531459241e-02f, +2.558081874e-02f, -2.333496551e-03f, -9.665646201e-03f, +9.521933405e-03f, -4.122573832e-03f, -1.085584017e-04f, +1.225374988e-03f, -6.258903695e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.036255371e-05f, -1.271193724e-03f, +5.255092509e-03f, -9.230545987e-03f, +8.053614551e-03f, +2.181927861e-03f, -1.888580949e-02f, +3.176529033e-02f, -2.880490374e-02f, +6.189266080e-03f, +2.602040255e-02f, -4.865426744e-02f, +4.647401540e-02f, -1.965493054e-02f, -1.574400840e-02f, +3.905015878e-02f, -3.912491400e-02f, +2.052330731e-02f, +2.099184926e-03f, -1.553738179e-02f, +1.604358032e-02f, -8.785291796e-03f, +1.384960487e-03f, +1.989843165e-03f, -1.833103021e-03f, +6.258903695e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.607869473e-04f, +1.393362692e-04f, +2.688983937e-04f, -1.078821552e-03f, +1.677884550e-03f, -9.544210337e-04f, -1.785729637e-03f, +5.571929816e-03f, -7.261692841e-03f, +2.553602345e-03f, +1.208414541e-02f, -3.944523309e-02f, -1.795298817e-02f, +4.598440199e-02f, +8.000109621e-03f, -1.403150726e-02f, +8.778540869e-03f, -1.746525657e-03f, -2.525495492e-03f, +3.208295884e-03f, -1.804786949e-03f, +2.268211904e-04f, +5.209151047e-04f, -4.958356864e-04f, +2.105797540e-04f, -2.954609909e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.607869473e-04f, -3.592765960e-04f, +1.504421647e-04f, +6.956218532e-04f, -1.980655016e-03f, +2.809931649e-03f, -2.054402099e-03f, -6.655491105e-04f, +4.257637282e-03f, -6.511374719e-03f, +5.544428988e-03f, -1.333404387e-03f, -3.961756046e-03f, +7.313234093e-03f, -6.871490347e-03f, +3.182436308e-03f, +1.333487281e-03f, -4.152504418e-03f, +4.251579924e-03f, -2.417707849e-03f, +2.834276143e-04f, +9.412283131e-04f, -1.064499817e-03f, +6.193214927e-04f, -1.953873470e-04f, +2.954609909e-05f, +0.000000000e+00f, + /* 13, 4 (28) */ + +0.000000000e+00f, -1.811495010e-04f, +2.047894609e-03f, -4.460187261e-03f, +3.837456302e-03f, +3.640914129e-03f, -1.670910491e-02f, +2.536548964e-02f, -1.453901327e-02f, -2.414250999e-02f, +7.929745057e-02f, -1.142433494e-01f, +5.908630741e-02f, +6.974647160e-01f, +4.147242623e-01f, -1.382019448e-01f, +1.034670932e-02f, +4.502147775e-02f, -4.706111806e-02f, +2.305532325e-02f, +8.747993327e-04f, -1.147043315e-02f, +9.748754595e-03f, -3.601658727e-03f, -6.043940881e-04f, +1.435954742e-03f, -6.554364686e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.811495010e-04f, -1.630470320e-03f, +5.405534674e-03f, -8.534924134e-03f, +6.072959535e-03f, +4.991859510e-03f, -2.094021158e-02f, +3.109974122e-02f, -2.454726646e-02f, -3.221086391e-04f, +3.156483154e-02f, -4.998767183e-02f, +4.251225936e-02f, -1.234169645e-02f, -2.261549875e-02f, +4.223259509e-02f, -3.779142672e-02f, +1.637080289e-02f, +6.350764850e-03f, -1.795508964e-02f, +1.632700794e-02f, -7.844063483e-03f, +3.204606698e-04f, +2.609164658e-03f, -2.028490368e-03f, +6.554364686e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.390674038e-04f, +8.183303216e-05f, +3.479626316e-04f, -1.097585037e-03f, +1.511571924e-03f, -5.537972797e-04f, -2.240262009e-03f, +5.631012677e-03f, -6.426266076e-03f, +7.699711255e-04f, +1.370030407e-02f, -3.671909523e-02f, -2.267818574e-02f, +4.481817636e-02f, +1.172523462e-02f, -1.506905241e-02f, +8.222075097e-03f, -7.926982130e-04f, -3.152600929e-03f, +3.346254437e-03f, -1.643660931e-03f, +1.908369435e-05f, +6.393922793e-04f, -5.212915553e-04f, +1.956060614e-04f, -1.415420956e-05f, +0.000000000e+00f, + +0.000000000e+00f, +1.390674038e-04f, -2.881546255e-04f, +1.108215697e-05f, +8.584724805e-04f, -2.033968415e-03f, +2.592356683e-03f, -1.512562408e-03f, -1.360552734e-03f, +4.736405719e-03f, -6.409743387e-03f, +4.767846119e-03f, -1.817750317e-04f, -4.932384095e-03f, +7.620921646e-03f, -6.403190573e-03f, +2.244493509e-03f, +2.234604561e-03f, -4.627719115e-03f, +4.221133037e-03f, -2.074485332e-03f, -9.716869297e-05f, +1.181025763e-03f, -1.139333276e-03f, +5.998780408e-04f, -1.572390982e-04f, +1.415420956e-05f, +0.000000000e+00f, + /* 13, 5 (28) */ + +0.000000000e+00f, -3.202169048e-04f, +2.129727641e-03f, -4.112224629e-03f, +2.739871266e-03f, +5.152486053e-03f, -1.726290219e-02f, +2.312522763e-02f, -8.908000598e-03f, -3.056877606e-02f, +8.006742169e-02f, -1.005430454e-01f, +2.236721218e-02f, +6.747865303e-01f, +4.595424386e-01f, -1.264767102e-01f, -4.722343086e-03f, +5.324355284e-02f, -4.785381628e-02f, +1.990272232e-02f, +4.221053770e-03f, -1.311409408e-02f, +9.767838289e-03f, -2.962266448e-03f, -1.125685643e-03f, +1.631560804e-03f, -6.695906781e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.202169048e-04f, -1.918624945e-03f, +5.416616831e-03f, -7.676451653e-03f, +4.038991121e-03f, +7.584216193e-03f, -2.245277399e-02f, +2.973918849e-02f, -1.981086074e-02f, -6.731852026e-03f, +3.633267766e-02f, -5.016944686e-02f, +3.757987526e-02f, -4.720774802e-03f, -2.901868932e-02f, +4.447708860e-02f, -3.555682216e-02f, +1.174308377e-02f, +1.057189789e-02f, -2.002957497e-02f, +1.622983925e-02f, -6.663037720e-03f, -8.188726058e-04f, +3.209042699e-03f, -2.185729466e-03f, +6.695906781e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.159457178e-04f, +2.700381581e-05f, +4.138969444e-04f, -1.091134819e-03f, +1.321239558e-03f, -1.605705936e-04f, -2.626592117e-03f, +5.568858352e-03f, -5.494630734e-03f, -9.410357382e-04f, +1.494955508e-02f, -3.366980638e-02f, -2.710907243e-02f, +4.310616097e-02f, +1.552618908e-02f, -1.584743849e-02f, +7.460099495e-03f, +2.227598241e-04f, -3.739083112e-03f, +3.416075681e-03f, -1.436860562e-03f, -2.011438953e-04f, +7.505815936e-04f, -5.359005839e-04f, +1.740011755e-04f, +3.688234506e-06f, +0.000000000e+00f, + +0.000000000e+00f, +1.159457178e-04f, -2.151101387e-04f, -1.196554268e-04f, +9.921253878e-04f, -2.036820231e-03f, +2.321918514e-03f, -9.517271008e-04f, -2.007038392e-03f, +5.096244218e-03f, -6.161245796e-03f, +3.888640644e-03f, +9.676724522e-04f, -5.787385887e-03f, +7.752329968e-03f, -5.781990990e-03f, +1.242668571e-03f, +3.098288579e-03f, -5.003735911e-03f, +4.089051516e-03f, -1.669624549e-03f, -4.909564591e-04f, +1.403187127e-03f, -1.189303245e-03f, +5.626427737e-04f, -1.106214155e-04f, -3.688234506e-06f, +0.000000000e+00f, + /* 13, 6 (28) */ + +0.000000000e+00f, -4.361626226e-04f, +2.156731457e-03f, -3.698327685e-03f, +1.648736446e-03f, +6.473725611e-03f, -1.742347279e-02f, +2.049863551e-02f, -3.339142246e-03f, -3.606340680e-02f, +7.912638596e-02f, -8.559349027e-02f, -1.130259419e-02f, +6.476774578e-01f, +5.026485996e-01f, -1.109505211e-01f, -2.056978157e-02f, +6.070365234e-02f, -4.763105645e-02f, +1.616363921e-02f, +7.637129450e-03f, -1.455095464e-02f, +9.566694394e-03f, -2.211684854e-03f, -1.661586227e-03f, +1.805561979e-03f, -6.659024436e-04f, +0.000000000e+00f, + +0.000000000e+00f, +4.361626226e-04f, -2.133735084e-03f, +5.296961404e-03f, -6.684326265e-03f, +2.002170890e-03f, +9.906134708e-03f, -2.340450109e-02f, +2.773215010e-02f, -1.471461652e-02f, -1.289309782e-02f, +4.022131830e-02f, -4.920177441e-02f, +3.179248938e-02f, +3.031555166e-03f, -3.480068031e-02f, +4.571975717e-02f, -3.245853358e-02f, +6.739347862e-03f, +1.466094940e-02f, -2.169919952e-02f, +1.573888279e-02f, -5.259850593e-03f, -2.008175851e-03f, +3.771685472e-03f, -2.296350881e-03f, +6.659024436e-04f, +0.000000000e+00f, + +0.000000000e+00f, -9.217229433e-05f, -2.402575133e-05f, +4.660393219e-04f, -1.061063814e-03f, +1.112308476e-03f, +2.171001174e-04f, -2.939520943e-03f, +5.392058972e-03f, -4.490301623e-03f, -2.548764852e-03f, +1.583018857e-02f, -3.035086850e-02f, -3.118989610e-02f, +4.086180709e-02f, +1.934736771e-02f, -1.633652447e-02f, +6.498882346e-03f, +1.280534103e-03f, -4.270081492e-03f, +3.412927864e-03f, -1.186765894e-03f, -4.294267254e-04f, +8.513438530e-04f, -5.384912864e-04f, +1.457635800e-04f, +2.368211550e-05f, +0.000000000e+00f, + +0.000000000e+00f, +9.217229433e-05f, -1.422747106e-04f, -2.389635186e-04f, +1.094779161e-03f, -1.991301498e-03f, +2.006959355e-03f, -3.857302377e-04f, -2.590960759e-03f, +5.330988405e-03f, -5.773830893e-03f, +2.928431315e-03f, +2.088011086e-03f, -6.506848761e-03f, +7.703847455e-03f, -5.021435586e-03f, +1.999524968e-04f, +3.903340830e-03f, -5.269401320e-03f, +3.855799559e-03f, -1.211016291e-03f, -8.886549225e-04f, +1.601207351e-03f, -1.211653197e-03f, +5.073968242e-04f, -5.623002535e-05f, -2.368211550e-05f, +0.000000000e+00f, + /* 13, 7 (28) */ + +0.000000000e+00f, -5.283349169e-04f, +2.132705706e-03f, -3.232288363e-03f, +5.876726322e-04f, +7.586034087e-03f, -1.720637267e-02f, +1.755911457e-02f, +2.052916726e-03f, -4.055370842e-02f, +7.657762110e-02f, -6.976330170e-02f, -4.165346269e-02f, +6.164875617e-01f, +5.435104067e-01f, -9.160315340e-02f, -3.690630604e-02f, +6.720253469e-02f, -4.635052235e-02f, +1.189355772e-02f, +1.105005731e-02f, -1.573772054e-02f, +9.137267669e-03f, -1.360341001e-03f, -2.200077514e-03f, +1.951325559e-03f, -6.422203281e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.283349169e-04f, -2.276009794e-03f, +5.057997886e-03f, -5.589547104e-03f, +1.086939211e-05f, +1.191309406e-02f, -2.379023133e-02f, +2.514118934e-02f, -9.383628118e-03f, -1.866692872e-02f, +4.314974961e-02f, -4.711376332e-02f, +2.528564062e-02f, +1.073540262e-02f, -3.982211590e-02f, +4.591970966e-02f, -2.855519275e-02f, +1.469946542e-03f, +1.851674896e-02f, -2.291021581e-02f, +1.485022786e-02f, -3.658643241e-03f, -3.219829048e-03f, +4.279082297e-03f, -2.352580907e-03f, +6.422203281e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.845289247e-05f, -7.030581238e-05f, +5.040940874e-04f, -1.009413122e-03f, +8.903382910e-04f, +5.717771793e-04f, -3.175655060e-03f, +5.109342206e-03f, -3.437278311e-03f, -4.025956514e-03f, +1.634683201e-02f, -2.681858927e-02f, -3.487042737e-02f, +3.810672767e-02f, +2.313110144e-02f, -1.651016365e-02f, +5.349129903e-03f, +2.359535620e-03f, -4.731298783e-03f, +3.333402192e-03f, -8.968749533e-04f, -6.608952906e-04f, +9.386005109e-04f, -5.281167619e-04f, +1.110743340e-04f, +4.543251870e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.845289247e-05f, -7.162659364e-05f, -3.444985434e-04f, +1.165502340e-03f, -1.900606213e-03f, +1.656607659e-03f, +1.718753448e-04f, -3.100104401e-03f, +5.437565358e-03f, -5.258628319e-03f, +1.910540740e-03f, +3.153157097e-03f, -7.074106047e-03f, +7.476131947e-03f, -4.138490324e-03f, -8.594193102e-04f, +4.629635718e-03f, -5.416009303e-03f, +3.524335977e-03f, -7.081401769e-04f, -1.280526142e-03f, +1.768906421e-03f, -1.204215716e-03f, +4.344170456e-04f, +4.944518787e-06f, -4.543251870e-05f, +0.000000000e+00f, + /* 13, 8 (28) */ + +0.000000000e+00f, -5.967878094e-04f, +2.062399893e-03f, -2.728194276e-03f, -4.217404900e-04f, +8.476372378e-03f, -1.663459549e-02f, +1.438345951e-02f, +7.162258932e-03f, -4.399098673e-02f, +7.255166459e-02f, -5.341646969e-02f, -6.847205196e-02f, +5.816171343e-01f, +5.816171343e-01f, -6.847205196e-02f, -5.341646969e-02f, +7.255166459e-02f, -4.399098673e-02f, +7.162258932e-03f, +1.438345951e-02f, -1.663459549e-02f, +8.476372378e-03f, -4.217404900e-04f, -2.728194276e-03f, +2.062399893e-03f, -5.967878094e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.967878094e-04f, -2.347636388e-03f, +4.713499342e-03f, -4.424044764e-03f, -1.889736821e-03f, +1.356970172e-02f, -2.361835599e-02f, +2.204108494e-02f, -3.946062761e-03f, -2.392555703e-02f, +4.506029035e-02f, -4.396060622e-02f, +1.821153457e-02f, +1.821153457e-02f, -4.396060622e-02f, +4.506029035e-02f, -2.392555703e-02f, -3.946062761e-03f, +2.204108494e-02f, -2.361835599e-02f, +1.356970172e-02f, -1.889736821e-03f, -4.424044764e-03f, +4.713499342e-03f, -2.347636388e-03f, +5.967878094e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.543251870e-05f, -1.110743340e-04f, +5.281167619e-04f, -9.386005109e-04f, +6.608952906e-04f, +8.968749533e-04f, -3.333402192e-03f, +4.731298783e-03f, -2.359535620e-03f, -5.349129903e-03f, +1.651016365e-02f, -2.313110144e-02f, -3.810672767e-02f, +3.487042737e-02f, +2.681858927e-02f, -1.634683201e-02f, +4.025956514e-03f, +3.437278311e-03f, -5.109342206e-03f, +3.175655060e-03f, -5.717771793e-04f, -8.903382910e-04f, +1.009413122e-03f, -5.040940874e-04f, +7.030581238e-05f, +6.845289247e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.543251870e-05f, -4.944518787e-06f, -4.344170456e-04f, +1.204215716e-03f, -1.768906421e-03f, +1.280526142e-03f, +7.081401769e-04f, -3.524335977e-03f, +5.416009303e-03f, -4.629635718e-03f, +8.594193102e-04f, +4.138490324e-03f, -7.476131947e-03f, +7.074106047e-03f, -3.153157097e-03f, -1.910540740e-03f, +5.258628319e-03f, -5.437565358e-03f, +3.100104401e-03f, -1.718753448e-04f, -1.656607659e-03f, +1.900606213e-03f, -1.165502340e-03f, +3.444985434e-04f, +7.162659364e-05f, -6.845289247e-05f, +0.000000000e+00f, + /* 13, 9 (28) */ + +0.000000000e+00f, -6.422203281e-04f, +1.951325559e-03f, -2.200077514e-03f, -1.360341001e-03f, +9.137267669e-03f, -1.573772054e-02f, +1.105005731e-02f, +1.189355772e-02f, -4.635052235e-02f, +6.720253469e-02f, -3.690630604e-02f, -9.160315340e-02f, +5.435104067e-01f, +6.164875617e-01f, -4.165346269e-02f, -6.976330170e-02f, +7.657762110e-02f, -4.055370842e-02f, +2.052916726e-03f, +1.755911457e-02f, -1.720637267e-02f, +7.586034087e-03f, +5.876726322e-04f, -3.232288363e-03f, +2.132705706e-03f, -5.283349169e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.422203281e-04f, -2.352580907e-03f, +4.279082297e-03f, -3.219829048e-03f, -3.658643241e-03f, +1.485022786e-02f, -2.291021581e-02f, +1.851674896e-02f, +1.469946542e-03f, -2.855519275e-02f, +4.591970966e-02f, -3.982211590e-02f, +1.073540262e-02f, +2.528564062e-02f, -4.711376332e-02f, +4.314974961e-02f, -1.866692872e-02f, -9.383628118e-03f, +2.514118934e-02f, -2.379023133e-02f, +1.191309406e-02f, +1.086939211e-05f, -5.589547104e-03f, +5.057997886e-03f, -2.276009794e-03f, +5.283349169e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.368211550e-05f, -1.457635800e-04f, +5.384912864e-04f, -8.513438530e-04f, +4.294267254e-04f, +1.186765894e-03f, -3.412927864e-03f, +4.270081492e-03f, -1.280534103e-03f, -6.498882346e-03f, +1.633652447e-02f, -1.934736771e-02f, -4.086180709e-02f, +3.118989610e-02f, +3.035086850e-02f, -1.583018857e-02f, +2.548764852e-03f, +4.490301623e-03f, -5.392058972e-03f, +2.939520943e-03f, -2.171001174e-04f, -1.112308476e-03f, +1.061063814e-03f, -4.660393219e-04f, +2.402575133e-05f, +9.217229433e-05f, +0.000000000e+00f, + +0.000000000e+00f, +2.368211550e-05f, +5.623002535e-05f, -5.073968242e-04f, +1.211653197e-03f, -1.601207351e-03f, +8.886549225e-04f, +1.211016291e-03f, -3.855799559e-03f, +5.269401320e-03f, -3.903340830e-03f, -1.999524968e-04f, +5.021435586e-03f, -7.703847455e-03f, +6.506848761e-03f, -2.088011086e-03f, -2.928431315e-03f, +5.773830893e-03f, -5.330988405e-03f, +2.590960759e-03f, +3.857302377e-04f, -2.006959355e-03f, +1.991301498e-03f, -1.094779161e-03f, +2.389635186e-04f, +1.422747106e-04f, -9.217229433e-05f, +0.000000000e+00f, + /* 13,10 (28) */ + +0.000000000e+00f, -6.659024436e-04f, +1.805561979e-03f, -1.661586227e-03f, -2.211684854e-03f, +9.566694394e-03f, -1.455095464e-02f, +7.637129450e-03f, +1.616363921e-02f, -4.763105645e-02f, +6.070365234e-02f, -2.056978157e-02f, -1.109505211e-01f, +5.026485996e-01f, +6.476774578e-01f, -1.130259419e-02f, -8.559349027e-02f, +7.912638596e-02f, -3.606340680e-02f, -3.339142246e-03f, +2.049863551e-02f, -1.742347279e-02f, +6.473725611e-03f, +1.648736446e-03f, -3.698327685e-03f, +2.156731457e-03f, -4.361626226e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.659024436e-04f, -2.296350881e-03f, +3.771685472e-03f, -2.008175851e-03f, -5.259850593e-03f, +1.573888279e-02f, -2.169919952e-02f, +1.466094940e-02f, +6.739347862e-03f, -3.245853358e-02f, +4.571975717e-02f, -3.480068031e-02f, +3.031555166e-03f, +3.179248938e-02f, -4.920177441e-02f, +4.022131830e-02f, -1.289309782e-02f, -1.471461652e-02f, +2.773215010e-02f, -2.340450109e-02f, +9.906134708e-03f, +2.002170890e-03f, -6.684326265e-03f, +5.296961404e-03f, -2.133735084e-03f, +4.361626226e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.688234506e-06f, -1.740011755e-04f, +5.359005839e-04f, -7.505815936e-04f, +2.011438953e-04f, +1.436860562e-03f, -3.416075681e-03f, +3.739083112e-03f, -2.227598241e-04f, -7.460099495e-03f, +1.584743849e-02f, -1.552618908e-02f, -4.310616097e-02f, +2.710907243e-02f, +3.366980638e-02f, -1.494955508e-02f, +9.410357382e-04f, +5.494630734e-03f, -5.568858352e-03f, +2.626592117e-03f, +1.605705936e-04f, -1.321239558e-03f, +1.091134819e-03f, -4.138969444e-04f, -2.700381581e-05f, +1.159457178e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.688234506e-06f, +1.106214155e-04f, -5.626427737e-04f, +1.189303245e-03f, -1.403187127e-03f, +4.909564591e-04f, +1.669624549e-03f, -4.089051516e-03f, +5.003735911e-03f, -3.098288579e-03f, -1.242668571e-03f, +5.781990990e-03f, -7.752329968e-03f, +5.787385887e-03f, -9.676724522e-04f, -3.888640644e-03f, +6.161245796e-03f, -5.096244218e-03f, +2.007038392e-03f, +9.517271008e-04f, -2.321918514e-03f, +2.036820231e-03f, -9.921253878e-04f, +1.196554268e-04f, +2.151101387e-04f, -1.159457178e-04f, +0.000000000e+00f, + /* 13,11 (28) */ + +0.000000000e+00f, -6.695906781e-04f, +1.631560804e-03f, -1.125685643e-03f, -2.962266448e-03f, +9.767838289e-03f, -1.311409408e-02f, +4.221053770e-03f, +1.990272232e-02f, -4.785381628e-02f, +5.324355284e-02f, -4.722343086e-03f, -1.264767102e-01f, +4.595424386e-01f, +6.747865303e-01f, +2.236721218e-02f, -1.005430454e-01f, +8.006742169e-02f, -3.056877606e-02f, -8.908000598e-03f, +2.312522763e-02f, -1.726290219e-02f, +5.152486053e-03f, +2.739871266e-03f, -4.112224629e-03f, +2.129727641e-03f, -3.202169048e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.695906781e-04f, -2.185729466e-03f, +3.209042699e-03f, -8.188726058e-04f, -6.663037720e-03f, +1.622983925e-02f, -2.002957497e-02f, +1.057189789e-02f, +1.174308377e-02f, -3.555682216e-02f, +4.447708860e-02f, -2.901868932e-02f, -4.720774802e-03f, +3.757987526e-02f, -5.016944686e-02f, +3.633267766e-02f, -6.731852026e-03f, -1.981086074e-02f, +2.973918849e-02f, -2.245277399e-02f, +7.584216193e-03f, +4.038991121e-03f, -7.676451653e-03f, +5.416616831e-03f, -1.918624945e-03f, +3.202169048e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.415420956e-05f, -1.956060614e-04f, +5.212915553e-04f, -6.393922793e-04f, -1.908369435e-05f, +1.643660931e-03f, -3.346254437e-03f, +3.152600929e-03f, +7.926982130e-04f, -8.222075097e-03f, +1.506905241e-02f, -1.172523462e-02f, -4.481817636e-02f, +2.267818574e-02f, +3.671909523e-02f, -1.370030407e-02f, -7.699711255e-04f, +6.426266076e-03f, -5.631012677e-03f, +2.240262009e-03f, +5.537972797e-04f, -1.511571924e-03f, +1.097585037e-03f, -3.479626316e-04f, -8.183303216e-05f, +1.390674038e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.415420956e-05f, +1.572390982e-04f, -5.998780408e-04f, +1.139333276e-03f, -1.181025763e-03f, +9.716869297e-05f, +2.074485332e-03f, -4.221133037e-03f, +4.627719115e-03f, -2.234604561e-03f, -2.244493509e-03f, +6.403190573e-03f, -7.620921646e-03f, +4.932384095e-03f, +1.817750317e-04f, -4.767846119e-03f, +6.409743387e-03f, -4.736405719e-03f, +1.360552734e-03f, +1.512562408e-03f, -2.592356683e-03f, +2.033968415e-03f, -8.584724805e-04f, -1.108215697e-05f, +2.881546255e-04f, -1.390674038e-04f, +0.000000000e+00f, + /* 13,12 (28) */ + +0.000000000e+00f, -6.554364686e-04f, +1.435954742e-03f, -6.043940881e-04f, -3.601658727e-03f, +9.748754595e-03f, -1.147043315e-02f, +8.747993327e-04f, +2.305532325e-02f, -4.706111806e-02f, +4.502147775e-02f, +1.034670932e-02f, -1.382019448e-01f, +4.147242623e-01f, +6.974647160e-01f, +5.908630741e-02f, -1.142433494e-01f, +7.929745057e-02f, -2.414250999e-02f, -1.453901327e-02f, +2.536548964e-02f, -1.670910491e-02f, +3.640914129e-03f, +3.837456302e-03f, -4.460187261e-03f, +2.047894609e-03f, -1.811495010e-04f, +0.000000000e+00f, + +0.000000000e+00f, +6.554364686e-04f, -2.028490368e-03f, +2.609164658e-03f, +3.204606698e-04f, -7.844063483e-03f, +1.632700794e-02f, -1.795508964e-02f, +6.350764850e-03f, +1.637080289e-02f, -3.779142672e-02f, +4.223259509e-02f, -2.261549875e-02f, -1.234169645e-02f, +4.251225936e-02f, -4.998767183e-02f, +3.156483154e-02f, -3.221086391e-04f, -2.454726646e-02f, +3.109974122e-02f, -2.094021158e-02f, +4.991859510e-03f, +6.072959535e-03f, -8.534924134e-03f, +5.405534674e-03f, -1.630470320e-03f, +1.811495010e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.954609909e-05f, -2.105797540e-04f, +4.958356864e-04f, -5.209151047e-04f, -2.268211904e-04f, +1.804786949e-03f, -3.208295884e-03f, +2.525495492e-03f, +1.746525657e-03f, -8.778540869e-03f, +1.403150726e-02f, -8.000109621e-03f, -4.598440199e-02f, +1.795298817e-02f, +3.944523309e-02f, -1.208414541e-02f, -2.553602345e-03f, +7.261692841e-03f, -5.571929816e-03f, +1.785729637e-03f, +9.544210337e-04f, -1.677884550e-03f, +1.078821552e-03f, -2.688983937e-04f, -1.393362692e-04f, +1.607869473e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.954609909e-05f, +1.953873470e-04f, -6.193214927e-04f, +1.064499817e-03f, -9.412283131e-04f, -2.834276143e-04f, +2.417707849e-03f, -4.251579924e-03f, +4.152504418e-03f, -1.333487281e-03f, -3.182436308e-03f, +6.871490347e-03f, -7.313234093e-03f, +3.961756046e-03f, +1.333404387e-03f, -5.544428988e-03f, +6.511374719e-03f, -4.257637282e-03f, +6.655491105e-04f, +2.054402099e-03f, -2.809931649e-03f, +1.980655016e-03f, -6.956218532e-04f, -1.504421647e-04f, +3.592765960e-04f, -1.607869473e-04f, +0.000000000e+00f, + /* 13,13 (28) */ + +0.000000000e+00f, -6.258903695e-04f, +1.225374988e-03f, -1.085584017e-04f, -4.122573832e-03f, +9.521933405e-03f, -9.665646201e-03f, -2.333496551e-03f, +2.558081874e-02f, -4.531459241e-02f, +3.624293688e-02f, +2.437821658e-02f, -1.462020544e-01f, +3.687398603e-01f, +7.154177042e-01f, +9.853154051e-02f, -1.263274948e-01f, +7.674384822e-02f, -1.688081714e-02f, -2.011094309e-02f, +2.715121927e-02f, -1.575468388e-02f, +1.963029579e-03f, +4.916277854e-03f, -4.729085655e-03f, +1.908558340e-03f, -2.036255371e-05f, +0.000000000e+00f, + +0.000000000e+00f, +6.258903695e-04f, -1.833103021e-03f, +1.989843165e-03f, +1.384960487e-03f, -8.785291796e-03f, +1.604358032e-02f, -1.553738179e-02f, +2.099184926e-03f, +2.052330731e-02f, -3.912491400e-02f, +3.905015878e-02f, -1.574400840e-02f, -1.965493054e-02f, +4.647401540e-02f, -4.865426744e-02f, +2.602040255e-02f, +6.189266080e-03f, -2.880490374e-02f, +3.176529033e-02f, -1.888580949e-02f, +2.181927861e-03f, +8.053614551e-03f, -9.230545987e-03f, +5.255092509e-03f, -1.271193724e-03f, +2.036255371e-05f, +0.000000000e+00f, + +0.000000000e+00f, +4.228526908e-05f, -2.190934259e-04f, +4.608864859e-04f, -3.982733156e-04f, -4.181467393e-04f, +1.918976945e-03f, -3.008287473e-03f, +1.872851108e-03f, +2.621509266e-03f, -9.127608772e-03f, +1.276825545e-02f, -4.403478335e-03f, -4.659967790e-02f, +1.299388970e-02f, +4.179847175e-02f, -1.010930366e-02f, -4.376276951e-03f, +7.978400491e-03f, -5.387389999e-03f, +1.269963427e-03f, +1.353715321e-03f, -1.815030251e-03f, +1.033764080e-03f, -1.777392293e-04f, -1.982297826e-04f, +1.803279158e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.228526908e-05f, +2.246658194e-04f, -6.216528191e-04f, +9.680474561e-04f, -6.904469727e-04f, -6.422219079e-04f, +2.693134488e-03f, -4.182370935e-03f, +3.591374182e-03f, -4.166820726e-04f, -4.035287579e-03f, +7.177068805e-03f, -6.837049515e-03f, +2.898186105e-03f, +2.460089821e-03f, -6.199014336e-03f, +6.461610334e-03f, -3.669102029e-03f, -6.240126125e-05f, +2.563469441e-03f, -2.967327785e-03f, +1.875992812e-03f, -5.062396848e-04f, -2.952059116e-04f, +4.262449191e-04f, -1.803279158e-04f, +0.000000000e+00f, + /* 13,14 (28) */ + +0.000000000e+00f, -5.836051004e-04f, +1.006281562e-03f, +3.523280842e-04f, -4.520847147e-03f, +9.103786665e-03f, -7.746669256e-03f, -5.341784024e-03f, +2.745366985e-02f, -4.269308314e-02f, +2.711532811e-02f, +3.714647203e-02f, -1.506055328e-01f, +3.221401824e-01f, +7.284115939e-01f, +1.403300123e-01f, -1.364367985e-01f, +7.236757127e-02f, -8.902416653e-03f, -2.549833309e-02f, +2.842118270e-02f, -1.440096856e-02f, +1.479993283e-04f, +5.950041934e-03f, -4.906824884e-03f, +1.710328557e-03f, +1.599653621e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.836051004e-04f, -1.608437201e-03f, +1.368190346e-03f, +2.353007943e-03f, -9.475738768e-03f, +1.540135842e-02f, -1.284424730e-02f, -2.083186010e-03f, +2.411468149e-02f, -3.954159608e-02f, +3.501487120e-02f, -8.566939598e-03f, -2.649198006e-02f, +4.937220151e-02f, -4.619417762e-02f, +1.982138821e-02f, +1.265087641e-02f, -3.247400577e-02f, +3.170288907e-02f, -1.632234004e-02f, -7.853999246e-04f, +9.929607362e-03f, -9.736785672e-03f, +4.959886598e-03f, -8.449488044e-04f, -1.599653621e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.226481803e-05f, -2.214714011e-04f, +4.179349901e-04f, -2.745021427e-04f, -5.897142049e-04f, +1.986063008e-03f, -2.753384771e-03f, +1.209645266e-03f, +3.402807360e-03f, -9.271629637e-03f, +1.131533751e-02f, -9.842563057e-04f, -4.666712344e-02f, +7.865011088e-03f, +4.373371457e-02f, -7.790580130e-03f, -6.202026669e-03f, +8.555401689e-03f, -5.075740404e-03f, +7.016235217e-04f, +1.742559828e-03f, -1.918271183e-03f, +9.619003544e-04f, -7.589063730e-05f, -2.570948466e-04f, +1.969086049e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.226481803e-05f, +2.449614229e-04f, -6.079668797e-04f, +8.535997808e-04f, -4.353067917e-04f, -9.714624842e-04f, +2.896437912e-03f, -4.017817410e-03f, +2.959375512e-03f, +4.940500910e-04f, -4.784107531e-03f, +7.314035106e-03f, -6.204121044e-03f, +1.766588182e-03f, +3.535159361e-03f, -6.714961298e-03f, +6.259498197e-03f, -2.982793047e-03f, -8.065505564e-04f, +3.026391735e-03f, -3.058478095e-03f, +1.720371530e-03f, -2.938279412e-04f, -4.418095209e-04f, +4.867890496e-04f, -1.969086049e-04f, +0.000000000e+00f, + /* 13,15 (28) */ + +0.000000000e+00f, -5.313402824e-04f, +7.848101613e-04f, +7.702630743e-04f, -4.795349290e-03f, +8.514072460e-03f, -5.760606248e-03f, -8.095168796e-03f, +2.866331511e-02f, -3.929027578e-02f, +1.784369847e-02f, +4.846180954e-02f, -1.515897891e-01f, +2.754730589e-01f, +7.362766049e-01f, +1.840637268e-01f, -1.442273786e-01f, +6.616554460e-02f, -3.470149638e-04f, -3.057407349e-02f, +2.912280622e-02f, -1.265840873e-02f, -1.770271855e-03f, +6.911942288e-03f, -4.982715521e-03f, +1.453233711e-03f, +3.568739670e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.313402824e-04f, -1.363475778e-03f, +7.602234664e-04f, +3.206607724e-03f, -9.911045560e-03f, +1.442989593e-02f, -9.947809388e-03f, -6.101003420e-03f, +2.707405700e-02f, -3.904754599e-02f, +3.023076367e-02f, -1.252904492e-03f, -3.269610110e-02f, +5.113878969e-02f, -4.265901826e-02f, +1.310642691e-02f, +1.891037461e-02f, -3.545679882e-02f, +3.089633852e-02f, -1.329594831e-02f, -3.843878019e-03f, +1.164997889e-02f, -1.003061361e-02f, +4.518077077e-03f, -3.581597548e-04f, -3.568739670e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.946880494e-05f, -2.181717207e-04f, +3.685645521e-04f, -1.524827524e-04f, -7.387995536e-04f, +2.006923010e-03f, -2.451608517e-03f, +5.504337213e-04f, +4.078160698e-03f, -9.216973673e-03f, +9.710633196e-03f, +2.213114486e-03f, -4.619798494e-02f, +2.633171509e-03f, +4.521134714e-02f, -5.149295958e-03f, -7.993101867e-03f, +8.973739761e-03f, -4.638041588e-03f, +9.094261349e-05f, +2.111631419e-03f, -1.983411383e-03f, +8.633306184e-04f, +3.488347878e-05f, -3.144060840e-04f, +2.097644736e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.946880494e-05f, +2.564322231e-04f, -5.797191266e-04f, +7.250456053e-04f, -1.822393881e-04f, -1.264416787e-03f, +3.025169814e-03f, -3.764398369e-03f, +2.272920446e-03f, +1.377455760e-03f, -5.412653288e-03f, +7.280540492e-03f, -5.429877442e-03f, +5.935089525e-04f, +4.533039716e-03f, -7.078790914e-03f, +5.907735770e-03f, -2.213291408e-03f, -1.549361071e-03f, +3.430546520e-03f, -3.078761555e-03f, +1.515500253e-03f, -6.267133557e-05f, -5.864237478e-04f, +5.386640945e-04f, -2.097644736e-04f, +0.000000000e+00f, + /* 14, 0 (24) */ + +1.319331966e-03f, -1.016178713e-03f, -2.318012042e-03f, +9.411795907e-03f, -1.746941689e-02f, +1.934834705e-02f, -5.865137636e-03f, -2.904336543e-02f, +8.299055312e-02f, -1.433490386e-01f, +1.911490954e-01f, +7.906420751e-01f, +1.911490954e-01f, -1.433490386e-01f, +8.299055312e-02f, -2.904336543e-02f, -5.865137636e-03f, +1.934834705e-02f, -1.746941689e-02f, +9.411795907e-03f, -2.318012042e-03f, -1.016178713e-03f, +1.319331966e-03f, -5.404051147e-04f, + -2.521351164e-03f, +4.422857262e-03f, -3.985881589e-03f, -1.343441160e-03f, +1.186209570e-02f, -2.390185965e-02f, +3.059439799e-02f, -2.544922973e-02f, +6.875499987e-03f, +1.945720767e-02f, -4.255924117e-02f, +5.173229864e-02f, -4.255924117e-02f, +1.945720767e-02f, +6.875499987e-03f, -2.544922973e-02f, +3.059439799e-02f, -2.390185965e-02f, +1.186209570e-02f, -1.343441160e-03f, -3.985881589e-03f, +4.422857262e-03f, -2.521351164e-03f, +7.211855688e-04f, + -2.242580105e-04f, +5.515402691e-04f, -8.006592829e-04f, +4.679111297e-04f, +9.671301358e-04f, -3.521489134e-03f, +6.187402659e-03f, -6.760448353e-03f, +2.085366097e-03f, +1.222808687e-02f, -4.974438686e-02f, -3.226680462e-03f, +5.162786239e-02f, -9.493654979e-03f, -4.297979908e-03f, +7.839517914e-03f, -6.351081144e-03f, +3.213964647e-03f, -5.735612965e-04f, -7.425062231e-04f, +9.210389417e-04f, -5.725628529e-04f, +2.111545745e-04f, -3.826050238e-05f, + +1.361148124e-04f, -6.078360122e-04f, +1.365871498e-03f, -2.021916039e-03f, +1.927534233e-03f, -5.492420567e-04f, -2.058145461e-03f, +5.025851749e-03f, -6.951055384e-03f, +6.618560623e-03f, -3.757759117e-03f, -6.671799512e-04f, +4.876258793e-03f, -7.186973906e-03f, +6.873936703e-03f, -4.460536991e-03f, +1.305886445e-03f, +1.201288539e-03f, -2.322748136e-03f, +2.158182611e-03f, -1.338999949e-03f, +5.283783837e-04f, -7.268521485e-05f, -3.959096234e-05f, + /* 14, 1 (24) */ + +1.095073956e-03f, -4.646384443e-04f, -3.118671324e-03f, +9.879707037e-03f, -1.650228675e-02f, +1.582685791e-02f, +3.222650227e-04f, -3.580381378e-02f, +8.507591921e-02f, -1.311209517e-01f, +1.414047086e-01f, +7.874153946e-01f, +2.427769578e-01f, -1.528426936e-01f, +7.869257321e-02f, -2.120384752e-02f, -1.221621878e-02f, +2.256231169e-02f, -1.804297818e-02f, +8.669289684e-03f, -1.396973100e-03f, -1.588741566e-03f, +1.530486541e-03f, -5.786656170e-04f, + -2.385236352e-03f, +3.815021250e-03f, -2.620010092e-03f, -3.365357199e-03f, +1.378962994e-02f, -2.445110171e-02f, +2.853625253e-02f, -2.042337798e-02f, -7.555539715e-05f, +2.607576830e-02f, -4.631700029e-02f, +5.106511869e-02f, -3.768298238e-02f, +1.227023377e-02f, +1.374943669e-02f, -2.990976672e-02f, +3.190028444e-02f, -2.270057111e-02f, +9.539347567e-03f, +8.147414509e-04f, -5.324881538e-03f, +4.951235646e-03f, -2.594036379e-03f, +6.815946065e-04f, + -2.296942030e-04f, +5.177001582e-04f, -6.680724132e-04f, +1.978996535e-04f, +1.315918267e-03f, -3.728015257e-03f, +5.882290961e-03f, -5.572608642e-03f, -5.747152836e-05f, +1.450554143e-02f, -4.726887393e-02f, -9.631599269e-03f, +5.287124448e-02f, -6.329778800e-03f, -6.531229974e-03f, +8.777579547e-03f, -6.362182872e-03f, +2.808172144e-03f, -1.430531405e-04f, -1.014600524e-03f, +1.025020997e-03f, -5.790976380e-04f, +1.900318896e-04f, -2.349002182e-05f, + +1.895983879e-04f, -6.647781197e-04f, +1.354460665e-03f, -1.838451667e-03f, +1.496872527e-03f, +9.670671648e-05f, -2.737850722e-03f, +5.449394323e-03f, -6.846417259e-03f, +5.883515895e-03f, -2.546845728e-03f, -1.983940869e-03f, +5.872327283e-03f, -7.572090831e-03f, +6.614500504e-03f, -3.765838378e-03f, +4.995911740e-04f, +1.841793810e-03f, -2.670171812e-03f, +2.241152524e-03f, -1.272400915e-03f, +4.272109316e-04f, -5.275240448e-07f, -7.300562037e-05f, + /* 14, 2 (24) */ + +8.653797527e-04f, +5.306171384e-05f, -3.786743738e-03f, +1.007760669e-02f, -1.518636848e-02f, +1.209884266e-02f, +6.204555983e-03f, -4.137642242e-02f, +8.501844769e-02f, -1.166154103e-01f, +9.413583464e-02f, +7.777837954e-01f, +2.956482023e-01f, -1.591724724e-01f, +7.216134324e-02f, -1.242626797e-02f, -1.857840165e-02f, +2.537048384e-02f, -1.818603132e-02f, +7.654689160e-03f, -3.719521032e-04f, -2.167839204e-03f, +1.720518430e-03f, -6.021556389e-04f, + -2.195637964e-03f, +3.150243130e-03f, -1.265549426e-03f, -5.203808866e-03f, +1.528650246e-02f, -2.435439499e-02f, +2.579840181e-02f, -1.497398365e-02f, -6.921972656e-03f, +3.195928419e-02f, -4.886384601e-02f, +4.908117782e-02f, -3.181065509e-02f, +4.698142935e-03f, +2.036393719e-02f, -3.367560509e-02f, +3.239987561e-02f, -2.085877730e-02f, +6.869175755e-03f, +3.055893975e-03f, -6.597282453e-03f, +5.378446577e-03f, -2.594563903e-03f, +6.085889861e-04f, + -2.280151365e-04f, +4.729451409e-04f, -5.275243952e-04f, -6.096256087e-05f, +1.613612465e-03f, -3.833432868e-03f, +5.449791260e-03f, -4.309298463e-03f, -2.085333382e-03f, +1.630831799e-02f, -4.425856157e-02f, -1.589207580e-02f, +5.343672742e-02f, -2.773590470e-03f, -8.732967871e-03f, +9.544290844e-03f, -6.212883448e-03f, +2.309519827e-03f, +3.151529850e-04f, -1.276755037e-03f, +1.108593712e-03f, -5.697741405e-04f, +1.607663332e-04f, -5.572393499e-06f, + +2.323296147e-04f, -6.991129623e-04f, +1.307215183e-03f, -1.614917439e-03f, +1.043612417e-03f, +7.196184886e-04f, -3.328879636e-03f, +5.722793198e-03f, -6.565411707e-03f, +5.002780468e-03f, -1.275853774e-03f, -3.248379155e-03f, +6.719086665e-03f, -7.762013897e-03f, +6.177097633e-03f, -2.957897070e-03f, -3.402831812e-04f, +2.452893712e-03f, -2.958341386e-03f, +2.265980518e-03f, -1.165729588e-03f, +3.058736760e-04f, +7.873939740e-05f, -1.082724704e-04f, + /* 14, 3 (24) */ + +6.373646162e-04f, +5.260068547e-04f, -4.314268133e-03f, +1.001664413e-02f, -1.357275602e-02f, +8.265409788e-03f, +1.165434724e-02f, -4.568572089e-02f, +8.293311430e-02f, -1.003070923e-01f, +4.987727307e-02f, +7.618917196e-01f, +3.490849297e-01f, -1.619460628e-01f, +6.342837536e-02f, -2.881977125e-03f, -2.479128510e-02f, +2.768000367e-02f, -1.787087834e-02f, +6.377934123e-03f, +7.366416088e-04f, -2.737613345e-03f, +1.881284763e-03f, -6.077280324e-04f, + -1.963308349e-03f, +2.451130168e-03f, +4.166575678e-05f, -6.818726304e-03f, +1.633011488e-02f, -2.363477650e-02f, +2.246952217e-02f, -9.251190455e-03f, -1.348738436e-02f, +3.696206466e-02f, -5.013969979e-02f, +4.583279867e-02f, -2.509156843e-02f, -3.063870962e-03f, +2.654103483e-02f, -3.663350216e-02f, +3.205959243e-02f, -1.840588359e-02f, +3.910834368e-03f, +5.321874493e-03f, -7.763012041e-03f, +5.684320253e-03f, -2.515824506e-03f, +5.003165157e-04f, + -2.199403268e-04f, +4.193405584e-04f, -3.831996986e-04f, -3.027704652e-04f, +1.855510616e-03f, -3.840131736e-03f, +4.906380705e-03f, -3.004055559e-03f, -3.957772375e-03f, +1.762857440e-02f, -4.077863748e-02f, -2.191474422e-02f, +5.329763608e-02f, +1.128619274e-03f, -1.084907095e-02f, +1.011202815e-02f, -5.899030074e-03f, +1.726084432e-03f, +7.905880352e-04f, -1.521359334e-03f, +1.168049503e-03f, -5.435847123e-04f, +1.234858063e-04f, +1.519240704e-05f, + +2.639103140e-04f, -7.114217783e-04f, +1.227463238e-03f, -1.359225931e-03f, +5.807375418e-04f, +1.303694875e-03f, -3.817883323e-03f, +5.841843140e-03f, -6.118043611e-03f, +4.000967587e-03f, +2.144504233e-05f, -4.427181083e-03f, +7.393538277e-03f, -7.749978225e-03f, +5.570939039e-03f, -2.056233880e-03f, -1.191860302e-03f, +3.016993660e-03f, -3.177030991e-03f, +2.229271926e-03f, -1.019810357e-03f, +1.666388914e-04f, +1.631210799e-04f, -1.441891318e-04f, + /* 14, 4 (24) */ + +4.174242894e-04f, +9.453474131e-04f, -4.697467831e-03f, +9.713873664e-03f, -1.171724540e-02f, +4.425278052e-03f, +1.656072795e-02f, -4.868977645e-02f, +7.897534193e-02f, -8.267851789e-02f, +9.098635588e-03f, +7.399769753e-01f, +4.023825658e-01f, -1.608174436e-01f, +5.257930441e-02f, +7.230051025e-03f, -3.069031518e-02f, +2.940608810e-02f, -1.708029030e-02f, +4.856574789e-03f, +1.904691112e-03f, -3.281198057e-03f, +2.004770570e-03f, -5.925356253e-04f, + -1.699398035e-03f, +1.739708389e-03f, +1.269128995e-03f, -8.177952236e-03f, +1.691085242e-02f, -2.233108163e-02f, +1.865163885e-02f, -3.409347315e-03f, -1.960542797e-02f, +4.096303225e-02f, -5.011825475e-02f, +4.140561758e-02f, -1.769803015e-02f, -1.081384919e-02f, +3.211197387e-02f, -3.868973605e-02f, +3.086773213e-02f, -1.538888993e-02f, +7.338033779e-04f, +7.551146419e-03f, -8.782822398e-03f, +5.850959145e-03f, -2.352703426e-03f, +3.561273839e-04f, + -2.063215934e-04f, +3.590447885e-04f, -2.391125561e-04f, -5.223964905e-04f, +2.038559404e-03f, -3.752824417e-03f, +4.270459943e-03f, -1.689860357e-03f, -5.639772262e-03f, +1.846815019e-02f, -3.690087026e-02f, -2.761056983e-02f, +5.243909801e-02f, +5.322044051e-03f, -1.282455890e-02f, +1.045667966e-02f, -5.420417328e-03f, +1.068532108e-03f, +1.271769104e-03f, -1.740829624e-03f, +1.200109457e-03f, -4.999409963e-04f, +7.858648557e-05f, +3.836696312e-05f, + +2.843338474e-04f, -7.028995985e-04f, +1.119271557e-03f, -1.079817832e-03f, +1.210024769e-04f, +1.834675153e-03f, -4.194580265e-03f, +5.806538111e-03f, -5.518597552e-03f, +2.905665496e-03f, +1.310758344e-03f, -5.489339666e-03f, +7.877199504e-03f, -7.534579195e-03f, +4.809909646e-03f, -1.083275426e-03f, -2.032417264e-03f, +3.517270216e-03f, -3.317589185e-03f, +2.129245120e-03f, -8.366734445e-04f, +1.248540587e-05f, +2.502874884e-04f, -1.794099129e-04f, + /* 14, 5 (24) */ + +2.111026960e-04f, +1.304392202e-03f, -4.936580387e-03f, +9.191477174e-03f, -9.678686000e-03f, +6.724536350e-04f, +2.083118789e-02f, -5.037963680e-02f, +7.333556967e-02f, -6.421036770e-02f, -2.780223467e-02f, +7.123664055e-01f, +4.548216638e-01f, -1.554953995e-01f, +3.975474551e-02f, +1.768673068e-02f, -3.611073250e-02f, +3.047462021e-02f, -1.580852120e-02f, +3.115745165e-03f, +3.104800569e-03f, -3.781139053e-03f, +2.083357055e-03f, -5.541686622e-04f, + -1.415064188e-03f, +1.036808791e-03f, +2.388400552e-03f, -9.257770068e-03f, +1.703185490e-02f, -2.049640647e-02f, +1.445705859e-02f, +2.397190796e-03f, -2.512402553e-02f, +4.386869774e-02f, -4.880749640e-02f, +3.591627792e-02f, -9.820830647e-03f, -1.834842838e-02f, +3.692188351e-02f, -3.977301147e-02f, +2.883531487e-02f, -1.187161971e-02f, -2.583785807e-03f, +9.680391539e-03f, -9.619495843e-03f, +5.863444550e-03f, -2.102415937e-03f, +1.767174710e-04f, + -1.881063229e-04f, +2.942415176e-04f, -9.900943164e-05f, -7.155806731e-04f, +2.161347921e-03f, -3.578319218e-03f, +3.561819960e-03f, -3.983865162e-04f, -7.102281534e-03f, +1.883819573e-02f, -3.270213392e-02f, -3.289645832e-02f, +5.085849094e-02f, +9.744198089e-03f, -1.460476992e-02f, +1.055838807e-02f, -4.780976087e-03f, +3.499684045e-04f, +1.746451132e-03f, -1.927817022e-03f, +1.202043232e-03f, -4.387216515e-04f, +2.674218979e-05f, +6.337976002e-05f, + +2.939567081e-04f, -6.752806722e-04f, +9.872889198e-04f, -7.854012498e-04f, -3.234111461e-04f, +2.300178650e-03f, -4.451958631e-03f, +5.620988892e-03f, -4.785190304e-03f, +1.746665795e-03f, +2.558198391e-03f, -6.406988049e-03f, +8.156619703e-03f, -7.119855075e-03f, +3.912250990e-03f, -6.379111213e-05f, -2.838994060e-03f, +3.938165215e-03f, -3.373241701e-03f, +1.965853133e-03f, -6.195565658e-04f, -1.529512225e-04f, +3.376273295e-04f, -2.124853822e-04f, + /* 14, 6 (24) */ + +2.299637308e-05f, +1.598633719e-03f, -5.035589819e-03f, +8.475896501e-03f, -7.517338080e-03f, -2.905865583e-03f, +2.439300785e-02f, -5.077802332e-02f, +6.623328813e-02f, -4.537217197e-02f, -6.050436860e-02f, +6.794699472e-01f, +5.056801548e-01f, -1.457512014e-01f, +2.514997559e-02f, +2.824511876e-02f, -4.089170859e-02f, +3.082458861e-02f, -1.406207007e-02f, +1.187928143e-03f, +4.306843801e-03f, -4.219860705e-03f, +2.110099245e-03f, -4.907889022e-04f, + -1.121107480e-03f, +3.615281186e-04f, +3.375689472e-03f, -1.004317132e-02f, +1.670844375e-02f, -1.819622782e-02f, +1.000509996e-02f, +8.018179688e-03f, -2.990921583e-02f, +4.561536354e-02f, -4.624929801e-02f, +2.950928987e-02f, -1.664210943e-03f, -2.546828346e-02f, +4.083413450e-02f, -3.983680258e-02f, +2.599632081e-02f, -7.933454500e-03f, -5.957027508e-03f, +1.164624467e-02f, -1.023905241e-02f, +5.710493328e-03f, -1.764788608e-03f, -3.576791121e-05f, + -1.663004619e-04f, +2.270758033e-04f, +3.371534696e-05f, -8.789930218e-04f, +2.224059472e-03f, -3.325251180e-03f, +2.801098213e-03f, +8.406867828e-04f, -8.322595745e-03f, +1.875861989e-02f, -2.826285741e-02f, -3.769674486e-02f, +4.856565455e-02f, +1.432593212e-02f, -1.613657197e-02f, +1.040222318e-02f, -3.988867217e-03f, -4.142819333e-04f, +2.201911573e-03f, -2.075420816e-03f, +1.171780626e-03f, -3.603093442e-04f, -3.109446220e-05f, +8.953355461e-05f, + +2.934599765e-04f, -6.307516765e-04f, +8.365804647e-04f, -4.846945877e-04f, -7.412100054e-04f, +2.689984773e-03f, -4.586383843e-03f, +5.293229868e-03f, -3.939225526e-03f, +5.551395866e-04f, +3.731191371e-03f, -7.156146625e-03f, +8.223760593e-03f, -6.515221178e-03f, +2.900119811e-03f, +9.757447888e-04f, -3.589023653e-03f, +4.265858037e-03f, -3.339350534e-03f, +1.740859169e-03f, -3.728699214e-04f, -3.254523762e-04f, +4.223156568e-04f, -2.419088112e-04f, + /* 14, 7 (24) */ + -1.433040888e-04f, +1.825709523e-03f, -5.001874472e-03f, +7.596903479e-03f, -5.293278608e-03f, -6.231116763e-03f, +2.719410607e-02f, -4.993733654e-02f, +5.791069239e-02f, -2.661355209e-02f, -8.876722601e-02f, +6.417732023e-01f, +5.542458093e-01f, -1.314252693e-01f, +9.013403621e-03f, +3.864734193e-02f, -4.488057581e-02f, +3.041030668e-02f, -1.186015849e-02f, -8.874926734e-04f, +5.478624427e-03f, -4.580170049e-03f, +2.079004783e-03f, -4.012553476e-04f, + -8.276475031e-04f, -2.692235579e-04f, +4.212269937e-03f, -1.052786591e-02f, +1.596723375e-02f, -1.550624305e-02f, +5.418716112e-03f, +1.331140956e-02f, -3.384844136e-02f, +4.617050312e-02f, -4.251810664e-02f, +2.235314324e-02f, +6.559549650e-03f, -3.198350464e-02f, +4.373425431e-02f, -3.886105779e-02f, +2.240729715e-02f, -3.667596463e-03f, -9.296378042e-03f, +1.338710384e-02f, -1.061192233e-02f, +5.385040952e-03f, -1.342472951e-03f, -2.776767224e-04f, + -1.419324060e-04f, +1.595955440e-04f, +1.560892182e-04f, -1.010267922e-03f, +2.228384839e-03f, -3.003779716e-03f, +2.009237805e-03f, +2.000287046e-03f, -9.284584834e-03f, +1.825737275e-02f, -2.366543217e-02f, -4.194453342e-02f, +4.558285961e-02f, +1.899261112e-02f, -1.736958296e-02f, +9.978765621e-03f, -3.056473684e-03f, -1.206962806e-03f, +2.625262015e-03f, -2.177401096e-03f, +1.108011130e-03f, -2.656152047e-04f, -9.369971631e-05f, +1.160188528e-04f, + +2.838025508e-04f, -5.718561002e-04f, +6.724581781e-04f, -1.861802865e-04f, -1.122267980e-03f, +2.996244631e-03f, -4.597610676e-03f, +4.834922423e-03f, -3.004767072e-03f, -6.372154555e-04f, +4.799345772e-03f, -7.717363403e-03f, +8.076230191e-03f, -5.735256233e-03f, +1.799033355e-03f, +2.007849367e-03f, -4.260965174e-03f, +4.488701900e-03f, -3.213620378e-03f, +1.457861926e-03f, -1.021238617e-04f, -5.003128371e-04f, +5.013932930e-04f, -2.661682299e-04f, + /* 14, 8 (24) */ + -2.852364948e-04f, +1.985305067e-03f, -4.845785254e-03f, +6.586635557e-03f, -3.064893769e-03f, -9.234896479e-03f, +2.920334387e-02f, -4.793704949e-02f, +4.862610755e-02f, -8.356179335e-03f, -1.124326582e-01f, +5.998286689e-01f, +5.998286689e-01f, -1.124326582e-01f, -8.356179335e-03f, +4.862610755e-02f, -4.793704949e-02f, +2.920334387e-02f, -9.234896479e-03f, -3.064893769e-03f, +6.586635557e-03f, -4.845785254e-03f, +1.985305067e-03f, -2.852364948e-04f, + -5.438449523e-04f, -8.410796581e-04f, +4.884728115e-03f, -1.071404619e-02f, +1.484496577e-02f, -1.250999842e-02f, +8.211054363e-04f, +1.814633198e-02f, -3.685320843e-02f, +4.553328767e-02f, -3.771876087e-02f, +1.463577984e-02f, +1.463577984e-02f, -3.771876087e-02f, +4.553328767e-02f, -3.685320843e-02f, +1.814633198e-02f, +8.211054363e-04f, -1.250999842e-02f, +1.484496577e-02f, -1.071404619e-02f, +4.884728115e-03f, -8.410796581e-04f, -5.438449523e-04f, + -1.160188528e-04f, +9.369971631e-05f, +2.656152047e-04f, -1.108011130e-03f, +2.177401096e-03f, -2.625262015e-03f, +1.206962806e-03f, +3.056473684e-03f, -9.978765621e-03f, +1.736958296e-02f, -1.899261112e-02f, -4.558285961e-02f, +4.194453342e-02f, +2.366543217e-02f, -1.825737275e-02f, +9.284584834e-03f, -2.000287046e-03f, -2.009237805e-03f, +3.003779716e-03f, -2.228384839e-03f, +1.010267922e-03f, -1.560892182e-04f, -1.595955440e-04f, +1.419324060e-04f, + +2.661682299e-04f, -5.013932930e-04f, +5.003128371e-04f, +1.021238617e-04f, -1.457861926e-03f, +3.213620378e-03f, -4.488701900e-03f, +4.260965174e-03f, -2.007849367e-03f, -1.799033355e-03f, +5.735256233e-03f, -8.076230191e-03f, +7.717363403e-03f, -4.799345772e-03f, +6.372154555e-04f, +3.004767072e-03f, -4.834922423e-03f, +4.597610676e-03f, -2.996244631e-03f, +1.122267980e-03f, +1.861802865e-04f, -6.724581781e-04f, +5.718561002e-04f, -2.838025508e-04f, + /* 14, 9 (24) */ + -4.012553476e-04f, +2.079004783e-03f, -4.580170049e-03f, +5.478624427e-03f, -8.874926734e-04f, -1.186015849e-02f, +3.041030668e-02f, -4.488057581e-02f, +3.864734193e-02f, +9.013403621e-03f, -1.314252693e-01f, +5.542458093e-01f, +6.417732023e-01f, -8.876722601e-02f, -2.661355209e-02f, +5.791069239e-02f, -4.993733654e-02f, +2.719410607e-02f, -6.231116763e-03f, -5.293278608e-03f, +7.596903479e-03f, -5.001874472e-03f, +1.825709523e-03f, -1.433040888e-04f, + -2.776767224e-04f, -1.342472951e-03f, +5.385040952e-03f, -1.061192233e-02f, +1.338710384e-02f, -9.296378042e-03f, -3.667596463e-03f, +2.240729715e-02f, -3.886105779e-02f, +4.373425431e-02f, -3.198350464e-02f, +6.559549650e-03f, +2.235314324e-02f, -4.251810664e-02f, +4.617050312e-02f, -3.384844136e-02f, +1.331140956e-02f, +5.418716112e-03f, -1.550624305e-02f, +1.596723375e-02f, -1.052786591e-02f, +4.212269937e-03f, -2.692235579e-04f, -8.276475031e-04f, + -8.953355461e-05f, +3.109446220e-05f, +3.603093442e-04f, -1.171780626e-03f, +2.075420816e-03f, -2.201911573e-03f, +4.142819333e-04f, +3.988867217e-03f, -1.040222318e-02f, +1.613657197e-02f, -1.432593212e-02f, -4.856565455e-02f, +3.769674486e-02f, +2.826285741e-02f, -1.875861989e-02f, +8.322595745e-03f, -8.406867828e-04f, -2.801098213e-03f, +3.325251180e-03f, -2.224059472e-03f, +8.789930218e-04f, -3.371534696e-05f, -2.270758033e-04f, +1.663004619e-04f, + +2.419088112e-04f, -4.223156568e-04f, +3.254523762e-04f, +3.728699214e-04f, -1.740859169e-03f, +3.339350534e-03f, -4.265858037e-03f, +3.589023653e-03f, -9.757447888e-04f, -2.900119811e-03f, +6.515221178e-03f, -8.223760593e-03f, +7.156146625e-03f, -3.731191371e-03f, -5.551395866e-04f, +3.939225526e-03f, -5.293229868e-03f, +4.586383843e-03f, -2.689984773e-03f, +7.412100054e-04f, +4.846945877e-04f, -8.365804647e-04f, +6.307516765e-04f, -2.934599765e-04f, + /* 14,10 (24) */ + -4.907889022e-04f, +2.110099245e-03f, -4.219860705e-03f, +4.306843801e-03f, +1.187928143e-03f, -1.406207007e-02f, +3.082458861e-02f, -4.089170859e-02f, +2.824511876e-02f, +2.514997559e-02f, -1.457512014e-01f, +5.056801548e-01f, +6.794699472e-01f, -6.050436860e-02f, -4.537217197e-02f, +6.623328813e-02f, -5.077802332e-02f, +2.439300785e-02f, -2.905865583e-03f, -7.517338080e-03f, +8.475896501e-03f, -5.035589819e-03f, +1.598633719e-03f, +2.299637308e-05f, + -3.576791121e-05f, -1.764788608e-03f, +5.710493328e-03f, -1.023905241e-02f, +1.164624467e-02f, -5.957027508e-03f, -7.933454500e-03f, +2.599632081e-02f, -3.983680258e-02f, +4.083413450e-02f, -2.546828346e-02f, -1.664210943e-03f, +2.950928987e-02f, -4.624929801e-02f, +4.561536354e-02f, -2.990921583e-02f, +8.018179688e-03f, +1.000509996e-02f, -1.819622782e-02f, +1.670844375e-02f, -1.004317132e-02f, +3.375689472e-03f, +3.615281186e-04f, -1.121107480e-03f, + -6.337976002e-05f, -2.674218979e-05f, +4.387216515e-04f, -1.202043232e-03f, +1.927817022e-03f, -1.746451132e-03f, -3.499684045e-04f, +4.780976087e-03f, -1.055838807e-02f, +1.460476992e-02f, -9.744198089e-03f, -5.085849094e-02f, +3.289645832e-02f, +3.270213392e-02f, -1.883819573e-02f, +7.102281534e-03f, +3.983865162e-04f, -3.561819960e-03f, +3.578319218e-03f, -2.161347921e-03f, +7.155806731e-04f, +9.900943164e-05f, -2.942415176e-04f, +1.881063229e-04f, + +2.124853822e-04f, -3.376273295e-04f, +1.529512225e-04f, +6.195565658e-04f, -1.965853133e-03f, +3.373241701e-03f, -3.938165215e-03f, +2.838994060e-03f, +6.379111213e-05f, -3.912250990e-03f, +7.119855075e-03f, -8.156619703e-03f, +6.406988049e-03f, -2.558198391e-03f, -1.746665795e-03f, +4.785190304e-03f, -5.620988892e-03f, +4.451958631e-03f, -2.300178650e-03f, +3.234111461e-04f, +7.854012498e-04f, -9.872889198e-04f, +6.752806722e-04f, -2.939567081e-04f, + /* 14,11 (24) */ + -5.541686622e-04f, +2.083357055e-03f, -3.781139053e-03f, +3.104800569e-03f, +3.115745165e-03f, -1.580852120e-02f, +3.047462021e-02f, -3.611073250e-02f, +1.768673068e-02f, +3.975474551e-02f, -1.554953995e-01f, +4.548216638e-01f, +7.123664055e-01f, -2.780223467e-02f, -6.421036770e-02f, +7.333556967e-02f, -5.037963680e-02f, +2.083118789e-02f, +6.724536350e-04f, -9.678686000e-03f, +9.191477174e-03f, -4.936580387e-03f, +1.304392202e-03f, +2.111026960e-04f, + +1.767174710e-04f, -2.102415937e-03f, +5.863444550e-03f, -9.619495843e-03f, +9.680391539e-03f, -2.583785807e-03f, -1.187161971e-02f, +2.883531487e-02f, -3.977301147e-02f, +3.692188351e-02f, -1.834842838e-02f, -9.820830647e-03f, +3.591627792e-02f, -4.880749640e-02f, +4.386869774e-02f, -2.512402553e-02f, +2.397190796e-03f, +1.445705859e-02f, -2.049640647e-02f, +1.703185490e-02f, -9.257770068e-03f, +2.388400552e-03f, +1.036808791e-03f, -1.415064188e-03f, + -3.836696312e-05f, -7.858648557e-05f, +4.999409963e-04f, -1.200109457e-03f, +1.740829624e-03f, -1.271769104e-03f, -1.068532108e-03f, +5.420417328e-03f, -1.045667966e-02f, +1.282455890e-02f, -5.322044051e-03f, -5.243909801e-02f, +2.761056983e-02f, +3.690087026e-02f, -1.846815019e-02f, +5.639772262e-03f, +1.689860357e-03f, -4.270459943e-03f, +3.752824417e-03f, -2.038559404e-03f, +5.223964905e-04f, +2.391125561e-04f, -3.590447885e-04f, +2.063215934e-04f, + +1.794099129e-04f, -2.502874884e-04f, -1.248540587e-05f, +8.366734445e-04f, -2.129245120e-03f, +3.317589185e-03f, -3.517270216e-03f, +2.032417264e-03f, +1.083275426e-03f, -4.809909646e-03f, +7.534579195e-03f, -7.877199504e-03f, +5.489339666e-03f, -1.310758344e-03f, -2.905665496e-03f, +5.518597552e-03f, -5.806538111e-03f, +4.194580265e-03f, -1.834675153e-03f, -1.210024769e-04f, +1.079817832e-03f, -1.119271557e-03f, +7.028995985e-04f, -2.843338474e-04f, + /* 14,12 (24) */ + -5.925356253e-04f, +2.004770570e-03f, -3.281198057e-03f, +1.904691112e-03f, +4.856574789e-03f, -1.708029030e-02f, +2.940608810e-02f, -3.069031518e-02f, +7.230051025e-03f, +5.257930441e-02f, -1.608174436e-01f, +4.023825658e-01f, +7.399769753e-01f, +9.098635588e-03f, -8.267851789e-02f, +7.897534193e-02f, -4.868977645e-02f, +1.656072795e-02f, +4.425278052e-03f, -1.171724540e-02f, +9.713873664e-03f, -4.697467831e-03f, +9.453474131e-04f, +4.174242894e-04f, + +3.561273839e-04f, -2.352703426e-03f, +5.850959145e-03f, -8.782822398e-03f, +7.551146419e-03f, +7.338033779e-04f, -1.538888993e-02f, +3.086773213e-02f, -3.868973605e-02f, +3.211197387e-02f, -1.081384919e-02f, -1.769803015e-02f, +4.140561758e-02f, -5.011825475e-02f, +4.096303225e-02f, -1.960542797e-02f, -3.409347315e-03f, +1.865163885e-02f, -2.233108163e-02f, +1.691085242e-02f, -8.177952236e-03f, +1.269128995e-03f, +1.739708389e-03f, -1.699398035e-03f, + -1.519240704e-05f, -1.234858063e-04f, +5.435847123e-04f, -1.168049503e-03f, +1.521359334e-03f, -7.905880352e-04f, -1.726084432e-03f, +5.899030074e-03f, -1.011202815e-02f, +1.084907095e-02f, -1.128619274e-03f, -5.329763608e-02f, +2.191474422e-02f, +4.077863748e-02f, -1.762857440e-02f, +3.957772375e-03f, +3.004055559e-03f, -4.906380705e-03f, +3.840131736e-03f, -1.855510616e-03f, +3.027704652e-04f, +3.831996986e-04f, -4.193405584e-04f, +2.199403268e-04f, + +1.441891318e-04f, -1.631210799e-04f, -1.666388914e-04f, +1.019810357e-03f, -2.229271926e-03f, +3.177030991e-03f, -3.016993660e-03f, +1.191860302e-03f, +2.056233880e-03f, -5.570939039e-03f, +7.749978225e-03f, -7.393538277e-03f, +4.427181083e-03f, -2.144504233e-05f, -4.000967587e-03f, +6.118043611e-03f, -5.841843140e-03f, +3.817883323e-03f, -1.303694875e-03f, -5.807375418e-04f, +1.359225931e-03f, -1.227463238e-03f, +7.114217783e-04f, -2.639103140e-04f, + /* 14,13 (24) */ + -6.077280324e-04f, +1.881284763e-03f, -2.737613345e-03f, +7.366416088e-04f, +6.377934123e-03f, -1.787087834e-02f, +2.768000367e-02f, -2.479128510e-02f, -2.881977125e-03f, +6.342837536e-02f, -1.619460628e-01f, +3.490849297e-01f, +7.618917196e-01f, +4.987727307e-02f, -1.003070923e-01f, +8.293311430e-02f, -4.568572089e-02f, +1.165434724e-02f, +8.265409788e-03f, -1.357275602e-02f, +1.001664413e-02f, -4.314268133e-03f, +5.260068547e-04f, +6.373646162e-04f, + +5.003165157e-04f, -2.515824506e-03f, +5.684320253e-03f, -7.763012041e-03f, +5.321874493e-03f, +3.910834368e-03f, -1.840588359e-02f, +3.205959243e-02f, -3.663350216e-02f, +2.654103483e-02f, -3.063870962e-03f, -2.509156843e-02f, +4.583279867e-02f, -5.013969979e-02f, +3.696206466e-02f, -1.348738436e-02f, -9.251190455e-03f, +2.246952217e-02f, -2.363477650e-02f, +1.633011488e-02f, -6.818726304e-03f, +4.166575678e-05f, +2.451130168e-03f, -1.963308349e-03f, + +5.572393499e-06f, -1.607663332e-04f, +5.697741405e-04f, -1.108593712e-03f, +1.276755037e-03f, -3.151529850e-04f, -2.309519827e-03f, +6.212883448e-03f, -9.544290844e-03f, +8.732967871e-03f, +2.773590470e-03f, -5.343672742e-02f, +1.589207580e-02f, +4.425856157e-02f, -1.630831799e-02f, +2.085333382e-03f, +4.309298463e-03f, -5.449791260e-03f, +3.833432868e-03f, -1.613612465e-03f, +6.096256087e-05f, +5.275243952e-04f, -4.729451409e-04f, +2.280151365e-04f, + +1.082724704e-04f, -7.873939740e-05f, -3.058736760e-04f, +1.165729588e-03f, -2.265980518e-03f, +2.958341386e-03f, -2.452893712e-03f, +3.402831812e-04f, +2.957897070e-03f, -6.177097633e-03f, +7.762013897e-03f, -6.719086665e-03f, +3.248379155e-03f, +1.275853774e-03f, -5.002780468e-03f, +6.565411707e-03f, -5.722793198e-03f, +3.328879636e-03f, -7.196184886e-04f, -1.043612417e-03f, +1.614917439e-03f, -1.307215183e-03f, +6.991129623e-04f, -2.323296147e-04f, + /* 14,14 (24) */ + -6.021556389e-04f, +1.720518430e-03f, -2.167839204e-03f, -3.719521032e-04f, +7.654689160e-03f, -1.818603132e-02f, +2.537048384e-02f, -1.857840165e-02f, -1.242626797e-02f, +7.216134324e-02f, -1.591724724e-01f, +2.956482023e-01f, +7.777837954e-01f, +9.413583464e-02f, -1.166154103e-01f, +8.501844769e-02f, -4.137642242e-02f, +6.204555983e-03f, +1.209884266e-02f, -1.518636848e-02f, +1.007760669e-02f, -3.786743738e-03f, +5.306171384e-05f, +8.653797527e-04f, + +6.085889861e-04f, -2.594563903e-03f, +5.378446577e-03f, -6.597282453e-03f, +3.055893975e-03f, +6.869175755e-03f, -2.085877730e-02f, +3.239987561e-02f, -3.367560509e-02f, +2.036393719e-02f, +4.698142935e-03f, -3.181065509e-02f, +4.908117782e-02f, -4.886384601e-02f, +3.195928419e-02f, -6.921972656e-03f, -1.497398365e-02f, +2.579840181e-02f, -2.435439499e-02f, +1.528650246e-02f, -5.203808866e-03f, -1.265549426e-03f, +3.150243130e-03f, -2.195637964e-03f, + +2.349002182e-05f, -1.900318896e-04f, +5.790976380e-04f, -1.025020997e-03f, +1.014600524e-03f, +1.430531405e-04f, -2.808172144e-03f, +6.362182872e-03f, -8.777579547e-03f, +6.531229974e-03f, +6.329778800e-03f, -5.287124448e-02f, +9.631599269e-03f, +4.726887393e-02f, -1.450554143e-02f, +5.747152836e-05f, +5.572608642e-03f, -5.882290961e-03f, +3.728015257e-03f, -1.315918267e-03f, -1.978996535e-04f, +6.680724132e-04f, -5.177001582e-04f, +2.296942030e-04f, + +7.300562037e-05f, +5.275240448e-07f, -4.272109316e-04f, +1.272400915e-03f, -2.241152524e-03f, +2.670171812e-03f, -1.841793810e-03f, -4.995911740e-04f, +3.765838378e-03f, -6.614500504e-03f, +7.572090831e-03f, -5.872327283e-03f, +1.983940869e-03f, +2.546845728e-03f, -5.883515895e-03f, +6.846417259e-03f, -5.449394323e-03f, +2.737850722e-03f, -9.670671648e-05f, -1.496872527e-03f, +1.838451667e-03f, -1.354460665e-03f, +6.647781197e-04f, -1.895983879e-04f, + /* 14,15 (24) */ + -5.786656170e-04f, +1.530486541e-03f, -1.588741566e-03f, -1.396973100e-03f, +8.669289684e-03f, -1.804297818e-02f, +2.256231169e-02f, -1.221621878e-02f, -2.120384752e-02f, +7.869257321e-02f, -1.528426936e-01f, +2.427769578e-01f, +7.874153946e-01f, +1.414047086e-01f, -1.311209517e-01f, +8.507591921e-02f, -3.580381378e-02f, +3.222650227e-04f, +1.582685791e-02f, -1.650228675e-02f, +9.879707037e-03f, -3.118671324e-03f, -4.646384443e-04f, +1.095073956e-03f, + +6.815946065e-04f, -2.594036379e-03f, +4.951235646e-03f, -5.324881538e-03f, +8.147414509e-04f, +9.539347567e-03f, -2.270057111e-02f, +3.190028444e-02f, -2.990976672e-02f, +1.374943669e-02f, +1.227023377e-02f, -3.768298238e-02f, +5.106511869e-02f, -4.631700029e-02f, +2.607576830e-02f, -7.555539715e-05f, -2.042337798e-02f, +2.853625253e-02f, -2.445110171e-02f, +1.378962994e-02f, -3.365357199e-03f, -2.620010092e-03f, +3.815021250e-03f, -2.385236352e-03f, + +3.826050238e-05f, -2.111545745e-04f, +5.725628529e-04f, -9.210389417e-04f, +7.425062231e-04f, +5.735612965e-04f, -3.213964647e-03f, +6.351081144e-03f, -7.839517914e-03f, +4.297979908e-03f, +9.493654979e-03f, -5.162786239e-02f, +3.226680462e-03f, +4.974438686e-02f, -1.222808687e-02f, -2.085366097e-03f, +6.760448353e-03f, -6.187402659e-03f, +3.521489134e-03f, -9.671301358e-04f, -4.679111297e-04f, +8.006592829e-04f, -5.515402691e-04f, +2.242580105e-04f, + +3.959096234e-05f, +7.268521485e-05f, -5.283783837e-04f, +1.338999949e-03f, -2.158182611e-03f, +2.322748136e-03f, -1.201288539e-03f, -1.305886445e-03f, +4.460536991e-03f, -6.873936703e-03f, +7.186973906e-03f, -4.876258793e-03f, +6.671799512e-04f, +3.757759117e-03f, -6.618560623e-03f, +6.951055384e-03f, -5.025851749e-03f, +2.058145461e-03f, +5.492420567e-04f, -1.927534233e-03f, +2.021916039e-03f, -1.365871498e-03f, +6.078360122e-04f, -1.361148124e-04f, + /* 15, 0 (24) */ + -1.202019198e-03f, +3.406678548e-03f, -6.303893631e-03f, +8.068354747e-03f, -5.607321184e-03f, -4.553512604e-03f, +2.472926036e-02f, -5.449259515e-02f, +8.986605310e-02f, -1.238918309e-01f, +1.485898543e-01f, +8.423743737e-01f, +1.485898543e-01f, -1.238918309e-01f, +8.986605310e-02f, -5.449259515e-02f, +2.472926036e-02f, -4.553512604e-03f, -5.607321184e-03f, +8.068354747e-03f, -6.303893631e-03f, +3.406678548e-03f, -1.202019198e-03f, +1.807804541e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -8.814319808e-05f, -5.629574316e-05f, +5.652122150e-04f, -1.554004909e-03f, +2.894664369e-03f, -4.070731190e-03f, +4.129257199e-03f, -1.734596604e-03f, -4.865689287e-03f, +1.884664750e-02f, -5.350214598e-02f, -3.893860413e-03f, +5.650412118e-02f, -1.668062888e-02f, +2.575956794e-03f, +3.378980922e-03f, -5.045194700e-03f, +4.415253187e-03f, -2.896309433e-03f, +1.415676388e-03f, -4.179610069e-04f, -4.418446917e-05f, +1.384693596e-04f, -7.785146472e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 1 (24) */ + -1.290162396e-03f, +3.350382805e-03f, -5.738681416e-03f, +6.514349838e-03f, -2.712656815e-03f, -8.624243794e-03f, +2.885851756e-02f, -5.622719176e-02f, +8.500036382e-02f, -1.050451834e-01f, +9.508770829e-02f, +8.384805133e-01f, +2.050939754e-01f, -1.405724598e-01f, +9.244200990e-02f, -5.111361423e-02f, +1.968406566e-02f, -1.382594172e-04f, -8.503630616e-03f, +9.484031135e-03f, -6.721854638e-03f, +3.362494079e-03f, -1.063549838e-03f, +1.029289894e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.009581509e-05f, -1.470779616e-04f, +6.863882519e-04f, -1.640552014e-03f, +2.812790794e-03f, -3.631308541e-03f, +3.144440238e-03f, -1.232143192e-04f, -6.903888787e-03f, +2.038905732e-02f, -4.981571966e-02f, -1.161554014e-02f, +5.874357177e-02f, -1.390186963e-02f, +8.327052965e-05f, +5.011741168e-03f, -5.862591698e-03f, +4.649965954e-03f, -2.813224953e-03f, +1.226552000e-03f, -2.473799188e-04f, -1.518867064e-04f, +1.895043655e-04f, -9.649564219e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 2 (24) */ + -1.330258211e-03f, +3.203304844e-03f, -5.052293164e-03f, +4.873797825e-03f, +1.001339790e-04f, -1.225555233e-02f, +3.200295779e-02f, -5.635040608e-02f, +7.809647503e-02f, -8.465612610e-02f, +4.527198863e-02f, +8.268649732e-01f, +2.638375472e-01f, -1.544743294e-01f, +9.252528043e-02f, -4.610187306e-02f, +1.382147396e-02f, +4.511706537e-03f, -1.131685557e-02f, +1.071058314e-02f, -6.969234557e-03f, +3.210607373e-03f, -8.740454728e-04f, +6.433347233e-06f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.314478209e-06f, -2.261678214e-04f, +7.796907880e-04f, -1.675879999e-03f, +2.657224881e-03f, -3.113814380e-03f, +2.120911624e-03f, +1.413494736e-03f, -8.650745090e-03f, +2.131109846e-02f, -4.553441535e-02f, -1.914045496e-02f, +6.015581409e-02f, -1.053560437e-02f, -2.555870238e-03f, +6.586393774e-03f, -6.553166629e-03f, +4.762413539e-03f, -2.643188401e-03f, +9.892254810e-04f, -5.713587572e-05f, -2.639004645e-04f, +2.395057305e-04f, -1.138448639e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 3 (24) */ + -1.325943733e-03f, +2.977137022e-03f, -4.272602376e-03f, +3.197917825e-03f, +2.757358860e-03f, -1.536936671e-02f, +3.412386942e-02f, -5.493691134e-02f, +6.944572994e-02f, -6.334502763e-02f, -2.624267216e-04f, +8.077245182e-01f, +3.239933613e-01f, -1.650099338e-01f, +8.996941019e-02f, -3.951547929e-02f, +7.268307330e-03f, +9.274120075e-03f, -1.396004397e-02f, +1.169980862e-02f, -7.026370432e-03f, +2.946706908e-03f, -6.345397422e-04f, -1.074115167e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.396998716e-05f, -2.920812198e-04f, +8.442635397e-04f, -1.661996396e-03f, +2.436248157e-03f, -2.536436861e-03f, +1.088497382e-03f, +2.837787581e-03f, -1.007581599e-02f, +2.162954199e-02f, -4.075719244e-02f, -2.634192530e-02f, +6.069117436e-02f, -6.621358951e-03f, -5.278131914e-03f, +8.055794269e-03f, -7.090890376e-03f, +4.743078092e-03f, -2.386442955e-03f, +7.079125913e-04f, +1.482391463e-04f, -3.769458208e-04f, +2.866068862e-04f, -1.289967247e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 4 (24) */ + -1.281973746e-03f, +2.685055802e-03f, -3.428338836e-03f, +1.535921429e-03f, +5.193607018e-03f, -1.790580358e-02f, +3.521236680e-02f, -5.209912376e-02f, +5.936991395e-02f, -4.171548565e-02f, -4.101961916e-02f, +7.813825929e-01f, +3.846845357e-01f, -1.716312928e-01f, +8.469127828e-02f, -3.145968502e-02f, +1.774169543e-04f, +1.401719817e-02f, -1.634648693e-02f, +1.240772121e-02f, -6.878131286e-03f, +2.569761087e-03f, -3.479328561e-04f, -2.364082414e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +7.801225401e-05f, -3.438548100e-04f, +8.801590009e-04f, -1.602214322e-03f, +2.159561881e-03f, -1.918149264e-03f, +7.587967839e-05f, +4.116677753e-03f, -1.115836981e-02f, +2.137381569e-02f, -3.559011192e-02f, -3.309990950e-02f, +6.031629751e-02f, -2.212535144e-03f, -8.014649254e-03f, +9.373404232e-03f, -7.452834591e-03f, +4.585802324e-03f, -2.045820081e-03f, +3.884154965e-04f, +3.634360127e-04f, -4.874555904e-04f, +3.288739740e-04f, -1.410429498e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 5 (24) */ + -1.203961492e-03f, +2.341200992e-03f, -2.548179835e-03f, -6.629289359e-05f, +7.353168899e-03f, -1.982395284e-02f, +3.528824648e-02f, -4.798244601e-02f, +4.821154414e-02f, -2.034166996e-02f, -7.660973108e-02f, +7.482826834e-01f, +4.450008332e-01f, -1.738438279e-01f, +7.667662902e-02f, -2.208628079e-02f, -7.275417637e-03f, +1.860300049e-02f, -1.839230701e-02f, +1.279613670e-02f, -6.514695273e-03f, +2.082305497e-03f, -1.905888210e-05f, -3.774511912e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.058503852e-04f, -3.810391546e-04f, +8.882794882e-04f, -1.500981923e-03f, +1.837936775e-03f, -1.278140567e-03f, -8.901386714e-04f, +5.222602376e-03f, -1.188747184e-02f, +2.058486152e-02f, -3.014393553e-02f, -3.930344637e-02f, +5.901511065e-02f, +2.624343014e-03f, -1.069251893e-02f, +1.049459696e-02f, -7.619970147e-03f, +4.288133619e-03f, -1.626790569e-03f, +3.803611168e-05f, +5.824866660e-04f, -5.916728740e-04f, +3.643695193e-04f, -1.491056222e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 6 (24) */ + -1.098111107e-03f, +1.960161838e-03f, -1.659900347e-03f, -1.567274816e-03f, +9.191105673e-03f, -2.110209341e-02f, +3.439810781e-02f, -4.275984363e-02f, +3.632407230e-02f, +2.431915639e-04f, -1.067536666e-01f, +7.089792371e-01f, +5.040159438e-01f, -1.712194849e-01f, +6.598411010e-02f, -1.159168383e-02f, -1.489538778e-02f, +2.289113411e-02f, -2.001909758e-02f, +1.283417282e-02f, -5.932208607e-03f, +1.490632623e-03f, +3.453106372e-04f, -5.265568134e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.271595146e-04f, -4.036758732e-04f, +8.702958117e-04f, -1.363687610e-03f, +1.482849467e-03f, -6.352664072e-04f, -1.785285630e-03f, +6.133916651e-03f, -1.226182127e-02f, +1.931375947e-02f, -2.453166604e-02f, -4.485289149e-02f, +5.678941514e-02f, +7.810710943e-03f, -1.323645216e-02f, +1.137796797e-02f, -7.577890870e-03f, +3.851576103e-03f, -1.137438961e-03f, -3.345616471e-04f, +7.989107046e-04f, -6.857617204e-04f, +3.912211946e-04f, -1.523752566e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 7 (24) */ + -9.709515919e-04f, +1.556485965e-03f, -7.896045356e-04f, -2.930962426e-03f, +1.067395514e-02f, -2.173735981e-02f, +3.261282218e-02f, -3.662592698e-02f, +2.406225103e-02f, +1.955695104e-02f, -1.312853327e-01f, +6.641263456e-01f, +5.608053590e-01f, -1.634087739e-01f, +5.274765793e-02f, -2.137158612e-04f, -2.247327865e-02f, +2.674271021e-02f, -2.115653654e-02f, +1.249961117e-02f, -5.133297903e-03f, +8.048709026e-04f, +7.365318318e-04f, -6.789320700e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.418701448e-04f, -4.122605562e-04f, +8.285473963e-04f, -1.196448209e-03f, +1.106116859e-03f, -7.535085183e-06f, -2.588372871e-03f, +6.835209469e-03f, -1.228935191e-02f, +1.762015730e-02f, -1.886608640e-02f, -4.966189682e-02f, +5.365908981e-02f, +1.325735489e-02f, -1.557054960e-02f, +1.198661499e-02f, -7.317438857e-03f, +3.281739094e-03f, -5.883583626e-04f, -7.195391699e-04f, +1.005887268e-03f, -7.659280418e-04f, +4.076935767e-04f, -1.501493771e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 8 (24) */ + -8.290814471e-04f, +1.144225408e-03f, +3.894286075e-05f, -4.127410634e-03f, +1.178007200e-02f, -2.174489490e-02f, +3.002444931e-02f, -2.979071751e-02f, +1.177289913e-02f, +3.717710833e-02f, -1.501514191e-01f, +6.144644488e-01f, +6.144644488e-01f, -1.501514191e-01f, +3.717710833e-02f, +1.177289913e-02f, -2.979071751e-02f, +3.002444931e-02f, -2.174489490e-02f, +1.178007200e-02f, -4.127410634e-03f, +3.894286075e-05f, +1.144225408e-03f, -8.290814471e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.501493771e-04f, -4.076935767e-04f, +7.659280418e-04f, -1.005887268e-03f, +7.195391699e-04f, +5.883583626e-04f, -3.281739094e-03f, +7.317438857e-03f, -1.198661499e-02f, +1.557054960e-02f, -1.325735489e-02f, -5.365908981e-02f, +4.966189682e-02f, +1.886608640e-02f, -1.762015730e-02f, +1.228935191e-02f, -6.835209469e-03f, +2.588372871e-03f, +7.535085183e-06f, -1.106116859e-03f, +1.196448209e-03f, -8.285473963e-04f, +4.122605562e-04f, -1.418701448e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 9 (24) */ + -6.789320700e-04f, +7.365318318e-04f, +8.048709026e-04f, -5.133297903e-03f, +1.249961117e-02f, -2.115653654e-02f, +2.674271021e-02f, -2.247327865e-02f, -2.137158612e-04f, +5.274765793e-02f, -1.634087739e-01f, +5.608053590e-01f, +6.641263456e-01f, -1.312853327e-01f, +1.955695104e-02f, +2.406225103e-02f, -3.662592698e-02f, +3.261282218e-02f, -2.173735981e-02f, +1.067395514e-02f, -2.930962426e-03f, -7.896045356e-04f, +1.556485965e-03f, -9.709515919e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.523752566e-04f, -3.912211946e-04f, +6.857617204e-04f, -7.989107046e-04f, +3.345616471e-04f, +1.137438961e-03f, -3.851576103e-03f, +7.577890870e-03f, -1.137796797e-02f, +1.323645216e-02f, -7.810710943e-03f, -5.678941514e-02f, +4.485289149e-02f, +2.453166604e-02f, -1.931375947e-02f, +1.226182127e-02f, -6.133916651e-03f, +1.785285630e-03f, +6.352664072e-04f, -1.482849467e-03f, +1.363687610e-03f, -8.702958117e-04f, +4.036758732e-04f, -1.271595146e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,10 (24) */ + -5.265568134e-04f, +3.453106372e-04f, +1.490632623e-03f, -5.932208607e-03f, +1.283417282e-02f, -2.001909758e-02f, +2.289113411e-02f, -1.489538778e-02f, -1.159168383e-02f, +6.598411010e-02f, -1.712194849e-01f, +5.040159438e-01f, +7.089792371e-01f, -1.067536666e-01f, +2.431915639e-04f, +3.632407230e-02f, -4.275984363e-02f, +3.439810781e-02f, -2.110209341e-02f, +9.191105673e-03f, -1.567274816e-03f, -1.659900347e-03f, +1.960161838e-03f, -1.098111107e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.491056222e-04f, -3.643695193e-04f, +5.916728740e-04f, -5.824866660e-04f, -3.803611168e-05f, +1.626790569e-03f, -4.288133619e-03f, +7.619970147e-03f, -1.049459696e-02f, +1.069251893e-02f, -2.624343014e-03f, -5.901511065e-02f, +3.930344637e-02f, +3.014393553e-02f, -2.058486152e-02f, +1.188747184e-02f, -5.222602376e-03f, +8.901386714e-04f, +1.278140567e-03f, -1.837936775e-03f, +1.500981923e-03f, -8.882794882e-04f, +3.810391546e-04f, -1.058503852e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,11 (24) */ + -3.774511912e-04f, -1.905888210e-05f, +2.082305497e-03f, -6.514695273e-03f, +1.279613670e-02f, -1.839230701e-02f, +1.860300049e-02f, -7.275417637e-03f, -2.208628079e-02f, +7.667662902e-02f, -1.738438279e-01f, +4.450008332e-01f, +7.482826834e-01f, -7.660973108e-02f, -2.034166996e-02f, +4.821154414e-02f, -4.798244601e-02f, +3.528824648e-02f, -1.982395284e-02f, +7.353168899e-03f, -6.629289359e-05f, -2.548179835e-03f, +2.341200992e-03f, -1.203961492e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.410429498e-04f, -3.288739740e-04f, +4.874555904e-04f, -3.634360127e-04f, -3.884154965e-04f, +2.045820081e-03f, -4.585802324e-03f, +7.452834591e-03f, -9.373404232e-03f, +8.014649254e-03f, +2.212535144e-03f, -6.031629751e-02f, +3.309990950e-02f, +3.559011192e-02f, -2.137381569e-02f, +1.115836981e-02f, -4.116677753e-03f, -7.587967839e-05f, +1.918149264e-03f, -2.159561881e-03f, +1.602214322e-03f, -8.801590009e-04f, +3.438548100e-04f, -7.801225401e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,12 (24) */ + -2.364082414e-04f, -3.479328561e-04f, +2.569761087e-03f, -6.878131286e-03f, +1.240772121e-02f, -1.634648693e-02f, +1.401719817e-02f, +1.774169543e-04f, -3.145968502e-02f, +8.469127828e-02f, -1.716312928e-01f, +3.846845357e-01f, +7.813825929e-01f, -4.101961916e-02f, -4.171548565e-02f, +5.936991395e-02f, -5.209912376e-02f, +3.521236680e-02f, -1.790580358e-02f, +5.193607018e-03f, +1.535921429e-03f, -3.428338836e-03f, +2.685055802e-03f, -1.281973746e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.289967247e-04f, -2.866068862e-04f, +3.769458208e-04f, -1.482391463e-04f, -7.079125913e-04f, +2.386442955e-03f, -4.743078092e-03f, +7.090890376e-03f, -8.055794269e-03f, +5.278131914e-03f, +6.621358951e-03f, -6.069117436e-02f, +2.634192530e-02f, +4.075719244e-02f, -2.162954199e-02f, +1.007581599e-02f, -2.837787581e-03f, -1.088497382e-03f, +2.536436861e-03f, -2.436248157e-03f, +1.661996396e-03f, -8.442635397e-04f, +2.920812198e-04f, -4.396998716e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,13 (24) */ + -1.074115167e-04f, -6.345397422e-04f, +2.946706908e-03f, -7.026370432e-03f, +1.169980862e-02f, -1.396004397e-02f, +9.274120075e-03f, +7.268307330e-03f, -3.951547929e-02f, +8.996941019e-02f, -1.650099338e-01f, +3.239933613e-01f, +8.077245182e-01f, -2.624267216e-04f, -6.334502763e-02f, +6.944572994e-02f, -5.493691134e-02f, +3.412386942e-02f, -1.536936671e-02f, +2.757358860e-03f, +3.197917825e-03f, -4.272602376e-03f, +2.977137022e-03f, -1.325943733e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.138448639e-04f, -2.395057305e-04f, +2.639004645e-04f, +5.713587572e-05f, -9.892254810e-04f, +2.643188401e-03f, -4.762413539e-03f, +6.553166629e-03f, -6.586393774e-03f, +2.555870238e-03f, +1.053560437e-02f, -6.015581409e-02f, +1.914045496e-02f, +4.553441535e-02f, -2.131109846e-02f, +8.650745090e-03f, -1.413494736e-03f, -2.120911624e-03f, +3.113814380e-03f, -2.657224881e-03f, +1.675879999e-03f, -7.796907880e-04f, +2.261678214e-04f, -4.314478209e-06f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,14 (24) */ + +6.433347233e-06f, -8.740454728e-04f, +3.210607373e-03f, -6.969234557e-03f, +1.071058314e-02f, -1.131685557e-02f, +4.511706537e-03f, +1.382147396e-02f, -4.610187306e-02f, +9.252528043e-02f, -1.544743294e-01f, +2.638375472e-01f, +8.268649732e-01f, +4.527198863e-02f, -8.465612610e-02f, +7.809647503e-02f, -5.635040608e-02f, +3.200295779e-02f, -1.225555233e-02f, +1.001339790e-04f, +4.873797825e-03f, -5.052293164e-03f, +3.203304844e-03f, -1.330258211e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +9.649564219e-05f, -1.895043655e-04f, +1.518867064e-04f, +2.473799188e-04f, -1.226552000e-03f, +2.813224953e-03f, -4.649965954e-03f, +5.862591698e-03f, -5.011741168e-03f, -8.327052965e-05f, +1.390186963e-02f, -5.874357177e-02f, +1.161554014e-02f, +4.981571966e-02f, -2.038905732e-02f, +6.903888787e-03f, +1.232143192e-04f, -3.144440238e-03f, +3.631308541e-03f, -2.812790794e-03f, +1.640552014e-03f, -6.863882519e-04f, +1.470779616e-04f, +4.009581509e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,15 (24) */ + +1.029289894e-04f, -1.063549838e-03f, +3.362494079e-03f, -6.721854638e-03f, +9.484031135e-03f, -8.503630616e-03f, -1.382594172e-04f, +1.968406566e-02f, -5.111361423e-02f, +9.244200990e-02f, -1.405724598e-01f, +2.050939754e-01f, +8.384805133e-01f, +9.508770829e-02f, -1.050451834e-01f, +8.500036382e-02f, -5.622719176e-02f, +2.885851756e-02f, -8.624243794e-03f, -2.712656815e-03f, +6.514349838e-03f, -5.738681416e-03f, +3.350382805e-03f, -1.290162396e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +7.785146472e-05f, -1.384693596e-04f, +4.418446917e-05f, +4.179610069e-04f, -1.415676388e-03f, +2.896309433e-03f, -4.415253187e-03f, +5.045194700e-03f, -3.378980922e-03f, -2.575956794e-03f, +1.668062888e-02f, -5.650412118e-02f, +3.893860413e-03f, +5.350214598e-02f, -1.884664750e-02f, +4.865689287e-03f, +1.734596604e-03f, -4.129257199e-03f, +4.070731190e-03f, -2.894664369e-03f, +1.554004909e-03f, -5.652122150e-04f, +5.629574316e-05f, +8.814319808e-05f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + } +}; + +/* This 11th order filter has a rejection of -40dB, yielding a transition width + * of ~0.203 (normalized frequency). Order increases when downsampling to a + * limit of one octave, after which the quality of the filter (transition + * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound + * after downsampling by ~3.30 octaves. + */ +const BSincTable bsinc12 = { + /* scaleBase */ 1.014703785e-01f, /* scaleRange */ 1.112929364e+00f, + /* m */ { 24, 24, 24, 24, 24, 24, 24, 24, 20, 20, 16, 16, 16, 12, 12, 12 }, + /* filterOffset */ { 0, 1536, 3072, 4608, 6144, 7680, 9216, 10752, 12288, 13568, 14848, 15872, 16896, 17920, 18688, 19456 }, + + /* Tab (20224 entries) */ { + /* 0, 0 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.699079163e-03f, +9.391619165e-03f, +1.412003132e-02f, +1.978780700e-02f, +2.618766558e-02f, +3.300962293e-02f, +3.986250151e-02f, +4.630710150e-02f, +5.189752414e-02f, +5.622583743e-02f, +5.896461470e-02f, +5.990197477e-02f, +5.896461470e-02f, +5.622583743e-02f, +5.189752414e-02f, +4.630710150e-02f, +3.986250151e-02f, +3.300962293e-02f, +2.618766558e-02f, +1.978780700e-02f, +1.412003132e-02f, +9.391619165e-03f, +5.699079163e-03f, +3.033414355e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.960749141e-04f, -2.615442299e-04f, -3.246064176e-04f, -3.783813704e-04f, -4.160394191e-04f, -4.316573727e-04f, -4.210258335e-04f, -3.822915174e-04f, -3.163364871e-04f, -2.268299826e-04f, -1.199331400e-04f, -3.685685399e-06f, +1.128507582e-04f, +2.205828625e-04f, +3.113799387e-04f, +3.789424838e-04f, +4.194333165e-04f, +4.317940913e-04f, +4.177150854e-04f, +3.812749648e-04f, +3.283123126e-04f, +2.656253207e-04f, +2.001152905e-04f, +1.379910952e-04f, + /* 0, 1 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.503004249e-03f, +9.130074935e-03f, +1.379542491e-02f, +1.940942563e-02f, +2.577162616e-02f, +3.257796556e-02f, +3.944147567e-02f, +4.592480998e-02f, +5.158118765e-02f, +5.599900745e-02f, +5.884468156e-02f, +5.989828908e-02f, +5.907746546e-02f, +5.644642030e-02f, +5.220890408e-02f, +4.668604398e-02f, +4.028193482e-02f, +3.344141702e-02f, +2.660538066e-02f, +2.016908197e-02f, +1.444834364e-02f, +9.657244486e-03f, +5.899194453e-03f, +3.171405450e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.920495797e-04f, -2.574539829e-04f, -3.208642311e-04f, -3.754245234e-04f, -4.142770958e-04f, -4.314173415e-04f, -4.225076726e-04f, -3.855333010e-04f, -3.212002155e-04f, -2.330085517e-04f, -1.269786586e-04f, -1.105591687e-05f, +1.057336668e-04f, +2.142689858e-04f, +3.063318181e-04f, +3.754867850e-04f, +4.177300107e-04f, +4.318267432e-04f, +4.193028253e-04f, +3.841037044e-04f, +3.319801912e-04f, +2.696956158e-04f, +2.041693330e-04f, +1.416741607e-04f, + /* 0, 2 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.310954669e-03f, +8.872620952e-03f, +1.347456067e-02f, +1.903400111e-02f, +2.535734906e-02f, +3.214654822e-02f, +3.901896800e-02f, +4.553927668e-02f, +5.125998744e-02f, +5.576599890e-02f, +5.871770290e-02f, +5.988723317e-02f, +5.918319912e-02f, +5.666068928e-02f, +5.251523590e-02f, +4.706153077e-02f, +4.069966483e-02f, +3.387324377e-02f, +2.702468349e-02f, +2.055318567e-02f, +1.478032383e-02f, +9.926940101e-03f, +6.103363786e-03f, +3.313079611e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.880406414e-04f, -2.533562076e-04f, -3.170874784e-04f, -3.724060396e-04f, -4.124294112e-04f, -4.310747882e-04f, -4.238789874e-04f, -3.886672932e-04f, -3.259699149e-04f, -2.391168051e-04f, -1.339851768e-04f, -1.842273085e-05f, +9.858403415e-05f, +2.078901751e-04f, +3.011934115e-04f, +3.719250490e-04f, +4.159158478e-04f, +4.317546116e-04f, +4.208013970e-04f, +3.868660020e-04f, +3.356083300e-04f, +2.737534645e-04f, +2.082356450e-04f, +1.453890870e-04f, + /* 0, 3 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +5.122914028e-03f, +8.619264745e-03f, +1.315747320e-02f, +1.866159507e-02f, +2.494491965e-02f, +3.171547343e-02f, +3.859508901e-02f, +4.515060939e-02f, +5.093401752e-02f, +5.552688209e-02f, +5.858371772e-02f, +5.986881044e-02f, +5.928178316e-02f, +5.686857946e-02f, +5.281642931e-02f, +4.743345582e-02f, +4.111558068e-02f, +3.430499838e-02f, +2.744548489e-02f, +2.094005167e-02f, +1.511593216e-02f, +1.020069357e-02f, +6.311599431e-03f, +3.458468698e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.840494321e-04f, -2.492525195e-04f, -3.132778847e-04f, -3.693275483e-04f, -4.104976870e-04f, -4.306305397e-04f, -4.251399738e-04f, -3.916929963e-04f, -3.306444157e-04f, -2.451530077e-04f, -1.409505737e-04f, -2.578385067e-05f, +9.140404286e-05f, +2.014482809e-04f, +2.959660430e-04f, +3.682579471e-04f, +4.139908027e-04f, +4.315770173e-04f, +4.222095865e-04f, +3.895602860e-04f, +3.391950078e-04f, +2.777972061e-04f, +2.123128096e-04f, +1.491348359e-04f, + /* 0, 4 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.938864596e-03f, +8.370012225e-03f, +1.284419531e-02f, +1.829226752e-02f, +2.453442196e-02f, +3.128484289e-02f, +3.816994904e-02f, +4.475891639e-02f, +5.060337311e-02f, +5.528172909e-02f, +5.844276715e-02f, +5.984302658e-02f, +5.937318720e-02f, +5.707002774e-02f, +5.311239535e-02f, +4.780171377e-02f, +4.152957148e-02f, +3.473657539e-02f, +2.786769447e-02f, +2.132961196e-02f, +1.545512716e-02f, +1.047849077e-02f, +6.523912241e-03f, +3.607603534e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.800772619e-04f, -2.451445209e-04f, -3.094371743e-04f, -3.661906908e-04f, -4.084832700e-04f, -4.300854583e-04f, -4.262908700e-04f, -3.946099562e-04f, -3.352225880e-04f, -2.511154556e-04f, -1.478727465e-04f, -3.313700212e-05f, +8.419588858e-05f, +1.949451810e-04f, +2.906510740e-04f, +3.644861934e-04f, +4.119548933e-04f, +4.312933190e-04f, +4.235262086e-04f, +3.921850012e-04f, +3.427385065e-04f, +2.818251702e-04f, +2.163993902e-04f, +1.529103426e-04f, + /* 0, 5 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.758787334e-03f, +8.124867704e-03f, +1.253475814e-02f, +1.792607683e-02f, +2.412593869e-02f, +3.085475743e-02f, +3.774365817e-02f, +4.436430644e-02f, +5.026815052e-02f, +5.503061363e-02f, +5.829489440e-02f, +5.980988958e-02f, +5.945738309e-02f, +5.726497292e-02f, +5.340304642e-02f, +4.816619996e-02f, +4.194152638e-02f, +3.516786871e-02f, +2.829122068e-02f, +2.172179696e-02f, +1.579786567e-02f, +1.076031594e-02f, +6.740311631e-03f, +3.760513876e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.761254183e-04f, -2.410338005e-04f, -3.055670693e-04f, -3.629971201e-04f, -4.063875313e-04f, -4.294404412e-04f, -4.273319557e-04f, -3.974177623e-04f, -3.397033418e-04f, -2.570024759e-04f, -1.547496110e-04f, -4.047991444e-05f, +7.696177919e-05f, +1.883827791e-04f, +2.852499031e-04f, +3.606105449e-04f, +4.098081809e-04f, +4.309029143e-04f, +4.247501074e-04f, +3.947386096e-04f, +3.462371119e-04f, +2.858356777e-04f, +2.204939308e-04f, +1.567145163e-04f, + /* 0, 6 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.582661915e-03f, +7.883833904e-03f, +1.222919107e-02f, +1.756307971e-02f, +2.371955116e-02f, +3.042531699e-02f, +3.731632621e-02f, +4.396688867e-02f, +4.992844718e-02f, +5.477361115e-02f, +5.814014479e-02f, +5.976940967e-02f, +5.953434487e-02f, +5.745335570e-02f, +5.368829633e-02f, +4.852681050e-02f, +4.235133456e-02f, +3.559877163e-02f, +2.871597079e-02f, +2.211653557e-02f, +1.614410278e-02f, +1.104615162e-02f, +6.960805562e-03f, +3.917228392e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.721951657e-04f, -2.369219327e-04f, -3.016692895e-04f, -3.597484994e-04f, -4.042118656e-04f, -4.286964203e-04f, -4.282635524e-04f, -4.001160478e-04f, -3.440856280e-04f, -2.628124281e-04f, -1.615791025e-04f, -4.781032135e-05f, +6.970393379e-05f, +1.817630045e-04f, +2.797639649e-04f, +3.566318012e-04f, +4.075507701e-04f, +4.304052395e-04f, +4.258801573e-04f, +3.972195913e-04f, +3.496891145e-04f, +2.898270411e-04f, +2.245949568e-04f, +1.605462403e-04f, + /* 0, 7 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.410466750e-03f, +7.646911971e-03f, +1.192752178e-02f, +1.720333121e-02f, +2.331533930e-02f, +2.999662057e-02f, +3.688806266e-02f, +4.356677263e-02f, +4.958436155e-02f, +5.451079873e-02f, +5.797856569e-02f, +5.972159935e-02f, +5.960404880e-02f, +5.763511870e-02f, +5.396806029e-02f, +4.888344231e-02f, +4.275888533e-02f, +3.602917687e-02f, +2.914185094e-02f, +2.251375516e-02f, +1.649379190e-02f, +1.133597866e-02f, +7.185400519e-03f, +4.077774633e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.682877448e-04f, -2.328104765e-04f, -2.977455511e-04f, -3.564465022e-04f, -4.019576904e-04f, -4.278543613e-04f, -4.290860228e-04f, -4.027044898e-04f, -3.483684379e-04f, -2.685437043e-04f, -1.683591769e-04f, -5.512596196e-05f, +6.242458181e-05f, +1.750878111e-04f, +2.741947301e-04f, +3.525508042e-04f, +4.051828091e-04f, +4.297997704e-04f, +4.269152631e-04f, +3.996264454e-04f, +3.530928104e-04f, +2.937975659e-04f, +2.287009755e-04f, +1.644043723e-04f, + /* 0, 8 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.242179005e-03f, +7.414101494e-03f, +1.162977623e-02f, +1.684688471e-02f, +2.291338161e-02f, +2.956876621e-02f, +3.645897664e-02f, +4.316406814e-02f, +4.923599311e-02f, +5.424225502e-02f, +5.781020651e-02f, +5.966647338e-02f, +5.966647338e-02f, +5.781020651e-02f, +5.424225502e-02f, +4.923599311e-02f, +4.316406814e-02f, +3.645897664e-02f, +2.956876621e-02f, +2.291338161e-02f, +1.684688471e-02f, +1.162977623e-02f, +7.414101494e-03f, +4.242179005e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.644043723e-04f, -2.287009755e-04f, -2.937975659e-04f, -3.530928104e-04f, -3.996264454e-04f, -4.269152631e-04f, -4.297997704e-04f, -4.051828091e-04f, -3.525508042e-04f, -2.741947301e-04f, -1.750878111e-04f, -6.242458181e-05f, +5.512596196e-05f, +1.683591769e-04f, +2.685437043e-04f, +3.483684379e-04f, +4.027044898e-04f, +4.290860228e-04f, +4.278543613e-04f, +4.019576904e-04f, +3.564465022e-04f, +2.977455511e-04f, +2.328104765e-04f, +1.682877448e-04f, + /* 0, 9 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +4.077774633e-03f, +7.185400519e-03f, +1.133597866e-02f, +1.649379190e-02f, +2.251375516e-02f, +2.914185094e-02f, +3.602917687e-02f, +4.275888533e-02f, +4.888344231e-02f, +5.396806029e-02f, +5.763511870e-02f, +5.960404880e-02f, +5.972159935e-02f, +5.797856569e-02f, +5.451079873e-02f, +4.958436155e-02f, +4.356677263e-02f, +3.688806266e-02f, +2.999662057e-02f, +2.331533930e-02f, +1.720333121e-02f, +1.192752178e-02f, +7.646911971e-03f, +4.410466750e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.605462403e-04f, -2.245949568e-04f, -2.898270411e-04f, -3.496891145e-04f, -3.972195913e-04f, -4.258801573e-04f, -4.304052395e-04f, -4.075507701e-04f, -3.566318012e-04f, -2.797639649e-04f, -1.817630045e-04f, -6.970393379e-05f, +4.781032135e-05f, +1.615791025e-04f, +2.628124281e-04f, +3.440856280e-04f, +4.001160478e-04f, +4.282635524e-04f, +4.286964203e-04f, +4.042118656e-04f, +3.597484994e-04f, +3.016692895e-04f, +2.369219327e-04f, +1.721951657e-04f, + /* 0,10 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.917228392e-03f, +6.960805562e-03f, +1.104615162e-02f, +1.614410278e-02f, +2.211653557e-02f, +2.871597079e-02f, +3.559877163e-02f, +4.235133456e-02f, +4.852681050e-02f, +5.368829633e-02f, +5.745335570e-02f, +5.953434487e-02f, +5.976940967e-02f, +5.814014479e-02f, +5.477361115e-02f, +4.992844718e-02f, +4.396688867e-02f, +3.731632621e-02f, +3.042531699e-02f, +2.371955116e-02f, +1.756307971e-02f, +1.222919107e-02f, +7.883833904e-03f, +4.582661915e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.567145163e-04f, -2.204939308e-04f, -2.858356777e-04f, -3.462371119e-04f, -3.947386096e-04f, -4.247501074e-04f, -4.309029143e-04f, -4.098081809e-04f, -3.606105449e-04f, -2.852499031e-04f, -1.883827791e-04f, -7.696177919e-05f, +4.047991444e-05f, +1.547496110e-04f, +2.570024759e-04f, +3.397033418e-04f, +3.974177623e-04f, +4.273319557e-04f, +4.294404412e-04f, +4.063875313e-04f, +3.629971201e-04f, +3.055670693e-04f, +2.410338005e-04f, +1.761254183e-04f, + /* 0,11 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.760513876e-03f, +6.740311631e-03f, +1.076031594e-02f, +1.579786567e-02f, +2.172179696e-02f, +2.829122068e-02f, +3.516786871e-02f, +4.194152638e-02f, +4.816619996e-02f, +5.340304642e-02f, +5.726497292e-02f, +5.945738309e-02f, +5.980988958e-02f, +5.829489440e-02f, +5.503061363e-02f, +5.026815052e-02f, +4.436430644e-02f, +3.774365817e-02f, +3.085475743e-02f, +2.412593869e-02f, +1.792607683e-02f, +1.253475814e-02f, +8.124867704e-03f, +4.758787334e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.529103426e-04f, -2.163993902e-04f, -2.818251702e-04f, -3.427385065e-04f, -3.921850012e-04f, -4.235262086e-04f, -4.312933190e-04f, -4.119548933e-04f, -3.644861934e-04f, -2.906510740e-04f, -1.949451810e-04f, -8.419588858e-05f, +3.313700212e-05f, +1.478727465e-04f, +2.511154556e-04f, +3.352225880e-04f, +3.946099562e-04f, +4.262908700e-04f, +4.300854583e-04f, +4.084832700e-04f, +3.661906908e-04f, +3.094371743e-04f, +2.451445209e-04f, +1.800772619e-04f, + /* 0,12 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.607603534e-03f, +6.523912241e-03f, +1.047849077e-02f, +1.545512716e-02f, +2.132961196e-02f, +2.786769447e-02f, +3.473657539e-02f, +4.152957148e-02f, +4.780171377e-02f, +5.311239535e-02f, +5.707002774e-02f, +5.937318720e-02f, +5.984302658e-02f, +5.844276715e-02f, +5.528172909e-02f, +5.060337311e-02f, +4.475891639e-02f, +3.816994904e-02f, +3.128484289e-02f, +2.453442196e-02f, +1.829226752e-02f, +1.284419531e-02f, +8.370012225e-03f, +4.938864596e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.491348359e-04f, -2.123128096e-04f, -2.777972061e-04f, -3.391950078e-04f, -3.895602860e-04f, -4.222095865e-04f, -4.315770173e-04f, -4.139908027e-04f, -3.682579471e-04f, -2.959660430e-04f, -2.014482809e-04f, -9.140404286e-05f, +2.578385067e-05f, +1.409505737e-04f, +2.451530077e-04f, +3.306444157e-04f, +3.916929963e-04f, +4.251399738e-04f, +4.306305397e-04f, +4.104976870e-04f, +3.693275483e-04f, +3.132778847e-04f, +2.492525195e-04f, +1.840494321e-04f, + /* 0,13 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.458468698e-03f, +6.311599431e-03f, +1.020069357e-02f, +1.511593216e-02f, +2.094005167e-02f, +2.744548489e-02f, +3.430499838e-02f, +4.111558068e-02f, +4.743345582e-02f, +5.281642931e-02f, +5.686857946e-02f, +5.928178316e-02f, +5.986881044e-02f, +5.858371772e-02f, +5.552688209e-02f, +5.093401752e-02f, +4.515060939e-02f, +3.859508901e-02f, +3.171547343e-02f, +2.494491965e-02f, +1.866159507e-02f, +1.315747320e-02f, +8.619264745e-03f, +5.122914028e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.453890870e-04f, -2.082356450e-04f, -2.737534645e-04f, -3.356083300e-04f, -3.868660020e-04f, -4.208013970e-04f, -4.317546116e-04f, -4.159158478e-04f, -3.719250490e-04f, -3.011934115e-04f, -2.078901751e-04f, -9.858403415e-05f, +1.842273085e-05f, +1.339851768e-04f, +2.391168051e-04f, +3.259699149e-04f, +3.886672932e-04f, +4.238789874e-04f, +4.310747882e-04f, +4.124294112e-04f, +3.724060396e-04f, +3.170874784e-04f, +2.533562076e-04f, +1.880406414e-04f, + /* 0,14 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.313079611e-03f, +6.103363786e-03f, +9.926940101e-03f, +1.478032383e-02f, +2.055318567e-02f, +2.702468349e-02f, +3.387324377e-02f, +4.069966483e-02f, +4.706153077e-02f, +5.251523590e-02f, +5.666068928e-02f, +5.918319912e-02f, +5.988723317e-02f, +5.871770290e-02f, +5.576599890e-02f, +5.125998744e-02f, +4.553927668e-02f, +3.901896800e-02f, +3.214654822e-02f, +2.535734906e-02f, +1.903400111e-02f, +1.347456067e-02f, +8.872620952e-03f, +5.310954669e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.416741607e-04f, -2.041693330e-04f, -2.696956158e-04f, -3.319801912e-04f, -3.841037044e-04f, -4.193028253e-04f, -4.318267432e-04f, -4.177300107e-04f, -3.754867850e-04f, -3.063318181e-04f, -2.142689858e-04f, -1.057336668e-04f, +1.105591687e-05f, +1.269786586e-04f, +2.330085517e-04f, +3.212002155e-04f, +3.855333010e-04f, +4.225076726e-04f, +4.314173415e-04f, +4.142770958e-04f, +3.754245234e-04f, +3.208642311e-04f, +2.574539829e-04f, +1.920495797e-04f, + /* 0,15 (24) */ + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +3.171405450e-03f, +5.899194453e-03f, +9.657244486e-03f, +1.444834364e-02f, +2.016908197e-02f, +2.660538066e-02f, +3.344141702e-02f, +4.028193482e-02f, +4.668604398e-02f, +5.220890408e-02f, +5.644642030e-02f, +5.907746546e-02f, +5.989828908e-02f, +5.884468156e-02f, +5.599900745e-02f, +5.158118765e-02f, +4.592480998e-02f, +3.944147567e-02f, +3.257796556e-02f, +2.577162616e-02f, +1.940942563e-02f, +1.379542491e-02f, +9.130074935e-03f, +5.503004249e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.379910952e-04f, -2.001152905e-04f, -2.656253207e-04f, -3.283123126e-04f, -3.812749648e-04f, -4.177150854e-04f, -4.317940913e-04f, -4.194333165e-04f, -3.789424838e-04f, -3.113799387e-04f, -2.205828625e-04f, -1.128507582e-04f, +3.685685399e-06f, +1.199331400e-04f, +2.268299826e-04f, +3.163364871e-04f, +3.822915174e-04f, +4.210258335e-04f, +4.316573727e-04f, +4.160394191e-04f, +3.783813704e-04f, +3.246064176e-04f, +2.615442299e-04f, +1.960749141e-04f, + /* 1, 0 (24) */ + +5.699079163e-03f, +9.391619165e-03f, +1.412003132e-02f, +1.978780700e-02f, +2.618766558e-02f, +3.300962293e-02f, +3.986250151e-02f, +4.630710150e-02f, +5.189752414e-02f, +5.622583743e-02f, +5.896461470e-02f, +5.990197477e-02f, +5.896461470e-02f, +5.622583743e-02f, +5.189752414e-02f, +4.630710150e-02f, +3.986250151e-02f, +3.300962293e-02f, +2.618766558e-02f, +1.978780700e-02f, +1.412003132e-02f, +9.391619165e-03f, +5.699079163e-03f, +3.033414355e-03f, + -1.115631698e-02f, -1.514091868e-02f, -1.758178327e-02f, -1.720553350e-02f, -1.305312300e-02f, -4.789667122e-03f, +7.097937791e-03f, +2.128379168e-02f, +3.579087813e-02f, +4.835456220e-02f, +5.688256345e-02f, +5.990197477e-02f, +5.688256345e-02f, +4.835456220e-02f, +3.579087813e-02f, +2.128379168e-02f, +7.097937791e-03f, -4.789667122e-03f, -1.305312300e-02f, -1.720553350e-02f, -1.758178327e-02f, -1.514091868e-02f, -1.115631698e-02f, -6.883255437e-03f, + -1.960749141e-04f, -2.615442299e-04f, -3.246064176e-04f, -3.783813704e-04f, -4.160394191e-04f, -4.316573727e-04f, -4.210258335e-04f, -3.822915174e-04f, -3.163364871e-04f, -2.268299826e-04f, -1.199331400e-04f, -3.685685399e-06f, +1.128507582e-04f, +2.205828625e-04f, +3.113799387e-04f, +3.789424838e-04f, +4.194333165e-04f, +4.317940913e-04f, +4.177150854e-04f, +3.812749648e-04f, +3.283123126e-04f, +2.656253207e-04f, +2.001152905e-04f, +1.379910952e-04f, + +2.705482644e-04f, +2.175833157e-04f, +8.236166666e-05f, -1.267651157e-04f, -3.803727076e-04f, -6.320839735e-04f, -8.279297007e-04f, -9.188817989e-04f, -8.733813231e-04f, -6.864407641e-04f, -3.826490473e-04f, -1.197181021e-05f, +3.608162026e-04f, +6.704699924e-04f, +8.657334732e-04f, +9.202342634e-04f, +8.371263083e-04f, +6.465221071e-04f, +3.967060483e-04f, +1.417231279e-04f, -7.125445421e-05f, -2.115618514e-04f, -2.695204175e-04f, -2.551871856e-04f, + /* 1, 1 (24) */ + +5.503004249e-03f, +9.130074935e-03f, +1.379542491e-02f, +1.940942563e-02f, +2.577162616e-02f, +3.257796556e-02f, +3.944147567e-02f, +4.592480998e-02f, +5.158118765e-02f, +5.599900745e-02f, +5.884468156e-02f, +5.989828908e-02f, +5.907746546e-02f, +5.644642030e-02f, +5.220890408e-02f, +4.668604398e-02f, +4.028193482e-02f, +3.344141702e-02f, +2.660538066e-02f, +2.016908197e-02f, +1.444834364e-02f, +9.657244486e-03f, +5.899194453e-03f, +3.171405450e-03f, + -1.088576871e-02f, -1.492333537e-02f, -1.749942161e-02f, -1.733229861e-02f, -1.343349571e-02f, -5.421751096e-03f, +6.270008090e-03f, +2.036490988e-02f, +3.491749681e-02f, +4.766812144e-02f, +5.649991440e-02f, +5.989000296e-02f, +5.724337965e-02f, +4.902503219e-02f, +3.665661161e-02f, +2.220402594e-02f, +7.935064099e-03f, -4.143145015e-03f, -1.265641695e-02f, -1.706381037e-02f, -1.765303773e-02f, -1.535248053e-02f, -1.142583740e-02f, -7.138442622e-03f, + -1.920495797e-04f, -2.574539829e-04f, -3.208642311e-04f, -3.754245234e-04f, -4.142770958e-04f, -4.314173415e-04f, -4.225076726e-04f, -3.855333010e-04f, -3.212002155e-04f, -2.330085517e-04f, -1.269786586e-04f, -1.105591687e-05f, +1.057336668e-04f, +2.142689858e-04f, +3.063318181e-04f, +3.754867850e-04f, +4.177300107e-04f, +4.318267432e-04f, +4.193028253e-04f, +3.841037044e-04f, +3.319801912e-04f, +2.696956158e-04f, +2.041693330e-04f, +1.416741607e-04f, + +2.712938608e-04f, +2.232769411e-04f, +9.317309612e-05f, -1.119865916e-04f, -3.640345662e-04f, -6.174260146e-04f, -8.183175346e-04f, -9.169874259e-04f, -8.804667570e-04f, -7.019465696e-04f, -4.042156479e-04f, -3.590702749e-05f, +3.387320427e-04f, +6.540440323e-04f, +8.575258695e-04f, +9.210401721e-04f, +8.458969541e-04f, +6.607270683e-04f, +4.130215719e-04f, +1.568508104e-04f, -5.985630987e-05f, -2.052121014e-04f, -2.682055987e-04f, -2.577951457e-04f, + /* 1, 2 (24) */ + +5.310954669e-03f, +8.872620952e-03f, +1.347456067e-02f, +1.903400111e-02f, +2.535734906e-02f, +3.214654822e-02f, +3.901896800e-02f, +4.553927668e-02f, +5.125998744e-02f, +5.576599890e-02f, +5.871770290e-02f, +5.988723317e-02f, +5.918319912e-02f, +5.666068928e-02f, +5.251523590e-02f, +4.706153077e-02f, +4.069966483e-02f, +3.387324377e-02f, +2.702468349e-02f, +2.055318567e-02f, +1.478032383e-02f, +9.926940101e-03f, +6.103363786e-03f, +3.313079611e-03f, + -1.061447485e-02f, -1.470005842e-02f, -1.740624851e-02f, -1.744428520e-02f, -1.379753027e-02f, -6.039177110e-03f, +5.451690556e-03f, +1.944792245e-02f, +3.403703005e-02f, +4.696617487e-02f, +5.609569875e-02f, +5.985409593e-02f, +5.758211169e-02f, +4.967907622e-02f, +3.751413748e-02f, +2.312506611e-02f, +8.780961054e-03f, -3.482417947e-03f, -1.224339538e-02f, -1.690695956e-02f, -1.771289404e-02f, -1.555769263e-02f, -1.169404300e-02f, -7.396237768e-03f, + -1.880406414e-04f, -2.533562076e-04f, -3.170874784e-04f, -3.724060396e-04f, -4.124294112e-04f, -4.310747882e-04f, -4.238789874e-04f, -3.886672932e-04f, -3.259699149e-04f, -2.391168051e-04f, -1.339851768e-04f, -1.842273085e-05f, +9.858403415e-05f, +2.078901751e-04f, +3.011934115e-04f, +3.719250490e-04f, +4.159158478e-04f, +4.317546116e-04f, +4.208013970e-04f, +3.868660020e-04f, +3.356083300e-04f, +2.737534645e-04f, +2.082356450e-04f, +1.453890870e-04f, + +2.717621372e-04f, +2.286434837e-04f, +1.036842282e-04f, -9.739710104e-05f, -3.477045164e-04f, -6.025616528e-04f, -8.083004890e-04f, -9.145562136e-04f, -8.869875835e-04f, -7.169780354e-04f, -4.255013118e-04f, -5.981704284e-05f, +3.164117194e-04f, +6.371730579e-04f, +8.487616438e-04f, +9.212953056e-04f, +8.542315214e-04f, +6.746855984e-04f, +4.293061488e-04f, +1.721380793e-04f, -4.817242024e-05f, -1.985339325e-04f, -2.665993037e-04f, -2.602051597e-04f, + /* 1, 3 (24) */ + +5.122914028e-03f, +8.619264745e-03f, +1.315747320e-02f, +1.866159507e-02f, +2.494491965e-02f, +3.171547343e-02f, +3.859508901e-02f, +4.515060939e-02f, +5.093401752e-02f, +5.552688209e-02f, +5.858371772e-02f, +5.986881044e-02f, +5.928178316e-02f, +5.686857946e-02f, +5.281642931e-02f, +4.743345582e-02f, +4.111558068e-02f, +3.430499838e-02f, +2.744548489e-02f, +2.094005167e-02f, +1.511593216e-02f, +1.020069357e-02f, +6.311599431e-03f, +3.458468698e-03f, + -1.034271272e-02f, -1.447141494e-02f, -1.730256428e-02f, -1.754168230e-02f, -1.414523479e-02f, -6.641738763e-03f, +4.643390067e-03f, +1.853336624e-02f, +3.315004247e-02f, +4.624919683e-02f, +5.567019744e-02f, +5.979427889e-02f, +5.789852341e-02f, +5.031624928e-02f, +3.836289912e-02f, +2.404636142e-02f, +9.635192575e-03f, -2.807732349e-03f, -1.181408923e-02f, -1.673482148e-02f, -1.776106646e-02f, -1.575622657e-02f, -1.196064230e-02f, -7.656442928e-03f, + -1.840494321e-04f, -2.492525195e-04f, -3.132778847e-04f, -3.693275483e-04f, -4.104976870e-04f, -4.306305397e-04f, -4.251399738e-04f, -3.916929963e-04f, -3.306444157e-04f, -2.451530077e-04f, -1.409505737e-04f, -2.578385067e-05f, +9.140404286e-05f, +2.014482809e-04f, +2.959660430e-04f, +3.682579471e-04f, +4.139908027e-04f, +4.315770173e-04f, +4.222095865e-04f, +3.895602860e-04f, +3.391950078e-04f, +2.777972061e-04f, +2.123128096e-04f, +1.491348359e-04f, + +2.719582255e-04f, +2.336840048e-04f, +1.138908863e-04f, -8.300591000e-05f, -3.313953148e-04f, -5.875043727e-04f, -7.978895069e-04f, -9.115936458e-04f, -8.929420818e-04f, -7.315261995e-04f, -4.464915949e-04f, -8.368507996e-05f, +2.938705940e-04f, +6.198676315e-04f, +8.394443961e-04f, +9.209958781e-04f, +8.621201918e-04f, +6.883845401e-04f, +4.455465481e-04f, +1.875745925e-04f, -3.620830577e-05f, -1.915275290e-04f, -2.646972525e-04f, -2.624103371e-04f, + /* 1, 4 (24) */ + +4.938864596e-03f, +8.370012225e-03f, +1.284419531e-02f, +1.829226752e-02f, +2.453442196e-02f, +3.128484289e-02f, +3.816994904e-02f, +4.475891639e-02f, +5.060337311e-02f, +5.528172909e-02f, +5.844276715e-02f, +5.984302658e-02f, +5.937318720e-02f, +5.707002774e-02f, +5.311239535e-02f, +4.780171377e-02f, +4.152957148e-02f, +3.473657539e-02f, +2.786769447e-02f, +2.132961196e-02f, +1.545512716e-02f, +1.047849077e-02f, +6.523912241e-03f, +3.607603534e-03f, + -1.007075449e-02f, -1.423773094e-02f, -1.718867340e-02f, -1.762468821e-02f, -1.447663011e-02f, -7.229243136e-03f, +3.845500560e-03f, +1.762177259e-02f, +3.225710039e-02f, +4.551767063e-02f, +5.522370585e-02f, +5.971059381e-02f, +5.819239401e-02f, +5.093611691e-02f, +3.920234351e-02f, +2.496735730e-02f, +1.049731277e-02f, -2.119347808e-03f, -1.136854268e-02f, -1.654724689e-02f, -1.779727476e-02f, -1.594775410e-02f, -1.222533955e-02f, -7.918853265e-03f, + -1.800772619e-04f, -2.451445209e-04f, -3.094371743e-04f, -3.661906908e-04f, -4.084832700e-04f, -4.300854583e-04f, -4.262908700e-04f, -3.946099562e-04f, -3.352225880e-04f, -2.511154556e-04f, -1.478727465e-04f, -3.313700212e-05f, +8.419588858e-05f, +1.949451810e-04f, +2.906510740e-04f, +3.644861934e-04f, +4.119548933e-04f, +4.312933190e-04f, +4.235262086e-04f, +3.921850012e-04f, +3.427385065e-04f, +2.818251702e-04f, +2.163993902e-04f, +1.529103426e-04f, + +2.718874504e-04f, +2.383998657e-04f, +1.237892318e-04f, -6.882199867e-05f, -3.151195712e-04f, -5.722677081e-04f, -7.870957839e-04f, -9.081056146e-04f, -8.983290016e-04f, -7.455825185e-04f, -4.671723146e-04f, -1.074944000e-04f, +2.711242241e-04f, +6.021386948e-04f, +8.295781937e-04f, +9.201385428e-04f, +8.695534551e-04f, +7.018108507e-04f, +4.617294493e-04f, +2.031497574e-04f, -2.396981877e-05f, -1.841933961e-04f, -2.624953972e-04f, -2.644038865e-04f, + /* 1, 5 (24) */ + +4.758787334e-03f, +8.124867704e-03f, +1.253475814e-02f, +1.792607683e-02f, +2.412593869e-02f, +3.085475743e-02f, +3.774365817e-02f, +4.436430644e-02f, +5.026815052e-02f, +5.503061363e-02f, +5.829489440e-02f, +5.980988958e-02f, +5.945738309e-02f, +5.726497292e-02f, +5.340304642e-02f, +4.816619996e-02f, +4.194152638e-02f, +3.516786871e-02f, +2.829122068e-02f, +2.172179696e-02f, +1.579786567e-02f, +1.076031594e-02f, +6.740311631e-03f, +3.760513876e-03f, + -9.798867041e-03f, -1.399933107e-02f, -1.706488416e-02f, -1.769351021e-02f, -1.479174968e-02f, -7.801510844e-03f, +3.058404776e-03f, +1.671366698e-02f, +3.135877139e-02f, +4.477208811e-02f, +5.475653353e-02f, +5.960309941e-02f, +5.846351823e-02f, +5.153825561e-02f, +4.003192171e-02f, +2.588749584e-02f, +1.136686622e-02f, -1.417536958e-03f, -1.090681323e-02f, -1.634409713e-02f, -1.782124458e-02f, -1.613194749e-02f, -1.248783495e-02f, -8.183257151e-03f, + -1.761254183e-04f, -2.410338005e-04f, -3.055670693e-04f, -3.629971201e-04f, -4.063875313e-04f, -4.294404412e-04f, -4.273319557e-04f, -3.974177623e-04f, -3.397033418e-04f, -2.570024759e-04f, -1.547496110e-04f, -4.047991444e-05f, +7.696177919e-05f, +1.883827791e-04f, +2.852499031e-04f, +3.606105449e-04f, +4.098081809e-04f, +4.309029143e-04f, +4.247501074e-04f, +3.947386096e-04f, +3.462371119e-04f, +2.858356777e-04f, +2.204939308e-04f, +1.567145163e-04f, + +2.715553220e-04f, +2.427927233e-04f, +1.333757646e-04f, -5.485405554e-05f, -2.988897381e-04f, -5.568652287e-04f, -7.759307559e-04f, -9.040984124e-04f, -9.031475626e-04f, -7.591388741e-04f, -4.875295623e-04f, -1.312283164e-04f, +2.481883498e-04f, +5.839975600e-04f, +8.191675683e-04f, +9.187203972e-04f, +8.765221205e-04f, +7.149516148e-04f, +4.778414546e-04f, +2.188527386e-04f, -1.146314106e-05f, -1.765323633e-04f, -2.599899292e-04f, -2.661791237e-04f, + /* 1, 6 (24) */ + +4.582661915e-03f, +7.883833904e-03f, +1.222919107e-02f, +1.756307971e-02f, +2.371955116e-02f, +3.042531699e-02f, +3.731632621e-02f, +4.396688867e-02f, +4.992844718e-02f, +5.477361115e-02f, +5.814014479e-02f, +5.976940967e-02f, +5.953434487e-02f, +5.745335570e-02f, +5.368829633e-02f, +4.852681050e-02f, +4.235133456e-02f, +3.559877163e-02f, +2.871597079e-02f, +2.211653557e-02f, +1.614410278e-02f, +1.104615162e-02f, +6.960805562e-03f, +3.917228392e-03f, + -9.527311719e-03f, -1.375653835e-02f, -1.693150840e-02f, -1.774836427e-02f, -1.509063942e-02f, -8.358376073e-03f, +2.282474020e-03f, +1.580956857e-02f, +3.045562382e-02f, +4.401294924e-02f, +5.426900397e-02f, +5.947187109e-02f, +5.871170658e-02f, +5.212225317e-02f, +4.085108928e-02f, +2.680621624e-02f, +1.224338834e-02f, -7.025853429e-04f, -1.042897178e-02f, -1.612524439e-02f, -1.783270772e-02f, -1.630847986e-02f, -1.274782488e-02f, -8.449436275e-03f, + -1.721951657e-04f, -2.369219327e-04f, -3.016692895e-04f, -3.597484994e-04f, -4.042118656e-04f, -4.286964203e-04f, -4.282635524e-04f, -4.001160478e-04f, -3.440856280e-04f, -2.628124281e-04f, -1.615791025e-04f, -4.781032135e-05f, +6.970393379e-05f, +1.817630045e-04f, +2.797639649e-04f, +3.566318012e-04f, +4.075507701e-04f, +4.304052395e-04f, +4.258801573e-04f, +3.972195913e-04f, +3.496891145e-04f, +2.898270411e-04f, +2.245949568e-04f, +1.605462403e-04f, + +2.709675269e-04f, +2.468645241e-04f, +1.426473226e-04f, -4.111047175e-05f, -2.827181000e-04f, -5.413105277e-04f, -7.644060876e-04f, -8.995787250e-04f, -9.073974534e-04f, -7.721875796e-04f, -5.075497148e-04f, -1.548702100e-04f, +2.250788795e-04f, +5.654559003e-04f, +8.082175138e-04f, +9.167389877e-04f, +8.830173267e-04f, +7.277940577e-04f, +4.938691005e-04f, +2.346724664e-04f, +1.305218783e-06f, -1.685455871e-04f, -2.571772862e-04f, -2.677294810e-04f, + /* 1, 7 (24) */ + +4.410466750e-03f, +7.646911971e-03f, +1.192752178e-02f, +1.720333121e-02f, +2.331533930e-02f, +2.999662057e-02f, +3.688806266e-02f, +4.356677263e-02f, +4.958436155e-02f, +5.451079873e-02f, +5.797856569e-02f, +5.972159935e-02f, +5.960404880e-02f, +5.763511870e-02f, +5.396806029e-02f, +4.888344231e-02f, +4.275888533e-02f, +3.602917687e-02f, +2.914185094e-02f, +2.251375516e-02f, +1.649379190e-02f, +1.133597866e-02f, +7.185400519e-03f, +4.077774633e-03f, + -9.256344192e-03f, -1.350967382e-02f, -1.678886108e-02f, -1.778947474e-02f, -1.537335752e-02f, -8.899686600e-03f, +1.518067933e-03f, +1.490998984e-02f, +2.954822637e-02f, +4.324076166e-02f, +5.376145426e-02f, +5.931700088e-02f, +5.893678546e-02f, +5.268770907e-02f, +4.165930679e-02f, +2.772295523e-02f, +1.312640567e-02f, +2.520871482e-05f, -9.935102679e-03f, -1.589057192e-02f, -1.783140250e-02f, -1.647702544e-02f, -1.300500216e-02f, -8.717165756e-03f, + -1.682877448e-04f, -2.328104765e-04f, -2.977455511e-04f, -3.564465022e-04f, -4.019576904e-04f, -4.278543613e-04f, -4.290860228e-04f, -4.027044898e-04f, -3.483684379e-04f, -2.685437043e-04f, -1.683591769e-04f, -5.512596196e-05f, +6.242458181e-05f, +1.750878111e-04f, +2.741947301e-04f, +3.525508042e-04f, +4.051828091e-04f, +4.297997704e-04f, +4.269152631e-04f, +3.996264454e-04f, +3.530928104e-04f, +2.937975659e-04f, +2.287009755e-04f, +1.644043723e-04f, + +2.701299199e-04f, +2.506174995e-04f, +1.516010816e-04f, -2.759933578e-05f, -2.666167631e-04f, -5.256172082e-04f, -7.525336599e-04f, -8.945536224e-04f, -9.110788299e-04f, -7.847213850e-04f, -5.272194464e-04f, -1.784035434e-04f, +2.018118763e-04f, +5.465257405e-04f, +7.967334832e-04f, +9.141923133e-04f, +8.890305516e-04f, +7.403255578e-04f, +5.097988707e-04f, +2.505976453e-04f, +1.432842854e-05f, -1.602345538e-04f, -2.540541594e-04f, -2.690485160e-04f, + /* 1, 8 (24) */ + +4.242179005e-03f, +7.414101494e-03f, +1.162977623e-02f, +1.684688471e-02f, +2.291338161e-02f, +2.956876621e-02f, +3.645897664e-02f, +4.316406814e-02f, +4.923599311e-02f, +5.424225502e-02f, +5.781020651e-02f, +5.966647338e-02f, +5.966647338e-02f, +5.781020651e-02f, +5.424225502e-02f, +4.923599311e-02f, +4.316406814e-02f, +3.645897664e-02f, +2.956876621e-02f, +2.291338161e-02f, +1.684688471e-02f, +1.162977623e-02f, +7.414101494e-03f, +4.242179005e-03f, + -8.986214272e-03f, -1.325905632e-02f, -1.663726000e-02f, -1.781707408e-02f, -1.563997428e-02f, -9.425303809e-03f, +7.655342726e-04f, +1.401543622e-02f, +2.863714754e-02f, +4.245604027e-02f, +5.323423481e-02f, +5.913859734e-02f, +5.913859734e-02f, +5.323423481e-02f, +4.245604027e-02f, +2.863714754e-02f, +1.401543622e-02f, +7.655342726e-04f, -9.425303809e-03f, -1.563997428e-02f, -1.781707408e-02f, -1.663726000e-02f, -1.325905632e-02f, -8.986214272e-03f, + -1.644043723e-04f, -2.287009755e-04f, -2.937975659e-04f, -3.530928104e-04f, -3.996264454e-04f, -4.269152631e-04f, -4.297997704e-04f, -4.051828091e-04f, -3.525508042e-04f, -2.741947301e-04f, -1.750878111e-04f, -6.242458181e-05f, +5.512596196e-05f, +1.683591769e-04f, +2.685437043e-04f, +3.483684379e-04f, +4.027044898e-04f, +4.290860228e-04f, +4.278543613e-04f, +4.019576904e-04f, +3.564465022e-04f, +2.977455511e-04f, +2.328104765e-04f, +1.682877448e-04f, + +2.690485160e-04f, +2.540541594e-04f, +1.602345538e-04f, -1.432842854e-05f, -2.505976453e-04f, -5.097988707e-04f, -7.403255578e-04f, -8.890305516e-04f, -9.141923133e-04f, -7.967334832e-04f, -5.465257405e-04f, -2.018118763e-04f, +1.784035434e-04f, +5.272194464e-04f, +7.847213850e-04f, +9.110788299e-04f, +8.945536224e-04f, +7.525336599e-04f, +5.256172082e-04f, +2.666167631e-04f, +2.759933578e-05f, -1.516010816e-04f, -2.506174995e-04f, -2.701299199e-04f, + /* 1, 9 (24) */ + +4.077774633e-03f, +7.185400519e-03f, +1.133597866e-02f, +1.649379190e-02f, +2.251375516e-02f, +2.914185094e-02f, +3.602917687e-02f, +4.275888533e-02f, +4.888344231e-02f, +5.396806029e-02f, +5.763511870e-02f, +5.960404880e-02f, +5.972159935e-02f, +5.797856569e-02f, +5.451079873e-02f, +4.958436155e-02f, +4.356677263e-02f, +3.688806266e-02f, +2.999662057e-02f, +2.331533930e-02f, +1.720333121e-02f, +1.192752178e-02f, +7.646911971e-03f, +4.410466750e-03f, + -8.717165756e-03f, -1.300500216e-02f, -1.647702544e-02f, -1.783140250e-02f, -1.589057192e-02f, -9.935102679e-03f, +2.520871482e-05f, +1.312640567e-02f, +2.772295523e-02f, +4.165930679e-02f, +5.268770907e-02f, +5.893678546e-02f, +5.931700088e-02f, +5.376145426e-02f, +4.324076166e-02f, +2.954822637e-02f, +1.490998984e-02f, +1.518067933e-03f, -8.899686600e-03f, -1.537335752e-02f, -1.778947474e-02f, -1.678886108e-02f, -1.350967382e-02f, -9.256344192e-03f, + -1.605462403e-04f, -2.245949568e-04f, -2.898270411e-04f, -3.496891145e-04f, -3.972195913e-04f, -4.258801573e-04f, -4.304052395e-04f, -4.075507701e-04f, -3.566318012e-04f, -2.797639649e-04f, -1.817630045e-04f, -6.970393379e-05f, +4.781032135e-05f, +1.615791025e-04f, +2.628124281e-04f, +3.440856280e-04f, +4.001160478e-04f, +4.282635524e-04f, +4.286964203e-04f, +4.042118656e-04f, +3.597484994e-04f, +3.016692895e-04f, +2.369219327e-04f, +1.721951657e-04f, + +2.677294810e-04f, +2.571772862e-04f, +1.685455871e-04f, -1.305218783e-06f, -2.346724664e-04f, -4.938691005e-04f, -7.277940577e-04f, -8.830173267e-04f, -9.167389877e-04f, -8.082175138e-04f, -5.654559003e-04f, -2.250788795e-04f, +1.548702100e-04f, +5.075497148e-04f, +7.721875796e-04f, +9.073974534e-04f, +8.995787250e-04f, +7.644060876e-04f, +5.413105277e-04f, +2.827181000e-04f, +4.111047175e-05f, -1.426473226e-04f, -2.468645241e-04f, -2.709675269e-04f, + /* 1,10 (24) */ + +3.917228392e-03f, +6.960805562e-03f, +1.104615162e-02f, +1.614410278e-02f, +2.211653557e-02f, +2.871597079e-02f, +3.559877163e-02f, +4.235133456e-02f, +4.852681050e-02f, +5.368829633e-02f, +5.745335570e-02f, +5.953434487e-02f, +5.976940967e-02f, +5.814014479e-02f, +5.477361115e-02f, +4.992844718e-02f, +4.396688867e-02f, +3.731632621e-02f, +3.042531699e-02f, +2.371955116e-02f, +1.756307971e-02f, +1.222919107e-02f, +7.883833904e-03f, +4.582661915e-03f, + -8.449436275e-03f, -1.274782488e-02f, -1.630847986e-02f, -1.783270772e-02f, -1.612524439e-02f, -1.042897178e-02f, -7.025853429e-04f, +1.224338834e-02f, +2.680621624e-02f, +4.085108928e-02f, +5.212225317e-02f, +5.871170658e-02f, +5.947187109e-02f, +5.426900397e-02f, +4.401294924e-02f, +3.045562382e-02f, +1.580956857e-02f, +2.282474020e-03f, -8.358376073e-03f, -1.509063942e-02f, -1.774836427e-02f, -1.693150840e-02f, -1.375653835e-02f, -9.527311719e-03f, + -1.567145163e-04f, -2.204939308e-04f, -2.858356777e-04f, -3.462371119e-04f, -3.947386096e-04f, -4.247501074e-04f, -4.309029143e-04f, -4.098081809e-04f, -3.606105449e-04f, -2.852499031e-04f, -1.883827791e-04f, -7.696177919e-05f, +4.047991444e-05f, +1.547496110e-04f, +2.570024759e-04f, +3.397033418e-04f, +3.974177623e-04f, +4.273319557e-04f, +4.294404412e-04f, +4.063875313e-04f, +3.629971201e-04f, +3.055670693e-04f, +2.410338005e-04f, +1.761254183e-04f, + +2.661791237e-04f, +2.599899292e-04f, +1.765323633e-04f, +1.146314106e-05f, -2.188527386e-04f, -4.778414546e-04f, -7.149516148e-04f, -8.765221205e-04f, -9.187203972e-04f, -8.191675683e-04f, -5.839975600e-04f, -2.481883498e-04f, +1.312283164e-04f, +4.875295623e-04f, +7.591388741e-04f, +9.031475626e-04f, +9.040984124e-04f, +7.759307559e-04f, +5.568652287e-04f, +2.988897381e-04f, +5.485405554e-05f, -1.333757646e-04f, -2.427927233e-04f, -2.715553220e-04f, + /* 1,11 (24) */ + +3.760513876e-03f, +6.740311631e-03f, +1.076031594e-02f, +1.579786567e-02f, +2.172179696e-02f, +2.829122068e-02f, +3.516786871e-02f, +4.194152638e-02f, +4.816619996e-02f, +5.340304642e-02f, +5.726497292e-02f, +5.945738309e-02f, +5.980988958e-02f, +5.829489440e-02f, +5.503061363e-02f, +5.026815052e-02f, +4.436430644e-02f, +3.774365817e-02f, +3.085475743e-02f, +2.412593869e-02f, +1.792607683e-02f, +1.253475814e-02f, +8.124867704e-03f, +4.758787334e-03f, + -8.183257151e-03f, -1.248783495e-02f, -1.613194749e-02f, -1.782124458e-02f, -1.634409713e-02f, -1.090681323e-02f, -1.417536958e-03f, +1.136686622e-02f, +2.588749584e-02f, +4.003192171e-02f, +5.153825561e-02f, +5.846351823e-02f, +5.960309941e-02f, +5.475653353e-02f, +4.477208811e-02f, +3.135877139e-02f, +1.671366698e-02f, +3.058404776e-03f, -7.801510844e-03f, -1.479174968e-02f, -1.769351021e-02f, -1.706488416e-02f, -1.399933107e-02f, -9.798867041e-03f, + -1.529103426e-04f, -2.163993902e-04f, -2.818251702e-04f, -3.427385065e-04f, -3.921850012e-04f, -4.235262086e-04f, -4.312933190e-04f, -4.119548933e-04f, -3.644861934e-04f, -2.906510740e-04f, -1.949451810e-04f, -8.419588858e-05f, +3.313700212e-05f, +1.478727465e-04f, +2.511154556e-04f, +3.352225880e-04f, +3.946099562e-04f, +4.262908700e-04f, +4.300854583e-04f, +4.084832700e-04f, +3.661906908e-04f, +3.094371743e-04f, +2.451445209e-04f, +1.800772619e-04f, + +2.644038865e-04f, +2.624953972e-04f, +1.841933961e-04f, +2.396981877e-05f, -2.031497574e-04f, -4.617294493e-04f, -7.018108507e-04f, -8.695534551e-04f, -9.201385428e-04f, -8.295781937e-04f, -6.021386948e-04f, -2.711242241e-04f, +1.074944000e-04f, +4.671723146e-04f, +7.455825185e-04f, +8.983290016e-04f, +9.081056146e-04f, +7.870957839e-04f, +5.722677081e-04f, +3.151195712e-04f, +6.882199867e-05f, -1.237892318e-04f, -2.383998657e-04f, -2.718874504e-04f, + /* 1,12 (24) */ + +3.607603534e-03f, +6.523912241e-03f, +1.047849077e-02f, +1.545512716e-02f, +2.132961196e-02f, +2.786769447e-02f, +3.473657539e-02f, +4.152957148e-02f, +4.780171377e-02f, +5.311239535e-02f, +5.707002774e-02f, +5.937318720e-02f, +5.984302658e-02f, +5.844276715e-02f, +5.528172909e-02f, +5.060337311e-02f, +4.475891639e-02f, +3.816994904e-02f, +3.128484289e-02f, +2.453442196e-02f, +1.829226752e-02f, +1.284419531e-02f, +8.370012225e-03f, +4.938864596e-03f, + -7.918853265e-03f, -1.222533955e-02f, -1.594775410e-02f, -1.779727476e-02f, -1.654724689e-02f, -1.136854268e-02f, -2.119347808e-03f, +1.049731277e-02f, +2.496735730e-02f, +3.920234351e-02f, +5.093611691e-02f, +5.819239401e-02f, +5.971059381e-02f, +5.522370585e-02f, +4.551767063e-02f, +3.225710039e-02f, +1.762177259e-02f, +3.845500560e-03f, -7.229243136e-03f, -1.447663011e-02f, -1.762468821e-02f, -1.718867340e-02f, -1.423773094e-02f, -1.007075449e-02f, + -1.491348359e-04f, -2.123128096e-04f, -2.777972061e-04f, -3.391950078e-04f, -3.895602860e-04f, -4.222095865e-04f, -4.315770173e-04f, -4.139908027e-04f, -3.682579471e-04f, -2.959660430e-04f, -2.014482809e-04f, -9.140404286e-05f, +2.578385067e-05f, +1.409505737e-04f, +2.451530077e-04f, +3.306444157e-04f, +3.916929963e-04f, +4.251399738e-04f, +4.306305397e-04f, +4.104976870e-04f, +3.693275483e-04f, +3.132778847e-04f, +2.492525195e-04f, +1.840494321e-04f, + +2.624103371e-04f, +2.646972525e-04f, +1.915275290e-04f, +3.620830577e-05f, -1.875745925e-04f, -4.455465481e-04f, -6.883845401e-04f, -8.621201918e-04f, -9.209958781e-04f, -8.394443961e-04f, -6.198676315e-04f, -2.938705940e-04f, +8.368507996e-05f, +4.464915949e-04f, +7.315261995e-04f, +8.929420818e-04f, +9.115936458e-04f, +7.978895069e-04f, +5.875043727e-04f, +3.313953148e-04f, +8.300591000e-05f, -1.138908863e-04f, -2.336840048e-04f, -2.719582255e-04f, + /* 1,13 (24) */ + +3.458468698e-03f, +6.311599431e-03f, +1.020069357e-02f, +1.511593216e-02f, +2.094005167e-02f, +2.744548489e-02f, +3.430499838e-02f, +4.111558068e-02f, +4.743345582e-02f, +5.281642931e-02f, +5.686857946e-02f, +5.928178316e-02f, +5.986881044e-02f, +5.858371772e-02f, +5.552688209e-02f, +5.093401752e-02f, +4.515060939e-02f, +3.859508901e-02f, +3.171547343e-02f, +2.494491965e-02f, +1.866159507e-02f, +1.315747320e-02f, +8.619264745e-03f, +5.122914028e-03f, + -7.656442928e-03f, -1.196064230e-02f, -1.575622657e-02f, -1.776106646e-02f, -1.673482148e-02f, -1.181408923e-02f, -2.807732349e-03f, +9.635192575e-03f, +2.404636142e-02f, +3.836289912e-02f, +5.031624928e-02f, +5.789852341e-02f, +5.979427889e-02f, +5.567019744e-02f, +4.624919683e-02f, +3.315004247e-02f, +1.853336624e-02f, +4.643390067e-03f, -6.641738763e-03f, -1.414523479e-02f, -1.754168230e-02f, -1.730256428e-02f, -1.447141494e-02f, -1.034271272e-02f, + -1.453890870e-04f, -2.082356450e-04f, -2.737534645e-04f, -3.356083300e-04f, -3.868660020e-04f, -4.208013970e-04f, -4.317546116e-04f, -4.159158478e-04f, -3.719250490e-04f, -3.011934115e-04f, -2.078901751e-04f, -9.858403415e-05f, +1.842273085e-05f, +1.339851768e-04f, +2.391168051e-04f, +3.259699149e-04f, +3.886672932e-04f, +4.238789874e-04f, +4.310747882e-04f, +4.124294112e-04f, +3.724060396e-04f, +3.170874784e-04f, +2.533562076e-04f, +1.880406414e-04f, + +2.602051597e-04f, +2.665993037e-04f, +1.985339325e-04f, +4.817242024e-05f, -1.721380793e-04f, -4.293061488e-04f, -6.746855984e-04f, -8.542315214e-04f, -9.212953056e-04f, -8.487616438e-04f, -6.371730579e-04f, -3.164117194e-04f, +5.981704284e-05f, +4.255013118e-04f, +7.169780354e-04f, +8.869875835e-04f, +9.145562136e-04f, +8.083004890e-04f, +6.025616528e-04f, +3.477045164e-04f, +9.739710104e-05f, -1.036842282e-04f, -2.286434837e-04f, -2.717621372e-04f, + /* 1,14 (24) */ + +3.313079611e-03f, +6.103363786e-03f, +9.926940101e-03f, +1.478032383e-02f, +2.055318567e-02f, +2.702468349e-02f, +3.387324377e-02f, +4.069966483e-02f, +4.706153077e-02f, +5.251523590e-02f, +5.666068928e-02f, +5.918319912e-02f, +5.988723317e-02f, +5.871770290e-02f, +5.576599890e-02f, +5.125998744e-02f, +4.553927668e-02f, +3.901896800e-02f, +3.214654822e-02f, +2.535734906e-02f, +1.903400111e-02f, +1.347456067e-02f, +8.872620952e-03f, +5.310954669e-03f, + -7.396237768e-03f, -1.169404300e-02f, -1.555769263e-02f, -1.771289404e-02f, -1.690695956e-02f, -1.224339538e-02f, -3.482417947e-03f, +8.780961054e-03f, +2.312506611e-02f, +3.751413748e-02f, +4.967907622e-02f, +5.758211169e-02f, +5.985409593e-02f, +5.609569875e-02f, +4.696617487e-02f, +3.403703005e-02f, +1.944792245e-02f, +5.451690556e-03f, -6.039177110e-03f, -1.379753027e-02f, -1.744428520e-02f, -1.740624851e-02f, -1.470005842e-02f, -1.061447485e-02f, + -1.416741607e-04f, -2.041693330e-04f, -2.696956158e-04f, -3.319801912e-04f, -3.841037044e-04f, -4.193028253e-04f, -4.318267432e-04f, -4.177300107e-04f, -3.754867850e-04f, -3.063318181e-04f, -2.142689858e-04f, -1.057336668e-04f, +1.105591687e-05f, +1.269786586e-04f, +2.330085517e-04f, +3.212002155e-04f, +3.855333010e-04f, +4.225076726e-04f, +4.314173415e-04f, +4.142770958e-04f, +3.754245234e-04f, +3.208642311e-04f, +2.574539829e-04f, +1.920495797e-04f, + +2.577951457e-04f, +2.682055987e-04f, +2.052121014e-04f, +5.985630987e-05f, -1.568508104e-04f, -4.130215719e-04f, -6.607270683e-04f, -8.458969541e-04f, -9.210401721e-04f, -8.575258695e-04f, -6.540440323e-04f, -3.387320427e-04f, +3.590702749e-05f, +4.042156479e-04f, +7.019465696e-04f, +8.804667570e-04f, +9.169874259e-04f, +8.183175346e-04f, +6.174260146e-04f, +3.640345662e-04f, +1.119865916e-04f, -9.317309612e-05f, -2.232769411e-04f, -2.712938608e-04f, + /* 1,15 (24) */ + +3.171405450e-03f, +5.899194453e-03f, +9.657244486e-03f, +1.444834364e-02f, +2.016908197e-02f, +2.660538066e-02f, +3.344141702e-02f, +4.028193482e-02f, +4.668604398e-02f, +5.220890408e-02f, +5.644642030e-02f, +5.907746546e-02f, +5.989828908e-02f, +5.884468156e-02f, +5.599900745e-02f, +5.158118765e-02f, +4.592480998e-02f, +3.944147567e-02f, +3.257796556e-02f, +2.577162616e-02f, +1.940942563e-02f, +1.379542491e-02f, +9.130074935e-03f, +5.503004249e-03f, + -7.138442622e-03f, -1.142583740e-02f, -1.535248053e-02f, -1.765303773e-02f, -1.706381037e-02f, -1.265641695e-02f, -4.143145015e-03f, +7.935064099e-03f, +2.220402594e-02f, +3.665661161e-02f, +4.902503219e-02f, +5.724337965e-02f, +5.989000296e-02f, +5.649991440e-02f, +4.766812144e-02f, +3.491749681e-02f, +2.036490988e-02f, +6.270008090e-03f, -5.421751096e-03f, -1.343349571e-02f, -1.733229861e-02f, -1.749942161e-02f, -1.492333537e-02f, -1.088576871e-02f, + -1.379910952e-04f, -2.001152905e-04f, -2.656253207e-04f, -3.283123126e-04f, -3.812749648e-04f, -4.177150854e-04f, -4.317940913e-04f, -4.194333165e-04f, -3.789424838e-04f, -3.113799387e-04f, -2.205828625e-04f, -1.128507582e-04f, +3.685685399e-06f, +1.199331400e-04f, +2.268299826e-04f, +3.163364871e-04f, +3.822915174e-04f, +4.210258335e-04f, +4.316573727e-04f, +4.160394191e-04f, +3.783813704e-04f, +3.246064176e-04f, +2.615442299e-04f, +1.960749141e-04f, + +2.551871856e-04f, +2.695204175e-04f, +2.115618514e-04f, +7.125445421e-05f, -1.417231279e-04f, -3.967060483e-04f, -6.465221071e-04f, -8.371263083e-04f, -9.202342634e-04f, -8.657334732e-04f, -6.704699924e-04f, -3.608162026e-04f, +1.197181021e-05f, +3.826490473e-04f, +6.864407641e-04f, +8.733813231e-04f, +9.188817989e-04f, +8.279297007e-04f, +6.320839735e-04f, +3.803727076e-04f, +1.267651157e-04f, -8.236166666e-05f, -2.175833157e-04f, -2.705482644e-04f, + /* 2, 0 (24) */ + -5.457237816e-03f, -5.749299516e-03f, -3.461751951e-03f, +2.582273506e-03f, +1.313454258e-02f, +2.821995581e-02f, +4.696043930e-02f, +6.759089318e-02f, +8.768840227e-02f, +1.045803996e-01f, +1.158471781e-01f, +1.198039495e-01f, +1.158471781e-01f, +1.045803996e-01f, +8.768840227e-02f, +6.759089318e-02f, +4.696043930e-02f, +2.821995581e-02f, +1.313454258e-02f, +2.582273506e-03f, -3.461751951e-03f, -5.749299516e-03f, -5.457237816e-03f, -3.849841082e-03f, + +4.983817699e-03f, -1.227513667e-04f, -9.809575408e-03f, -2.203309842e-02f, -3.273451869e-02f, -3.710431359e-02f, -3.150070121e-02f, -1.524079756e-02f, +8.576361107e-03f, +3.371394239e-02f, +5.279197856e-02f, +5.990197477e-02f, +5.279197856e-02f, +3.371394239e-02f, +8.576361107e-03f, -1.524079756e-02f, -3.150070121e-02f, -3.710431359e-02f, -3.273451869e-02f, -2.203309842e-02f, -9.809575408e-03f, -1.227513667e-04f, +4.983817699e-03f, +5.702431282e-03f, + +7.447335023e-05f, -4.396091421e-05f, -2.422447510e-04f, -5.051464861e-04f, -7.964121267e-04f, -1.063741346e-03f, -1.248955534e-03f, -1.301173316e-03f, -1.189717810e-03f, -9.132707466e-04f, -5.025821872e-04f, -1.565749561e-05f, +4.736669608e-04f, +8.910528549e-04f, +1.177113412e-03f, +1.299176747e-03f, +1.256559625e-03f, +1.078316198e-03f, +8.144211337e-04f, +5.229980927e-04f, +2.570578584e-04f, +5.406346933e-05f, -6.940512698e-05f, -1.171960904e-04f, + +1.610944214e-04f, +4.619052037e-04f, +7.126502117e-04f, +7.688324450e-04f, +5.316250007e-04f, +6.905729617e-06f, -6.740237072e-04f, -1.288481522e-03f, -1.602915254e-03f, -1.468219911e-03f, -8.881672048e-04f, -2.854291356e-05f, +8.401694814e-04f, +1.444053089e-03f, +1.608473031e-03f, +1.319082469e-03f, +7.169441422e-04f, +3.305666933e-05f, -5.065084646e-04f, -7.631614087e-04f, -7.232615691e-04f, -4.805646748e-04f, -1.787500512e-04f, +5.547479234e-05f, + /* 2, 1 (24) */ + -5.382764466e-03f, -5.793260431e-03f, -3.703996702e-03f, +2.077127020e-03f, +1.233813045e-02f, +2.715621446e-02f, +4.571148376e-02f, +6.628971986e-02f, +8.649868446e-02f, +1.036671289e-01f, +1.153445960e-01f, +1.197882920e-01f, +1.163208451e-01f, +1.054714525e-01f, +8.886551568e-02f, +6.889006993e-02f, +4.821699892e-02f, +2.929827201e-02f, +1.394896371e-02f, +3.105271599e-03f, -3.204694092e-03f, -5.695236047e-03f, -5.526642943e-03f, -3.967037172e-03f, + +5.144912120e-03f, +3.391538370e-04f, -9.096925196e-03f, -2.126426598e-02f, -3.220289369e-02f, -3.709740786e-02f, -3.217472492e-02f, -1.652927908e-02f, +6.973445853e-03f, +3.224572248e-02f, +5.190381135e-02f, +5.987343185e-02f, +5.363214804e-02f, +3.515799548e-02f, +1.018483414e-02f, -1.392171509e-02f, -3.078375707e-02f, -3.707125692e-02f, -3.324102715e-02f, -2.279625983e-02f, -1.053283698e-02f, -6.033160415e-04f, +4.805067648e-03f, +5.757906075e-03f, + +7.924428113e-05f, -3.417704185e-05f, -2.276911350e-04f, -4.874111149e-04f, -7.783116620e-04f, -1.048843356e-03f, -1.240825207e-03f, -1.302520727e-03f, -1.201666972e-03f, -9.349551213e-04f, -5.311943066e-04f, -4.696294436e-05f, +4.444657095e-04f, +8.683130181e-04f, +1.163857688e-03f, +1.296526957e-03f, +1.263626965e-03f, +1.092553812e-03f, +8.323243973e-04f, +5.409545148e-04f, +2.721238813e-04f, +6.448351439e-05f, -6.403626576e-05f, -1.161209850e-04f, + +1.437495025e-04f, +4.430579567e-04f, +7.012637304e-04f, +7.733217142e-04f, +5.555752224e-04f, +4.622611733e-05f, -6.308478599e-04f, -1.256679994e-03f, -1.595550745e-03f, -1.490591427e-03f, -9.350368534e-04f, -8.559205927e-05f, +7.911031327e-04f, +1.418114570e-03f, +1.612204906e-03f, +1.348431235e-03f, +7.595474433e-04f, +7.361331520e-05f, -4.802437219e-04f, -7.562953008e-04f, -7.330641614e-04f, -4.989997239e-04f, -1.966919200e-04f, +4.440305368e-05f, + /* 2, 2 (24) */ + -5.303520185e-03f, -5.827437472e-03f, -3.931687837e-03f, +1.589715905e-03f, +1.155981879e-02f, +2.610737111e-02f, +4.447065856e-02f, +6.498719914e-02f, +8.529701749e-02f, +1.027321738e-01f, +1.148134017e-01f, +1.197413291e-01f, +1.167653108e-01f, +1.063397655e-01f, +9.002937337e-02f, +7.018659688e-02f, +4.948062589e-02f, +3.039082582e-02f, +1.478128811e-02f, +3.646226113e-03f, -2.932570211e-03f, -5.630752533e-03f, -5.590679209e-03f, -4.083158157e-03f, + +5.288661623e-03f, +7.822117937e-04f, -8.395661465e-03f, -2.049094426e-02f, -3.164731846e-02f, -3.705118174e-02f, -3.280557278e-02f, -1.778595908e-02f, +5.377895108e-03f, +3.075513105e-02f, +5.096877450e-02f, +5.978783980e-02f, +5.442325117e-02f, +3.657611005e-02f, +1.179703904e-02f, -1.257328386e-02f, -3.002420963e-02f, -3.699764360e-02f, -3.372127087e-02f, -2.355255513e-02f, -1.126590114e-02f, -1.102315765e-03f, +4.608375728e-03f, +5.802309129e-03f, + +8.372149579e-05f, -2.471272391e-05f, -2.134032501e-04f, -4.698031407e-04f, -7.601339276e-04f, -1.033636441e-03f, -1.232179476e-03f, -1.303223507e-03f, -1.212957498e-03f, -9.560948405e-04f, -5.594864885e-04f, -7.823977369e-05f, +4.149957535e-04f, +8.450632330e-04f, +1.149955055e-03f, +1.293220355e-03f, +1.270147369e-03f, +1.106440210e-03f, +8.501075458e-04f, +5.590040813e-04f, +2.874359097e-04f, +7.521953202e-05f, -5.836365872e-05f, -1.148160727e-04f, + +1.267386733e-04f, +4.240592003e-04f, +6.891364809e-04f, +7.766442229e-04f, +5.783430865e-04f, +8.485825299e-05f, -5.874781133e-04f, -1.223730844e-03f, -1.586401168e-03f, -1.511146685e-03f, -9.807206967e-04f, -1.425312172e-04f, +7.410292380e-04f, +1.390430588e-03f, +1.614094247e-03f, +1.376477675e-03f, +8.017717782e-04f, +1.147149834e-04f, -4.528509384e-04f, -7.482225637e-04f, -7.420251329e-04f, -5.171733863e-04f, -2.148944892e-04f, +3.280060770e-05f, + /* 2, 3 (24) */ + -5.219798689e-03f, -5.852150196e-03f, -4.145091087e-03f, +1.119912764e-03f, +1.079968486e-02f, +2.507373467e-02f, +4.323847908e-02f, +6.368397563e-02f, +8.408405999e-02f, +1.017760789e-01f, +1.142539152e-01f, +1.196630893e-01f, +1.171803066e-01f, +1.071848287e-01f, +9.117932843e-02f, +7.147981724e-02f, +5.075077326e-02f, +3.149726603e-02f, +1.563139565e-02f, +4.205230195e-03f, -2.645134301e-03f, -5.555533001e-03f, -5.649042868e-03f, -4.197974230e-03f, + +5.415400296e-03f, +1.206270994e-03f, -7.706524985e-03f, -1.971430004e-02f, -3.106897538e-02f, -3.696632349e-02f, -3.339305089e-02f, -1.900968992e-02f, +3.791493940e-03f, +2.924398436e-02f, +4.998805380e-02f, +5.964530858e-02f, +5.516428041e-02f, +3.796654063e-02f, +1.341113329e-02f, -1.119680618e-02f, -2.922243785e-02f, -3.688292862e-02f, -3.417412181e-02f, -2.430077770e-02f, -1.200792627e-02f, -1.619489152e-03f, +4.393481238e-03f, +5.835109736e-03f, + +8.790879338e-05f, -1.556851470e-05f, -1.993869984e-04f, -4.523334583e-04f, -7.418930018e-04f, -1.018134912e-03f, -1.223029481e-03f, -1.303286642e-03f, -1.223586498e-03f, -9.766792073e-04f, -5.874421685e-04f, -1.094689306e-04f, +3.852746369e-04f, +8.213159125e-04f, +1.135410439e-03f, +1.289253825e-03f, +1.276110995e-03f, +1.119961557e-03f, +8.677561346e-04f, +5.771348786e-04f, +3.029867020e-04f, +8.626967713e-05f, -5.238444285e-05f, -1.132755013e-04f, + +1.100841935e-04f, +4.049447613e-04f, +6.763034625e-04f, +7.788166310e-04f, +5.999146171e-04f, +1.227574793e-04f, -5.439756757e-04f, -1.189688301e-03f, -1.575490638e-03f, -1.529867409e-03f, -1.025162808e-03f, -1.992872499e-04f, +6.900104146e-04f, +1.361029974e-03f, +1.614126997e-03f, +1.403173181e-03f, +8.435553022e-04f, +1.563110555e-04f, -4.243523280e-04f, -7.389334301e-04f, -7.501124831e-04f, -5.350484419e-04f, -2.333311836e-04f, +2.067529037e-05f, + /* 2, 4 (24) */ + -5.131889896e-03f, -5.867718711e-03f, -4.344478085e-03f, +6.675793059e-04f, +1.005779186e-02f, +2.405559975e-02f, +4.201544960e-02f, +6.238068899e-02f, +8.286047349e-02f, +1.007993997e-01f, +1.136664730e-01f, +1.195536204e-01f, +1.175655812e-01f, +1.080061447e-01f, +9.231473886e-02f, +7.276907106e-02f, +5.202688425e-02f, +3.261722759e-02f, +1.649915179e-02f, +4.782365073e-03f, -2.342147599e-03f, -5.469263323e-03f, -5.701427310e-03f, -4.311249731e-03f, + +5.525484490e-03f, +1.611215755e-03f, -7.030221522e-03f, -1.893548341e-02f, -3.046906076e-02f, -3.684356601e-02f, -3.393702657e-02f, -2.019937822e-02f, +2.216003302e-03f, +2.771411696e-02f, +4.896289099e-02f, +5.944602133e-02f, +5.585429082e-02f, +3.932757061e-02f, +1.502526029e-02f, -9.793633001e-03f, -2.837888255e-02f, -3.672661756e-02f, -3.459847414e-02f, -2.503971113e-02f, -1.275803875e-02f, -2.154537594e-03f, +4.160150055e-03f, +5.855785027e-03f, + +9.181018856e-05f, -6.744655180e-06f, -1.856479425e-04f, -4.350126895e-04f, -7.236028412e-04f, -1.002353166e-03f, -1.213386654e-03f, -1.302715571e-03f, -1.233551590e-03f, -9.966979741e-04f, -6.150450611e-04f, -1.406314021e-04f, +3.553201127e-04f, +7.970838758e-04f, +1.120229268e-03f, +1.284624736e-03f, +1.281508348e-03f, +1.133104170e-03f, +8.852556579e-04f, +5.953347587e-04f, +3.187686877e-04f, +9.763177411e-05f, -4.609600695e-05f, -1.114935439e-04f, + +9.380718275e-05f, +3.857499684e-04f, +6.628002469e-04f, +7.798572015e-04f, +6.202779047e-04f, +1.598807795e-04f, -5.004013551e-04f, -1.154607768e-03f, -1.562845666e-03f, -1.546738023e-03f, -1.068309149e-03f, -2.557873015e-04f, +6.381107241e-04f, +1.329944115e-03f, +1.612291711e-03f, +1.428470775e-03f, +8.848362575e-04f, +1.983495881e-04f, -3.947721387e-04f, -7.284199629e-04f, -7.572951362e-04f, -5.525874792e-04f, -2.519744239e-04f, +8.036155108e-06f, + /* 2, 5 (24) */ + -5.040079707e-03f, -5.874463366e-03f, -4.530126028e-03f, +2.325666164e-04f, +9.334189017e-03f, +2.305324659e-02f, +4.080206294e-02f, +6.107797342e-02f, +8.162692190e-02f, +9.980270174e-02f, +1.130514279e-01f, +1.194129890e-01f, +1.179209013e-01f, +1.088032285e-01f, +9.343496813e-02f, +7.405369580e-02f, +5.330839260e-02f, +3.375033176e-02f, +1.738440745e-02f, +5.377699832e-03f, -2.023378911e-03f, -5.371631549e-03f, -5.747523317e-03f, -4.422743275e-03f, + +5.619291672e-03f, +1.996965724e-03f, -6.367421275e-03f, -1.815562621e-02f, -2.984878286e-02f, -3.668368523e-02f, -3.443742792e-02f, -2.135398599e-02f, +6.531576364e-04f, +2.616737893e-02f, +4.789458185e-02f, +5.919023403e-02f, +5.649240155e-02f, +4.065751472e-02f, +1.663755200e-02f, -8.365162226e-03f, -2.749404629e-02f, -3.652826797e-02f, -3.499324628e-02f, -2.576813109e-02f, -1.351533389e-02f, -2.707125073e-03f, +3.908175631e-03f, +5.863821182e-03f, + +9.542990372e-05f, +1.758922717e-06f, -1.721913048e-04f, -4.178511756e-04f, -7.052772694e-04f, -9.863056699e-04f, -1.203262712e-03f, -1.301516175e-03f, -1.242850904e-03f, -1.016141350e-03f, -6.422791733e-04f, -1.717082308e-04f, +3.251501290e-04f, +7.723803390e-04f, +1.104417471e-03f, +1.279330942e-03f, +1.286330301e-03f, +1.145854529e-03f, +9.025915620e-04f, +6.135913483e-04f, +3.347739708e-04f, +1.093033143e-04f, -3.949599835e-05f, -1.094646074e-04f, + +7.792760007e-05f, +3.665095964e-04f, +6.486629068e-04f, +7.797857477e-04f, +6.394231019e-04f, +1.961868304e-04f, -4.568154653e-04f, -1.118545727e-03f, -1.548495109e-03f, -1.561745660e-03f, -1.110107646e-03f, -3.119589095e-04f, +5.853955751e-04f, +1.297206916e-03f, +1.608579579e-03f, +1.452325189e-03f, +9.255530727e-04f, +2.407773855e-04f, -3.641366350e-04f, -7.166760930e-04f, -7.635430099e-04f, -5.697529608e-04f, -2.707956610e-04f, -5.106521924e-06f, + /* 2, 6 (24) */ + -4.944649803e-03f, -5.872704443e-03f, -4.702317332e-03f, -1.852845592e-04f, +8.628911748e-03f, +2.206694092e-02f, +3.959880023e-02f, +5.977645724e-02f, +8.038407100e-02f, +9.878656039e-02f, +1.124091488e-01f, +1.192412808e-01f, +1.182460515e-01f, +1.095756089e-01f, +9.453938560e-02f, +7.533302674e-02f, +5.459472290e-02f, +3.489618629e-02f, +1.828699901e-02f, +5.991291180e-03f, -1.688604941e-03f, -5.262328235e-03f, -5.787019316e-03f, -4.532207882e-03f, + +5.697219272e-03f, +2.363475320e-03f, -5.718758368e-03f, -1.737584046e-02f, -2.920935975e-02f, -3.648749840e-02f, -3.489424339e-02f, -2.247253172e-02f, -8.953374729e-04f, +2.460563327e-02f, +4.678447420e-02f, +5.887827512e-02f, +5.707779712e-02f, +4.195472164e-02f, +1.824613158e-02f, -6.912837038e-03f, -2.656849322e-02f, -3.628749059e-02f, -3.535738291e-02f, -2.648480718e-02f, -1.427887690e-02f, -3.276878034e-03f, +3.637379970e-03f, +5.858714660e-03f, + +9.877236116e-05f, +9.942591461e-06f, -1.590219669e-04f, -4.008589712e-04f, -6.869299656e-04f, -9.700069480e-04f, -1.192669640e-03f, -1.299694773e-03f, -1.251483081e-03f, -1.035000008e-03f, -6.691288173e-04f, -2.026805313e-04f, +2.947828133e-04f, +7.472189048e-04f, +1.087981479e-03f, +1.273370789e-03f, +1.290568097e-03f, +1.158199297e-03f, +9.197492578e-04f, +6.318920578e-04f, +3.509943333e-04f, +1.212814540e-04f, -3.258232942e-05f, -1.071832408e-04f, + +6.246422727e-05f, +3.472578112e-04f, +6.339279443e-04f, +7.786235782e-04f, +6.573424148e-04f, +2.316360532e-04f, -4.132777339e-04f, -1.081559642e-03f, -1.532470114e-03f, -1.574880176e-03f, -1.150508270e-03f, -3.677301159e-04f, +5.319316244e-04f, +1.262854755e-03f, +1.602984462e-03f, +1.474692948e-03f, +9.656444630e-04f, +2.835400742e-04f, -3.324740767e-04f, -7.036976533e-04f, -7.688270825e-04f, -5.865072905e-04f, -2.897654137e-04f, -1.874123877e-05f, + /* 2, 7 (24) */ + -4.845877442e-03f, -5.862761852e-03f, -4.861339299e-03f, -5.861435304e-04f, +7.941981782e-03f, +2.109693397e-02f, +3.840613059e-02f, +5.847676247e-02f, +7.913258792e-02f, +9.775156039e-02f, +1.117400199e-01f, +1.190386002e-01f, +1.185408343e-01f, +1.103228278e-01f, +9.562736708e-02f, +7.660639753e-02f, +5.588529100e-02f, +3.605438558e-02f, +1.920674827e-02f, +6.623183238e-03f, -1.337610607e-03f, -5.141046781e-03f, -5.819601645e-03f, -4.639391123e-03f, + +5.759683500e-03f, +2.710733131e-03f, -5.084830424e-03f, -1.659721688e-02f, -2.855201734e-02f, -3.625586234e-02f, -3.530752112e-02f, -2.355409136e-02f, -2.427807587e-03f, +2.303075310e-02f, +4.563396593e-02f, +5.851054500e-02f, +5.760972875e-02f, +4.321757639e-02f, +1.984911604e-02f, -5.438144089e-03f, -2.560284875e-02f, -3.600395051e-02f, -3.568985699e-02f, -2.718850484e-02f, -1.504770398e-02f, -3.863385324e-03f, +3.347614556e-03f, +5.839973421e-03f, + +1.018421751e-04f, +1.780702306e-05f, -1.461444695e-04f, -3.840458379e-04f, -6.685744535e-04f, -9.534715695e-04f, -1.181619683e-03f, -1.297258112e-03f, -1.259447268e-03f, -1.053265089e-03f, -6.955786233e-04f, -2.335295054e-04f, +2.642364581e-04f, +7.216135516e-04f, +1.070928213e-03f, +1.266743117e-03f, +1.294213361e-03f, +1.170125328e-03f, +9.367141338e-04f, +6.502240907e-04f, +3.674212390e-04f, +1.335630122e-04f, -2.535318391e-05f, -1.046441437e-04f, + +4.743465426e-05f, +3.280281174e-04f, +6.186322196e-04f, +7.763934401e-04f, +6.740300923e-04f, +2.661906593e-04f, -3.698472109e-04f, -1.043707865e-03f, -1.514804050e-03f, -1.586134153e-03f, -1.189463108e-03f, -4.230295777e-04f, +4.777866761e-04f, +1.226926429e-03f, +1.595502904e-03f, +1.495532453e-03f, +1.005049531e-03f, +3.265821805e-04f, -2.998146942e-04f, -6.894824103e-04f, -7.731194598e-04f, -6.028128803e-04f, -3.088533075e-04f, -3.285526714e-05f, + /* 2, 8 (24) */ + -4.744035267e-03f, -5.844954829e-03f, -5.007483769e-03f, -9.701893683e-04f, +7.273407329e-03f, +2.014346240e-02f, +3.722451091e-02f, +5.717950436e-02f, +7.787314065e-02f, +9.669829530e-02f, +1.110444413e-01f, +1.188050707e-01f, +1.188050707e-01f, +1.110444413e-01f, +9.669829530e-02f, +7.787314065e-02f, +5.717950436e-02f, +3.722451091e-02f, +2.014346240e-02f, +7.273407329e-03f, -9.701893683e-04f, -5.007483769e-03f, -5.844954829e-03f, -4.744035267e-03f, + +5.807118154e-03f, +3.038761249e-03f, -4.466198204e-03f, -1.582082344e-02f, -2.787798725e-02f, -3.598967168e-02f, -3.567736833e-02f, -2.459779922e-02f, -3.942611637e-03f, +2.144461894e-02f, +4.444450282e-02f, +5.808751542e-02f, +5.808751542e-02f, +4.444450282e-02f, +2.144461894e-02f, -3.942611637e-03f, -2.459779922e-02f, -3.567736833e-02f, -3.598967168e-02f, -2.787798725e-02f, -1.582082344e-02f, -4.466198204e-03f, +3.038761249e-03f, +5.807118154e-03f, + +1.046441437e-04f, +2.535318391e-05f, -1.335630122e-04f, -3.674212390e-04f, -6.502240907e-04f, -9.367141338e-04f, -1.170125328e-03f, -1.294213361e-03f, -1.266743117e-03f, -1.070928213e-03f, -7.216135516e-04f, -2.642364581e-04f, +2.335295054e-04f, +6.955786233e-04f, +1.053265089e-03f, +1.259447268e-03f, +1.297258112e-03f, +1.181619683e-03f, +9.534715695e-04f, +6.685744535e-04f, +3.840458379e-04f, +1.461444695e-04f, -1.780702306e-05f, -1.018421751e-04f, + +3.285526714e-05f, +3.088533075e-04f, +6.028128803e-04f, +7.731194598e-04f, +6.894824103e-04f, +2.998146942e-04f, -3.265821805e-04f, -1.005049531e-03f, -1.495532453e-03f, -1.595502904e-03f, -1.226926429e-03f, -4.777866761e-04f, +4.230295777e-04f, +1.189463108e-03f, +1.586134153e-03f, +1.514804050e-03f, +1.043707865e-03f, +3.698472109e-04f, -2.661906593e-04f, -6.740300923e-04f, -7.763934401e-04f, -6.186322196e-04f, -3.280281174e-04f, -4.743465426e-05f, + /* 2, 9 (24) */ + -4.639391123e-03f, -5.819601645e-03f, -5.141046781e-03f, -1.337610607e-03f, +6.623183238e-03f, +1.920674827e-02f, +3.605438558e-02f, +5.588529100e-02f, +7.660639753e-02f, +9.562736708e-02f, +1.103228278e-01f, +1.185408343e-01f, +1.190386002e-01f, +1.117400199e-01f, +9.775156039e-02f, +7.913258792e-02f, +5.847676247e-02f, +3.840613059e-02f, +2.109693397e-02f, +7.941981782e-03f, -5.861435304e-04f, -4.861339299e-03f, -5.862761852e-03f, -4.845877442e-03f, + +5.839973421e-03f, +3.347614556e-03f, -3.863385324e-03f, -1.504770398e-02f, -2.718850484e-02f, -3.568985699e-02f, -3.600395051e-02f, -2.560284875e-02f, -5.438144089e-03f, +1.984911604e-02f, +4.321757639e-02f, +5.760972875e-02f, +5.851054500e-02f, +4.563396593e-02f, +2.303075310e-02f, -2.427807587e-03f, -2.355409136e-02f, -3.530752112e-02f, -3.625586234e-02f, -2.855201734e-02f, -1.659721688e-02f, -5.084830424e-03f, +2.710733131e-03f, +5.759683500e-03f, + +1.071832408e-04f, +3.258232942e-05f, -1.212814540e-04f, -3.509943333e-04f, -6.318920578e-04f, -9.197492578e-04f, -1.158199297e-03f, -1.290568097e-03f, -1.273370789e-03f, -1.087981479e-03f, -7.472189048e-04f, -2.947828133e-04f, +2.026805313e-04f, +6.691288173e-04f, +1.035000008e-03f, +1.251483081e-03f, +1.299694773e-03f, +1.192669640e-03f, +9.700069480e-04f, +6.869299656e-04f, +4.008589712e-04f, +1.590219669e-04f, -9.942591461e-06f, -9.877236116e-05f, + +1.874123877e-05f, +2.897654137e-04f, +5.865072905e-04f, +7.688270825e-04f, +7.036976533e-04f, +3.324740767e-04f, -2.835400742e-04f, -9.656444630e-04f, -1.474692948e-03f, -1.602984462e-03f, -1.262854755e-03f, -5.319316244e-04f, +3.677301159e-04f, +1.150508270e-03f, +1.574880176e-03f, +1.532470114e-03f, +1.081559642e-03f, +4.132777339e-04f, -2.316360532e-04f, -6.573424148e-04f, -7.786235782e-04f, -6.339279443e-04f, -3.472578112e-04f, -6.246422727e-05f, + /* 2,10 (24) */ + -4.532207882e-03f, -5.787019316e-03f, -5.262328235e-03f, -1.688604941e-03f, +5.991291180e-03f, +1.828699901e-02f, +3.489618629e-02f, +5.459472290e-02f, +7.533302674e-02f, +9.453938560e-02f, +1.095756089e-01f, +1.182460515e-01f, +1.192412808e-01f, +1.124091488e-01f, +9.878656039e-02f, +8.038407100e-02f, +5.977645724e-02f, +3.959880023e-02f, +2.206694092e-02f, +8.628911748e-03f, -1.852845592e-04f, -4.702317332e-03f, -5.872704443e-03f, -4.944649803e-03f, + +5.858714660e-03f, +3.637379970e-03f, -3.276878034e-03f, -1.427887690e-02f, -2.648480718e-02f, -3.535738291e-02f, -3.628749059e-02f, -2.656849322e-02f, -6.912837038e-03f, +1.824613158e-02f, +4.195472164e-02f, +5.707779712e-02f, +5.887827512e-02f, +4.678447420e-02f, +2.460563327e-02f, -8.953374729e-04f, -2.247253172e-02f, -3.489424339e-02f, -3.648749840e-02f, -2.920935975e-02f, -1.737584046e-02f, -5.718758368e-03f, +2.363475320e-03f, +5.697219272e-03f, + +1.094646074e-04f, +3.949599835e-05f, -1.093033143e-04f, -3.347739708e-04f, -6.135913483e-04f, -9.025915620e-04f, -1.145854529e-03f, -1.286330301e-03f, -1.279330942e-03f, -1.104417471e-03f, -7.723803390e-04f, -3.251501290e-04f, +1.717082308e-04f, +6.422791733e-04f, +1.016141350e-03f, +1.242850904e-03f, +1.301516175e-03f, +1.203262712e-03f, +9.863056699e-04f, +7.052772694e-04f, +4.178511756e-04f, +1.721913048e-04f, -1.758922717e-06f, -9.542990372e-05f, + +5.106521924e-06f, +2.707956610e-04f, +5.697529608e-04f, +7.635430099e-04f, +7.166760930e-04f, +3.641366350e-04f, -2.407773855e-04f, -9.255530727e-04f, -1.452325189e-03f, -1.608579579e-03f, -1.297206916e-03f, -5.853955751e-04f, +3.119589095e-04f, +1.110107646e-03f, +1.561745660e-03f, +1.548495109e-03f, +1.118545727e-03f, +4.568154653e-04f, -1.961868304e-04f, -6.394231019e-04f, -7.797857477e-04f, -6.486629068e-04f, -3.665095964e-04f, -7.792760007e-05f, + /* 2,11 (24) */ + -4.422743275e-03f, -5.747523317e-03f, -5.371631549e-03f, -2.023378911e-03f, +5.377699832e-03f, +1.738440745e-02f, +3.375033176e-02f, +5.330839260e-02f, +7.405369580e-02f, +9.343496813e-02f, +1.088032285e-01f, +1.179209013e-01f, +1.194129890e-01f, +1.130514279e-01f, +9.980270174e-02f, +8.162692190e-02f, +6.107797342e-02f, +4.080206294e-02f, +2.305324659e-02f, +9.334189017e-03f, +2.325666164e-04f, -4.530126028e-03f, -5.874463366e-03f, -5.040079707e-03f, + +5.863821182e-03f, +3.908175631e-03f, -2.707125073e-03f, -1.351533389e-02f, -2.576813109e-02f, -3.499324628e-02f, -3.652826797e-02f, -2.749404629e-02f, -8.365162226e-03f, +1.663755200e-02f, +4.065751472e-02f, +5.649240155e-02f, +5.919023403e-02f, +4.789458185e-02f, +2.616737893e-02f, +6.531576364e-04f, -2.135398599e-02f, -3.443742792e-02f, -3.668368523e-02f, -2.984878286e-02f, -1.815562621e-02f, -6.367421275e-03f, +1.996965724e-03f, +5.619291672e-03f, + +1.114935439e-04f, +4.609600695e-05f, -9.763177411e-05f, -3.187686877e-04f, -5.953347587e-04f, -8.852556579e-04f, -1.133104170e-03f, -1.281508348e-03f, -1.284624736e-03f, -1.120229268e-03f, -7.970838758e-04f, -3.553201127e-04f, +1.406314021e-04f, +6.150450611e-04f, +9.966979741e-04f, +1.233551590e-03f, +1.302715571e-03f, +1.213386654e-03f, +1.002353166e-03f, +7.236028412e-04f, +4.350126895e-04f, +1.856479425e-04f, +6.744655180e-06f, -9.181018856e-05f, + -8.036155108e-06f, +2.519744239e-04f, +5.525874792e-04f, +7.572951362e-04f, +7.284199629e-04f, +3.947721387e-04f, -1.983495881e-04f, -8.848362575e-04f, -1.428470775e-03f, -1.612291711e-03f, -1.329944115e-03f, -6.381107241e-04f, +2.557873015e-04f, +1.068309149e-03f, +1.546738023e-03f, +1.562845666e-03f, +1.154607768e-03f, +5.004013551e-04f, -1.598807795e-04f, -6.202779047e-04f, -7.798572015e-04f, -6.628002469e-04f, -3.857499684e-04f, -9.380718275e-05f, + /* 2,12 (24) */ + -4.311249731e-03f, -5.701427310e-03f, -5.469263323e-03f, -2.342147599e-03f, +4.782365073e-03f, +1.649915179e-02f, +3.261722759e-02f, +5.202688425e-02f, +7.276907106e-02f, +9.231473886e-02f, +1.080061447e-01f, +1.175655812e-01f, +1.195536204e-01f, +1.136664730e-01f, +1.007993997e-01f, +8.286047349e-02f, +6.238068899e-02f, +4.201544960e-02f, +2.405559975e-02f, +1.005779186e-02f, +6.675793059e-04f, -4.344478085e-03f, -5.867718711e-03f, -5.131889896e-03f, + +5.855785027e-03f, +4.160150055e-03f, -2.154537594e-03f, -1.275803875e-02f, -2.503971113e-02f, -3.459847414e-02f, -3.672661756e-02f, -2.837888255e-02f, -9.793633001e-03f, +1.502526029e-02f, +3.932757061e-02f, +5.585429082e-02f, +5.944602133e-02f, +4.896289099e-02f, +2.771411696e-02f, +2.216003302e-03f, -2.019937822e-02f, -3.393702657e-02f, -3.684356601e-02f, -3.046906076e-02f, -1.893548341e-02f, -7.030221522e-03f, +1.611215755e-03f, +5.525484490e-03f, + +1.132755013e-04f, +5.238444285e-05f, -8.626967713e-05f, -3.029867020e-04f, -5.771348786e-04f, -8.677561346e-04f, -1.119961557e-03f, -1.276110995e-03f, -1.289253825e-03f, -1.135410439e-03f, -8.213159125e-04f, -3.852746369e-04f, +1.094689306e-04f, +5.874421685e-04f, +9.766792073e-04f, +1.223586498e-03f, +1.303286642e-03f, +1.223029481e-03f, +1.018134912e-03f, +7.418930018e-04f, +4.523334583e-04f, +1.993869984e-04f, +1.556851470e-05f, -8.790879338e-05f, + -2.067529037e-05f, +2.333311836e-04f, +5.350484419e-04f, +7.501124831e-04f, +7.389334301e-04f, +4.243523280e-04f, -1.563110555e-04f, -8.435553022e-04f, -1.403173181e-03f, -1.614126997e-03f, -1.361029974e-03f, -6.900104146e-04f, +1.992872499e-04f, +1.025162808e-03f, +1.529867409e-03f, +1.575490638e-03f, +1.189688301e-03f, +5.439756757e-04f, -1.227574793e-04f, -5.999146171e-04f, -7.788166310e-04f, -6.763034625e-04f, -4.049447613e-04f, -1.100841935e-04f, + /* 2,13 (24) */ + -4.197974230e-03f, -5.649042868e-03f, -5.555533001e-03f, -2.645134301e-03f, +4.205230195e-03f, +1.563139565e-02f, +3.149726603e-02f, +5.075077326e-02f, +7.147981724e-02f, +9.117932843e-02f, +1.071848287e-01f, +1.171803066e-01f, +1.196630893e-01f, +1.142539152e-01f, +1.017760789e-01f, +8.408405999e-02f, +6.368397563e-02f, +4.323847908e-02f, +2.507373467e-02f, +1.079968486e-02f, +1.119912764e-03f, -4.145091087e-03f, -5.852150196e-03f, -5.219798689e-03f, + +5.835109736e-03f, +4.393481238e-03f, -1.619489152e-03f, -1.200792627e-02f, -2.430077770e-02f, -3.417412181e-02f, -3.688292862e-02f, -2.922243785e-02f, -1.119680618e-02f, +1.341113329e-02f, +3.796654063e-02f, +5.516428041e-02f, +5.964530858e-02f, +4.998805380e-02f, +2.924398436e-02f, +3.791493940e-03f, -1.900968992e-02f, -3.339305089e-02f, -3.696632349e-02f, -3.106897538e-02f, -1.971430004e-02f, -7.706524985e-03f, +1.206270994e-03f, +5.415400296e-03f, + +1.148160727e-04f, +5.836365872e-05f, -7.521953202e-05f, -2.874359097e-04f, -5.590040813e-04f, -8.501075458e-04f, -1.106440210e-03f, -1.270147369e-03f, -1.293220355e-03f, -1.149955055e-03f, -8.450632330e-04f, -4.149957535e-04f, +7.823977369e-05f, +5.594864885e-04f, +9.560948405e-04f, +1.212957498e-03f, +1.303223507e-03f, +1.232179476e-03f, +1.033636441e-03f, +7.601339276e-04f, +4.698031407e-04f, +2.134032501e-04f, +2.471272391e-05f, -8.372149579e-05f, + -3.280060770e-05f, +2.148944892e-04f, +5.171733863e-04f, +7.420251329e-04f, +7.482225637e-04f, +4.528509384e-04f, -1.147149834e-04f, -8.017717782e-04f, -1.376477675e-03f, -1.614094247e-03f, -1.390430588e-03f, -7.410292380e-04f, +1.425312172e-04f, +9.807206967e-04f, +1.511146685e-03f, +1.586401168e-03f, +1.223730844e-03f, +5.874781133e-04f, -8.485825299e-05f, -5.783430865e-04f, -7.766442229e-04f, -6.891364809e-04f, -4.240592003e-04f, -1.267386733e-04f, + /* 2,14 (24) */ + -4.083158157e-03f, -5.590679209e-03f, -5.630752533e-03f, -2.932570211e-03f, +3.646226113e-03f, +1.478128811e-02f, +3.039082582e-02f, +4.948062589e-02f, +7.018659688e-02f, +9.002937337e-02f, +1.063397655e-01f, +1.167653108e-01f, +1.197413291e-01f, +1.148134017e-01f, +1.027321738e-01f, +8.529701749e-02f, +6.498719914e-02f, +4.447065856e-02f, +2.610737111e-02f, +1.155981879e-02f, +1.589715905e-03f, -3.931687837e-03f, -5.827437472e-03f, -5.303520185e-03f, + +5.802309129e-03f, +4.608375728e-03f, -1.102315765e-03f, -1.126590114e-02f, -2.355255513e-02f, -3.372127087e-02f, -3.699764360e-02f, -3.002420963e-02f, -1.257328386e-02f, +1.179703904e-02f, +3.657611005e-02f, +5.442325117e-02f, +5.978783980e-02f, +5.096877450e-02f, +3.075513105e-02f, +5.377895108e-03f, -1.778595908e-02f, -3.280557278e-02f, -3.705118174e-02f, -3.164731846e-02f, -2.049094426e-02f, -8.395661465e-03f, +7.822117937e-04f, +5.288661623e-03f, + +1.161209850e-04f, +6.403626576e-05f, -6.448351439e-05f, -2.721238813e-04f, -5.409545148e-04f, -8.323243973e-04f, -1.092553812e-03f, -1.263626965e-03f, -1.296526957e-03f, -1.163857688e-03f, -8.683130181e-04f, -4.444657095e-04f, +4.696294436e-05f, +5.311943066e-04f, +9.349551213e-04f, +1.201666972e-03f, +1.302520727e-03f, +1.240825207e-03f, +1.048843356e-03f, +7.783116620e-04f, +4.874111149e-04f, +2.276911350e-04f, +3.417704185e-05f, -7.924428113e-05f, + -4.440305368e-05f, +1.966919200e-04f, +4.989997239e-04f, +7.330641614e-04f, +7.562953008e-04f, +4.802437219e-04f, -7.361331520e-05f, -7.595474433e-04f, -1.348431235e-03f, -1.612204906e-03f, -1.418114570e-03f, -7.911031327e-04f, +8.559205927e-05f, +9.350368534e-04f, +1.490591427e-03f, +1.595550745e-03f, +1.256679994e-03f, +6.308478599e-04f, -4.622611733e-05f, -5.555752224e-04f, -7.733217142e-04f, -7.012637304e-04f, -4.430579567e-04f, -1.437495025e-04f, + /* 2,15 (24) */ + -3.967037172e-03f, -5.526642943e-03f, -5.695236047e-03f, -3.204694092e-03f, +3.105271599e-03f, +1.394896371e-02f, +2.929827201e-02f, +4.821699892e-02f, +6.889006993e-02f, +8.886551568e-02f, +1.054714525e-01f, +1.163208451e-01f, +1.197882920e-01f, +1.153445960e-01f, +1.036671289e-01f, +8.649868446e-02f, +6.628971986e-02f, +4.571148376e-02f, +2.715621446e-02f, +1.233813045e-02f, +2.077127020e-03f, -3.703996702e-03f, -5.793260431e-03f, -5.382764466e-03f, + +5.757906075e-03f, +4.805067648e-03f, -6.033160415e-04f, -1.053283698e-02f, -2.279625983e-02f, -3.324102715e-02f, -3.707125692e-02f, -3.078375707e-02f, -1.392171509e-02f, +1.018483414e-02f, +3.515799548e-02f, +5.363214804e-02f, +5.987343185e-02f, +5.190381135e-02f, +3.224572248e-02f, +6.973445853e-03f, -1.652927908e-02f, -3.217472492e-02f, -3.709740786e-02f, -3.220289369e-02f, -2.126426598e-02f, -9.096925196e-03f, +3.391538370e-04f, +5.144912120e-03f, + +1.171960904e-04f, +6.940512698e-05f, -5.406346933e-05f, -2.570578584e-04f, -5.229980927e-04f, -8.144211337e-04f, -1.078316198e-03f, -1.256559625e-03f, -1.299176747e-03f, -1.177113412e-03f, -8.910528549e-04f, -4.736669608e-04f, +1.565749561e-05f, +5.025821872e-04f, +9.132707466e-04f, +1.189717810e-03f, +1.301173316e-03f, +1.248955534e-03f, +1.063741346e-03f, +7.964121267e-04f, +5.051464861e-04f, +2.422447510e-04f, +4.396091421e-05f, -7.447335023e-05f, + -5.547479234e-05f, +1.787500512e-04f, +4.805646748e-04f, +7.232615691e-04f, +7.631614087e-04f, +5.065084646e-04f, -3.305666933e-05f, -7.169441422e-04f, -1.319082469e-03f, -1.608473031e-03f, -1.444053089e-03f, -8.401694814e-04f, +2.854291356e-05f, +8.881672048e-04f, +1.468219911e-03f, +1.602915254e-03f, +1.288481522e-03f, +6.740237072e-04f, -6.905729617e-06f, -5.316250007e-04f, -7.688324450e-04f, -7.126502117e-04f, -4.619052037e-04f, -1.610944214e-04f, + /* 3, 0 (24) */ + -4.734201172e-04f, -5.872050883e-03f, -1.327132736e-02f, -1.945082492e-02f, -1.959997611e-02f, -8.884357777e-03f, +1.545973808e-02f, +5.235009562e-02f, +9.626476338e-02f, +1.382943420e-01f, +1.686391567e-01f, +1.797059243e-01f, +1.686391567e-01f, +1.382943420e-01f, +9.626476338e-02f, +5.235009562e-02f, +1.545973808e-02f, -8.884357777e-03f, -1.959997611e-02f, -1.945082492e-02f, -1.327132736e-02f, -5.872050883e-03f, -4.734201172e-04f, +1.852590201e-03f, + +6.383988391e-03f, +1.521606380e-02f, +1.998675788e-02f, +1.433025347e-02f, -3.365023479e-03f, -2.693084335e-02f, -4.420767028e-02f, -4.352960466e-02f, -2.129987080e-02f, +1.435357571e-02f, +4.683729932e-02f, +5.990197477e-02f, +4.683729932e-02f, +1.435357571e-02f, -2.129987080e-02f, -4.352960466e-02f, -4.420767028e-02f, -2.693084335e-02f, -3.365023479e-03f, +1.433025347e-02f, +1.998675788e-02f, +1.521606380e-02f, +6.383988391e-03f, -3.539537444e-04f, + +2.355677716e-04f, +4.179442895e-04f, +4.704054608e-04f, +2.636859589e-04f, -2.647871259e-04f, -1.056835617e-03f, -1.922979241e-03f, -2.589654838e-03f, -2.792633064e-03f, -2.381490657e-03f, -1.390749392e-03f, -4.420040917e-05f, +1.313836442e-03f, +2.335105944e-03f, +2.785586443e-03f, +2.618259216e-03f, +1.973503767e-03f, +1.111372868e-03f, +3.079126691e-04f, -2.401633161e-04f, -4.662037107e-04f, -4.265012055e-04f, -2.481551782e-04f, -6.172129803e-05f, + -5.307162707e-04f, -5.079300130e-04f, -4.486124072e-05f, +7.264197738e-04f, +1.381428286e-03f, +1.429080757e-03f, +6.481239362e-04f, -6.943321844e-04f, -1.923558464e-03f, -2.327398621e-03f, -1.597787307e-03f, -5.339670306e-05f, +1.518583567e-03f, +2.314926423e-03f, +1.979009750e-03f, +7.826531639e-04f, -5.751864623e-04f, -1.404413140e-03f, -1.406533530e-03f, -7.762001769e-04f, +2.500611640e-06f, +4.922146246e-04f, +5.402355369e-04f, +2.899658374e-04f, + /* 3, 1 (24) */ + -2.378523456e-04f, -5.454106594e-03f, -1.280092190e-02f, -1.918713896e-02f, -1.986476324e-02f, -9.941193394e-03f, +1.353675884e-02f, +4.976044078e-02f, +9.347213031e-02f, +1.359128514e-01f, +1.672484073e-01f, +1.796617239e-01f, +1.699529931e-01f, +1.406294480e-01f, +9.905034982e-02f, +5.496835484e-02f, +1.743324185e-02f, -7.772984909e-03f, -1.929206344e-02f, -1.969098823e-02f, -1.373753107e-02f, -6.298552089e-03f, -7.215752954e-04f, +1.790868903e-03f, + +5.853272120e-03f, +1.470813379e-02f, +1.994189664e-02f, +1.505667324e-02f, -1.983595193e-03f, -2.550176259e-02f, -4.355954634e-02f, -4.422393685e-02f, -2.322342926e-02f, +1.202617709e-02f, +4.523951201e-02f, +5.984857807e-02f, +4.835588289e-02f, +1.666850214e-02f, -1.932086105e-02f, -4.274695150e-02f, -4.478285674e-02f, -2.833525649e-02f, -4.771557009e-03f, +1.355405329e-02f, +1.998925849e-02f, +1.570827843e-02f, +6.924223928e-03f, -6.398790701e-05f, + +2.229937837e-04f, +4.088809149e-04f, +4.735725955e-04f, +2.859105993e-04f, -2.227364395e-04f, -1.002617239e-03f, -1.871673067e-03f, -2.559200721e-03f, -2.797217717e-03f, -2.425546548e-03f, -1.466231160e-03f, -1.325550036e-04f, +1.235568842e-03f, +2.286427588e-03f, +2.776062594e-03f, +2.644958192e-03f, +2.023174408e-03f, +1.166167127e-03f, +3.520806754e-04f, -2.153407861e-04f, -4.609402801e-04f, -4.345162095e-04f, -2.607281858e-04f, -7.171793133e-05f, + -5.200556115e-04f, -5.218232591e-04f, -8.591185626e-05f, +6.762124622e-04f, +1.353857631e-03f, +1.450338834e-03f, +7.187217155e-04f, -6.055847117e-04f, -1.864741531e-03f, -2.335221636e-03f, -1.673642119e-03f, -1.600766433e-04f, +1.436191554e-03f, +2.297809027e-03f, +2.030950215e-03f, +8.703490222e-04f, -5.000433397e-04f, -1.376339999e-03f, -1.429068254e-03f, -8.254212634e-04f, -4.109231554e-05f, +4.746690398e-04f, +5.485484257e-04f, +3.092517675e-04f, + /* 3, 2 (24) */ + -1.485856194e-05f, -5.045225679e-03f, -1.232734930e-02f, -1.890122836e-02f, -2.008749968e-02f, -1.094381063e-02f, +1.166508578e-02f, +4.720124006e-02f, +9.067491260e-02f, +1.334873048e-01f, +1.657821762e-01f, +1.795291689e-01f, +1.711885620e-01f, +1.429158756e-01f, +1.018264124e-01f, +5.761331303e-02f, +1.945641626e-02f, -6.606817783e-03f, -1.893998277e-02f, -1.990632902e-02f, -1.419847135e-02f, -6.733068298e-03f, -9.823034812e-04f, +1.719150971e-03f, + +5.333216509e-03f, +1.418631053e-02f, +1.985598479e-02f, +1.573288570e-02f, -6.297375625e-04f, -2.405142376e-02f, -4.284082463e-02f, -4.482952156e-02f, -2.508817080e-02f, +9.690955455e-03f, +4.356586989e-02f, +5.968850142e-02f, +4.979207444e-02f, +1.896631116e-02f, -1.728991084e-02f, -4.187660248e-02f, -4.528290008e-02f, -2.971159648e-02f, -6.200625263e-03f, +1.272863203e-02f, +1.994816618e-02f, +1.618294747e-02f, +7.472772354e-03f, +2.452638605e-04f, + +2.104601690e-04f, +3.993464764e-04f, +4.757332307e-04f, +3.068410823e-04f, -1.817908411e-04f, -9.487781880e-04f, -1.819657590e-03f, -2.526954351e-03f, -2.799358667e-03f, -2.467241525e-03f, -1.540207185e-03f, -2.207709909e-04f, +1.156024991e-03f, +2.235493821e-03f, +2.764049302e-03f, +2.669698029e-03f, +2.071919147e-03f, +1.221155193e-03f, +3.972566074e-04f, -1.892184824e-04f, -4.545892232e-04f, -4.419538543e-04f, -2.732581479e-04f, -8.201546497e-05f, + -5.083202561e-04f, -5.339073330e-04f, -1.255798718e-04f, +6.257092953e-04f, +1.323931112e-03f, +1.468191662e-03f, +7.868528144e-04f, -5.166085836e-04f, -1.802710912e-03f, -2.338402133e-03f, -1.745995343e-03f, -2.664164598e-04f, +1.350779544e-03f, +2.276061109e-03f, +2.079241865e-03f, +9.572208293e-04f, -4.228354067e-04f, -1.344873748e-03f, -1.448932127e-03f, -8.739496088e-04f, -8.583482063e-05f, +4.552902447e-04f, +5.555919034e-04f, +3.283795848e-04f, + /* 3, 3 (24) */ + +1.956016071e-04f, -4.645879202e-03f, -1.185161607e-02f, -1.859438728e-02f, -2.026929052e-02f, -1.189258882e-02f, +9.845428186e-03f, +4.467428571e-02f, +8.787555393e-02f, +1.310200633e-01f, +1.642419690e-01f, +1.793083979e-01f, +1.723445870e-01f, +1.451513694e-01f, +1.045904617e-01f, +6.028301106e-02f, +2.152833541e-02f, -5.385662589e-03f, -1.854272616e-02f, -2.009554750e-02f, -1.465306057e-02f, -7.175022152e-03f, -1.255561629e-03f, +1.637135506e-03f, + +4.824896253e-03f, +1.365240320e-02f, +1.973040491e-02f, +1.635859500e-02f, +6.941935492e-04f, -2.258323209e-02f, -4.205397181e-02f, -4.534613014e-02f, -2.689088171e-02f, +7.352553322e-03f, +4.181987455e-02f, +5.942208496e-02f, +5.114285398e-02f, +2.124237227e-02f, -1.521066897e-02f, -4.091938165e-02f, -4.570573549e-02f, -3.105647023e-02f, -7.649557389e-03f, +1.185468242e-02f, +1.986233136e-02f, +1.663823771e-02f, +8.028364257e-03f, +5.736434452e-04f, + +1.979929869e-04f, +3.893762465e-04f, +4.769164640e-04f, +3.264831727e-04f, -1.419783847e-04f, -8.953774331e-04f, -1.767005156e-03f, -2.492974943e-03f, -2.799077135e-03f, -2.506546616e-03f, -1.612604977e-03f, -3.087561805e-04f, +1.075285051e-03f, +2.182345887e-03f, +2.749537436e-03f, +2.692427006e-03f, +2.119666297e-03f, +1.276272613e-03f, +4.434038066e-04f, -1.617985515e-04f, -4.471257811e-04f, -4.487787648e-04f, -2.857156265e-04f, -9.260021088e-05f, + -4.955783754e-04f, -5.441999838e-04f, -1.637979372e-04f, +5.750396416e-04f, +1.291762365e-03f, +1.482651727e-03f, +8.523975536e-04f, -4.276003658e-04f, -1.737624939e-03f, -2.336957375e-03f, -1.814702668e-03f, -3.721903161e-04f, +1.262523044e-03f, +2.249708036e-03f, +2.123754270e-03f, +1.043069845e-03f, -3.437100063e-04f, -1.310035268e-03f, -1.466029931e-03f, -9.216511183e-04f, -1.316393194e-04f, +4.340803772e-04f, +5.613051227e-04f, +3.472813090e-04f, + /* 3, 4 (24) */ + +3.935945940e-04f, -4.256502956e-03f, -1.137469961e-02f, -1.826790410e-02f, -2.041126890e-02f, -1.278796625e-02f, +8.078423030e-03f, +4.218131077e-02f, +8.507647679e-02f, +1.285135167e-01f, +1.626293640e-01f, +1.789996417e-01f, +1.734198720e-01f, +1.473337153e-01f, +1.073399992e-01f, +6.297543806e-02f, +2.364800170e-02f, -4.109389976e-03f, -1.809932235e-02f, -2.025734605e-02f, -1.510018635e-02f, -7.623800917e-03f, -1.541277256e-03f, +1.544535295e-03f, + +4.329317877e-03f, +1.310820321e-02f, +1.956660698e-02f, +1.693363464e-02f, +1.985955914e-03f, -2.110058037e-02f, -4.120157426e-02f, -4.577373051e-02f, -2.862850665e-02f, +5.015595947e-03f, +4.000517188e-02f, +5.904989465e-02f, +5.240537703e-02f, +2.349208031e-02f, -1.308691470e-02f, -3.987631180e-02f, -4.604944549e-02f, -3.236650550e-02f, -9.115587320e-03f, +1.093303130e-02f, +1.973069204e-02f, +1.707231809e-02f, +8.589669380e-03f, +9.209247542e-04f, + +1.856173713e-04f, +3.790053132e-04f, +4.771523044e-04f, +3.448445120e-04f, -1.033249365e-04f, -8.424723868e-04f, -1.713788009e-03f, -2.457323339e-03f, -2.796397255e-03f, -2.543435997e-03f, -1.683354210e-03f, -3.964187036e-04f, +9.934308368e-04f, +2.127027991e-03f, +2.732520978e-03f, +2.713095511e-03f, +2.166344606e-03f, +1.331453758e-03f, +4.904835192e-04f, -1.330852042e-04f, -4.385264485e-04f, -4.549557051e-04f, -2.980704308e-04f, -1.034573888e-04f, + -4.818993757e-04f, -5.527235910e-04f, -2.005040300e-04f, +5.243308648e-04f, +1.257468758e-03f, +1.493739576e-03f, +9.152437854e-04f, -3.387548764e-04f, -1.669647890e-03f, -2.330915132e-03f, -1.879628459e-03f, -4.771737415e-04f, +1.171604375e-03f, +2.218785848e-03f, +2.164364927e-03f, +1.127698014e-03f, -2.628206788e-04f, -1.271853952e-03f, -1.480271883e-03f, -9.683913798e-04f, -1.784135208e-04f, +4.110468253e-04f, +5.656296573e-04f, +3.658877748e-04f, + /* 3, 5 (24) */ + +5.792119653e-04f, -3.877497643e-03f, -1.089754730e-02f, -1.792305959e-02f, -2.051459384e-02f, -1.363043864e-02f, +6.364635021e-03f, +3.972398743e-02f, +8.228007954e-02f, +1.259700807e-01f, +1.609460098e-01f, +1.786032230e-01f, +1.744133029e-01f, +1.494607432e-01f, +1.100725201e-01f, +6.568853357e-02f, +2.581434631e-02f, -2.777936218e-03f, -1.760883883e-02f, -2.039043126e-02f, -1.553871280e-02f, -8.078756622e-03f, -1.839347686e-03f, +1.441077907e-03f, + +3.847418502e-03f, +1.255547962e-02f, +1.936610295e-02f, +1.745796550e-02f, +3.243424672e-03f, -1.960684079e-02f, -4.028633047e-02f, -4.611248539e-02f, -3.029815454e-02f, +2.684680815e-03f, +3.812554342e-02f, +5.857272090e-02f, +5.357698140e-02f, +2.571086615e-02f, -1.092254977e-02f, -3.874861379e-02f, -4.631226617e-02f, -3.363835945e-02f, -1.059585920e-02f, +9.964639919e-03f, +1.955227852e-02f, +1.748336492e-02f, +9.155299037e-03f, +1.286812529e-03f, + +1.733575038e-04f, +3.682685191e-04f, +4.764716021e-04f, +3.619345721e-04f, -6.585416757e-05f, -7.901188395e-04f, -1.660078177e-03f, -2.420061901e-03f, -2.791346014e-03f, -2.577887010e-03f, -1.752386819e-03f, -4.836671403e-04f, +9.105457041e-04f, +2.069587256e-03f, +2.712997051e-03f, +2.731656131e-03f, +2.211883374e-03f, +1.386631915e-03f, +5.384549270e-04f, -1.030847447e-04f, -4.287690391e-04f, -4.604496465e-04f, -3.102916594e-04f, -1.145711293e-04f, + -4.673536613e-04f, -5.595050055e-04f, -2.356415290e-04f, +4.737080132e-04f, +1.221171030e-03f, +1.501483663e-03f, +9.752870969e-04f, -2.502647183e-04f, -1.598949545e-03f, -2.320313567e-03f, -1.940646067e-03f, -5.811441735e-04f, +1.078212250e-03f, +2.183341206e-03f, +2.200959607e-03f, +1.210908463e-03f, -1.803268347e-04f, -1.230367738e-03f, -1.491573948e-03f, -1.014036023e-03f, -2.260605998e-04f, +3.862023112e-04f, +5.685097329e-04f, +3.841288250e-04f, + /* 3, 6 (24) */ + +7.525694691e-04f, -3.509229123e-03f, -1.042107570e-02f, -1.756112502e-02f, -2.058044801e-02f, -1.442055748e-02f, +4.704556844e-03f, +3.730392553e-02f, +7.948873353e-02f, +1.233921937e-01f, +1.591936230e-01f, +1.781195559e-01f, +1.753238486e-01f, +1.515303305e-01f, +1.127855172e-01f, +6.842018971e-02f, +2.802622968e-02f, -1.391304304e-03f, -1.707038391e-02f, -2.049351600e-02f, -1.596748184e-02f, -8.539206269e-03f, -2.149639346e-03f, +1.326506777e-03f, + +3.380064841e-03f, +1.199597462e-02f, +1.913046142e-02f, +1.793167352e-02f, +4.464595702e-03f, -1.810535713e-02f, -3.931104338e-02f, -4.636275010e-02f, -3.189710408e-02f, +3.643672483e-04f, +3.618489736e-02f, +5.799157673e-02f, +5.465519365e-02f, +2.789420736e-02f, -8.721590167e-03f, -3.753770533e-02f, -4.649259301e-02f, -3.486872719e-02f, -1.208743315e-02f, +8.950603896e-03f, +1.932621792e-02f, +1.786956723e-02f, +9.723808770e-03f, +1.670941354e-03f, + +1.612365884e-04f, +3.572004027e-04f, +4.749059774e-04f, +3.777646071e-04f, -2.958755077e-05f, -7.383708949e-04f, -1.605947374e-03f, -2.381254415e-03f, -2.783953195e-03f, -2.609880183e-03f, -1.819637087e-03f, -5.704106472e-04f, +8.267144377e-04f, +2.010073659e-03f, +2.690965941e-03f, +2.748063737e-03f, +2.256212560e-03f, +1.441739371e-03f, +5.872751810e-04f, -7.180559553e-05f, -4.178327492e-04f, -4.652258365e-04f, -3.223477431e-04f, -1.259244795e-04f, + -4.520123982e-04f, -5.645753791e-04f, -2.691592719e-04f, +4.232935213e-04f, +1.182992926e-03f, +1.505920182e-03f, +1.032430991e-03f, -1.623198217e-04f, -1.525704742e-03f, -2.305201100e-03f, -1.997638108e-03f, -6.838814930e-04f, +9.825413188e-04f, +2.143431320e-03f, +2.233432674e-03f, +1.292505997e-03f, -9.639341054e-05f, -1.185623103e-03f, -1.499858136e-03f, -1.058451081e-03f, -2.744793865e-04f, +3.595649614e-04f, +5.698924546e-04f, +4.019335106e-04f, + /* 3, 7 (24) */ + +9.138060575e-04f, -3.152028721e-03f, -9.946169723e-03f, -1.718336041e-02f, -2.061003556e-02f, -1.515892837e-02f, +3.098609470e-03f, +3.492267111e-02f, +7.670478033e-02f, +1.207823135e-01f, +1.573739859e-01f, +1.775491452e-01f, +1.761505630e-01f, +1.535404042e-01f, +1.154764831e-01f, +7.116825344e-02f, +3.028244224e-02f, +5.043506755e-05f, -1.648310872e-02f, -2.056532160e-02f, -1.638531459e-02f, -9.004432105e-03f, -2.471987089e-03f, +1.200582298e-03f, + +2.928052442e-03f, +1.143139924e-02f, +1.886130215e-02f, +1.835496704e-02f, +5.647588627e-03f, -1.659943695e-02f, -3.827861238e-02f, -4.652506993e-02f, -3.342280882e-02f, -1.940833852e-03f, +3.418725925e-02f, +5.730769524e-02f, +5.563773497e-02f, +3.003763868e-02f, -6.488157493e-03f, -3.624519933e-02f, -4.658898642e-02f, -3.605435029e-02f, -1.358729129e-02f, +7.892152815e-03f, +1.905173853e-02f, +1.822913219e-02f, +1.029370122e-02f, +2.072874865e-03f, + +1.492768294e-04f, +3.458351405e-04f, +4.724877501e-04f, +3.923476022e-04f, +5.455638806e-06f, -6.872809102e-04f, -1.551466894e-03f, -2.340965977e-03f, -2.774251318e-03f, -2.639399243e-03f, -1.885041731e-03f, -6.565590831e-04f, +7.420231342e-04f, +1.948539981e-03f, +2.666431117e-03f, +2.762275570e-03f, +2.299262891e-03f, +1.496707509e-03f, +6.368994396e-04f, -3.925831957e-05f, -4.056982208e-04f, -4.692498681e-04f, -3.342064914e-04f, -1.374994109e-04f, + -4.359472801e-04f, -5.679699851e-04f, -3.010115957e-04f, +3.732069218e-04f, +1.143060823e-03f, +1.507092867e-03f, +1.086587045e-03f, -7.510699606e-05f, -1.450092909e-03f, -2.285636241e-03f, -2.050496729e-03f, -7.851685550e-04f, +8.847917105e-04f, +2.099123840e-03f, +2.261687400e-03f, +1.372297596e-03f, -1.119050572e-05f, -1.137675046e-03f, -1.505052791e-03f, -1.101503364e-03f, -3.235645709e-04f, +3.311583615e-04f, +5.697280296e-04f, +4.192302976e-04f, + /* 3, 8 (24) */ + +1.063082887e-03f, -2.806193580e-03f, -9.473681973e-03f, -1.679101281e-02f, -2.060457992e-02f, -1.584620928e-02f, +1.547142576e-03f, +3.258170513e-02f, +7.393052901e-02f, +1.181429142e-01f, +1.554889441e-01f, +1.768925861e-01f, +1.768925861e-01f, +1.554889441e-01f, +1.181429142e-01f, +7.393052901e-02f, +3.258170513e-02f, +1.547142576e-03f, -1.584620928e-02f, -2.060457992e-02f, -1.679101281e-02f, -9.473681973e-03f, -2.806193580e-03f, +1.063082887e-03f, + +2.492105162e-03f, +1.086342925e-02f, +1.856029055e-02f, +1.872817396e-02f, +6.790649451e-03f, -1.509234408e-02f, -3.719202534e-02f, -4.660017692e-02f, -3.487290173e-02f, -4.226470093e-03f, +3.213676252e-02f, +5.652252668e-02f, +5.652252668e-02f, +3.213676252e-02f, -4.226470093e-03f, -3.487290173e-02f, -4.660017692e-02f, -3.719202534e-02f, -1.509234408e-02f, +6.790649451e-03f, +1.872817396e-02f, +1.856029055e-02f, +1.086342925e-02f, +2.492105162e-03f, + +1.374994109e-04f, +3.342064914e-04f, +4.692498681e-04f, +4.056982208e-04f, +3.925831957e-05f, -6.368994396e-04f, -1.496707509e-03f, -2.299262891e-03f, -2.762275570e-03f, -2.666431117e-03f, -1.948539981e-03f, -7.420231342e-04f, +6.565590831e-04f, +1.885041731e-03f, +2.639399243e-03f, +2.774251318e-03f, +2.340965977e-03f, +1.551466894e-03f, +6.872809102e-04f, -5.455638806e-06f, -3.923476022e-04f, -4.724877501e-04f, -3.458351405e-04f, -1.492768294e-04f, + -4.192302976e-04f, -5.697280296e-04f, -3.311583615e-04f, +3.235645709e-04f, +1.101503364e-03f, +1.505052791e-03f, +1.137675046e-03f, +1.119050572e-05f, -1.372297596e-03f, -2.261687400e-03f, -2.099123840e-03f, -8.847917105e-04f, +7.851685550e-04f, +2.050496729e-03f, +2.285636241e-03f, +1.450092909e-03f, +7.510699606e-05f, -1.086587045e-03f, -1.507092867e-03f, -1.143060823e-03f, -3.732069218e-04f, +3.010115957e-04f, +5.679699851e-04f, +4.359472801e-04f, + /* 3, 9 (24) */ + +1.200582298e-03f, -2.471987089e-03f, -9.004432105e-03f, -1.638531459e-02f, -2.056532160e-02f, -1.648310872e-02f, +5.043506755e-05f, +3.028244224e-02f, +7.116825344e-02f, +1.154764831e-01f, +1.535404042e-01f, +1.761505630e-01f, +1.775491452e-01f, +1.573739859e-01f, +1.207823135e-01f, +7.670478033e-02f, +3.492267111e-02f, +3.098609470e-03f, -1.515892837e-02f, -2.061003556e-02f, -1.718336041e-02f, -9.946169723e-03f, -3.152028721e-03f, +9.138060575e-04f, + +2.072874865e-03f, +1.029370122e-02f, +1.822913219e-02f, +1.905173853e-02f, +7.892152815e-03f, -1.358729129e-02f, -3.605435029e-02f, -4.658898642e-02f, -3.624519933e-02f, -6.488157493e-03f, +3.003763868e-02f, +5.563773497e-02f, +5.730769524e-02f, +3.418725925e-02f, -1.940833852e-03f, -3.342280882e-02f, -4.652506993e-02f, -3.827861238e-02f, -1.659943695e-02f, +5.647588627e-03f, +1.835496704e-02f, +1.886130215e-02f, +1.143139924e-02f, +2.928052442e-03f, + +1.259244795e-04f, +3.223477431e-04f, +4.652258365e-04f, +4.178327492e-04f, +7.180559553e-05f, -5.872751810e-04f, -1.441739371e-03f, -2.256212560e-03f, -2.748063737e-03f, -2.690965941e-03f, -2.010073659e-03f, -8.267144377e-04f, +5.704106472e-04f, +1.819637087e-03f, +2.609880183e-03f, +2.783953195e-03f, +2.381254415e-03f, +1.605947374e-03f, +7.383708949e-04f, +2.958755077e-05f, -3.777646071e-04f, -4.749059774e-04f, -3.572004027e-04f, -1.612365884e-04f, + -4.019335106e-04f, -5.698924546e-04f, -3.595649614e-04f, +2.744793865e-04f, +1.058451081e-03f, +1.499858136e-03f, +1.185623103e-03f, +9.639341054e-05f, -1.292505997e-03f, -2.233432674e-03f, -2.143431320e-03f, -9.825413188e-04f, +6.838814930e-04f, +1.997638108e-03f, +2.305201100e-03f, +1.525704742e-03f, +1.623198217e-04f, -1.032430991e-03f, -1.505920182e-03f, -1.182992926e-03f, -4.232935213e-04f, +2.691592719e-04f, +5.645753791e-04f, +4.520123982e-04f, + /* 3,10 (24) */ + +1.326506777e-03f, -2.149639346e-03f, -8.539206269e-03f, -1.596748184e-02f, -2.049351600e-02f, -1.707038391e-02f, -1.391304304e-03f, +2.802622968e-02f, +6.842018971e-02f, +1.127855172e-01f, +1.515303305e-01f, +1.753238486e-01f, +1.781195559e-01f, +1.591936230e-01f, +1.233921937e-01f, +7.948873353e-02f, +3.730392553e-02f, +4.704556844e-03f, -1.442055748e-02f, -2.058044801e-02f, -1.756112502e-02f, -1.042107570e-02f, -3.509229123e-03f, +7.525694691e-04f, + +1.670941354e-03f, +9.723808770e-03f, +1.786956723e-02f, +1.932621792e-02f, +8.950603896e-03f, -1.208743315e-02f, -3.486872719e-02f, -4.649259301e-02f, -3.753770533e-02f, -8.721590167e-03f, +2.789420736e-02f, +5.465519365e-02f, +5.799157673e-02f, +3.618489736e-02f, +3.643672483e-04f, -3.189710408e-02f, -4.636275010e-02f, -3.931104338e-02f, -1.810535713e-02f, +4.464595702e-03f, +1.793167352e-02f, +1.913046142e-02f, +1.199597462e-02f, +3.380064841e-03f, + +1.145711293e-04f, +3.102916594e-04f, +4.604496465e-04f, +4.287690391e-04f, +1.030847447e-04f, -5.384549270e-04f, -1.386631915e-03f, -2.211883374e-03f, -2.731656131e-03f, -2.712997051e-03f, -2.069587256e-03f, -9.105457041e-04f, +4.836671403e-04f, +1.752386819e-03f, +2.577887010e-03f, +2.791346014e-03f, +2.420061901e-03f, +1.660078177e-03f, +7.901188395e-04f, +6.585416757e-05f, -3.619345721e-04f, -4.764716021e-04f, -3.682685191e-04f, -1.733575038e-04f, + -3.841288250e-04f, -5.685097329e-04f, -3.862023112e-04f, +2.260605998e-04f, +1.014036023e-03f, +1.491573948e-03f, +1.230367738e-03f, +1.803268347e-04f, -1.210908463e-03f, -2.200959607e-03f, -2.183341206e-03f, -1.078212250e-03f, +5.811441735e-04f, +1.940646067e-03f, +2.320313567e-03f, +1.598949545e-03f, +2.502647183e-04f, -9.752870969e-04f, -1.501483663e-03f, -1.221171030e-03f, -4.737080132e-04f, +2.356415290e-04f, +5.595050055e-04f, +4.673536613e-04f, + /* 3,11 (24) */ + +1.441077907e-03f, -1.839347686e-03f, -8.078756622e-03f, -1.553871280e-02f, -2.039043126e-02f, -1.760883883e-02f, -2.777936218e-03f, +2.581434631e-02f, +6.568853357e-02f, +1.100725201e-01f, +1.494607432e-01f, +1.744133029e-01f, +1.786032230e-01f, +1.609460098e-01f, +1.259700807e-01f, +8.228007954e-02f, +3.972398743e-02f, +6.364635021e-03f, -1.363043864e-02f, -2.051459384e-02f, -1.792305959e-02f, -1.089754730e-02f, -3.877497643e-03f, +5.792119653e-04f, + +1.286812529e-03f, +9.155299037e-03f, +1.748336492e-02f, +1.955227852e-02f, +9.964639919e-03f, -1.059585920e-02f, -3.363835945e-02f, -4.631226617e-02f, -3.874861379e-02f, -1.092254977e-02f, +2.571086615e-02f, +5.357698140e-02f, +5.857272090e-02f, +3.812554342e-02f, +2.684680815e-03f, -3.029815454e-02f, -4.611248539e-02f, -4.028633047e-02f, -1.960684079e-02f, +3.243424672e-03f, +1.745796550e-02f, +1.936610295e-02f, +1.255547962e-02f, +3.847418502e-03f, + +1.034573888e-04f, +2.980704308e-04f, +4.549557051e-04f, +4.385264485e-04f, +1.330852042e-04f, -4.904835192e-04f, -1.331453758e-03f, -2.166344606e-03f, -2.713095511e-03f, -2.732520978e-03f, -2.127027991e-03f, -9.934308368e-04f, +3.964187036e-04f, +1.683354210e-03f, +2.543435997e-03f, +2.796397255e-03f, +2.457323339e-03f, +1.713788009e-03f, +8.424723868e-04f, +1.033249365e-04f, -3.448445120e-04f, -4.771523044e-04f, -3.790053132e-04f, -1.856173713e-04f, + -3.658877748e-04f, -5.656296573e-04f, -4.110468253e-04f, +1.784135208e-04f, +9.683913798e-04f, +1.480271883e-03f, +1.271853952e-03f, +2.628206788e-04f, -1.127698014e-03f, -2.164364927e-03f, -2.218785848e-03f, -1.171604375e-03f, +4.771737415e-04f, +1.879628459e-03f, +2.330915132e-03f, +1.669647890e-03f, +3.387548764e-04f, -9.152437854e-04f, -1.493739576e-03f, -1.257468758e-03f, -5.243308648e-04f, +2.005040300e-04f, +5.527235910e-04f, +4.818993757e-04f, + /* 3,12 (24) */ + +1.544535295e-03f, -1.541277256e-03f, -7.623800917e-03f, -1.510018635e-02f, -2.025734605e-02f, -1.809932235e-02f, -4.109389976e-03f, +2.364800170e-02f, +6.297543806e-02f, +1.073399992e-01f, +1.473337153e-01f, +1.734198720e-01f, +1.789996417e-01f, +1.626293640e-01f, +1.285135167e-01f, +8.507647679e-02f, +4.218131077e-02f, +8.078423030e-03f, -1.278796625e-02f, -2.041126890e-02f, -1.826790410e-02f, -1.137469961e-02f, -4.256502956e-03f, +3.935945940e-04f, + +9.209247542e-04f, +8.589669380e-03f, +1.707231809e-02f, +1.973069204e-02f, +1.093303130e-02f, -9.115587320e-03f, -3.236650550e-02f, -4.604944549e-02f, -3.987631180e-02f, -1.308691470e-02f, +2.349208031e-02f, +5.240537703e-02f, +5.904989465e-02f, +4.000517188e-02f, +5.015595947e-03f, -2.862850665e-02f, -4.577373051e-02f, -4.120157426e-02f, -2.110058037e-02f, +1.985955914e-03f, +1.693363464e-02f, +1.956660698e-02f, +1.310820321e-02f, +4.329317877e-03f, + +9.260021088e-05f, +2.857156265e-04f, +4.487787648e-04f, +4.471257811e-04f, +1.617985515e-04f, -4.434038066e-04f, -1.276272613e-03f, -2.119666297e-03f, -2.692427006e-03f, -2.749537436e-03f, -2.182345887e-03f, -1.075285051e-03f, +3.087561805e-04f, +1.612604977e-03f, +2.506546616e-03f, +2.799077135e-03f, +2.492974943e-03f, +1.767005156e-03f, +8.953774331e-04f, +1.419783847e-04f, -3.264831727e-04f, -4.769164640e-04f, -3.893762465e-04f, -1.979929869e-04f, + -3.472813090e-04f, -5.613051227e-04f, -4.340803772e-04f, +1.316393194e-04f, +9.216511183e-04f, +1.466029931e-03f, +1.310035268e-03f, +3.437100063e-04f, -1.043069845e-03f, -2.123754270e-03f, -2.249708036e-03f, -1.262523044e-03f, +3.721903161e-04f, +1.814702668e-03f, +2.336957375e-03f, +1.737624939e-03f, +4.276003658e-04f, -8.523975536e-04f, -1.482651727e-03f, -1.291762365e-03f, -5.750396416e-04f, +1.637979372e-04f, +5.441999838e-04f, +4.955783754e-04f, + /* 3,13 (24) */ + +1.637135506e-03f, -1.255561629e-03f, -7.175022152e-03f, -1.465306057e-02f, -2.009554750e-02f, -1.854272616e-02f, -5.385662589e-03f, +2.152833541e-02f, +6.028301106e-02f, +1.045904617e-01f, +1.451513694e-01f, +1.723445870e-01f, +1.793083979e-01f, +1.642419690e-01f, +1.310200633e-01f, +8.787555393e-02f, +4.467428571e-02f, +9.845428186e-03f, -1.189258882e-02f, -2.026929052e-02f, -1.859438728e-02f, -1.185161607e-02f, -4.645879202e-03f, +1.956016071e-04f, + +5.736434452e-04f, +8.028364257e-03f, +1.663823771e-02f, +1.986233136e-02f, +1.185468242e-02f, -7.649557389e-03f, -3.105647023e-02f, -4.570573549e-02f, -4.091938165e-02f, -1.521066897e-02f, +2.124237227e-02f, +5.114285398e-02f, +5.942208496e-02f, +4.181987455e-02f, +7.352553322e-03f, -2.689088171e-02f, -4.534613014e-02f, -4.205397181e-02f, -2.258323209e-02f, +6.941935492e-04f, +1.635859500e-02f, +1.973040491e-02f, +1.365240320e-02f, +4.824896253e-03f, + +8.201546497e-05f, +2.732581479e-04f, +4.419538543e-04f, +4.545892232e-04f, +1.892184824e-04f, -3.972566074e-04f, -1.221155193e-03f, -2.071919147e-03f, -2.669698029e-03f, -2.764049302e-03f, -2.235493821e-03f, -1.156024991e-03f, +2.207709909e-04f, +1.540207185e-03f, +2.467241525e-03f, +2.799358667e-03f, +2.526954351e-03f, +1.819657590e-03f, +9.487781880e-04f, +1.817908411e-04f, -3.068410823e-04f, -4.757332307e-04f, -3.993464764e-04f, -2.104601690e-04f, + -3.283795848e-04f, -5.555919034e-04f, -4.552902447e-04f, +8.583482063e-05f, +8.739496088e-04f, +1.448932127e-03f, +1.344873748e-03f, +4.228354067e-04f, -9.572208293e-04f, -2.079241865e-03f, -2.276061109e-03f, -1.350779544e-03f, +2.664164598e-04f, +1.745995343e-03f, +2.338402133e-03f, +1.802710912e-03f, +5.166085836e-04f, -7.868528144e-04f, -1.468191662e-03f, -1.323931112e-03f, -6.257092953e-04f, +1.255798718e-04f, +5.339073330e-04f, +5.083202561e-04f, + /* 3,14 (24) */ + +1.719150971e-03f, -9.823034812e-04f, -6.733068298e-03f, -1.419847135e-02f, -1.990632902e-02f, -1.893998277e-02f, -6.606817783e-03f, +1.945641626e-02f, +5.761331303e-02f, +1.018264124e-01f, +1.429158756e-01f, +1.711885620e-01f, +1.795291689e-01f, +1.657821762e-01f, +1.334873048e-01f, +9.067491260e-02f, +4.720124006e-02f, +1.166508578e-02f, -1.094381063e-02f, -2.008749968e-02f, -1.890122836e-02f, -1.232734930e-02f, -5.045225679e-03f, -1.485856194e-05f, + +2.452638605e-04f, +7.472772354e-03f, +1.618294747e-02f, +1.994816618e-02f, +1.272863203e-02f, -6.200625263e-03f, -2.971159648e-02f, -4.528290008e-02f, -4.187660248e-02f, -1.728991084e-02f, +1.896631116e-02f, +4.979207444e-02f, +5.968850142e-02f, +4.356586989e-02f, +9.690955455e-03f, -2.508817080e-02f, -4.482952156e-02f, -4.284082463e-02f, -2.405142376e-02f, -6.297375625e-04f, +1.573288570e-02f, +1.985598479e-02f, +1.418631053e-02f, +5.333216509e-03f, + +7.171793133e-05f, +2.607281858e-04f, +4.345162095e-04f, +4.609402801e-04f, +2.153407861e-04f, -3.520806754e-04f, -1.166167127e-03f, -2.023174408e-03f, -2.644958192e-03f, -2.776062594e-03f, -2.286427588e-03f, -1.235568842e-03f, +1.325550036e-04f, +1.466231160e-03f, +2.425546548e-03f, +2.797217717e-03f, +2.559200721e-03f, +1.871673067e-03f, +1.002617239e-03f, +2.227364395e-04f, -2.859105993e-04f, -4.735725955e-04f, -4.088809149e-04f, -2.229937837e-04f, + -3.092517675e-04f, -5.485484257e-04f, -4.746690398e-04f, +4.109231554e-05f, +8.254212634e-04f, +1.429068254e-03f, +1.376339999e-03f, +5.000433397e-04f, -8.703490222e-04f, -2.030950215e-03f, -2.297809027e-03f, -1.436191554e-03f, +1.600766433e-04f, +1.673642119e-03f, +2.335221636e-03f, +1.864741531e-03f, +6.055847117e-04f, -7.187217155e-04f, -1.450338834e-03f, -1.353857631e-03f, -6.762124622e-04f, +8.591185626e-05f, +5.218232591e-04f, +5.200556115e-04f, + /* 3,15 (24) */ + +1.790868903e-03f, -7.215752954e-04f, -6.298552089e-03f, -1.373753107e-02f, -1.969098823e-02f, -1.929206344e-02f, -7.772984909e-03f, +1.743324185e-02f, +5.496835484e-02f, +9.905034982e-02f, +1.406294480e-01f, +1.699529931e-01f, +1.796617239e-01f, +1.672484073e-01f, +1.359128514e-01f, +9.347213031e-02f, +4.976044078e-02f, +1.353675884e-02f, -9.941193394e-03f, -1.986476324e-02f, -1.918713896e-02f, -1.280092190e-02f, -5.454106594e-03f, -2.378523456e-04f, + -6.398790701e-05f, +6.924223928e-03f, +1.570827843e-02f, +1.998925849e-02f, +1.355405329e-02f, -4.771557009e-03f, -2.833525649e-02f, -4.478285674e-02f, -4.274695150e-02f, -1.932086105e-02f, +1.666850214e-02f, +4.835588289e-02f, +5.984857807e-02f, +4.523951201e-02f, +1.202617709e-02f, -2.322342926e-02f, -4.422393685e-02f, -4.355954634e-02f, -2.550176259e-02f, -1.983595193e-03f, +1.505667324e-02f, +1.994189664e-02f, +1.470813379e-02f, +5.853272120e-03f, + +6.172129803e-05f, +2.481551782e-04f, +4.265012055e-04f, +4.662037107e-04f, +2.401633161e-04f, -3.079126691e-04f, -1.111372868e-03f, -1.973503767e-03f, -2.618259216e-03f, -2.785586443e-03f, -2.335105944e-03f, -1.313836442e-03f, +4.420040917e-05f, +1.390749392e-03f, +2.381490657e-03f, +2.792633064e-03f, +2.589654838e-03f, +1.922979241e-03f, +1.056835617e-03f, +2.647871259e-04f, -2.636859589e-04f, -4.704054608e-04f, -4.179442895e-04f, -2.355677716e-04f, + -2.899658374e-04f, -5.402355369e-04f, -4.922146246e-04f, -2.500611640e-06f, +7.762001769e-04f, +1.406533530e-03f, +1.404413140e-03f, +5.751864623e-04f, -7.826531639e-04f, -1.979009750e-03f, -2.314926423e-03f, -1.518583567e-03f, +5.339670306e-05f, +1.597787307e-03f, +2.327398621e-03f, +1.923558464e-03f, +6.943321844e-04f, -6.481239362e-04f, -1.429080757e-03f, -1.381428286e-03f, -7.264197738e-04f, +4.486124072e-05f, +5.079300130e-04f, +5.307162707e-04f, + /* 4, 0 (24) */ + +5.910568274e-03f, +9.344012921e-03f, +6.715430524e-03f, -5.120571451e-03f, -2.296499959e-02f, -3.581520112e-02f, -2.874793219e-02f, +8.820490956e-03f, +7.496489258e-02f, +1.526479177e-01f, +2.154764560e-01f, +2.396078991e-01f, +2.154764560e-01f, +1.526479177e-01f, +7.496489258e-02f, +8.820490956e-03f, -2.874793219e-02f, -3.581520112e-02f, -2.296499959e-02f, -5.120571451e-03f, +6.715430524e-03f, +9.344012921e-03f, +5.910568274e-03f, +1.498636456e-03f, + -1.109690051e-02f, -9.192118277e-03f, +4.909501427e-03f, +2.390317093e-02f, +3.104677588e-02f, +1.408111182e-02f, -2.057860987e-02f, -4.829599839e-02f, -4.456558545e-02f, -7.016204252e-03f, +3.922878654e-02f, +5.990197477e-02f, +3.922878654e-02f, -7.016204252e-03f, -4.456558545e-02f, -4.829599839e-02f, -2.057860987e-02f, +1.408111182e-02f, +3.104677588e-02f, +2.390317093e-02f, +4.909501427e-03f, -9.192118277e-03f, -1.109690051e-02f, -5.253212842e-03f, + -2.951484991e-04f, -8.998572355e-05f, +4.255442201e-04f, +9.901057327e-04f, +1.116641160e-03f, +3.722451400e-04f, -1.274855305e-03f, -3.283987023e-03f, -4.716191528e-03f, -4.708889279e-03f, -2.988536699e-03f, -9.759711223e-05f, +2.832420010e-03f, +4.650032366e-03f, +4.764596193e-03f, +3.400912380e-03f, +1.398317305e-03f, -2.930402722e-04f, -1.098620861e-03f, -1.016363493e-03f, -4.637030991e-04f, +6.571341915e-05f, +2.920803586e-04f, +2.282445394e-04f, + +2.266093497e-04f, -4.797135611e-04f, -1.166867229e-03f, -1.027593860e-03f, +2.064743435e-04f, +1.758635466e-03f, +2.269131010e-03f, +9.906663742e-04f, -1.352215341e-03f, -2.966279869e-03f, -2.456219733e-03f, -8.652974051e-05f, +2.349601620e-03f, +3.003693677e-03f, +1.494439848e-03f, -8.598194762e-04f, -2.242182210e-03f, -1.834582014e-03f, -3.074334988e-04f, +9.798976511e-04f, +1.189646801e-03f, +5.316786300e-04f, -1.951059247e-04f, -4.246522513e-04f, + /* 4, 1 (24) */ + +5.615419775e-03f, +9.254027197e-03f, +7.140974744e-03f, -4.130465718e-03f, -2.184835843e-02f, -3.544295598e-02f, -3.002278750e-02f, +5.536503933e-03f, +7.024870105e-02f, +1.479390285e-01f, +2.124879193e-01f, +2.395103020e-01f, +2.183088760e-01f, +1.572979501e-01f, +7.972948877e-02f, +1.222140334e-02f, -2.734961489e-02f, -3.610824139e-02f, -2.406362045e-02f, -6.136934944e-03f, +6.251727425e-03f, +9.409726340e-03f, +6.202648633e-03f, +1.726880996e-03f, + -1.087029116e-02f, -9.671831838e-03f, +3.742634198e-03f, +2.287557707e-02f, +3.125325023e-02f, +1.583974728e-02f, -1.830947886e-02f, -4.730533201e-02f, -4.591780079e-02f, -9.982484121e-03f, +3.677256680e-02f, +5.981544503e-02f, +4.157838816e-02f, -4.012510575e-03f, -4.307114560e-02f, -4.915581786e-02f, -2.282079208e-02f, +1.224652980e-02f, +3.073934238e-02f, +2.488306858e-02f, +6.099148229e-03f, -8.660439647e-03f, -1.129200643e-02f, -5.677865093e-03f, + -2.970618278e-04f, -1.129423443e-04f, +3.876607392e-04f, +9.621230615e-04f, +1.131121191e-03f, +4.477215948e-04f, -1.152951352e-03f, -3.164785433e-03f, -4.661959248e-03f, -4.760768184e-03f, -3.139873279e-03f, -2.926316469e-04f, +2.671760396e-03f, +4.584236615e-03f, +4.807012809e-03f, +3.515307214e-03f, +1.523131068e-03f, -2.101728727e-04f, -1.076987578e-03f, -1.040762049e-03f, -5.020325956e-04f, +4.015283030e-05f, +2.878202400e-04f, +2.375338361e-04f, + +2.558786752e-04f, -4.277888735e-04f, -1.140670631e-03f, -1.070625390e-03f, +1.069857010e-04f, +1.678405860e-03f, +2.288550536e-03f, +1.116953835e-03f, -1.207005506e-03f, -2.919959996e-03f, -2.555009560e-03f, -2.593092511e-04f, +2.235480908e-03f, +3.032033182e-03f, +1.633187849e-03f, -7.247999891e-04f, -2.207693370e-03f, -1.905912608e-03f, -4.095350395e-04f, +9.276022135e-04f, +1.208828944e-03f, +5.834744348e-04f, -1.614262971e-04f, -4.267160150e-04f, + /* 4, 2 (24) */ + +5.318357947e-03f, +9.141084853e-03f, +7.528635483e-03f, -3.168342657e-03f, -2.071723724e-02f, -3.499523439e-02f, -3.117573885e-02f, +2.371718500e-03f, +6.558674180e-02f, +1.431782603e-01f, +2.093480460e-01f, +2.392176703e-01f, +2.209806364e-01f, +1.618821867e-01f, +8.453650158e-02f, +1.573671055e-02f, -2.582648382e-02f, -3.631841427e-02f, -2.514060803e-02f, -7.177696994e-03f, +5.749694829e-03f, +9.449879170e-03f, +6.490468873e-03f, +1.964414832e-03f, + -1.061441248e-02f, -1.009962071e-02f, +2.601963567e-03f, +2.180495168e-02f, +3.136023593e-02f, +1.751815314e-02f, -1.602092833e-02f, -4.618837818e-02f, -4.712480630e-02f, -1.290244412e-02f, +3.421755724e-02f, +5.955613578e-02f, +4.381386906e-02f, -9.804773931e-04f, -4.143795775e-02f, -4.988061785e-02f, -2.502848545e-02f, +1.034061719e-02f, +3.032980734e-02f, +2.581067080e-02f, +7.307977172e-03f, -8.076965213e-03f, -1.145343273e-02f, -6.104581108e-03f, + -2.978600871e-04f, -1.345608566e-04f, +3.501533590e-04f, +9.325503775e-04f, +1.142140271e-03f, +5.194134739e-04f, -1.032804775e-03f, -3.043562935e-03f, -4.602069579e-03f, -4.805643658e-03f, -3.286202528e-03f, -4.871874507e-04f, +2.506804536e-03f, +4.511554930e-03f, +4.843291167e-03f, +3.626918859e-03f, +1.649083741e-03f, -1.237185549e-04f, -1.051675519e-03f, -1.063168091e-03f, -5.404240438e-04f, +1.333639036e-05f, +2.823337555e-04f, +2.463641198e-04f, + +2.828673928e-04f, -3.761084583e-04f, -1.111246460e-03f, -1.108945667e-03f, +9.284478218e-06f, +1.594236343e-03f, +2.300477815e-03f, +1.238314598e-03f, -1.059308148e-03f, -2.864931819e-03f, -2.645672812e-03f, -4.312498432e-04f, +2.114209588e-03f, +3.051160400e-03f, +1.767976602e-03f, -5.860131168e-04f, -2.165680325e-03f, -1.972306011e-03f, -5.124407003e-04f, +8.707919742e-04f, +1.224243239e-03f, +6.348863357e-04f, -1.256397887e-04f, -4.268311281e-04f, + /* 4, 3 (24) */ + +5.020497860e-03f, +9.006523996e-03f, +7.878788842e-03f, -2.235792279e-03f, -1.957509697e-02f, -3.447582091e-02f, -3.220854363e-02f, -6.718444343e-04f, +6.098467222e-02f, +1.383726166e-01f, +2.060618435e-01f, +2.387304829e-01f, +2.234874410e-01f, +1.663937416e-01f, +8.937979275e-02f, +1.936362941e-02f, -2.417740008e-02f, -3.644213282e-02f, -2.619228355e-02f, -8.240865085e-03f, +5.209270785e-03f, +9.463215561e-03f, +6.772802628e-03f, +2.210778952e-03f, + -1.033154509e-02f, -1.047572917e-02f, +1.490717107e-03f, +2.069600601e-02f, +3.136952040e-02f, +1.911238949e-02f, -1.372045051e-02f, -4.495006358e-02f, -4.818411445e-02f, -1.576737594e-02f, +3.157188443e-02f, +5.912488593e-02f, +4.592807865e-02f, +2.070683007e-03f, -3.966998115e-02f, -5.046663097e-02f, -2.719416578e-02f, +8.368311183e-03f, +2.981736664e-02f, +2.668146277e-02f, +8.532220411e-03f, -7.442078877e-03f, -1.157907252e-02f, -6.531412236e-03f, + -2.975853885e-04f, -1.548237372e-04f, +3.131185268e-04f, +9.015228143e-04f, +1.149783980e-03f, +5.872742939e-04f, -9.146076028e-04f, -2.920575309e-03f, -4.536702075e-03f, -4.843503992e-03f, -3.427307645e-03f, -6.809464965e-04f, +2.337808095e-03f, +4.432053922e-03f, +4.873291706e-03f, +3.735496851e-03f, +1.775956290e-03f, -3.376265471e-05f, -1.022626124e-03f, -1.083449670e-03f, -5.787651005e-04f, -1.469838763e-05f, +2.755894962e-04f, +2.546810981e-04f, + +3.075402963e-04f, -3.248697309e-04f, -1.078792266e-03f, -1.142526828e-03f, -8.632466115e-05f, +1.506478905e-03f, +2.304975695e-03f, +1.354402136e-03f, -9.096258639e-04f, -2.801421778e-03f, -2.727939590e-03f, -6.017955435e-04f, +1.986164759e-03f, +3.060968227e-03f, +1.898333598e-03f, -4.438811070e-04f, -2.116185752e-03f, -2.033454008e-03f, -6.158032162e-04f, +8.095703561e-04f, +1.235730167e-03f, +6.856954984e-04f, -8.782713262e-05f, -4.249196111e-04f, + /* 4, 4 (24) */ + +4.722912471e-03f, +8.851700259e-03f, +8.191907369e-03f, -1.334269465e-03f, -1.842531299e-02f, -3.388854662e-02f, -3.312315123e-02f, -3.592419744e-03f, +5.644797015e-02f, +1.335291126e-01f, +2.026345359e-01f, +2.380495364e-01f, +2.258252491e-01f, +1.708257956e-01f, +9.425308445e-02f, +2.309912626e-02f, -2.240144379e-02f, -3.647589548e-02f, -2.721490967e-02f, -9.324314755e-03f, +4.630505685e-03f, +9.448517173e-03f, +7.048392124e-03f, +2.465460050e-03f, + -1.002400480e-02f, -1.080059890e-02f, +4.119248402e-04f, +1.955347919e-02f, +3.128319574e-02f, +2.061886839e-02f, -1.141547482e-02f, -4.359566145e-02f, -4.909374031e-02f, -1.856879772e-02f, +2.884394484e-02f, +5.852309039e-02f, +4.791424341e-02f, +5.131651235e-03f, -3.777164755e-02f, -5.091051208e-02f, -2.931035153e-02f, +6.334857175e-03f, +2.920156343e-02f, +2.749103313e-02f, +9.767950579e-03f, -6.756383379e-03f, -1.166689965e-02f, -6.956331847e-03f, + -2.962820044e-04f, -1.737182778e-04f, +2.766482744e-04f, +8.691753767e-04f, +1.154143821e-03f, +6.512671889e-04f, -7.985442235e-04f, -2.796078215e-03f, -4.466045145e-03f, -4.874351128e-03f, -3.562982669e-03f, -8.735924451e-04f, +2.165035212e-03f, +4.345813839e-03f, +4.896885906e-03f, +3.840793525e-03f, +1.903523927e-03f, +5.959980534e-05f, -9.897883643e-04f, -1.101476584e-03f, -6.169399693e-04f, -4.390887979e-05f, +2.675592264e-04f, +2.624303860e-04f, + +3.298733464e-04f, -2.742629533e-04f, -1.043512724e-03f, -1.171359473e-03f, -1.795502555e-04f, +1.415492934e-03f, +2.302132318e-03f, +1.464891720e-03f, -7.584642122e-04f, -2.729684053e-03f, -2.801569278e-03f, -7.703953239e-04f, +1.851747335e-03f, +3.061380951e-03f, +2.023798326e-03f, -2.988418656e-04f, -2.059279315e-03f, -2.089062742e-03f, -7.192675144e-04f, +7.440597219e-04f, +1.243141989e-03f, +7.356797266e-04f, -4.808040719e-05f, -4.209105440e-04f, + /* 4, 5 (24) */ + +4.426630467e-03f, +8.677981981e-03f, +8.468555643e-03f, -4.650940882e-04f, -1.727116917e-02f, -3.323727943e-02f, -3.392169545e-02f, -6.388497959e-03f, +5.198192500e-02f, +1.286547615e-01f, +1.990715532e-01f, +2.371759439e-01f, +2.279902843e-01f, +1.751716094e-01f, +9.914997036e-02f, +2.693991978e-02f, -2.049791986e-02f, -3.641629567e-02f, -2.820469804e-02f, -1.042579134e-02f, +4.013565716e-03f, +9.404608293e-03f, +7.315951351e-03f, +2.727890436e-03f, + -9.694131449e-03f, -1.107486185e-02f, -6.315878842e-04f, +1.838211971e-02f, +3.110364549e-02f, +2.203436132e-02f, -9.113342497e-03f, -4.213076973e-02f, -4.985220452e-02f, -2.129848177e-02f, +2.604237556e-02f, +5.775269507e-02f, +4.976599075e-02f, +8.193032186e-03f, -3.574784923e-02f, -5.120935394e-02f, -3.136963085e-02f, +4.245794433e-03f, +2.848229591e-02f, +2.823509285e-02f, +1.101109257e-02f, -6.020703652e-03f, -1.171498006e-02f, -7.377242391e-03f, + -2.939961575e-04f, -1.912364864e-04f, +2.408300730e-04f, +8.356425853e-04f, +1.155316863e-03f, +7.113648240e-04f, -6.847910800e-04f, -2.670326620e-03f, -4.390295559e-03f, -4.898200576e-03f, -3.693032886e-03f, -1.064811314e-03f, +1.988757954e-03f, +4.252928462e-03f, +4.913956657e-03f, +3.942564594e-03f, +2.031556539e-03f, +1.562641763e-04f, -9.531190211e-04f, -1.117120767e-03f, -6.548296388e-04f, -7.424733524e-05f, +2.582180735e-04f, +2.695576957e-04f, + +3.498534893e-04f, -2.244706013e-04f, -1.005618652e-03f, -1.195452352e-03f, -2.701149383e-04f, +1.321643778e-03f, +2.292060497e-03f, +1.569481383e-03f, -6.063298797e-04f, -2.649999522e-03f, -2.866351311e-03f, -9.365050536e-04f, +1.711380664e-03f, +3.052354649e-03f, +2.143924008e-03f, -1.513474996e-04f, -1.995057703e-03f, -2.138854013e-03f, -8.224719531e-04f, +6.744012400e-04f, +1.246343594e-03f, +7.846143283e-04f, -6.502917124e-06f, -4.147405942e-04f, + /* 4, 6 (24) */ + +4.132634310e-03f, +8.486745495e-03f, +8.709385716e-03f, +3.705484971e-04f, -1.611585230e-02f, -3.252591461e-02f, -3.460648653e-02f, -9.058824578e-03f, +4.759162944e-02f, +1.237565609e-01f, +1.953785203e-01f, +2.361111326e-01f, +2.299790422e-01f, +1.794245379e-01f, +1.040639270e-01f, +3.088248438e-02f, -1.846636332e-02f, -3.626003150e-02f, -2.915781706e-02f, -1.154291211e-02f, +3.358736077e-03f, +9.330360958e-03f, +7.574169424e-03f, +2.997448131e-03f, + -9.344277959e-03f, -1.129933246e-02f, -1.637206536e-03f, +1.718666736e-02f, +3.083353055e-02f, +2.335600510e-02f, -6.821282000e-03f, -4.056128834e-02f, -5.045853440e-02f, -2.394848129e-02f, +2.317602425e-02f, +5.681619001e-02f, +5.147737141e-02f, +1.124538683e-02f, -3.360392522e-02f, -5.136070144e-02f, -3.336468855e-02f, +2.106940420e-03f, +2.765982396e-02f, +2.890949409e-02f, +1.225743616e-02f, -5.236089324e-03f, -1.172148298e-02f, -7.791982986e-03f, + -2.907758097e-04f, -2.073749764e-04f, +2.057467055e-04f, +8.010581284e-04f, +1.153405375e-03f, +7.675492868e-04f, -5.735163829e-04f, -2.543574237e-03f, -4.309657937e-03f, -4.915081283e-03f, -3.817275195e-03f, -1.254292140e-03f, +1.809255757e-03f, +4.153504979e-03f, +4.924398615e-03f, +4.040569734e-03f, +2.159819149e-03f, +2.561162685e-04f, -9.125829546e-04f, -1.130256677e-03f, -6.923121357e-04f, -1.056608750e-04f, +2.475447115e-04f, +2.760090310e-04f, + +3.674784300e-04f, -1.756667778e-04f, -9.653260198e-04f, -1.214831985e-03f, -3.577562621e-04f, +1.225301290e-03f, +2.274897005e-03f, +1.667892799e-03f, -4.537288554e-04f, -2.562674624e-03f, -2.922105845e-03f, -1.099589424e-03f, +1.565509063e-03f, +3.033877471e-03f, +2.258279288e-03f, -1.862795885e-06f, -1.923644569e-03f, -2.182566527e-03f, -9.250496052e-04f, +6.007546715e-04f, +1.245213312e-03f, +8.322730096e-04f, +3.679097804e-05f, -4.063545219e-04f, + /* 4, 7 (24) */ + +3.841858500e-03f, +8.279370519e-03f, +8.915132422e-03f, +1.171606625e-03f, -1.496244693e-02f, -3.175836532e-02f, -3.518000291e-02f, -1.160239881e-02f, +4.328197151e-02f, +1.188414796e-01f, +1.915612451e-01f, +2.348568405e-01f, +2.317882980e-01f, +1.835780428e-01f, +1.089883256e-01f, +3.492305411e-02f, -1.630654417e-02f, -3.600391523e-02f, -3.007040001e-02f, -1.267316878e-02f, +2.666423941e-03f, +9.224700083e-03f, +7.821714136e-03f, +3.273457162e-03f, + -8.976799529e-03f, -1.147499923e-02f, -2.602532556e-03f, +1.597183538e-02f, +3.047577429e-02f, +2.458130639e-02f, -4.546384995e-03f, -3.889339554e-02f, -5.091226326e-02f, -2.651115591e-02f, +2.025391841e-02f, +5.571660059e-02f, +5.304288047e-02f, +1.427926431e-02f, -3.134564593e-02f, -5.136256424e-02f, -3.528833312e-02f, -7.562610744e-05f, +2.673477435e-02f, +2.951024876e-02f, +1.350264947e-02f, -4.403816314e-03f, -1.168469200e-02f, -8.198337507e-03f, + -2.866704507e-04f, -2.221348446e-04f, +1.714761543e-04f, +7.655545239e-04f, +1.148516462e-03f, +8.198119566e-04f, -4.648798487e-04f, -2.416072973e-03f, -4.224344227e-03f, -4.925035484e-03f, -3.935538460e-03f, -1.441727638e-03f, +1.626814845e-03f, +4.047663820e-03f, +4.928118518e-03f, +4.134573166e-03f, +2.288072386e-03f, +3.590324632e-04f, -8.681533514e-04f, -1.140761684e-03f, -7.292627917e-04f, -1.380915066e-04f, +2.355215382e-04f, +2.817308867e-04f, + +3.827563625e-04f, -1.280166756e-04f, -9.228549643e-04f, -1.229542213e-03f, -4.422274506e-04f, +1.126838381e-03f, +2.250801790e-03f, +1.759872062e-03f, -3.011646206e-04f, -2.468040139e-03f, -2.968684302e-03f, -1.259123840e-03f, +1.414596274e-03f, +3.005969800e-03f, +2.366449877e-03f, +1.491363604e-04f, -1.845190363e-03f, -2.219957098e-03f, -1.026629580e-03f, +5.232980778e-04f, +1.239643690e-03f, +8.784287942e-04f, +8.167608907e-05f, -3.957056594e-04f, + /* 4, 8 (24) */ + +3.555188049e-03f, +8.057235674e-03f, +9.086608576e-03f, +1.937161149e-03f, -1.381393047e-02f, -3.093855336e-02f, -3.564488276e-02f, -1.401847179e-02f, +3.905762728e-02f, +1.139164441e-01f, +1.876257067e-01f, +2.334151128e-01f, +2.334151128e-01f, +1.876257067e-01f, +1.139164441e-01f, +3.905762728e-02f, -1.401847179e-02f, -3.564488276e-02f, -3.093855336e-02f, -1.381393047e-02f, +1.937161149e-03f, +9.086608576e-03f, +8.057235674e-03f, +3.555188049e-03f, + -8.594043167e-03f, -1.160301591e-02f, -3.525387520e-03f, +1.474229316e-02f, +3.003354684e-02f, +2.570814477e-02f, -2.295583205e-03f, -3.713352348e-02f, -5.121342788e-02f, -2.897919605e-02f, +1.728523411e-02f, +5.445747675e-02f, +5.445747675e-02f, +1.728523411e-02f, -2.897919605e-02f, -5.121342788e-02f, -3.713352348e-02f, -2.295583205e-03f, +2.570814477e-02f, +3.003354684e-02f, +1.474229316e-02f, -3.525387520e-03f, -1.160301591e-02f, -8.594043167e-03f, + -2.817308867e-04f, -2.355215382e-04f, +1.380915066e-04f, +7.292627917e-04f, +1.140761684e-03f, +8.681533514e-04f, -3.590324632e-04f, -2.288072386e-03f, -4.134573166e-03f, -4.928118518e-03f, -4.047663820e-03f, -1.626814845e-03f, +1.441727638e-03f, +3.935538460e-03f, +4.925035484e-03f, +4.224344227e-03f, +2.416072973e-03f, +4.648798487e-04f, -8.198119566e-04f, -1.148516462e-03f, -7.655545239e-04f, -1.714761543e-04f, +2.221348446e-04f, +2.866704507e-04f, + +3.957056594e-04f, -8.167608907e-05f, -8.784287942e-04f, -1.239643690e-03f, -5.232980778e-04f, +1.026629580e-03f, +2.219957098e-03f, +1.845190363e-03f, -1.491363604e-04f, -2.366449877e-03f, -3.005969800e-03f, -1.414596274e-03f, +1.259123840e-03f, +2.968684302e-03f, +2.468040139e-03f, +3.011646206e-04f, -1.759872062e-03f, -2.250801790e-03f, -1.126838381e-03f, +4.422274506e-04f, +1.229542213e-03f, +9.228549643e-04f, +1.280166756e-04f, -3.827563625e-04f, + /* 4, 9 (24) */ + +3.273457162e-03f, +7.821714136e-03f, +9.224700083e-03f, +2.666423941e-03f, -1.267316878e-02f, -3.007040001e-02f, -3.600391523e-02f, -1.630654417e-02f, +3.492305411e-02f, +1.089883256e-01f, +1.835780428e-01f, +2.317882980e-01f, +2.348568405e-01f, +1.915612451e-01f, +1.188414796e-01f, +4.328197151e-02f, -1.160239881e-02f, -3.518000291e-02f, -3.175836532e-02f, -1.496244693e-02f, +1.171606625e-03f, +8.915132422e-03f, +8.279370519e-03f, +3.841858500e-03f, + -8.198337507e-03f, -1.168469200e-02f, -4.403816314e-03f, +1.350264947e-02f, +2.951024876e-02f, +2.673477435e-02f, -7.562610744e-05f, -3.528833312e-02f, -5.136256424e-02f, -3.134564593e-02f, +1.427926431e-02f, +5.304288047e-02f, +5.571660059e-02f, +2.025391841e-02f, -2.651115591e-02f, -5.091226326e-02f, -3.889339554e-02f, -4.546384995e-03f, +2.458130639e-02f, +3.047577429e-02f, +1.597183538e-02f, -2.602532556e-03f, -1.147499923e-02f, -8.976799529e-03f, + -2.760090310e-04f, -2.475447115e-04f, +1.056608750e-04f, +6.923121357e-04f, +1.130256677e-03f, +9.125829546e-04f, -2.561162685e-04f, -2.159819149e-03f, -4.040569734e-03f, -4.924398615e-03f, -4.153504979e-03f, -1.809255757e-03f, +1.254292140e-03f, +3.817275195e-03f, +4.915081283e-03f, +4.309657937e-03f, +2.543574237e-03f, +5.735163829e-04f, -7.675492868e-04f, -1.153405375e-03f, -8.010581284e-04f, -2.057467055e-04f, +2.073749764e-04f, +2.907758097e-04f, + +4.063545219e-04f, -3.679097804e-05f, -8.322730096e-04f, -1.245213312e-03f, -6.007546715e-04f, +9.250496052e-04f, +2.182566527e-03f, +1.923644569e-03f, +1.862795885e-06f, -2.258279288e-03f, -3.033877471e-03f, -1.565509063e-03f, +1.099589424e-03f, +2.922105845e-03f, +2.562674624e-03f, +4.537288554e-04f, -1.667892799e-03f, -2.274897005e-03f, -1.225301290e-03f, +3.577562621e-04f, +1.214831985e-03f, +9.653260198e-04f, +1.756667778e-04f, -3.674784300e-04f, + /* 4,10 (24) */ + +2.997448131e-03f, +7.574169424e-03f, +9.330360958e-03f, +3.358736077e-03f, -1.154291211e-02f, -2.915781706e-02f, -3.626003150e-02f, -1.846636332e-02f, +3.088248438e-02f, +1.040639270e-01f, +1.794245379e-01f, +2.299790422e-01f, +2.361111326e-01f, +1.953785203e-01f, +1.237565609e-01f, +4.759162944e-02f, -9.058824578e-03f, -3.460648653e-02f, -3.252591461e-02f, -1.611585230e-02f, +3.705484971e-04f, +8.709385716e-03f, +8.486745495e-03f, +4.132634310e-03f, + -7.791982986e-03f, -1.172148298e-02f, -5.236089324e-03f, +1.225743616e-02f, +2.890949409e-02f, +2.765982396e-02f, +2.106940420e-03f, -3.336468855e-02f, -5.136070144e-02f, -3.360392522e-02f, +1.124538683e-02f, +5.147737141e-02f, +5.681619001e-02f, +2.317602425e-02f, -2.394848129e-02f, -5.045853440e-02f, -4.056128834e-02f, -6.821282000e-03f, +2.335600510e-02f, +3.083353055e-02f, +1.718666736e-02f, -1.637206536e-03f, -1.129933246e-02f, -9.344277959e-03f, + -2.695576957e-04f, -2.582180735e-04f, +7.424733524e-05f, +6.548296388e-04f, +1.117120767e-03f, +9.531190211e-04f, -1.562641763e-04f, -2.031556539e-03f, -3.942564594e-03f, -4.913956657e-03f, -4.252928462e-03f, -1.988757954e-03f, +1.064811314e-03f, +3.693032886e-03f, +4.898200576e-03f, +4.390295559e-03f, +2.670326620e-03f, +6.847910800e-04f, -7.113648240e-04f, -1.155316863e-03f, -8.356425853e-04f, -2.408300730e-04f, +1.912364864e-04f, +2.939961575e-04f, + +4.147405942e-04f, +6.502917124e-06f, -7.846143283e-04f, -1.246343594e-03f, -6.744012400e-04f, +8.224719531e-04f, +2.138854013e-03f, +1.995057703e-03f, +1.513474996e-04f, -2.143924008e-03f, -3.052354649e-03f, -1.711380664e-03f, +9.365050536e-04f, +2.866351311e-03f, +2.649999522e-03f, +6.063298797e-04f, -1.569481383e-03f, -2.292060497e-03f, -1.321643778e-03f, +2.701149383e-04f, +1.195452352e-03f, +1.005618652e-03f, +2.244706013e-04f, -3.498534893e-04f, + /* 4,11 (24) */ + +2.727890436e-03f, +7.315951351e-03f, +9.404608293e-03f, +4.013565716e-03f, -1.042579134e-02f, -2.820469804e-02f, -3.641629567e-02f, -2.049791986e-02f, +2.693991978e-02f, +9.914997036e-02f, +1.751716094e-01f, +2.279902843e-01f, +2.371759439e-01f, +1.990715532e-01f, +1.286547615e-01f, +5.198192500e-02f, -6.388497959e-03f, -3.392169545e-02f, -3.323727943e-02f, -1.727116917e-02f, -4.650940882e-04f, +8.468555643e-03f, +8.677981981e-03f, +4.426630467e-03f, + -7.377242391e-03f, -1.171498006e-02f, -6.020703652e-03f, +1.101109257e-02f, +2.823509285e-02f, +2.848229591e-02f, +4.245794433e-03f, -3.136963085e-02f, -5.120935394e-02f, -3.574784923e-02f, +8.193032186e-03f, +4.976599075e-02f, +5.775269507e-02f, +2.604237556e-02f, -2.129848177e-02f, -4.985220452e-02f, -4.213076973e-02f, -9.113342497e-03f, +2.203436132e-02f, +3.110364549e-02f, +1.838211971e-02f, -6.315878842e-04f, -1.107486185e-02f, -9.694131449e-03f, + -2.624303860e-04f, -2.675592264e-04f, +4.390887979e-05f, +6.169399693e-04f, +1.101476584e-03f, +9.897883643e-04f, -5.959980534e-05f, -1.903523927e-03f, -3.840793525e-03f, -4.896885906e-03f, -4.345813839e-03f, -2.165035212e-03f, +8.735924451e-04f, +3.562982669e-03f, +4.874351128e-03f, +4.466045145e-03f, +2.796078215e-03f, +7.985442235e-04f, -6.512671889e-04f, -1.154143821e-03f, -8.691753767e-04f, -2.766482744e-04f, +1.737182778e-04f, +2.962820044e-04f, + +4.209105440e-04f, +4.808040719e-05f, -7.356797266e-04f, -1.243141989e-03f, -7.440597219e-04f, +7.192675144e-04f, +2.089062742e-03f, +2.059279315e-03f, +2.988418656e-04f, -2.023798326e-03f, -3.061380951e-03f, -1.851747335e-03f, +7.703953239e-04f, +2.801569278e-03f, +2.729684053e-03f, +7.584642122e-04f, -1.464891720e-03f, -2.302132318e-03f, -1.415492934e-03f, +1.795502555e-04f, +1.171359473e-03f, +1.043512724e-03f, +2.742629533e-04f, -3.298733464e-04f, + /* 4,12 (24) */ + +2.465460050e-03f, +7.048392124e-03f, +9.448517173e-03f, +4.630505685e-03f, -9.324314755e-03f, -2.721490967e-02f, -3.647589548e-02f, -2.240144379e-02f, +2.309912626e-02f, +9.425308445e-02f, +1.708257956e-01f, +2.258252491e-01f, +2.380495364e-01f, +2.026345359e-01f, +1.335291126e-01f, +5.644797015e-02f, -3.592419744e-03f, -3.312315123e-02f, -3.388854662e-02f, -1.842531299e-02f, -1.334269465e-03f, +8.191907369e-03f, +8.851700259e-03f, +4.722912471e-03f, + -6.956331847e-03f, -1.166689965e-02f, -6.756383379e-03f, +9.767950579e-03f, +2.749103313e-02f, +2.920156343e-02f, +6.334857175e-03f, -2.931035153e-02f, -5.091051208e-02f, -3.777164755e-02f, +5.131651235e-03f, +4.791424341e-02f, +5.852309039e-02f, +2.884394484e-02f, -1.856879772e-02f, -4.909374031e-02f, -4.359566145e-02f, -1.141547482e-02f, +2.061886839e-02f, +3.128319574e-02f, +1.955347919e-02f, +4.119248402e-04f, -1.080059890e-02f, -1.002400480e-02f, + -2.546810981e-04f, -2.755894962e-04f, +1.469838763e-05f, +5.787651005e-04f, +1.083449670e-03f, +1.022626124e-03f, +3.376265471e-05f, -1.775956290e-03f, -3.735496851e-03f, -4.873291706e-03f, -4.432053922e-03f, -2.337808095e-03f, +6.809464965e-04f, +3.427307645e-03f, +4.843503992e-03f, +4.536702075e-03f, +2.920575309e-03f, +9.146076028e-04f, -5.872742939e-04f, -1.149783980e-03f, -9.015228143e-04f, -3.131185268e-04f, +1.548237372e-04f, +2.975853885e-04f, + +4.249196111e-04f, +8.782713262e-05f, -6.856954984e-04f, -1.235730167e-03f, -8.095703561e-04f, +6.158032162e-04f, +2.033454008e-03f, +2.116185752e-03f, +4.438811070e-04f, -1.898333598e-03f, -3.060968227e-03f, -1.986164759e-03f, +6.017955435e-04f, +2.727939590e-03f, +2.801421778e-03f, +9.096258639e-04f, -1.354402136e-03f, -2.304975695e-03f, -1.506478905e-03f, +8.632466115e-05f, +1.142526828e-03f, +1.078792266e-03f, +3.248697309e-04f, -3.075402963e-04f, + /* 4,13 (24) */ + +2.210778952e-03f, +6.772802628e-03f, +9.463215561e-03f, +5.209270785e-03f, -8.240865085e-03f, -2.619228355e-02f, -3.644213282e-02f, -2.417740008e-02f, +1.936362941e-02f, +8.937979275e-02f, +1.663937416e-01f, +2.234874410e-01f, +2.387304829e-01f, +2.060618435e-01f, +1.383726166e-01f, +6.098467222e-02f, -6.718444343e-04f, -3.220854363e-02f, -3.447582091e-02f, -1.957509697e-02f, -2.235792279e-03f, +7.878788842e-03f, +9.006523996e-03f, +5.020497860e-03f, + -6.531412236e-03f, -1.157907252e-02f, -7.442078877e-03f, +8.532220411e-03f, +2.668146277e-02f, +2.981736664e-02f, +8.368311183e-03f, -2.719416578e-02f, -5.046663097e-02f, -3.966998115e-02f, +2.070683007e-03f, +4.592807865e-02f, +5.912488593e-02f, +3.157188443e-02f, -1.576737594e-02f, -4.818411445e-02f, -4.495006358e-02f, -1.372045051e-02f, +1.911238949e-02f, +3.136952040e-02f, +2.069600601e-02f, +1.490717107e-03f, -1.047572917e-02f, -1.033154509e-02f, + -2.463641198e-04f, -2.823337555e-04f, -1.333639036e-05f, +5.404240438e-04f, +1.063168091e-03f, +1.051675519e-03f, +1.237185549e-04f, -1.649083741e-03f, -3.626918859e-03f, -4.843291167e-03f, -4.511554930e-03f, -2.506804536e-03f, +4.871874507e-04f, +3.286202528e-03f, +4.805643658e-03f, +4.602069579e-03f, +3.043562935e-03f, +1.032804775e-03f, -5.194134739e-04f, -1.142140271e-03f, -9.325503775e-04f, -3.501533590e-04f, +1.345608566e-04f, +2.978600871e-04f, + +4.268311281e-04f, +1.256397887e-04f, -6.348863357e-04f, -1.224243239e-03f, -8.707919742e-04f, +5.124407003e-04f, +1.972306011e-03f, +2.165680325e-03f, +5.860131168e-04f, -1.767976602e-03f, -3.051160400e-03f, -2.114209588e-03f, +4.312498432e-04f, +2.645672812e-03f, +2.864931819e-03f, +1.059308148e-03f, -1.238314598e-03f, -2.300477815e-03f, -1.594236343e-03f, -9.284478218e-06f, +1.108945667e-03f, +1.111246460e-03f, +3.761084583e-04f, -2.828673928e-04f, + /* 4,14 (24) */ + +1.964414832e-03f, +6.490468873e-03f, +9.449879170e-03f, +5.749694829e-03f, -7.177696994e-03f, -2.514060803e-02f, -3.631841427e-02f, -2.582648382e-02f, +1.573671055e-02f, +8.453650158e-02f, +1.618821867e-01f, +2.209806364e-01f, +2.392176703e-01f, +2.093480460e-01f, +1.431782603e-01f, +6.558674180e-02f, +2.371718500e-03f, -3.117573885e-02f, -3.499523439e-02f, -2.071723724e-02f, -3.168342657e-03f, +7.528635483e-03f, +9.141084853e-03f, +5.318357947e-03f, + -6.104581108e-03f, -1.145343273e-02f, -8.076965213e-03f, +7.307977172e-03f, +2.581067080e-02f, +3.032980734e-02f, +1.034061719e-02f, -2.502848545e-02f, -4.988061785e-02f, -4.143795775e-02f, -9.804773931e-04f, +4.381386906e-02f, +5.955613578e-02f, +3.421755724e-02f, -1.290244412e-02f, -4.712480630e-02f, -4.618837818e-02f, -1.602092833e-02f, +1.751815314e-02f, +3.136023593e-02f, +2.180495168e-02f, +2.601963567e-03f, -1.009962071e-02f, -1.061441248e-02f, + -2.375338361e-04f, -2.878202400e-04f, -4.015283030e-05f, +5.020325956e-04f, +1.040762049e-03f, +1.076987578e-03f, +2.101728727e-04f, -1.523131068e-03f, -3.515307214e-03f, -4.807012809e-03f, -4.584236615e-03f, -2.671760396e-03f, +2.926316469e-04f, +3.139873279e-03f, +4.760768184e-03f, +4.661959248e-03f, +3.164785433e-03f, +1.152951352e-03f, -4.477215948e-04f, -1.131121191e-03f, -9.621230615e-04f, -3.876607392e-04f, +1.129423443e-04f, +2.970618278e-04f, + +4.267160150e-04f, +1.614262971e-04f, -5.834744348e-04f, -1.208828944e-03f, -9.276022135e-04f, +4.095350395e-04f, +1.905912608e-03f, +2.207693370e-03f, +7.247999891e-04f, -1.633187849e-03f, -3.032033182e-03f, -2.235480908e-03f, +2.593092511e-04f, +2.555009560e-03f, +2.919959996e-03f, +1.207005506e-03f, -1.116953835e-03f, -2.288550536e-03f, -1.678405860e-03f, -1.069857010e-04f, +1.070625390e-03f, +1.140670631e-03f, +4.277888735e-04f, -2.558786752e-04f, + /* 4,15 (24) */ + +1.726880996e-03f, +6.202648633e-03f, +9.409726340e-03f, +6.251727425e-03f, -6.136934944e-03f, -2.406362045e-02f, -3.610824139e-02f, -2.734961489e-02f, +1.222140334e-02f, +7.972948877e-02f, +1.572979501e-01f, +2.183088760e-01f, +2.395103020e-01f, +2.124879193e-01f, +1.479390285e-01f, +7.024870105e-02f, +5.536503933e-03f, -3.002278750e-02f, -3.544295598e-02f, -2.184835843e-02f, -4.130465718e-03f, +7.140974744e-03f, +9.254027197e-03f, +5.615419775e-03f, + -5.677865093e-03f, -1.129200643e-02f, -8.660439647e-03f, +6.099148229e-03f, +2.488306858e-02f, +3.073934238e-02f, +1.224652980e-02f, -2.282079208e-02f, -4.915581786e-02f, -4.307114560e-02f, -4.012510575e-03f, +4.157838816e-02f, +5.981544503e-02f, +3.677256680e-02f, -9.982484121e-03f, -4.591780079e-02f, -4.730533201e-02f, -1.830947886e-02f, +1.583974728e-02f, +3.125325023e-02f, +2.287557707e-02f, +3.742634198e-03f, -9.671831838e-03f, -1.087029116e-02f, + -2.282445394e-04f, -2.920803586e-04f, -6.571341915e-05f, +4.637030991e-04f, +1.016363493e-03f, +1.098620861e-03f, +2.930402722e-04f, -1.398317305e-03f, -3.400912380e-03f, -4.764596193e-03f, -4.650032366e-03f, -2.832420010e-03f, +9.759711223e-05f, +2.988536699e-03f, +4.708889279e-03f, +4.716191528e-03f, +3.283987023e-03f, +1.274855305e-03f, -3.722451400e-04f, -1.116641160e-03f, -9.901057327e-04f, -4.255442201e-04f, +8.998572355e-05f, +2.951484991e-04f, + +4.246522513e-04f, +1.951059247e-04f, -5.316786300e-04f, -1.189646801e-03f, -9.798976511e-04f, +3.074334988e-04f, +1.834582014e-03f, +2.242182210e-03f, +8.598194762e-04f, -1.494439848e-03f, -3.003693677e-03f, -2.349601620e-03f, +8.652974051e-05f, +2.456219733e-03f, +2.966279869e-03f, +1.352215341e-03f, -9.906663742e-04f, -2.269131010e-03f, -1.758635466e-03f, -2.064743435e-04f, +1.027593860e-03f, +1.166867229e-03f, +4.797135611e-04f, -2.266093497e-04f, + /* 5, 0 (24) */ + -5.186332235e-03f, +1.518946434e-04f, +1.162493195e-02f, +1.878259948e-02f, +8.081776293e-03f, -2.173408931e-02f, -4.932654206e-02f, -3.947550743e-02f, +3.039930713e-02f, +1.456317135e-01f, +2.547052426e-01f, +2.995098738e-01f, +2.547052426e-01f, +1.456317135e-01f, +3.039930713e-02f, -3.947550743e-02f, -4.932654206e-02f, -2.173408931e-02f, +8.081776293e-03f, +1.878259948e-02f, +1.162493195e-02f, +1.518946434e-04f, -5.186332235e-03f, -3.754576386e-03f, + +4.242013348e-03f, -9.588893426e-03f, -2.119040083e-02f, -1.121093231e-02f, +1.893667489e-02f, +3.896879828e-02f, +1.996482241e-02f, -2.696432742e-02f, -5.400015650e-02f, -2.740375830e-02f, +3.023509818e-02f, +5.990197477e-02f, +3.023509818e-02f, -2.740375830e-02f, -5.400015650e-02f, -2.696432742e-02f, +1.996482241e-02f, +3.896879828e-02f, +1.893667489e-02f, -1.121093231e-02f, -2.119040083e-02f, -9.588893426e-03f, +4.242013348e-03f, +7.021039821e-03f, + -6.853914940e-05f, -5.696992846e-04f, -7.413230094e-04f, -3.748812743e-05f, +1.323115503e-03f, +2.130880606e-03f, +9.942757047e-04f, -2.293320649e-03f, -6.068406868e-03f, -7.675169148e-03f, -5.444756432e-03f, -1.841268527e-04f, +5.182021629e-03f, +7.653726044e-03f, +6.259036041e-03f, +2.541092904e-03f, -8.438649054e-04f, -2.127622286e-03f, -1.406054360e-03f, -3.646584188e-05f, +7.259437023e-04f, +5.973920492e-04f, +9.697443390e-05f, -1.964077119e-04f, + +5.374915272e-04f, +1.017778343e-03f, +2.436272238e-04f, -1.397678832e-03f, -1.990629293e-03f, -2.634004448e-04f, +2.374588747e-03f, +2.905843317e-03f, +2.220752786e-04f, -3.102308260e-03f, -3.394742513e-03f, -1.279374424e-04f, +3.274975965e-03f, +3.237786595e-03f, +9.010092975e-06f, -2.823196934e-03f, -2.498183523e-03f, +9.573325739e-05f, +1.951245075e-03f, +1.487925287e-03f, -1.516704686e-04f, -1.012001821e-03f, -5.873543182e-04f, +1.452572160e-04f, + /* 5, 1 (24) */ + -5.254871384e-03f, -4.178046412e-04f, +1.088360894e-02f, +1.874511135e-02f, +9.404891796e-03f, -1.960320870e-02f, -4.833226636e-02f, -4.176882808e-02f, +2.433090026e-02f, +1.379565443e-01f, +2.492604861e-01f, +2.993257470e-01f, +2.598872642e-01f, +1.532854395e-01f, +3.665834317e-02f, -3.693441453e-02f, -5.017040697e-02f, -2.386171159e-02f, +6.675721933e-03f, +1.874613364e-02f, +1.235087565e-02f, +7.492866926e-04f, -5.089357801e-03f, -3.950984098e-03f, + +4.779504875e-03f, -8.571115083e-03f, -2.094677361e-02f, -1.260861114e-02f, +1.694604560e-02f, +3.870539783e-02f, +2.233941116e-02f, -2.405848410e-02f, -5.377808122e-02f, -3.050606656e-02f, +2.684035567e-02f, +5.977403733e-02f, +3.351007415e-02f, -2.416597170e-02f, -5.399114641e-02f, -2.978752435e-02f, +1.746663889e-02f, +3.906453154e-02f, +2.088791997e-02f, -9.723007024e-03f, -2.134207130e-02f, -1.060089525e-02f, +3.654659030e-03f, +7.166297037e-03f, + -4.118315267e-05f, -5.407312178e-04f, -7.530098918e-04f, -1.085023281e-04f, +1.238106892e-03f, +2.126127454e-03f, +1.135599185e-03f, -2.047831598e-03f, -5.868964755e-03f, -7.680728180e-03f, -5.694882839e-03f, -5.519408980e-04f, +4.907241304e-03f, +7.616269797e-03f, +6.440200658e-03f, +2.790507225e-03f, -6.845623020e-04f, -2.116085481e-03f, -1.486522618e-03f, -1.131598359e-04f, +7.067963479e-04f, +6.236272651e-04f, +1.263939429e-04f, -1.891821789e-04f, + +4.868326252e-04f, +1.018121641e-03f, +3.315723436e-04f, -1.303129426e-03f, -2.019914373e-03f, -4.268501547e-04f, +2.242057320e-03f, +2.974500897e-03f, +4.502080806e-04f, -2.953783155e-03f, -3.499075769e-03f, -3.832212247e-04f, +3.140289727e-03f, +3.359518155e-03f, +2.419900705e-04f, -2.726798420e-03f, -2.612125139e-03f, -7.540916074e-05f, +1.901747710e-03f, +1.573302243e-03f, -5.607367513e-05f, -1.000641246e-03f, -6.360907922e-04f, +1.119438402e-04f, + /* 5, 2 (24) */ + -5.296054537e-03f, -9.585358590e-04f, +1.013059905e-02f, +1.863660902e-02f, +1.064299869e-02f, -1.747708125e-02f, -4.719666718e-02f, -4.381665968e-02f, +1.846193550e-02f, +1.302758162e-01f, +2.435656033e-01f, +2.987738061e-01f, +2.647945055e-01f, +1.609017093e-01f, +4.309854382e-02f, -3.414390730e-02f, -5.085496927e-02f, -2.597779707e-02f, +5.189199315e-03f, +1.863297380e-02f, +1.305767200e-02f, +1.372913958e-03f, -4.962963858e-03f, -4.140166276e-03f, + +5.266337501e-03f, -7.552993442e-03f, -2.061520126e-02f, -1.391174057e-02f, +1.492613123e-02f, +3.827854768e-02f, +2.458146848e-02f, -2.108398320e-02f, -5.332787314e-02f, -3.345984971e-02f, +2.334127990e-02f, +5.939081610e-02f, +3.665036387e-02f, -2.080645355e-02f, -5.374915634e-02f, -3.251432277e-02f, +1.485451375e-02f, +3.898912237e-02f, +2.278966768e-02f, -8.149704780e-03f, -2.139814497e-02f, -1.160153649e-02f, +3.018568238e-03f, +7.278240878e-03f, + -1.499269425e-05f, -5.106693149e-04f, -7.610931012e-04f, -1.763952895e-04f, +1.151424749e-03f, +2.113649817e-03f, +1.267673040e-03f, -1.805248337e-03f, -5.661377727e-03f, -7.670575477e-03f, -5.931875340e-03f, -9.184372939e-04f, +4.621014124e-03f, +7.562715330e-03f, +6.611267769e-03f, +3.040905742e-03f, -5.165965845e-04f, -2.096024566e-03f, -1.564116219e-03f, -1.923761170e-04f, +6.838191950e-04f, +6.482227261e-04f, +1.566939668e-04f, -1.804670083e-04f, + +4.357017427e-04f, +1.013208586e-03f, +4.151652822e-04f, -1.204853345e-03f, -2.039165191e-03f, -5.853729931e-04f, +2.101340124e-03f, +3.029003320e-03f, +6.743527600e-04f, -2.792970240e-03f, -3.587537314e-03f, -6.367346213e-04f, +2.991270227e-03f, +3.466865657e-03f, +4.757894207e-04f, -2.616954258e-03f, -2.715735564e-03f, -2.492550854e-04f, +1.842175043e-03f, +1.653256174e-03f, +4.276187297e-05f, -9.835734075e-04f, -6.833665337e-04f, +7.610423209e-05f, + /* 5, 3 (24) */ + -5.311047231e-03f, -1.469205174e-03f, +9.369505949e-03f, +1.846021373e-02f, +1.179442344e-02f, -1.536343143e-02f, -4.592899414e-02f, -4.562190802e-02f, +1.280055778e-02f, +1.226052407e-01f, +2.376337280e-01f, +2.978553688e-01f, +2.694155196e-01f, +1.684644246e-01f, +4.970981159e-02f, -3.110300156e-02f, -5.137156586e-02f, -2.807382164e-02f, +3.625083096e-03f, +1.844059768e-02f, +1.374149120e-02f, +2.021136684e-03f, -4.806269891e-03f, -4.320633285e-03f, + +5.702039243e-03f, -6.539784856e-03f, -2.020003598e-02f, -1.511659391e-02f, +1.288696603e-02f, +3.769317469e-02f, +2.668280860e-02f, -1.805497988e-02f, -5.265352038e-02f, -3.625281995e-02f, +1.975374259e-02f, +5.875408148e-02f, +3.964163410e-02f, -1.733958789e-02f, -5.327336691e-02f, -3.513127703e-02f, +1.213877818e-02f, +3.873986729e-02f, +2.463184272e-02f, -6.496448606e-03f, -2.135538310e-02f, -1.258510990e-02f, +2.335201704e-03f, +7.354345110e-03f, + +9.954907849e-06f, -4.796934681e-04f, -7.656737396e-04f, -2.410040137e-04f, +1.063459319e-03f, +2.093753199e-03f, +1.390368093e-03f, -1.566173173e-03f, -5.446327939e-03f, -7.644925770e-03f, -6.155247235e-03f, -1.282742040e-03f, +4.323972854e-03f, +7.493022150e-03f, +6.771625305e-03f, +3.291615744e-03f, -3.402294621e-04f, -2.067216663e-03f, -1.638429341e-03f, -2.738793138e-04f, +6.569650669e-04f, +6.709971107e-04f, +1.877623636e-04f, -1.702385130e-04f, + +3.844151532e-04f, +1.003240387e-03f, +4.940977046e-04f, -1.103433293e-03f, -2.048496253e-03f, -7.382955736e-04f, +1.953218183e-03f, +3.069254691e-03f, +8.935011650e-04f, -2.620683371e-03f, -3.659765892e-03f, -8.873071002e-04f, +2.828573971e-03f, +3.559258001e-03f, +7.093209057e-04f, -2.494039861e-03f, -2.808379188e-03f, -4.250068959e-04f, +1.772617490e-03f, +1.727249866e-03f, +1.444067703e-04f, -9.607041710e-04f, -7.288448583e-04f, +3.786197773e-05f, + /* 5, 4 (24) */ + -5.301092324e-03f, -1.948898642e-03f, +8.603832209e-03f, +1.821920972e-02f, +1.285788276e-02f, -1.326967823e-02f, -4.453862604e-02f, -4.718808119e-02f, +7.354229837e-03f, +1.149603149e-01f, +2.314784807e-01f, +2.965726268e-01f, +2.737394925e-01f, +1.759574468e-01f, +5.648143690e-02f, -2.781138582e-02f, -5.171179532e-02f, -3.014103830e-02f, +1.986653755e-03f, +1.816671837e-02f, +1.439845626e-02f, +2.692133794e-03f, -4.618507528e-03f, -4.490871798e-03f, + +6.086454396e-03f, -5.536544469e-03f, -1.970593828e-02f, -1.622002721e-02f, +1.083846978e-02f, +3.695487911e-02f, +2.863602678e-02f, -1.498572519e-02f, -5.176001921e-02f, -3.887350333e-02f, +1.609397669e-02f, +5.786677438e-02f, +4.247020807e-02f, -1.378032989e-02f, -5.256404601e-02f, -3.762531689e-02f, +9.330398994e-03f, +3.831486039e-02f, +2.640446021e-02f, -4.769198741e-03f, -2.121097633e-02f, -1.354581407e-02f, +1.606356846e-03f, +7.392207087e-03f, + +3.359134204e-05f, -4.479812312e-04f, -7.668644500e-04f, -3.021840960e-04f, +9.745935658e-04f, +2.066760123e-03f, +1.503588095e-03f, -1.331186495e-03f, -5.224509357e-03f, -7.604035182e-03f, -6.364551947e-03f, -1.643987769e-03f, +4.016782547e-03f, +7.407194790e-03f, +6.920684232e-03f, +3.541951659e-03f, -1.557553883e-04f, -2.029462937e-03f, -1.709055879e-03f, -3.574168621e-04f, +6.262020199e-04f, +6.917708468e-04f, +2.194788192e-04f, -1.584801580e-04f, + +3.332795848e-04f, +9.884407955e-04f, +5.680944390e-04f, -9.994551411e-04f, -2.048070203e-03f, -8.849834373e-04f, +1.798498320e-03f, +3.095229353e-03f, +1.106677360e-03f, -2.437786994e-03f, -3.715478990e-03f, -1.133782663e-03f, +2.652924440e-03f, +3.636193412e-03f, +9.414906444e-04f, -2.358498330e-03f, -2.889466587e-03f, -6.018448430e-04f, +1.693218472e-03f, +1.794765679e-03f, +2.484052497e-04f, -9.319697936e-04f, -7.721888174e-04f, -2.639140442e-06f, + /* 5, 5 (24) */ + -5.267500982e-03f, -2.396879873e-03f, +7.836967759e-03f, +1.791702563e-02f, +1.383247632e-02f, -1.120291811e-02f, -4.303503795e-02f, -4.851926768e-02f, +2.129720480e-03f, +1.073562797e-01f, +2.251139288e-01f, +2.949286390e-01f, +2.777562750e-01f, +1.833646416e-01f, +6.340212113e-02f, -2.426943416e-02f, -5.186755071e-02f, -3.217050124e-02f, +2.775978765e-04f, +1.780930151e-02f, +1.502465828e-02f, +3.383904641e-03f, -4.399028709e-03f, -4.649351956e-03f, + +6.419733981e-03f, -4.548103674e-03f, -1.913784384e-02f, -1.721948235e-02f, +8.790399578e-03f, +3.606989567e-02f, +3.043452510e-02f, -1.189049584e-02f, -5.065334185e-02f, -4.131129032e-02f, +1.237849770e-02f, +5.673299172e-02f, +4.512313251e-02f, -1.014413648e-02f, -5.162255536e-02f, -3.998381522e-02f, +6.440932407e-03f, +3.771301555e-02f, +2.809767868e-02f, -2.974433062e-03f, -2.096257108e-02f, -1.447778387e-02f, +8.341680284e-04f, +7.389567947e-03f, + +5.585733180e-05f, -4.157070877e-04f, -7.647885786e-04f, -3.598097665e-04f, +8.852019243e-04f, +2.033008602e-03f, +1.607269417e-03f, -1.100845237e-03f, -4.996625439e-03f, -7.548200098e-03f, -6.559384197e-03f, -2.001316367e-03f, +3.700138618e-03f, +7.305283111e-03f, +7.057880665e-03f, +3.791217094e-03f, +3.649883589e-05f, -1.982589837e-03f, -1.775590974e-03f, -4.427195273e-04f, +5.915139548e-04f, +7.103669930e-04f, +2.517151564e-04f, -1.451828985e-04f, + +2.825906333e-04f, +9.690542132e-04f, +6.369142213e-04f, -8.935047057e-04f, -2.038096100e-03f, -1.024843725e-03f, +1.638008733e-03f, +3.106971295e-03f, +1.312942243e-03f, -2.245191588e-03f, -3.754474007e-03f, -1.375025553e-03f, +2.465108642e-03f, +3.697242238e-03f, +1.171203543e-03f, -2.210838844e-03f, -2.958458089e-03f, -7.789309878e-04f, +1.604174580e-03f, +1.855308757e-03f, +3.542771309e-04f, -8.973380884e-04f, -8.130632555e-04f, -4.523544693e-05f, + /* 5, 6 (24) */ + -5.211643650e-03f, -2.812586961e-03f, +7.072179181e-03f, +1.755721586e-02f, +1.471767825e-02f, -9.169909503e-03f, -4.142776853e-02f, -4.962011292e-02f, -2.866904959e-03f, +9.980807962e-02f, +2.185545446e-01f, +2.929273226e-01f, +2.814564136e-01f, +1.906699247e-01f, +7.046000180e-02f, -2.047821706e-02f, -5.183105187e-02f, -3.415309108e-02f, -1.497993098e-03f, +1.736658198e-02f, +1.561617224e-02f, +4.094271634e-03f, -4.147313552e-03f, -4.794534854e-03f, + +6.702324615e-03f, -3.579049461e-03f, -1.850092962e-02f, -1.811298705e-02f, +6.752303478e-03f, +3.504505195e-02f, +3.207253384e-02f, -8.783524544e-03f, -4.934039961e-02f, -4.355648191e-02f, +8.624023698e-03f, +5.535796616e-02f, +4.758824115e-02f, -6.446894241e-03f, -5.045135182e-02f, -4.219465407e-02f, +3.482474317e-03f, +3.693408456e-02f, +2.970185326e-02f, -1.119124305e-03f, -2.060829395e-02f, -1.537512195e-02f, +2.110477292e-05f, +7.344332500e-03f, + +7.670262023e-05f, -3.830417542e-04f, -7.595793143e-04f, -4.137738564e-04f, +7.956491128e-04f, +1.992850577e-03f, +1.701380622e-03f, -8.756814373e-04f, -4.763386793e-03f, -7.477755907e-03f, -6.739381041e-03f, -2.353881564e-03f, +3.374764820e-03f, +7.187382450e-03f, +7.182677903e-03f, +4.038706938e-03f, +2.361745800e-04f, -1.926450259e-03f, -1.837632560e-03f, -5.295020055e-04f, +5.529011764e-04f, +7.266121346e-04f, +2.843356895e-04f, -1.303454908e-04f, + +2.326312842e-04f, +9.453437237e-04f, +7.003502290e-04f, -7.861645888e-04f, -2.018827472e-03f, -1.157327590e-03f, +1.472594509e-03f, +3.104593217e-03f, +1.511397935e-03f, -2.043848905e-03f, -3.776629019e-03f, -1.609925854e-03f, +2.265973321e-03f, +3.742049389e-03f, +1.397368767e-03f, -2.051634698e-03f, -3.014867117e-03f, -9.554132892e-04f, +1.505735444e-03f, +1.908410172e-03f, +4.615199501e-04f, -8.568094310e-04f, -8.511369096e-04f, -8.974381342e-05f, + /* 5, 7 (24) */ + -5.134941029e-03f, -3.195628715e-03f, +6.312599866e-03f, +1.714344200e-02f, +1.551332736e-02f, -7.177058927e-03f, -3.972638791e-02f, -5.049579436e-02f, -7.630291751e-03f, +9.233032372e-02f, +2.118151635e-01f, +2.905734411e-01f, +2.848311785e-01f, +1.978573071e-01f, +7.764267970e-02f, -1.643951013e-02f, -5.159487729e-02f, -3.607954133e-02f, -3.335625657e-03f, +1.683707998e-02f, +1.616907341e-02f, +4.820883769e-03f, -3.862977863e-03f, -4.924880345e-03f, + +6.934955899e-03f, -2.633705737e-03f, -1.780057939e-02f, -1.889915164e-02f, +4.733476006e-03f, +3.388772436e-02f, +3.354512835e-02f, -5.678931327e-03f, -4.782900168e-02f, -4.560033081e-02f, +4.847394679e-03f, +5.374804031e-02f, +4.985421448e-02f, -2.704844852e-03f, -4.905398305e-02f, -4.424628876e-02f, +4.676072000e-04f, +3.597867127e-02f, +3.120758871e-02f, +7.892858666e-04f, -2.014677400e-02f, -1.623193138e-02f, -8.300321367e-04f, +7.254588687e-03f, + +9.608591183e-05f, -3.501515202e-04f, -7.513788099e-04f, -4.639876892e-04f, +7.062890113e-04f, +1.946650338e-03f, +1.785921941e-03f, -6.562009107e-04f, -4.525508848e-03f, -7.393075623e-03f, -6.904222762e-03f, -2.700851479e-03f, +3.041411119e-03f, +7.053633621e-03f, +7.294568394e-03f, +4.283709527e-03f, +4.428820227e-04f, -1.860924634e-03f, -1.894782932e-03f, -6.174636061e-04f, +5.103808984e-04f, +7.403372875e-04f, +3.171976273e-04f, -1.139747727e-04f, + +1.836705515e-04f, +9.175890628e-04f, +7.582304082e-04f, -6.780110980e-04f, -1.990560162e-03f, -1.281932341e-03f, +1.303113105e-03f, +3.088275241e-03f, +1.701191931e-03f, -1.834747021e-03f, -3.781903129e-03f, -1.837404960e-03f, +2.056420874e-03f, +3.770336402e-03f, +1.618905221e-03f, -1.881520982e-03f, -3.058263286e-03f, -1.130429823e-03f, +1.398203313e-03f, +1.953629977e-03f, +5.696112611e-04f, -8.104175945e-04f, -8.860845375e-04f, -1.359622363e-04f, + /* 5, 8 (24) */ + -5.038855118e-03f, -3.545780235e-03f, +5.561221056e-03f, +1.667945431e-02f, +1.621961637e-02f, -5.230408589e-03f, -3.794046597e-02f, -5.115199527e-02f, -1.215580060e-02f, +8.493724809e-02f, +2.049109408e-01f, +2.878725896e-01f, +2.878725896e-01f, +2.049109408e-01f, +8.493724809e-02f, -1.215580060e-02f, -5.115199527e-02f, -3.794046597e-02f, -5.230408589e-03f, +1.621961637e-02f, +1.667945431e-02f, +5.561221056e-03f, -3.545780235e-03f, -5.038855118e-03f, + +7.118626450e-03f, -1.716116674e-03f, -1.704234898e-02f, -1.957716274e-02f, +2.742915844e-03f, +3.260579202e-02f, +3.484824145e-02f, -2.590656086e-03f, -4.612780975e-02f, -4.743507783e-02f, +1.065491550e-03f, +5.191063535e-02f, +5.191063535e-02f, +1.065491550e-03f, -4.743507783e-02f, -4.612780975e-02f, -2.590656086e-03f, +3.484824145e-02f, +3.260579202e-02f, +2.742915844e-03f, -1.957716274e-02f, -1.704234898e-02f, -1.716116674e-03f, +7.118626450e-03f, + +1.139747727e-04f, -3.171976273e-04f, -7.403372875e-04f, -5.103808984e-04f, +6.174636061e-04f, +1.894782932e-03f, +1.860924634e-03f, -4.428820227e-04f, -4.283709527e-03f, -7.294568394e-03f, -7.053633621e-03f, -3.041411119e-03f, +2.700851479e-03f, +6.904222762e-03f, +7.393075623e-03f, +4.525508848e-03f, +6.562009107e-04f, -1.785921941e-03f, -1.946650338e-03f, -7.062890113e-04f, +4.639876892e-04f, +7.513788099e-04f, +3.501515202e-04f, -9.608591183e-05f, + +1.359622363e-04f, +8.860845375e-04f, +8.104175945e-04f, -5.696112611e-04f, -1.953629977e-03f, -1.398203313e-03f, +1.130429823e-03f, +3.058263286e-03f, +1.881520982e-03f, -1.618905221e-03f, -3.770336402e-03f, -2.056420874e-03f, +1.837404960e-03f, +3.781903129e-03f, +1.834747021e-03f, -1.701191931e-03f, -3.088275241e-03f, -1.303113105e-03f, +1.281932341e-03f, +1.990560162e-03f, +6.780110980e-04f, -7.582304082e-04f, -9.175890628e-04f, -1.836705515e-04f, + /* 5, 9 (24) */ + -4.924880345e-03f, -3.862977863e-03f, +4.820883769e-03f, +1.616907341e-02f, +1.683707998e-02f, -3.335625657e-03f, -3.607954133e-02f, -5.159487729e-02f, -1.643951013e-02f, +7.764267970e-02f, +1.978573071e-01f, +2.848311785e-01f, +2.905734411e-01f, +2.118151635e-01f, +9.233032372e-02f, -7.630291751e-03f, -5.049579436e-02f, -3.972638791e-02f, -7.177058927e-03f, +1.551332736e-02f, +1.714344200e-02f, +6.312599866e-03f, -3.195628715e-03f, -5.134941029e-03f, + +7.254588687e-03f, -8.300321367e-04f, -1.623193138e-02f, -2.014677400e-02f, +7.892858666e-04f, +3.120758871e-02f, +3.597867127e-02f, +4.676072000e-04f, -4.424628876e-02f, -4.905398305e-02f, -2.704844852e-03f, +4.985421448e-02f, +5.374804031e-02f, +4.847394679e-03f, -4.560033081e-02f, -4.782900168e-02f, -5.678931327e-03f, +3.354512835e-02f, +3.388772436e-02f, +4.733476006e-03f, -1.889915164e-02f, -1.780057939e-02f, -2.633705737e-03f, +6.934955899e-03f, + +1.303454908e-04f, -2.843356895e-04f, -7.266121346e-04f, -5.529011764e-04f, +5.295020055e-04f, +1.837632560e-03f, +1.926450259e-03f, -2.361745800e-04f, -4.038706938e-03f, -7.182677903e-03f, -7.187382450e-03f, -3.374764820e-03f, +2.353881564e-03f, +6.739381041e-03f, +7.477755907e-03f, +4.763386793e-03f, +8.756814373e-04f, -1.701380622e-03f, -1.992850577e-03f, -7.956491128e-04f, +4.137738564e-04f, +7.595793143e-04f, +3.830417542e-04f, -7.670262023e-05f, + +8.974381342e-05f, +8.511369096e-04f, +8.568094310e-04f, -4.615199501e-04f, -1.908410172e-03f, -1.505735444e-03f, +9.554132892e-04f, +3.014867117e-03f, +2.051634698e-03f, -1.397368767e-03f, -3.742049389e-03f, -2.265973321e-03f, +1.609925854e-03f, +3.776629019e-03f, +2.043848905e-03f, -1.511397935e-03f, -3.104593217e-03f, -1.472594509e-03f, +1.157327590e-03f, +2.018827472e-03f, +7.861645888e-04f, -7.003502290e-04f, -9.453437237e-04f, -2.326312842e-04f, + /* 5,10 (24) */ + -4.794534854e-03f, -4.147313552e-03f, +4.094271634e-03f, +1.561617224e-02f, +1.736658198e-02f, -1.497993098e-03f, -3.415309108e-02f, -5.183105187e-02f, -2.047821706e-02f, +7.046000180e-02f, +1.906699247e-01f, +2.814564136e-01f, +2.929273226e-01f, +2.185545446e-01f, +9.980807962e-02f, -2.866904959e-03f, -4.962011292e-02f, -4.142776853e-02f, -9.169909503e-03f, +1.471767825e-02f, +1.755721586e-02f, +7.072179181e-03f, -2.812586961e-03f, -5.211643650e-03f, + +7.344332500e-03f, +2.110477292e-05f, -1.537512195e-02f, -2.060829395e-02f, -1.119124305e-03f, +2.970185326e-02f, +3.693408456e-02f, +3.482474317e-03f, -4.219465407e-02f, -5.045135182e-02f, -6.446894241e-03f, +4.758824115e-02f, +5.535796616e-02f, +8.624023698e-03f, -4.355648191e-02f, -4.934039961e-02f, -8.783524544e-03f, +3.207253384e-02f, +3.504505195e-02f, +6.752303478e-03f, -1.811298705e-02f, -1.850092962e-02f, -3.579049461e-03f, +6.702324615e-03f, + +1.451828985e-04f, -2.517151564e-04f, -7.103669930e-04f, -5.915139548e-04f, +4.427195273e-04f, +1.775590974e-03f, +1.982589837e-03f, -3.649883589e-05f, -3.791217094e-03f, -7.057880665e-03f, -7.305283111e-03f, -3.700138618e-03f, +2.001316367e-03f, +6.559384197e-03f, +7.548200098e-03f, +4.996625439e-03f, +1.100845237e-03f, -1.607269417e-03f, -2.033008602e-03f, -8.852019243e-04f, +3.598097665e-04f, +7.647885786e-04f, +4.157070877e-04f, -5.585733180e-05f, + +4.523544693e-05f, +8.130632555e-04f, +8.973380884e-04f, -3.542771309e-04f, -1.855308757e-03f, -1.604174580e-03f, +7.789309878e-04f, +2.958458089e-03f, +2.210838844e-03f, -1.171203543e-03f, -3.697242238e-03f, -2.465108642e-03f, +1.375025553e-03f, +3.754474007e-03f, +2.245191588e-03f, -1.312942243e-03f, -3.106971295e-03f, -1.638008733e-03f, +1.024843725e-03f, +2.038096100e-03f, +8.935047057e-04f, -6.369142213e-04f, -9.690542132e-04f, -2.825906333e-04f, + /* 5,11 (24) */ + -4.649351956e-03f, -4.399028709e-03f, +3.383904641e-03f, +1.502465828e-02f, +1.780930151e-02f, +2.775978765e-04f, -3.217050124e-02f, -5.186755071e-02f, -2.426943416e-02f, +6.340212113e-02f, +1.833646416e-01f, +2.777562750e-01f, +2.949286390e-01f, +2.251139288e-01f, +1.073562797e-01f, +2.129720480e-03f, -4.851926768e-02f, -4.303503795e-02f, -1.120291811e-02f, +1.383247632e-02f, +1.791702563e-02f, +7.836967759e-03f, -2.396879873e-03f, -5.267500982e-03f, + +7.389567947e-03f, +8.341680284e-04f, -1.447778387e-02f, -2.096257108e-02f, -2.974433062e-03f, +2.809767868e-02f, +3.771301555e-02f, +6.440932407e-03f, -3.998381522e-02f, -5.162255536e-02f, -1.014413648e-02f, +4.512313251e-02f, +5.673299172e-02f, +1.237849770e-02f, -4.131129032e-02f, -5.065334185e-02f, -1.189049584e-02f, +3.043452510e-02f, +3.606989567e-02f, +8.790399578e-03f, -1.721948235e-02f, -1.913784384e-02f, -4.548103674e-03f, +6.419733981e-03f, + +1.584801580e-04f, -2.194788192e-04f, -6.917708468e-04f, -6.262020199e-04f, +3.574168621e-04f, +1.709055879e-03f, +2.029462937e-03f, +1.557553883e-04f, -3.541951659e-03f, -6.920684232e-03f, -7.407194790e-03f, -4.016782547e-03f, +1.643987769e-03f, +6.364551947e-03f, +7.604035182e-03f, +5.224509357e-03f, +1.331186495e-03f, -1.503588095e-03f, -2.066760123e-03f, -9.745935658e-04f, +3.021840960e-04f, +7.668644500e-04f, +4.479812312e-04f, -3.359134204e-05f, + +2.639140442e-06f, +7.721888174e-04f, +9.319697936e-04f, -2.484052497e-04f, -1.794765679e-03f, -1.693218472e-03f, +6.018448430e-04f, +2.889466587e-03f, +2.358498330e-03f, -9.414906444e-04f, -3.636193412e-03f, -2.652924440e-03f, +1.133782663e-03f, +3.715478990e-03f, +2.437786994e-03f, -1.106677360e-03f, -3.095229353e-03f, -1.798498320e-03f, +8.849834373e-04f, +2.048070203e-03f, +9.994551411e-04f, -5.680944390e-04f, -9.884407955e-04f, -3.332795848e-04f, + /* 5,12 (24) */ + -4.490871798e-03f, -4.618507528e-03f, +2.692133794e-03f, +1.439845626e-02f, +1.816671837e-02f, +1.986653755e-03f, -3.014103830e-02f, -5.171179532e-02f, -2.781138582e-02f, +5.648143690e-02f, +1.759574468e-01f, +2.737394925e-01f, +2.965726268e-01f, +2.314784807e-01f, +1.149603149e-01f, +7.354229837e-03f, -4.718808119e-02f, -4.453862604e-02f, -1.326967823e-02f, +1.285788276e-02f, +1.821920972e-02f, +8.603832209e-03f, -1.948898642e-03f, -5.301092324e-03f, + +7.392207087e-03f, +1.606356846e-03f, -1.354581407e-02f, -2.121097633e-02f, -4.769198741e-03f, +2.640446021e-02f, +3.831486039e-02f, +9.330398994e-03f, -3.762531689e-02f, -5.256404601e-02f, -1.378032989e-02f, +4.247020807e-02f, +5.786677438e-02f, +1.609397669e-02f, -3.887350333e-02f, -5.176001921e-02f, -1.498572519e-02f, +2.863602678e-02f, +3.695487911e-02f, +1.083846978e-02f, -1.622002721e-02f, -1.970593828e-02f, -5.536544469e-03f, +6.086454396e-03f, + +1.702385130e-04f, -1.877623636e-04f, -6.709971107e-04f, -6.569650669e-04f, +2.738793138e-04f, +1.638429341e-03f, +2.067216663e-03f, +3.402294621e-04f, -3.291615744e-03f, -6.771625305e-03f, -7.493022150e-03f, -4.323972854e-03f, +1.282742040e-03f, +6.155247235e-03f, +7.644925770e-03f, +5.446327939e-03f, +1.566173173e-03f, -1.390368093e-03f, -2.093753199e-03f, -1.063459319e-03f, +2.410040137e-04f, +7.656737396e-04f, +4.796934681e-04f, -9.954907849e-06f, + -3.786197773e-05f, +7.288448583e-04f, +9.607041710e-04f, -1.444067703e-04f, -1.727249866e-03f, -1.772617490e-03f, +4.250068959e-04f, +2.808379188e-03f, +2.494039861e-03f, -7.093209057e-04f, -3.559258001e-03f, -2.828573971e-03f, +8.873071002e-04f, +3.659765892e-03f, +2.620683371e-03f, -8.935011650e-04f, -3.069254691e-03f, -1.953218183e-03f, +7.382955736e-04f, +2.048496253e-03f, +1.103433293e-03f, -4.940977046e-04f, -1.003240387e-03f, -3.844151532e-04f, + /* 5,13 (24) */ + -4.320633285e-03f, -4.806269891e-03f, +2.021136684e-03f, +1.374149120e-02f, +1.844059768e-02f, +3.625083096e-03f, -2.807382164e-02f, -5.137156586e-02f, -3.110300156e-02f, +4.970981159e-02f, +1.684644246e-01f, +2.694155196e-01f, +2.978553688e-01f, +2.376337280e-01f, +1.226052407e-01f, +1.280055778e-02f, -4.562190802e-02f, -4.592899414e-02f, -1.536343143e-02f, +1.179442344e-02f, +1.846021373e-02f, +9.369505949e-03f, -1.469205174e-03f, -5.311047231e-03f, + +7.354345110e-03f, +2.335201704e-03f, -1.258510990e-02f, -2.135538310e-02f, -6.496448606e-03f, +2.463184272e-02f, +3.873986729e-02f, +1.213877818e-02f, -3.513127703e-02f, -5.327336691e-02f, -1.733958789e-02f, +3.964163410e-02f, +5.875408148e-02f, +1.975374259e-02f, -3.625281995e-02f, -5.265352038e-02f, -1.805497988e-02f, +2.668280860e-02f, +3.769317469e-02f, +1.288696603e-02f, -1.511659391e-02f, -2.020003598e-02f, -6.539784856e-03f, +5.702039243e-03f, + +1.804670083e-04f, -1.566939668e-04f, -6.482227261e-04f, -6.838191950e-04f, +1.923761170e-04f, +1.564116219e-03f, +2.096024566e-03f, +5.165965845e-04f, -3.040905742e-03f, -6.611267769e-03f, -7.562715330e-03f, -4.621014124e-03f, +9.184372939e-04f, +5.931875340e-03f, +7.670575477e-03f, +5.661377727e-03f, +1.805248337e-03f, -1.267673040e-03f, -2.113649817e-03f, -1.151424749e-03f, +1.763952895e-04f, +7.610931012e-04f, +5.106693149e-04f, +1.499269425e-05f, + -7.610423209e-05f, +6.833665337e-04f, +9.835734075e-04f, -4.276187297e-05f, -1.653256174e-03f, -1.842175043e-03f, +2.492550854e-04f, +2.715735564e-03f, +2.616954258e-03f, -4.757894207e-04f, -3.466865657e-03f, -2.991270227e-03f, +6.367346213e-04f, +3.587537314e-03f, +2.792970240e-03f, -6.743527600e-04f, -3.029003320e-03f, -2.101340124e-03f, +5.853729931e-04f, +2.039165191e-03f, +1.204853345e-03f, -4.151652822e-04f, -1.013208586e-03f, -4.357017427e-04f, + /* 5,14 (24) */ + -4.140166276e-03f, -4.962963858e-03f, +1.372913958e-03f, +1.305767200e-02f, +1.863297380e-02f, +5.189199315e-03f, -2.597779707e-02f, -5.085496927e-02f, -3.414390730e-02f, +4.309854382e-02f, +1.609017093e-01f, +2.647945055e-01f, +2.987738061e-01f, +2.435656033e-01f, +1.302758162e-01f, +1.846193550e-02f, -4.381665968e-02f, -4.719666718e-02f, -1.747708125e-02f, +1.064299869e-02f, +1.863660902e-02f, +1.013059905e-02f, -9.585358590e-04f, -5.296054537e-03f, + +7.278240878e-03f, +3.018568238e-03f, -1.160153649e-02f, -2.139814497e-02f, -8.149704780e-03f, +2.278966768e-02f, +3.898912237e-02f, +1.485451375e-02f, -3.251432277e-02f, -5.374915634e-02f, -2.080645355e-02f, +3.665036387e-02f, +5.939081610e-02f, +2.334127990e-02f, -3.345984971e-02f, -5.332787314e-02f, -2.108398320e-02f, +2.458146848e-02f, +3.827854768e-02f, +1.492613123e-02f, -1.391174057e-02f, -2.061520126e-02f, -7.552993442e-03f, +5.266337501e-03f, + +1.891821789e-04f, -1.263939429e-04f, -6.236272651e-04f, -7.067963479e-04f, +1.131598359e-04f, +1.486522618e-03f, +2.116085481e-03f, +6.845623020e-04f, -2.790507225e-03f, -6.440200658e-03f, -7.616269797e-03f, -4.907241304e-03f, +5.519408980e-04f, +5.694882839e-03f, +7.680728180e-03f, +5.868964755e-03f, +2.047831598e-03f, -1.135599185e-03f, -2.126127454e-03f, -1.238106892e-03f, +1.085023281e-04f, +7.530098918e-04f, +5.407312178e-04f, +4.118315267e-05f, + -1.119438402e-04f, +6.360907922e-04f, +1.000641246e-03f, +5.607367513e-05f, -1.573302243e-03f, -1.901747710e-03f, +7.540916074e-05f, +2.612125139e-03f, +2.726798420e-03f, -2.419900705e-04f, -3.359518155e-03f, -3.140289727e-03f, +3.832212247e-04f, +3.499075769e-03f, +2.953783155e-03f, -4.502080806e-04f, -2.974500897e-03f, -2.242057320e-03f, +4.268501547e-04f, +2.019914373e-03f, +1.303129426e-03f, -3.315723436e-04f, -1.018121641e-03f, -4.868326252e-04f, + /* 5,15 (24) */ + -3.950984098e-03f, -5.089357801e-03f, +7.492866926e-04f, +1.235087565e-02f, +1.874613364e-02f, +6.675721933e-03f, -2.386171159e-02f, -5.017040697e-02f, -3.693441453e-02f, +3.665834317e-02f, +1.532854395e-01f, +2.598872642e-01f, +2.993257470e-01f, +2.492604861e-01f, +1.379565443e-01f, +2.433090026e-02f, -4.176882808e-02f, -4.833226636e-02f, -1.960320870e-02f, +9.404891796e-03f, +1.874511135e-02f, +1.088360894e-02f, -4.178046412e-04f, -5.254871384e-03f, + +7.166297037e-03f, +3.654659030e-03f, -1.060089525e-02f, -2.134207130e-02f, -9.723007024e-03f, +2.088791997e-02f, +3.906453154e-02f, +1.746663889e-02f, -2.978752435e-02f, -5.399114641e-02f, -2.416597170e-02f, +3.351007415e-02f, +5.977403733e-02f, +2.684035567e-02f, -3.050606656e-02f, -5.377808122e-02f, -2.405848410e-02f, +2.233941116e-02f, +3.870539783e-02f, +1.694604560e-02f, -1.260861114e-02f, -2.094677361e-02f, -8.571115083e-03f, +4.779504875e-03f, + +1.964077119e-04f, -9.697443390e-05f, -5.973920492e-04f, -7.259437023e-04f, +3.646584188e-05f, +1.406054360e-03f, +2.127622286e-03f, +8.438649054e-04f, -2.541092904e-03f, -6.259036041e-03f, -7.653726044e-03f, -5.182021629e-03f, +1.841268527e-04f, +5.444756432e-03f, +7.675169148e-03f, +6.068406868e-03f, +2.293320649e-03f, -9.942757047e-04f, -2.130880606e-03f, -1.323115503e-03f, +3.748812743e-05f, +7.413230094e-04f, +5.696992846e-04f, +6.853914940e-05f, + -1.452572160e-04f, +5.873543182e-04f, +1.012001821e-03f, +1.516704686e-04f, -1.487925287e-03f, -1.951245075e-03f, -9.573325739e-05f, +2.498183523e-03f, +2.823196934e-03f, -9.010092975e-06f, -3.237786595e-03f, -3.274975965e-03f, +1.279374424e-04f, +3.394742513e-03f, +3.102308260e-03f, -2.220752786e-04f, -2.905843317e-03f, -2.374588747e-03f, +2.634004448e-04f, +1.990629293e-03f, +1.397678832e-03f, -2.436272238e-04f, -1.017778343e-03f, -5.374915272e-04f, + /* 6, 0 (24) */ + -9.443188869e-04f, -9.436998782e-03f, -9.565468880e-03f, +7.571667169e-03f, +2.701845118e-02f, +1.723470897e-02f, -2.936171966e-02f, -6.643983485e-02f, -2.360084937e-02f, +1.182279552e-01f, +2.849403407e-01f, +3.594118486e-01f, +2.849403407e-01f, +1.182279552e-01f, -2.360084937e-02f, -6.643983485e-02f, -2.936171966e-02f, +1.723470897e-02f, +2.701845118e-02f, +7.571667169e-03f, -9.565468880e-03f, -9.436998782e-03f, -9.443188869e-04f, +3.266463436e-03f, + +9.443188869e-04f, +1.280596256e-02f, +1.051077168e-03f, -2.198035832e-02f, -1.993238995e-02f, +1.659489883e-02f, +4.037674484e-02f, +8.960064052e-03f, -4.280330062e-02f, -4.102451787e-02f, +1.852929662e-02f, +5.568401311e-02f, +1.852929662e-02f, -4.102451787e-02f, -4.280330062e-02f, +8.960064052e-03f, +4.037674484e-02f, +1.659489883e-02f, -1.993238995e-02f, -2.198035832e-02f, +1.051077168e-03f, +1.280596256e-02f, +5.134169749e-03f, -3.266463436e-03f, + +4.689523778e-04f, +4.480790583e-04f, -4.976957856e-04f, -1.435166959e-03f, -6.675137897e-04f, +1.867480161e-03f, +3.368864452e-03f, +6.125226686e-04f, -5.846331590e-03f, -1.077747741e-02f, -8.839498946e-03f, -3.120642952e-04f, +8.456997594e-03f, +1.089151264e-02f, +6.268046134e-03f, -2.821040306e-04f, -3.342048428e-03f, -2.031889028e-03f, +5.451907148e-04f, +1.451459445e-03f, +5.742732337e-04f, -4.146097723e-04f, -4.903798843e-04f, -5.115049594e-05f, + -4.689523778e-04f, -4.227197977e-05f, +1.361609930e-03f, +1.087593793e-03f, -1.354652652e-03f, -2.582317601e-03f, +7.593408284e-06f, +3.335003672e-03f, +2.283427491e-03f, -2.324348697e-03f, -4.046850226e-03f, -1.663399353e-04f, +3.948113578e-03f, +2.584849287e-03f, -2.046402663e-03f, -3.431446366e-03f, -2.546153717e-04f, +2.531961778e-03f, +1.513057151e-03f, -9.797168079e-04f, -1.418296556e-03f, -4.419126328e-05f, +7.132215359e-04f, +5.115049594e-05f, + /* 6, 1 (24) */ + -4.753665091e-04f, -8.988919724e-03f, -1.006316467e-02f, +6.136500210e-03f, +2.635093739e-02f, +1.910218913e-02f, -2.599285520e-02f, -6.582731218e-02f, -2.944718096e-02f, +1.074504778e-01f, +2.761008418e-01f, +3.590997843e-01f, +2.933973383e-01f, +1.291194678e-01f, -1.733280324e-02f, -6.672193888e-02f, -3.270376808e-02f, +1.520281994e-02f, +2.756364190e-02f, +9.023126614e-03f, -8.991195646e-03f, -9.851608555e-03f, -1.434698771e-03f, +3.215312940e-03f, + +4.753665091e-04f, +1.276369058e-02f, +2.412687098e-03f, -2.089276453e-02f, -2.128704260e-02f, +1.401258123e-02f, +4.038433825e-02f, +1.229506772e-02f, -4.051987313e-02f, -4.334886656e-02f, +1.448244640e-02f, +5.551767318e-02f, +2.247741020e-02f, -3.843966858e-02f, -4.484970329e-02f, +5.528617686e-03f, +4.012212947e-02f, +1.912686061e-02f, -1.841933280e-02f, -2.296007513e-02f, -3.672193874e-04f, +1.276177130e-02f, +5.847391285e-03f, -3.215312940e-03f, + +4.456494725e-04f, +4.773904234e-04f, -4.214375482e-04f, -1.411631754e-03f, -7.818074808e-04f, +1.699277300e-03f, +3.377656505e-03f, +9.266692994e-04f, -5.418756674e-03f, -1.063451134e-02f, -9.193958608e-03f, -9.351621227e-04f, +8.047531031e-03f, +1.097578795e-02f, +6.682190728e-03f, +6.370880484e-05f, -3.296687441e-03f, -2.191494642e-03f, +4.152250918e-04f, +1.460142407e-03f, +6.507226728e-04f, -3.770139812e-04f, -5.096968493e-04f, -7.723833868e-05f, + -4.456494725e-04f, -1.249700912e-04f, +1.297655864e-03f, +1.185350537e-03f, -1.191293312e-03f, -2.615423134e-03f, -2.356121632e-04f, +3.219058461e-03f, +2.504202414e-03f, -2.051090559e-03f, -4.120371452e-03f, -4.979644176e-04f, +3.824717377e-03f, +2.830855480e-03f, -1.794508537e-03f, -3.507530360e-03f, -5.038930094e-04f, +2.464367746e-03f, +1.665319635e-03f, -8.621996611e-04f, -1.467073881e-03f, -1.338987788e-04f, +7.100536365e-04f, +7.723833868e-05f, + /* 6, 2 (24) */ + -2.971703658e-05f, -8.511529301e-03f, -1.048460221e-02f, +4.724868456e-03f, +2.556912991e-02f, +2.080146643e-02f, -2.261519870e-02f, -6.490064288e-02f, -3.486593764e-02f, +9.681596644e-02f, +2.669068832e-01f, +3.581646222e-01f, +3.014448694e-01f, +1.400952558e-01f, -1.065061251e-02f, -6.665823007e-02f, -3.600045553e-02f, +1.301132530e-02f, +2.797886699e-02f, +1.048326902e-02f, -8.340472973e-03f, -1.022862254e-02f, -1.944395621e-03f, +3.138074601e-03f, + +2.971703658e-05f, +1.263872049e-02f, +3.710342963e-03f, -1.970741399e-02f, -2.247833591e-02f, +1.139715810e-02f, +4.014872608e-02f, +1.551412618e-02f, -3.801567072e-02f, -4.539995712e-02f, +1.036207495e-02f, +5.501970876e-02f, +2.630212758e-02f, -3.560881310e-02f, -4.664421182e-02f, +2.021087326e-03f, +3.961823646e-02f, +2.159122835e-02f, -1.675401316e-02f, -2.382227479e-02f, -1.834293269e-03f, +1.262787252e-02f, +6.557444921e-03f, -3.138074601e-03f, + +4.207090484e-04f, +5.025392707e-04f, -3.459278189e-04f, -1.381248634e-03f, -8.877404424e-04f, +1.528276824e-03f, +3.369013164e-03f, +1.223754983e-03f, -4.987024967e-03f, -1.046354572e-02f, -9.519412653e-03f, -1.555171915e-03f, +7.612284351e-03f, +1.102958099e-02f, +7.087057190e-03f, +4.239514835e-04f, -3.232332149e-03f, -2.345279652e-03f, +2.780588239e-04f, +1.460880057e-03f, +7.265810680e-04f, -3.353506814e-04f, -5.266725668e-04f, -1.043627762e-04f, + -4.207090484e-04f, -2.034277110e-04f, +1.227110830e-03f, +1.272589899e-03f, -1.024175495e-03f, -2.631382834e-03f, -4.734884070e-04f, +3.084585875e-03f, +2.707464954e-03f, -1.766885327e-03f, -4.168287358e-03f, -8.264297989e-04f, +3.677380173e-03f, +3.060716126e-03f, -1.529235425e-03f, -3.562525570e-03f, -7.538279918e-04f, +2.379665972e-03f, +1.810270836e-03f, -7.356037323e-04f, -1.507340486e-03f, -2.262870104e-04f, +7.010865730e-04f, +1.043627762e-04f, + /* 6, 3 (24) */ + +3.909920118e-04f, -8.008990030e-03f, -1.083053003e-02f, +3.343619821e-03f, +2.468138947e-02f, +2.232974326e-02f, -1.924618554e-02f, -6.367688790e-02f, -3.985296260e-02f, +8.635242072e-02f, +2.573874705e-01f, +3.566094503e-01f, +3.090571537e-01f, +1.511248368e-01f, -3.563555321e-03f, -6.623427859e-02f, -3.923278767e-02f, +1.066604565e-02f, +2.825692581e-02f, +1.194414908e-02f, -7.613891905e-03f, -1.056397322e-02f, -2.471068187e-03f, +3.033711825e-03f, + -3.909920118e-04f, +1.243529278e-02f, +4.937453793e-03f, -1.843482409e-02f, -2.350251141e-02f, +8.765775262e-03f, +3.967523768e-02f, +1.859871206e-02f, -3.530820576e-02f, -4.716684245e-02f, +6.193787588e-03f, +5.419327896e-02f, +2.997950775e-02f, -3.254809697e-02f, -4.817344725e-02f, -1.541438244e-03f, +3.886440847e-02f, +2.397089433e-02f, -1.494374233e-02f, -2.455787852e-02f, -3.341633754e-03f, +1.240158551e-02f, +7.258531494e-03f, -3.033711825e-03f, + +3.943700611e-04f, +5.235469186e-04f, -2.715760351e-04f, -1.344437307e-03f, -9.850369344e-04f, +1.355457625e-03f, +3.343586276e-03f, +1.503081518e-03f, -4.552826774e-03f, -1.026560914e-02f, -9.815013127e-03f, -2.170049140e-03f, +7.152546825e-03f, +1.105228015e-02f, +7.480946210e-03f, +7.975758828e-04f, -3.148608650e-03f, -2.492223559e-03f, +1.341881493e-04f, +1.453370552e-03f, +8.013718372e-04f, -2.897070603e-04f, -5.410824947e-04f, -1.323765352e-04f, + -3.943700611e-04f, -2.772173487e-04f, +1.150679967e-03f, +1.348998650e-03f, -8.544961206e-04f, -2.630415027e-03f, -7.045798734e-04f, +2.932672115e-03f, +2.892078306e-03f, -1.473604520e-03f, -4.190376164e-03f, -1.149653509e-03f, +3.506978773e-03f, +3.272877333e-03f, -1.252174097e-03f, -3.595834350e-03f, -1.002794943e-03f, +2.278106348e-03f, +1.946768151e-03f, -6.005694260e-04f, -1.538541034e-03f, -3.207529261e-04f, +6.861465987e-04f, +1.323765352e-04f, + /* 6, 4 (24) */ + +7.853620729e-04f, -7.485443112e-03f, -1.110210607e-02f, +1.999182515e-03f, +2.369635254e-02f, +2.368520088e-02f, -1.590259926e-02f, -6.217380638e-02f, -4.440578938e-02f, +7.608681158e-02f, +2.475724574e-01f, +3.544394011e-01f, +3.162097005e-01f, +1.621771169e-01f, +3.917390889e-03f, -6.543670271e-02f, -4.238139633e-02f, +8.173822091e-03f, +2.839111396e-02f, +1.339751963e-02f, -6.812520068e-03f, -1.085368028e-02f, -3.012150682e-03f, +2.901335290e-03f, + -7.853620729e-04f, +1.215807543e-02f, +6.088133760e-03f, -1.708582544e-02f, -2.435700753e-02f, +6.135360235e-03f, +3.897065780e-02f, +2.153138417e-02f, -3.241612746e-02f, -4.864044697e-02f, +2.003411424e-03f, +5.304362545e-02f, +3.348648653e-02f, -2.927521964e-02f, -4.942562134e-02f, -5.137272594e-03f, +3.786161352e-02f, +2.624900067e-02f, -1.299697418e-02f, -2.515844795e-02f, -4.880174789e-03f, +1.208083258e-02f, +7.944678093e-03f, -2.901335290e-03f, + +3.668709269e-04f, +5.404595643e-04f, -1.987700110e-04f, -1.301639237e-03f, -1.073476637e-03f, +1.181776686e-03f, +3.302086415e-03f, +1.764042857e-03f, -4.117831997e-03f, -1.004182218e-02f, -1.008003094e-02f, -2.777770432e-03f, +6.669706987e-03f, +1.104338820e-02f, +7.862174877e-03f, +1.183453329e-03f, -3.045221976e-03f, -2.631307780e-03f, -1.583740675e-05f, +1.437348816e-03f, +8.746072696e-04f, -2.401989468e-04f, -5.527099981e-04f, -1.611192984e-04f, + -3.668709269e-04f, -3.459613134e-04f, +1.069091052e-03f, +1.414347823e-03f, -6.834441848e-04f, -2.612848491e-03f, -9.274977734e-04f, +2.764505845e-03f, +3.057037956e-03f, -1.173167834e-03f, -4.186585198e-03f, -1.465588051e-03f, +3.314542726e-03f, +3.465893416e-03f, -9.650057653e-04f, -3.606996957e-03f, -1.249152335e-03f, +2.160058380e-03f, +2.073704357e-03f, -4.578132493e-04f, -1.560171705e-03f, -4.166576427e-04f, +6.651030470e-04f, +1.611192984e-04f, + /* 6, 5 (24) */ + +1.152233000e-03f, -6.944983547e-03f, -1.130087608e-02f, +6.975432775e-04f, +2.262287590e-02f, +2.486697757e-02f, -1.260051284e-02f, -6.040976352e-02f, -4.852362137e-02f, +6.604498940e-02f, +2.374924265e-01f, +3.516616307e-01f, +3.228794075e-01f, +1.732205051e-01f, +1.177956577e-02f, -6.425324938e-02f, -4.542661830e-02f, +5.542514312e-03f, +2.837527656e-02f, +1.483486845e-02f, -5.937912799e-03f, -1.109387922e-02f, -3.564860680e-03f, +2.740215991e-03f, + -1.152233000e-03f, +1.181211412e-02f, +7.157224812e-03f, -1.567147762e-02f, -2.504045171e-02f, +3.522511744e-03f, +3.804316003e-02f, +2.429589002e-02f, -2.935908950e-02f, -4.981361480e-02f, -2.183173774e-03f, +5.157803740e-02f, +3.680102925e-02f, -2.580932622e-02f, -5.039062711e-02f, -8.744269551e-03f, +3.661246119e-02f, +2.840905905e-02f, -1.092326982e-02f, -2.561626120e-02f, -6.440346494e-03f, +1.166417494e-02f, +8.609781140e-03f, -2.740215991e-03f, + +3.384479650e-04f, +5.533471255e-04f, -1.278743573e-04f, -1.253314472e-03f, -1.152894176e-03f, +1.008164877e-03f, +3.245278149e-03f, +2.006126058e-03f, -3.683683195e-03f, -9.793391686e-03f, -1.031385820e-02f, -3.376341920e-03f, +6.165247259e-03f, +1.100252535e-02f, +8.229084209e-03f, +1.580378250e-03f, -2.921959254e-03f, -2.761520825e-03f, -1.714163939e-04f, +1.412589230e-03f, +9.457910857e-04f, -1.869710954e-04f, -5.613480991e-04f, -1.904183455e-04f, + -3.384479650e-04f, -4.093331982e-04f, +9.830884486e-04f, +1.468492415e-03f, -5.121924999e-04f, -2.579118290e-03f, -1.140928566e-03f, +2.581368987e-03f, +3.201477334e-03f, -8.675299851e-04f, -4.157030724e-03f, -1.772234684e-03f, +3.101247748e-03f, +3.638437143e-03f, -6.694913730e-04f, -3.595696109e-03f, -1.491253623e-03f, +2.026010514e-03f, +2.190016218e-03f, -3.081242579e-04f, -1.571785345e-03f, -5.133304347e-04f, +6.378708070e-04f, +1.904183455e-04f, + /* 6, 6 (24) */ + +1.490680965e-03f, -6.391636422e-03f, -1.142875044e-02f, -5.557711946e-04f, +2.146998172e-02f, +2.587514245e-02f, -9.355234695e-03f, -5.840363747e-02f, -5.220730457e-02f, +5.625159772e-02f, +2.271785683e-01f, +3.482852888e-01f, +3.290446548e-01f, +1.842230305e-01f, +2.000864997e-02f, -6.267287113e-02f, -4.834857755e-02f, +2.780993487e-03f, +2.820386016e-02f, +1.624745768e-02f, -4.992121713e-03f, -1.128085032e-02f, -4.126208779e-03f, +2.549797646e-03f, + -1.490680965e-03f, +1.140278092e-02f, +8.140313261e-03f, -1.420298520e-02f, -2.555264421e-02f, +9.433934541e-04f, +3.690223147e-02f, +2.687725901e-02f, -2.615761217e-02f, -5.068114479e-02f, -6.340204498e-03f, +4.980580271e-02f, +3.990227700e-02f, -2.217088908e-02f, -5.106011848e-02f, -1.233996566e-02f, +3.512120757e-02f, +3.043506957e-02f, -8.733253600e-03f, -2.592438545e-02f, -8.012131839e-03f, +1.115084451e-02f, +9.247651947e-03f, -2.549797646e-03f, + +3.093339044e-04f, +5.623019695e-04f, -5.922908536e-05f, -1.199938445e-03f, -1.223178360e-03f, +8.355229870e-04f, +3.173975131e-03f, +2.228911780e-03f, -3.251988858e-03f, -9.521604813e-03f, -1.051601006e-02f, -3.963807418e-03f, +5.640738141e-03f, +1.092943184e-02f, +8.580046670e-03f, +1.987072240e-03f, -2.778692537e-03f, -2.881863548e-03f, -3.318971155e-04f, +1.378908166e-03f, +1.014421126e-03f, -1.301972964e-04f, -5.668012201e-04f, -2.200893043e-04f, + -3.093339044e-04f, -4.670589181e-04f, +8.934270684e-04f, +1.511370483e-03f, -3.418897025e-04f, -2.529760927e-03f, -1.343641901e-03f, +2.384626953e-03f, +3.324672468e-03f, -5.586673905e-04f, -4.101996605e-03f, -2.067656769e-03f, +2.868408124e-03f, +3.789309220e-03f, -3.674602494e-04f, -3.561760585e-03f, -1.727458567e-03f, +1.876568606e-03f, +2.294692934e-03f, -1.523598840e-04f, -1.572996310e-03f, -6.100731019e-04f, +6.044124905e-04f, +2.200893043e-04f, + /* 6, 7 (24) */ + +1.800014869e-03f, -5.829334452e-03f, -1.148797952e-02f, -1.755709640e-03f, +2.024680336e-02f, +2.671066543e-02f, -6.181259565e-03f, -5.617472569e-02f, -5.545929343e-02f, +4.672999290e-02f, +2.166625582e-01f, +3.443214814e-01f, +3.346853929e-01f, +1.951524623e-01f, +2.858869664e-02f, -6.068579889e-02f, -5.112727009e-02f, -1.008700610e-04f, +2.787196305e-02f, +1.762636584e-02f, -3.977700586e-03f, -1.141104762e-02f, -4.693009999e-03f, +2.329708342e-03f, + -1.800014869e-03f, +1.093572200e-02f, +9.033740329e-03f, -1.269161472e-02f, -2.589453391e-02f, -1.586367473e-03f, +3.555858956e-02f, +2.926188596e-02f, -2.283293970e-02f, -5.123981218e-02f, -1.044220110e-02f, +4.773814595e-02f, +4.277068512e-02f, -1.838157986e-02f, -5.142757873e-02f, -1.590172625e-02f, +3.339374900e-02f, +3.231163817e-02f, -6.438560666e-03f, -2.607674534e-02f, -9.585128149e-03f, +1.054077141e-02f, +9.852064438e-03f, -2.329708342e-03f, + +2.797564633e-04f, +5.674375425e-04f, +6.851598321e-06f, -1.141998787e-03f, -1.284271150e-03f, +6.647179963e-04f, +3.089035046e-03f, +2.432074331e-03f, -2.824316917e-03f, -9.227822644e-03f, -1.068612589e-02f, -4.538256439e-03f, +5.097831993e-03f, +1.082397002e-02f, +8.913473616e-03f, +2.402188545e-03f, -2.615381263e-03f, -2.991354457e-03f, -4.965796190e-04f, +1.336166371e-03f, +1.079992159e-03f, -7.008030702e-05f, -5.688869102e-04f, -2.499370090e-04f, + -2.797564633e-04f, -5.189173045e-04f, +8.008664045e-04f, +1.543001633e-03f, -1.736525899e-04f, -2.465408847e-03f, -1.534497869e-03f, +2.175718408e-03f, +3.426045613e-03f, -2.485647717e-04f, -4.021931833e-03f, -2.349992672e-03f, +2.617468151e-03f, +3.917446923e-03f, -6.079821749e-05f, -3.505167843e-03f, -1.956144632e-03f, +1.712453521e-03f, +2.386784346e-03f, +8.558833165e-06f, -1.563484939e-03f, -7.061646718e-04f, +5.647402610e-04f, +2.499370090e-04f, + /* 6, 8 (24) */ + +2.079771333e-03f, -5.261896910e-03f, -1.148112792e-02f, -2.897708427e-03f, +1.896253221e-02f, +2.737538343e-02f, -3.092224518e-03f, -5.374265135e-02f, -5.828361034e-02f, +3.750217026e-02f, +2.059764323e-01f, +3.397832249e-01f, +3.397832249e-01f, +2.059764323e-01f, +3.750217026e-02f, -5.828361034e-02f, -5.374265135e-02f, -3.092224518e-03f, +2.737538343e-02f, +1.896253221e-02f, -2.897708427e-03f, -1.148112792e-02f, -5.261896910e-03f, +2.079771333e-03f, + -2.079771333e-03f, +1.041680470e-02f, +9.834606734e-03f, -1.114861309e-02f, -2.606818650e-02f, -4.051776320e-03f, +3.402409170e-02f, +3.143760437e-02f, -1.940689409e-02f, -5.148837695e-02f, -1.446413294e-02f, +4.538815327e-02f, +4.538815327e-02f, -1.446413294e-02f, -5.148837695e-02f, -1.940689409e-02f, +3.143760437e-02f, +3.402409170e-02f, -4.051776320e-03f, -2.606818650e-02f, -1.114861309e-02f, +9.834606734e-03f, +1.041680470e-02f, -2.079771333e-03f, + +2.499370090e-04f, +5.688869102e-04f, +7.008030702e-05f, -1.079992159e-03f, -1.336166371e-03f, +4.965796190e-04f, +2.991354457e-03f, +2.615381263e-03f, -2.402188545e-03f, -8.913473616e-03f, -1.082397002e-02f, -5.097831993e-03f, +4.538256439e-03f, +1.068612589e-02f, +9.227822644e-03f, +2.824316917e-03f, -2.432074331e-03f, -3.089035046e-03f, -6.647179963e-04f, +1.284271150e-03f, +1.141998787e-03f, -6.851598321e-06f, -5.674375425e-04f, -2.797564633e-04f, + -2.499370090e-04f, -5.647402610e-04f, +7.061646718e-04f, +1.563484939e-03f, -8.558833165e-06f, -2.386784346e-03f, -1.712453521e-03f, +1.956144632e-03f, +3.505167843e-03f, +6.079821749e-05f, -3.917446923e-03f, -2.617468151e-03f, +2.349992672e-03f, +4.021931833e-03f, +2.485647717e-04f, -3.426045613e-03f, -2.175718408e-03f, +1.534497869e-03f, +2.465408847e-03f, +1.736525899e-04f, -1.543001633e-03f, -8.008664045e-04f, +5.189173045e-04f, +2.797564633e-04f, + /* 6, 9 (24) */ + +2.329708342e-03f, -4.693009999e-03f, -1.141104762e-02f, -3.977700586e-03f, +1.762636584e-02f, +2.787196305e-02f, -1.008700610e-04f, -5.112727009e-02f, -6.068579889e-02f, +2.858869664e-02f, +1.951524623e-01f, +3.346853929e-01f, +3.443214814e-01f, +2.166625582e-01f, +4.672999290e-02f, -5.545929343e-02f, -5.617472569e-02f, -6.181259565e-03f, +2.671066543e-02f, +2.024680336e-02f, -1.755709640e-03f, -1.148797952e-02f, -5.829334452e-03f, +1.800014869e-03f, + -2.329708342e-03f, +9.852064438e-03f, +1.054077141e-02f, -9.585128149e-03f, -2.607674534e-02f, -6.438560666e-03f, +3.231163817e-02f, +3.339374900e-02f, -1.590172625e-02f, -5.142757873e-02f, -1.838157986e-02f, +4.277068512e-02f, +4.773814595e-02f, -1.044220110e-02f, -5.123981218e-02f, -2.283293970e-02f, +2.926188596e-02f, +3.555858956e-02f, -1.586367473e-03f, -2.589453391e-02f, -1.269161472e-02f, +9.033740329e-03f, +1.093572200e-02f, -1.800014869e-03f, + +2.200893043e-04f, +5.668012201e-04f, +1.301972964e-04f, -1.014421126e-03f, -1.378908166e-03f, +3.318971155e-04f, +2.881863548e-03f, +2.778692537e-03f, -1.987072240e-03f, -8.580046670e-03f, -1.092943184e-02f, -5.640738141e-03f, +3.963807418e-03f, +1.051601006e-02f, +9.521604813e-03f, +3.251988858e-03f, -2.228911780e-03f, -3.173975131e-03f, -8.355229870e-04f, +1.223178360e-03f, +1.199938445e-03f, +5.922908536e-05f, -5.623019695e-04f, -3.093339044e-04f, + -2.200893043e-04f, -6.044124905e-04f, +6.100731019e-04f, +1.572996310e-03f, +1.523598840e-04f, -2.294692934e-03f, -1.876568606e-03f, +1.727458567e-03f, +3.561760585e-03f, +3.674602494e-04f, -3.789309220e-03f, -2.868408124e-03f, +2.067656769e-03f, +4.101996605e-03f, +5.586673905e-04f, -3.324672468e-03f, -2.384626953e-03f, +1.343641901e-03f, +2.529760927e-03f, +3.418897025e-04f, -1.511370483e-03f, -8.934270684e-04f, +4.670589181e-04f, +3.093339044e-04f, + /* 6,10 (24) */ + +2.549797646e-03f, -4.126208779e-03f, -1.128085032e-02f, -4.992121713e-03f, +1.624745768e-02f, +2.820386016e-02f, +2.780993487e-03f, -4.834857755e-02f, -6.267287113e-02f, +2.000864997e-02f, +1.842230305e-01f, +3.290446548e-01f, +3.482852888e-01f, +2.271785683e-01f, +5.625159772e-02f, -5.220730457e-02f, -5.840363747e-02f, -9.355234695e-03f, +2.587514245e-02f, +2.146998172e-02f, -5.557711946e-04f, -1.142875044e-02f, -6.391636422e-03f, +1.490680965e-03f, + -2.549797646e-03f, +9.247651947e-03f, +1.115084451e-02f, -8.012131839e-03f, -2.592438545e-02f, -8.733253600e-03f, +3.043506957e-02f, +3.512120757e-02f, -1.233996566e-02f, -5.106011848e-02f, -2.217088908e-02f, +3.990227700e-02f, +4.980580271e-02f, -6.340204498e-03f, -5.068114479e-02f, -2.615761217e-02f, +2.687725901e-02f, +3.690223147e-02f, +9.433934541e-04f, -2.555264421e-02f, -1.420298520e-02f, +8.140313261e-03f, +1.140278092e-02f, -1.490680965e-03f, + +1.904183455e-04f, +5.613480991e-04f, +1.869710954e-04f, -9.457910857e-04f, -1.412589230e-03f, +1.714163939e-04f, +2.761520825e-03f, +2.921959254e-03f, -1.580378250e-03f, -8.229084209e-03f, -1.100252535e-02f, -6.165247259e-03f, +3.376341920e-03f, +1.031385820e-02f, +9.793391686e-03f, +3.683683195e-03f, -2.006126058e-03f, -3.245278149e-03f, -1.008164877e-03f, +1.152894176e-03f, +1.253314472e-03f, +1.278743573e-04f, -5.533471255e-04f, -3.384479650e-04f, + -1.904183455e-04f, -6.378708070e-04f, +5.133304347e-04f, +1.571785345e-03f, +3.081242579e-04f, -2.190016218e-03f, -2.026010514e-03f, +1.491253623e-03f, +3.595696109e-03f, +6.694913730e-04f, -3.638437143e-03f, -3.101247748e-03f, +1.772234684e-03f, +4.157030724e-03f, +8.675299851e-04f, -3.201477334e-03f, -2.581368987e-03f, +1.140928566e-03f, +2.579118290e-03f, +5.121924999e-04f, -1.468492415e-03f, -9.830884486e-04f, +4.093331982e-04f, +3.384479650e-04f, + /* 6,11 (24) */ + +2.740215991e-03f, -3.564860680e-03f, -1.109387922e-02f, -5.937912799e-03f, +1.483486845e-02f, +2.837527656e-02f, +5.542514312e-03f, -4.542661830e-02f, -6.425324938e-02f, +1.177956577e-02f, +1.732205051e-01f, +3.228794075e-01f, +3.516616307e-01f, +2.374924265e-01f, +6.604498940e-02f, -4.852362137e-02f, -6.040976352e-02f, -1.260051284e-02f, +2.486697757e-02f, +2.262287590e-02f, +6.975432775e-04f, -1.130087608e-02f, -6.944983547e-03f, +1.152233000e-03f, + -2.740215991e-03f, +8.609781140e-03f, +1.166417494e-02f, -6.440346494e-03f, -2.561626120e-02f, -1.092326982e-02f, +2.840905905e-02f, +3.661246119e-02f, -8.744269551e-03f, -5.039062711e-02f, -2.580932622e-02f, +3.680102925e-02f, +5.157803740e-02f, -2.183173774e-03f, -4.981361480e-02f, -2.935908950e-02f, +2.429589002e-02f, +3.804316003e-02f, +3.522511744e-03f, -2.504045171e-02f, -1.567147762e-02f, +7.157224812e-03f, +1.181211412e-02f, -1.152233000e-03f, + +1.611192984e-04f, +5.527099981e-04f, +2.401989468e-04f, -8.746072696e-04f, -1.437348816e-03f, +1.583740675e-05f, +2.631307780e-03f, +3.045221976e-03f, -1.183453329e-03f, -7.862174877e-03f, -1.104338820e-02f, -6.669706987e-03f, +2.777770432e-03f, +1.008003094e-02f, +1.004182218e-02f, +4.117831997e-03f, -1.764042857e-03f, -3.302086415e-03f, -1.181776686e-03f, +1.073476637e-03f, +1.301639237e-03f, +1.987700110e-04f, -5.404595643e-04f, -3.668709269e-04f, + -1.611192984e-04f, -6.651030470e-04f, +4.166576427e-04f, +1.560171705e-03f, +4.578132493e-04f, -2.073704357e-03f, -2.160058380e-03f, +1.249152335e-03f, +3.606996957e-03f, +9.650057653e-04f, -3.465893416e-03f, -3.314542726e-03f, +1.465588051e-03f, +4.186585198e-03f, +1.173167834e-03f, -3.057037956e-03f, -2.764505845e-03f, +9.274977734e-04f, +2.612848491e-03f, +6.834441848e-04f, -1.414347823e-03f, -1.069091052e-03f, +3.459613134e-04f, +3.668709269e-04f, + /* 6,12 (24) */ + +2.901335290e-03f, -3.012150682e-03f, -1.085368028e-02f, -6.812520068e-03f, +1.339751963e-02f, +2.839111396e-02f, +8.173822091e-03f, -4.238139633e-02f, -6.543670271e-02f, +3.917390889e-03f, +1.621771169e-01f, +3.162097005e-01f, +3.544394011e-01f, +2.475724574e-01f, +7.608681158e-02f, -4.440578938e-02f, -6.217380638e-02f, -1.590259926e-02f, +2.368520088e-02f, +2.369635254e-02f, +1.999182515e-03f, -1.110210607e-02f, -7.485443112e-03f, +7.853620729e-04f, + -2.901335290e-03f, +7.944678093e-03f, +1.208083258e-02f, -4.880174789e-03f, -2.515844795e-02f, -1.299697418e-02f, +2.624900067e-02f, +3.786161352e-02f, -5.137272594e-03f, -4.942562134e-02f, -2.927521964e-02f, +3.348648653e-02f, +5.304362545e-02f, +2.003411424e-03f, -4.864044697e-02f, -3.241612746e-02f, +2.153138417e-02f, +3.897065780e-02f, +6.135360235e-03f, -2.435700753e-02f, -1.708582544e-02f, +6.088133760e-03f, +1.215807543e-02f, -7.853620729e-04f, + +1.323765352e-04f, +5.410824947e-04f, +2.897070603e-04f, -8.013718372e-04f, -1.453370552e-03f, -1.341881493e-04f, +2.492223559e-03f, +3.148608650e-03f, -7.975758828e-04f, -7.480946210e-03f, -1.105228015e-02f, -7.152546825e-03f, +2.170049140e-03f, +9.815013127e-03f, +1.026560914e-02f, +4.552826774e-03f, -1.503081518e-03f, -3.343586276e-03f, -1.355457625e-03f, +9.850369344e-04f, +1.344437307e-03f, +2.715760351e-04f, -5.235469186e-04f, -3.943700611e-04f, + -1.323765352e-04f, -6.861465987e-04f, +3.207529261e-04f, +1.538541034e-03f, +6.005694260e-04f, -1.946768151e-03f, -2.278106348e-03f, +1.002794943e-03f, +3.595834350e-03f, +1.252174097e-03f, -3.272877333e-03f, -3.506978773e-03f, +1.149653509e-03f, +4.190376164e-03f, +1.473604520e-03f, -2.892078306e-03f, -2.932672115e-03f, +7.045798734e-04f, +2.630415027e-03f, +8.544961206e-04f, -1.348998650e-03f, -1.150679967e-03f, +2.772173487e-04f, +3.943700611e-04f, + /* 6,13 (24) */ + +3.033711825e-03f, -2.471068187e-03f, -1.056397322e-02f, -7.613891905e-03f, +1.194414908e-02f, +2.825692581e-02f, +1.066604565e-02f, -3.923278767e-02f, -6.623427859e-02f, -3.563555321e-03f, +1.511248368e-01f, +3.090571537e-01f, +3.566094503e-01f, +2.573874705e-01f, +8.635242072e-02f, -3.985296260e-02f, -6.367688790e-02f, -1.924618554e-02f, +2.232974326e-02f, +2.468138947e-02f, +3.343619821e-03f, -1.083053003e-02f, -8.008990030e-03f, +3.909920118e-04f, + -3.033711825e-03f, +7.258531494e-03f, +1.240158551e-02f, -3.341633754e-03f, -2.455787852e-02f, -1.494374233e-02f, +2.397089433e-02f, +3.886440847e-02f, -1.541438244e-03f, -4.817344725e-02f, -3.254809697e-02f, +2.997950775e-02f, +5.419327896e-02f, +6.193787588e-03f, -4.716684245e-02f, -3.530820576e-02f, +1.859871206e-02f, +3.967523768e-02f, +8.765775262e-03f, -2.350251141e-02f, -1.843482409e-02f, +4.937453793e-03f, +1.243529278e-02f, -3.909920118e-04f, + +1.043627762e-04f, +5.266725668e-04f, +3.353506814e-04f, -7.265810680e-04f, -1.460880057e-03f, -2.780588239e-04f, +2.345279652e-03f, +3.232332149e-03f, -4.239514835e-04f, -7.087057190e-03f, -1.102958099e-02f, -7.612284351e-03f, +1.555171915e-03f, +9.519412653e-03f, +1.046354572e-02f, +4.987024967e-03f, -1.223754983e-03f, -3.369013164e-03f, -1.528276824e-03f, +8.877404424e-04f, +1.381248634e-03f, +3.459278189e-04f, -5.025392707e-04f, -4.207090484e-04f, + -1.043627762e-04f, -7.010865730e-04f, +2.262870104e-04f, +1.507340486e-03f, +7.356037323e-04f, -1.810270836e-03f, -2.379665972e-03f, +7.538279918e-04f, +3.562525570e-03f, +1.529235425e-03f, -3.060716126e-03f, -3.677380173e-03f, +8.264297989e-04f, +4.168287358e-03f, +1.766885327e-03f, -2.707464954e-03f, -3.084585875e-03f, +4.734884070e-04f, +2.631382834e-03f, +1.024175495e-03f, -1.272589899e-03f, -1.227110830e-03f, +2.034277110e-04f, +4.207090484e-04f, + /* 6,14 (24) */ + +3.138074601e-03f, -1.944395621e-03f, -1.022862254e-02f, -8.340472973e-03f, +1.048326902e-02f, +2.797886699e-02f, +1.301132530e-02f, -3.600045553e-02f, -6.665823007e-02f, -1.065061251e-02f, +1.400952558e-01f, +3.014448694e-01f, +3.581646222e-01f, +2.669068832e-01f, +9.681596644e-02f, -3.486593764e-02f, -6.490064288e-02f, -2.261519870e-02f, +2.080146643e-02f, +2.556912991e-02f, +4.724868456e-03f, -1.048460221e-02f, -8.511529301e-03f, -2.971703658e-05f, + -3.138074601e-03f, +6.557444921e-03f, +1.262787252e-02f, -1.834293269e-03f, -2.382227479e-02f, -1.675401316e-02f, +2.159122835e-02f, +3.961823646e-02f, +2.021087326e-03f, -4.664421182e-02f, -3.560881310e-02f, +2.630212758e-02f, +5.501970876e-02f, +1.036207495e-02f, -4.539995712e-02f, -3.801567072e-02f, +1.551412618e-02f, +4.014872608e-02f, +1.139715810e-02f, -2.247833591e-02f, -1.970741399e-02f, +3.710342963e-03f, +1.263872049e-02f, +2.971703658e-05f, + +7.723833868e-05f, +5.096968493e-04f, +3.770139812e-04f, -6.507226728e-04f, -1.460142407e-03f, -4.152250918e-04f, +2.191494642e-03f, +3.296687441e-03f, -6.370880484e-05f, -6.682190728e-03f, -1.097578795e-02f, -8.047531031e-03f, +9.351621227e-04f, +9.193958608e-03f, +1.063451134e-02f, +5.418756674e-03f, -9.266692994e-04f, -3.377656505e-03f, -1.699277300e-03f, +7.818074808e-04f, +1.411631754e-03f, +4.214375482e-04f, -4.773904234e-04f, -4.456494725e-04f, + -7.723833868e-05f, -7.100536365e-04f, +1.338987788e-04f, +1.467073881e-03f, +8.621996611e-04f, -1.665319635e-03f, -2.464367746e-03f, +5.038930094e-04f, +3.507530360e-03f, +1.794508537e-03f, -2.830855480e-03f, -3.824717377e-03f, +4.979644176e-04f, +4.120371452e-03f, +2.051090559e-03f, -2.504202414e-03f, -3.219058461e-03f, +2.356121632e-04f, +2.615423134e-03f, +1.191293312e-03f, -1.185350537e-03f, -1.297655864e-03f, +1.249700912e-04f, +4.456494725e-04f, + /* 6,15 (24) */ + +3.215312940e-03f, -1.434698771e-03f, -9.851608555e-03f, -8.991195646e-03f, +9.023126614e-03f, +2.756364190e-02f, +1.520281994e-02f, -3.270376808e-02f, -6.672193888e-02f, -1.733280324e-02f, +1.291194678e-01f, +2.933973383e-01f, +3.590997843e-01f, +2.761008418e-01f, +1.074504778e-01f, -2.944718096e-02f, -6.582731218e-02f, -2.599285520e-02f, +1.910218913e-02f, +2.635093739e-02f, +6.136500210e-03f, -1.006316467e-02f, -8.988919724e-03f, -4.753665091e-04f, + -3.215312940e-03f, +5.847391285e-03f, +1.276177130e-02f, -3.672193874e-04f, -2.296007513e-02f, -1.841933280e-02f, +1.912686061e-02f, +4.012212947e-02f, +5.528617686e-03f, -4.484970329e-02f, -3.843966858e-02f, +2.247741020e-02f, +5.551767318e-02f, +1.448244640e-02f, -4.334886656e-02f, -4.051987313e-02f, +1.229506772e-02f, +4.038433825e-02f, +1.401258123e-02f, -2.128704260e-02f, -2.089276453e-02f, +2.412687098e-03f, +1.276369058e-02f, +4.753665091e-04f, + +5.115049594e-05f, +4.903798843e-04f, +4.146097723e-04f, -5.742732337e-04f, -1.451459445e-03f, -5.451907148e-04f, +2.031889028e-03f, +3.342048428e-03f, +2.821040306e-04f, -6.268046134e-03f, -1.089151264e-02f, -8.456997594e-03f, +3.120642952e-04f, +8.839498946e-03f, +1.077747741e-02f, +5.846331590e-03f, -6.125226686e-04f, -3.368864452e-03f, -1.867480161e-03f, +6.675137897e-04f, +1.435166959e-03f, +4.976957856e-04f, -4.480790583e-04f, -4.689523778e-04f, + -5.115049594e-05f, -7.132215359e-04f, +4.419126328e-05f, +1.418296556e-03f, +9.797168079e-04f, -1.513057151e-03f, -2.531961778e-03f, +2.546153717e-04f, +3.431446366e-03f, +2.046402663e-03f, -2.584849287e-03f, -3.948113578e-03f, +1.663399353e-04f, +4.046850226e-03f, +2.324348697e-03f, -2.283427491e-03f, -3.335003672e-03f, -7.593408284e-06f, +2.582317601e-03f, +1.354652652e-03f, -1.087593793e-03f, -1.361609930e-03f, +4.227197977e-05f, +4.689523778e-04f, + /* 7, 0 (24) */ + +0.000000000e+00f, +3.368963781e-03f, -8.514391712e-03f, -1.440869115e-02f, +7.086061236e-03f, +3.382960780e-02f, +1.101502518e-02f, -5.747977080e-02f, -6.640415000e-02f, +7.720343731e-02f, +3.034696374e-01f, +4.150958617e-01f, +3.034696374e-01f, +7.720343731e-02f, -6.640415000e-02f, -5.747977080e-02f, +1.101502518e-02f, +3.382960780e-02f, +7.086061236e-03f, -1.440869115e-02f, -8.514391712e-03f, +3.368963781e-03f, +4.189850862e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.368963781e-03f, +1.274692210e-02f, +3.334236296e-03f, -2.139023534e-02f, -1.414272265e-02f, +2.554679251e-02f, +2.914249065e-02f, -2.111397115e-02f, -4.242771499e-02f, +8.213018281e-03f, +4.774542267e-02f, +8.213018281e-03f, -4.242771499e-02f, -2.111397115e-02f, +2.914249065e-02f, +2.554679251e-02f, -1.414272265e-02f, -2.139023534e-02f, +3.334236296e-03f, +1.274692210e-02f, +9.628265126e-04f, -4.189850862e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.058070785e-04f, +8.639141446e-04f, -3.475731664e-04f, -2.022166441e-03f, -7.148374391e-04f, +3.376457860e-03f, +3.947526340e-03f, -3.562904099e-03f, -1.310182610e-02f, -1.288634917e-02f, -4.784042305e-04f, +1.240511117e-02f, +1.347636193e-02f, +4.221643471e-03f, -3.713550397e-03f, -3.596663800e-03f, +5.000727499e-04f, +2.058247866e-03f, +4.717426375e-04f, -8.440233219e-04f, -4.588010355e-04f, +2.228416515e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.058070785e-04f, -3.696152939e-04f, +1.419218793e-03f, +1.079723663e-03f, -1.882894487e-03f, -2.189743774e-03f, +1.799639412e-03f, +3.351308669e-03f, -1.035746467e-03f, -4.077984126e-03f, -1.840353029e-04f, +4.028584887e-03f, +1.372033154e-03f, -3.222411416e-03f, -2.054760965e-03f, +2.028487580e-03f, +2.041307870e-03f, -9.360930950e-04f, -1.499007371e-03f, +2.735279885e-04f, +8.003349149e-04f, -2.228416515e-04f, +0.000000000e+00f, + /* 7, 1 (24) */ + +0.000000000e+00f, +3.774770859e-03f, -7.650477567e-03f, -1.475626432e-02f, +5.063894795e-03f, +3.311477036e-02f, +1.439148304e-02f, -5.353224446e-02f, -6.996705410e-02f, +6.410161121e-02f, +2.905832882e-01f, +4.146174575e-01f, +3.158747485e-01f, +9.067979924e-02f, -6.218250653e-02f, -6.119332119e-02f, +7.418361383e-03f, +3.432968055e-02f, +9.144309102e-03f, -1.393694851e-02f, -9.358415034e-03f, +2.910162745e-03f, +4.412692514e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.774770859e-03f, +1.237730680e-02f, +4.753455089e-03f, -2.031051168e-02f, -1.602561714e-02f, +2.335704874e-02f, +3.094213007e-02f, -1.776266248e-02f, -4.346346146e-02f, +4.135034155e-03f, +4.756138736e-02f, +1.224160317e-02f, -4.105568184e-02f, -2.433638256e-02f, +2.708772969e-02f, +2.757528009e-02f, -1.210141478e-02f, -2.232632844e-02f, +1.835228925e-03f, +1.302045009e-02f, +1.763161428e-03f, -4.412692514e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.524203322e-04f, +8.762183159e-04f, -2.262812169e-04f, -1.973100792e-03f, -9.161458347e-04f, +3.142044342e-03f, +4.145727760e-03f, -2.914554260e-03f, -1.268560189e-02f, -1.331433006e-02f, -1.433126540e-03f, +1.187224841e-02f, +1.380664343e-02f, +4.887682191e-03f, -3.443821555e-03f, -3.800580450e-03f, +2.728731042e-04f, +2.080544726e-03f, +5.979427464e-04f, -8.163512084e-04f, -5.109127599e-04f, +2.003567872e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.524203322e-04f, -4.585070492e-04f, +1.329942076e-03f, +1.210431863e-03f, -1.712690410e-03f, -2.330445955e-03f, +1.533741589e-03f, +3.452235550e-03f, -6.935637465e-04f, -4.094929294e-03f, -5.506092781e-04f, +3.947028441e-03f, +1.699630006e-03f, -3.066326715e-03f, -2.296833118e-03f, +1.847679418e-03f, +2.186310520e-03f, -7.804671935e-04f, -1.568275856e-03f, +1.709022891e-04f, +8.295522149e-04f, -2.003567872e-04f, +0.000000000e+00f, + /* 7, 2 (24) */ + +0.000000000e+00f, +4.127191192e-03f, -6.774259251e-03f, -1.498254553e-02f, +3.090794002e-03f, +3.219862453e-02f, +1.753352739e-02f, -4.938651670e-02f, -7.288160836e-02f, +5.141600931e-02f, +2.772689581e-01f, +4.131843309e-01f, +3.277469969e-01f, +1.044864427e-01f, -5.729482433e-02f, -6.463714275e-02f, +3.617780933e-03f, +3.460255366e-02f, +1.122485383e-02f, -1.333900577e-02f, -1.017476624e-02f, +2.399249985e-03f, +4.613049301e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.127191192e-03f, +1.191879975e-02f, +6.083397165e-03f, -1.910007982e-02f, -1.773830755e-02f, +2.102660278e-02f, +3.247587166e-02f, -1.431042693e-02f, -4.415702520e-02f, +4.010486123e-05f, +4.701077808e-02f, +1.618863161e-02f, -3.935605183e-02f, -2.740270928e-02f, +2.479089657e-02f, +2.942295951e-02f, -9.915104261e-03f, -2.310679563e-02f, +2.669530690e-04f, +1.319135237e-02f, +2.592713642e-03f, -4.613049301e-03f, +0.000000000e+00f, + +0.000000000e+00f, +2.991115597e-04f, +8.811830113e-04f, -1.086587356e-04f, -1.911915938e-03f, -1.103106010e-03f, +2.895524757e-03f, +4.308340858e-03f, -2.279560013e-03f, -1.223043104e-02f, -1.368770001e-02f, -2.381601714e-03f, +1.128966452e-02f, +1.409029711e-02f, +5.557821765e-03f, -3.138574086e-03f, -3.986160141e-03f, +3.438631993e-05f, +2.088329659e-03f, +7.252763246e-04f, -7.807594176e-04f, -5.616376918e-04f, +1.744140062e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.991115597e-04f, -5.396365250e-04f, +1.232266753e-03f, +1.327427733e-03f, -1.532385244e-03f, -2.449784125e-03f, +1.259402165e-03f, +3.524651173e-03f, -3.483101673e-04f, -4.079394877e-03f, -9.127061273e-04f, +3.833881268e-03f, +2.015798799e-03f, -2.884074954e-03f, -2.523664948e-03f, +1.648507487e-03f, +2.316367984e-03f, -6.139045822e-04f, -1.626061328e-03f, +6.248191900e-05f, +8.518685200e-04f, -1.744140062e-04f, +0.000000000e+00f, + /* 7, 3 (24) */ + +0.000000000e+00f, +4.426302751e-03f, -5.893076240e-03f, -1.509120427e-02f, +1.178878065e-03f, +3.109551852e-02f, +2.042905214e-02f, -4.507817584e-02f, -7.516116837e-02f, +3.918557827e-02f, +2.635812581e-01f, +4.108027292e-01f, +3.390366615e-01f, +1.185767398e-01f, -5.173700257e-02f, -6.777571684e-02f, -3.683792076e-04f, +3.463693998e-02f, +1.331318349e-02f, -1.261372944e-02f, -1.095552566e-02f, +1.837612294e-03f, +4.787463307e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.426302751e-03f, +1.137916323e-02f, +7.315663918e-03f, -1.777265208e-02f, -1.927069279e-02f, +1.857681866e-02f, +3.373527382e-02f, -1.078577575e-02f, -4.450533537e-02f, -4.039290015e-03f, +4.609807196e-02f, +2.002251288e-02f, -3.734025303e-02f, -3.028678423e-02f, +2.226723162e-02f, +3.107146700e-02f, -7.598736276e-03f, -2.372070021e-02f, -1.359108259e-03f, +1.325383429e-02f, +3.444582163e-03f, -4.787463307e-03f, +0.000000000e+00f, + +0.000000000e+00f, +2.463295698e-04f, +8.791039320e-04f, +4.561343438e-06f, -1.839533055e-03f, -1.274957402e-03f, +2.639006402e-03f, +4.435753633e-03f, -1.660748468e-03f, -1.173921366e-02f, -1.400538929e-02f, -3.319702649e-03f, +1.065952560e-02f, +1.432515748e-02f, +6.228772114e-03f, -2.798258467e-03f, -4.151403594e-03f, -2.141172104e-04f, +2.080956301e-03f, +8.528011259e-04f, -7.371691971e-04f, -6.104599864e-04f, +1.450641040e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.463295698e-04f, -6.125302830e-04f, +1.127328211e-03f, +1.430062494e-03f, -1.343721795e-03f, -2.547144415e-03f, +9.789963650e-04f, +3.568259095e-03f, -2.817935595e-06f, -4.031626058e-03f, -1.267383541e-03f, +3.689975385e-03f, +2.317880747e-03f, -2.676907281e-03f, -2.733167914e-03f, +1.432338467e-03f, +2.430046906e-03f, -4.375886207e-04f, -1.671480945e-03f, -5.090767384e-05f, +8.667547216e-04f, -1.450641040e-04f, +0.000000000e+00f, + /* 7, 4 (24) */ + +0.000000000e+00f, +4.672632321e-03f, -5.013972308e-03f, -1.508664293e-02f, -6.606549905e-04f, +2.982056112e-02f, +2.306805854e-02f, -4.064242221e-02f, -7.682191684e-02f, +2.744636461e-02f, +2.495758688e-01f, +4.074830266e-01f, +3.496961871e-01f, +1.329018973e-01f, -4.550823045e-02f, -7.057397530e-02f, -4.519782801e-03f, +3.442282277e-02f, +1.539413979e-02f, -1.176092832e-02f, -1.169269486e-02f, +1.227152307e-03f, +4.932527411e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.672632321e-03f, +1.076663295e-02f, +8.442992129e-03f, -1.634258959e-02f, -2.061441459e-02f, +1.602967424e-02f, +3.471427019e-02f, -7.217516658e-03f, -4.450815331e-02f, -8.070916073e-03f, +4.483068842e-02f, +2.371248826e-02f, -3.502237229e-02f, -3.296369151e-02f, +1.953406371e-02f, +3.250380546e-02f, -5.168689370e-03f, -2.415828883e-02f, -3.030589203e-03f, +1.320292662e-02f, +4.311336884e-03f, -4.932527411e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.944982509e-04f, +8.703210413e-04f, +1.127085856e-04f, -1.756920822e-03f, -1.431071805e-03f, +2.374588642e-03f, +4.528548702e-03f, -1.060794041e-03f, -1.121499001e-02f, -1.426661613e-02f, -4.243358483e-03f, +9.984249714e-03f, +1.450928162e-02f, +6.897169111e-03f, -2.423543627e-03f, -4.294374310e-03f, -4.712494000e-04f, +2.057866950e-03f, +9.795355672e-04f, -6.855644358e-04f, -6.568565895e-04f, +1.123930488e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.944982509e-04f, -6.768100371e-04f, +1.016295809e-03f, +1.517831245e-03f, -1.148479505e-03f, -2.622111362e-03f, +6.949188872e-04f, +3.583007554e-03f, +3.400979684e-04f, -3.952135722e-03f, -1.611762473e-03f, +3.516401923e-03f, +2.603319785e-03f, -2.446296790e-03f, -2.923375346e-03f, +1.200708124e-03f, +2.526029878e-03f, -2.528192328e-04f, -1.703742488e-03f, -1.683651158e-04f, +8.737393824e-04f, -1.123930488e-04f, +0.000000000e+00f, + /* 7, 5 (24) */ + +0.000000000e+00f, +4.867130572e-03f, -4.143651267e-03f, -1.497393434e-02f, -2.417575813e-03f, +2.838948931e-02f, +2.544264719e-02f, -3.611387350e-02f, -7.788271088e-02f, +1.623137460e-02f, +2.353092527e-01f, +4.032396681e-01f, +3.596804368e-01f, +1.474111789e-01f, -3.861106134e-02f, -7.299751893e-02f, -8.814157112e-03f, +3.395157337e-02f, +1.745200674e-02f, -1.078139275e-02f, -1.237825929e-02f, +5.702957177e-04f, +5.044920460e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.867130572e-03f, +1.008982291e-02f, +9.459287938e-03f, -1.482475834e-02f, -2.176289409e-02f, +1.340756288e-02f, +3.540918907e-02f, -3.634509104e-03f, -4.416805534e-02f, -1.202305180e-02f, +4.321892594e-02f, +2.722889019e-02f, -3.241905250e-02f, -3.540998830e-02f, +1.661068836e-02f, +3.370451359e-02f, -2.642659492e-03f, -2.441110807e-02f, -4.734331692e-03f, +1.303456150e-02f, +5.185076267e-03f, -5.044920460e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.440139274e-04f, +8.552140913e-04f, +2.151779427e-04f, -1.665086676e-03f, -1.570953412e-03f, +2.104349583e-03f, +4.587495045e-03f, -4.822058615e-04f, -1.066092167e-02f, -1.447088893e-02f, -5.148576604e-03f, +9.266495007e-03f, +1.464096249e-02f, +7.559592836e-03f, -2.015317859e-03f, -4.413212876e-03f, -7.355103107e-04f, +2.018599824e-03f, +1.104464972e-03f, -6.259942598e-04f, -7.003015301e-04f, +7.652270795e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.440139274e-04f, -7.321935201e-04f, +9.003609504e-04f, +1.590374270e-03f, -9.484578618e-04f, -2.674468361e-03f, +4.095628935e-04f, +3.569087553e-03f, +6.776637482e-04f, -3.841699129e-03f, -1.943051662e-03f, +3.314502437e-03f, +2.869685084e-03f, -2.193927679e-03f, -3.092461066e-03f, +9.553102464e-04f, +2.603129478e-03f, -6.100346450e-05f, -1.722154264e-03f, -2.889198270e-04f, +8.724155707e-04f, -7.652270795e-05f, +0.000000000e+00f, + /* 7, 6 (24) */ + +0.000000000e+00f, +5.011144499e-03f, -3.288437175e-03f, -1.475875640e-02f, -4.082662488e-03f, +2.681853590e-02f, +2.754699677e-02f, -3.152637846e-02f, -7.836491674e-02f, +5.570452929e-03f, +2.208383638e-01f, +3.980910915e-01f, +3.689469318e-01f, +1.620521414e-01f, -3.105146851e-02f, -7.501283679e-02f, -1.322736999e-02f, +3.321606306e-02f, +1.947060656e-02f, -9.676927777e-03f, -1.300425355e-02f, -1.300058124e-04f, +5.121443168e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.011144499e-03f, +9.357629389e-03f, +1.035964889e-02f, -1.323438407e-02f, -2.271135195e-02f, +1.073309452e-02f, +3.581875197e-02f, -6.542155103e-05f, -4.349039159e-02f, -1.586475092e-02f, +4.127587428e-02f, +3.054339262e-02f, -2.954936742e-02f, -3.760391598e-02f, +1.351822730e-02f, +3.465982383e-02f, -3.953001425e-05f, -2.447211153e-02f, -6.456485956e-03f, +1.274564168e-02f, +6.057491837e-03f, -5.121443168e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.524305139e-05f, +8.341979830e-04f, +3.114320377e-04f, -1.565068062e-03f, -1.694237940e-03f, +1.830333230e-03f, +4.613538733e-03f, +7.268361020e-05f, -1.008027220e-02f, -1.461800666e-02f, -6.031464187e-03f, +8.509146265e-03f, +1.471874106e-02f, +8.212586420e-03f, -1.574688345e-03f, -4.506151104e-03f, -1.005294942e-03f, +1.962795819e-03f, +1.226548282e-03f, -5.585751831e-04f, -7.402703983e-04f, +3.761127040e-05f, +0.000000000e+00f, + +0.000000000e+00f, -9.524305139e-05f, -7.784943694e-04f, +7.807252416e-04f, +1.647476959e-03f, -7.454599207e-04f, -2.704196331e-03f, +1.252992712e-04f, +3.526928831e-03f, +1.007170238e-03f, -3.701346318e-03f, -2.258571363e-03f, +3.085858002e-03f, +3.114692572e-03f, -1.921682455e-03f, -3.238756954e-03f, +6.979839933e-04f, +2.660301357e-03f, +1.363551587e-04f, -1.726134270e-03f, -4.115396161e-04f, +8.624472161e-04f, -3.761127040e-05f, +0.000000000e+00f, + /* 7, 7 (24) */ + +0.000000000e+00f, +5.106387551e-03f, -2.454239192e-03f, -1.444732436e-02f, -5.647730551e-03f, +2.512429796e-02f, +2.937733000e-02f, -2.691283973e-02f, -7.829223313e-02f, -4.509819274e-03f, +2.062203571e-01f, +3.920596273e-01f, +3.774560781e-01f, +1.767708824e-01f, -2.283888209e-02f, -7.658752513e-02f, -1.773352109e-02f, +3.221076811e-02f, +2.143340238e-02f, -8.450379495e-03f, -1.356282874e-02f, -8.702762106e-04f, +5.159054438e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.106387551e-03f, +8.579135019e-03f, +1.114037413e-02f, -1.158690712e-02f, -2.345681187e-02f, +8.028898189e-03f, +3.594405124e-02f, +3.461507280e-03f, -4.248322135e-02f, -1.956609724e-02f, +3.901730292e-02f, +3.362925062e-02f, -2.643467484e-02f, -3.952559844e-02f, +1.027947034e-02f, +3.535780783e-02f, +2.620771343e-03f, -2.433575637e-02f, -8.182620225e-03f, +1.233410206e-02f, +6.919939053e-03f, -5.159054438e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.852023803e-05f, +8.077180029e-04f, +4.010028457e-04f, -1.457923740e-03f, -1.800690851e-03f, +1.554537177e-03f, +4.607792738e-03f, +6.017286961e-04f, -9.476387416e-03f, -1.470805772e-02f, -6.888249110e-03f, +7.715300143e-03f, +1.474141695e-02f, +8.852675398e-03f, -1.102979298e-03f, -4.571525895e-03f, -1.278900936e-03f, +1.890204727e-03f, +1.344725204e-03f, -4.834927791e-04f, -7.762449788e-04f, -4.146649272e-06f, +0.000000000e+00f, + +0.000000000e+00f, -4.852023803e-05f, -8.156210585e-04f, +6.585888380e-04f, +1.689068377e-03f, -5.412761007e-04f, -2.711470621e-03f, -1.555436517e-04f, +3.457193766e-03f, +1.325995630e-03f, -3.532352321e-03f, -2.555776095e-03f, +2.832276198e-03f, +3.336225280e-03f, -1.631627287e-03f, -3.360769299e-03f, +4.306997585e-04f, +2.696656225e-03f, +3.376683985e-04f, -1.715218512e-03f, -5.351390935e-04f, +8.435749075e-04f, +4.146649272e-06f, +0.000000000e+00f, + /* 7, 8 (24) */ + +0.000000000e+00f, +5.154907789e-03f, -1.646521189e-03f, -1.404632151e-02f, -7.105654291e-03f, +2.332360711e-02f, +3.093186718e-02f, -2.230504699e-02f, -7.769050443e-02f, -1.398620669e-02f, +1.915122994e-01f, +3.851713782e-01f, +3.851713782e-01f, +1.915122994e-01f, -1.398620669e-02f, -7.769050443e-02f, -2.230504699e-02f, +3.093186718e-02f, +2.332360711e-02f, -7.105654291e-03f, -1.404632151e-02f, -1.646521189e-03f, +5.154907789e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.154907789e-03f, +7.763513961e-03f, +1.179896297e-02f, -9.897838738e-03f, -2.399808797e-02f, +5.317427568e-03f, +3.578850759e-02f, +6.918701045e-03f, -4.115722572e-02f, -2.309844956e-02f, +3.646152682e-02f, +3.646152682e-02f, -2.309844956e-02f, -4.115722572e-02f, +6.918701045e-03f, +3.578850759e-02f, +5.317427568e-03f, -2.399808797e-02f, -9.897838738e-03f, +1.179896297e-02f, +7.763513961e-03f, -5.154907789e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.146649272e-06f, +7.762449788e-04f, +4.834927791e-04f, -1.344725204e-03f, -1.890204727e-03f, +1.278900936e-03f, +4.571525895e-03f, +1.102979298e-03f, -8.852675398e-03f, -1.474141695e-02f, -7.715300143e-03f, +6.888249110e-03f, +1.470805772e-02f, +9.476387416e-03f, -6.017286961e-04f, -4.607792738e-03f, -1.554537177e-03f, +1.800690851e-03f, +1.457923740e-03f, -4.010028457e-04f, -8.077180029e-04f, -4.852023803e-05f, +0.000000000e+00f, + +0.000000000e+00f, -4.146649272e-06f, -8.435749075e-04f, +5.351390935e-04f, +1.715218512e-03f, -3.376683985e-04f, -2.696656225e-03f, -4.306997585e-04f, +3.360769299e-03f, +1.631627287e-03f, -3.336225280e-03f, -2.832276198e-03f, +2.555776095e-03f, +3.532352321e-03f, -1.325995630e-03f, -3.457193766e-03f, +1.555436517e-04f, +2.711470621e-03f, +5.412761007e-04f, -1.689068377e-03f, -6.585888380e-04f, +8.156210585e-04f, +4.852023803e-05f, +0.000000000e+00f, + /* 7, 9 (24) */ + +0.000000000e+00f, +5.159054438e-03f, -8.702762106e-04f, -1.356282874e-02f, -8.450379495e-03f, +2.143340238e-02f, +3.221076811e-02f, -1.773352109e-02f, -7.658752513e-02f, -2.283888209e-02f, +1.767708824e-01f, +3.774560781e-01f, +3.920596273e-01f, +2.062203571e-01f, -4.509819274e-03f, -7.829223313e-02f, -2.691283973e-02f, +2.937733000e-02f, +2.512429796e-02f, -5.647730551e-03f, -1.444732436e-02f, -2.454239192e-03f, +5.106387551e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.159054438e-03f, +6.919939053e-03f, +1.233410206e-02f, -8.182620225e-03f, -2.433575637e-02f, +2.620771343e-03f, +3.535780783e-02f, +1.027947034e-02f, -3.952559844e-02f, -2.643467484e-02f, +3.362925062e-02f, +3.901730292e-02f, -1.956609724e-02f, -4.248322135e-02f, +3.461507280e-03f, +3.594405124e-02f, +8.028898189e-03f, -2.345681187e-02f, -1.158690712e-02f, +1.114037413e-02f, +8.579135019e-03f, -5.106387551e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.761127040e-05f, +7.402703983e-04f, +5.585751831e-04f, -1.226548282e-03f, -1.962795819e-03f, +1.005294942e-03f, +4.506151104e-03f, +1.574688345e-03f, -8.212586420e-03f, -1.471874106e-02f, -8.509146265e-03f, +6.031464187e-03f, +1.461800666e-02f, +1.008027220e-02f, -7.268361020e-05f, -4.613538733e-03f, -1.830333230e-03f, +1.694237940e-03f, +1.565068062e-03f, -3.114320377e-04f, -8.341979830e-04f, -9.524305139e-05f, +0.000000000e+00f, + +0.000000000e+00f, +3.761127040e-05f, -8.624472161e-04f, +4.115396161e-04f, +1.726134270e-03f, -1.363551587e-04f, -2.660301357e-03f, -6.979839933e-04f, +3.238756954e-03f, +1.921682455e-03f, -3.114692572e-03f, -3.085858002e-03f, +2.258571363e-03f, +3.701346318e-03f, -1.007170238e-03f, -3.526928831e-03f, -1.252992712e-04f, +2.704196331e-03f, +7.454599207e-04f, -1.647476959e-03f, -7.807252416e-04f, +7.784943694e-04f, +9.524305139e-05f, +0.000000000e+00f, + /* 7,10 (24) */ + +0.000000000e+00f, +5.121443168e-03f, -1.300058124e-04f, -1.300425355e-02f, -9.676927777e-03f, +1.947060656e-02f, +3.321606306e-02f, -1.322736999e-02f, -7.501283679e-02f, -3.105146851e-02f, +1.620521414e-01f, +3.689469318e-01f, +3.980910915e-01f, +2.208383638e-01f, +5.570452929e-03f, -7.836491674e-02f, -3.152637846e-02f, +2.754699677e-02f, +2.681853590e-02f, -4.082662488e-03f, -1.475875640e-02f, -3.288437175e-03f, +5.011144499e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.121443168e-03f, +6.057491837e-03f, +1.274564168e-02f, -6.456485956e-03f, -2.447211153e-02f, -3.953001425e-05f, +3.465982383e-02f, +1.351822730e-02f, -3.760391598e-02f, -2.954936742e-02f, +3.054339262e-02f, +4.127587428e-02f, -1.586475092e-02f, -4.349039159e-02f, -6.542155103e-05f, +3.581875197e-02f, +1.073309452e-02f, -2.271135195e-02f, -1.323438407e-02f, +1.035964889e-02f, +9.357629389e-03f, -5.011144499e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.652270795e-05f, +7.003015301e-04f, +6.259942598e-04f, -1.104464972e-03f, -2.018599824e-03f, +7.355103107e-04f, +4.413212876e-03f, +2.015317859e-03f, -7.559592836e-03f, -1.464096249e-02f, -9.266495007e-03f, +5.148576604e-03f, +1.447088893e-02f, +1.066092167e-02f, +4.822058615e-04f, -4.587495045e-03f, -2.104349583e-03f, +1.570953412e-03f, +1.665086676e-03f, -2.151779427e-04f, -8.552140913e-04f, -1.440139274e-04f, +0.000000000e+00f, + +0.000000000e+00f, +7.652270795e-05f, -8.724155707e-04f, +2.889198270e-04f, +1.722154264e-03f, +6.100346450e-05f, -2.603129478e-03f, -9.553102464e-04f, +3.092461066e-03f, +2.193927679e-03f, -2.869685084e-03f, -3.314502437e-03f, +1.943051662e-03f, +3.841699129e-03f, -6.776637482e-04f, -3.569087553e-03f, -4.095628935e-04f, +2.674468361e-03f, +9.484578618e-04f, -1.590374270e-03f, -9.003609504e-04f, +7.321935201e-04f, +1.440139274e-04f, +0.000000000e+00f, + /* 7,11 (24) */ + +0.000000000e+00f, +5.044920460e-03f, +5.702957177e-04f, -1.237825929e-02f, -1.078139275e-02f, +1.745200674e-02f, +3.395157337e-02f, -8.814157112e-03f, -7.299751893e-02f, -3.861106134e-02f, +1.474111789e-01f, +3.596804368e-01f, +4.032396681e-01f, +2.353092527e-01f, +1.623137460e-02f, -7.788271088e-02f, -3.611387350e-02f, +2.544264719e-02f, +2.838948931e-02f, -2.417575813e-03f, -1.497393434e-02f, -4.143651267e-03f, +4.867130572e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.044920460e-03f, +5.185076267e-03f, +1.303456150e-02f, -4.734331692e-03f, -2.441110807e-02f, -2.642659492e-03f, +3.370451359e-02f, +1.661068836e-02f, -3.540998830e-02f, -3.241905250e-02f, +2.722889019e-02f, +4.321892594e-02f, -1.202305180e-02f, -4.416805534e-02f, -3.634509104e-03f, +3.540918907e-02f, +1.340756288e-02f, -2.176289409e-02f, -1.482475834e-02f, +9.459287938e-03f, +1.008982291e-02f, -4.867130572e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.123930488e-04f, +6.568565895e-04f, +6.855644358e-04f, -9.795355672e-04f, -2.057866950e-03f, +4.712494000e-04f, +4.294374310e-03f, +2.423543627e-03f, -6.897169111e-03f, -1.450928162e-02f, -9.984249714e-03f, +4.243358483e-03f, +1.426661613e-02f, +1.121499001e-02f, +1.060794041e-03f, -4.528548702e-03f, -2.374588642e-03f, +1.431071805e-03f, +1.756920822e-03f, -1.127085856e-04f, -8.703210413e-04f, -1.944982509e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.123930488e-04f, -8.737393824e-04f, +1.683651158e-04f, +1.703742488e-03f, +2.528192328e-04f, -2.526029878e-03f, -1.200708124e-03f, +2.923375346e-03f, +2.446296790e-03f, -2.603319785e-03f, -3.516401923e-03f, +1.611762473e-03f, +3.952135722e-03f, -3.400979684e-04f, -3.583007554e-03f, -6.949188872e-04f, +2.622111362e-03f, +1.148479505e-03f, -1.517831245e-03f, -1.016295809e-03f, +6.768100371e-04f, +1.944982509e-04f, +0.000000000e+00f, + /* 7,12 (24) */ + +0.000000000e+00f, +4.932527411e-03f, +1.227152307e-03f, -1.169269486e-02f, -1.176092832e-02f, +1.539413979e-02f, +3.442282277e-02f, -4.519782801e-03f, -7.057397530e-02f, -4.550823045e-02f, +1.329018973e-01f, +3.496961871e-01f, +4.074830266e-01f, +2.495758688e-01f, +2.744636461e-02f, -7.682191684e-02f, -4.064242221e-02f, +2.306805854e-02f, +2.982056112e-02f, -6.606549905e-04f, -1.508664293e-02f, -5.013972308e-03f, +4.672632321e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.932527411e-03f, +4.311336884e-03f, +1.320292662e-02f, -3.030589203e-03f, -2.415828883e-02f, -5.168689370e-03f, +3.250380546e-02f, +1.953406371e-02f, -3.296369151e-02f, -3.502237229e-02f, +2.371248826e-02f, +4.483068842e-02f, -8.070916073e-03f, -4.450815331e-02f, -7.217516658e-03f, +3.471427019e-02f, +1.602967424e-02f, -2.061441459e-02f, -1.634258959e-02f, +8.442992129e-03f, +1.076663295e-02f, -4.672632321e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.450641040e-04f, +6.104599864e-04f, +7.371691971e-04f, -8.528011259e-04f, -2.080956301e-03f, +2.141172104e-04f, +4.151403594e-03f, +2.798258467e-03f, -6.228772114e-03f, -1.432515748e-02f, -1.065952560e-02f, +3.319702649e-03f, +1.400538929e-02f, +1.173921366e-02f, +1.660748468e-03f, -4.435753633e-03f, -2.639006402e-03f, +1.274957402e-03f, +1.839533055e-03f, -4.561343438e-06f, -8.791039320e-04f, -2.463295698e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.450641040e-04f, -8.667547216e-04f, +5.090767384e-05f, +1.671480945e-03f, +4.375886207e-04f, -2.430046906e-03f, -1.432338467e-03f, +2.733167914e-03f, +2.676907281e-03f, -2.317880747e-03f, -3.689975385e-03f, +1.267383541e-03f, +4.031626058e-03f, +2.817935595e-06f, -3.568259095e-03f, -9.789963650e-04f, +2.547144415e-03f, +1.343721795e-03f, -1.430062494e-03f, -1.127328211e-03f, +6.125302830e-04f, +2.463295698e-04f, +0.000000000e+00f, + /* 7,13 (24) */ + +0.000000000e+00f, +4.787463307e-03f, +1.837612294e-03f, -1.095552566e-02f, -1.261372944e-02f, +1.331318349e-02f, +3.463693998e-02f, -3.683792076e-04f, -6.777571684e-02f, -5.173700257e-02f, +1.185767398e-01f, +3.390366615e-01f, +4.108027292e-01f, +2.635812581e-01f, +3.918557827e-02f, -7.516116837e-02f, -4.507817584e-02f, +2.042905214e-02f, +3.109551852e-02f, +1.178878065e-03f, -1.509120427e-02f, -5.893076240e-03f, +4.426302751e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.787463307e-03f, +3.444582163e-03f, +1.325383429e-02f, -1.359108259e-03f, -2.372070021e-02f, -7.598736276e-03f, +3.107146700e-02f, +2.226723162e-02f, -3.028678423e-02f, -3.734025303e-02f, +2.002251288e-02f, +4.609807196e-02f, -4.039290015e-03f, -4.450533537e-02f, -1.078577575e-02f, +3.373527382e-02f, +1.857681866e-02f, -1.927069279e-02f, -1.777265208e-02f, +7.315663918e-03f, +1.137916323e-02f, -4.426302751e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.744140062e-04f, +5.616376918e-04f, +7.807594176e-04f, -7.252763246e-04f, -2.088329659e-03f, -3.438631993e-05f, +3.986160141e-03f, +3.138574086e-03f, -5.557821765e-03f, -1.409029711e-02f, -1.128966452e-02f, +2.381601714e-03f, +1.368770001e-02f, +1.223043104e-02f, +2.279560013e-03f, -4.308340858e-03f, -2.895524757e-03f, +1.103106010e-03f, +1.911915938e-03f, +1.086587356e-04f, -8.811830113e-04f, -2.991115597e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.744140062e-04f, -8.518685200e-04f, -6.248191900e-05f, +1.626061328e-03f, +6.139045822e-04f, -2.316367984e-03f, -1.648507487e-03f, +2.523664948e-03f, +2.884074954e-03f, -2.015798799e-03f, -3.833881268e-03f, +9.127061273e-04f, +4.079394877e-03f, +3.483101673e-04f, -3.524651173e-03f, -1.259402165e-03f, +2.449784125e-03f, +1.532385244e-03f, -1.327427733e-03f, -1.232266753e-03f, +5.396365250e-04f, +2.991115597e-04f, +0.000000000e+00f, + /* 7,14 (24) */ + +0.000000000e+00f, +4.613049301e-03f, +2.399249985e-03f, -1.017476624e-02f, -1.333900577e-02f, +1.122485383e-02f, +3.460255366e-02f, +3.617780933e-03f, -6.463714275e-02f, -5.729482433e-02f, +1.044864427e-01f, +3.277469969e-01f, +4.131843309e-01f, +2.772689581e-01f, +5.141600931e-02f, -7.288160836e-02f, -4.938651670e-02f, +1.753352739e-02f, +3.219862453e-02f, +3.090794002e-03f, -1.498254553e-02f, -6.774259251e-03f, +4.127191192e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.613049301e-03f, +2.592713642e-03f, +1.319135237e-02f, +2.669530690e-04f, -2.310679563e-02f, -9.915104261e-03f, +2.942295951e-02f, +2.479089657e-02f, -2.740270928e-02f, -3.935605183e-02f, +1.618863161e-02f, +4.701077808e-02f, +4.010486123e-05f, -4.415702520e-02f, -1.431042693e-02f, +3.247587166e-02f, +2.102660278e-02f, -1.773830755e-02f, -1.910007982e-02f, +6.083397165e-03f, +1.191879975e-02f, -4.127191192e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.003567872e-04f, +5.109127599e-04f, +8.163512084e-04f, -5.979427464e-04f, -2.080544726e-03f, -2.728731042e-04f, +3.800580450e-03f, +3.443821555e-03f, -4.887682191e-03f, -1.380664343e-02f, -1.187224841e-02f, +1.433126540e-03f, +1.331433006e-02f, +1.268560189e-02f, +2.914554260e-03f, -4.145727760e-03f, -3.142044342e-03f, +9.161458347e-04f, +1.973100792e-03f, +2.262812169e-04f, -8.762183159e-04f, -3.524203322e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.003567872e-04f, -8.295522149e-04f, -1.709022891e-04f, +1.568275856e-03f, +7.804671935e-04f, -2.186310520e-03f, -1.847679418e-03f, +2.296833118e-03f, +3.066326715e-03f, -1.699630006e-03f, -3.947028441e-03f, +5.506092781e-04f, +4.094929294e-03f, +6.935637465e-04f, -3.452235550e-03f, -1.533741589e-03f, +2.330445955e-03f, +1.712690410e-03f, -1.210431863e-03f, -1.329942076e-03f, +4.585070492e-04f, +3.524203322e-04f, +0.000000000e+00f, + /* 7,15 (24) */ + +0.000000000e+00f, +4.412692514e-03f, +2.910162745e-03f, -9.358415034e-03f, -1.393694851e-02f, +9.144309102e-03f, +3.432968055e-02f, +7.418361383e-03f, -6.119332119e-02f, -6.218250653e-02f, +9.067979924e-02f, +3.158747485e-01f, +4.146174575e-01f, +2.905832882e-01f, +6.410161121e-02f, -6.996705410e-02f, -5.353224446e-02f, +1.439148304e-02f, +3.311477036e-02f, +5.063894795e-03f, -1.475626432e-02f, -7.650477567e-03f, +3.774770859e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.412692514e-03f, +1.763161428e-03f, +1.302045009e-02f, +1.835228925e-03f, -2.232632844e-02f, -1.210141478e-02f, +2.757528009e-02f, +2.708772969e-02f, -2.433638256e-02f, -4.105568184e-02f, +1.224160317e-02f, +4.756138736e-02f, +4.135034155e-03f, -4.346346146e-02f, -1.776266248e-02f, +3.094213007e-02f, +2.335704874e-02f, -1.602561714e-02f, -2.031051168e-02f, +4.753455089e-03f, +1.237730680e-02f, -3.774770859e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.228416515e-04f, +4.588010355e-04f, +8.440233219e-04f, -4.717426375e-04f, -2.058247866e-03f, -5.000727499e-04f, +3.596663800e-03f, +3.713550397e-03f, -4.221643471e-03f, -1.347636193e-02f, -1.240511117e-02f, +4.784042305e-04f, +1.288634917e-02f, +1.310182610e-02f, +3.562904099e-03f, -3.947526340e-03f, -3.376457860e-03f, +7.148374391e-04f, +2.022166441e-03f, +3.475731664e-04f, -8.639141446e-04f, -4.058070785e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.228416515e-04f, -8.003349149e-04f, -2.735279885e-04f, +1.499007371e-03f, +9.360930950e-04f, -2.041307870e-03f, -2.028487580e-03f, +2.054760965e-03f, +3.222411416e-03f, -1.372033154e-03f, -4.028584887e-03f, +1.840353029e-04f, +4.077984126e-03f, +1.035746467e-03f, -3.351308669e-03f, -1.799639412e-03f, +2.189743774e-03f, +1.882894487e-03f, -1.079723663e-03f, -1.419218793e-03f, +3.696152939e-04f, +4.058070785e-04f, +0.000000000e+00f, + /* 8, 0 (20) */ + +4.232530385e-03f, -1.107445485e-02f, -1.430417411e-02f, +1.968688515e-02f, +3.656181770e-02f, -2.833728014e-02f, -8.751812114e-02f, +3.477572232e-02f, +3.116826556e-01f, +4.628412844e-01f, +3.116826556e-01f, +3.477572232e-02f, -8.751812114e-02f, -2.833728014e-02f, +3.656181770e-02f, +1.968688515e-02f, -1.430417411e-02f, -1.107445485e-02f, +4.232530385e-03f, +4.331790294e-03f, + -4.232530385e-03f, +1.371036132e-02f, -2.107151343e-03f, -2.492818050e-02f, +2.775785172e-03f, +3.622176182e-02f, -2.346340648e-03f, -4.463231996e-02f, +9.160844319e-04f, +4.774542267e-02f, +9.160844319e-04f, -4.463231996e-02f, -2.346340648e-03f, +3.622176182e-02f, +2.775785172e-03f, -2.492818050e-02f, -2.107151343e-03f, +1.371036132e-02f, +7.679719629e-04f, -4.331790294e-03f, + +4.942988507e-04f, +1.071645627e-03f, -9.424427779e-04f, -2.597731926e-03f, +1.186714087e-03f, +5.747165752e-03f, -2.115954295e-04f, -1.413757257e-02f, -1.696433330e-02f, -6.624395334e-04f, +1.643369606e-02f, +1.484839508e-02f, +9.992320544e-04f, -5.768311362e-03f, -1.568176220e-03f, +2.541380620e-03f, +1.122154771e-03f, -1.027264733e-03f, -5.704953334e-04f, +3.415338794e-04f, + -4.942988507e-04f, -2.436400721e-04f, +1.885885873e-03f, +2.359866487e-04f, -2.997607234e-03f, -2.308187490e-04f, +3.969785406e-03f, +2.323344870e-04f, -4.541971466e-03f, -2.272916666e-04f, +4.552059213e-03f, +1.938510128e-04f, -3.998338864e-03f, -1.182078953e-04f, +3.039732580e-03f, +8.177305509e-06f, -1.934277966e-03f, +1.057490789e-04f, +9.438317895e-04f, -3.415338794e-04f, + /* 8, 1 (20) */ + +4.726829236e-03f, -1.000280923e-02f, -1.524661688e-02f, +1.708915323e-02f, +3.774853178e-02f, -2.259011439e-02f, -8.772971657e-02f, +2.063814975e-02f, +2.947183224e-01f, +4.621788449e-01f, +3.281163517e-01f, +4.962411740e-02f, -8.651888909e-02f, -3.410559150e-02f, +3.499364147e-02f, +2.222826577e-02f, -1.318201934e-02f, -1.210171959e-02f, +3.662035052e-03f, +4.673324173e-03f, + -4.726829236e-03f, +1.346672125e-02f, -2.212654702e-04f, -2.469219385e-02f, -2.218220622e-04f, +3.599094307e-02f, +1.623444758e-03f, -4.439998547e-02f, -3.625887034e-03f, +4.751813100e-02f, +5.468143645e-03f, -4.443846894e-02f, -6.344679512e-03f, +3.610355393e-02f, +5.815517752e-03f, -2.492000319e-02f, -4.041429309e-03f, +1.381611040e-02f, +1.711803752e-03f, -4.673324173e-03f, + +4.177112667e-04f, +1.103660859e-03f, -7.626689300e-04f, -2.628836244e-03f, +8.115983865e-04f, +5.679469349e-03f, +5.376812897e-04f, -1.337916564e-02f, -1.740925935e-02f, -1.983735818e-03f, +1.581927685e-02f, +1.550627344e-02f, +1.821355477e-03f, -5.740654674e-03f, -1.952901032e-03f, +2.459183624e-03f, +1.300077533e-03f, -9.703331099e-04f, -6.454489193e-04f, +3.186394550e-04f, + -4.177112667e-04f, -3.730686962e-04f, +1.819407190e-03f, +4.710015288e-04f, -2.926444716e-03f, -5.716057562e-04f, +3.902616591e-03f, +6.527285219e-04f, -4.487557259e-03f, -6.795955332e-04f, +4.517545568e-03f, +6.215611338e-04f, -3.987518887e-03f, -4.720017220e-04f, +3.051758490e-03f, +2.590992107e-04f, -1.963452251e-03f, -3.931042588e-05f, +9.808922698e-04f, -3.186394550e-04f, + /* 8, 2 (20) */ + +5.144540503e-03f, -8.899148369e-03f, -1.600928581e-02f, +1.446031698e-02f, +3.856013017e-02f, -1.691064504e-02f, -8.719203528e-02f, +7.258984110e-03f, +2.773090630e-01f, +4.601951090e-01f, +3.439356286e-01f, +6.513039084e-02f, -8.469753361e-02f, -3.984624618e-02f, +3.304074044e-02f, +2.468744940e-02f, -1.188194180e-02f, -1.307205270e-02f, +3.016586133e-03f, +4.991963628e-03f, + -5.144540503e-03f, +1.309365256e-02f, +1.598141720e-03f, -2.422119232e-02f, -3.148266778e-03f, +3.541933732e-02f, +5.526061349e-03f, -4.374725695e-02f, -8.113444292e-03f, +4.683853547e-02f, +9.985689213e-03f, -4.381690781e-02f, -1.033219840e-02f, +3.563155220e-02f, +8.867276242e-03f, -2.466090398e-02f, -6.004881559e-03f, +1.377679998e-02f, +2.692696022e-03f, -4.991963628e-03f, + +3.415464863e-04f, +1.123608017e-03f, -5.844882044e-04f, -2.635491254e-03f, +4.457406325e-04f, +5.567743023e-03f, +1.245091159e-03f, -1.257874121e-02f, -1.776709489e-02f, -3.294307841e-03f, +1.512354579e-02f, +1.610609591e-02f, +2.673746811e-03f, -5.662239035e-03f, -2.337652654e-03f, +2.350754304e-03f, +1.474425077e-03f, -9.007850030e-04f, -7.182774986e-04f, +2.902308282e-04f, + -3.415464863e-04f, -4.928842361e-04f, +1.736141823e-03f, +6.946336616e-04f, -2.827593855e-03f, -9.008208921e-04f, +3.797981338e-03f, +1.063156485e-03f, -4.389545543e-03f, -1.125084945e-03f, +4.438614138e-03f, +1.046481376e-03f, -3.936970650e-03f, -8.269856589e-04f, +3.032926427e-03f, +5.142539520e-04f, -1.972464090e-03f, -1.901127300e-04f, +1.007774411e-03f, -2.902308282e-04f, + /* 8, 3 (20) */ + +5.486086989e-03f, -7.775540352e-03f, -1.659377402e-02f, +1.182482573e-02f, +3.900587080e-02f, -1.134290202e-02f, -8.594694412e-02f, -5.319757101e-03f, +2.595419681e-01f, +4.569008012e-01f, +3.590591744e-01f, +8.123648675e-02f, -8.202378680e-02f, -4.550848521e-02f, +3.070308779e-02f, +2.703820370e-02f, -1.040751673e-02f, -1.397283770e-02f, +2.298308634e-03f, +5.282194456e-03f, + -5.486086989e-03f, +1.260076832e-02f, +3.334283543e-03f, -2.352655866e-02f, -5.975860633e-03f, +3.451851642e-02f, +9.324042687e-03f, -4.268410046e-02f, -1.250298984e-02f, +4.571345052e-02f, +1.442430335e-02f, -4.277042643e-02f, -1.426916905e-02f, +3.480456655e-02f, +1.190020267e-02f, -2.414665003e-02f, -7.977345649e-03f, +1.358668725e-02f, +3.700470433e-03f, -5.282194456e-03f, + +2.665736490e-04f, +1.131889554e-03f, -4.094705608e-04f, -2.618679197e-03f, +9.186198754e-05f, +5.414749998e-03f, +1.907510627e-03f, -1.174203160e-02f, -1.803701535e-02f, -4.587086190e-03f, +1.434950098e-02f, +1.664303823e-02f, +3.551864832e-03f, -5.531426381e-03f, -2.719065127e-03f, +2.215929696e-03f, +1.643367680e-03f, -8.186798190e-04f, -7.880768710e-04f, +2.562947352e-04f, + -2.665736490e-04f, -6.020883660e-04f, +1.637538942e-03f, +9.048280058e-04f, -2.702670008e-03f, -1.215305720e-03f, +3.657402910e-03f, +1.459579288e-03f, -4.249109906e-03f, -1.559296489e-03f, +4.315906681e-03f, +1.464294980e-03f, -3.846750697e-03f, -1.179515272e-03f, +2.982795618e-03f, +7.710079281e-04f, -1.960571555e-03f, -3.451135083e-04f, +1.023673450e-03f, -2.562947352e-04f, + /* 8, 4 (20) */ + +5.752660638e-03f, -6.643650798e-03f, -1.700324458e-02f, +9.206146531e-03f, +3.909773279e-02f, -5.928152020e-03f, -8.403943349e-02f, -1.706178870e-02f, +2.415049528e-01f, +4.523137150e-01f, +3.734086753e-01f, +9.787952498e-02f, -7.847192197e-02f, -5.103991159e-02f, +2.798402266e-02f, +2.925413340e-02f, -8.764149045e-03f, -1.479151752e-02f, +1.510231763e-03f, +5.538489191e-03f, + -5.752660638e-03f, +1.199867995e-02f, +4.971822485e-03f, -2.262173065e-02f, -8.678530641e-03f, +3.330321070e-02f, +1.298144560e-02f, -4.122452117e-02f, -1.675209974e-02f, +4.415415403e-02f, +1.874021003e-02f, -4.130613145e-02f, -1.811591975e-02f, +3.362505127e-02f, +1.488299829e-02f, -2.337564210e-02f, -9.937917204e-03f, +1.324157374e-02f, +4.724143883e-03f, -5.538489191e-03f, + +1.935110042e-04f, +1.129004395e-03f, -2.390895771e-04f, -2.579551310e-03f, -2.475227204e-04f, +5.223467590e-03f, +2.522213513e-03f, -1.087489204e-02f, -1.821875186e-02f, -5.855120957e-03f, +1.350065164e-02f, +1.711260140e-02f, +4.450872321e-03f, -5.346918973e-03f, -3.093666186e-03f, +2.054780478e-03f, +1.805047718e-03f, -7.242069211e-04f, -8.539295515e-04f, +2.168827929e-04f, + -1.935110042e-04f, -6.998422929e-04f, +1.525176311e-03f, +1.099726856e-03f, -2.553532414e-03f, -1.512106800e-03f, +3.482758529e-03f, +1.838134873e-03f, -4.067854459e-03f, -1.977885169e-03f, +4.150517779e-03f, +1.870728646e-03f, -3.717330658e-03f, -1.525917272e-03f, +2.901253756e-03f, +1.026646345e-03f, -1.927249547e-03f, -5.026649039e-04f, +1.027892703e-03f, -2.168827929e-04f, + /* 8, 5 (20) */ + +5.946171642e-03f, -5.514646403e-03f, -1.724233416e-02f, +6.626595221e-03f, +3.885021007e-02f, -7.046844307e-04f, -8.151721998e-02f, -2.793668074e-02f, +2.232862009e-01f, +4.464585940e-01f, +3.869093270e-01f, +1.149921264e-01f, -7.402104965e-02f, -5.638683057e-02f, +2.489035648e-02f, +3.130891387e-02f, -6.959101328e-03f, -1.551572444e-02f, +6.563022117e-04f, +5.755371984e-03f, + -5.946171642e-03f, +1.129883766e-02f, +6.496998796e-03f, -2.152200380e-02f, -1.123206305e-02f, +3.179110390e-02f, +1.646420413e-02f, -3.938638630e-02f, -2.081995420e-02f, +4.217626886e-02f, +2.289072781e-02f, -3.943540281e-02f, -2.183325040e-02f, +3.209913400e-02f, +1.778425204e-02f, -2.234899576e-02f, -1.186516675e-02f, +1.273890883e-02f, +5.752036586e-03f, -5.755371984e-03f, + +1.230205712e-04f, +1.115538893e-03f, -7.471240596e-05f, -2.519411274e-03f, -5.701187780e-04f, +4.997057938e-03f, +3.086881692e-03f, -9.983257923e-03f, -1.831258806e-02f, -7.091628267e-03f, +1.258099744e-02f, +1.751064758e-02f, +5.365665157e-03f, -5.107778925e-03f, -3.457902630e-03f, +1.867619167e-03f, +1.957596360e-03f, -6.176892922e-04f, -9.149140868e-04f, +1.721140407e-04f, + -1.230205712e-04f, -7.854717648e-04f, +1.400738631e-03f, +1.277685904e-03f, -2.382259241e-03f, -1.788504203e-03f, +3.276255373e-03f, +2.195177521e-03f, -3.847795161e-03f, -2.376669961e-03f, +3.943984633e-03f, +2.261598070e-03f, -3.549596463e-03f, -1.862528860e-03f, +2.788524193e-03f, +1.278402014e-03f, -1.872201692e-03f, -6.610323088e-04f, +1.019856264e-03f, -1.721140407e-04f, + /* 8, 6 (20) */ + +6.069192214e-03f, -4.399107510e-03f, -1.731704656e-02f, +4.107183947e-03f, +3.828009129e-02f, +4.292373508e-03f, -7.843033829e-02f, -3.791993866e-02f, +2.049736128e-01f, +4.393669658e-01f, +3.994903244e-01f, +1.325027740e-01f, -6.865538449e-02f, -6.149460949e-02f, +2.143245385e-02f, +3.317653304e-02f, -5.001504968e-03f, -1.613341373e-02f, -2.586118751e-04f, +5.927486025e-03f, + -6.069192214e-03f, +1.051336590e-02f, +7.897737427e-03f, -2.024431789e-02f, -1.361432230e-02f, +3.000259970e-02f, +1.974045950e-02f, -3.719120878e-02f, -2.466774936e-02f, +3.979959890e-02f, +2.683471244e-02f, -3.717380474e-02f, -2.538284687e-02f, +3.023660514e-02f, +2.057277624e-02f, -2.107059374e-02f, -1.373736844e-02f, +1.207787653e-02f, +6.771892850e-03f, -5.927486025e-03f, + +5.570361358e-05f, +1.092157279e-03f, +8.240889726e-05f, -2.439697861e-03f, -8.738631007e-04f, +4.738838004e-03f, +3.599612441e-03f, -9.073101965e-03f, -1.831935298e-02f, -8.290035550e-03f, +1.159500427e-02f, +1.783343363e-02f, +6.290903966e-03f, -4.813445299e-03f, -3.808167111e-03f, +1.655006415e-03f, +2.099150977e-03f, -4.995859877e-04f, -9.701147992e-04f, +1.221768178e-04f, + -5.570361358e-05f, -8.584699379e-04f, +1.265995183e-03f, +1.437287524e-03f, -2.191120659e-03f, -2.042037039e-03f, +3.040403273e-03f, +2.527314523e-03f, -3.591336800e-03f, -2.751677569e-03f, +3.698272068e-03f, +2.632852796e-03f, -3.344843039e-03f, -2.185737471e-03f, +2.645169480e-03f, +1.523485340e-03f, -1.795369830e-03f, -8.184126778e-04f, +9.991205384e-04f, -1.221768178e-04f, + /* 8, 7 (20) */ + +6.124895827e-03f, -3.306950231e-03f, -1.723463767e-02f, +1.667486087e-03f, +3.740622819e-02f, +9.031211512e-03f, -7.483072585e-02f, -4.699304063e-02f, +1.866542599e-01f, +4.310769302e-01f, +4.110853287e-01f, +1.503362076e-01f, -6.236448052e-02f, -6.630805479e-02f, +1.762428674e-02f, +3.483153946e-02f, -2.902353991e-03f, -1.663299972e-02f, -1.228726674e-03f, +6.049662843e-03f, + -6.124895827e-03f, +9.654895957e-03f, +9.163732609e-03f, -1.880703037e-02f, -1.580544296e-02f, +2.796056266e-02f, +2.278086277e-02f, -3.466389426e-02f, -2.825908616e-02f, +3.704792133e-02f, +3.053298451e-02f, -3.454095194e-02f, -2.872768991e-02f, +2.805086767e-02f, +2.321794572e-02f, -1.954710840e-02f, -1.553273827e-02f, +1.125946385e-02f, +7.771013389e-03f, -6.049662843e-03f, + -7.903055656e-06f, +1.059591684e-03f, +2.311446369e-04f, -2.341966952e-03f, -1.156933444e-03f, +4.452249087e-03f, +4.058922462e-03f, -8.150391786e-03f, -1.824041005e-02f, -9.444025205e-03f, +1.054757634e-02f, +1.807764223e-02f, +7.221048111e-03f, -4.463748597e-03f, -4.140826137e-03f, +1.417755289e-03f, +2.227873126e-03f, -3.704933080e-04f, -1.018631873e-03f, +6.732992868e-05f, + +7.903055656e-06f, -9.184981212e-04f, +1.122777048e-03f, +1.577351182e-03f, -1.982550260e-03f, -2.270525783e-03f, +2.777984421e-03f, +2.831439858e-03f, -3.301245901e-03f, -3.099183915e-03f, +3.415752908e-03f, +2.980619881e-03f, -3.104764493e-03f, -2.492020480e-03f, +2.472091164e-03f, +1.759115187e-03f, -1.696940912e-03f, -9.729541903e-04f, +9.653844472e-04f, -6.732992868e-05f, + /* 8, 8 (20) */ + +6.116992771e-03f, -2.247358547e-03f, -1.700349303e-02f, -6.744808652e-04f, +3.624929475e-02f, +1.348346060e-02f, -7.077180339e-02f, -5.514343241e-02f, +1.684138498e-01f, +4.216329050e-01f, +4.216329050e-01f, +1.684138498e-01f, -5.514343241e-02f, -7.077180339e-02f, +1.348346060e-02f, +3.624929475e-02f, -6.744808652e-04f, -1.700349303e-02f, -2.247358547e-03f, +6.116992771e-03f, + -6.116992771e-03f, +8.736397836e-03f, +1.028650966e-02f, -1.722967919e-02f, -1.778799322e-02f, +2.569003688e-02f, +2.555884719e-02f, -3.183245440e-02f, -3.156033206e-02f, +3.394873742e-02f, +3.394873742e-02f, -3.156033206e-02f, -3.183245440e-02f, +2.555884719e-02f, +2.569003688e-02f, -1.778799322e-02f, -1.722967919e-02f, +1.028650966e-02f, +8.736397836e-03f, -6.116992771e-03f, + -6.732992868e-05f, +1.018631873e-03f, +3.704933080e-04f, -2.227873126e-03f, -1.417755289e-03f, +4.140826137e-03f, +4.463748597e-03f, -7.221048111e-03f, -1.807764223e-02f, -1.054757634e-02f, +9.444025205e-03f, +1.824041005e-02f, +8.150391786e-03f, -4.058922462e-03f, -4.452249087e-03f, +1.156933444e-03f, +2.341966952e-03f, -2.311446369e-04f, -1.059591684e-03f, +7.903055656e-06f, + +6.732992868e-05f, -9.653844472e-04f, +9.729541903e-04f, +1.696940912e-03f, -1.759115187e-03f, -2.472091164e-03f, +2.492020480e-03f, +3.104764493e-03f, -2.980619881e-03f, -3.415752908e-03f, +3.099183915e-03f, +3.301245901e-03f, -2.831439858e-03f, -2.777984421e-03f, +2.270525783e-03f, +1.982550260e-03f, -1.577351182e-03f, -1.122777048e-03f, +9.184981212e-04f, -7.903055656e-06f, + /* 8, 9 (20) */ + +6.049662843e-03f, -1.228726674e-03f, -1.663299972e-02f, -2.902353991e-03f, +3.483153946e-02f, +1.762428674e-02f, -6.630805479e-02f, -6.236448052e-02f, +1.503362076e-01f, +4.110853287e-01f, +4.310769302e-01f, +1.866542599e-01f, -4.699304063e-02f, -7.483072585e-02f, +9.031211512e-03f, +3.740622819e-02f, +1.667486087e-03f, -1.723463767e-02f, -3.306950231e-03f, +6.124895827e-03f, + -6.049662843e-03f, +7.771013389e-03f, +1.125946385e-02f, -1.553273827e-02f, -1.954710840e-02f, +2.321794572e-02f, +2.805086767e-02f, -2.872768991e-02f, -3.454095194e-02f, +3.053298451e-02f, +3.704792133e-02f, -2.825908616e-02f, -3.466389426e-02f, +2.278086277e-02f, +2.796056266e-02f, -1.580544296e-02f, -1.880703037e-02f, +9.163732609e-03f, +9.654895957e-03f, -6.124895827e-03f, + -1.221768178e-04f, +9.701147992e-04f, +4.995859877e-04f, -2.099150977e-03f, -1.655006415e-03f, +3.808167111e-03f, +4.813445299e-03f, -6.290903966e-03f, -1.783343363e-02f, -1.159500427e-02f, +8.290035550e-03f, +1.831935298e-02f, +9.073101965e-03f, -3.599612441e-03f, -4.738838004e-03f, +8.738631007e-04f, +2.439697861e-03f, -8.240889726e-05f, -1.092157279e-03f, -5.570361358e-05f, + +1.221768178e-04f, -9.991205384e-04f, +8.184126778e-04f, +1.795369830e-03f, -1.523485340e-03f, -2.645169480e-03f, +2.185737471e-03f, +3.344843039e-03f, -2.632852796e-03f, -3.698272068e-03f, +2.751677569e-03f, +3.591336800e-03f, -2.527314523e-03f, -3.040403273e-03f, +2.042037039e-03f, +2.191120659e-03f, -1.437287524e-03f, -1.265995183e-03f, +8.584699379e-04f, +5.570361358e-05f, + /* 8,10 (20) */ + +5.927486025e-03f, -2.586118751e-04f, -1.613341373e-02f, -5.001504968e-03f, +3.317653304e-02f, +2.143245385e-02f, -6.149460949e-02f, -6.865538449e-02f, +1.325027740e-01f, +3.994903244e-01f, +4.393669658e-01f, +2.049736128e-01f, -3.791993866e-02f, -7.843033829e-02f, +4.292373508e-03f, +3.828009129e-02f, +4.107183947e-03f, -1.731704656e-02f, -4.399107510e-03f, +6.069192214e-03f, + -5.927486025e-03f, +6.771892850e-03f, +1.207787653e-02f, -1.373736844e-02f, -2.107059374e-02f, +2.057277624e-02f, +3.023660514e-02f, -2.538284687e-02f, -3.717380474e-02f, +2.683471244e-02f, +3.979959890e-02f, -2.466774936e-02f, -3.719120878e-02f, +1.974045950e-02f, +3.000259970e-02f, -1.361432230e-02f, -2.024431789e-02f, +7.897737427e-03f, +1.051336590e-02f, -6.069192214e-03f, + -1.721140407e-04f, +9.149140868e-04f, +6.176892922e-04f, -1.957596360e-03f, -1.867619167e-03f, +3.457902630e-03f, +5.107778925e-03f, -5.365665157e-03f, -1.751064758e-02f, -1.258099744e-02f, +7.091628267e-03f, +1.831258806e-02f, +9.983257923e-03f, -3.086881692e-03f, -4.997057938e-03f, +5.701187780e-04f, +2.519411274e-03f, +7.471240596e-05f, -1.115538893e-03f, -1.230205712e-04f, + +1.721140407e-04f, -1.019856264e-03f, +6.610323088e-04f, +1.872201692e-03f, -1.278402014e-03f, -2.788524193e-03f, +1.862528860e-03f, +3.549596463e-03f, -2.261598070e-03f, -3.943984633e-03f, +2.376669961e-03f, +3.847795161e-03f, -2.195177521e-03f, -3.276255373e-03f, +1.788504203e-03f, +2.382259241e-03f, -1.277685904e-03f, -1.400738631e-03f, +7.854717648e-04f, +1.230205712e-04f, + /* 8,11 (20) */ + +5.755371984e-03f, +6.563022117e-04f, -1.551572444e-02f, -6.959101328e-03f, +3.130891387e-02f, +2.489035648e-02f, -5.638683057e-02f, -7.402104965e-02f, +1.149921264e-01f, +3.869093270e-01f, +4.464585940e-01f, +2.232862009e-01f, -2.793668074e-02f, -8.151721998e-02f, -7.046844307e-04f, +3.885021007e-02f, +6.626595221e-03f, -1.724233416e-02f, -5.514646403e-03f, +5.946171642e-03f, + -5.755371984e-03f, +5.752036586e-03f, +1.273890883e-02f, -1.186516675e-02f, -2.234899576e-02f, +1.778425204e-02f, +3.209913400e-02f, -2.183325040e-02f, -3.943540281e-02f, +2.289072781e-02f, +4.217626886e-02f, -2.081995420e-02f, -3.938638630e-02f, +1.646420413e-02f, +3.179110390e-02f, -1.123206305e-02f, -2.152200380e-02f, +6.496998796e-03f, +1.129883766e-02f, -5.946171642e-03f, + -2.168827929e-04f, +8.539295515e-04f, +7.242069211e-04f, -1.805047718e-03f, -2.054780478e-03f, +3.093666186e-03f, +5.346918973e-03f, -4.450872321e-03f, -1.711260140e-02f, -1.350065164e-02f, +5.855120957e-03f, +1.821875186e-02f, +1.087489204e-02f, -2.522213513e-03f, -5.223467590e-03f, +2.475227204e-04f, +2.579551310e-03f, +2.390895771e-04f, -1.129004395e-03f, -1.935110042e-04f, + +2.168827929e-04f, -1.027892703e-03f, +5.026649039e-04f, +1.927249547e-03f, -1.026646345e-03f, -2.901253756e-03f, +1.525917272e-03f, +3.717330658e-03f, -1.870728646e-03f, -4.150517779e-03f, +1.977885169e-03f, +4.067854459e-03f, -1.838134873e-03f, -3.482758529e-03f, +1.512106800e-03f, +2.553532414e-03f, -1.099726856e-03f, -1.525176311e-03f, +6.998422929e-04f, +1.935110042e-04f, + /* 8,12 (20) */ + +5.538489191e-03f, +1.510231763e-03f, -1.479151752e-02f, -8.764149045e-03f, +2.925413340e-02f, +2.798402266e-02f, -5.103991159e-02f, -7.847192197e-02f, +9.787952498e-02f, +3.734086753e-01f, +4.523137150e-01f, +2.415049528e-01f, -1.706178870e-02f, -8.403943349e-02f, -5.928152020e-03f, +3.909773279e-02f, +9.206146531e-03f, -1.700324458e-02f, -6.643650798e-03f, +5.752660638e-03f, + -5.538489191e-03f, +4.724143883e-03f, +1.324157374e-02f, -9.937917204e-03f, -2.337564210e-02f, +1.488299829e-02f, +3.362505127e-02f, -1.811591975e-02f, -4.130613145e-02f, +1.874021003e-02f, +4.415415403e-02f, -1.675209974e-02f, -4.122452117e-02f, +1.298144560e-02f, +3.330321070e-02f, -8.678530641e-03f, -2.262173065e-02f, +4.971822485e-03f, +1.199867995e-02f, -5.752660638e-03f, + -2.562947352e-04f, +7.880768710e-04f, +8.186798190e-04f, -1.643367680e-03f, -2.215929696e-03f, +2.719065127e-03f, +5.531426381e-03f, -3.551864832e-03f, -1.664303823e-02f, -1.434950098e-02f, +4.587086190e-03f, +1.803701535e-02f, +1.174203160e-02f, -1.907510627e-03f, -5.414749998e-03f, -9.186198754e-05f, +2.618679197e-03f, +4.094705608e-04f, -1.131889554e-03f, -2.665736490e-04f, + +2.562947352e-04f, -1.023673450e-03f, +3.451135083e-04f, +1.960571555e-03f, -7.710079281e-04f, -2.982795618e-03f, +1.179515272e-03f, +3.846750697e-03f, -1.464294980e-03f, -4.315906681e-03f, +1.559296489e-03f, +4.249109906e-03f, -1.459579288e-03f, -3.657402910e-03f, +1.215305720e-03f, +2.702670008e-03f, -9.048280058e-04f, -1.637538942e-03f, +6.020883660e-04f, +2.665736490e-04f, + /* 8,13 (20) */ + +5.282194456e-03f, +2.298308634e-03f, -1.397283770e-02f, -1.040751673e-02f, +2.703820370e-02f, +3.070308779e-02f, -4.550848521e-02f, -8.202378680e-02f, +8.123648675e-02f, +3.590591744e-01f, +4.569008012e-01f, +2.595419681e-01f, -5.319757101e-03f, -8.594694412e-02f, -1.134290202e-02f, +3.900587080e-02f, +1.182482573e-02f, -1.659377402e-02f, -7.775540352e-03f, +5.486086989e-03f, + -5.282194456e-03f, +3.700470433e-03f, +1.358668725e-02f, -7.977345649e-03f, -2.414665003e-02f, +1.190020267e-02f, +3.480456655e-02f, -1.426916905e-02f, -4.277042643e-02f, +1.442430335e-02f, +4.571345052e-02f, -1.250298984e-02f, -4.268410046e-02f, +9.324042687e-03f, +3.451851642e-02f, -5.975860633e-03f, -2.352655866e-02f, +3.334283543e-03f, +1.260076832e-02f, -5.486086989e-03f, + -2.902308282e-04f, +7.182774986e-04f, +9.007850030e-04f, -1.474425077e-03f, -2.350754304e-03f, +2.337652654e-03f, +5.662239035e-03f, -2.673746811e-03f, -1.610609591e-02f, -1.512354579e-02f, +3.294307841e-03f, +1.776709489e-02f, +1.257874121e-02f, -1.245091159e-03f, -5.567743023e-03f, -4.457406325e-04f, +2.635491254e-03f, +5.844882044e-04f, -1.123608017e-03f, -3.415464863e-04f, + +2.902308282e-04f, -1.007774411e-03f, +1.901127300e-04f, +1.972464090e-03f, -5.142539520e-04f, -3.032926427e-03f, +8.269856589e-04f, +3.936970650e-03f, -1.046481376e-03f, -4.438614138e-03f, +1.125084945e-03f, +4.389545543e-03f, -1.063156485e-03f, -3.797981338e-03f, +9.008208921e-04f, +2.827593855e-03f, -6.946336616e-04f, -1.736141823e-03f, +4.928842361e-04f, +3.415464863e-04f, + /* 8,14 (20) */ + +4.991963628e-03f, +3.016586133e-03f, -1.307205270e-02f, -1.188194180e-02f, +2.468744940e-02f, +3.304074044e-02f, -3.984624618e-02f, -8.469753361e-02f, +6.513039084e-02f, +3.439356286e-01f, +4.601951090e-01f, +2.773090630e-01f, +7.258984110e-03f, -8.719203528e-02f, -1.691064504e-02f, +3.856013017e-02f, +1.446031698e-02f, -1.600928581e-02f, -8.899148369e-03f, +5.144540503e-03f, + -4.991963628e-03f, +2.692696022e-03f, +1.377679998e-02f, -6.004881559e-03f, -2.466090398e-02f, +8.867276242e-03f, +3.563155220e-02f, -1.033219840e-02f, -4.381690781e-02f, +9.985689213e-03f, +4.683853547e-02f, -8.113444292e-03f, -4.374725695e-02f, +5.526061349e-03f, +3.541933732e-02f, -3.148266778e-03f, -2.422119232e-02f, +1.598141720e-03f, +1.309365256e-02f, -5.144540503e-03f, + -3.186394550e-04f, +6.454489193e-04f, +9.703331099e-04f, -1.300077533e-03f, -2.459183624e-03f, +1.952901032e-03f, +5.740654674e-03f, -1.821355477e-03f, -1.550627344e-02f, -1.581927685e-02f, +1.983735818e-03f, +1.740925935e-02f, +1.337916564e-02f, -5.376812897e-04f, -5.679469349e-03f, -8.115983865e-04f, +2.628836244e-03f, +7.626689300e-04f, -1.103660859e-03f, -4.177112667e-04f, + +3.186394550e-04f, -9.808922698e-04f, +3.931042588e-05f, +1.963452251e-03f, -2.590992107e-04f, -3.051758490e-03f, +4.720017220e-04f, +3.987518887e-03f, -6.215611338e-04f, -4.517545568e-03f, +6.795955332e-04f, +4.487557259e-03f, -6.527285219e-04f, -3.902616591e-03f, +5.716057562e-04f, +2.926444716e-03f, -4.710015288e-04f, -1.819407190e-03f, +3.730686962e-04f, +4.177112667e-04f, + /* 8,15 (20) */ + +4.673324173e-03f, +3.662035052e-03f, -1.210171959e-02f, -1.318201934e-02f, +2.222826577e-02f, +3.499364147e-02f, -3.410559150e-02f, -8.651888909e-02f, +4.962411740e-02f, +3.281163517e-01f, +4.621788449e-01f, +2.947183224e-01f, +2.063814975e-02f, -8.772971657e-02f, -2.259011439e-02f, +3.774853178e-02f, +1.708915323e-02f, -1.524661688e-02f, -1.000280923e-02f, +4.726829236e-03f, + -4.673324173e-03f, +1.711803752e-03f, +1.381611040e-02f, -4.041429309e-03f, -2.492000319e-02f, +5.815517752e-03f, +3.610355393e-02f, -6.344679512e-03f, -4.443846894e-02f, +5.468143645e-03f, +4.751813100e-02f, -3.625887034e-03f, -4.439998547e-02f, +1.623444758e-03f, +3.599094307e-02f, -2.218220622e-04f, -2.469219385e-02f, -2.212654702e-04f, +1.346672125e-02f, -4.726829236e-03f, + -3.415338794e-04f, +5.704953334e-04f, +1.027264733e-03f, -1.122154771e-03f, -2.541380620e-03f, +1.568176220e-03f, +5.768311362e-03f, -9.992320544e-04f, -1.484839508e-02f, -1.643369606e-02f, +6.624395334e-04f, +1.696433330e-02f, +1.413757257e-02f, +2.115954295e-04f, -5.747165752e-03f, -1.186714087e-03f, +2.597731926e-03f, +9.424427779e-04f, -1.071645627e-03f, -4.942988507e-04f, + +3.415338794e-04f, -9.438317895e-04f, -1.057490789e-04f, +1.934277966e-03f, -8.177305509e-06f, -3.039732580e-03f, +1.182078953e-04f, +3.998338864e-03f, -1.938510128e-04f, -4.552059213e-03f, +2.272916666e-04f, +4.541971466e-03f, -2.323344870e-04f, -3.969785406e-03f, +2.308187490e-04f, +2.997607234e-03f, -2.359866487e-04f, -1.885885873e-03f, +2.436400721e-04f, +4.942988507e-04f, + /* 9, 0 (20) */ + +0.000000000e+00f, +2.635906469e-03f, -1.641132545e-02f, -5.241295346e-03f, +3.933760287e-02f, +7.884481680e-03f, -8.986446179e-02f, -9.856597633e-03f, +3.125987401e-01f, +5.105867071e-01f, +3.125987401e-01f, -9.856597633e-03f, -8.986446179e-02f, +7.884481680e-03f, +3.933760287e-02f, -5.241295346e-03f, -1.641132545e-02f, +2.635906469e-03f, +5.000502348e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.635906469e-03f, +1.297417288e-02f, -1.377345074e-02f, -1.814528753e-02f, +2.876335645e-02f, +1.617791594e-02f, -4.228291414e-02f, -6.498996734e-03f, +4.774542267e-02f, -6.498996734e-03f, -4.228291414e-02f, +1.617791594e-02f, +2.876335645e-02f, -1.814528753e-02f, -1.377345074e-02f, +1.297417288e-02f, +3.219177626e-03f, -5.000502348e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.280055545e-04f, +9.434430947e-04f, -2.361745277e-03f, -1.810893147e-03f, +5.516347003e-03f, +3.758189977e-03f, -1.390523808e-02f, -2.150630476e-02f, -8.897312000e-04f, +2.098575527e-02f, +1.504224609e-02f, -2.999106809e-03f, -5.886519257e-03f, +1.471556360e-03f, +2.549557925e-03f, -8.121231947e-04f, -9.215156544e-04f, +3.733364561e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.280055545e-04f, +4.295677572e-04f, +2.057058918e-03f, -1.856206199e-03f, -2.410304642e-03f, +3.611587590e-03f, +1.750164905e-03f, -4.876204970e-03f, -2.762035904e-04f, +4.976482491e-03f, -1.274298436e-03f, -3.859973064e-03f, +2.120067944e-03f, +2.131677941e-03f, -1.962028272e-03f, -6.222456531e-04f, +1.127315114e-03f, -3.733364561e-04f, +0.000000000e+00f, + /* 9, 1 (20) */ + +0.000000000e+00f, +3.463912023e-03f, -1.546788235e-02f, -7.603040623e-03f, +3.752670972e-02f, +1.340082868e-02f, -8.610627181e-02f, -2.376183572e-02f, +2.910924353e-01f, +5.096969759e-01f, +3.335844954e-01f, +5.185648460e-03f, -9.286356860e-02f, +1.997962422e-03f, +4.080915923e-02f, -2.691737420e-03f, -1.722344864e-02f, +1.714390814e-03f, +5.373838804e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.463912023e-03f, +1.340374064e-02f, -1.171639183e-02f, -2.000149373e-02f, +2.635305181e-02f, +1.978950353e-02f, -4.053274923e-02f, -1.137520170e-02f, +4.746921908e-02f, -1.522514243e-03f, -4.355721257e-02f, +1.231794287e-02f, +3.088342440e-02f, -1.601360959e-02f, -1.573547902e-02f, +1.235192723e-02f, +4.346492740e-03f, -5.373838804e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.305921628e-04f, +1.056738260e-03f, -2.157834716e-03f, -2.114846329e-03f, +5.107863593e-03f, +4.440297880e-03f, -1.272643712e-02f, -2.189681661e-02f, -2.663331352e-03f, +2.033682242e-02f, +1.612783457e-02f, -2.166163411e-03f, -6.212656396e-03f, +1.098857458e-03f, +2.718282835e-03f, -6.633747179e-04f, -1.009643536e-03f, +3.354433505e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.305921628e-04f, +2.395794696e-04f, +2.122816887e-03f, -1.565493906e-03f, -2.665309927e-03f, +3.323834225e-03f, +2.200402671e-03f, -4.718546511e-03f, -8.252435984e-04f, +5.017877922e-03f, -7.784232553e-04f, -4.065308942e-03f, +1.797565315e-03f, +2.387924851e-03f, -1.838033290e-03f, -8.149825415e-04f, +1.136438274e-03f, -3.354433505e-04f, +0.000000000e+00f, + /* 9, 2 (20) */ + +0.000000000e+00f, +4.194504186e-03f, -1.441114409e-02f, -9.760875338e-03f, +3.541186339e-02f, +1.850869228e-02f, -8.166597393e-02f, -3.648827284e-02f, +2.691956187e-01f, +5.070336445e-01f, +3.539213178e-01f, +2.131348303e-02f, -9.502973201e-02f, -4.214693973e-03f, +4.190801668e-02f, +2.654541458e-05f, -1.788682336e-02f, +7.047472786e-04f, +5.709282155e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.194504186e-03f, +1.364332011e-02f, -9.593574938e-03f, -2.156698764e-02f, +2.368774188e-02f, +2.311333775e-02f, -3.833234656e-02f, -1.609374821e-02f, +4.664397548e-02f, +3.495363680e-03f, -4.433563583e-02f, +8.252633930e-03f, +3.268098971e-02f, -1.362568474e-02f, -1.757351231e-02f, +1.153694468e-02f, +5.482931014e-03f, -5.709282155e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.307237808e-04f, +1.151653619e-03f, -1.940857592e-03f, -2.381853223e-03f, +4.666922131e-03f, +5.043072497e-03f, -1.151558473e-02f, -2.215664043e-02f, -4.419392787e-03f, +1.956215993e-02f, +1.715257729e-02f, -1.263223839e-03f, -6.489224694e-03f, +6.952737737e-04f, +2.865008256e-03f, -4.980390126e-04f, -1.090897733e-03f, +2.894969124e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.307237808e-04f, +5.477977168e-05f, +2.159396002e-03f, -1.263627068e-03f, -2.882624820e-03f, +3.000839505e-03f, +2.619764897e-03f, -4.505717359e-03f, -1.364225086e-03f, +4.999621530e-03f, -2.684631592e-04f, -4.224412441e-03f, +1.446238415e-03f, +2.621121064e-03f, -1.685791457e-03f, -1.005050600e-03f, +1.129034862e-03f, -2.894969124e-04f, +0.000000000e+00f, + /* 9, 3 (20) */ + +0.000000000e+00f, +4.825227967e-03f, -1.325949048e-02f, -1.170173293e-02f, +3.303001017e-02f, +2.317561441e-02f, -7.662290143e-02f, -4.800385756e-02f, +2.470389783e-01f, +5.026142517e-01f, +3.734834777e-01f, +3.846606032e-02f, -9.629295585e-02f, -1.070391867e-02f, +4.260329046e-02f, +2.891553671e-03f, -1.838486237e-02f, -3.861504544e-04f, +5.998779067e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.825227967e-03f, +1.369809988e-02f, -7.434178936e-03f, -2.283061470e-02f, +2.080511706e-02f, +2.611417726e-02f, -3.571258166e-02f, -2.059946557e-02f, +4.527975039e-02f, +8.494985209e-03f, -4.460409899e-02f, +4.028221489e-03f, +3.412722813e-02f, -1.100456367e-02f, -1.925930376e-02f, +1.053189408e-02f, +6.611965876e-03f, -5.998779067e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.298011884e-04f, +1.228068381e-03f, -1.713851191e-03f, -2.610808021e-03f, +4.199444278e-03f, +5.564913537e-03f, -1.028245231e-02f, -2.228612525e-02f, -6.146382679e-03f, +1.866540766e-02f, +1.810733321e-02f, -2.948858647e-04f, -6.710941652e-03f, +2.637304911e-04f, +2.986937624e-03f, -3.172038752e-04f, -1.163793327e-03f, +2.355965789e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.298011884e-04f, -1.224955005e-04f, +2.167279834e-03f, -9.547365390e-04f, -3.060319886e-03f, +2.647115524e-03f, +3.003441779e-03f, -4.240605369e-03f, -1.886585124e-03f, +4.921687844e-03f, +2.494281672e-04f, -4.334647802e-03f, +1.069967792e-03f, +2.827654824e-03f, -1.506430686e-03f, -1.189661705e-03f, +1.104425485e-03f, -2.355965789e-04f, +0.000000000e+00f, + /* 9, 4 (20) */ + +0.000000000e+00f, +5.355029155e-03f, -1.203142209e-02f, -1.341558412e-02f, +3.041920215e-02f, +2.737505868e-02f, -7.105798790e-02f, -5.828630987e-02f, +2.247528530e-01f, +4.964678690e-01f, +3.921488854e-01f, +5.657339353e-02f, -9.658784171e-02f, -1.741486032e-02f, +4.286702095e-02f, +5.878491295e-03f, -1.870206625e-02f, -1.549943782e-03f, +6.234375646e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.355029155e-03f, +1.357560438e-02f, -5.266899102e-03f, -2.378535124e-02f, +1.774479718e-02f, +2.876129278e-02f, -3.270913988e-02f, -2.484007094e-02f, +4.339316527e-02f, +1.341667305e-02f, -4.435467082e-02f, -3.064263128e-04f, +3.519719592e-02f, -8.176908850e-03f, -2.076573445e-02f, +9.342232379e-03f, +7.716391361e-03f, -6.234375646e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.291621016e-04f, +1.286086734e-03f, -1.479824454e-03f, -2.801055134e-03f, +3.711360789e-03f, +6.004972042e-03f, -9.036757168e-03f, -2.228660632e-02f, -7.833006125e-03f, +1.765116942e-02f, +1.898333005e-02f, +7.335416634e-04f, -6.872836245e-03f, -1.924124300e-04f, +3.081426823e-03f, -1.222018290e-04f, -1.226871825e-03f, +1.739631518e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.291621016e-04f, -2.901018646e-04f, +2.147324128e-03f, -6.429417401e-04f, -3.197010802e-03f, +2.267496324e-03f, +3.347118162e-03f, -3.926735838e-03f, -2.385972924e-03f, +4.784798814e-03f, +7.689446821e-04f, -4.393967678e-03f, +6.730290238e-04f, +3.004182371e-03f, -1.301484781e-03f, -1.366006331e-03f, +1.062167007e-03f, -1.739631518e-04f, +0.000000000e+00f, + /* 9, 5 (20) */ + +0.000000000e+00f, +5.784191257e-03f, -1.074533536e-02f, -1.489540857e-02f, +2.761814701e-02f, +3.108641947e-02f, -6.505301586e-02f, -6.732306704e-02f, +2.024662467e-01f, +4.886348629e-01f, +4.098000548e-01f, +7.555672358e-02f, -9.585430005e-02f, -2.428769656e-02f, +4.267460852e-02f, +8.959918118e-03f, -1.882426808e-02f, -2.776815607e-03f, +6.408338798e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.784191257e-03f, +1.328550251e-02f, -3.119574974e-03f, -2.442829298e-02f, +1.454778638e-02f, +3.102878910e-02f, -2.936202172e-02f, -2.876680678e-02f, +4.100719234e-02f, +1.820147187e-02f, -4.358572614e-02f, -4.700393991e-03f, +3.587022494e-02f, -5.172726479e-03f, -2.206721923e-02f, +7.976226047e-03f, +8.778558367e-03f, -6.408338798e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.300671283e-04f, +1.326026225e-03f, -1.241725370e-03f, -2.952378019e-03f, +3.208553736e-03f, +6.363137065e-03f, -7.788080402e-03f, -2.216038322e-02f, -9.468298227e-03f, +1.652498208e-02f, +1.977224565e-02f, +1.816068694e-03f, -6.970307785e-03f, -6.693784373e-04f, +3.146021181e-03f, +8.539466769e-05f, -1.278721601e-03f, +1.049421773e-04f, +0.000000000e+00f, + +0.000000000e+00f, -3.300671283e-04f, -4.461107716e-04f, +2.100734464e-03f, -3.322957519e-04f, -3.291866356e-03f, +1.867070858e-03f, +3.647024165e-03f, -3.568223206e-03f, -2.856330728e-03f, +4.590417198e-03f, +1.283708117e-03f, -4.400947177e-03f, +2.600427944e-04f, +3.147679232e-03f, -1.072882990e-03f, -1.531293906e-03f, +1.002068095e-03f, -1.049421773e-04f, +0.000000000e+00f, + /* 9, 6 (20) */ + +0.000000000e+00f, +6.114258385e-03f, -9.419309136e-03f, -1.613713394e-02f, +2.466576899e-02f, +3.429497321e-02f, -5.868987879e-02f, -7.511114744e-02f, +1.803058635e-01f, +4.791665647e-01f, +4.263250369e-01f, +9.532896923e-02f, -9.403823136e-02f, -3.125800435e-02f, +4.200523008e-02f, +1.210593930e-02f, -1.873887341e-02f, -4.055537208e-03f, +6.513280975e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.114258385e-03f, +1.283939174e-02f, -1.018840510e-03f, -2.476058873e-02f, +1.125592002e-02f, +3.289585996e-02f, -2.571499756e-02f, -3.233502999e-02f, +3.815086161e-02f, +2.279188906e-02f, -4.230201802e-02f, -9.101341168e-03f, +3.613026774e-02f, -2.025047247e-03f, -2.314010222e-02f, +6.444932142e-03f, +9.780626462e-03f, -6.513280975e-03f, +0.000000000e+00f, + +0.000000000e+00f, +2.336873413e-04f, +1.348404080e-03f, -1.002410337e-03f, -3.064983760e-03f, +2.696800965e-03f, +6.640015713e-03f, -6.545787442e-03f, -2.191068978e-02f, -1.104171312e-02f, +1.529327634e-02f, +2.046628643e-02f, +2.946060927e-03f, -6.999182770e-03f, -1.162997631e-03f, +3.178491755e-03f, +3.037811469e-04f, -1.317998666e-03f, +2.900573920e-05f, +0.000000000e+00f, + +0.000000000e+00f, -2.336873413e-04f, -5.888302927e-04f, +2.029039572e-03f, -2.673251534e-05f, -3.344608893e-03f, +1.451113486e-03f, +3.899978195e-03f, -3.169715323e-03f, -3.291970818e-03f, +4.340730249e-03f, +1.787349647e-03f, -4.354810013e-03f, -1.640804861e-04f, +3.255488151e-03f, -8.229336740e-04f, -1.682794066e-03f, +9.242013737e-04f, -2.900573920e-05f, +0.000000000e+00f, + /* 9, 7 (20) */ + +0.000000000e+00f, +6.347945727e-03f, -8.070905056e-03f, -1.713954428e-02f, +2.160078523e-02f, +3.699177417e-02f, -5.204986308e-02f, -8.165693488e-02f, +1.583951737e-01f, +4.681248516e-01f, +4.416183132e-01f, +1.157952557e-01f, -9.109217043e-02f, -3.825718712e-02f, +4.084223245e-02f, +1.528443105e-02f, -1.843509226e-02f, -5.373535873e-03f, +6.542286714e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.347945727e-03f, +1.225056145e-02f, +1.010199063e-03f, -2.478732125e-02f, +7.911311127e-03f, +3.434697345e-02f, -2.181501936e-02f, -3.550474531e-02f, +3.485889080e-02f, +2.713261931e-02f, -4.051466837e-02f, -1.345615118e-02f, +3.596618725e-02f, +1.230440904e-03f, -2.396303589e-02f, +4.762138076e-03f, +1.070482784e-02f, -6.542286714e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.410935625e-04f, +1.353921685e-03f, -7.646157698e-04f, -3.139483704e-03f, +2.181723304e-03f, +6.836906882e-03f, -5.318951928e-03f, -2.154165595e-02f, -1.254320912e-02f, +1.396332925e-02f, +2.105826211e-02f, +4.116283618e-03f, -6.955769077e-03f, -1.668734972e-03f, +3.176870476e-03f, +5.309322132e-04f, -1.343447498e-03f, -5.324742539e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.410935625e-04f, -7.168217129e-04f, +1.934060794e-03f, +2.699831670e-04f, -3.355507321e-03f, +1.025012954e-03f, +4.103421853e-03f, -2.736331043e-03f, -3.687647608e-03f, +4.038623874e-03f, +2.273592021e-03f, -4.255446328e-03f, -5.942008484e-04f, +3.325362902e-03f, -5.543021881e-04f, -1.817878219e-03f, +8.289118991e-04f, +5.324742539e-05f, +0.000000000e+00f, + /* 9, 8 (20) */ + +0.000000000e+00f, +6.489039289e-03f, -6.716983371e-03f, -1.790416005e-02f, +1.846130153e-02f, +3.917349748e-02f, -4.521295620e-02f, -8.697588681e-02f, +1.368535178e-01f, +4.555816424e-01f, +4.555816424e-01f, +1.368535178e-01f, -8.697588681e-02f, -4.521295620e-02f, +3.917349748e-02f, +1.846130153e-02f, -1.790416005e-02f, -6.716983371e-03f, +6.489039289e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.489039289e-03f, +1.153373973e-02f, +2.944259857e-03f, -2.451733808e-02f, +4.555803806e-03f, +3.537198640e-02f, -1.771159751e-02f, -3.824107635e-02f, +3.117124319e-02f, +3.117124319e-02f, -3.824107635e-02f, -1.771159751e-02f, +3.537198640e-02f, +4.555803806e-03f, -2.451733808e-02f, +2.944259857e-03f, +1.153373973e-02f, -6.489039289e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.324742539e-05f, +1.343447498e-03f, -5.309322132e-04f, -3.176870476e-03f, +1.668734972e-03f, +6.955769077e-03f, -4.116283618e-03f, -2.105826211e-02f, -1.396332925e-02f, +1.254320912e-02f, +2.154165595e-02f, +5.318951928e-03f, -6.836906882e-03f, -2.181723304e-03f, +3.139483704e-03f, +7.646157698e-04f, -1.353921685e-03f, -1.410935625e-04f, +0.000000000e+00f, + +0.000000000e+00f, -5.324742539e-05f, -8.289118991e-04f, +1.817878219e-03f, +5.543021881e-04f, -3.325362902e-03f, +5.942008484e-04f, +4.255446328e-03f, -2.273592021e-03f, -4.038623874e-03f, +3.687647608e-03f, +2.736331043e-03f, -4.103421853e-03f, -1.025012954e-03f, +3.355507321e-03f, -2.699831670e-04f, -1.934060794e-03f, +7.168217129e-04f, +1.410935625e-04f, +0.000000000e+00f, + /* 9, 9 (20) */ + +0.000000000e+00f, +6.542286714e-03f, -5.373535873e-03f, -1.843509226e-02f, +1.528443105e-02f, +4.084223245e-02f, -3.825718712e-02f, -9.109217043e-02f, +1.157952557e-01f, +4.416183132e-01f, +4.681248516e-01f, +1.583951737e-01f, -8.165693488e-02f, -5.204986308e-02f, +3.699177417e-02f, +2.160078523e-02f, -1.713954428e-02f, -8.070905056e-03f, +6.347945727e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.542286714e-03f, +1.070482784e-02f, +4.762138076e-03f, -2.396303589e-02f, +1.230440904e-03f, +3.596618725e-02f, -1.345615118e-02f, -4.051466837e-02f, +2.713261931e-02f, +3.485889080e-02f, -3.550474531e-02f, -2.181501936e-02f, +3.434697345e-02f, +7.911311127e-03f, -2.478732125e-02f, +1.010199063e-03f, +1.225056145e-02f, -6.347945727e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.900573920e-05f, +1.317998666e-03f, -3.037811469e-04f, -3.178491755e-03f, +1.162997631e-03f, +6.999182770e-03f, -2.946060927e-03f, -2.046628643e-02f, -1.529327634e-02f, +1.104171312e-02f, +2.191068978e-02f, +6.545787442e-03f, -6.640015713e-03f, -2.696800965e-03f, +3.064983760e-03f, +1.002410337e-03f, -1.348404080e-03f, -2.336873413e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.900573920e-05f, -9.242013737e-04f, +1.682794066e-03f, +8.229336740e-04f, -3.255488151e-03f, +1.640804861e-04f, +4.354810013e-03f, -1.787349647e-03f, -4.340730249e-03f, +3.291970818e-03f, +3.169715323e-03f, -3.899978195e-03f, -1.451113486e-03f, +3.344608893e-03f, +2.673251534e-05f, -2.029039572e-03f, +5.888302927e-04f, +2.336873413e-04f, +0.000000000e+00f, + /* 9,10 (20) */ + +0.000000000e+00f, +6.513280975e-03f, -4.055537208e-03f, -1.873887341e-02f, +1.210593930e-02f, +4.200523008e-02f, -3.125800435e-02f, -9.403823136e-02f, +9.532896923e-02f, +4.263250369e-01f, +4.791665647e-01f, +1.803058635e-01f, -7.511114744e-02f, -5.868987879e-02f, +3.429497321e-02f, +2.466576899e-02f, -1.613713394e-02f, -9.419309136e-03f, +6.114258385e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.513280975e-03f, +9.780626462e-03f, +6.444932142e-03f, -2.314010222e-02f, -2.025047247e-03f, +3.613026774e-02f, -9.101341168e-03f, -4.230201802e-02f, +2.279188906e-02f, +3.815086161e-02f, -3.233502999e-02f, -2.571499756e-02f, +3.289585996e-02f, +1.125592002e-02f, -2.476058873e-02f, -1.018840510e-03f, +1.283939174e-02f, -6.114258385e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.049421773e-04f, +1.278721601e-03f, -8.539466769e-05f, -3.146021181e-03f, +6.693784373e-04f, +6.970307785e-03f, -1.816068694e-03f, -1.977224565e-02f, -1.652498208e-02f, +9.468298227e-03f, +2.216038322e-02f, +7.788080402e-03f, -6.363137065e-03f, -3.208553736e-03f, +2.952378019e-03f, +1.241725370e-03f, -1.326026225e-03f, -3.300671283e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.049421773e-04f, -1.002068095e-03f, +1.531293906e-03f, +1.072882990e-03f, -3.147679232e-03f, -2.600427944e-04f, +4.400947177e-03f, -1.283708117e-03f, -4.590417198e-03f, +2.856330728e-03f, +3.568223206e-03f, -3.647024165e-03f, -1.867070858e-03f, +3.291866356e-03f, +3.322957519e-04f, -2.100734464e-03f, +4.461107716e-04f, +3.300671283e-04f, +0.000000000e+00f, + /* 9,11 (20) */ + +0.000000000e+00f, +6.408338798e-03f, -2.776815607e-03f, -1.882426808e-02f, +8.959918118e-03f, +4.267460852e-02f, -2.428769656e-02f, -9.585430005e-02f, +7.555672358e-02f, +4.098000548e-01f, +4.886348629e-01f, +2.024662467e-01f, -6.732306704e-02f, -6.505301586e-02f, +3.108641947e-02f, +2.761814701e-02f, -1.489540857e-02f, -1.074533536e-02f, +5.784191257e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.408338798e-03f, +8.778558367e-03f, +7.976226047e-03f, -2.206721923e-02f, -5.172726479e-03f, +3.587022494e-02f, -4.700393991e-03f, -4.358572614e-02f, +1.820147187e-02f, +4.100719234e-02f, -2.876680678e-02f, -2.936202172e-02f, +3.102878910e-02f, +1.454778638e-02f, -2.442829298e-02f, -3.119574974e-03f, +1.328550251e-02f, -5.784191257e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.739631518e-04f, +1.226871825e-03f, +1.222018290e-04f, -3.081426823e-03f, +1.924124300e-04f, +6.872836245e-03f, -7.335416634e-04f, -1.898333005e-02f, -1.765116942e-02f, +7.833006125e-03f, +2.228660632e-02f, +9.036757168e-03f, -6.004972042e-03f, -3.711360789e-03f, +2.801055134e-03f, +1.479824454e-03f, -1.286086734e-03f, -4.291621016e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.739631518e-04f, -1.062167007e-03f, +1.366006331e-03f, +1.301484781e-03f, -3.004182371e-03f, -6.730290238e-04f, +4.393967678e-03f, -7.689446821e-04f, -4.784798814e-03f, +2.385972924e-03f, +3.926735838e-03f, -3.347118162e-03f, -2.267496324e-03f, +3.197010802e-03f, +6.429417401e-04f, -2.147324128e-03f, +2.901018646e-04f, +4.291621016e-04f, +0.000000000e+00f, + /* 9,12 (20) */ + +0.000000000e+00f, +6.234375646e-03f, -1.549943782e-03f, -1.870206625e-02f, +5.878491295e-03f, +4.286702095e-02f, -1.741486032e-02f, -9.658784171e-02f, +5.657339353e-02f, +3.921488854e-01f, +4.964678690e-01f, +2.247528530e-01f, -5.828630987e-02f, -7.105798790e-02f, +2.737505868e-02f, +3.041920215e-02f, -1.341558412e-02f, -1.203142209e-02f, +5.355029155e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.234375646e-03f, +7.716391361e-03f, +9.342232379e-03f, -2.076573445e-02f, -8.176908850e-03f, +3.519719592e-02f, -3.064263128e-04f, -4.435467082e-02f, +1.341667305e-02f, +4.339316527e-02f, -2.484007094e-02f, -3.270913988e-02f, +2.876129278e-02f, +1.774479718e-02f, -2.378535124e-02f, -5.266899102e-03f, +1.357560438e-02f, -5.355029155e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.355965789e-04f, +1.163793327e-03f, +3.172038752e-04f, -2.986937624e-03f, -2.637304911e-04f, +6.710941652e-03f, +2.948858647e-04f, -1.810733321e-02f, -1.866540766e-02f, +6.146382679e-03f, +2.228612525e-02f, +1.028245231e-02f, -5.564913537e-03f, -4.199444278e-03f, +2.610808021e-03f, +1.713851191e-03f, -1.228068381e-03f, -5.298011884e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.355965789e-04f, -1.104425485e-03f, +1.189661705e-03f, +1.506430686e-03f, -2.827654824e-03f, -1.069967792e-03f, +4.334647802e-03f, -2.494281672e-04f, -4.921687844e-03f, +1.886585124e-03f, +4.240605369e-03f, -3.003441779e-03f, -2.647115524e-03f, +3.060319886e-03f, +9.547365390e-04f, -2.167279834e-03f, +1.224955005e-04f, +5.298011884e-04f, +0.000000000e+00f, + /* 9,13 (20) */ + +0.000000000e+00f, +5.998779067e-03f, -3.861504544e-04f, -1.838486237e-02f, +2.891553671e-03f, +4.260329046e-02f, -1.070391867e-02f, -9.629295585e-02f, +3.846606032e-02f, +3.734834777e-01f, +5.026142517e-01f, +2.470389783e-01f, -4.800385756e-02f, -7.662290143e-02f, +2.317561441e-02f, +3.303001017e-02f, -1.170173293e-02f, -1.325949048e-02f, +4.825227967e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.998779067e-03f, +6.611965876e-03f, +1.053189408e-02f, -1.925930376e-02f, -1.100456367e-02f, +3.412722813e-02f, +4.028221489e-03f, -4.460409899e-02f, +8.494985209e-03f, +4.527975039e-02f, -2.059946557e-02f, -3.571258166e-02f, +2.611417726e-02f, +2.080511706e-02f, -2.283061470e-02f, -7.434178936e-03f, +1.369809988e-02f, -4.825227967e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.894969124e-04f, +1.090897733e-03f, +4.980390126e-04f, -2.865008256e-03f, -6.952737737e-04f, +6.489224694e-03f, +1.263223839e-03f, -1.715257729e-02f, -1.956215993e-02f, +4.419392787e-03f, +2.215664043e-02f, +1.151558473e-02f, -5.043072497e-03f, -4.666922131e-03f, +2.381853223e-03f, +1.940857592e-03f, -1.151653619e-03f, -6.307237808e-04f, +0.000000000e+00f, + +0.000000000e+00f, +2.894969124e-04f, -1.129034862e-03f, +1.005050600e-03f, +1.685791457e-03f, -2.621121064e-03f, -1.446238415e-03f, +4.224412441e-03f, +2.684631592e-04f, -4.999621530e-03f, +1.364225086e-03f, +4.505717359e-03f, -2.619764897e-03f, -3.000839505e-03f, +2.882624820e-03f, +1.263627068e-03f, -2.159396002e-03f, -5.477977168e-05f, +6.307237808e-04f, +0.000000000e+00f, + /* 9,14 (20) */ + +0.000000000e+00f, +5.709282155e-03f, +7.047472786e-04f, -1.788682336e-02f, +2.654541458e-05f, +4.190801668e-02f, -4.214693973e-03f, -9.502973201e-02f, +2.131348303e-02f, +3.539213178e-01f, +5.070336445e-01f, +2.691956187e-01f, -3.648827284e-02f, -8.166597393e-02f, +1.850869228e-02f, +3.541186339e-02f, -9.760875338e-03f, -1.441114409e-02f, +4.194504186e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.709282155e-03f, +5.482931014e-03f, +1.153694468e-02f, -1.757351231e-02f, -1.362568474e-02f, +3.268098971e-02f, +8.252633930e-03f, -4.433563583e-02f, +3.495363680e-03f, +4.664397548e-02f, -1.609374821e-02f, -3.833234656e-02f, +2.311333775e-02f, +2.368774188e-02f, -2.156698764e-02f, -9.593574938e-03f, +1.364332011e-02f, -4.194504186e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.354433505e-04f, +1.009643536e-03f, +6.633747179e-04f, -2.718282835e-03f, -1.098857458e-03f, +6.212656396e-03f, +2.166163411e-03f, -1.612783457e-02f, -2.033682242e-02f, +2.663331352e-03f, +2.189681661e-02f, +1.272643712e-02f, -4.440297880e-03f, -5.107863593e-03f, +2.114846329e-03f, +2.157834716e-03f, -1.056738260e-03f, -7.305921628e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.354433505e-04f, -1.136438274e-03f, +8.149825415e-04f, +1.838033290e-03f, -2.387924851e-03f, -1.797565315e-03f, +4.065308942e-03f, +7.784232553e-04f, -5.017877922e-03f, +8.252435984e-04f, +4.718546511e-03f, -2.200402671e-03f, -3.323834225e-03f, +2.665309927e-03f, +1.565493906e-03f, -2.122816887e-03f, -2.395794696e-04f, +7.305921628e-04f, +0.000000000e+00f, + /* 9,15 (20) */ + +0.000000000e+00f, +5.373838804e-03f, +1.714390814e-03f, -1.722344864e-02f, -2.691737420e-03f, +4.080915923e-02f, +1.997962422e-03f, -9.286356860e-02f, +5.185648460e-03f, +3.335844954e-01f, +5.096969759e-01f, +2.910924353e-01f, -2.376183572e-02f, -8.610627181e-02f, +1.340082868e-02f, +3.752670972e-02f, -7.603040623e-03f, -1.546788235e-02f, +3.463912023e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.373838804e-03f, +4.346492740e-03f, +1.235192723e-02f, -1.573547902e-02f, -1.601360959e-02f, +3.088342440e-02f, +1.231794287e-02f, -4.355721257e-02f, -1.522514243e-03f, +4.746921908e-02f, -1.137520170e-02f, -4.053274923e-02f, +1.978950353e-02f, +2.635305181e-02f, -2.000149373e-02f, -1.171639183e-02f, +1.340374064e-02f, -3.463912023e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.733364561e-04f, +9.215156544e-04f, +8.121231947e-04f, -2.549557925e-03f, -1.471556360e-03f, +5.886519257e-03f, +2.999106809e-03f, -1.504224609e-02f, -2.098575527e-02f, +8.897312000e-04f, +2.150630476e-02f, +1.390523808e-02f, -3.758189977e-03f, -5.516347003e-03f, +1.810893147e-03f, +2.361745277e-03f, -9.434430947e-04f, -8.280055545e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.733364561e-04f, -1.127315114e-03f, +6.222456531e-04f, +1.962028272e-03f, -2.131677941e-03f, -2.120067944e-03f, +3.859973064e-03f, +1.274298436e-03f, -4.976482491e-03f, +2.762035904e-04f, +4.876204970e-03f, -1.750164905e-03f, -3.611587590e-03f, +2.410304642e-03f, +1.856206199e-03f, -2.057058918e-03f, -4.295677572e-04f, +8.280055545e-04f, +0.000000000e+00f, + /* 10, 0 (16) */ + -3.437152571e-03f, -1.901474609e-02f, +2.119231534e-02f, +3.664783813e-02f, -7.368654585e-02f, -5.213951177e-02f, +3.060997433e-01f, +5.583321297e-01f, +3.060997433e-01f, -5.213951177e-02f, -7.368654585e-02f, +3.664783813e-02f, +2.119231534e-02f, -1.901474609e-02f, -3.437152571e-03f, +5.855084095e-03f, + +3.437152571e-03f, +5.279848880e-03f, -2.388172578e-02f, +1.041424938e-02f, +2.992755760e-02f, -3.533425551e-02f, -1.391753772e-02f, +4.774542267e-02f, -1.391753772e-02f, -3.533425551e-02f, +2.992755760e-02f, +1.041424938e-02f, -2.388172578e-02f, +5.279848880e-03f, +8.082097966e-03f, -5.855084095e-03f, + +1.373010852e-03f, -3.046863589e-04f, -3.667099347e-03f, +3.106042361e-03f, +7.369777567e-03f, -1.215507318e-02f, -2.638250973e-02f, -1.165934790e-03f, +2.596223776e-02f, +1.376794766e-02f, -6.859079874e-03f, -3.766451313e-03f, +3.603234301e-03f, +5.875296536e-04f, -1.434368848e-03f, +2.057994592e-04f, + -1.373010852e-03f, +1.697714826e-03f, +5.634281965e-04f, -3.618378046e-03f, +2.156512678e-03f, +3.337640081e-03f, -5.034212769e-03f, -3.319322640e-04f, +5.260798186e-03f, -2.883316118e-03f, -2.627443187e-03f, +3.569445935e-03f, -2.257579891e-04f, -1.867299721e-03f, +1.071180540e-03f, -2.057994592e-04f, + /* 10, 1 (16) */ + -2.064141719e-03f, -1.931943245e-02f, +1.752521599e-02f, +3.975388049e-02f, -6.631676829e-02f, -6.429458495e-02f, +2.797172336e-01f, +5.571661949e-01f, +3.320619811e-01f, -3.837156411e-02f, -8.054562573e-02f, +3.288138682e-02f, +2.479554964e-02f, -1.842721644e-02f, -4.871521418e-03f, +6.060883554e-03f, + +2.064141719e-03f, +6.977563706e-03f, -2.331829758e-02f, +6.795871333e-03f, +3.208407028e-02f, -3.199661543e-02f, -1.895175049e-02f, +4.741349040e-02f, -8.656739535e-03f, -3.821757163e-02f, +2.730011442e-02f, +1.398369531e-02f, -2.410748377e-02f, +3.412549158e-03f, +9.153278505e-03f, -6.060883554e-03f, + +1.296317730e-03f, -3.501782856e-05f, -3.680340235e-03f, +2.442553666e-03f, +7.764132105e-03f, -1.052603445e-02f, -2.661536312e-02f, -3.488574950e-03f, +2.535470034e-02f, +1.534941132e-02f, -6.231472352e-03f, -4.415091081e-03f, +3.486782309e-03f, +8.802495447e-04f, -1.478357259e-03f, +1.267947382e-04f, + -1.296317730e-03f, +1.508861724e-03f, +8.808218865e-04f, -3.612910995e-03f, +1.663514904e-03f, +3.738401880e-03f, -4.737159306e-03f, -9.909240542e-04f, +5.413154414e-03f, -2.381556094e-03f, -3.068766793e-03f, +3.465483919e-03f, +1.274364829e-04f, -2.013929017e-03f, +9.828081602e-04f, -1.267947382e-04f, + /* 10, 2 (16) */ + -7.678239886e-04f, -1.935445028e-02f, +1.384487575e-02f, +4.219643416e-02f, -5.855263618e-02f, -7.482061940e-02f, +2.531018705e-01f, +5.536776200e-01f, +3.574166815e-01f, -2.302215280e-02f, -8.677709808e-02f, +2.846629574e-02f, +2.828233195e-02f, -1.754696689e-02f, -6.349878678e-03f, +6.187678292e-03f, + +7.678239886e-04f, +8.486425430e-03f, -2.243747570e-02f, +3.182960338e-03f, +3.374758519e-02f, -2.825821355e-02f, -2.368890980e-02f, +4.642256635e-02f, -3.243585121e-03f, -4.059912772e-02f, +2.423134762e-02f, +1.744917923e-02f, -2.398004729e-02f, +1.398620141e-03f, +1.013608667e-02f, -6.187678292e-03f, + +1.206433390e-03f, +2.185384103e-04f, -3.645480290e-03f, +1.784297311e-03f, +8.043912002e-03f, -8.895819829e-03f, -2.666235779e-02f, -5.783617872e-03f, +2.456178146e-02f, +1.688411413e-02f, -5.487636280e-03f, -5.042986279e-03f, +3.316394838e-03f, +1.179216799e-03f, -1.503089613e-03f, +3.813712907e-05f, + -1.206433390e-03f, +1.304614536e-03f, +1.173654098e-03f, -3.554506506e-03f, +1.156195444e-03f, +4.080355138e-03f, -4.374437030e-03f, -1.635372650e-03f, +5.488622149e-03f, -1.839279577e-03f, -3.473272968e-03f, +3.306721004e-03f, +4.910023555e-04f, -2.134173336e-03f, +8.717103820e-04f, -3.813712907e-05f, + /* 10, 3 (16) */ + +4.386094018e-04f, -1.913591187e-02f, +1.019939546e-02f, +4.398073147e-02f, -5.050872418e-02f, -8.371643923e-02f, +2.264395127e-01f, +5.478940021e-01f, +3.819784629e-01f, -6.138038667e-03f, -9.226473436e-02f, +2.342330946e-02f, +3.159872678e-02f, -1.636775009e-02f, -7.852968290e-03f, +6.225815421e-03f, + -4.386094018e-04f, +9.791039966e-03f, -2.126382160e-02f, -3.715461683e-04f, +3.490378063e-02f, -2.417785841e-02f, -2.806334683e-02f, +4.478719370e-02f, +2.245037028e-03f, -4.243840730e-02f, +2.075807466e-02f, +2.075590024e-02f, -2.348904493e-02f, -7.355531952e-04f, +1.100779705e-02f, -6.225815421e-03f, + +1.105572881e-03f, +4.534286433e-04f, -3.565544560e-03f, +1.139124392e-03f, +8.212029062e-03f, -7.279010530e-03f, -2.652673062e-02f, -8.032967803e-03f, +2.358709551e-02f, +1.835676138e-02f, -4.629533667e-03f, -5.640973860e-03f, +3.091385316e-03f, +1.480506938e-03f, -1.506865581e-03f, -5.936784234e-05f, + -1.105572881e-03f, +1.088961759e-03f, +1.438164344e-03f, -3.445415590e-03f, +6.423812380e-04f, +4.359204693e-03f, -3.951803513e-03f, -2.255831451e-03f, +5.485690578e-03f, -1.264099799e-03f, -3.834200007e-03f, +3.094261053e-03f, +8.594614010e-04f, -2.224930206e-03f, +7.387782004e-04f, +5.936784234e-05f, + /* 10, 4 (16) */ + +1.544182282e-03f, -1.868248322e-02f, +6.633850905e-03f, +4.511985586e-02f, -4.229669512e-02f, -9.099544976e-02f, +1.999127821e-01f, +5.398610343e-01f, +4.055655584e-01f, +1.221872271e-02f, -9.689426803e-02f, +1.778233560e-02f, +3.469011210e-02f, -1.488724315e-02f, -9.359833871e-03f, +6.166447579e-03f, + -1.544182282e-03f, +1.088000173e-02f, -1.982565726e-02f, -3.816961758e-03f, +3.554616187e-02f, -1.981865372e-02f, -3.201515034e-02f, +4.253136225e-02f, +7.730727605e-03f, -4.370250710e-02f, +1.692387465e-02f, +2.385016129e-02f, -2.262958353e-02f, -2.960483401e-03f, +1.174657525e-02f, -6.166447579e-03f, + +9.959848689e-04f, +6.674996743e-04f, -3.443996874e-03f, +5.143499871e-04f, +8.272468366e-03f, -5.689639005e-03f, -2.621334215e-02f, -1.021897905e-02f, +2.243596823e-02f, +1.975227473e-02f, -3.660426015e-03f, -6.199807221e-03f, +2.811769941e-03f, +1.779942042e-03f, -1.488208160e-03f, -1.647048182e-04f, + -9.959848689e-04f, +8.659341333e-04f, +1.671163550e-03f, -3.288624868e-03f, +1.298566562e-04f, +4.571662285e-03f, -3.475880282e-03f, -2.843222957e-03f, +5.404026108e-03f, -6.642118430e-04f, -4.145349247e-03f, +2.830083735e-03f, +1.227092741e-03f, -2.283489269e-03f, +5.853424824e-04f, +1.647048182e-04f, + /* 10, 5 (16) */ + +2.540167151e-03f, -1.801498355e-02f, +3.189854030e-03f, +4.563420585e-02f, -3.402422675e-02f, -9.668508876e-02f, +1.736994399e-01f, +5.296420553e-01f, +4.280015266e-01f, +3.197099744e-02f, -1.005546940e-01f, +1.158252838e-02f, +3.750188204e-02f, -1.310730111e-02f, -1.084804203e-02f, +6.001742761e-03f, + -2.540167151e-03f, +1.174593586e-02f, -1.815449371e-02f, -7.105586627e-03f, +3.567601852e-02f, -1.524699144e-02f, -3.549103062e-02f, +3.968813929e-02f, +1.313475371e-02f, -4.436671894e-02f, +1.277852540e-02f, +2.668024503e-02f, -2.140249079e-02f, -5.243972670e-03f, +1.233191773e-02f, -6.001742761e-03f, + +8.799154532e-04f, +8.590090941e-04f, -3.284673771e-03f, -8.331262053e-05f, +8.230207923e-03f, -4.141056237e-03f, -2.572860642e-02f, -1.232462896e-02f, +2.111539928e-02f, +2.105595376e-02f, -2.584878483e-03f, -6.710264990e-03f, +2.478300795e-03f, +2.073138191e-03f, -1.445899238e-03f, -2.766535061e-04f, + -8.799154532e-04f, +6.395339990e-04f, +1.870070197e-03f, -3.087792026e-03f, -3.737577831e-04f, +4.715485707e-03f, -2.954045395e-03f, -3.388978098e-03f, +5.244482628e-03f, -4.827050689e-05f, -4.401191852e-03f, +2.517031008e-03f, +1.588021768e-03f, -2.307592522e-03f, +4.131663641e-04f, +2.766535061e-04f, + /* 10, 6 (16) */ + +3.420082604e-03f, -1.715597445e-02f, -9.481974021e-05f, +4.555089323e-02f, -2.579401883e-02f, -1.008261450e-01f, +1.479708335e-01f, +5.173174263e-01f, +4.491169259e-01f, +5.302695120e-02f, -1.031395725e-01f, +4.872263389e-03f, +3.998018284e-02f, -1.103416292e-02f, -1.229394127e-02f, +5.725089255e-03f, + -3.420082604e-03f, +1.238546986e-02f, -1.628442351e-02f, -1.019337865e-02f, +3.530226074e-02f, -1.053150573e-02f, -3.844507602e-02f, +3.629916119e-02f, +1.837923634e-02f, -4.441498945e-02f, +8.377333551e-03f, +2.919727603e-02f, -1.981446902e-02f, -7.551565192e-03f, +1.274508409e-02f, -5.725089255e-03f, + +7.595737874e-04f, +1.026629236e-03f, -3.091716275e-03f, -6.478079279e-04f, +8.091129199e-03f, -2.645809247e-03f, -2.508040511e-02f, -1.433368394e-02f, +1.963400658e-02f, +2.225363607e-02f, -1.408749087e-03f, -7.163263256e-03f, +2.092490520e-03f, +2.355558081e-03f, -1.379012919e-03f, -3.937972918e-04f, + -7.595737874e-04f, +4.136673415e-04f, +2.032935304e-03f, -2.847171698e-03f, -8.611220933e-04f, +4.789500958e-03f, -2.394314759e-03f, -3.885167418e-03f, +5.009093069e-03f, +5.747402513e-04f, -4.596966294e-03f, +2.158779134e-03f, +1.936313892e-03f, -2.295488393e-03f, +2.244293821e-04f, +3.937972918e-04f, + /* 10, 7 (16) */ + +4.179656392e-03f, -1.612934522e-02f, -3.186536016e-03f, +4.490308530e-02f, -1.770288963e-02f, -1.034719542e-01f, +1.228904284e-01f, +5.029837424e-01f, +4.687509325e-01f, +7.528058728e-02f, -1.045483216e-01f, -2.290999867e-03f, +4.207267336e-02f, -8.678604841e-03f, -1.367295419e-02f, +5.331291963e-03f, + -4.179656392e-03f, +1.279913720e-02f, -1.425148820e-02f, -1.304055035e-02f, +3.444113865e-02f, -5.742004771e-03f, -4.083939078e-02f, +3.241399377e-02f, +2.338832941e-02f, -4.384024920e-02f, +3.780367257e-03f, +3.135605517e-02f, -1.787815513e-02f, -9.847053586e-03f, +1.296951348e-02f, -5.331291963e-03f, + +6.370999718e-04f, +1.169445024e-03f, -2.869500537e-03f, -1.173784016e-03f, +7.861919836e-03f, -1.215530076e-03f, -2.427798699e-02f, -1.623085673e-02f, +1.800195312e-02f, +2.333185413e-02f, -1.391627105e-04f, -7.549969926e-03f, +1.656627930e-03f, +2.622568288e-03f, -1.286946006e-03f, -5.145355992e-04f, + -6.370999718e-04f, +1.920796517e-04f, +2.158456113e-03f, -2.571533189e-03f, -1.325287071e-03f, +4.793607227e-03f, -1.805214179e-03f, -4.324622019e-03f, +4.701042344e-03f, +1.195644242e-03f, -4.728764801e-03f, +1.759796409e-03f, +2.266071590e-03f, -2.245978505e-03f, +2.170337449e-05f, +5.145355992e-04f, + /* 10, 8 (16) */ + +4.816756364e-03f, -1.495990019e-02f, -6.056036552e-03f, +4.372930128e-02f, -9.840969792e-03f, -1.046874843e-01f, +9.861244141e-02f, +4.867528856e-01f, +4.867528856e-01f, +9.861244141e-02f, -1.046874843e-01f, -9.840969792e-03f, +4.372930128e-02f, -6.056036552e-03f, -1.495990019e-02f, +4.816756364e-03f, + -4.816756364e-03f, +1.299121685e-02f, -1.209303209e-02f, -1.561208354e-02f, +3.311585158e-02f, -9.483975441e-04f, -4.264460496e-02f, +2.808937175e-02f, +2.808937175e-02f, -4.264460496e-02f, -9.483975441e-04f, +3.311585158e-02f, -1.561208354e-02f, -1.209303209e-02f, +1.299121685e-02f, -4.816756364e-03f, + +5.145355992e-04f, +1.286946006e-03f, -2.622568288e-03f, -1.656627930e-03f, +7.549969926e-03f, +1.391627105e-04f, -2.333185413e-02f, -1.800195312e-02f, +1.623085673e-02f, +2.427798699e-02f, +1.215530076e-03f, -7.861919836e-03f, +1.173784016e-03f, +2.869500537e-03f, -1.169445024e-03f, -6.370999718e-04f, + -5.145355992e-04f, -2.170337449e-05f, +2.245978505e-03f, -2.266071590e-03f, -1.759796409e-03f, +4.728764801e-03f, -1.195644242e-03f, -4.701042344e-03f, +4.324622019e-03f, +1.805214179e-03f, -4.793607227e-03f, +1.325287071e-03f, +2.571533189e-03f, -2.158456113e-03f, -1.920796517e-04f, +6.370999718e-04f, + /* 10, 9 (16) */ + +5.331291963e-03f, -1.367295419e-02f, -8.678604841e-03f, +4.207267336e-02f, -2.290999867e-03f, -1.045483216e-01f, +7.528058728e-02f, +4.687509325e-01f, +5.029837424e-01f, +1.228904284e-01f, -1.034719542e-01f, -1.770288963e-02f, +4.490308530e-02f, -3.186536016e-03f, -1.612934522e-02f, +4.179656392e-03f, + -5.331291963e-03f, +1.296951348e-02f, -9.847053586e-03f, -1.787815513e-02f, +3.135605517e-02f, +3.780367257e-03f, -4.384024920e-02f, +2.338832941e-02f, +3.241399377e-02f, -4.083939078e-02f, -5.742004771e-03f, +3.444113865e-02f, -1.304055035e-02f, -1.425148820e-02f, +1.279913720e-02f, -4.179656392e-03f, + +3.937972918e-04f, +1.379012919e-03f, -2.355558081e-03f, -2.092490520e-03f, +7.163263256e-03f, +1.408749087e-03f, -2.225363607e-02f, -1.963400658e-02f, +1.433368394e-02f, +2.508040511e-02f, +2.645809247e-03f, -8.091129199e-03f, +6.478079279e-04f, +3.091716275e-03f, -1.026629236e-03f, -7.595737874e-04f, + -3.937972918e-04f, -2.244293821e-04f, +2.295488393e-03f, -1.936313892e-03f, -2.158779134e-03f, +4.596966294e-03f, -5.747402513e-04f, -5.009093069e-03f, +3.885167418e-03f, +2.394314759e-03f, -4.789500958e-03f, +8.611220933e-04f, +2.847171698e-03f, -2.032935304e-03f, -4.136673415e-04f, +7.595737874e-04f, + /* 10,10 (16) */ + +5.725089255e-03f, -1.229394127e-02f, -1.103416292e-02f, +3.998018284e-02f, +4.872263389e-03f, -1.031395725e-01f, +5.302695120e-02f, +4.491169259e-01f, +5.173174263e-01f, +1.479708335e-01f, -1.008261450e-01f, -2.579401883e-02f, +4.555089323e-02f, -9.481974021e-05f, -1.715597445e-02f, +3.420082604e-03f, + -5.725089255e-03f, +1.274508409e-02f, -7.551565192e-03f, -1.981446902e-02f, +2.919727603e-02f, +8.377333551e-03f, -4.441498945e-02f, +1.837923634e-02f, +3.629916119e-02f, -3.844507602e-02f, -1.053150573e-02f, +3.530226074e-02f, -1.019337865e-02f, -1.628442351e-02f, +1.238546986e-02f, -3.420082604e-03f, + +2.766535061e-04f, +1.445899238e-03f, -2.073138191e-03f, -2.478300795e-03f, +6.710264990e-03f, +2.584878483e-03f, -2.105595376e-02f, -2.111539928e-02f, +1.232462896e-02f, +2.572860642e-02f, +4.141056237e-03f, -8.230207923e-03f, +8.331262053e-05f, +3.284673771e-03f, -8.590090941e-04f, -8.799154532e-04f, + -2.766535061e-04f, -4.131663641e-04f, +2.307592522e-03f, -1.588021768e-03f, -2.517031008e-03f, +4.401191852e-03f, +4.827050689e-05f, -5.244482628e-03f, +3.388978098e-03f, +2.954045395e-03f, -4.715485707e-03f, +3.737577831e-04f, +3.087792026e-03f, -1.870070197e-03f, -6.395339990e-04f, +8.799154532e-04f, + /* 10,11 (16) */ + +6.001742761e-03f, -1.084804203e-02f, -1.310730111e-02f, +3.750188204e-02f, +1.158252838e-02f, -1.005546940e-01f, +3.197099744e-02f, +4.280015266e-01f, +5.296420553e-01f, +1.736994399e-01f, -9.668508876e-02f, -3.402422675e-02f, +4.563420585e-02f, +3.189854030e-03f, -1.801498355e-02f, +2.540167151e-03f, + -6.001742761e-03f, +1.233191773e-02f, -5.243972670e-03f, -2.140249079e-02f, +2.668024503e-02f, +1.277852540e-02f, -4.436671894e-02f, +1.313475371e-02f, +3.968813929e-02f, -3.549103062e-02f, -1.524699144e-02f, +3.567601852e-02f, -7.105586627e-03f, -1.815449371e-02f, +1.174593586e-02f, -2.540167151e-03f, + +1.647048182e-04f, +1.488208160e-03f, -1.779942042e-03f, -2.811769941e-03f, +6.199807221e-03f, +3.660426015e-03f, -1.975227473e-02f, -2.243596823e-02f, +1.021897905e-02f, +2.621334215e-02f, +5.689639005e-03f, -8.272468366e-03f, -5.143499871e-04f, +3.443996874e-03f, -6.674996743e-04f, -9.959848689e-04f, + -1.647048182e-04f, -5.853424824e-04f, +2.283489269e-03f, -1.227092741e-03f, -2.830083735e-03f, +4.145349247e-03f, +6.642118430e-04f, -5.404026108e-03f, +2.843222957e-03f, +3.475880282e-03f, -4.571662285e-03f, -1.298566562e-04f, +3.288624868e-03f, -1.671163550e-03f, -8.659341333e-04f, +9.959848689e-04f, + /* 10,12 (16) */ + +6.166447579e-03f, -9.359833871e-03f, -1.488724315e-02f, +3.469011210e-02f, +1.778233560e-02f, -9.689426803e-02f, +1.221872271e-02f, +4.055655584e-01f, +5.398610343e-01f, +1.999127821e-01f, -9.099544976e-02f, -4.229669512e-02f, +4.511985586e-02f, +6.633850905e-03f, -1.868248322e-02f, +1.544182282e-03f, + -6.166447579e-03f, +1.174657525e-02f, -2.960483401e-03f, -2.262958353e-02f, +2.385016129e-02f, +1.692387465e-02f, -4.370250710e-02f, +7.730727605e-03f, +4.253136225e-02f, -3.201515034e-02f, -1.981865372e-02f, +3.554616187e-02f, -3.816961758e-03f, -1.982565726e-02f, +1.088000173e-02f, -1.544182282e-03f, + +5.936784234e-05f, +1.506865581e-03f, -1.480506938e-03f, -3.091385316e-03f, +5.640973860e-03f, +4.629533667e-03f, -1.835676138e-02f, -2.358709551e-02f, +8.032967803e-03f, +2.652673062e-02f, +7.279010530e-03f, -8.212029062e-03f, -1.139124392e-03f, +3.565544560e-03f, -4.534286433e-04f, -1.105572881e-03f, + -5.936784234e-05f, -7.387782004e-04f, +2.224930206e-03f, -8.594614010e-04f, -3.094261053e-03f, +3.834200007e-03f, +1.264099799e-03f, -5.485690578e-03f, +2.255831451e-03f, +3.951803513e-03f, -4.359204693e-03f, -6.423812380e-04f, +3.445415590e-03f, -1.438164344e-03f, -1.088961759e-03f, +1.105572881e-03f, + /* 10,13 (16) */ + +6.225815421e-03f, -7.852968290e-03f, -1.636775009e-02f, +3.159872678e-02f, +2.342330946e-02f, -9.226473436e-02f, -6.138038667e-03f, +3.819784629e-01f, +5.478940021e-01f, +2.264395127e-01f, -8.371643923e-02f, -5.050872418e-02f, +4.398073147e-02f, +1.019939546e-02f, -1.913591187e-02f, +4.386094018e-04f, + -6.225815421e-03f, +1.100779705e-02f, -7.355531952e-04f, -2.348904493e-02f, +2.075590024e-02f, +2.075807466e-02f, -4.243840730e-02f, +2.245037028e-03f, +4.478719370e-02f, -2.806334683e-02f, -2.417785841e-02f, +3.490378063e-02f, -3.715461683e-04f, -2.126382160e-02f, +9.791039966e-03f, -4.386094018e-04f, + -3.813712907e-05f, +1.503089613e-03f, -1.179216799e-03f, -3.316394838e-03f, +5.042986279e-03f, +5.487636280e-03f, -1.688411413e-02f, -2.456178146e-02f, +5.783617872e-03f, +2.666235779e-02f, +8.895819829e-03f, -8.043912002e-03f, -1.784297311e-03f, +3.645480290e-03f, -2.185384103e-04f, -1.206433390e-03f, + +3.813712907e-05f, -8.717103820e-04f, +2.134173336e-03f, -4.910023555e-04f, -3.306721004e-03f, +3.473272968e-03f, +1.839279577e-03f, -5.488622149e-03f, +1.635372650e-03f, +4.374437030e-03f, -4.080355138e-03f, -1.156195444e-03f, +3.554506506e-03f, -1.173654098e-03f, -1.304614536e-03f, +1.206433390e-03f, + /* 10,14 (16) */ + +6.187678292e-03f, -6.349878678e-03f, -1.754696689e-02f, +2.828233195e-02f, +2.846629574e-02f, -8.677709808e-02f, -2.302215280e-02f, +3.574166815e-01f, +5.536776200e-01f, +2.531018705e-01f, -7.482061940e-02f, -5.855263618e-02f, +4.219643416e-02f, +1.384487575e-02f, -1.935445028e-02f, -7.678239886e-04f, + -6.187678292e-03f, +1.013608667e-02f, +1.398620141e-03f, -2.398004729e-02f, +1.744917923e-02f, +2.423134762e-02f, -4.059912772e-02f, -3.243585121e-03f, +4.642256635e-02f, -2.368890980e-02f, -2.825821355e-02f, +3.374758519e-02f, +3.182960338e-03f, -2.243747570e-02f, +8.486425430e-03f, +7.678239886e-04f, + -1.267947382e-04f, +1.478357259e-03f, -8.802495447e-04f, -3.486782309e-03f, +4.415091081e-03f, +6.231472352e-03f, -1.534941132e-02f, -2.535470034e-02f, +3.488574950e-03f, +2.661536312e-02f, +1.052603445e-02f, -7.764132105e-03f, -2.442553666e-03f, +3.680340235e-03f, +3.501782856e-05f, -1.296317730e-03f, + +1.267947382e-04f, -9.828081602e-04f, +2.013929017e-03f, -1.274364829e-04f, -3.465483919e-03f, +3.068766793e-03f, +2.381556094e-03f, -5.413154414e-03f, +9.909240542e-04f, +4.737159306e-03f, -3.738401880e-03f, -1.663514904e-03f, +3.612910995e-03f, -8.808218865e-04f, -1.508861724e-03f, +1.296317730e-03f, + /* 10,15 (16) */ + +6.060883554e-03f, -4.871521418e-03f, -1.842721644e-02f, +2.479554964e-02f, +3.288138682e-02f, -8.054562573e-02f, -3.837156411e-02f, +3.320619811e-01f, +5.571661949e-01f, +2.797172336e-01f, -6.429458495e-02f, -6.631676829e-02f, +3.975388049e-02f, +1.752521599e-02f, -1.931943245e-02f, -2.064141719e-03f, + -6.060883554e-03f, +9.153278505e-03f, +3.412549158e-03f, -2.410748377e-02f, +1.398369531e-02f, +2.730011442e-02f, -3.821757163e-02f, -8.656739535e-03f, +4.741349040e-02f, -1.895175049e-02f, -3.199661543e-02f, +3.208407028e-02f, +6.795871333e-03f, -2.331829758e-02f, +6.977563706e-03f, +2.064141719e-03f, + -2.057994592e-04f, +1.434368848e-03f, -5.875296536e-04f, -3.603234301e-03f, +3.766451313e-03f, +6.859079874e-03f, -1.376794766e-02f, -2.596223776e-02f, +1.165934790e-03f, +2.638250973e-02f, +1.215507318e-02f, -7.369777567e-03f, -3.106042361e-03f, +3.667099347e-03f, +3.046863589e-04f, -1.373010852e-03f, + +2.057994592e-04f, -1.071180540e-03f, +1.867299721e-03f, +2.257579891e-04f, -3.569445935e-03f, +2.627443187e-03f, +2.883316118e-03f, -5.260798186e-03f, +3.319322640e-04f, +5.034212769e-03f, -3.337640081e-03f, -2.156512678e-03f, +3.618378046e-03f, -5.634281965e-04f, -1.697714826e-03f, +1.373010852e-03f, + /* 11, 0 (16) */ + +0.000000000e+00f, -1.373489721e-02f, -2.689410444e-03f, +4.706208751e-02f, -4.375898825e-02f, -8.747376728e-02f, +2.921822056e-01f, +6.060775524e-01f, +2.921822056e-01f, -8.747376728e-02f, -4.375898825e-02f, +4.706208751e-02f, -2.689410444e-03f, -1.373489721e-02f, +4.644945395e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.011444094e-02f, -1.842243900e-02f, -1.779232024e-03f, +3.398287415e-02f, -2.895666372e-02f, -1.839498342e-02f, +4.774542267e-02f, -1.839498342e-02f, -2.895666372e-02f, +3.398287415e-02f, -1.779232024e-03f, -1.842243900e-02f, +1.011444094e-02f, +1.888764174e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.393028468e-03f, -3.103671150e-03f, -5.123356853e-04f, +9.526290245e-03f, -8.817433098e-03f, -3.141672250e-02f, -1.497867054e-03f, +3.122303595e-02f, +1.088463154e-02f, -9.486523061e-03f, -1.970053778e-04f, +3.377476312e-03f, -1.279770068e-03f, -3.631883083e-04f, +0.000000000e+00f, + +0.000000000e+00f, +5.869534826e-04f, +1.703849036e-03f, -3.419435378e-03f, +8.241988134e-04f, +4.217903305e-03f, -5.015090271e-03f, -3.703013835e-04f, +5.339761045e-03f, -3.828408216e-03f, -1.384871449e-03f, +3.568009575e-03f, -1.478927867e-03f, -8.075414587e-04f, +9.254561391e-04f, +0.000000000e+00f, + /* 11, 1 (16) */ + +0.000000000e+00f, -1.234186874e-02f, -5.793081594e-03f, +4.654975183e-02f, -3.423269800e-02f, -9.629120038e-02f, +2.607654831e-01f, +6.045796853e-01f, +3.234052416e-01f, -7.658913574e-02f, -5.324551131e-02f, +4.686508213e-02f, +6.880658674e-04f, -1.501466728e-02f, +4.281757087e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.070139442e-02f, -1.671858996e-02f, -5.198667402e-03f, +3.480707296e-02f, -2.473876041e-02f, -2.341007369e-02f, +4.737512128e-02f, -1.305522237e-02f, -3.278507193e-02f, +3.259800270e-02f, +1.788777551e-03f, -1.990136686e-02f, +9.306899477e-03f, +2.814220313e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.473843895e-03f, -2.799518348e-03f, -1.170357329e-03f, +9.427647009e-03f, -6.787632568e-03f, -3.135252243e-02f, -4.479499004e-03f, +3.076785475e-02f, +1.296785522e-02f, -9.300239145e-03f, -9.496071616e-04f, +3.614218792e-03f, -1.133679473e-03f, -4.955490992e-04f, +0.000000000e+00f, + +0.000000000e+00f, +3.693349051e-04f, +1.889986898e-03f, -3.219904145e-03f, +2.634404758e-04f, +4.534070137e-03f, -4.612902675e-03f, -1.104819373e-03f, +5.580993592e-03f, -3.371018553e-03f, -1.935919095e-03f, +3.661385682e-03f, -1.217656810e-03f, -1.026887972e-03f, +9.662693161e-04f, +0.000000000e+00f, + /* 11, 2 (16) */ + +0.000000000e+00f, -1.086802485e-02f, -8.592599943e-03f, +4.537939450e-02f, -2.480505099e-02f, -1.030788329e-01f, +2.294129607e-01f, +6.001001863e-01f, +3.541730963e-01f, -6.362128052e-02f, -6.254575045e-02f, +4.591547497e-02f, +4.302284659e-03f, -1.614834675e-02f, +3.786207988e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.107072932e-02f, -1.482860306e-02f, -8.418571547e-03f, +3.507051344e-02f, -2.020469027e-02f, -2.802297636e-02f, +4.627030191e-02f, -7.474228782e-03f, -3.615609049e-02f, +3.066208360e-02f, +5.450163233e-03f, -2.111902367e-02f, +8.280011505e-03f, +3.780489629e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.523152946e-03f, -2.471826192e-03f, -1.770209195e-03f, +9.200107445e-03f, -4.815464692e-03f, -3.103679482e-02f, -7.418990522e-03f, +3.005040361e-02f, +1.504483455e-02f, -8.960909248e-03f, -1.736265275e-03f, +3.807397193e-03f, -9.549565371e-04f, -6.313792306e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.586325199e-04f, +2.035708755e-03f, -2.974424362e-03f, -2.880677725e-04f, +4.772793788e-03f, -4.140384955e-03f, -1.821188280e-03f, +5.734243111e-03f, -2.852408566e-03f, -2.467766205e-03f, +3.696190222e-03f, -9.232520779e-04f, -1.240593602e-03f, +9.893364223e-04f, +0.000000000e+00f, + /* 11, 3 (16) */ + +0.000000000e+00f, -9.344871900e-03f, -1.106442614e-02f, +4.360918530e-02f, -1.560494355e-02f, -1.078942976e-01f, +1.983761659e-01f, +5.926811958e-01f, +3.842234999e-01f, -4.857644597e-02f, -7.150665970e-02f, +4.417920970e-02f, +8.109681852e-03f, -1.710330329e-02f, +3.154828757e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.122936184e-02f, -1.279289431e-02f, -1.139299591e-02f, +3.478244567e-02f, -1.543189649e-02f, -3.216336132e-02f, +4.444911363e-02f, -1.739985670e-03f, -3.900849905e-02f, +2.819431740e-02f, +9.146353455e-03f, -2.204227575e-02f, +7.039417904e-03f, +4.769826052e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.542390402e-03f, -2.127380216e-03f, -2.306291198e-03f, +8.854410300e-03f, -2.919805837e-03f, -3.047853414e-02f, -1.028879925e-02f, +2.907278609e-02f, +1.709266158e-02f, -8.463733673e-03f, -2.546712806e-03f, +3.950846717e-03f, -7.444232685e-04f, -7.680873803e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.153819788e-05f, +2.140184639e-03f, -2.688660184e-03f, -8.213540304e-04f, +4.931331812e-03f, -3.605856087e-03f, -2.507657643e-03f, +5.796428894e-03f, -2.280391569e-03f, -2.970972036e-03f, +3.670003615e-03f, -5.996787195e-04f, -1.444152827e-03f, +9.928392635e-04f, +0.000000000e+00f, + /* 11, 4 (16) */ + +0.000000000e+00f, -7.802481498e-03f, -1.319180635e-02f, +4.130289410e-02f, -6.750533249e-03f, -1.108141035e-01f, +1.678976317e-01f, +5.823923965e-01f, +4.132962860e-01f, -3.148378439e-02f, -7.997039338e-02f, +4.163249689e-02f, +1.206052857e-02f, -1.784772656e-02f, +2.386741377e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.118782365e-02f, -1.065270967e-02f, -1.408165609e-02f, +3.396109164e-02f, -1.050056467e-02f, -3.576921741e-02f, +4.194145599e-02f, +4.056443223e-03f, -4.128889062e-02f, +2.522334536e-02f, +1.281635707e-02f, -2.264195447e-02f, +5.595265077e-03f, +5.762665315e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.533433808e-03f, -1.772833324e-03f, -2.774274881e-03f, +8.402325022e-03f, -1.117976720e-03f, -2.968922244e-02f, -1.306220201e-02f, +2.783999434e-02f, +1.908806289e-02f, -7.805775261e-03f, -3.369723486e-03f, +4.038862682e-03f, -5.035472270e-04f, -9.028656780e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.279509957e-04f, +2.203373835e-03f, -2.368810453e-03f, -1.327960997e-03f, +5.008342813e-03f, -3.018615167e-03f, -3.152993768e-03f, +5.765996237e-03f, -1.663796722e-03f, -3.436402410e-03f, +3.581430694e-03f, -2.516008226e-04f, -1.633041947e-03f, +9.752919577e-04f, +0.000000000e+00f, + /* 11, 5 (16) */ + +0.000000000e+00f, -6.269047690e-03f, -1.496463967e-02f, +3.852861922e-02f, +1.651791773e-03f, -1.119320802e-01f, +1.382084093e-01f, +5.693301945e-01f, +4.411362804e-01f, -1.239572150e-02f, -8.777616864e-02f, +3.826277341e-02f, +1.609939125e-02f, -1.835127378e-02f, +1.483875699e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.095987265e-02f, -8.449335833e-03f, -1.645046655e-02f, +3.263313064e-02f, -5.492221861e-03f, -3.878783257e-02f, +3.878846222e-02f, +9.822439460e-03f, -4.295268734e-02f, +2.178694295e-02f, +1.639778776e-02f, -2.289355529e-02f, +3.962223130e-03f, +6.737957273e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.498543093e-03f, -1.414603574e-03f, -3.171104647e-03f, +7.856450140e-03f, +5.744294695e-04f, -2.868265182e-02f, -1.571360705e-02f, +2.635988190e-02f, +2.100768326e-02f, -6.986070336e-03f, -4.193233982e-03f, +4.066322563e-03f, -2.344543316e-04f, -1.032732874e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.978165350e-04f, +2.225996651e-03f, -2.021480993e-03f, -1.800084393e-03f, +5.003889648e-03f, -2.388772976e-03f, -3.746673306e-03f, +5.642951548e-03f, -1.012326124e-03f, -3.855398949e-03f, +3.430153677e-03f, +1.156835838e-04f, -1.802810808e-03f, +9.355912052e-04f, +0.000000000e+00f, + /* 11, 6 (16) */ + +0.000000000e+00f, -4.770504597e-03f, -1.637924325e-02f, +3.535751458e-02f, +9.508241913e-03f, -1.113576507e-01f, +1.095257575e-01f, +5.536165875e-01f, +4.674961623e-01f, +8.611961754e-03f, -9.476223897e-02f, +3.406953942e-02f, +2.016571381e-02f, -1.858572811e-02f, +4.511428248e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.056205612e-02f, -6.223339182e-03f, -1.847194754e-02f, +3.083304625e-02f, -4.883322131e-04f, -4.117660555e-02f, +3.504178891e-02f, +1.546539101e-02f, -4.396501347e-02f, +1.793154400e-02f, +1.982794144e-02f, -2.277787171e-02f, +2.159412322e-03f, +7.673548478e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.440296577e-03f, -1.058780971e-03f, -3.494979626e-03f, +7.230007106e-03f, +2.143691711e-03f, -2.747471986e-02f, -1.821885135e-02f, +2.464309965e-02f, +2.282837633e-02f, -6.005715381e-03f, -5.004484122e-03f, +4.028804412e-03f, +6.006968784e-05f, -1.154583537e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.488192447e-04f, +2.209492435e-03f, -1.653552784e-03f, -2.230696755e-03f, +4.919417533e-03f, -1.727070435e-03f, -4.279064017e-03f, +5.428869871e-03f, -3.363946391e-04f, -4.219942601e-03f, +3.216966189e-03f, +4.963220818e-04f, -1.949176543e-03f, +8.730602337e-04f, +0.000000000e+00f, + /* 11, 7 (16) */ + +0.000000000e+00f, -3.330208019e-03f, -1.743802422e-02f, +3.186253495e-02f, +1.673824902e-02f, -1.092139590e-01f, +8.205103762e-02f, +5.353977361e-01f, +4.921392619e-01f, +3.144033808e-02f, -1.007679544e-01f, +2.906505530e-02f, +2.419451823e-02f, -1.852565843e-02f, -7.034407121e-04f, +0.000000000e+00f, + +0.000000000e+00f, +1.001323687e-02f, -4.013846747e-03f, -2.012550032e-02f, +2.860234949e-02f, +4.431085319e-03f, -4.290367599e-02f, +3.076272489e-02f, +2.089426088e-02f, -4.430140811e-02f, +1.371160140e-02f, +2.304490763e-02f, -2.228154963e-02f, +2.102357789e-04f, +8.546608712e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.361524676e-03f, -7.110444233e-04f, -3.745317205e-03f, +6.536632766e-03f, +3.578077151e-03f, -2.608320117e-02f, -2.055547875e-02f, +2.270299547e-02f, +2.452749837e-02f, -4.867927512e-03f, -5.790173517e-03f, +3.922699520e-03f, +3.765897830e-04f, -1.265242631e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.791429583e-04f, +2.155965071e-03f, -1.272048600e-03f, -2.613654597e-03f, +4.757707776e-03f, -1.044687322e-03f, -4.741589444e-03f, +5.126874571e-03f, +3.530447981e-04f, -4.522808308e-03f, +2.943787263e-03f, +8.840007045e-04f, -2.068117455e-03f, +7.874852006e-04f, +0.000000000e+00f, + /* 11, 8 (16) */ + +0.000000000e+00f, -1.968683343e-03f, -1.814906864e-02f, +2.811721775e-02f, +2.327488178e-02f, -1.056358819e-01f, +5.596783645e-02f, +5.148422574e-01f, +5.148422574e-01f, +5.596783645e-02f, -1.056358819e-01f, +2.327488178e-02f, +2.811721775e-02f, -1.814906864e-02f, -1.968683343e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.334093912e-03f, -1.857881676e-03f, -2.139754892e-02f, +2.598869489e-02f, +9.188793095e-03f, -4.394836331e-02f, +2.602113545e-02f, +2.602113545e-02f, -4.394836331e-02f, +9.188793095e-03f, +2.598869489e-02f, -2.139754892e-02f, -1.857881676e-03f, +9.334093912e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.265242631e-03f, -3.765897830e-04f, -3.922699520e-03f, +5.790173517e-03f, +4.867927512e-03f, -2.452749837e-02f, -2.270299547e-02f, +2.055547875e-02f, +2.608320117e-02f, -3.578077151e-03f, -6.536632766e-03f, +3.745317205e-03f, +7.110444233e-04f, -1.361524676e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.874852006e-04f, +2.068117455e-03f, -8.840007045e-04f, -2.943787263e-03f, +4.522808308e-03f, -3.530447981e-04f, -5.126874571e-03f, +4.741589444e-03f, +1.044687322e-03f, -4.757707776e-03f, +2.613654597e-03f, +1.272048600e-03f, -2.155965071e-03f, +6.791429583e-04f, +0.000000000e+00f, + /* 11, 9 (16) */ + +0.000000000e+00f, -7.034407121e-04f, -1.852565843e-02f, +2.419451823e-02f, +2.906505530e-02f, -1.007679544e-01f, +3.144033808e-02f, +4.921392619e-01f, +5.353977361e-01f, +8.205103762e-02f, -1.092139590e-01f, +1.673824902e-02f, +3.186253495e-02f, -1.743802422e-02f, -3.330208019e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.546608712e-03f, +2.102357789e-04f, -2.228154963e-02f, +2.304490763e-02f, +1.371160140e-02f, -4.430140811e-02f, +2.089426088e-02f, +3.076272489e-02f, -4.290367599e-02f, +4.431085319e-03f, +2.860234949e-02f, -2.012550032e-02f, -4.013846747e-03f, +1.001323687e-02f, +0.000000000e+00f, + +0.000000000e+00f, +1.154583537e-03f, -6.006968784e-05f, -4.028804412e-03f, +5.004484122e-03f, +6.005715381e-03f, -2.282837633e-02f, -2.464309965e-02f, +1.821885135e-02f, +2.747471986e-02f, -2.143691711e-03f, -7.230007106e-03f, +3.494979626e-03f, +1.058780971e-03f, -1.440296577e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.730602337e-04f, +1.949176543e-03f, -4.963220818e-04f, -3.216966189e-03f, +4.219942601e-03f, +3.363946391e-04f, -5.428869871e-03f, +4.279064017e-03f, +1.727070435e-03f, -4.919417533e-03f, +2.230696755e-03f, +1.653552784e-03f, -2.209492435e-03f, +5.488192447e-04f, +0.000000000e+00f, + /* 11,10 (16) */ + +0.000000000e+00f, +4.511428248e-04f, -1.858572811e-02f, +2.016571381e-02f, +3.406953942e-02f, -9.476223897e-02f, +8.611961754e-03f, +4.674961623e-01f, +5.536165875e-01f, +1.095257575e-01f, -1.113576507e-01f, +9.508241913e-03f, +3.535751458e-02f, -1.637924325e-02f, -4.770504597e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.673548478e-03f, +2.159412322e-03f, -2.277787171e-02f, +1.982794144e-02f, +1.793154400e-02f, -4.396501347e-02f, +1.546539101e-02f, +3.504178891e-02f, -4.117660555e-02f, -4.883322131e-04f, +3.083304625e-02f, -1.847194754e-02f, -6.223339182e-03f, +1.056205612e-02f, +0.000000000e+00f, + +0.000000000e+00f, +1.032732874e-03f, +2.344543316e-04f, -4.066322563e-03f, +4.193233982e-03f, +6.986070336e-03f, -2.100768326e-02f, -2.635988190e-02f, +1.571360705e-02f, +2.868265182e-02f, -5.744294695e-04f, -7.856450140e-03f, +3.171104647e-03f, +1.414603574e-03f, -1.498543093e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.355912052e-04f, +1.802810808e-03f, -1.156835838e-04f, -3.430153677e-03f, +3.855398949e-03f, +1.012326124e-03f, -5.642951548e-03f, +3.746673306e-03f, +2.388772976e-03f, -5.003889648e-03f, +1.800084393e-03f, +2.021480993e-03f, -2.225996651e-03f, +3.978165350e-04f, +0.000000000e+00f, + /* 11,11 (16) */ + +0.000000000e+00f, +1.483875699e-03f, -1.835127378e-02f, +1.609939125e-02f, +3.826277341e-02f, -8.777616864e-02f, -1.239572150e-02f, +4.411362804e-01f, +5.693301945e-01f, +1.382084093e-01f, -1.119320802e-01f, +1.651791773e-03f, +3.852861922e-02f, -1.496463967e-02f, -6.269047690e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.737957273e-03f, +3.962223130e-03f, -2.289355529e-02f, +1.639778776e-02f, +2.178694295e-02f, -4.295268734e-02f, +9.822439460e-03f, +3.878846222e-02f, -3.878783257e-02f, -5.492221861e-03f, +3.263313064e-02f, -1.645046655e-02f, -8.449335833e-03f, +1.095987265e-02f, +0.000000000e+00f, + +0.000000000e+00f, +9.028656780e-04f, +5.035472270e-04f, -4.038862682e-03f, +3.369723486e-03f, +7.805775261e-03f, -1.908806289e-02f, -2.783999434e-02f, +1.306220201e-02f, +2.968922244e-02f, +1.117976720e-03f, -8.402325022e-03f, +2.774274881e-03f, +1.772833324e-03f, -1.533433808e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.752919577e-04f, +1.633041947e-03f, +2.516008226e-04f, -3.581430694e-03f, +3.436402410e-03f, +1.663796722e-03f, -5.765996237e-03f, +3.152993768e-03f, +3.018615167e-03f, -5.008342813e-03f, +1.327960997e-03f, +2.368810453e-03f, -2.203373835e-03f, +2.279509957e-04f, +0.000000000e+00f, + /* 11,12 (16) */ + +0.000000000e+00f, +2.386741377e-03f, -1.784772656e-02f, +1.206052857e-02f, +4.163249689e-02f, -7.997039338e-02f, -3.148378439e-02f, +4.132962860e-01f, +5.823923965e-01f, +1.678976317e-01f, -1.108141035e-01f, -6.750533249e-03f, +4.130289410e-02f, -1.319180635e-02f, -7.802481498e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.762665315e-03f, +5.595265077e-03f, -2.264195447e-02f, +1.281635707e-02f, +2.522334536e-02f, -4.128889062e-02f, +4.056443223e-03f, +4.194145599e-02f, -3.576921741e-02f, -1.050056467e-02f, +3.396109164e-02f, -1.408165609e-02f, -1.065270967e-02f, +1.118782365e-02f, +0.000000000e+00f, + +0.000000000e+00f, +7.680873803e-04f, +7.444232685e-04f, -3.950846717e-03f, +2.546712806e-03f, +8.463733673e-03f, -1.709266158e-02f, -2.907278609e-02f, +1.028879925e-02f, +3.047853414e-02f, +2.919805837e-03f, -8.854410300e-03f, +2.306291198e-03f, +2.127380216e-03f, -1.542390402e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.928392635e-04f, +1.444152827e-03f, +5.996787195e-04f, -3.670003615e-03f, +2.970972036e-03f, +2.280391569e-03f, -5.796428894e-03f, +2.507657643e-03f, +3.605856087e-03f, -4.931331812e-03f, +8.213540304e-04f, +2.688660184e-03f, -2.140184639e-03f, +4.153819788e-05f, +0.000000000e+00f, + /* 11,13 (16) */ + +0.000000000e+00f, +3.154828757e-03f, -1.710330329e-02f, +8.109681852e-03f, +4.417920970e-02f, -7.150665970e-02f, -4.857644597e-02f, +3.842234999e-01f, +5.926811958e-01f, +1.983761659e-01f, -1.078942976e-01f, -1.560494355e-02f, +4.360918530e-02f, -1.106442614e-02f, -9.344871900e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.769826052e-03f, +7.039417904e-03f, -2.204227575e-02f, +9.146353455e-03f, +2.819431740e-02f, -3.900849905e-02f, -1.739985670e-03f, +4.444911363e-02f, -3.216336132e-02f, -1.543189649e-02f, +3.478244567e-02f, -1.139299591e-02f, -1.279289431e-02f, +1.122936184e-02f, +0.000000000e+00f, + +0.000000000e+00f, +6.313792306e-04f, +9.549565371e-04f, -3.807397193e-03f, +1.736265275e-03f, +8.960909248e-03f, -1.504483455e-02f, -3.005040361e-02f, +7.418990522e-03f, +3.103679482e-02f, +4.815464692e-03f, -9.200107445e-03f, +1.770209195e-03f, +2.471826192e-03f, -1.523152946e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.893364223e-04f, +1.240593602e-03f, +9.232520779e-04f, -3.696190222e-03f, +2.467766205e-03f, +2.852408566e-03f, -5.734243111e-03f, +1.821188280e-03f, +4.140384955e-03f, -4.772793788e-03f, +2.880677725e-04f, +2.974424362e-03f, -2.035708755e-03f, -1.586325199e-04f, +0.000000000e+00f, + /* 11,14 (16) */ + +0.000000000e+00f, +3.786207988e-03f, -1.614834675e-02f, +4.302284659e-03f, +4.591547497e-02f, -6.254575045e-02f, -6.362128052e-02f, +3.541730963e-01f, +6.001001863e-01f, +2.294129607e-01f, -1.030788329e-01f, -2.480505099e-02f, +4.537939450e-02f, -8.592599943e-03f, -1.086802485e-02f, +0.000000000e+00f, + +0.000000000e+00f, +3.780489629e-03f, +8.280011505e-03f, -2.111902367e-02f, +5.450163233e-03f, +3.066208360e-02f, -3.615609049e-02f, -7.474228782e-03f, +4.627030191e-02f, -2.802297636e-02f, -2.020469027e-02f, +3.507051344e-02f, -8.418571547e-03f, -1.482860306e-02f, +1.107072932e-02f, +0.000000000e+00f, + +0.000000000e+00f, +4.955490992e-04f, +1.133679473e-03f, -3.614218792e-03f, +9.496071616e-04f, +9.300239145e-03f, -1.296785522e-02f, -3.076785475e-02f, +4.479499004e-03f, +3.135252243e-02f, +6.787632568e-03f, -9.427647009e-03f, +1.170357329e-03f, +2.799518348e-03f, -1.473843895e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.662693161e-04f, +1.026887972e-03f, +1.217656810e-03f, -3.661385682e-03f, +1.935919095e-03f, +3.371018553e-03f, -5.580993592e-03f, +1.104819373e-03f, +4.612902675e-03f, -4.534070137e-03f, -2.634404758e-04f, +3.219904145e-03f, -1.889986898e-03f, -3.693349051e-04f, +0.000000000e+00f, + /* 11,15 (16) */ + +0.000000000e+00f, +4.281757087e-03f, -1.501466728e-02f, +6.880658674e-04f, +4.686508213e-02f, -5.324551131e-02f, -7.658913574e-02f, +3.234052416e-01f, +6.045796853e-01f, +2.607654831e-01f, -9.629120038e-02f, -3.423269800e-02f, +4.654975183e-02f, -5.793081594e-03f, -1.234186874e-02f, +0.000000000e+00f, + +0.000000000e+00f, +2.814220313e-03f, +9.306899477e-03f, -1.990136686e-02f, +1.788777551e-03f, +3.259800270e-02f, -3.278507193e-02f, -1.305522237e-02f, +4.737512128e-02f, -2.341007369e-02f, -2.473876041e-02f, +3.480707296e-02f, -5.198667402e-03f, -1.671858996e-02f, +1.070139442e-02f, +0.000000000e+00f, + +0.000000000e+00f, +3.631883083e-04f, +1.279770068e-03f, -3.377476312e-03f, +1.970053778e-04f, +9.486523061e-03f, -1.088463154e-02f, -3.122303595e-02f, +1.497867054e-03f, +3.141672250e-02f, +8.817433098e-03f, -9.526290245e-03f, +5.123356853e-04f, +3.103671150e-03f, -1.393028468e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.254561391e-04f, +8.075414587e-04f, +1.478927867e-03f, -3.568009575e-03f, +1.384871449e-03f, +3.828408216e-03f, -5.339761045e-03f, +3.703013835e-04f, +5.015090271e-03f, -4.217903305e-03f, -8.241988134e-04f, +3.419435378e-03f, -1.703849036e-03f, -5.869534826e-04f, +0.000000000e+00f, + /* 12, 0 (16) */ + +0.000000000e+00f, -3.620456273e-03f, -2.111184944e-02f, +4.528285549e-02f, -9.776114099e-03f, -1.164304310e-01f, +2.737872222e-01f, +6.538229750e-01f, +2.737872222e-01f, -1.164304310e-01f, -9.776114099e-03f, +4.528285549e-02f, -2.111184944e-02f, -3.620456273e-03f, +6.533709569e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.620456273e-03f, +1.387619818e-03f, -2.260808244e-02f, +3.336683490e-02f, -1.281591977e-02f, -2.715932523e-02f, +4.774542267e-02f, -2.715932523e-02f, -1.281591977e-02f, +3.336683490e-02f, -2.260808244e-02f, +1.387619818e-03f, +8.420160123e-03f, -6.533709569e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.979981950e-03f, -1.399822114e-03f, -3.931771063e-03f, +1.035048906e-02f, -4.599529793e-03f, -3.643181277e-02f, -1.868168438e-03f, +3.656279700e-02f, +7.056223323e-03f, -1.087139451e-02f, +3.371004197e-03f, +1.898548445e-03f, -2.087311526e-03f, +5.622678308e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.979981950e-03f, +2.584053438e-03f, -1.458373355e-03f, -2.286117262e-03f, +5.648692980e-03f, -4.731620858e-03f, -4.561504540e-04f, +5.292642204e-03f, -5.494367629e-03f, +1.684930446e-03f, +1.974767750e-03f, -2.745993195e-03f, +1.468985553e-03f, -5.622678308e-04f, +0.000000000e+00f, + /* 12, 1 (16) */ + +0.000000000e+00f, -1.640474323e-03f, -2.251167155e-02f, +4.135108443e-02f, +5.743749596e-04f, -1.210299608e-01f, +2.373554094e-01f, +6.519548066e-01f, +3.103500192e-01f, -1.093742077e-01f, -2.064750861e-02f, +4.865385969e-02f, -1.921330100e-02f, -5.707767800e-03f, +7.095977400e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.640474323e-03f, +3.971673256e-03f, -2.406645579e-02f, +3.108071764e-02f, -7.167226794e-03f, -3.189094609e-02f, +4.728927221e-02f, -2.186668303e-02f, -1.831028740e-02f, +3.505176535e-02f, -2.063331469e-02f, -1.358373377e-03f, +9.889145676e-03f, -7.095977400e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.843178801e-03f, -9.095314506e-04f, -4.390261474e-03f, +9.691087485e-03f, -2.253562431e-03f, -3.596542511e-02f, -5.584318377e-03f, +3.634884835e-02f, +9.596836670e-03f, -1.123615824e-02f, +2.711778521e-03f, +2.396561982e-03f, -2.160567445e-03f, +4.707202169e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.843178801e-03f, +2.374554586e-03f, -9.300309354e-04f, -2.826869422e-03f, +5.689376211e-03f, -4.082457079e-03f, -1.359283642e-03f, +5.753503758e-03f, -5.227811881e-03f, +1.034457934e-03f, +2.467645188e-03f, -2.854632541e-03f, +1.336650224e-03f, -4.707202169e-04f, +0.000000000e+00f, + /* 12, 2 (16) */ + +0.000000000e+00f, +2.027044775e-04f, -2.342120300e-02f, +3.696082295e-02f, +1.026546244e-02f, -1.232835232e-01f, +2.013899843e-01f, +6.463704882e-01f, +3.466988675e-01f, -9.977737101e-02f, -3.188366685e-02f, +5.136563821e-02f, -1.681673901e-02f, -7.868335245e-03f, +7.566697617e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.027044775e-04f, +6.346227842e-03f, -2.499648673e-02f, +2.825384822e-02f, -1.477850584e-03f, -3.597340317e-02f, +4.592998857e-02f, -1.611317927e-02f, -2.353809929e-02f, +3.608622328e-02f, -1.816566950e-02f, -4.213005918e-03f, +1.122579590e-02f, -7.566697617e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.681785466e-03f, -4.361174373e-04f, -4.744633558e-03f, +8.912039673e-03f, -4.267090354e-05f, -3.517717977e-02f, -9.240178803e-03f, +3.578464672e-02f, +1.219242599e-02f, -1.142867545e-02f, +1.959924946e-03f, +2.884145115e-03f, -2.195550139e-03f, +3.579571916e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.681785466e-03f, +2.124083205e-03f, -4.012189313e-04f, -3.297552255e-03f, +5.617376388e-03f, -3.358891424e-03f, -2.235106267e-03f, +6.104177201e-03f, -4.852810648e-03f, +3.471508423e-04f, +2.925604708e-03f, -2.905241137e-03f, +1.164283587e-03f, -3.579571916e-04f, +0.000000000e+00f, + /* 12, 3 (16) */ + +0.000000000e+00f, +1.884489944e-03f, -2.385732044e-02f, +3.221618939e-02f, +1.917750212e-02f, -1.233261941e-01f, +1.662128046e-01f, +6.371303094e-01f, +3.824835143e-01f, -8.758494502e-02f, -4.331234230e-02f, +5.332556315e-02f, -1.393259390e-02f, -1.006388538e-02f, +7.924654809e-03f, +0.000000000e+00f, + +0.000000000e+00f, -1.884489944e-03f, +8.470311047e-03f, -2.539770566e-02f, +2.495629596e-02f, +4.139525804e-03f, -3.933229459e-02f, +4.369488230e-02f, -1.000900207e-02f, -2.839090993e-02f, +3.643337413e-02f, -1.524006479e-02f, -7.118247055e-03f, +1.239007949e-02f, -7.924654809e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.500852204e-03f, +1.280442282e-05f, -4.994951383e-03f, +8.033056270e-03f, +2.011525976e-03f, -3.408439022e-02f, -1.279645690e-02f, +3.486921498e-02f, +1.481227001e-02f, -1.143470571e-02f, +1.123290809e-03f, +3.351167997e-03f, -2.188576095e-03f, +2.247518832e-04f, +0.000000000e+00f, + +0.000000000e+00f, -1.500852204e-03f, +1.839891100e-03f, +1.169244753e-04f, -3.690220277e-03f, +5.435969863e-03f, -2.576086649e-03f, -3.066049075e-03f, +6.336847858e-03f, -4.375472659e-03f, -3.634827903e-04f, +3.337674673e-03f, -2.894246643e-03f, +9.539861005e-04f, -2.247518832e-04f, +0.000000000e+00f, + /* 12, 4 (16) */ + +0.000000000e+00f, +3.385342148e-03f, -2.384451602e-02f, +2.722123801e-02f, +2.721055839e-02f, -1.213146682e-01f, +1.321284143e-01f, +6.243338525e-01f, +4.173527292e-01f, -7.277267501e-02f, -5.474704801e-02f, +5.444885396e-02f, -1.058142590e-02f, -1.225246148e-02f, +8.149406692e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.385342148e-03f, +1.031020215e-02f, -2.528078118e-02f, +2.126607569e-02f, +9.575495667e-03f, -4.190838124e-02f, +4.062883323e-02f, -3.672154211e-03f, -3.276638259e-02f, +3.606989134e-02f, -1.190239012e-02f, -1.001249370e-02f, +1.334406559e-02f, -8.149406692e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.305482812e-03f, +4.305405109e-04f, -5.143085334e-03f, +7.074364025e-03f, +3.890366093e-03f, -3.270783760e-02f, -1.621519577e-02f, +3.360599057e-02f, +1.742426617e-02f, -1.124217767e-02f, +2.117072082e-04f, +3.787261859e-03f, -2.136589174e-03f, +7.242627967e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.305482812e-03f, +1.529705674e-03f, +6.138369571e-04f, -3.998751648e-03f, +5.150647482e-03f, -1.750298308e-03f, -3.835484876e-03f, +6.446092918e-03f, -3.804129816e-03f, -1.083151379e-03f, +3.693571014e-03f, -2.819358928e-03f, +7.088882412e-04f, -7.242627967e-05f, +0.000000000e+00f, + /* 12, 5 (16) */ + +0.000000000e+00f, +4.690824960e-03f, -2.341397551e-02f, +2.207815268e-02f, +3.428492241e-02f, -1.174243021e-01f, +9.942057673e-02f, +6.081186568e-01f, +4.509587198e-01f, -5.534840884e-02f, -6.598922568e-02f, +5.466056117e-02f, -6.794164042e-03f, -1.438905065e-02f, +8.221832972e-03f, +0.000000000e+00f, + +0.000000000e+00f, -4.690824960e-03f, +1.183990782e-02f, -2.466694423e-02f, +1.726732404e-02f, +1.472614315e-02f, -4.365867955e-02f, +3.679334835e-02f, +2.773938707e-03f, -3.657051241e-02f, +3.498673996e-02f, -8.208819102e-03f, -1.283185263e-02f, +1.405295383e-02f, -8.221832972e-03f, +0.000000000e+00f, + +0.000000000e+00f, +1.100726558e-03f, +8.113930777e-04f, -5.192585640e-03f, +6.056365747e-03f, +5.578319117e-03f, -3.107142480e-02f, -1.946028036e-02f, +3.200283345e-02f, +1.999535713e-02f, -1.084146928e-02f, -7.630803057e-04f, +4.182006147e-03f, -2.037265139e-03f, -9.714166871e-05f, +0.000000000e+00f, + +0.000000000e+00f, -1.100726558e-03f, +1.201535403e-03f, +1.079748438e-03f, -4.218939941e-03f, +4.768965380e-03f, -8.985243634e-04f, -4.528076476e-03f, +6.429009114e-03f, -3.149186900e-03f, -1.797075635e-03f, +3.983946298e-03f, -2.679667835e-03f, +4.331157460e-04f, +9.714166871e-05f, +0.000000000e+00f, + /* 12, 6 (16) */ + +0.000000000e+00f, +5.791551518e-03f, -2.260258243e-02f, +1.688556704e-02f, +4.034128816e-02f, -1.118459829e-01f, +6.834915193e-02f, +5.886583764e-01f, +4.829615533e-01f, -3.535305171e-02f, -7.683069497e-02f, +5.389748086e-02f, -2.612157895e-03f, -1.642631579e-02f, +8.124691303e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.791551518e-03f, +1.304144322e-02f, -2.358719579e-02f, +1.304838410e-02f, +1.949510853e-02f, -4.455720391e-02f, +3.226527188e-02f, +9.202947821e-03f, -3.971969931e-02f, +3.318966432e-02f, -4.224872805e-03f, -1.551152046e-02f, +1.448606958e-02f, -8.124691303e-03f, +0.000000000e+00f, + +0.000000000e+00f, +8.914773328e-04f, +1.150711463e-03f, -5.148532409e-03f, +4.999310351e-03f, +7.063109243e-03f, -2.920179030e-02f, -2.249791537e-02f, +3.007196952e-02f, +2.249198169e-02f, -1.022565798e-02f, -1.787517933e-03f, +4.525126494e-03f, -1.889106856e-03f, -2.815233033e-04f, +0.000000000e+00f, + +0.000000000e+00f, -8.914773328e-04f, +8.634751685e-04f, +1.505873829e-03f, -4.348541982e-03f, +4.300353269e-03f, -3.814160103e-05f, -5.130096486e-03f, +6.285286814e-03f, -2.422924447e-03f, -2.490300577e-03f, +4.200623641e-03f, -2.475711368e-03f, +1.317288329e-04f, +2.815233033e-04f, +0.000000000e+00f, + /* 12, 7 (16) */ + +0.000000000e+00f, +6.683028851e-03f, -2.145187097e-02f, +1.173703463e-02f, +4.534059851e-02f, -1.047828737e-01f, +3.914736163e-02f, +5.661604610e-01f, +5.130335228e-01f, -1.286107003e-02f, -8.705635295e-02f, +5.210996293e-02f, +1.912968599e-03f, -1.831542265e-02f, +7.843168000e-03f, +0.000000000e+00f, + +0.000000000e+00f, -6.683028851e-03f, +1.390491839e-02f, -2.208132196e-02f, +8.699842117e-03f, +2.379546180e-02f, -4.459534551e-02f, +2.713517539e-02f, +1.548823464e-02f, -4.214262376e-02f, +3.069936375e-02f, -2.424916377e-05f, -1.798723183e-02f, +1.461779841e-02f, -7.843168000e-03f, +0.000000000e+00f, + +0.000000000e+00f, +6.823817179e-04f, +1.444920648e-03f, -5.017365805e-03f, +3.922978168e-03f, +8.335784927e-03f, -2.712788849e-02f, -2.529706819e-02f, +2.782987004e-02f, +2.488054317e-02f, -9.390735819e-03f, -2.846386253e-03f, +4.806700225e-03f, -1.691527672e-03f, -4.777574306e-04f, +0.000000000e+00f, + +0.000000000e+00f, -6.823817179e-04f, +5.235160507e-04f, +1.884578276e-03f, -4.387281552e-03f, +3.755884995e-03f, +8.134631155e-04f, -5.629712099e-03f, +6.017228656e-03f, -1.639258644e-03f, -3.148016953e-03f, +4.336809729e-03f, -2.209511852e-03f, -1.893639647e-04f, +4.777574306e-04f, +0.000000000e+00f, + /* 12, 8 (16) */ + +0.000000000e+00f, +7.365410569e-03f, -2.000695032e-02f, +6.719668823e-03f, +4.926357668e-02f, -9.644708877e-02f, +1.201947314e-02f, +5.408633928e-01f, +5.408633928e-01f, +1.201947314e-02f, -9.644708877e-02f, +4.926357668e-02f, +6.719668823e-03f, -2.000695032e-02f, +7.365410569e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.365410569e-03f, +1.442843444e-02f, -2.019674368e-02f, +4.312560565e-03f, +2.755134679e-02f, -4.378188240e-02f, +2.150546329e-02f, +2.150546329e-02f, -4.378188240e-02f, +2.755134679e-02f, +4.312560565e-03f, -2.019674368e-02f, +1.442843444e-02f, -7.365410569e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.777574306e-04f, +1.691527672e-03f, -4.806700225e-03f, +2.846386253e-03f, +9.390735819e-03f, -2.488054317e-02f, -2.782987004e-02f, +2.529706819e-02f, +2.712788849e-02f, -8.335784927e-03f, -3.922978168e-03f, +5.017365805e-03f, -1.444920648e-03f, -6.823817179e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.777574306e-04f, +1.893639647e-04f, +2.209511852e-03f, -4.336809729e-03f, +3.148016953e-03f, +1.639258644e-03f, -6.017228656e-03f, +5.629712099e-03f, -8.134631155e-04f, -3.755884995e-03f, +4.387281552e-03f, -1.884578276e-03f, -5.235160507e-04f, +6.823817179e-04f, +0.000000000e+00f, + /* 12, 9 (16) */ + +0.000000000e+00f, +7.843168000e-03f, -1.831542265e-02f, +1.912968599e-03f, +5.210996293e-02f, -8.705635295e-02f, -1.286107003e-02f, +5.130335228e-01f, +5.661604610e-01f, +3.914736163e-02f, -1.047828737e-01f, +4.534059851e-02f, +1.173703463e-02f, -2.145187097e-02f, +6.683028851e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.843168000e-03f, +1.461779841e-02f, -1.798723183e-02f, -2.424916377e-05f, +3.069936375e-02f, -4.214262376e-02f, +1.548823464e-02f, +2.713517539e-02f, -4.459534551e-02f, +2.379546180e-02f, +8.699842117e-03f, -2.208132196e-02f, +1.390491839e-02f, -6.683028851e-03f, +0.000000000e+00f, + +0.000000000e+00f, +2.815233033e-04f, +1.889106856e-03f, -4.525126494e-03f, +1.787517933e-03f, +1.022565798e-02f, -2.249198169e-02f, -3.007196952e-02f, +2.249791537e-02f, +2.920179030e-02f, -7.063109243e-03f, -4.999310351e-03f, +5.148532409e-03f, -1.150711463e-03f, -8.914773328e-04f, +0.000000000e+00f, + +0.000000000e+00f, -2.815233033e-04f, -1.317288329e-04f, +2.475711368e-03f, -4.200623641e-03f, +2.490300577e-03f, +2.422924447e-03f, -6.285286814e-03f, +5.130096486e-03f, +3.814160103e-05f, -4.300353269e-03f, +4.348541982e-03f, -1.505873829e-03f, -8.634751685e-04f, +8.914773328e-04f, +0.000000000e+00f, + /* 12,10 (16) */ + +0.000000000e+00f, +8.124691303e-03f, -1.642631579e-02f, -2.612157895e-03f, +5.389748086e-02f, -7.683069497e-02f, -3.535305171e-02f, +4.829615533e-01f, +5.886583764e-01f, +6.834915193e-02f, -1.118459829e-01f, +4.034128816e-02f, +1.688556704e-02f, -2.260258243e-02f, +5.791551518e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.124691303e-03f, +1.448606958e-02f, -1.551152046e-02f, -4.224872805e-03f, +3.318966432e-02f, -3.971969931e-02f, +9.202947821e-03f, +3.226527188e-02f, -4.455720391e-02f, +1.949510853e-02f, +1.304838410e-02f, -2.358719579e-02f, +1.304144322e-02f, -5.791551518e-03f, +0.000000000e+00f, + +0.000000000e+00f, +9.714166871e-05f, +2.037265139e-03f, -4.182006147e-03f, +7.630803057e-04f, +1.084146928e-02f, -1.999535713e-02f, -3.200283345e-02f, +1.946028036e-02f, +3.107142480e-02f, -5.578319117e-03f, -6.056365747e-03f, +5.192585640e-03f, -8.113930777e-04f, -1.100726558e-03f, +0.000000000e+00f, + +0.000000000e+00f, -9.714166871e-05f, -4.331157460e-04f, +2.679667835e-03f, -3.983946298e-03f, +1.797075635e-03f, +3.149186900e-03f, -6.429009114e-03f, +4.528076476e-03f, +8.985243634e-04f, -4.768965380e-03f, +4.218939941e-03f, -1.079748438e-03f, -1.201535403e-03f, +1.100726558e-03f, +0.000000000e+00f, + /* 12,11 (16) */ + +0.000000000e+00f, +8.221832972e-03f, -1.438905065e-02f, -6.794164042e-03f, +5.466056117e-02f, -6.598922568e-02f, -5.534840884e-02f, +4.509587198e-01f, +6.081186568e-01f, +9.942057673e-02f, -1.174243021e-01f, +3.428492241e-02f, +2.207815268e-02f, -2.341397551e-02f, +4.690824960e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.221832972e-03f, +1.405295383e-02f, -1.283185263e-02f, -8.208819102e-03f, +3.498673996e-02f, -3.657051241e-02f, +2.773938707e-03f, +3.679334835e-02f, -4.365867955e-02f, +1.472614315e-02f, +1.726732404e-02f, -2.466694423e-02f, +1.183990782e-02f, -4.690824960e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.242627967e-05f, +2.136589174e-03f, -3.787261859e-03f, -2.117072082e-04f, +1.124217767e-02f, -1.742426617e-02f, -3.360599057e-02f, +1.621519577e-02f, +3.270783760e-02f, -3.890366093e-03f, -7.074364025e-03f, +5.143085334e-03f, -4.305405109e-04f, -1.305482812e-03f, +0.000000000e+00f, + +0.000000000e+00f, +7.242627967e-05f, -7.088882412e-04f, +2.819358928e-03f, -3.693571014e-03f, +1.083151379e-03f, +3.804129816e-03f, -6.446092918e-03f, +3.835484876e-03f, +1.750298308e-03f, -5.150647482e-03f, +3.998751648e-03f, -6.138369571e-04f, -1.529705674e-03f, +1.305482812e-03f, +0.000000000e+00f, + /* 12,12 (16) */ + +0.000000000e+00f, +8.149406692e-03f, -1.225246148e-02f, -1.058142590e-02f, +5.444885396e-02f, -5.474704801e-02f, -7.277267501e-02f, +4.173527292e-01f, +6.243338525e-01f, +1.321284143e-01f, -1.213146682e-01f, +2.721055839e-02f, +2.722123801e-02f, -2.384451602e-02f, +3.385342148e-03f, +0.000000000e+00f, + +0.000000000e+00f, -8.149406692e-03f, +1.334406559e-02f, -1.001249370e-02f, -1.190239012e-02f, +3.606989134e-02f, -3.276638259e-02f, -3.672154211e-03f, +4.062883323e-02f, -4.190838124e-02f, +9.575495667e-03f, +2.126607569e-02f, -2.528078118e-02f, +1.031020215e-02f, -3.385342148e-03f, +0.000000000e+00f, + +0.000000000e+00f, -2.247518832e-04f, +2.188576095e-03f, -3.351167997e-03f, -1.123290809e-03f, +1.143470571e-02f, -1.481227001e-02f, -3.486921498e-02f, +1.279645690e-02f, +3.408439022e-02f, -2.011525976e-03f, -8.033056270e-03f, +4.994951383e-03f, -1.280442282e-05f, -1.500852204e-03f, +0.000000000e+00f, + +0.000000000e+00f, +2.247518832e-04f, -9.539861005e-04f, +2.894246643e-03f, -3.337674673e-03f, +3.634827903e-04f, +4.375472659e-03f, -6.336847858e-03f, +3.066049075e-03f, +2.576086649e-03f, -5.435969863e-03f, +3.690220277e-03f, -1.169244753e-04f, -1.839891100e-03f, +1.500852204e-03f, +0.000000000e+00f, + /* 12,13 (16) */ + +0.000000000e+00f, +7.924654809e-03f, -1.006388538e-02f, -1.393259390e-02f, +5.332556315e-02f, -4.331234230e-02f, -8.758494502e-02f, +3.824835143e-01f, +6.371303094e-01f, +1.662128046e-01f, -1.233261941e-01f, +1.917750212e-02f, +3.221618939e-02f, -2.385732044e-02f, +1.884489944e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.924654809e-03f, +1.239007949e-02f, -7.118247055e-03f, -1.524006479e-02f, +3.643337413e-02f, -2.839090993e-02f, -1.000900207e-02f, +4.369488230e-02f, -3.933229459e-02f, +4.139525804e-03f, +2.495629596e-02f, -2.539770566e-02f, +8.470311047e-03f, -1.884489944e-03f, +0.000000000e+00f, + +0.000000000e+00f, -3.579571916e-04f, +2.195550139e-03f, -2.884145115e-03f, -1.959924946e-03f, +1.142867545e-02f, -1.219242599e-02f, -3.578464672e-02f, +9.240178803e-03f, +3.517717977e-02f, +4.267090354e-05f, -8.912039673e-03f, +4.744633558e-03f, +4.361174373e-04f, -1.681785466e-03f, +0.000000000e+00f, + +0.000000000e+00f, +3.579571916e-04f, -1.164283587e-03f, +2.905241137e-03f, -2.925604708e-03f, -3.471508423e-04f, +4.852810648e-03f, -6.104177201e-03f, +2.235106267e-03f, +3.358891424e-03f, -5.617376388e-03f, +3.297552255e-03f, +4.012189313e-04f, -2.124083205e-03f, +1.681785466e-03f, +0.000000000e+00f, + /* 12,14 (16) */ + +0.000000000e+00f, +7.566697617e-03f, -7.868335245e-03f, -1.681673901e-02f, +5.136563821e-02f, -3.188366685e-02f, -9.977737101e-02f, +3.466988675e-01f, +6.463704882e-01f, +2.013899843e-01f, -1.232835232e-01f, +1.026546244e-02f, +3.696082295e-02f, -2.342120300e-02f, +2.027044775e-04f, +0.000000000e+00f, + +0.000000000e+00f, -7.566697617e-03f, +1.122579590e-02f, -4.213005918e-03f, -1.816566950e-02f, +3.608622328e-02f, -2.353809929e-02f, -1.611317927e-02f, +4.592998857e-02f, -3.597340317e-02f, -1.477850584e-03f, +2.825384822e-02f, -2.499648673e-02f, +6.346227842e-03f, -2.027044775e-04f, +0.000000000e+00f, + +0.000000000e+00f, -4.707202169e-04f, +2.160567445e-03f, -2.396561982e-03f, -2.711778521e-03f, +1.123615824e-02f, -9.596836670e-03f, -3.634884835e-02f, +5.584318377e-03f, +3.596542511e-02f, +2.253562431e-03f, -9.691087485e-03f, +4.390261474e-03f, +9.095314506e-04f, -1.843178801e-03f, +0.000000000e+00f, + +0.000000000e+00f, +4.707202169e-04f, -1.336650224e-03f, +2.854632541e-03f, -2.467645188e-03f, -1.034457934e-03f, +5.227811881e-03f, -5.753503758e-03f, +1.359283642e-03f, +4.082457079e-03f, -5.689376211e-03f, +2.826869422e-03f, +9.300309354e-04f, -2.374554586e-03f, +1.843178801e-03f, +0.000000000e+00f, + /* 12,15 (16) */ + +0.000000000e+00f, +7.095977400e-03f, -5.707767800e-03f, -1.921330100e-02f, +4.865385969e-02f, -2.064750861e-02f, -1.093742077e-01f, +3.103500192e-01f, +6.519548066e-01f, +2.373554094e-01f, -1.210299608e-01f, +5.743749596e-04f, +4.135108443e-02f, -2.251167155e-02f, -1.640474323e-03f, +0.000000000e+00f, + +0.000000000e+00f, -7.095977400e-03f, +9.889145676e-03f, -1.358373377e-03f, -2.063331469e-02f, +3.505176535e-02f, -1.831028740e-02f, -2.186668303e-02f, +4.728927221e-02f, -3.189094609e-02f, -7.167226794e-03f, +3.108071764e-02f, -2.406645579e-02f, +3.971673256e-03f, +1.640474323e-03f, +0.000000000e+00f, + +0.000000000e+00f, -5.622678308e-04f, +2.087311526e-03f, -1.898548445e-03f, -3.371004197e-03f, +1.087139451e-02f, -7.056223323e-03f, -3.656279700e-02f, +1.868168438e-03f, +3.643181277e-02f, +4.599529793e-03f, -1.035048906e-02f, +3.931771063e-03f, +1.399822114e-03f, -1.979981950e-03f, +0.000000000e+00f, + +0.000000000e+00f, +5.622678308e-04f, -1.468985553e-03f, +2.745993195e-03f, -1.974767750e-03f, -1.684930446e-03f, +5.494367629e-03f, -5.292642204e-03f, +4.561504540e-04f, +4.731620858e-03f, -5.648692980e-03f, +2.286117262e-03f, +1.458373355e-03f, -2.584053438e-03f, +1.979981950e-03f, +0.000000000e+00f, + /* 13, 0 (12) */ + -1.972422962e-02f, +2.267477305e-02f, +2.359072080e-02f, -1.292463508e-01f, +2.466278970e-01f, +7.015683977e-01f, +2.466278970e-01f, -1.292463508e-01f, +2.359072080e-02f, +2.267477305e-02f, -1.972422962e-02f, +4.799703850e-03f, + +5.623298117e-03f, -2.233279642e-02f, +2.771214615e-02f, -6.222863232e-03f, -2.982427142e-02f, +4.774542267e-02f, -2.982427142e-02f, -6.222863232e-03f, +2.771214615e-02f, -2.233279642e-02f, +5.623298117e-03f, +3.049445224e-03f, + +1.184231324e-03f, -5.390144418e-03f, +8.064371797e-03f, +1.049163186e-03f, -4.116343363e-02f, -2.324318892e-03f, +4.185543920e-02f, +1.561855693e-03f, -9.186464064e-03f, +5.345771948e-03f, -8.474447504e-04f, -6.183259736e-04f, + +1.561188515e-03f, -2.121741000e-04f, -3.135764939e-03f, +5.747483122e-03f, -4.460474383e-03f, -4.909849421e-04f, +5.123770053e-03f, -5.739572450e-03f, +2.652101873e-03f, +7.139584264e-04f, -1.811553195e-03f, +1.074994695e-03f, + /* 13, 1 (12) */ + -1.853999830e-02f, +1.728462863e-02f, +3.165509260e-02f, -1.281971876e-01f, +2.054644633e-01f, +6.992440788e-01f, +2.884833362e-01f, -1.276844951e-01f, +1.440425674e-02f, +2.802054500e-02f, -2.057167437e-02f, +4.181377877e-03f, + +7.184486632e-03f, -2.254497052e-02f, +2.457638121e-02f, -4.753801099e-04f, -3.428474580e-02f, +4.725443772e-02f, -2.470050137e-02f, -1.196243568e-02f, +3.036424802e-02f, -2.161883800e-02f, +3.811744922e-03f, +4.124439920e-03f, + +1.465023136e-03f, -5.320292410e-03f, +6.864218062e-03f, +3.435813779e-03f, -4.004788218e-02f, -6.943602019e-03f, +4.210235210e-02f, +4.369024788e-03f, -1.020170031e-02f, +5.179423709e-03f, -4.580705590e-04f, -8.239172206e-04f, + +1.291087560e-03f, +2.707142018e-04f, -3.536453862e-03f, +5.633317814e-03f, -3.709661828e-03f, -1.462247758e-03f, +5.684120067e-03f, -5.607319388e-03f, +2.093921463e-03f, +1.223471859e-03f, -2.034388843e-03f, +1.095048359e-03f, + /* 13, 2 (12) */ + -1.707497516e-02f, +1.196433622e-02f, +3.851931066e-02f, -1.247613738e-01f, +1.654165812e-01f, +6.923004768e-01f, +3.305856883e-01f, -1.233154703e-01f, +4.202556435e-03f, +3.319996871e-02f, -2.102974493e-02f, +3.357460656e-03f, + +8.475574192e-03f, -2.227425632e-02f, +2.103992735e-02f, +5.157937705e-03f, -3.799440763e-02f, +4.579218997e-02f, -1.901638130e-02f, -1.756975507e-02f, +3.245816949e-02f, -2.039536614e-02f, +1.777356079e-03f, +5.219488278e-03f, + +1.687965768e-03f, -5.145852489e-03f, +5.614487418e-03f, +5.574705484e-03f, -3.853607120e-02f, -1.147528507e-02f, +4.188882392e-02f, +7.339615338e-03f, -1.108152461e-02f, +4.885529654e-03f, -2.109602172e-05f, -1.031266552e-03f, + +1.009122428e-03f, +7.244470526e-04f, -3.847864393e-03f, +5.402051594e-03f, -2.888573507e-03f, -2.401635327e-03f, +6.128281347e-03f, -5.351268396e-03f, +1.471688198e-03f, +1.728888211e-03f, -2.222199009e-03f, +1.084783716e-03f, + /* 13, 3 (12) */ + -1.538700940e-02f, +6.818483736e-03f, +4.413379808e-02f, -1.191866683e-01f, +1.268805100e-01f, +6.808251917e-01f, +3.724745122e-01f, -1.159758550e-01f, -6.878968176e-03f, +3.808549836e-02f, -2.105084095e-02f, +2.326194104e-03f, + +9.484696619e-03f, -2.154980927e-02f, +1.719206296e-02f, +1.055998930e-02f, -4.088298114e-02f, +4.339055464e-02f, -1.288809995e-02f, -2.292102347e-02f, +3.392985768e-02f, -1.866647793e-02f, -4.448429299e-04f, +6.304271994e-03f, + +1.852695523e-03f, -4.878026907e-03f, +4.342835993e-03f, +7.447495839e-03f, -3.666047687e-02f, -1.586250597e-02f, +4.120606284e-02f, +1.043679735e-02f, -1.179818850e-02f, +4.460965481e-03f, +4.569213542e-04f, -1.234589995e-03f, + +7.230348342e-04f, +1.139889429e-03f, -4.065933899e-03f, +5.061203430e-03f, -2.015850099e-03f, -3.288711431e-03f, +6.445521069e-03f, -4.974811001e-03f, +7.976759417e-04f, +2.217996040e-03f, -2.368001990e-03f, +1.041954536e-03f, + /* 13, 4 (12) */ + -1.353431387e-02f, +1.940456828e-03f, +4.847663407e-02f, -1.117391725e-01f, +9.022003309e-02f, +6.649626858e-01f, +4.136805750e-01f, -1.055390576e-01f, -1.867715668e-02f, +4.254646384e-02f, -2.059391960e-02f, +1.091604109e-03f, + +1.020773145e-02f, -2.040991984e-02f, +1.312612906e-02f, +1.562119273e-02f, -4.289883124e-02f, +4.010184321e-02f, -6.442578884e-03f, -2.789583447e-02f, +3.472753363e-02f, -1.644848189e-02f, -2.812844920e-03f, +7.346226530e-03f, + +1.960246185e-03f, -4.529248377e-03f, +3.075612377e-03f, +9.041013575e-03f, -3.445813591e-02f, -2.005068065e-02f, +4.005208349e-02f, +1.362013635e-02f, -1.232532905e-02f, +3.905278222e-03f, +9.679029306e-04f, -1.427700933e-03f, + +4.402390107e-04f, +1.509211753e-03f, -4.188873780e-03f, +4.620613922e-03f, -1.111089860e-03f, -4.104240237e-03f, +6.627884225e-03f, -4.484154052e-03f, +8.571990451e-05f, +2.678492060e-03f, -2.465544739e-03f, +9.651380799e-04f, + /* 13, 5 (12) */ + -1.157406769e-02f, -2.588791548e-03f, +5.155224645e-02f, -1.026981589e-01f, +5.576189718e-02f, +6.449120051e-01f, +4.537326585e-01f, -9.191892125e-02f, -3.100248573e-02f, +4.645174207e-02f, -1.962601667e-02f, -3.360968235e-04f, + +1.064797046e-02f, -1.890070809e-02f, +8.937255278e-03f, +2.024180665e-02f, -4.400992110e-02f, +3.599760297e-02f, +1.853053405e-04f, -3.237998852e-02f, +3.481325353e-02f, -1.376998983e-02f, -5.278389659e-03f, +8.311364610e-03f, + +2.012928481e-03f, -4.112837201e-03f, +1.837425806e-03f, +1.034728450e-02f, -3.196994916e-02f, -2.398835684e-02f, +3.843184257e-02f, +1.684617023e-02f, -1.263854492e-02f, +3.220865992e-03f, +1.502338312e-03f, -1.604149393e-03f, + +1.676420501e-04f, +1.826031572e-03f, -4.217145811e-03f, +4.092171844e-03f, -1.943883389e-04f, -4.830625910e-03f, +6.670397326e-03f, -3.888219826e-03f, -6.490759840e-04f, +3.098286887e-03f, -2.509506132e-03f, +8.538256948e-04f, + /* 13, 6 (12) */ + -9.561139207e-03f, -6.701628749e-03f, +5.338967226e-02f, -9.235087441e-02f, +2.379194802e-02f, +6.209236483e-01f, +4.921645011e-01f, -7.507275102e-02f, -4.364103065e-02f, +4.967260806e-02f, -1.812367836e-02f, -1.940246217e-03f, + +1.081561251e-02f, -1.707467651e-02f, +4.720109467e-03f, +2.433397849e-02f, -4.420430944e-02f, +3.116697706e-02f, +6.855702666e-03f, -3.626820835e-02f, +3.416417755e-02f, -1.067170294e-02f, -7.787895790e-03f, +9.165190305e-03f, + +2.014186632e-03f, -3.642658580e-03f, +6.507683685e-04f, +1.136346251e-02f, -2.923993190e-02f, -2.762801186e-02f, +3.635725634e-02f, +2.006905724e-02f, -1.271595856e-02f, +2.413105708e-03f, +2.049415126e-03f, -1.757378023e-03f, + -8.851409983e-05f, +2.085513525e-03f, -4.153384390e-03f, +3.489497026e-03f, +7.141289846e-04f, -5.452312891e-03f, +6.571202918e-03f, -3.198479453e-03f, -1.390669949e-03f, +3.465815504e-03f, -2.495683579e-03f, +7.084908599e-04f, + /* 13, 7 (12) */ + -7.546952575e-03f, -1.034428733e-02f, +5.404044063e-02f, -8.098741190e-02f, -5.447983881e-03f, +5.932956364e-01f, +5.285217574e-01f, -5.500369378e-02f, -5.635698920e-02f, +5.208571377e-02f, -1.607426323e-02f, -3.697624239e-03f, + +1.072709841e-02f, -1.498916299e-02f, +5.667250777e-04f, +2.782347552e-02f, -4.349018045e-02f, +2.571466417e-02f, +1.342690558e-02f, -3.946668780e-02f, +3.277350760e-02f, -7.205887438e-03f, -1.028357937e-02f, +9.873681165e-03f, + +1.968436699e-03f, -3.132787529e-03f, -4.643033836e-04f, +1.209166992e-02f, -2.631442538e-02f, -3.092678029e-02f, +3.384709869e-02f, +2.324128453e-02f, -1.253875277e-02f, +1.490423475e-03f, +2.597188372e-03f, -1.880891637e-03f, + -3.227855554e-04f, +2.284426396e-03f, -4.002268016e-03f, +2.827588058e-03f, +1.594769820e-03f, -5.956137318e-03f, +6.331621268e-03f, -2.428722834e-03f, -2.122444019e-03f, +3.770344500e-03f, -2.421157226e-03f, +5.306316939e-04f, + /* 13, 8 (12) */ + -5.578515876e-03f, -1.347707486e-02f, +5.357613724e-02f, -6.889574198e-02f, -3.176240926e-02f, +5.623688561e-01f, +5.623688561e-01f, -3.176240926e-02f, -6.889574198e-02f, +5.357613724e-02f, -1.347707486e-02f, -5.578515876e-03f, + +1.040431286e-02f, -1.270473659e-02f, -3.435542938e-03f, +3.065106358e-02f, -4.189541063e-02f, +1.975852685e-02f, +1.975852685e-02f, -4.189541063e-02f, +3.065106358e-02f, -3.435542938e-03f, -1.270473659e-02f, +1.040431286e-02f, + +1.880891637e-03f, -2.597188372e-03f, -1.490423475e-03f, +1.253875277e-02f, -2.324128453e-02f, -3.384709869e-02f, +3.092678029e-02f, +2.631442538e-02f, -1.209166992e-02f, +4.643033836e-04f, +3.132787529e-03f, -1.968436699e-03f, + -5.306316939e-04f, +2.421157226e-03f, -3.770344500e-03f, +2.122444019e-03f, +2.428722834e-03f, -6.331621268e-03f, +5.956137318e-03f, -1.594769820e-03f, -2.827588058e-03f, +4.002268016e-03f, -2.284426396e-03f, +3.227855554e-04f, + /* 13, 9 (12) */ + -3.697624239e-03f, -1.607426323e-02f, +5.208571377e-02f, -5.635698920e-02f, -5.500369378e-02f, +5.285217574e-01f, +5.932956364e-01f, -5.447983881e-03f, -8.098741190e-02f, +5.404044063e-02f, -1.034428733e-02f, -7.546952575e-03f, + +9.873681165e-03f, -1.028357937e-02f, -7.205887438e-03f, +3.277350760e-02f, -3.946668780e-02f, +1.342690558e-02f, +2.571466417e-02f, -4.349018045e-02f, +2.782347552e-02f, +5.667250777e-04f, -1.498916299e-02f, +1.072709841e-02f, + +1.757378023e-03f, -2.049415126e-03f, -2.413105708e-03f, +1.271595856e-02f, -2.006905724e-02f, -3.635725634e-02f, +2.762801186e-02f, +2.923993190e-02f, -1.136346251e-02f, -6.507683685e-04f, +3.642658580e-03f, -2.014186632e-03f, + -7.084908599e-04f, +2.495683579e-03f, -3.465815504e-03f, +1.390669949e-03f, +3.198479453e-03f, -6.571202918e-03f, +5.452312891e-03f, -7.141289846e-04f, -3.489497026e-03f, +4.153384390e-03f, -2.085513525e-03f, +8.851409983e-05f, + /* 13,10 (12) */ + -1.940246217e-03f, -1.812367836e-02f, +4.967260806e-02f, -4.364103065e-02f, -7.507275102e-02f, +4.921645011e-01f, +6.209236483e-01f, +2.379194802e-02f, -9.235087441e-02f, +5.338967226e-02f, -6.701628749e-03f, -9.561139207e-03f, + +9.165190305e-03f, -7.787895790e-03f, -1.067170294e-02f, +3.416417755e-02f, -3.626820835e-02f, +6.855702666e-03f, +3.116697706e-02f, -4.420430944e-02f, +2.433397849e-02f, +4.720109467e-03f, -1.707467651e-02f, +1.081561251e-02f, + +1.604149393e-03f, -1.502338312e-03f, -3.220865992e-03f, +1.263854492e-02f, -1.684617023e-02f, -3.843184257e-02f, +2.398835684e-02f, +3.196994916e-02f, -1.034728450e-02f, -1.837425806e-03f, +4.112837201e-03f, -2.012928481e-03f, + -8.538256948e-04f, +2.509506132e-03f, -3.098286887e-03f, +6.490759840e-04f, +3.888219826e-03f, -6.670397326e-03f, +4.830625910e-03f, +1.943883389e-04f, -4.092171844e-03f, +4.217145811e-03f, -1.826031572e-03f, -1.676420501e-04f, + /* 13,11 (12) */ + -3.360968235e-04f, -1.962601667e-02f, +4.645174207e-02f, -3.100248573e-02f, -9.191892125e-02f, +4.537326585e-01f, +6.449120051e-01f, +5.576189718e-02f, -1.026981589e-01f, +5.155224645e-02f, -2.588791548e-03f, -1.157406769e-02f, + +8.311364610e-03f, -5.278389659e-03f, -1.376998983e-02f, +3.481325353e-02f, -3.237998852e-02f, +1.853053405e-04f, +3.599760297e-02f, -4.400992110e-02f, +2.024180665e-02f, +8.937255278e-03f, -1.890070809e-02f, +1.064797046e-02f, + +1.427700933e-03f, -9.679029306e-04f, -3.905278222e-03f, +1.232532905e-02f, -1.362013635e-02f, -4.005208349e-02f, +2.005068065e-02f, +3.445813591e-02f, -9.041013575e-03f, -3.075612377e-03f, +4.529248377e-03f, -1.960246185e-03f, + -9.651380799e-04f, +2.465544739e-03f, -2.678492060e-03f, -8.571990451e-05f, +4.484154052e-03f, -6.627884225e-03f, +4.104240237e-03f, +1.111089860e-03f, -4.620613922e-03f, +4.188873780e-03f, -1.509211753e-03f, -4.402390107e-04f, + /* 13,12 (12) */ + +1.091604109e-03f, -2.059391960e-02f, +4.254646384e-02f, -1.867715668e-02f, -1.055390576e-01f, +4.136805750e-01f, +6.649626858e-01f, +9.022003309e-02f, -1.117391725e-01f, +4.847663407e-02f, +1.940456828e-03f, -1.353431387e-02f, + +7.346226530e-03f, -2.812844920e-03f, -1.644848189e-02f, +3.472753363e-02f, -2.789583447e-02f, -6.442578884e-03f, +4.010184321e-02f, -4.289883124e-02f, +1.562119273e-02f, +1.312612906e-02f, -2.040991984e-02f, +1.020773145e-02f, + +1.234589995e-03f, -4.569213542e-04f, -4.460965481e-03f, +1.179818850e-02f, -1.043679735e-02f, -4.120606284e-02f, +1.586250597e-02f, +3.666047687e-02f, -7.447495839e-03f, -4.342835993e-03f, +4.878026907e-03f, -1.852695523e-03f, + -1.041954536e-03f, +2.368001990e-03f, -2.217996040e-03f, -7.976759417e-04f, +4.974811001e-03f, -6.445521069e-03f, +3.288711431e-03f, +2.015850099e-03f, -5.061203430e-03f, +4.065933899e-03f, -1.139889429e-03f, -7.230348342e-04f, + /* 13,13 (12) */ + +2.326194104e-03f, -2.105084095e-02f, +3.808549836e-02f, -6.878968176e-03f, -1.159758550e-01f, +3.724745122e-01f, +6.808251917e-01f, +1.268805100e-01f, -1.191866683e-01f, +4.413379808e-02f, +6.818483736e-03f, -1.538700940e-02f, + +6.304271994e-03f, -4.448429299e-04f, -1.866647793e-02f, +3.392985768e-02f, -2.292102347e-02f, -1.288809995e-02f, +4.339055464e-02f, -4.088298114e-02f, +1.055998930e-02f, +1.719206296e-02f, -2.154980927e-02f, +9.484696619e-03f, + +1.031266552e-03f, +2.109602172e-05f, -4.885529654e-03f, +1.108152461e-02f, -7.339615338e-03f, -4.188882392e-02f, +1.147528507e-02f, +3.853607120e-02f, -5.574705484e-03f, -5.614487418e-03f, +5.145852489e-03f, -1.687965768e-03f, + -1.084783716e-03f, +2.222199009e-03f, -1.728888211e-03f, -1.471688198e-03f, +5.351268396e-03f, -6.128281347e-03f, +2.401635327e-03f, +2.888573507e-03f, -5.402051594e-03f, +3.847864393e-03f, -7.244470526e-04f, -1.009122428e-03f, + /* 13,14 (12) */ + +3.357460656e-03f, -2.102974493e-02f, +3.319996871e-02f, +4.202556435e-03f, -1.233154703e-01f, +3.305856883e-01f, +6.923004768e-01f, +1.654165812e-01f, -1.247613738e-01f, +3.851931066e-02f, +1.196433622e-02f, -1.707497516e-02f, + +5.219488278e-03f, +1.777356079e-03f, -2.039536614e-02f, +3.245816949e-02f, -1.756975507e-02f, -1.901638130e-02f, +4.579218997e-02f, -3.799440763e-02f, +5.157937705e-03f, +2.103992735e-02f, -2.227425632e-02f, +8.475574192e-03f, + +8.239172206e-04f, +4.580705590e-04f, -5.179423709e-03f, +1.020170031e-02f, -4.369024788e-03f, -4.210235210e-02f, +6.943602019e-03f, +4.004788218e-02f, -3.435813779e-03f, -6.864218062e-03f, +5.320292410e-03f, -1.465023136e-03f, + -1.095048359e-03f, +2.034388843e-03f, -1.223471859e-03f, -2.093921463e-03f, +5.607319388e-03f, -5.684120067e-03f, +1.462247758e-03f, +3.709661828e-03f, -5.633317814e-03f, +3.536453862e-03f, -2.707142018e-04f, -1.291087560e-03f, + /* 13,15 (12) */ + +4.181377877e-03f, -2.057167437e-02f, +2.802054500e-02f, +1.440425674e-02f, -1.276844951e-01f, +2.884833362e-01f, +6.992440788e-01f, +2.054644633e-01f, -1.281971876e-01f, +3.165509260e-02f, +1.728462863e-02f, -1.853999830e-02f, + +4.124439920e-03f, +3.811744922e-03f, -2.161883800e-02f, +3.036424802e-02f, -1.196243568e-02f, -2.470050137e-02f, +4.725443772e-02f, -3.428474580e-02f, -4.753801099e-04f, +2.457638121e-02f, -2.254497052e-02f, +7.184486632e-03f, + +6.183259736e-04f, +8.474447504e-04f, -5.345771948e-03f, +9.186464064e-03f, -1.561855693e-03f, -4.185543920e-02f, +2.324318892e-03f, +4.116343363e-02f, -1.049163186e-03f, -8.064371797e-03f, +5.390144418e-03f, -1.184231324e-03f, + -1.074994695e-03f, +1.811553195e-03f, -7.139584264e-04f, -2.652101873e-03f, +5.739572450e-03f, -5.123770053e-03f, +4.909849421e-04f, +4.460474383e-03f, -5.747483122e-03f, +3.135764939e-03f, +2.121741000e-04f, -1.561188515e-03f, + /* 14, 0 (12) */ + -1.410093151e-02f, +3.419766284e-04f, +5.130286695e-02f, -1.354692140e-01f, +2.168036256e-01f, +7.493138204e-01f, +2.168036256e-01f, -1.354692140e-01f, +5.130286695e-02f, +3.419766284e-04f, -1.410093151e-02f, +7.849149075e-03f, + +1.318985173e-02f, -2.245225355e-02f, +1.749789399e-02f, +5.877664802e-03f, -3.469299762e-02f, +4.774542267e-02f, -3.469299762e-02f, +5.877664802e-03f, +1.749789399e-02f, -2.245225355e-02f, +1.318985173e-02f, -2.890388553e-03f, + +2.745419839e-03f, -5.602318518e-03f, +4.928606858e-03f, +6.796646308e-03f, -4.562390801e-02f, -2.815303834e-03f, +4.697920925e-02f, -4.177716757e-03f, -6.534362190e-03f, +6.059730374e-03f, -2.658997945e-03f, +4.566687215e-04f, + +2.338514229e-04f, +1.800862557e-03f, -4.580061513e-03f, +5.864122748e-03f, -3.930391905e-03f, -5.565917689e-04f, +4.784909270e-03f, -6.128420019e-03f, +4.314624777e-03f, -1.335481562e-03f, -5.978506604e-04f, +8.509417120e-04f, + /* 14, 1 (12) */ + -1.135551167e-02f, -5.260341890e-03f, +5.623147381e-02f, -1.286725677e-01f, +1.711797175e-01f, +7.464985165e-01f, +2.637828348e-01f, -1.396469308e-01f, +4.476850476e-02f, +6.401707002e-03f, -1.675992945e-02f, +8.305817796e-03f, + +1.342370315e-02f, -2.065139100e-02f, +1.291783248e-02f, +1.174178755e-02f, -3.862338952e-02f, +4.718883090e-02f, -2.990808835e-02f, -2.507552168e-04f, +2.181251877e-02f, -2.378773512e-02f, +1.259200106e-02f, -2.039446841e-03f, + +2.756110696e-03f, -5.049578208e-03f, +3.327764201e-03f, +9.069131594e-03f, -4.375754401e-02f, -8.405849777e-03f, +4.778647217e-02f, -1.238294600e-03f, -8.107778843e-03f, +6.402895568e-03f, -2.492459402e-03f, +2.711311382e-04f, + -1.116907677e-04f, +2.199803878e-03f, -4.726214325e-03f, +5.464975734e-03f, -2.990800672e-03f, -1.656107509e-03f, +5.532377135e-03f, -6.248513983e-03f, +3.932921792e-03f, -8.130708818e-04f, -9.709400403e-04f, +1.018386892e-03f, + /* 14, 2 (12) */ + -8.599400971e-03f, -1.030992010e-02f, +5.955923801e-02f, -1.196034361e-01f, +1.274221735e-01f, +7.380926668e-01f, +3.115693070e-01f, -1.408852254e-01f, +3.666072592e-02f, +1.280460257e-02f, -1.925238885e-02f, +8.576948934e-03f, + +1.331201238e-02f, -1.845158712e-02f, +8.191618156e-03f, +1.720676328e-02f, -4.161419019e-02f, +4.553272339e-02f, -2.437571121e-02f, -6.499269200e-03f, +2.574544056e-02f, -2.460080600e-02f, +1.162106102e-02f, -1.021059949e-03f, + +2.697088195e-03f, -4.421405436e-03f, +1.766623025e-03f, +1.097675708e-02f, -4.142464471e-02f, -1.387692040e-02f, +4.801710527e-02f, +1.988346942e-03f, -9.609836412e-03f, +6.614417865e-03f, -2.243295030e-03f, +5.351716407e-05f, + -4.304528982e-04f, +2.525050957e-03f, -4.753218382e-03f, +4.943560352e-03f, -1.990037500e-03f, -2.714971521e-03f, +6.153333419e-03f, -6.218584674e-03f, +3.441131336e-03f, -2.450155674e-04f, -1.342939161e-03f, +1.170206406e-03f, + /* 14, 3 (12) */ + -5.902312776e-03f, -1.473132553e-02f, +6.132586104e-02f, -1.086266790e-01f, +8.599752882e-02f, +7.242157464e-01f, +3.595864122e-01f, -1.388968784e-01f, +2.705088951e-02f, +1.941902044e-02f, -2.149568388e-02f, +8.630466098e-03f, + +1.288155948e-02f, -1.592653616e-02f, +3.438399775e-03f, +2.215032364e-02f, -4.360422769e-02f, +4.281775187e-02f, -1.822237779e-02f, -1.271785387e-02f, +2.918657190e-02f, -2.484582157e-02f, +1.027812186e-02f, +1.491464571e-04f, + +2.575730357e-03f, -3.738137478e-03f, +2.769020939e-04f, +1.250869927e-02f, -3.867632697e-02f, -1.915121740e-02f, +4.765158391e-02f, +5.461986348e-03f, -1.100051256e-02f, +6.678961521e-03f, -1.911080636e-03f, -1.926354590e-04f, + -7.153451349e-04f, +2.771618498e-03f, -4.664268634e-03f, +4.315299818e-03f, -9.532978677e-04f, -3.707245444e-03f, +6.631355119e-03f, -6.036561645e-03f, +2.848514420e-03f, +3.555680957e-04f, -1.703120183e-03f, +1.299970873e-03f, + /* 14, 4 (12) */ + -3.326582419e-03f, -1.846946301e-02f, +6.160276313e-02f, -9.611797976e-02f, +4.732120185e-02f, +7.050645290e-01f, +4.072379962e-01f, -1.334348921e-01f, +1.605037695e-02f, +2.609798196e-02f, -2.340676452e-02f, +8.437830640e-03f, + +1.216621435e-02f, -1.315491766e-02f, -1.225868860e-03f, +2.646562345e-02f, -4.455752556e-02f, +3.911050642e-02f, -1.159102267e-02f, -1.875441552e-02f, +3.203508632e-02f, -2.449025347e-02f, +8.575001680e-03f, +1.449117330e-03f, + +2.400485196e-03f, -3.020036623e-03f, -1.113261403e-03f, +1.366162750e-02f, -3.556922577e-02f, -2.415492089e-02f, +4.667996772e-02f, +9.135982298e-03f, -1.223960915e-02f, +6.583770282e-03f, -1.497641809e-03f, -4.625628530e-04f, + -9.606550012e-04f, +2.936836755e-03f, -4.465446619e-03f, +3.598004813e-03f, +9.359009452e-05f, -4.608702375e-03f, +6.953507460e-03f, -5.704242686e-03f, +2.167248376e-03f, +9.741348398e-04f, -2.040502789e-03f, +1.401524761e-03f, + /* 14, 5 (12) */ + -9.260972236e-04f, -2.148949964e-02f, +6.048950173e-02f, -8.245635226e-02f, +1.175197608e-02f, +6.809096081e-01f, +4.539179639e-01f, -1.242989098e-01f, +3.810767804e-03f, +3.268175224e-02f, -2.490440633e-02f, +7.975267787e-03f, + +1.120555935e-02f, -1.021808091e-02f, -5.691315478e-03f, +3.006362827e-02f, -4.446393547e-02f, +3.450180405e-02f, -4.637515215e-03f, -2.445865820e-02f, +3.420233470e-02f, -2.351611863e-02f, +6.534498892e-03f, +2.850642091e-03f, + +2.180570531e-03f, -2.286805629e-03f, -2.379720004e-03f, +1.443945634e-02f, -3.216433750e-02f, -2.881898275e-02f, +4.510223989e-02f, +1.295795041e-02f, -1.328762090e-02f, +6.319152879e-03f, -1.007167819e-03f, -7.503236984e-04f, + -1.162143957e-03f, +3.020331197e-03f, -4.165473924e-03f, +2.811364148e-03f, +1.124836684e-03f, -5.397446933e-03f, +7.110704025e-03f, -5.227310602e-03f, +1.412176509e-03f, +1.595064181e-03f, -2.344170140e-03f, +1.469207754e-03f, + /* 14, 6 (12) */ + +1.254473307e-03f, -2.377630526e-02f, +5.810978172e-02f, -6.801689592e-02f, -2.041236142e-02f, +6.520906253e-01f, +4.990202038e-01f, -1.113409594e-01f, -9.476853099e-03f, +3.900090512e-02f, -2.591157415e-02f, +7.224944088e-03f, + +1.004341539e-02f, -7.197749712e-03f, -9.856789402e-03f, +3.287499242e-02f, -4.333909878e-02f, +2.910435712e-02f, +2.473188810e-03f, -2.968596881e-02f, +3.561451120e-02f, -2.192105445e-02f, +4.190328751e-03f, +4.319849845e-03f, + +1.925672532e-03f, -1.557145055e-03f, -3.502616021e-03f, +1.485295954e-02f, -2.852580292e-02f, -3.308032475e-02f, +4.292845926e-02f, +1.687057779e-02f, -1.410662851e-02f, +5.878921212e-03f, -4.462684529e-04f, -1.048887163e-03f, + -1.317095431e-03f, +3.023938398e-03f, -3.775401019e-03f, +1.976395230e-03f, +2.115353784e-03f, -6.054472941e-03f, +7.097967562e-03f, -4.615246101e-03f, +6.004783629e-04f, +2.202057061e-03f, -2.603596979e-03f, +1.498071419e-03f, + /* 14, 7 (12) */ + +3.180145839e-03f, -2.533345032e-02f, +5.460716570e-02f, -5.316393638e-02f, -4.893816433e-02f, +6.190103006e-01f, +5.419486630e-01f, -9.447038158e-02f, -2.358348161e-02f, +4.487982633e-02f, -2.635784260e-02f, +6.176056925e-03f, + +8.726319957e-03f, -4.173811314e-03f, -1.363219042e-02f, +3.485138765e-02f, -4.122374500e-02f, +2.304988417e-02f, +9.571156372e-03f, -3.430121491e-02f, +3.621498957e-02f, -1.971899739e-02f, +1.586731773e-03f, +5.817921264e-03f, + +1.645651143e-03f, -8.483611332e-04f, -4.466571399e-03f, +1.491925798e-02f, -2.471965556e-02f, -3.688291761e-02f, +4.017871996e-02f, +2.081256169e-02f, -1.466119679e-02f, +5.260767975e-03f, +1.760311468e-04f, -1.350259943e-03f, + -1.424314870e-03f, +2.951562769e-03f, -3.308241767e-03f, +1.114869941e-03f, +3.041392397e-03f, -6.564143945e-03f, +6.914583858e-03f, -3.881137696e-03f, -2.487319811e-04f, +2.778565199e-03f, -2.808980318e-03f, +1.484083824e-03f, + /* 14, 8 (12) */ + +4.825796983e-03f, -2.618181145e-02f, +5.014059430e-02f, -3.824467840e-02f, -7.365781989e-02f, +5.821273830e-01f, +5.821273830e-01f, -7.365781989e-02f, -3.824467840e-02f, +5.014059430e-02f, -2.618181145e-02f, +4.825796983e-03f, + +7.302005088e-03f, -1.222248545e-03f, -1.694043219e-02f, +3.596625759e-02f, -3.818235260e-02f, +1.648574023e-02f, +1.648574023e-02f, -3.818235260e-02f, +3.596625759e-02f, -1.694043219e-02f, -1.222248545e-03f, +7.302005088e-03f, + +1.350259943e-03f, -1.760311468e-04f, -5.260767975e-03f, +1.466119679e-02f, -2.081256169e-02f, -4.017871996e-02f, +3.688291761e-02f, +2.471965556e-02f, -1.491925798e-02f, +4.466571399e-03f, +8.483611332e-04f, -1.645651143e-03f, + -1.484083824e-03f, +2.808980318e-03f, -2.778565199e-03f, +2.487319811e-04f, +3.881137696e-03f, -6.914583858e-03f, +6.564143945e-03f, -3.041392397e-03f, -1.114869941e-03f, +3.308241767e-03f, -2.951562769e-03f, +1.424314870e-03f, + /* 14, 9 (12) */ + +6.176056925e-03f, -2.635784260e-02f, +4.487982633e-02f, -2.358348161e-02f, -9.447038158e-02f, +5.419486630e-01f, +6.190103006e-01f, -4.893816433e-02f, -5.316393638e-02f, +5.460716570e-02f, -2.533345032e-02f, +3.180145839e-03f, + +5.817921264e-03f, +1.586731773e-03f, -1.971899739e-02f, +3.621498957e-02f, -3.430121491e-02f, +9.571156372e-03f, +2.304988417e-02f, -4.122374500e-02f, +3.485138765e-02f, -1.363219042e-02f, -4.173811314e-03f, +8.726319957e-03f, + +1.048887163e-03f, +4.462684529e-04f, -5.878921212e-03f, +1.410662851e-02f, -1.687057779e-02f, -4.292845926e-02f, +3.308032475e-02f, +2.852580292e-02f, -1.485295954e-02f, +3.502616021e-03f, +1.557145055e-03f, -1.925672532e-03f, + -1.498071419e-03f, +2.603596979e-03f, -2.202057061e-03f, -6.004783629e-04f, +4.615246101e-03f, -7.097967562e-03f, +6.054472941e-03f, -2.115353784e-03f, -1.976395230e-03f, +3.775401019e-03f, -3.023938398e-03f, +1.317095431e-03f, + /* 14,10 (12) */ + +7.224944088e-03f, -2.591157415e-02f, +3.900090512e-02f, -9.476853099e-03f, -1.113409594e-01f, +4.990202038e-01f, +6.520906253e-01f, -2.041236142e-02f, -6.801689592e-02f, +5.810978172e-02f, -2.377630526e-02f, +1.254473307e-03f, + +4.319849845e-03f, +4.190328751e-03f, -2.192105445e-02f, +3.561451120e-02f, -2.968596881e-02f, +2.473188810e-03f, +2.910435712e-02f, -4.333909878e-02f, +3.287499242e-02f, -9.856789402e-03f, -7.197749712e-03f, +1.004341539e-02f, + +7.503236984e-04f, +1.007167819e-03f, -6.319152879e-03f, +1.328762090e-02f, -1.295795041e-02f, -4.510223989e-02f, +2.881898275e-02f, +3.216433750e-02f, -1.443945634e-02f, +2.379720004e-03f, +2.286805629e-03f, -2.180570531e-03f, + -1.469207754e-03f, +2.344170140e-03f, -1.595064181e-03f, -1.412176509e-03f, +5.227310602e-03f, -7.110704025e-03f, +5.397446933e-03f, -1.124836684e-03f, -2.811364148e-03f, +4.165473924e-03f, -3.020331197e-03f, +1.162143957e-03f, + /* 14,11 (12) */ + +7.975267787e-03f, -2.490440633e-02f, +3.268175224e-02f, +3.810767804e-03f, -1.242989098e-01f, +4.539179639e-01f, +6.809096081e-01f, +1.175197608e-02f, -8.245635226e-02f, +6.048950173e-02f, -2.148949964e-02f, -9.260972236e-04f, + +2.850642091e-03f, +6.534498892e-03f, -2.351611863e-02f, +3.420233470e-02f, -2.445865820e-02f, -4.637515215e-03f, +3.450180405e-02f, -4.446393547e-02f, +3.006362827e-02f, -5.691315478e-03f, -1.021808091e-02f, +1.120555935e-02f, + +4.625628530e-04f, +1.497641809e-03f, -6.583770282e-03f, +1.223960915e-02f, -9.135982298e-03f, -4.667996772e-02f, +2.415492089e-02f, +3.556922577e-02f, -1.366162750e-02f, +1.113261403e-03f, +3.020036623e-03f, -2.400485196e-03f, + -1.401524761e-03f, +2.040502789e-03f, -9.741348398e-04f, -2.167248376e-03f, +5.704242686e-03f, -6.953507460e-03f, +4.608702375e-03f, -9.359009452e-05f, -3.598004813e-03f, +4.465446619e-03f, -2.936836755e-03f, +9.606550012e-04f, + /* 14,12 (12) */ + +8.437830640e-03f, -2.340676452e-02f, +2.609798196e-02f, +1.605037695e-02f, -1.334348921e-01f, +4.072379962e-01f, +7.050645290e-01f, +4.732120185e-02f, -9.611797976e-02f, +6.160276313e-02f, -1.846946301e-02f, -3.326582419e-03f, + +1.449117330e-03f, +8.575001680e-03f, -2.449025347e-02f, +3.203508632e-02f, -1.875441552e-02f, -1.159102267e-02f, +3.911050642e-02f, -4.455752556e-02f, +2.646562345e-02f, -1.225868860e-03f, -1.315491766e-02f, +1.216621435e-02f, + +1.926354590e-04f, +1.911080636e-03f, -6.678961521e-03f, +1.100051256e-02f, -5.461986348e-03f, -4.765158391e-02f, +1.915121740e-02f, +3.867632697e-02f, -1.250869927e-02f, -2.769020939e-04f, +3.738137478e-03f, -2.575730357e-03f, + -1.299970873e-03f, +1.703120183e-03f, -3.555680957e-04f, -2.848514420e-03f, +6.036561645e-03f, -6.631355119e-03f, +3.707245444e-03f, +9.532978677e-04f, -4.315299818e-03f, +4.664268634e-03f, -2.771618498e-03f, +7.153451349e-04f, + /* 14,13 (12) */ + +8.630466098e-03f, -2.149568388e-02f, +1.941902044e-02f, +2.705088951e-02f, -1.388968784e-01f, +3.595864122e-01f, +7.242157464e-01f, +8.599752882e-02f, -1.086266790e-01f, +6.132586104e-02f, -1.473132553e-02f, -5.902312776e-03f, + +1.491464571e-04f, +1.027812186e-02f, -2.484582157e-02f, +2.918657190e-02f, -1.271785387e-02f, -1.822237779e-02f, +4.281775187e-02f, -4.360422769e-02f, +2.215032364e-02f, +3.438399775e-03f, -1.592653616e-02f, +1.288155948e-02f, + -5.351716407e-05f, +2.243295030e-03f, -6.614417865e-03f, +9.609836412e-03f, -1.988346942e-03f, -4.801710527e-02f, +1.387692040e-02f, +4.142464471e-02f, -1.097675708e-02f, -1.766623025e-03f, +4.421405436e-03f, -2.697088195e-03f, + -1.170206406e-03f, +1.342939161e-03f, +2.450155674e-04f, -3.441131336e-03f, +6.218584674e-03f, -6.153333419e-03f, +2.714971521e-03f, +1.990037500e-03f, -4.943560352e-03f, +4.753218382e-03f, -2.525050957e-03f, +4.304528982e-04f, + /* 14,14 (12) */ + +8.576948934e-03f, -1.925238885e-02f, +1.280460257e-02f, +3.666072592e-02f, -1.408852254e-01f, +3.115693070e-01f, +7.380926668e-01f, +1.274221735e-01f, -1.196034361e-01f, +5.955923801e-02f, -1.030992010e-02f, -8.599400971e-03f, + -1.021059949e-03f, +1.162106102e-02f, -2.460080600e-02f, +2.574544056e-02f, -6.499269200e-03f, -2.437571121e-02f, +4.553272339e-02f, -4.161419019e-02f, +1.720676328e-02f, +8.191618156e-03f, -1.845158712e-02f, +1.331201238e-02f, + -2.711311382e-04f, +2.492459402e-03f, -6.402895568e-03f, +8.107778843e-03f, +1.238294600e-03f, -4.778647217e-02f, +8.405849777e-03f, +4.375754401e-02f, -9.069131594e-03f, -3.327764201e-03f, +5.049578208e-03f, -2.756110696e-03f, + -1.018386892e-03f, +9.709400403e-04f, +8.130708818e-04f, -3.932921792e-03f, +6.248513983e-03f, -5.532377135e-03f, +1.656107509e-03f, +2.990800672e-03f, -5.464975734e-03f, +4.726214325e-03f, -2.199803878e-03f, +1.116907677e-04f, + /* 14,15 (12) */ + +8.305817796e-03f, -1.675992945e-02f, +6.401707002e-03f, +4.476850476e-02f, -1.396469308e-01f, +2.637828348e-01f, +7.464985165e-01f, +1.711797175e-01f, -1.286725677e-01f, +5.623147381e-02f, -5.260341890e-03f, -1.135551167e-02f, + -2.039446841e-03f, +1.259200106e-02f, -2.378773512e-02f, +2.181251877e-02f, -2.507552168e-04f, -2.990808835e-02f, +4.718883090e-02f, -3.862338952e-02f, +1.174178755e-02f, +1.291783248e-02f, -2.065139100e-02f, +1.342370315e-02f, + -4.566687215e-04f, +2.658997945e-03f, -6.059730374e-03f, +6.534362190e-03f, +4.177716757e-03f, -4.697920925e-02f, +2.815303834e-03f, +4.562390801e-02f, -6.796646308e-03f, -4.928606858e-03f, +5.602318518e-03f, -2.745419839e-03f, + -8.509417120e-04f, +5.978506604e-04f, +1.335481562e-03f, -4.314624777e-03f, +6.128420019e-03f, -4.784909270e-03f, +5.565917689e-04f, +3.930391905e-03f, -5.864122748e-03f, +4.580061513e-03f, -1.800862557e-03f, -2.338514229e-04f, + /* 15, 0 (12) */ + -9.110797801e-04f, -2.211027693e-02f, +6.880076095e-02f, -1.295915492e-01f, +1.821106279e-01f, +7.970592430e-01f, +1.821106279e-01f, -1.295915492e-01f, +6.880076095e-02f, -2.211027693e-02f, -9.110797801e-04f, +4.958760522e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +2.979271262e-03f, -3.801455961e-03f, +3.485453450e-04f, +1.266076906e-02f, -4.955429992e-02f, -3.371895603e-03f, +5.176411852e-02f, -1.030613678e-02f, -2.219737413e-03f, +4.724248812e-03f, -3.256848606e-03f, +1.307610434e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 1 (12) */ + +2.068191481e-03f, -2.591173289e-02f, +6.914930629e-02f, -1.169307801e-01f, +1.325563280e-01f, +7.936873474e-01f, +2.338747465e-01f, -1.398976860e-01f, +6.658102354e-02f, -1.738602811e-02f, -4.167928386e-03f, +6.266370955e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +2.644419928e-03f, -2.849774330e-03f, -1.398450125e-03f, +1.453410733e-02f, -4.674834468e-02f, -1.006195729e-02f, +5.331884931e-02f, -7.486808583e-03f, -4.174857051e-03f, +5.589824686e-03f, -3.463399442e-03f, +1.289518030e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 2 (12) */ + +4.712611409e-03f, -2.876150722e-02f, +6.775085617e-02f, -1.023966728e-01f, +8.580798333e-02f, +7.836253902e-01f, +2.871935958e-01f, -1.473844946e-01f, +6.240616648e-02f, -1.179620343e-02f, -7.631327828e-03f, +7.555888986e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +2.266635297e-03f, -1.896354479e-03f, -2.986595357e-03f, +1.592031743e-02f, -4.341468221e-02f, -1.659189192e-02f, +5.417043869e-02f, -4.230237732e-03f, -6.168705076e-03f, +6.369402298e-03f, -3.586234192e-03f, +1.223723570e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 3 (12) */ + +6.979246706e-03f, -3.065786170e-02f, +6.476426081e-02f, -8.647635539e-02f, +4.239330113e-02f, +7.670334982e-01f, +3.413640345e-01f, -1.516147323e-01f, +5.623746141e-02f, -5.426801130e-03f, -1.121756202e-02f, +8.779612556e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.860385222e-03f, -9.665189796e-04f, -4.387366540e-03f, +1.682399909e-02f, -3.962962484e-02f, -2.285846285e-02f, +5.428293902e-02f, -5.745752964e-04f, -8.151998138e-03f, +7.034529617e-03f, -3.614200819e-03f, +1.107335414e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 4 (12) */ + +8.839631928e-03f, -3.162438068e-02f, +6.037689427e-02f, -6.965235630e-02f, +2.763676290e-03f, +7.441750354e-01f, +3.956469735e-01f, -1.521893076e-01f, +4.808546327e-02f, +1.607728487e-03f, -1.483176284e-02f, +9.886947970e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.439830194e-03f, -8.319986772e-05f, -5.578708022e-03f, +1.725963231e-02f, -3.547563568e-02f, -2.876362326e-02f, +5.363347518e-02f, +3.431739612e-03f, -1.007236077e-02f, +7.557905122e-03f, -3.538144597e-03f, +9.389619079e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 5 (12) */ + +1.027946212e-02f, -3.170758054e-02f, +5.479818625e-02f, -5.239272399e-02f, -3.271195939e-02f, +7.154114121e-01f, +4.492804487e-01f, -1.487575680e-01f, +3.801310250e-02f, +9.165633609e-03f, -1.836990744e-02f, +1.082590988e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +1.018426574e-03f, +7.335255681e-04f, -6.545193928e-03f, +1.725082049e-02f, -3.103950081e-02f, -3.421642968e-02f, +5.221294392e-02f, +7.730639805e-03f, -1.187544439e-02f, +7.914217061e-03f, -3.351337960e-03f, +7.188840555e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 6 (12) */ + +1.129788870e-02f, -3.097405498e-02f, +4.825299232e-02f, -3.514190350e-02f, -6.375146020e-02f, +6.811949825e-01f, +5.014933926e-01f, -1.410269282e-01f, +2.613765811e-02f, +1.707985067e-02f, -2.172124540e-02f, +1.154479393e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +6.085771005e-04f, +1.466793343e-03f, -7.278017040e-03f, +1.682935477e-02f, -2.641044913e-02f, -3.913479769e-02f, +5.002642682e-02f, +1.225533168e-02f, -1.350615014e-02f, +8.080978272e-03f, -3.049865431e-03f, +4.491842562e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 7 (12) */ + +1.190646580e-02f, -2.950726163e-02f, +4.097497528e-02f, -1.831254873e-02f, -9.016190933e-02f, +6.420601848e-01f, +5.515198194e-01f, -1.287715965e-01f, +1.263150796e-02f, +2.516082894e-02f, -2.477111083e-02f, +1.199397819e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + +2.213362736e-04f, +2.103201636e-03f, -7.774813167e-03f, +1.603412792e-02f, -2.167826316e-02f, -4.344706155e-02f, +4.709330382e-02f, +1.693142400e-02f, -1.490992877e-02f, +8.039333174e-03f, -2.632949171e-03f, +1.338238810e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 8 (12) */ + +1.212780207e-02f, -2.740406000e-02f, +3.320016212e-02f, -2.278420811e-03f, -1.118401725e-01f, +5.986131232e-01f, +5.986131232e-01f, -1.118401725e-01f, -2.278420811e-03f, +3.320016212e-02f, -2.740406000e-02f, +1.212780207e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.338238810e-04f, +2.632949171e-03f, -8.039333174e-03f, +1.490992877e-02f, -1.693142400e-02f, -4.709330382e-02f, +4.344706155e-02f, +2.167826316e-02f, -1.603412792e-02f, +7.774813167e-03f, -2.103201636e-03f, -2.213362736e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15, 9 (12) */ + +1.199397819e-02f, -2.477111083e-02f, +2.516082894e-02f, +1.263150796e-02f, -1.287715965e-01f, +5.515198194e-01f, +6.420601848e-01f, -9.016190933e-02f, -1.831254873e-02f, +4.097497528e-02f, -2.950726163e-02f, +1.190646580e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -4.491842562e-04f, +3.049865431e-03f, -8.080978272e-03f, +1.350615014e-02f, -1.225533168e-02f, -5.002642682e-02f, +3.913479769e-02f, +2.641044913e-02f, -1.682935477e-02f, +7.278017040e-03f, -1.466793343e-03f, -6.085771005e-04f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,10 (12) */ + +1.154479393e-02f, -2.172124540e-02f, +1.707985067e-02f, +2.613765811e-02f, -1.410269282e-01f, +5.014933926e-01f, +6.811949825e-01f, -6.375146020e-02f, -3.514190350e-02f, +4.825299232e-02f, -3.097405498e-02f, +1.129788870e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -7.188840555e-04f, +3.351337960e-03f, -7.914217061e-03f, +1.187544439e-02f, -7.730639805e-03f, -5.221294392e-02f, +3.421642968e-02f, +3.103950081e-02f, -1.725082049e-02f, +6.545193928e-03f, -7.335255681e-04f, -1.018426574e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,11 (12) */ + +1.082590988e-02f, -1.836990744e-02f, +9.165633609e-03f, +3.801310250e-02f, -1.487575680e-01f, +4.492804487e-01f, +7.154114121e-01f, -3.271195939e-02f, -5.239272399e-02f, +5.479818625e-02f, -3.170758054e-02f, +1.027946212e-02f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -9.389619079e-04f, +3.538144597e-03f, -7.557905122e-03f, +1.007236077e-02f, -3.431739612e-03f, -5.363347518e-02f, +2.876362326e-02f, +3.547563568e-02f, -1.725963231e-02f, +5.578708022e-03f, +8.319986772e-05f, -1.439830194e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,12 (12) */ + +9.886947970e-03f, -1.483176284e-02f, +1.607728487e-03f, +4.808546327e-02f, -1.521893076e-01f, +3.956469735e-01f, +7.441750354e-01f, +2.763676290e-03f, -6.965235630e-02f, +6.037689427e-02f, -3.162438068e-02f, +8.839631928e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.107335414e-03f, +3.614200819e-03f, -7.034529617e-03f, +8.151998138e-03f, +5.745752964e-04f, -5.428293902e-02f, +2.285846285e-02f, +3.962962484e-02f, -1.682399909e-02f, +4.387366540e-03f, +9.665189796e-04f, -1.860385222e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,13 (12) */ + +8.779612556e-03f, -1.121756202e-02f, -5.426801130e-03f, +5.623746141e-02f, -1.516147323e-01f, +3.413640345e-01f, +7.670334982e-01f, +4.239330113e-02f, -8.647635539e-02f, +6.476426081e-02f, -3.065786170e-02f, +6.979246706e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.223723570e-03f, +3.586234192e-03f, -6.369402298e-03f, +6.168705076e-03f, +4.230237732e-03f, -5.417043869e-02f, +1.659189192e-02f, +4.341468221e-02f, -1.592031743e-02f, +2.986595357e-03f, +1.896354479e-03f, -2.266635297e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,14 (12) */ + +7.555888986e-03f, -7.631327828e-03f, -1.179620343e-02f, +6.240616648e-02f, -1.473844946e-01f, +2.871935958e-01f, +7.836253902e-01f, +8.580798333e-02f, -1.023966728e-01f, +6.775085617e-02f, -2.876150722e-02f, +4.712611409e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.289518030e-03f, +3.463399442e-03f, -5.589824686e-03f, +4.174857051e-03f, +7.486808583e-03f, -5.331884931e-02f, +1.006195729e-02f, +4.674834468e-02f, -1.453410733e-02f, +1.398450125e-03f, +2.849774330e-03f, -2.644419928e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + /* 15,15 (12) */ + +6.266370955e-03f, -4.167928386e-03f, -1.738602811e-02f, +6.658102354e-02f, -1.398976860e-01f, +2.338747465e-01f, +7.936873474e-01f, +1.325563280e-01f, -1.169307801e-01f, +6.914930629e-02f, -2.591173289e-02f, +2.068191481e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + -1.307610434e-03f, +3.256848606e-03f, -4.724248812e-03f, +2.219737413e-03f, +1.030613678e-02f, -5.176411852e-02f, +3.371895603e-03f, +4.955429992e-02f, -1.266076906e-02f, -3.485453450e-04f, +3.801455961e-03f, -2.979271262e-03f, + +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, +0.000000000e+00f, + } +}; + diff --git a/love/src/jni/openal-soft-1.18.2/cmake/CheckFileOffsetBits.c b/love/src/jni/openal-soft-1.19.1/cmake/CheckFileOffsetBits.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/CheckFileOffsetBits.c rename to love/src/jni/openal-soft-1.19.1/cmake/CheckFileOffsetBits.c diff --git a/love/src/jni/openal-soft-1.18.2/cmake/CheckFileOffsetBits.cmake b/love/src/jni/openal-soft-1.19.1/cmake/CheckFileOffsetBits.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/CheckFileOffsetBits.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/CheckFileOffsetBits.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/CheckSharedFunctionExists.cmake b/love/src/jni/openal-soft-1.19.1/cmake/CheckSharedFunctionExists.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/CheckSharedFunctionExists.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/CheckSharedFunctionExists.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindALSA.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindALSA.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindALSA.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindALSA.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindAudioIO.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindAudioIO.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindAudioIO.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindAudioIO.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindDSound.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindDSound.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindDSound.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindDSound.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindFFmpeg.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindFFmpeg.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindFFmpeg.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindFFmpeg.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindJACK.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindJACK.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindJACK.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindJACK.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindOSS.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindOSS.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindOSS.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindOSS.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindPortAudio.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindPortAudio.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindPortAudio.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindPortAudio.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindPulseAudio.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindPulseAudio.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindPulseAudio.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindPulseAudio.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindQSA.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindQSA.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindQSA.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindQSA.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindSDL2.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindSDL2.cmake similarity index 93% rename from love/src/jni/openal-soft-1.18.2/cmake/FindSDL2.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindSDL2.cmake index 70e607a8..e808d006 100644 --- a/love/src/jni/openal-soft-1.18.2/cmake/FindSDL2.cmake +++ b/love/src/jni/openal-soft-1.19.1/cmake/FindSDL2.cmake @@ -18,10 +18,10 @@ # module will automatically add the -framework Cocoa on your behalf. # # -# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration +# Additional Note: If you see an empty SDL2_CORE_LIBRARY in your configuration # and no SDL2_LIBRARY, it means CMake did not find your SDL2 library # (SDL2.dll, libsdl2.so, SDL2.framework, etc). -# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again. +# Set SDL2_CORE_LIBRARY to point to your SDL2 library, and configure again. # Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value # as appropriate. These values are used to generate the final SDL2_LIBRARY # variable, but when these values are unset, SDL2_LIBRARY does not get created. @@ -87,7 +87,7 @@ FIND_PATH(SDL2_INCLUDE_DIR SDL.h ) #MESSAGE("SDL2_INCLUDE_DIR is ${SDL2_INCLUDE_DIR}") -FIND_LIBRARY(SDL2_LIBRARY_TEMP +FIND_LIBRARY(SDL2_CORE_LIBRARY NAMES SDL2 HINTS $ENV{SDL2DIR} @@ -98,8 +98,7 @@ FIND_LIBRARY(SDL2_LIBRARY_TEMP /opt/csw /opt ) - -#MESSAGE("SDL2_LIBRARY_TEMP is ${SDL2_LIBRARY_TEMP}") +#MESSAGE("SDL2_CORE_LIBRARY is ${SDL2_CORE_LIBRARY}") IF(NOT SDL2_BUILDING_LIBRARY) IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") @@ -137,7 +136,9 @@ IF(MINGW) ENDIF(MINGW) SET(SDL2_FOUND "NO") -IF(SDL2_LIBRARY_TEMP) +IF(SDL2_CORE_LIBRARY) + SET(SDL2_LIBRARY_TEMP ${SDL2_CORE_LIBRARY}) + # For SDL2main IF(NOT SDL2_BUILDING_LIBRARY) IF(SDL2MAIN_LIBRARY) @@ -172,15 +173,12 @@ IF(SDL2_LIBRARY_TEMP) ENDIF(WIN32) # Set the final string here so the GUI reflects the final state. - SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found") - # Set the temp variable to INTERNAL so it is not seen in the CMake GUI - SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") + SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP}) SET(SDL2_FOUND "YES") -ENDIF(SDL2_LIBRARY_TEMP) +ENDIF(SDL2_CORE_LIBRARY) INCLUDE(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR) diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindSDL_sound.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindSDL_sound.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindSDL_sound.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindSDL_sound.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindSoundIO.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindSoundIO.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindSoundIO.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindSoundIO.cmake diff --git a/love/src/jni/openal-soft-1.18.2/cmake/FindWindowsSDK.cmake b/love/src/jni/openal-soft-1.19.1/cmake/FindWindowsSDK.cmake similarity index 100% rename from love/src/jni/openal-soft-1.18.2/cmake/FindWindowsSDK.cmake rename to love/src/jni/openal-soft-1.19.1/cmake/FindWindowsSDK.cmake diff --git a/love/src/jni/openal-soft-1.19.1/common/alcomplex.c b/love/src/jni/openal-soft-1.19.1/common/alcomplex.c new file mode 100644 index 00000000..d4045aeb --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/common/alcomplex.c @@ -0,0 +1,92 @@ + +#include "config.h" + +#include "alcomplex.h" +#include "math_defs.h" + + +extern inline ALcomplex complex_add(ALcomplex a, ALcomplex b); +extern inline ALcomplex complex_sub(ALcomplex a, ALcomplex b); +extern inline ALcomplex complex_mult(ALcomplex a, ALcomplex b); + +void complex_fft(ALcomplex *FFTBuffer, ALsizei FFTSize, ALdouble Sign) +{ + ALsizei i, j, k, mask, step, step2; + ALcomplex temp, u, w; + ALdouble arg; + + /* Bit-reversal permutation applied to a sequence of FFTSize items */ + for(i = 1;i < FFTSize-1;i++) + { + for(mask = 0x1, j = 0;mask < FFTSize;mask <<= 1) + { + if((i&mask) != 0) + j++; + j <<= 1; + } + j >>= 1; + + if(i < j) + { + temp = FFTBuffer[i]; + FFTBuffer[i] = FFTBuffer[j]; + FFTBuffer[j] = temp; + } + } + + /* Iterative form of Danielson–Lanczos lemma */ + for(i = 1, step = 2;i < FFTSize;i<<=1, step<<=1) + { + step2 = step >> 1; + arg = M_PI / step2; + + w.Real = cos(arg); + w.Imag = sin(arg) * Sign; + + u.Real = 1.0; + u.Imag = 0.0; + + for(j = 0;j < step2;j++) + { + for(k = j;k < FFTSize;k+=step) + { + temp = complex_mult(FFTBuffer[k+step2], u); + FFTBuffer[k+step2] = complex_sub(FFTBuffer[k], temp); + FFTBuffer[k] = complex_add(FFTBuffer[k], temp); + } + + u = complex_mult(u, w); + } + } +} + +void complex_hilbert(ALcomplex *Buffer, ALsizei size) +{ + const ALdouble inverse_size = 1.0/(ALdouble)size; + ALsizei todo, i; + + for(i = 0;i < size;i++) + Buffer[i].Imag = 0.0; + + complex_fft(Buffer, size, 1.0); + + todo = size >> 1; + Buffer[0].Real *= inverse_size; + Buffer[0].Imag *= inverse_size; + for(i = 1;i < todo;i++) + { + Buffer[i].Real *= 2.0*inverse_size; + Buffer[i].Imag *= 2.0*inverse_size; + } + Buffer[i].Real *= inverse_size; + Buffer[i].Imag *= inverse_size; + i++; + + for(;i < size;i++) + { + Buffer[i].Real = 0.0; + Buffer[i].Imag = 0.0; + } + + complex_fft(Buffer, size, -1.0); +} diff --git a/love/src/jni/openal-soft-1.19.1/common/alcomplex.h b/love/src/jni/openal-soft-1.19.1/common/alcomplex.h new file mode 100644 index 00000000..2418ce78 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/common/alcomplex.h @@ -0,0 +1,71 @@ +#ifndef ALCOMPLEX_H +#define ALCOMPLEX_H + +#include "AL/al.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ALcomplex { + ALdouble Real; + ALdouble Imag; +} ALcomplex; + +/** Addition of two complex numbers. */ +inline ALcomplex complex_add(ALcomplex a, ALcomplex b) +{ + ALcomplex result; + + result.Real = a.Real + b.Real; + result.Imag = a.Imag + b.Imag; + + return result; +} + +/** Subtraction of two complex numbers. */ +inline ALcomplex complex_sub(ALcomplex a, ALcomplex b) +{ + ALcomplex result; + + result.Real = a.Real - b.Real; + result.Imag = a.Imag - b.Imag; + + return result; +} + +/** Multiplication of two complex numbers. */ +inline ALcomplex complex_mult(ALcomplex a, ALcomplex b) +{ + ALcomplex result; + + result.Real = a.Real*b.Real - a.Imag*b.Imag; + result.Imag = a.Imag*b.Real + a.Real*b.Imag; + + return result; +} + +/** + * Iterative implementation of 2-radix FFT (In-place algorithm). Sign = -1 is + * FFT and 1 is iFFT (inverse). Fills FFTBuffer[0...FFTSize-1] with the + * Discrete Fourier Transform (DFT) of the time domain data stored in + * FFTBuffer[0...FFTSize-1]. FFTBuffer is an array of complex numbers, FFTSize + * MUST BE power of two. + */ +void complex_fft(ALcomplex *FFTBuffer, ALsizei FFTSize, ALdouble Sign); + +/** + * Calculate the complex helical sequence (discrete-time analytical signal) of + * the given input using the discrete Hilbert transform (In-place algorithm). + * Fills Buffer[0...size-1] with the discrete-time analytical signal stored in + * Buffer[0...size-1]. Buffer is an array of complex numbers, size MUST BE + * power of two. + */ +void complex_hilbert(ALcomplex *Buffer, ALsizei size); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* ALCOMPLEX_H */ diff --git a/love/src/jni/openal-soft-1.18.2/common/align.h b/love/src/jni/openal-soft-1.19.1/common/align.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/align.h rename to love/src/jni/openal-soft-1.19.1/common/align.h diff --git a/love/src/jni/openal-soft-1.18.2/common/almalloc.c b/love/src/jni/openal-soft-1.19.1/common/almalloc.c similarity index 56% rename from love/src/jni/openal-soft-1.18.2/common/almalloc.c rename to love/src/jni/openal-soft-1.19.1/common/almalloc.c index 8c1c5794..0d982ca1 100644 --- a/love/src/jni/openal-soft-1.18.2/common/almalloc.c +++ b/love/src/jni/openal-soft-1.19.1/common/almalloc.c @@ -10,8 +10,20 @@ #endif #ifdef HAVE_WINDOWS_H #include +#else +#include #endif + +#ifdef __GNUC__ +#define LIKELY(x) __builtin_expect(!!(x), !0) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define LIKELY(x) (!!(x)) +#define UNLIKELY(x) (!!(x)) +#endif + + void *al_malloc(size_t alignment, size_t size) { #if defined(HAVE_ALIGNED_ALLOC) @@ -60,3 +72,39 @@ void al_free(void *ptr) } #endif } + +size_t al_get_page_size(void) +{ + static size_t psize = 0; + if(UNLIKELY(!psize)) + { +#ifdef HAVE_SYSCONF +#if defined(_SC_PAGESIZE) + if(!psize) psize = sysconf(_SC_PAGESIZE); +#elif defined(_SC_PAGE_SIZE) + if(!psize) psize = sysconf(_SC_PAGE_SIZE); +#endif +#endif /* HAVE_SYSCONF */ +#ifdef _WIN32 + if(!psize) + { + SYSTEM_INFO sysinfo; + memset(&sysinfo, 0, sizeof(sysinfo)); + + GetSystemInfo(&sysinfo); + psize = sysinfo.dwPageSize; + } +#endif + if(!psize) psize = DEF_ALIGN; + } + return psize; +} + +int al_is_sane_alignment_allocator(void) +{ +#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) || defined(HAVE__ALIGNED_MALLOC) + return 1; +#else + return 0; +#endif +} diff --git a/love/src/jni/openal-soft-1.18.2/common/almalloc.h b/love/src/jni/openal-soft-1.19.1/common/almalloc.h similarity index 58% rename from love/src/jni/openal-soft-1.18.2/common/almalloc.h rename to love/src/jni/openal-soft-1.19.1/common/almalloc.h index 8eadb5b3..a4297cf5 100644 --- a/love/src/jni/openal-soft-1.18.2/common/almalloc.h +++ b/love/src/jni/openal-soft-1.19.1/common/almalloc.h @@ -14,6 +14,15 @@ void *al_malloc(size_t alignment, size_t size); void *al_calloc(size_t alignment, size_t size); void al_free(void *ptr); +size_t al_get_page_size(void); + +/** + * Returns non-0 if the allocation function has direct alignment handling. + * Otherwise, the standard malloc is used with an over-allocation and pointer + * offset strategy. + */ +int al_is_sane_alignment_allocator(void); + #ifdef __cplusplus } #endif diff --git a/love/src/jni/openal-soft-1.18.2/common/atomic.c b/love/src/jni/openal-soft-1.19.1/common/atomic.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/atomic.c rename to love/src/jni/openal-soft-1.19.1/common/atomic.c diff --git a/love/src/jni/openal-soft-1.18.2/common/atomic.h b/love/src/jni/openal-soft-1.19.1/common/atomic.h similarity index 95% rename from love/src/jni/openal-soft-1.18.2/common/atomic.h rename to love/src/jni/openal-soft-1.19.1/common/atomic.h index 874d510d..39daa1dc 100644 --- a/love/src/jni/openal-soft-1.18.2/common/atomic.h +++ b/love/src/jni/openal-soft-1.19.1/common/atomic.h @@ -4,6 +4,19 @@ #include "static_assert.h" #include "bool.h" +#ifdef __GNUC__ +/* This helps cast away the const-ness of a pointer without accidentally + * changing the pointer type. This is necessary due to Clang's inability to use + * atomic_load on a const _Atomic variable. + */ +#define CONST_CAST(T, V) __extension__({ \ + const T _tmp = (V); \ + (T)_tmp; \ +}) +#else +#define CONST_CAST(T, V) ((T)(V)) +#endif + #ifdef __cplusplus extern "C" { #endif @@ -293,6 +306,7 @@ enum almemory_order { } while(0) int _al_invalid_atomic_size(); /* not defined */ +void *_al_invalid_atomic_ptr_size(); /* not defined */ #define ATOMIC_ADD(_val, _incr, _MO) \ ((sizeof((_val)->value)==4) ? WRAP_ADDSUB(LONG, AtomicAdd32, &(_val)->value, (_incr)) : \ @@ -314,7 +328,7 @@ int _al_invalid_atomic_size(); /* not defined */ #define ATOMIC_EXCHANGE_PTR(_val, _newval, _MO) \ ((sizeof((_val)->value)==sizeof(void*)) ? AtomicSwapPtr((void*volatile*)&(_val)->value, (_newval)) : \ - (void*)_al_invalid_atomic_size()) + _al_invalid_atomic_ptr_size()) #define ATOMIC_COMPARE_EXCHANGE_PTR_STRONG(_val, _oldval, _newval, _MO1, _MO2)\ ((sizeof((_val)->value)==sizeof(void*)) ? CompareAndSwapPtr((void*volatile*)&(_val)->value, (_newval), (void**)(_oldval)) : \ (bool)_al_invalid_atomic_size()) @@ -399,11 +413,11 @@ typedef ATOMIC(uint) RefCount; inline void InitRef(RefCount *ptr, uint value) { ATOMIC_INIT(ptr, value); } inline uint ReadRef(RefCount *ptr) -{ return ATOMIC_LOAD_SEQ(ptr); } +{ return ATOMIC_LOAD(ptr, almemory_order_acquire); } inline uint IncrementRef(RefCount *ptr) -{ return ATOMIC_ADD_SEQ(ptr, 1)+1; } +{ return ATOMIC_ADD(ptr, 1, almemory_order_acq_rel)+1; } inline uint DecrementRef(RefCount *ptr) -{ return ATOMIC_SUB_SEQ(ptr, 1)-1; } +{ return ATOMIC_SUB(ptr, 1, almemory_order_acq_rel)-1; } /* WARNING: A livelock is theoretically possible if another thread keeps diff --git a/love/src/jni/openal-soft-1.18.2/common/bool.h b/love/src/jni/openal-soft-1.19.1/common/bool.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/bool.h rename to love/src/jni/openal-soft-1.19.1/common/bool.h diff --git a/love/src/jni/openal-soft-1.19.1/common/math_defs.h b/love/src/jni/openal-soft-1.19.1/common/math_defs.h new file mode 100644 index 00000000..aa79b695 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/common/math_defs.h @@ -0,0 +1,65 @@ +#ifndef AL_MATH_DEFS_H +#define AL_MATH_DEFS_H + +#include +#ifdef HAVE_FLOAT_H +#include +#endif + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +#define F_PI (3.14159265358979323846f) +#define F_PI_2 (1.57079632679489661923f) +#define F_TAU (6.28318530717958647692f) + +#ifndef FLT_EPSILON +#define FLT_EPSILON (1.19209290e-07f) +#endif + +#define SQRT_2 1.41421356237309504880 +#define SQRT_3 1.73205080756887719318 + +#define SQRTF_2 1.41421356237309504880f +#define SQRTF_3 1.73205080756887719318f + +#ifndef HUGE_VALF +static const union msvc_inf_hack { + unsigned char b[4]; + float f; +} msvc_inf_union = {{ 0x00, 0x00, 0x80, 0x7F }}; +#define HUGE_VALF (msvc_inf_union.f) +#endif + +#ifndef HAVE_LOG2F +static inline float log2f(float f) +{ + return logf(f) / logf(2.0f); +} +#endif + +#ifndef HAVE_CBRTF +static inline float cbrtf(float f) +{ + return powf(f, 1.0f/3.0f); +} +#endif + +#ifndef HAVE_COPYSIGNF +static inline float copysignf(float x, float y) +{ + union { + float f; + unsigned int u; + } ux = { x }, uy = { y }; + ux.u &= 0x7fffffffu; + ux.u |= (uy.u&0x80000000u); + return ux.f; +} +#endif + +#define DEG2RAD(x) ((float)(x) * (float)(M_PI/180.0)) +#define RAD2DEG(x) ((float)(x) * (float)(180.0/M_PI)) + +#endif /* AL_MATH_DEFS_H */ diff --git a/love/src/jni/openal-soft-1.18.2/common/rwlock.c b/love/src/jni/openal-soft-1.19.1/common/rwlock.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/rwlock.c rename to love/src/jni/openal-soft-1.19.1/common/rwlock.c diff --git a/love/src/jni/openal-soft-1.18.2/common/rwlock.h b/love/src/jni/openal-soft-1.19.1/common/rwlock.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/rwlock.h rename to love/src/jni/openal-soft-1.19.1/common/rwlock.h diff --git a/love/src/jni/openal-soft-1.18.2/common/static_assert.h b/love/src/jni/openal-soft-1.19.1/common/static_assert.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/common/static_assert.h rename to love/src/jni/openal-soft-1.19.1/common/static_assert.h diff --git a/love/src/jni/openal-soft-1.18.2/common/threads.c b/love/src/jni/openal-soft-1.19.1/common/threads.c similarity index 78% rename from love/src/jni/openal-soft-1.18.2/common/threads.c rename to love/src/jni/openal-soft-1.19.1/common/threads.c index dbd196e8..6cfe383b 100644 --- a/love/src/jni/openal-soft-1.18.2/common/threads.c +++ b/love/src/jni/openal-soft-1.19.1/common/threads.c @@ -64,6 +64,22 @@ extern inline int altss_set(altss_t tss_id, void *val); #include +/* An associative map of uint:void* pairs. The key is the unique Thread ID and + * the value is the thread HANDLE. The thread ID is passed around as the + * althrd_t since there is only one ID per thread, whereas a thread may be + * referenced by multiple different HANDLEs. This map allows retrieving the + * original handle which is needed to join the thread and get its return value. + */ +static UIntMap ThrdIdHandle = UINTMAP_STATIC_INITIALIZE; + +/* An associative map of uint:void* pairs. The key is the TLS index (given by + * TlsAlloc), and the value is the altss_dtor_t callback. When a thread exits, + * we iterate over the TLS indices for their thread-local value and call the + * destructor function with it if they're both not NULL. + */ +static UIntMap TlsDestructors = UINTMAP_STATIC_INITIALIZE; + + void althrd_setname(althrd_t thr, const char *name) { #if defined(_MSC_VER) @@ -94,23 +110,6 @@ void althrd_setname(althrd_t thr, const char *name) } -static UIntMap ThrdIdHandle = UINTMAP_STATIC_INITIALIZE; - -static void NTAPI althrd_callback(void* UNUSED(handle), DWORD reason, void* UNUSED(reserved)) -{ - if(reason == DLL_PROCESS_DETACH) - ResetUIntMap(&ThrdIdHandle); -} -#ifdef _MSC_VER -#pragma section(".CRT$XLC",read) -__declspec(allocate(".CRT$XLC")) PIMAGE_TLS_CALLBACK althrd_callback_ = althrd_callback; -#elif defined(__GNUC__) -PIMAGE_TLS_CALLBACK althrd_callback_ __attribute__((section(".CRT$XLC"))) = althrd_callback; -#else -PIMAGE_TLS_CALLBACK althrd_callback_ = althrd_callback; -#endif - - typedef struct thread_cntr { althrd_start_t func; void *arg; @@ -208,12 +207,6 @@ void almtx_destroy(almtx_t *mtx) DeleteCriticalSection(mtx); } -int almtx_timedlock(almtx_t* UNUSED(mtx), const struct timespec* UNUSED(ts)) -{ - /* Windows CRITICAL_SECTIONs don't seem to have a timedlock method. */ - return althrd_error; -} - #if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 int alcnd_init(alcnd_t *cond) { @@ -240,30 +233,6 @@ int alcnd_wait(alcnd_t *cond, almtx_t *mtx) return althrd_error; } -int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point) -{ - struct timespec curtime; - DWORD sleeptime; - - if(altimespec_get(&curtime, AL_TIME_UTC) != AL_TIME_UTC) - return althrd_error; - - if(curtime.tv_sec > time_point->tv_sec || (curtime.tv_sec == time_point->tv_sec && - curtime.tv_nsec >= time_point->tv_nsec)) - { - if(SleepConditionVariableCS(cond, mtx, 0) != 0) - return althrd_success; - } - else - { - sleeptime = (time_point->tv_nsec - curtime.tv_nsec + 999999)/1000000; - sleeptime += (DWORD)(time_point->tv_sec - curtime.tv_sec)*1000; - if(SleepConditionVariableCS(cond, mtx, sleeptime) != 0) - return althrd_success; - } - return (GetLastError()==ERROR_TIMEOUT) ? althrd_timedout : althrd_error; -} - void alcnd_destroy(alcnd_t* UNUSED(cond)) { /* Nothing to delete? */ @@ -348,37 +317,6 @@ int alcnd_wait(alcnd_t *cond, almtx_t *mtx) return althrd_success; } -int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point) -{ - _int_alcnd_t *icond = cond->Ptr; - struct timespec curtime; - DWORD sleeptime; - int res; - - if(altimespec_get(&curtime, AL_TIME_UTC) != AL_TIME_UTC) - return althrd_error; - - if(curtime.tv_sec > time_point->tv_sec || (curtime.tv_sec == time_point->tv_sec && - curtime.tv_nsec >= time_point->tv_nsec)) - sleeptime = 0; - else - { - sleeptime = (time_point->tv_nsec - curtime.tv_nsec + 999999)/1000000; - sleeptime += (DWORD)(time_point->tv_sec - curtime.tv_sec)*1000; - } - - IncrementRef(&icond->wait_count); - LeaveCriticalSection(mtx); - - res = WaitForMultipleObjects(2, icond->events, FALSE, sleeptime); - - if(DecrementRef(&icond->wait_count) == 0 && res == WAIT_OBJECT_0+BROADCAST) - ResetEvent(icond->events[BROADCAST]); - EnterCriticalSection(mtx); - - return (res == WAIT_TIMEOUT) ? althrd_timedout : althrd_success; -} - void alcnd_destroy(alcnd_t *cond) { _int_alcnd_t *icond = cond->Ptr; @@ -389,46 +327,40 @@ void alcnd_destroy(alcnd_t *cond) #endif /* defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 */ -/* An associative map of uint:void* pairs. The key is the TLS index (given by - * TlsAlloc), and the value is the altss_dtor_t callback. When a thread exits, - * we iterate over the TLS indices for their thread-local value and call the - * destructor function with it if they're both not NULL. To avoid using - * DllMain, a PIMAGE_TLS_CALLBACK function pointer is placed in a ".CRT$XLx" - * section (where x is a character A to Z) which will be called by the CRT. - */ -static UIntMap TlsDestructors = UINTMAP_STATIC_INITIALIZE; - -static void NTAPI altss_callback(void* UNUSED(handle), DWORD reason, void* UNUSED(reserved)) +int alsem_init(alsem_t *sem, unsigned int initial) { - ALsizei i; - - if(reason == DLL_PROCESS_DETACH) - { - ResetUIntMap(&TlsDestructors); - return; - } - if(reason != DLL_THREAD_DETACH) - return; - - LockUIntMapRead(&TlsDestructors); - for(i = 0;i < TlsDestructors.size;i++) - { - void *ptr = altss_get(TlsDestructors.keys[i]); - altss_dtor_t callback = (altss_dtor_t)TlsDestructors.values[i]; - if(ptr && callback) - callback(ptr); - } - UnlockUIntMapRead(&TlsDestructors); + *sem = CreateSemaphore(NULL, initial, INT_MAX, NULL); + if(*sem != NULL) return althrd_success; + return althrd_error; } -#ifdef _MSC_VER -#pragma section(".CRT$XLB",read) -__declspec(allocate(".CRT$XLB")) PIMAGE_TLS_CALLBACK altss_callback_ = altss_callback; -#elif defined(__GNUC__) -PIMAGE_TLS_CALLBACK altss_callback_ __attribute__((section(".CRT$XLB"))) = altss_callback; -#else -#warning "No TLS callback support, thread-local contexts may leak references on poorly written applications." -PIMAGE_TLS_CALLBACK altss_callback_ = altss_callback; -#endif + +void alsem_destroy(alsem_t *sem) +{ + CloseHandle(*sem); +} + +int alsem_post(alsem_t *sem) +{ + DWORD ret = ReleaseSemaphore(*sem, 1, NULL); + if(ret) return althrd_success; + return althrd_error; +} + +int alsem_wait(alsem_t *sem) +{ + DWORD ret = WaitForSingleObject(*sem, INFINITE); + if(ret == WAIT_OBJECT_0) return althrd_success; + return althrd_error; +} + +int alsem_trywait(alsem_t *sem) +{ + DWORD ret = WaitForSingleObject(*sem, 0); + if(ret == WAIT_OBJECT_0) return althrd_success; + if(ret == WAIT_TIMEOUT) return althrd_busy; + return althrd_error; +} + int altss_create(altss_t *tss_id, altss_dtor_t callback) { @@ -480,6 +412,31 @@ void alcall_once(alonce_flag *once, void (*callback)(void)) InterlockedExchange(once, 2); } + +void althrd_deinit(void) +{ + ResetUIntMap(&ThrdIdHandle); + ResetUIntMap(&TlsDestructors); +} + +void althrd_thread_detach(void) +{ + ALsizei i; + + LockUIntMapRead(&TlsDestructors); + for(i = 0;i < TlsDestructors.size;i++) + { + void *ptr = altss_get(TlsDestructors.keys[i]); + altss_dtor_t callback = (altss_dtor_t)TlsDestructors.values[i]; + if(ptr) + { + if(callback) callback(ptr); + altss_set(TlsDestructors.keys[i], NULL); + } + } + UnlockUIntMapRead(&TlsDestructors); +} + #else #include @@ -493,6 +450,8 @@ void alcall_once(alonce_flag *once, void (*callback)(void)) extern inline int althrd_sleep(const struct timespec *ts, struct timespec *rem); extern inline void alcall_once(alonce_flag *once, void (*callback)(void)); +extern inline void althrd_deinit(void); +extern inline void althrd_thread_detach(void); void althrd_setname(althrd_t thr, const char *name) { @@ -604,15 +563,9 @@ int almtx_init(almtx_t *mtx, int type) int ret; if(!mtx) return althrd_error; -#ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK - if((type&~(almtx_recursive|almtx_timed)) != 0) - return althrd_error; -#else if((type&~almtx_recursive) != 0) return althrd_error; -#endif - type &= ~almtx_timed; if(type == almtx_plain) ret = pthread_mutex_init(mtx, NULL); else @@ -644,20 +597,6 @@ void almtx_destroy(almtx_t *mtx) pthread_mutex_destroy(mtx); } -int almtx_timedlock(almtx_t *mtx, const struct timespec *ts) -{ -#ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK - int ret = pthread_mutex_timedlock(mtx, ts); - switch(ret) - { - case 0: return althrd_success; - case ETIMEDOUT: return althrd_timedout; - case EBUSY: return althrd_busy; - } -#endif - return althrd_error; -} - int alcnd_init(alcnd_t *cond) { if(pthread_cond_init(cond, NULL) == 0) @@ -686,16 +625,44 @@ int alcnd_wait(alcnd_t *cond, almtx_t *mtx) return althrd_error; } -int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point) +void alcnd_destroy(alcnd_t *cond) { - if(pthread_cond_timedwait(cond, mtx, time_point) == 0) + pthread_cond_destroy(cond); +} + + +int alsem_init(alsem_t *sem, unsigned int initial) +{ + if(sem_init(sem, 0, initial) == 0) return althrd_success; return althrd_error; } -void alcnd_destroy(alcnd_t *cond) +void alsem_destroy(alsem_t *sem) { - pthread_cond_destroy(cond); + sem_destroy(sem); +} + +int alsem_post(alsem_t *sem) +{ + if(sem_post(sem) == 0) + return althrd_success; + return althrd_error; +} + +int alsem_wait(alsem_t *sem) +{ + if(sem_wait(sem) == 0) return althrd_success; + if(errno == EINTR) return -2; + return althrd_error; +} + +int alsem_trywait(alsem_t *sem) +{ + if(sem_trywait(sem) == 0) return althrd_success; + if(errno == EWOULDBLOCK) return althrd_busy; + if(errno == EINTR) return -2; + return althrd_error; } diff --git a/love/src/jni/openal-soft-1.18.2/common/threads.h b/love/src/jni/openal-soft-1.19.1/common/threads.h similarity index 83% rename from love/src/jni/openal-soft-1.18.2/common/threads.h rename to love/src/jni/openal-soft-1.19.1/common/threads.h index c2848ee7..b0bebd8d 100644 --- a/love/src/jni/openal-soft-1.18.2/common/threads.h +++ b/love/src/jni/openal-soft-1.19.1/common/threads.h @@ -3,6 +3,16 @@ #include +#if defined(__GNUC__) && defined(__i386__) +/* force_align_arg_pointer is required for proper function arguments aligning + * when SSE code is used. Some systems (Windows, QNX) do not guarantee our + * thread functions will be properly aligned on the stack, even though GCC may + * generate code with the assumption that it is. */ +#define FORCE_ALIGN __attribute__((force_align_arg_pointer)) +#else +#define FORCE_ALIGN +#endif + #ifdef __cplusplus extern "C" { #endif @@ -18,7 +28,6 @@ enum { enum { almtx_plain = 0, almtx_recursive = 1, - almtx_timed = 2 }; typedef int (*althrd_start_t)(void*); @@ -47,6 +56,7 @@ typedef CONDITION_VARIABLE alcnd_t; #else typedef struct { void *Ptr; } alcnd_t; #endif +typedef HANDLE alsem_t; typedef DWORD altss_t; typedef LONG alonce_flag; @@ -55,6 +65,9 @@ typedef LONG alonce_flag; int althrd_sleep(const struct timespec *ts, struct timespec *rem); void alcall_once(alonce_flag *once, void (*callback)(void)); +void althrd_deinit(void); +void althrd_thread_detach(void); + inline althrd_t althrd_current(void) { @@ -117,11 +130,13 @@ inline int altss_set(altss_t tss_id, void *val) #include #include #include +#include typedef pthread_t althrd_t; typedef pthread_mutex_t almtx_t; typedef pthread_cond_t alcnd_t; +typedef sem_t alsem_t; typedef pthread_key_t altss_t; typedef pthread_once_t alonce_flag; @@ -204,6 +219,10 @@ inline void alcall_once(alonce_flag *once, void (*callback)(void)) pthread_once(once, callback); } + +inline void althrd_deinit(void) { } +inline void althrd_thread_detach(void) { } + #endif @@ -214,15 +233,19 @@ void althrd_setname(althrd_t thr, const char *name); int almtx_init(almtx_t *mtx, int type); void almtx_destroy(almtx_t *mtx); -int almtx_timedlock(almtx_t *mtx, const struct timespec *ts); int alcnd_init(alcnd_t *cond); int alcnd_signal(alcnd_t *cond); int alcnd_broadcast(alcnd_t *cond); int alcnd_wait(alcnd_t *cond, almtx_t *mtx); -int alcnd_timedwait(alcnd_t *cond, almtx_t *mtx, const struct timespec *time_point); void alcnd_destroy(alcnd_t *cond); +int alsem_init(alsem_t *sem, unsigned int initial); +void alsem_destroy(alsem_t *sem); +int alsem_post(alsem_t *sem); +int alsem_wait(alsem_t *sem); +int alsem_trywait(alsem_t *sem); + int altss_create(altss_t *tss_id, altss_dtor_t callback); void altss_delete(altss_t tss_id); diff --git a/love/src/jni/openal-soft-1.18.2/common/uintmap.c b/love/src/jni/openal-soft-1.19.1/common/uintmap.c similarity index 55% rename from love/src/jni/openal-soft-1.18.2/common/uintmap.c rename to love/src/jni/openal-soft-1.19.1/common/uintmap.c index 98ed3191..18d52d64 100644 --- a/love/src/jni/openal-soft-1.18.2/common/uintmap.c +++ b/love/src/jni/openal-soft-1.19.1/common/uintmap.c @@ -36,11 +36,6 @@ void ResetUIntMap(UIntMap *map) WriteUnlock(&map->lock); } -void RelimitUIntMapNoLock(UIntMap *map, ALsizei limit) -{ - map->limit = limit; -} - ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value) { ALsizei pos = 0; @@ -124,81 +119,6 @@ ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value) return AL_NO_ERROR; } -ALenum InsertUIntMapEntryNoLock(UIntMap *map, ALuint key, ALvoid *value) -{ - ALsizei pos = 0; - - if(map->size > 0) - { - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - } - - if(pos == map->size || map->keys[pos] != key) - { - if(map->size >= map->limit) - return AL_OUT_OF_MEMORY; - - if(map->size == map->capacity) - { - ALuint *keys = NULL; - ALvoid **values; - ALsizei newcap, keylen; - - newcap = (map->capacity ? (map->capacity<<1) : 4); - if(map->limit > 0 && newcap > map->limit) - newcap = map->limit; - if(newcap > map->capacity) - { - /* Round the memory size for keys up to a multiple of the - * pointer size. - */ - keylen = newcap * sizeof(map->keys[0]); - keylen += sizeof(map->values[0]) - 1; - keylen -= keylen%sizeof(map->values[0]); - - keys = al_malloc(16, keylen + newcap*sizeof(map->values[0])); - } - if(!keys) - return AL_OUT_OF_MEMORY; - values = (ALvoid**)((ALbyte*)keys + keylen); - - if(map->keys) - { - memcpy(keys, map->keys, map->size*sizeof(map->keys[0])); - memcpy(values, map->values, map->size*sizeof(map->values[0])); - } - al_free(map->keys); - map->keys = keys; - map->values = values; - map->capacity = newcap; - } - - if(pos < map->size) - { - memmove(&map->keys[pos+1], &map->keys[pos], - (map->size-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos+1], &map->values[pos], - (map->size-pos)*sizeof(map->values[0])); - } - map->size++; - } - map->keys[pos] = key; - map->values[pos] = value; - - return AL_NO_ERROR; -} - ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key) { ALvoid *ptr = NULL; @@ -235,40 +155,6 @@ ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key) return ptr; } -ALvoid *RemoveUIntMapKeyNoLock(UIntMap *map, ALuint key) -{ - ALvoid *ptr = NULL; - if(map->size > 0) - { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) - { - ptr = map->values[pos]; - if(pos < map->size-1) - { - memmove(&map->keys[pos], &map->keys[pos+1], - (map->size-1-pos)*sizeof(map->keys[0])); - memmove(&map->values[pos], &map->values[pos+1], - (map->size-1-pos)*sizeof(map->values[0])); - } - map->size--; - } - } - return ptr; -} - ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key) { ALvoid *ptr = NULL; @@ -294,26 +180,3 @@ ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key) ReadUnlock(&map->lock); return ptr; } - -ALvoid *LookupUIntMapKeyNoLock(UIntMap *map, ALuint key) -{ - if(map->size > 0) - { - ALsizei pos = 0; - ALsizei count = map->size; - do { - ALsizei step = count>>1; - ALsizei i = pos+step; - if(!(map->keys[i] < key)) - count = step; - else - { - pos = i+1; - count -= step+1; - } - } while(count > 0); - if(pos < map->size && map->keys[pos] == key) - return map->values[pos]; - } - return NULL; -} diff --git a/love/src/jni/openal-soft-1.18.2/common/uintmap.h b/love/src/jni/openal-soft-1.19.1/common/uintmap.h similarity index 59% rename from love/src/jni/openal-soft-1.18.2/common/uintmap.h rename to love/src/jni/openal-soft-1.19.1/common/uintmap.h index 47bd0d42..32868653 100644 --- a/love/src/jni/openal-soft-1.18.2/common/uintmap.h +++ b/love/src/jni/openal-soft-1.19.1/common/uintmap.h @@ -1,6 +1,8 @@ #ifndef AL_UINTMAP_H #define AL_UINTMAP_H +#include + #include "AL/al.h" #include "rwlock.h" @@ -23,22 +25,14 @@ typedef struct UIntMap { void InitUIntMap(UIntMap *map, ALsizei limit); void ResetUIntMap(UIntMap *map); -void RelimitUIntMapNoLock(UIntMap *map, ALsizei limit); ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value); -ALenum InsertUIntMapEntryNoLock(UIntMap *map, ALuint key, ALvoid *value); ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key); -ALvoid *RemoveUIntMapKeyNoLock(UIntMap *map, ALuint key); ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key); -ALvoid *LookupUIntMapKeyNoLock(UIntMap *map, ALuint key); -inline void LockUIntMapRead(UIntMap *map) -{ ReadLock(&map->lock); } -inline void UnlockUIntMapRead(UIntMap *map) -{ ReadUnlock(&map->lock); } -inline void LockUIntMapWrite(UIntMap *map) -{ WriteLock(&map->lock); } -inline void UnlockUIntMapWrite(UIntMap *map) -{ WriteUnlock(&map->lock); } +inline void LockUIntMapRead(UIntMap *map) { ReadLock(&map->lock); } +inline void UnlockUIntMapRead(UIntMap *map) { ReadUnlock(&map->lock); } +inline void LockUIntMapWrite(UIntMap *map) { WriteLock(&map->lock); } +inline void UnlockUIntMapWrite(UIntMap *map) { WriteUnlock(&map->lock); } #ifdef __cplusplus } diff --git a/love/src/jni/openal-soft-1.19.1/common/win_main_utf8.h b/love/src/jni/openal-soft-1.19.1/common/win_main_utf8.h new file mode 100644 index 00000000..faddc257 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/common/win_main_utf8.h @@ -0,0 +1,97 @@ +#ifndef WIN_MAIN_UTF8_H +#define WIN_MAIN_UTF8_H + +/* For Windows systems this provides a way to get UTF-8 encoded argv strings, + * and also overrides fopen to accept UTF-8 filenames. Working with wmain + * directly complicates cross-platform compatibility, while normal main() in + * Windows uses the current codepage (which has limited availability of + * characters). + * + * For MinGW, you must link with -municode + */ +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include + +static FILE *my_fopen(const char *fname, const char *mode) +{ + WCHAR *wname=NULL, *wmode=NULL; + int namelen, modelen; + FILE *file = NULL; + errno_t err; + + namelen = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0); + modelen = MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); + + if(namelen <= 0 || modelen <= 0) + { + fprintf(stderr, "Failed to convert UTF-8 fname \"%s\", mode \"%s\"\n", fname, mode); + return NULL; + } + + wname = calloc(sizeof(WCHAR), namelen+modelen); + wmode = wname + namelen; + MultiByteToWideChar(CP_UTF8, 0, fname, -1, wname, namelen); + MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, modelen); + + err = _wfopen_s(&file, wname, wmode); + if(err) + { + errno = err; + file = NULL; + } + + free(wname); + + return file; +} +#define fopen my_fopen + + +static char **arglist; +static void cleanup_arglist(void) +{ + free(arglist); +} + +static void GetUnicodeArgs(int *argc, char ***argv) +{ + size_t total; + wchar_t **args; + int nargs, i; + + args = CommandLineToArgvW(GetCommandLineW(), &nargs); + if(!args) + { + fprintf(stderr, "Failed to get command line args: %ld\n", GetLastError()); + exit(EXIT_FAILURE); + } + + total = sizeof(**argv) * nargs; + for(i = 0;i < nargs;i++) + total += WideCharToMultiByte(CP_UTF8, 0, args[i], -1, NULL, 0, NULL, NULL); + + atexit(cleanup_arglist); + arglist = *argv = calloc(1, total); + (*argv)[0] = (char*)(*argv + nargs); + for(i = 0;i < nargs-1;i++) + { + int len = WideCharToMultiByte(CP_UTF8, 0, args[i], -1, (*argv)[i], 65535, NULL, NULL); + (*argv)[i+1] = (*argv)[i] + len; + } + WideCharToMultiByte(CP_UTF8, 0, args[i], -1, (*argv)[i], 65535, NULL, NULL); + *argc = nargs; + + LocalFree(args); +} +#define GET_UNICODE_ARGS(argc, argv) GetUnicodeArgs(argc, argv) + +#else + +/* Do nothing. */ +#define GET_UNICODE_ARGS(argc, argv) + +#endif + +#endif /* WIN_MAIN_UTF8_H */ diff --git a/love/src/jni/openal-soft-1.19.1/config.h b/love/src/jni/openal-soft-1.19.1/config.h new file mode 100644 index 00000000..641180e9 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/config.h @@ -0,0 +1,79 @@ +/* API declaration export attribute */ +#define AL_API __attribute__((visibility("protected"))) +#define ALC_API __attribute__((visibility("protected"))) +#define ALIGN(x) __attribute__((aligned(x))) +#define ASSUME_ALIGNED(x, y) __builtin_assume_aligned(x, y) +/* #undef ALSOFT_EMBED_HRTF_DATA */ +#define HAVE_SYSCONF +/* #undef HAVE_ALIGNED_ALLOC */ +/* #undef HAVE_POSIX_MEMALIGN */ /* ARM64: define; x86-64: define */ +/* #undef HAVE__ALIGNED_MALLOC */ +/* #undef HAVE_PROC_PIDPATH */ +#define HAVE_GETOPT +/* #undef HAVE_SSE */ /* x86(-64): define */ +/* #undef HAVE_SSE2 */ /* x86(-64): define */ +/* #undef HAVE_SSE3 */ /* x86(-64): define */ +/* #undef HAVE_SSE4_1 */ /* x86-64: define */ +/* #undef HAVE_NEON */ /* ARM32: define; ARM64: define */ +/* #undef HAVE_ALSA */ +/* #undef HAVE_OSS */ +/* #undef HAVE_SOLARIS */ +/* #undef HAVE_SNDIO */ +/* #undef HAVE_QSA */ +/* #undef HAVE_WASAPI */ +/* #undef HAVE_DSOUND */ +/* #undef HAVE_WINMM */ +/* #undef HAVE_PORTAUDIO */ +/* #undef HAVE_PULSEAUDIO */ +/* #undef HAVE_JACK */ +/* #undef HAVE_COREAUDIO */ +#define HAVE_OPENSL +#define HAVE_WAVE +/* #undef HAVE_SDL2 */ +#define HAVE_STAT +#define HAVE_LRINTF +#define HAVE_MODFF +/* #undef HAVE_LOG2F */ /* ARM64: define; x86-64: define */ +#define HAVE_CBRTF +#define HAVE_COPYSIGNF +/* #undef HAVE_STRTOF */ /* ARM64: define */ +#define HAVE_STRNLEN +/* #undef HAVE___INT64 */ +/* #undef SIZEOF_LONG 4 */ /* ARM32: 4; ARM64: 8; x86: 4; x86-64: 8 */ +#define SIZEOF_LONG_LONG 8 +#define HAVE_C99_BOOL +#define HAVE_C11_STATIC_ASSERT +#define HAVE_C11_ALIGNAS +/* #undef HAVE_C11_ATOMIC */ +#define HAVE_GCC_DESTRUCTOR +#define HAVE_GCC_FORMAT +#define HAVE_STDINT_H +#define HAVE_STDBOOL_H +#define HAVE_STDALIGN_H +/* #undef HAVE_WINDOWS_H */ +/* #undef HAVE_DLFCN_H */ +/* #undef HAVE_PTHREAD_NP_H */ +#define HAVE_MALLOC_H +#define HAVE_DIRENT_H +#define HAVE_STRINGS_H +/* #undef HAVE_CPUID_H */ /* x86(-64): define */ +/* #undef HAVE_INTRIN_H */ +#define HAVE_SYS_SYSCONF_H +/* #undef HAVE_GUIDDEF_H */ +/* #undef HAVE_INITGUID_H */ +/* #undef HAVE_IEEEFP_H */ +#define HAVE_FLOAT_H +#define HAVE_FENV_H +/* #undef HAVE_GCC_GET_CPUID */ /* x86(-64): define */ +/* #undef HAVE_CPUID_INTRINSIC */ +/* #undef HAVE_BITSCANFORWARD64_INTRINSIC */ +/* #undef HAVE_BITSCANFORWARD_INTRINSIC */ +/* #undef HAVE__CONTROLFP */ +/* #undef HAVE___CONTROL87_2 */ +#define HAVE_PTHREAD_SETSCHEDPARAM +#define HAVE_PTHREAD_SETNAME_NP +/* #undef PTHREAD_SETNAME_NP_ONE_PARAM */ +/* #undef PTHREAD_SETNAME_NP_THREE_PARAMS */ +/* #undef HAVE_PTHREAD_SET_NAME_NP */ +/* #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP */ +/* #undef HAVE_PTHREAD_MUTEX_TIMEDLOCK */ /* ARM64: define; x86-64: define */ diff --git a/love/src/jni/openal-soft-1.18.2/config.h.in b/love/src/jni/openal-soft-1.19.1/config.h.in similarity index 87% rename from love/src/jni/openal-soft-1.18.2/config.h.in rename to love/src/jni/openal-soft-1.19.1/config.h.in index b0fc5d2b..9cc6c16b 100644 --- a/love/src/jni/openal-soft-1.18.2/config.h.in +++ b/love/src/jni/openal-soft-1.19.1/config.h.in @@ -11,6 +11,9 @@ /* Define if HRTF data is embedded in the library */ #cmakedefine ALSOFT_EMBED_HRTF_DATA +/* Define if we have the sysconf function */ +#cmakedefine HAVE_SYSCONF + /* Define if we have the C11 aligned_alloc function */ #cmakedefine HAVE_ALIGNED_ALLOC @@ -20,6 +23,12 @@ /* Define if we have the _aligned_malloc function */ #cmakedefine HAVE__ALIGNED_MALLOC +/* Define if we have the proc_pidpath function */ +#cmakedefine HAVE_PROC_PIDPATH + +/* Define if we have the getopt function */ +#cmakedefine HAVE_GETOPT + /* Define if we have SSE CPU extensions */ #cmakedefine HAVE_SSE #cmakedefine HAVE_SSE2 @@ -44,8 +53,8 @@ /* Define if we have the QSA backend */ #cmakedefine HAVE_QSA -/* Define if we have the MMDevApi backend */ -#cmakedefine HAVE_MMDEVAPI +/* Define if we have the WASAPI backend */ +#cmakedefine HAVE_WASAPI /* Define if we have the DSound backend */ #cmakedefine HAVE_DSOUND @@ -71,6 +80,9 @@ /* Define if we have the Wave Writer backend */ #cmakedefine HAVE_WAVE +/* Define if we have the SDL2 backend */ +#cmakedefine HAVE_SDL2 + /* Define if we have the stat function */ #cmakedefine HAVE_STAT @@ -83,6 +95,12 @@ /* Define if we have the log2f function */ #cmakedefine HAVE_LOG2F +/* Define if we have the cbrtf function */ +#cmakedefine HAVE_CBRTF + +/* Define if we have the copysignf function */ +#cmakedefine HAVE_COPYSIGNF + /* Define if we have the strtof function */ #cmakedefine HAVE_STRTOF @@ -98,9 +116,6 @@ /* Define to the size of a long long int type */ #cmakedefine SIZEOF_LONG_LONG ${SIZEOF_LONG_LONG} -/* Define if we have C99 variable-length array support */ -#cmakedefine HAVE_C99_VLA - /* Define if we have C99 _Bool support */ #cmakedefine HAVE_C99_BOOL @@ -137,9 +152,6 @@ /* Define if we have pthread_np.h */ #cmakedefine HAVE_PTHREAD_NP_H -/* Define if we have alloca.h */ -#cmakedefine HAVE_ALLOCA_H - /* Define if we have malloc.h */ #cmakedefine HAVE_MALLOC_H @@ -179,6 +191,12 @@ /* Define if we have the __cpuid() intrinsic */ #cmakedefine HAVE_CPUID_INTRINSIC +/* Define if we have the _BitScanForward64() intrinsic */ +#cmakedefine HAVE_BITSCANFORWARD64_INTRINSIC + +/* Define if we have the _BitScanForward() intrinsic */ +#cmakedefine HAVE_BITSCANFORWARD_INTRINSIC + /* Define if we have _controlfp() */ #cmakedefine HAVE__CONTROLFP diff --git a/love/src/jni/openal-soft-1.18.2/docs/3D7.1.txt b/love/src/jni/openal-soft-1.19.1/docs/3D7.1.txt similarity index 100% rename from love/src/jni/openal-soft-1.18.2/docs/3D7.1.txt rename to love/src/jni/openal-soft-1.19.1/docs/3D7.1.txt diff --git a/love/src/jni/openal-soft-1.18.2/docs/ambdec.txt b/love/src/jni/openal-soft-1.19.1/docs/ambdec.txt similarity index 100% rename from love/src/jni/openal-soft-1.18.2/docs/ambdec.txt rename to love/src/jni/openal-soft-1.19.1/docs/ambdec.txt diff --git a/love/src/jni/openal-soft-1.18.2/docs/ambisonics.txt b/love/src/jni/openal-soft-1.19.1/docs/ambisonics.txt similarity index 99% rename from love/src/jni/openal-soft-1.18.2/docs/ambisonics.txt rename to love/src/jni/openal-soft-1.19.1/docs/ambisonics.txt index b50e76c2..2d94427e 100644 --- a/love/src/jni/openal-soft-1.18.2/docs/ambisonics.txt +++ b/love/src/jni/openal-soft-1.19.1/docs/ambisonics.txt @@ -17,7 +17,7 @@ fully 3D soundfield using as few as 4 channels (or even just 3, if you don't mind dropping down to 2 dimensions like many surround sound systems are). This representation is called B-Format. It was designed to handle audio independent of any specific speaker layout, so with a proper decoder the same recording can -be played back on a variety of speaker setups, from quadrophonic and hexagonal +be played back on a variety of speaker setups, from quadraphonic and hexagonal to cubic and other periphonic (with height) layouts. Although it was developed decades ago, various factors held ambisonics back diff --git a/love/src/jni/openal-soft-1.18.2/docs/env-vars.txt b/love/src/jni/openal-soft-1.19.1/docs/env-vars.txt similarity index 85% rename from love/src/jni/openal-soft-1.18.2/docs/env-vars.txt rename to love/src/jni/openal-soft-1.19.1/docs/env-vars.txt index b2268643..a973ee81 100644 --- a/love/src/jni/openal-soft-1.18.2/docs/env-vars.txt +++ b/love/src/jni/openal-soft-1.19.1/docs/env-vars.txt @@ -79,3 +79,13 @@ which some applications make use of to protect against partial updates. In an attempt to standardize on that behavior, OpenAL Soft has changed those methods accordingly. Setting this to "ignore" restores the previous no-op behavior for applications that interact poorly with the new behavior. + +__ALSOFT_REVERB_IGNORES_SOUND_SPEED +Older versions of OpenAL Soft ignored the app-specified speed of sound when +calculating distance-related reverb decays and always assumed the default +343.3m/s. Now, both of the AL_SPEED_OF_SOUND and AL_METERS_PER_UNIT properties +are taken into account for speed of sound adjustments to have an appropriate +affect on the reverb decay. Consequently, applications that use reverb but +don't set these properties properly may find the reverb decay too strong. +Setting this to "true" or "1" will revert to the old behavior for those apps +and assume the default speed of sound for reverb. diff --git a/love/src/jni/openal-soft-1.19.1/docs/hrtf.txt b/love/src/jni/openal-soft-1.19.1/docs/hrtf.txt new file mode 100644 index 00000000..ba8cd8fa --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/docs/hrtf.txt @@ -0,0 +1,84 @@ +HRTF Support +============ + +Starting with OpenAL Soft 1.14, HRTFs can be used to enable enhanced +spatialization for both 3D (mono) and multi-channel sources, when used with +headphones/stereo output. This can be enabled using the 'hrtf' config option. + +For multi-channel sources this creates a virtual speaker effect, making it +sound as if speakers provide a discrete position for each channel around the +listener. For mono sources this provides much more versatility in the perceived +placement of sounds, making it seem as though they are coming from all around, +including above and below the listener, instead of just to the front, back, and +sides. + +The default data set is based on the KEMAR HRTF data provided by MIT, which can +be found at . It's only +available when using 44100hz or 48000hz playback. + + +Custom HRTF Data Sets +===================== + +OpenAL Soft also provides an option to use user-specified data sets, in +addition to or in place of the default set. This allows users to provide their +own data sets, which could be better suited for their heads, or to work with +stereo speakers instead of headphones, or to support more playback sample +rates, for example. + +The file format is specified below. It uses little-endian byte order. + +== +ALchar magic[8] = "MinPHR02"; +ALuint sampleRate; +ALubyte sampleType; /* Can be 0 (16-bit) or 1 (24-bit). */ +ALubyte channelType; /* Can be 0 (mono) or 1 (stereo). */ +ALubyte hrirSize; /* Can be 8 to 128 in steps of 8. */ +ALubyte fdCount; /* Can be 1 to 16. */ + +struct { + ALushort distance; /* Can be 50mm to 2500mm. */ + ALubyte evCount; /* Can be 5 to 128. */ + ALubyte azCount[evCount]; /* Each can be 1 to 128. */ +} fields[fdCount]; + +/* NOTE: ALtype can be ALshort (16-bit) or ALbyte[3] (24-bit) depending on + * sampleType, + * hrirCount is the sum of all azCounts. + * channels can be 1 (mono) or 2 (stereo) depending on channelType. + */ +ALtype coefficients[hrirCount][hrirSize][channels]; +ALubyte delays[hrirCount][channels]; /* Each can be 0 to 63. */ +== + +The data is described as thus: + +The file first starts with the 8-byte marker, "MinPHR02", to identify it as an +HRTF data set. This is followed by an unsigned 32-bit integer, specifying the +sample rate the data set is designed for (OpenAL Soft will not use it if the +output device's playback rate doesn't match). + +Afterward, an unsigned 8-bit integer specifies how many sample points (or +finite impulse response filter coefficients) make up each HRIR. + +The following unsigned 8-bit integer specifies the number of fields used by the +data set. Then for each field an unsigned 16-bit short specifies the distance +for that field (in millimeters), followed by an 8-bit integer for the number of +elevations. These elevations start at the bottom (-90 degrees), and increment +upwards. Following this is an array of unsigned 8-bit integers, one for each +elevation which specifies the number of azimuths (and thus HRIRs) that make up +each elevation. Azimuths start clockwise from the front, constructing a full +circle. Mono HRTFs use the same HRIRs for both ears by reversing the azimuth +calculation (ie. left = angle, right = 360-angle). + +The actual coefficients follow. Each coefficient is a signed 16-bit or 24-bit +sample. Stereo HRTFs interleave left/right ear coefficients. The HRIRs must +be minimum-phase. This allows the use of a smaller filter length, reducing +computation. For reference, the default data set uses a 32-point filter while +even the smallest data set provided by MIT used a 128-sample filter (a 4x +reduction by applying minimum-phase reconstruction). + +After the coefficients is an array of unsigned 8-bit delay values, one for +each HRIR (with stereo HRTFs interleaving left/right ear delays). This is the +propagation delay (in samples) a signal must wait before being convolved with +the corresponding minimum-phase HRIR filter. diff --git a/love/src/jni/openal-soft-1.19.1/examples/alffplay.cpp b/love/src/jni/openal-soft-1.19.1/examples/alffplay.cpp new file mode 100644 index 00000000..27520a6d --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/examples/alffplay.cpp @@ -0,0 +1,1915 @@ +/* + * An example showing how to play a stream sync'd to video, using ffmpeg. + * + * Requires C++11. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "libavcodec/avcodec.h" +#include "libavformat/avformat.h" +#include "libavformat/avio.h" +#include "libavutil/time.h" +#include "libavutil/pixfmt.h" +#include "libavutil/avstring.h" +#include "libavutil/channel_layout.h" +#include "libswscale/swscale.h" +#include "libswresample/swresample.h" +} + +#include "SDL.h" + +#include "AL/alc.h" +#include "AL/al.h" +#include "AL/alext.h" + +#include "common/alhelpers.h" + +extern "C" { +/* Undefine this to disable use of experimental extensions. Don't use for + * production code! Interfaces and behavior may change prior to being + * finalized. + */ +#define ALLOW_EXPERIMENTAL_EXTS + +#ifdef ALLOW_EXPERIMENTAL_EXTS +#ifndef AL_SOFT_map_buffer +#define AL_SOFT_map_buffer 1 +typedef unsigned int ALbitfieldSOFT; +#define AL_MAP_READ_BIT_SOFT 0x00000001 +#define AL_MAP_WRITE_BIT_SOFT 0x00000002 +#define AL_MAP_PERSISTENT_BIT_SOFT 0x00000004 +#define AL_PRESERVE_DATA_BIT_SOFT 0x00000008 +typedef void (AL_APIENTRY*LPALBUFFERSTORAGESOFT)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq, ALbitfieldSOFT flags); +typedef void* (AL_APIENTRY*LPALMAPBUFFERSOFT)(ALuint buffer, ALsizei offset, ALsizei length, ALbitfieldSOFT access); +typedef void (AL_APIENTRY*LPALUNMAPBUFFERSOFT)(ALuint buffer); +typedef void (AL_APIENTRY*LPALFLUSHMAPPEDBUFFERSOFT)(ALuint buffer, ALsizei offset, ALsizei length); +#endif + +#ifndef AL_SOFT_events +#define AL_SOFT_events 1 +#define AL_EVENT_CALLBACK_FUNCTION_SOFT 0x1220 +#define AL_EVENT_CALLBACK_USER_PARAM_SOFT 0x1221 +#define AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT 0x1222 +#define AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT 0x1223 +#define AL_EVENT_TYPE_ERROR_SOFT 0x1224 +#define AL_EVENT_TYPE_PERFORMANCE_SOFT 0x1225 +#define AL_EVENT_TYPE_DEPRECATED_SOFT 0x1226 +#define AL_EVENT_TYPE_DISCONNECTED_SOFT 0x1227 +typedef void (AL_APIENTRY*ALEVENTPROCSOFT)(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam); +typedef void (AL_APIENTRY*LPALEVENTCONTROLSOFT)(ALsizei count, const ALenum *types, ALboolean enable); +typedef void (AL_APIENTRY*LPALEVENTCALLBACKSOFT)(ALEVENTPROCSOFT callback, void *userParam); +typedef void* (AL_APIENTRY*LPALGETPOINTERSOFT)(ALenum pname); +typedef void (AL_APIENTRY*LPALGETPOINTERVSOFT)(ALenum pname, void **values); +#endif +#endif /* ALLOW_EXPERIMENTAL_EXTS */ +} + +namespace { + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +using nanoseconds = std::chrono::nanoseconds; +using microseconds = std::chrono::microseconds; +using milliseconds = std::chrono::milliseconds; +using seconds = std::chrono::seconds; +using seconds_d64 = std::chrono::duration; + +const std::string AppName("alffplay"); + +bool EnableDirectOut = false; +bool EnableWideStereo = false; +LPALGETSOURCEI64VSOFT alGetSourcei64vSOFT; +LPALCGETINTEGER64VSOFT alcGetInteger64vSOFT; + +#ifdef AL_SOFT_map_buffer +LPALBUFFERSTORAGESOFT alBufferStorageSOFT; +LPALMAPBUFFERSOFT alMapBufferSOFT; +LPALUNMAPBUFFERSOFT alUnmapBufferSOFT; +#endif + +#ifdef AL_SOFT_events +LPALEVENTCONTROLSOFT alEventControlSOFT; +LPALEVENTCALLBACKSOFT alEventCallbackSOFT; +#endif + +const seconds AVNoSyncThreshold(10); + +const milliseconds VideoSyncThreshold(10); +#define VIDEO_PICTURE_QUEUE_SIZE 16 + +const seconds_d64 AudioSyncThreshold(0.03); +const milliseconds AudioSampleCorrectionMax(50); +/* Averaging filter coefficient for audio sync. */ +#define AUDIO_DIFF_AVG_NB 20 +const double AudioAvgFilterCoeff = std::pow(0.01, 1.0/AUDIO_DIFF_AVG_NB); +/* Per-buffer size, in time */ +const milliseconds AudioBufferTime(20); +/* Buffer total size, in time (should be divisible by the buffer time) */ +const milliseconds AudioBufferTotalTime(800); + +#define MAX_QUEUE_SIZE (15 * 1024 * 1024) /* Bytes of compressed data to keep queued */ + +enum { + FF_UPDATE_EVENT = SDL_USEREVENT, + FF_REFRESH_EVENT, + FF_MOVIE_DONE_EVENT +}; + +enum class SyncMaster { + Audio, + Video, + External, + + Default = External +}; + + +inline microseconds get_avtime() +{ return microseconds(av_gettime()); } + +/* Define unique_ptrs to auto-cleanup associated ffmpeg objects. */ +struct AVIOContextDeleter { + void operator()(AVIOContext *ptr) { avio_closep(&ptr); } +}; +using AVIOContextPtr = std::unique_ptr; + +struct AVFormatCtxDeleter { + void operator()(AVFormatContext *ptr) { avformat_close_input(&ptr); } +}; +using AVFormatCtxPtr = std::unique_ptr; + +struct AVCodecCtxDeleter { + void operator()(AVCodecContext *ptr) { avcodec_free_context(&ptr); } +}; +using AVCodecCtxPtr = std::unique_ptr; + +struct AVFrameDeleter { + void operator()(AVFrame *ptr) { av_frame_free(&ptr); } +}; +using AVFramePtr = std::unique_ptr; + +struct SwrContextDeleter { + void operator()(SwrContext *ptr) { swr_free(&ptr); } +}; +using SwrContextPtr = std::unique_ptr; + +struct SwsContextDeleter { + void operator()(SwsContext *ptr) { sws_freeContext(ptr); } +}; +using SwsContextPtr = std::unique_ptr; + + +class PacketQueue { + std::deque mPackets; + size_t mTotalSize{0}; + +public: + ~PacketQueue() { clear(); } + + bool empty() const noexcept { return mPackets.empty(); } + size_t totalSize() const noexcept { return mTotalSize; } + + void put(const AVPacket *pkt) + { + mPackets.push_back(AVPacket{}); + if(av_packet_ref(&mPackets.back(), pkt) != 0) + mPackets.pop_back(); + else + mTotalSize += mPackets.back().size; + } + + AVPacket *front() noexcept + { return &mPackets.front(); } + + void pop() + { + AVPacket *pkt = &mPackets.front(); + mTotalSize -= pkt->size; + av_packet_unref(pkt); + mPackets.pop_front(); + } + + void clear() + { + for(AVPacket &pkt : mPackets) + av_packet_unref(&pkt); + mPackets.clear(); + mTotalSize = 0; + } +}; + + +struct MovieState; + +struct AudioState { + MovieState &mMovie; + + AVStream *mStream{nullptr}; + AVCodecCtxPtr mCodecCtx; + + std::mutex mQueueMtx; + std::condition_variable mQueueCond; + + /* Used for clock difference average computation */ + seconds_d64 mClockDiffAvg{0}; + + /* Time of the next sample to be buffered */ + nanoseconds mCurrentPts{0}; + + /* Device clock time that the stream started at. */ + nanoseconds mDeviceStartTime{nanoseconds::min()}; + + /* Decompressed sample frame, and swresample context for conversion */ + AVFramePtr mDecodedFrame; + SwrContextPtr mSwresCtx; + + /* Conversion format, for what gets fed to OpenAL */ + int mDstChanLayout{0}; + AVSampleFormat mDstSampleFmt{AV_SAMPLE_FMT_NONE}; + + /* Storage of converted samples */ + uint8_t *mSamples{nullptr}; + int mSamplesLen{0}; /* In samples */ + int mSamplesPos{0}; + int mSamplesMax{0}; + + /* OpenAL format */ + ALenum mFormat{AL_NONE}; + ALsizei mFrameSize{0}; + + std::mutex mSrcMutex; + std::condition_variable mSrcCond; + std::atomic_flag mConnected; + ALuint mSource{0}; + std::vector mBuffers; + ALsizei mBufferIdx{0}; + + AudioState(MovieState &movie) : mMovie(movie) + { mConnected.test_and_set(std::memory_order_relaxed); } + ~AudioState() + { + if(mSource) + alDeleteSources(1, &mSource); + if(!mBuffers.empty()) + alDeleteBuffers(mBuffers.size(), mBuffers.data()); + + av_freep(&mSamples); + } + +#ifdef AL_SOFT_events + static void AL_APIENTRY EventCallback(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam); +#endif + + nanoseconds getClockNoLock(); + nanoseconds getClock() + { + std::lock_guard lock(mSrcMutex); + return getClockNoLock(); + } + + bool isBufferFilled(); + void startPlayback(); + + int getSync(); + int decodeFrame(); + bool readAudio(uint8_t *samples, int length); + + int handler(); +}; + +struct VideoState { + MovieState &mMovie; + + AVStream *mStream{nullptr}; + AVCodecCtxPtr mCodecCtx; + + std::mutex mQueueMtx; + std::condition_variable mQueueCond; + + nanoseconds mClock{0}; + nanoseconds mFrameTimer{0}; + nanoseconds mFrameLastPts{0}; + nanoseconds mFrameLastDelay{0}; + nanoseconds mCurrentPts{0}; + /* time (av_gettime) at which we updated mCurrentPts - used to have running video pts */ + microseconds mCurrentPtsTime{0}; + + /* Decompressed video frame, and swscale context for conversion */ + AVFramePtr mDecodedFrame; + SwsContextPtr mSwscaleCtx; + + struct Picture { + SDL_Texture *mImage{nullptr}; + int mWidth{0}, mHeight{0}; /* Logical image size (actual size may be larger) */ + std::atomic mUpdated{false}; + nanoseconds mPts{0}; + + ~Picture() + { + if(mImage) + SDL_DestroyTexture(mImage); + mImage = nullptr; + } + }; + std::array mPictQ; + size_t mPictQSize{0}, mPictQRead{0}, mPictQWrite{0}; + std::mutex mPictQMutex; + std::condition_variable mPictQCond; + bool mFirstUpdate{true}; + std::atomic mEOS{false}; + std::atomic mFinalUpdate{false}; + + VideoState(MovieState &movie) : mMovie(movie) { } + + nanoseconds getClock(); + bool isBufferFilled(); + + static Uint32 SDLCALL sdl_refresh_timer_cb(Uint32 interval, void *opaque); + void schedRefresh(milliseconds delay); + void display(SDL_Window *screen, SDL_Renderer *renderer); + void refreshTimer(SDL_Window *screen, SDL_Renderer *renderer); + void updatePicture(SDL_Window *screen, SDL_Renderer *renderer); + int queuePicture(nanoseconds pts); + int handler(); +}; + +struct MovieState { + AVIOContextPtr mIOContext; + AVFormatCtxPtr mFormatCtx; + + SyncMaster mAVSyncType{SyncMaster::Default}; + + microseconds mClockBase{0}; + std::atomic mPlaying{false}; + + std::mutex mSendMtx; + std::condition_variable mSendCond; + /* NOTE: false/clear = need data, true/set = no data needed */ + std::atomic_flag mSendDataGood; + + std::atomic mQuit{false}; + + AudioState mAudio; + VideoState mVideo; + + std::thread mParseThread; + std::thread mAudioThread; + std::thread mVideoThread; + + std::string mFilename; + + MovieState(std::string fname) + : mAudio(*this), mVideo(*this), mFilename(std::move(fname)) + { } + ~MovieState() + { + mQuit = true; + if(mParseThread.joinable()) + mParseThread.join(); + } + + static int decode_interrupt_cb(void *ctx); + bool prepare(); + void setTitle(SDL_Window *window); + + nanoseconds getClock(); + + nanoseconds getMasterClock(); + + nanoseconds getDuration(); + + int streamComponentOpen(int stream_index); + int parse_handler(); +}; + + +nanoseconds AudioState::getClockNoLock() +{ + // The audio clock is the timestamp of the sample currently being heard. + if(alcGetInteger64vSOFT) + { + // If device start time = min, we aren't playing yet. + if(mDeviceStartTime == nanoseconds::min()) + return nanoseconds::zero(); + + // Get the current device clock time and latency. + auto device = alcGetContextsDevice(alcGetCurrentContext()); + ALCint64SOFT devtimes[2] = {0,0}; + alcGetInteger64vSOFT(device, ALC_DEVICE_CLOCK_LATENCY_SOFT, 2, devtimes); + auto latency = nanoseconds(devtimes[1]); + auto device_time = nanoseconds(devtimes[0]); + + // The clock is simply the current device time relative to the recorded + // start time. We can also subtract the latency to get more a accurate + // position of where the audio device actually is in the output stream. + return device_time - mDeviceStartTime - latency; + } + + /* The source-based clock is based on 4 components: + * 1 - The timestamp of the next sample to buffer (mCurrentPts) + * 2 - The length of the source's buffer queue + * (AudioBufferTime*AL_BUFFERS_QUEUED) + * 3 - The offset OpenAL is currently at in the source (the first value + * from AL_SAMPLE_OFFSET_LATENCY_SOFT) + * 4 - The latency between OpenAL and the DAC (the second value from + * AL_SAMPLE_OFFSET_LATENCY_SOFT) + * + * Subtracting the length of the source queue from the next sample's + * timestamp gives the timestamp of the sample at the start of the source + * queue. Adding the source offset to that results in the timestamp for the + * sample at OpenAL's current position, and subtracting the source latency + * from that gives the timestamp of the sample currently at the DAC. + */ + nanoseconds pts = mCurrentPts; + if(mSource) + { + ALint64SOFT offset[2]; + ALint queued; + ALint status; + + /* NOTE: The source state must be checked last, in case an underrun + * occurs and the source stops between retrieving the offset+latency + * and getting the state. */ + if(alGetSourcei64vSOFT) + alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_LATENCY_SOFT, offset); + else + { + ALint ioffset; + alGetSourcei(mSource, AL_SAMPLE_OFFSET, &ioffset); + offset[0] = (ALint64SOFT)ioffset << 32; + offset[1] = 0; + } + alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued); + alGetSourcei(mSource, AL_SOURCE_STATE, &status); + + /* If the source is AL_STOPPED, then there was an underrun and all + * buffers are processed, so ignore the source queue. The audio thread + * will put the source into an AL_INITIAL state and clear the queue + * when it starts recovery. */ + if(status != AL_STOPPED) + { + using fixed32 = std::chrono::duration>; + + pts -= AudioBufferTime*queued; + pts += std::chrono::duration_cast( + fixed32(offset[0] / mCodecCtx->sample_rate) + ); + } + /* Don't offset by the latency if the source isn't playing. */ + if(status == AL_PLAYING) + pts -= nanoseconds(offset[1]); + } + + return std::max(pts, nanoseconds::zero()); +} + +bool AudioState::isBufferFilled() +{ + /* All of OpenAL's buffer queueing happens under the mSrcMutex lock, as + * does the source gen. So when we're able to grab the lock and the source + * is valid, the queue must be full. + */ + std::lock_guard lock(mSrcMutex); + return mSource != 0; +} + +void AudioState::startPlayback() +{ + alSourcePlay(mSource); + if(alcGetInteger64vSOFT) + { + using fixed32 = std::chrono::duration>; + + // Subtract the total buffer queue time from the current pts to get the + // pts of the start of the queue. + nanoseconds startpts = mCurrentPts - AudioBufferTotalTime; + int64_t srctimes[2]={0,0}; + alGetSourcei64vSOFT(mSource, AL_SAMPLE_OFFSET_CLOCK_SOFT, srctimes); + auto device_time = nanoseconds(srctimes[1]); + auto src_offset = std::chrono::duration_cast(fixed32(srctimes[0])) / + mCodecCtx->sample_rate; + + // The mixer may have ticked and incremented the device time and sample + // offset, so subtract the source offset from the device time to get + // the device time the source started at. Also subtract startpts to get + // the device time the stream would have started at to reach where it + // is now. + mDeviceStartTime = device_time - src_offset - startpts; + } +} + +int AudioState::getSync() +{ + if(mMovie.mAVSyncType == SyncMaster::Audio) + return 0; + + auto ref_clock = mMovie.getMasterClock(); + auto diff = ref_clock - getClockNoLock(); + + if(!(diff < AVNoSyncThreshold && diff > -AVNoSyncThreshold)) + { + /* Difference is TOO big; reset accumulated average */ + mClockDiffAvg = seconds_d64::zero(); + return 0; + } + + /* Accumulate the diffs */ + mClockDiffAvg = mClockDiffAvg*AudioAvgFilterCoeff + diff; + auto avg_diff = mClockDiffAvg*(1.0 - AudioAvgFilterCoeff); + if(avg_diff < AudioSyncThreshold/2.0 && avg_diff > -AudioSyncThreshold) + return 0; + + /* Constrain the per-update difference to avoid exceedingly large skips */ + diff = std::min(std::max(diff, -AudioSampleCorrectionMax), + AudioSampleCorrectionMax); + return (int)std::chrono::duration_cast(diff*mCodecCtx->sample_rate).count(); +} + +int AudioState::decodeFrame() +{ + while(!mMovie.mQuit.load(std::memory_order_relaxed)) + { + std::unique_lock lock(mQueueMtx); + int ret = avcodec_receive_frame(mCodecCtx.get(), mDecodedFrame.get()); + if(ret == AVERROR(EAGAIN)) + { + mMovie.mSendDataGood.clear(std::memory_order_relaxed); + std::unique_lock(mMovie.mSendMtx).unlock(); + mMovie.mSendCond.notify_one(); + do { + mQueueCond.wait(lock); + ret = avcodec_receive_frame(mCodecCtx.get(), mDecodedFrame.get()); + } while(ret == AVERROR(EAGAIN)); + } + lock.unlock(); + if(ret == AVERROR_EOF) break; + mMovie.mSendDataGood.clear(std::memory_order_relaxed); + mMovie.mSendCond.notify_one(); + if(ret < 0) + { + std::cerr<< "Failed to decode frame: "<nb_samples <= 0) + { + av_frame_unref(mDecodedFrame.get()); + continue; + } + + /* If provided, update w/ pts */ + if(mDecodedFrame->best_effort_timestamp != AV_NOPTS_VALUE) + mCurrentPts = std::chrono::duration_cast( + seconds_d64(av_q2d(mStream->time_base)*mDecodedFrame->best_effort_timestamp) + ); + + if(mDecodedFrame->nb_samples > mSamplesMax) + { + av_freep(&mSamples); + av_samples_alloc( + &mSamples, nullptr, mCodecCtx->channels, + mDecodedFrame->nb_samples, mDstSampleFmt, 0 + ); + mSamplesMax = mDecodedFrame->nb_samples; + } + /* Return the amount of sample frames converted */ + int data_size = swr_convert(mSwresCtx.get(), &mSamples, mDecodedFrame->nb_samples, + (const uint8_t**)mDecodedFrame->data, mDecodedFrame->nb_samples + ); + + av_frame_unref(mDecodedFrame.get()); + return data_size; + } + + return 0; +} + +/* Duplicates the sample at in to out, count times. The frame size is a + * multiple of the template type size. + */ +template +static void sample_dup(uint8_t *out, const uint8_t *in, int count, int frame_size) +{ + const T *sample = reinterpret_cast(in); + T *dst = reinterpret_cast(out); + if(frame_size == sizeof(T)) + std::fill_n(dst, count, *sample); + else + { + /* NOTE: frame_size is a multiple of sizeof(T). */ + int type_mult = frame_size / sizeof(T); + int i = 0; + std::generate_n(dst, count*type_mult, + [sample,type_mult,&i]() -> T + { + T ret = sample[i]; + i = (i+1)%type_mult; + return ret; + } + ); + } +} + + +bool AudioState::readAudio(uint8_t *samples, int length) +{ + int sample_skip = getSync(); + int audio_size = 0; + + /* Read the next chunk of data, refill the buffer, and queue it + * on the source */ + length /= mFrameSize; + while(audio_size < length) + { + if(mSamplesLen <= 0 || mSamplesPos >= mSamplesLen) + { + int frame_len = decodeFrame(); + if(frame_len <= 0) break; + + mSamplesLen = frame_len; + mSamplesPos = std::min(mSamplesLen, sample_skip); + sample_skip -= mSamplesPos; + + // Adjust the device start time and current pts by the amount we're + // skipping/duplicating, so that the clock remains correct for the + // current stream position. + auto skip = nanoseconds(seconds(mSamplesPos)) / mCodecCtx->sample_rate; + mDeviceStartTime -= skip; + mCurrentPts += skip; + continue; + } + + int rem = length - audio_size; + if(mSamplesPos >= 0) + { + int len = mSamplesLen - mSamplesPos; + if(rem > len) rem = len; + memcpy(samples, mSamples + mSamplesPos*mFrameSize, rem*mFrameSize); + } + else + { + rem = std::min(rem, -mSamplesPos); + + /* Add samples by copying the first sample */ + if((mFrameSize&7) == 0) + sample_dup(samples, mSamples, rem, mFrameSize); + else if((mFrameSize&3) == 0) + sample_dup(samples, mSamples, rem, mFrameSize); + else if((mFrameSize&1) == 0) + sample_dup(samples, mSamples, rem, mFrameSize); + else + sample_dup(samples, mSamples, rem, mFrameSize); + } + + mSamplesPos += rem; + mCurrentPts += nanoseconds(seconds(rem)) / mCodecCtx->sample_rate; + samples += rem*mFrameSize; + audio_size += rem; + } + if(audio_size <= 0) + return false; + + if(audio_size < length) + { + int rem = length - audio_size; + std::fill_n(samples, rem*mFrameSize, + (mDstSampleFmt == AV_SAMPLE_FMT_U8) ? 0x80 : 0x00); + mCurrentPts += nanoseconds(seconds(rem)) / mCodecCtx->sample_rate; + audio_size += rem; + } + return true; +} + + +#ifdef AL_SOFT_events +void AL_APIENTRY AudioState::EventCallback(ALenum eventType, ALuint object, ALuint param, + ALsizei length, const ALchar *message, + void *userParam) +{ + AudioState *self = reinterpret_cast(userParam); + + if(eventType == AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT) + { + /* Temporarily lock the source mutex to ensure it's not between + * checking the processed count and going to sleep. + */ + std::unique_lock(self->mSrcMutex).unlock(); + self->mSrcCond.notify_one(); + return; + } + + std::cout<< "\n---- AL Event on AudioState "< lock(self->mSrcMutex); + self->mConnected.clear(std::memory_order_release); + } + std::unique_lock(self->mSrcMutex).unlock(); + self->mSrcCond.notify_one(); + } +} +#endif + +int AudioState::handler() +{ + std::unique_lock lock(mSrcMutex); + milliseconds sleep_time = AudioBufferTime / 3; + ALenum fmt; + +#ifdef AL_SOFT_events + const std::array evt_types{{ + AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT, AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT, + AL_EVENT_TYPE_ERROR_SOFT, AL_EVENT_TYPE_PERFORMANCE_SOFT, AL_EVENT_TYPE_DEPRECATED_SOFT, + AL_EVENT_TYPE_DISCONNECTED_SOFT + }}; + if(alEventControlSOFT) + { + alEventControlSOFT(evt_types.size(), evt_types.data(), AL_TRUE); + alEventCallbackSOFT(EventCallback, this); + sleep_time = AudioBufferTotalTime; + } +#endif + + /* Find a suitable format for OpenAL. */ + mDstChanLayout = 0; + if(mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8 || mCodecCtx->sample_fmt == AV_SAMPLE_FMT_U8P) + { + mDstSampleFmt = AV_SAMPLE_FMT_U8; + mFrameSize = 1; + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_71CHN8")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 8; + mFormat = fmt; + } + if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || + mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_51CHN8")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 6; + mFormat = fmt; + } + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 1; + mFormat = AL_FORMAT_MONO8; + } + if(!mDstChanLayout) + { + mDstChanLayout = AV_CH_LAYOUT_STEREO; + mFrameSize *= 2; + mFormat = AL_FORMAT_STEREO8; + } + } + if((mCodecCtx->sample_fmt == AV_SAMPLE_FMT_FLT || mCodecCtx->sample_fmt == AV_SAMPLE_FMT_FLTP) && + alIsExtensionPresent("AL_EXT_FLOAT32")) + { + mDstSampleFmt = AV_SAMPLE_FMT_FLT; + mFrameSize = 4; + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_71CHN32")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 8; + mFormat = fmt; + } + if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || + mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_51CHN32")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 6; + mFormat = fmt; + } + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 1; + mFormat = AL_FORMAT_MONO_FLOAT32; + } + if(!mDstChanLayout) + { + mDstChanLayout = AV_CH_LAYOUT_STEREO; + mFrameSize *= 2; + mFormat = AL_FORMAT_STEREO_FLOAT32; + } + } + if(!mDstChanLayout) + { + mDstSampleFmt = AV_SAMPLE_FMT_S16; + mFrameSize = 2; + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_7POINT1 && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_71CHN16")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 8; + mFormat = fmt; + } + if((mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1 || + mCodecCtx->channel_layout == AV_CH_LAYOUT_5POINT1_BACK) && + alIsExtensionPresent("AL_EXT_MCFORMATS") && + (fmt=alGetEnumValue("AL_FORMAT_51CHN16")) != AL_NONE && fmt != -1) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 6; + mFormat = fmt; + } + if(mCodecCtx->channel_layout == AV_CH_LAYOUT_MONO) + { + mDstChanLayout = mCodecCtx->channel_layout; + mFrameSize *= 1; + mFormat = AL_FORMAT_MONO16; + } + if(!mDstChanLayout) + { + mDstChanLayout = AV_CH_LAYOUT_STEREO; + mFrameSize *= 2; + mFormat = AL_FORMAT_STEREO16; + } + } + void *samples = nullptr; + ALsizei buffer_len = std::chrono::duration_cast>( + mCodecCtx->sample_rate * AudioBufferTime).count() * mFrameSize; + + mSamples = NULL; + mSamplesMax = 0; + mSamplesPos = 0; + mSamplesLen = 0; + + mDecodedFrame.reset(av_frame_alloc()); + if(!mDecodedFrame) + { + std::cerr<< "Failed to allocate audio frame" <sample_rate, + mCodecCtx->channel_layout ? mCodecCtx->channel_layout : + (uint64_t)av_get_default_channel_layout(mCodecCtx->channels), + mCodecCtx->sample_fmt, mCodecCtx->sample_rate, + 0, nullptr + )); + if(!mSwresCtx || swr_init(mSwresCtx.get()) != 0) + { + std::cerr<< "Failed to initialize audio converter" <sample_rate, + AL_MAP_WRITE_BIT_SOFT); + if(alGetError() != AL_NO_ERROR) + { + fprintf(stderr, "Failed to use mapped buffers\n"); + samples = av_malloc(buffer_len); + } + } + else +#endif + samples = av_malloc(buffer_len); + + while(alGetError() == AL_NO_ERROR && !mMovie.mQuit.load(std::memory_order_relaxed) && + mConnected.test_and_set(std::memory_order_relaxed)) + { + /* First remove any processed buffers. */ + ALint processed; + alGetSourcei(mSource, AL_BUFFERS_PROCESSED, &processed); + while(processed > 0) + { + std::array bids; + alSourceUnqueueBuffers(mSource, std::min(bids.size(), processed), + bids.data()); + processed -= std::min(bids.size(), processed); + } + + /* Refill the buffer queue. */ + ALint queued; + alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued); + while((ALuint)queued < mBuffers.size()) + { + ALuint bufid = mBuffers[mBufferIdx]; + + uint8_t *ptr = reinterpret_cast(samples +#ifdef AL_SOFT_map_buffer + ? samples : alMapBufferSOFT(bufid, 0, buffer_len, AL_MAP_WRITE_BIT_SOFT) +#endif + ); + if(!ptr) break; + + /* Read the next chunk of data, filling the buffer, and queue it on + * the source */ + bool got_audio = readAudio(ptr, buffer_len); +#ifdef AL_SOFT_map_buffer + if(!samples) alUnmapBufferSOFT(bufid); +#endif + if(!got_audio) break; + + if(samples) + alBufferData(bufid, mFormat, samples, buffer_len, mCodecCtx->sample_rate); + + alSourceQueueBuffers(mSource, 1, &bufid); + mBufferIdx = (mBufferIdx+1) % mBuffers.size(); + ++queued; + } + if(queued == 0) + break; + + /* Check that the source is playing. */ + ALint state; + alGetSourcei(mSource, AL_SOURCE_STATE, &state); + if(state == AL_STOPPED) + { + /* AL_STOPPED means there was an underrun. Clear the buffer queue + * since this likely means we're late, and rewind the source to get + * it back into an AL_INITIAL state. + */ + alSourceRewind(mSource); + alSourcei(mSource, AL_BUFFER, 0); + continue; + } + + /* (re)start the source if needed, and wait for a buffer to finish */ + if(state != AL_PLAYING && state != AL_PAUSED && + mMovie.mPlaying.load(std::memory_order_relaxed)) + startPlayback(); + + mSrcCond.wait_for(lock, sleep_time); + } + + alSourceRewind(mSource); + alSourcei(mSource, AL_BUFFER, 0); + +finish: + av_freep(&samples); + +#ifdef AL_SOFT_events + if(alEventControlSOFT) + { + alEventControlSOFT(evt_types.size(), evt_types.data(), AL_FALSE); + alEventCallbackSOFT(nullptr, nullptr); + } +#endif + + return 0; +} + + +nanoseconds VideoState::getClock() +{ + /* NOTE: This returns incorrect times while not playing. */ + auto delta = get_avtime() - mCurrentPtsTime; + return mCurrentPts + delta; +} + +bool VideoState::isBufferFilled() +{ + std::unique_lock lock(mPictQMutex); + return mPictQSize >= mPictQ.size(); +} + +Uint32 SDLCALL VideoState::sdl_refresh_timer_cb(Uint32 /*interval*/, void *opaque) +{ + SDL_Event evt{}; + evt.user.type = FF_REFRESH_EVENT; + evt.user.data1 = opaque; + SDL_PushEvent(&evt); + return 0; /* 0 means stop timer */ +} + +/* Schedules an FF_REFRESH_EVENT event to occur in 'delay' ms. */ +void VideoState::schedRefresh(milliseconds delay) +{ + SDL_AddTimer(delay.count(), sdl_refresh_timer_cb, this); +} + +/* Called by VideoState::refreshTimer to display the next video frame. */ +void VideoState::display(SDL_Window *screen, SDL_Renderer *renderer) +{ + Picture *vp = &mPictQ[mPictQRead]; + + if(!vp->mImage) + return; + + float aspect_ratio; + int win_w, win_h; + int w, h, x, y; + + if(mCodecCtx->sample_aspect_ratio.num == 0) + aspect_ratio = 0.0f; + else + { + aspect_ratio = av_q2d(mCodecCtx->sample_aspect_ratio) * mCodecCtx->width / + mCodecCtx->height; + } + if(aspect_ratio <= 0.0f) + aspect_ratio = (float)mCodecCtx->width / (float)mCodecCtx->height; + + SDL_GetWindowSize(screen, &win_w, &win_h); + h = win_h; + w = ((int)rint(h * aspect_ratio) + 3) & ~3; + if(w > win_w) + { + w = win_w; + h = ((int)rint(w / aspect_ratio) + 3) & ~3; + } + x = (win_w - w) / 2; + y = (win_h - h) / 2; + + SDL_Rect src_rect{ 0, 0, vp->mWidth, vp->mHeight }; + SDL_Rect dst_rect{ x, y, w, h }; + SDL_RenderCopy(renderer, vp->mImage, &src_rect, &dst_rect); + SDL_RenderPresent(renderer); +} + +/* FF_REFRESH_EVENT handler called on the main thread where the SDL_Renderer + * was created. It handles the display of the next decoded video frame (if not + * falling behind), and sets up the timer for the following video frame. + */ +void VideoState::refreshTimer(SDL_Window *screen, SDL_Renderer *renderer) +{ + if(!mStream) + { + if(mEOS) + { + mFinalUpdate = true; + std::unique_lock(mPictQMutex).unlock(); + mPictQCond.notify_all(); + return; + } + schedRefresh(milliseconds(100)); + return; + } + if(!mMovie.mPlaying.load(std::memory_order_relaxed)) + { + schedRefresh(milliseconds(1)); + return; + } + + std::unique_lock lock(mPictQMutex); +retry: + if(mPictQSize == 0) + { + if(mEOS) + mFinalUpdate = true; + else + schedRefresh(milliseconds(1)); + lock.unlock(); + mPictQCond.notify_all(); + return; + } + + Picture *vp = &mPictQ[mPictQRead]; + mCurrentPts = vp->mPts; + mCurrentPtsTime = get_avtime(); + + /* Get delay using the frame pts and the pts from last frame. */ + auto delay = vp->mPts - mFrameLastPts; + if(delay <= seconds::zero() || delay >= seconds(1)) + { + /* If incorrect delay, use previous one. */ + delay = mFrameLastDelay; + } + /* Save for next frame. */ + mFrameLastDelay = delay; + mFrameLastPts = vp->mPts; + + /* Update delay to sync to clock if not master source. */ + if(mMovie.mAVSyncType != SyncMaster::Video) + { + auto ref_clock = mMovie.getMasterClock(); + auto diff = vp->mPts - ref_clock; + + /* Skip or repeat the frame. Take delay into account. */ + auto sync_threshold = std::min(delay, VideoSyncThreshold); + if(!(diff < AVNoSyncThreshold && diff > -AVNoSyncThreshold)) + { + if(diff <= -sync_threshold) + delay = nanoseconds::zero(); + else if(diff >= sync_threshold) + delay *= 2; + } + } + + mFrameTimer += delay; + /* Compute the REAL delay. */ + auto actual_delay = mFrameTimer - get_avtime(); + if(!(actual_delay >= VideoSyncThreshold)) + { + /* We don't have time to handle this picture, just skip to the next one. */ + mPictQRead = (mPictQRead+1)%mPictQ.size(); + mPictQSize--; + goto retry; + } + schedRefresh(std::chrono::duration_cast(actual_delay)); + + /* Show the picture! */ + display(screen, renderer); + + /* Update queue for next picture. */ + mPictQRead = (mPictQRead+1)%mPictQ.size(); + mPictQSize--; + lock.unlock(); + mPictQCond.notify_all(); +} + +/* FF_UPDATE_EVENT handler, updates the picture's texture. It's called on the + * main thread where the renderer was created. + */ +void VideoState::updatePicture(SDL_Window *screen, SDL_Renderer *renderer) +{ + Picture *vp = &mPictQ[mPictQWrite]; + bool fmt_updated = false; + + /* allocate or resize the buffer! */ + if(!vp->mImage || vp->mWidth != mCodecCtx->width || vp->mHeight != mCodecCtx->height) + { + fmt_updated = true; + if(vp->mImage) + SDL_DestroyTexture(vp->mImage); + vp->mImage = SDL_CreateTexture( + renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, + mCodecCtx->coded_width, mCodecCtx->coded_height + ); + if(!vp->mImage) + std::cerr<< "Failed to create YV12 texture!" <mWidth = mCodecCtx->width; + vp->mHeight = mCodecCtx->height; + + if(mFirstUpdate && vp->mWidth > 0 && vp->mHeight > 0) + { + /* For the first update, set the window size to the video size. */ + mFirstUpdate = false; + + int w = vp->mWidth; + int h = vp->mHeight; + if(mCodecCtx->sample_aspect_ratio.den != 0) + { + double aspect_ratio = av_q2d(mCodecCtx->sample_aspect_ratio); + if(aspect_ratio >= 1.0) + w = (int)(w*aspect_ratio + 0.5); + else if(aspect_ratio > 0.0) + h = (int)(h/aspect_ratio + 0.5); + } + SDL_SetWindowSize(screen, w, h); + } + } + + if(vp->mImage) + { + AVFrame *frame = mDecodedFrame.get(); + void *pixels = nullptr; + int pitch = 0; + + if(mCodecCtx->pix_fmt == AV_PIX_FMT_YUV420P) + SDL_UpdateYUVTexture(vp->mImage, nullptr, + frame->data[0], frame->linesize[0], + frame->data[1], frame->linesize[1], + frame->data[2], frame->linesize[2] + ); + else if(SDL_LockTexture(vp->mImage, nullptr, &pixels, &pitch) != 0) + std::cerr<< "Failed to lock texture" <coded_width; + int coded_h = mCodecCtx->coded_height; + int w = mCodecCtx->width; + int h = mCodecCtx->height; + if(!mSwscaleCtx || fmt_updated) + { + mSwscaleCtx.reset(sws_getContext( + w, h, mCodecCtx->pix_fmt, + w, h, AV_PIX_FMT_YUV420P, 0, + nullptr, nullptr, nullptr + )); + } + + /* point pict at the queue */ + uint8_t *pict_data[3]; + pict_data[0] = reinterpret_cast(pixels); + pict_data[1] = pict_data[0] + coded_w*coded_h; + pict_data[2] = pict_data[1] + coded_w*coded_h/4; + + int pict_linesize[3]; + pict_linesize[0] = pitch; + pict_linesize[1] = pitch / 2; + pict_linesize[2] = pitch / 2; + + sws_scale(mSwscaleCtx.get(), (const uint8_t**)frame->data, + frame->linesize, 0, h, pict_data, pict_linesize); + SDL_UnlockTexture(vp->mImage); + } + } + + vp->mUpdated.store(true, std::memory_order_release); + std::unique_lock(mPictQMutex).unlock(); + mPictQCond.notify_one(); +} + +int VideoState::queuePicture(nanoseconds pts) +{ + /* Wait until we have space for a new pic */ + std::unique_lock lock(mPictQMutex); + while(mPictQSize >= mPictQ.size() && !mMovie.mQuit.load(std::memory_order_relaxed)) + mPictQCond.wait(lock); + lock.unlock(); + + if(mMovie.mQuit.load(std::memory_order_relaxed)) + return -1; + + Picture *vp = &mPictQ[mPictQWrite]; + + /* We have to create/update the picture in the main thread */ + vp->mUpdated.store(false, std::memory_order_relaxed); + SDL_Event evt{}; + evt.user.type = FF_UPDATE_EVENT; + evt.user.data1 = this; + SDL_PushEvent(&evt); + + /* Wait until the picture is updated. */ + lock.lock(); + while(!vp->mUpdated.load(std::memory_order_relaxed)) + { + if(mMovie.mQuit.load(std::memory_order_relaxed)) + return -1; + mPictQCond.wait(lock); + } + if(mMovie.mQuit.load(std::memory_order_relaxed)) + return -1; + vp->mPts = pts; + + mPictQWrite = (mPictQWrite+1)%mPictQ.size(); + mPictQSize++; + lock.unlock(); + + return 0; +} + +int VideoState::handler() +{ + mDecodedFrame.reset(av_frame_alloc()); + while(!mMovie.mQuit.load(std::memory_order_relaxed)) + { + std::unique_lock lock(mQueueMtx); + /* Decode video frame */ + int ret = avcodec_receive_frame(mCodecCtx.get(), mDecodedFrame.get()); + if(ret == AVERROR(EAGAIN)) + { + mMovie.mSendDataGood.clear(std::memory_order_relaxed); + std::unique_lock(mMovie.mSendMtx).unlock(); + mMovie.mSendCond.notify_one(); + do { + mQueueCond.wait(lock); + ret = avcodec_receive_frame(mCodecCtx.get(), mDecodedFrame.get()); + } while(ret == AVERROR(EAGAIN)); + } + lock.unlock(); + if(ret == AVERROR_EOF) break; + mMovie.mSendDataGood.clear(std::memory_order_relaxed); + mMovie.mSendCond.notify_one(); + if(ret < 0) + { + std::cerr<< "Failed to decode frame: "<best_effort_timestamp != AV_NOPTS_VALUE) + mClock = std::chrono::duration_cast( + seconds_d64(av_q2d(mStream->time_base)*mDecodedFrame->best_effort_timestamp) + ); + pts = mClock; + + /* Update the video clock to the next expected PTS. */ + auto frame_delay = av_q2d(mCodecCtx->time_base); + frame_delay += mDecodedFrame->repeat_pict * (frame_delay * 0.5); + mClock += std::chrono::duration_cast(seconds_d64(frame_delay)); + + if(queuePicture(pts) < 0) + break; + av_frame_unref(mDecodedFrame.get()); + } + mEOS = true; + + std::unique_lock lock(mPictQMutex); + if(mMovie.mQuit.load(std::memory_order_relaxed)) + { + mPictQRead = 0; + mPictQWrite = 0; + mPictQSize = 0; + } + while(!mFinalUpdate) + mPictQCond.wait(lock); + + return 0; +} + + +int MovieState::decode_interrupt_cb(void *ctx) +{ + return reinterpret_cast(ctx)->mQuit.load(std::memory_order_relaxed); +} + +bool MovieState::prepare() +{ + AVIOContext *avioctx = nullptr; + AVIOInterruptCB intcb = { decode_interrupt_cb, this }; + if(avio_open2(&avioctx, mFilename.c_str(), AVIO_FLAG_READ, &intcb, nullptr)) + { + std::cerr<< "Failed to open "<pb = mIOContext.get(); + fmtctx->interrupt_callback = intcb; + if(avformat_open_input(&fmtctx, mFilename.c_str(), nullptr, nullptr) != 0) + { + std::cerr<< "Failed to open "<>(mFormatCtx->duration); } + +int MovieState::streamComponentOpen(int stream_index) +{ + if(stream_index < 0 || (unsigned int)stream_index >= mFormatCtx->nb_streams) + return -1; + + /* Get a pointer to the codec context for the stream, and open the + * associated codec. + */ + AVCodecCtxPtr avctx(avcodec_alloc_context3(nullptr)); + if(!avctx) return -1; + + if(avcodec_parameters_to_context(avctx.get(), mFormatCtx->streams[stream_index]->codecpar)) + return -1; + + AVCodec *codec = avcodec_find_decoder(avctx->codec_id); + if(!codec || avcodec_open2(avctx.get(), codec, nullptr) < 0) + { + std::cerr<< "Unsupported codec: "<codec_id) + << " (0x"<codec_id<codec_type) + { + case AVMEDIA_TYPE_AUDIO: + mAudio.mStream = mFormatCtx->streams[stream_index]; + mAudio.mCodecCtx = std::move(avctx); + + mAudioThread = std::thread(std::mem_fn(&AudioState::handler), &mAudio); + break; + + case AVMEDIA_TYPE_VIDEO: + mVideo.mStream = mFormatCtx->streams[stream_index]; + mVideo.mCodecCtx = std::move(avctx); + + mVideoThread = std::thread(std::mem_fn(&VideoState::handler), &mVideo); + break; + + default: + return -1; + } + + return stream_index; +} + +int MovieState::parse_handler() +{ + int video_index = -1; + int audio_index = -1; + + /* Dump information about file onto standard error */ + av_dump_format(mFormatCtx.get(), 0, mFilename.c_str(), 0); + + /* Find the first video and audio streams */ + for(unsigned int i = 0;i < mFormatCtx->nb_streams;i++) + { + auto codecpar = mFormatCtx->streams[i]->codecpar; + if(codecpar->codec_type == AVMEDIA_TYPE_VIDEO && video_index < 0) + video_index = streamComponentOpen(i); + else if(codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_index < 0) + audio_index = streamComponentOpen(i); + } + + if(video_index < 0 && audio_index < 0) + { + std::cerr<< mFilename<<": could not open codecs" < lock(mAudio.mQueueMtx); + int ret; + do { + ret = avcodec_send_packet(mAudio.mCodecCtx.get(), audio_queue.front()); + if(ret != AVERROR(EAGAIN)) audio_queue.pop(); + } while(ret != AVERROR(EAGAIN) && !audio_queue.empty()); + lock.unlock(); + mAudio.mQueueCond.notify_one(); + } + if(!video_queue.empty()) + { + std::unique_lock lock(mVideo.mQueueMtx); + int ret; + do { + ret = avcodec_send_packet(mVideo.mCodecCtx.get(), video_queue.front()); + if(ret != AVERROR(EAGAIN)) video_queue.pop(); + } while(ret != AVERROR(EAGAIN) && !video_queue.empty()); + lock.unlock(); + mVideo.mQueueCond.notify_one(); + } + /* If the queues are completely empty, or it's not full and there's + * more input to read, go get more. + */ + size_t queue_size = audio_queue.totalSize() + video_queue.totalSize(); + if(queue_size == 0 || (queue_size < MAX_QUEUE_SIZE && !input_finished)) + break; + + if(!mPlaying.load(std::memory_order_relaxed)) + { + if((!mAudio.mCodecCtx || mAudio.isBufferFilled()) && + (!mVideo.mCodecCtx || mVideo.isBufferFilled())) + { + /* Set the base time 50ms ahead of the current av time. */ + mClockBase = get_avtime() + milliseconds(50); + mVideo.mCurrentPtsTime = mClockBase; + mVideo.mFrameTimer = mVideo.mCurrentPtsTime; + mAudio.startPlayback(); + mPlaying.store(std::memory_order_release); + } + } + /* Nothing to send or get for now, wait a bit and try again. */ + { std::unique_lock lock(mSendMtx); + if(mSendDataGood.test_and_set(std::memory_order_relaxed)) + mSendCond.wait_for(lock, milliseconds(10)); + } + } while(!mQuit.load(std::memory_order_relaxed)); + } + /* Pass a null packet to finish the send buffers (the receive functions + * will get AVERROR_EOF when emptied). + */ + if(mVideo.mCodecCtx) + { + { std::lock_guard lock(mVideo.mQueueMtx); + avcodec_send_packet(mVideo.mCodecCtx.get(), nullptr); + } + mVideo.mQueueCond.notify_one(); + } + if(mAudio.mCodecCtx) + { + { std::lock_guard lock(mAudio.mQueueMtx); + avcodec_send_packet(mAudio.mCodecCtx.get(), nullptr); + } + mAudio.mQueueCond.notify_one(); + } + video_queue.clear(); + audio_queue.clear(); + + /* all done - wait for it */ + if(mVideoThread.joinable()) + mVideoThread.join(); + if(mAudioThread.joinable()) + mAudioThread.join(); + + mVideo.mEOS = true; + std::unique_lock lock(mVideo.mPictQMutex); + while(!mVideo.mFinalUpdate) + mVideo.mPictQCond.wait(lock); + lock.unlock(); + + SDL_Event evt{}; + evt.user.type = FF_MOVIE_DONE_EVENT; + SDL_PushEvent(&evt); + + return 0; +} + + +// Helper class+method to print the time with human-readable formatting. +struct PrettyTime { + seconds mTime; +}; +inline std::ostream &operator<<(std::ostream &os, const PrettyTime &rhs) +{ + using hours = std::chrono::hours; + using minutes = std::chrono::minutes; + using std::chrono::duration_cast; + + seconds t = rhs.mTime; + if(t.count() < 0) + { + os << '-'; + t *= -1; + } + + // Only handle up to hour formatting + if(t >= hours(1)) + os << duration_cast(t).count() << 'h' << std::setfill('0') << std::setw(2) + << (duration_cast(t).count() % 60) << 'm'; + else + os << duration_cast(t).count() << 'm' << std::setfill('0'); + os << std::setw(2) << (duration_cast(t).count() % 60) << 's' << std::setw(0) + << std::setfill(' '); + return os; +} + +} // namespace + + +int main(int argc, char *argv[]) +{ + std::unique_ptr movState; + + if(argc < 2) + { + std::cerr<< "Usage: "<] [-direct] " <( + alcGetProcAddress(device, "alcGetInteger64vSOFT") + ); + } + } + + if(alIsExtensionPresent("AL_SOFT_source_latency")) + { + std::cout<< "Found AL_SOFT_source_latency" <( + alGetProcAddress("alGetSourcei64vSOFT") + ); + } +#ifdef AL_SOFT_map_buffer + if(alIsExtensionPresent("AL_SOFTX_map_buffer")) + { + std::cout<< "Found AL_SOFT_map_buffer" <( + alGetProcAddress("alBufferStorageSOFT")); + alMapBufferSOFT = reinterpret_cast( + alGetProcAddress("alMapBufferSOFT")); + alUnmapBufferSOFT = reinterpret_cast( + alGetProcAddress("alUnmapBufferSOFT")); + } +#endif +#ifdef AL_SOFT_events + if(alIsExtensionPresent("AL_SOFTX_events")) + { + std::cout<< "Found AL_SOFT_events" <( + alGetProcAddress("alEventControlSOFT")); + alEventCallbackSOFT = reinterpret_cast( + alGetProcAddress("alEventCallbackSOFT")); + } +#endif + + int fileidx = 0; + for(;fileidx < argc;++fileidx) + { + if(strcmp(argv[fileidx], "-direct") == 0) + { + if(!alIsExtensionPresent("AL_SOFT_direct_channels")) + std::cerr<< "AL_SOFT_direct_channels not supported for direct output" <(new MovieState(argv[fileidx++])); + if(!movState->prepare()) movState = nullptr; + } + if(!movState) + { + std::cerr<< "Could not start a video" <setTitle(screen); + + /* Default to going to the next movie at the end of one. */ + enum class EomAction { + Next, Quit + } eom_action = EomAction::Next; + seconds last_time(-1); + SDL_Event event; + while(1) + { + int have_evt = SDL_WaitEventTimeout(&event, 10); + + auto cur_time = std::chrono::duration_cast(movState->getMasterClock()); + if(cur_time != last_time) + { + auto end_time = std::chrono::duration_cast(movState->getDuration()); + std::cout<< "\r "<mQuit = true; + eom_action = EomAction::Quit; + break; + + case SDLK_n: + movState->mQuit = true; + eom_action = EomAction::Next; + break; + + default: + break; + } + break; + + case SDL_WINDOWEVENT: + switch(event.window.event) + { + case SDL_WINDOWEVENT_RESIZED: + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderFillRect(renderer, nullptr); + break; + + default: + break; + } + break; + + case SDL_QUIT: + movState->mQuit = true; + eom_action = EomAction::Quit; + break; + + case FF_UPDATE_EVENT: + reinterpret_cast(event.user.data1)->updatePicture( + screen, renderer + ); + break; + + case FF_REFRESH_EVENT: + reinterpret_cast(event.user.data1)->refreshTimer( + screen, renderer + ); + break; + + case FF_MOVIE_DONE_EVENT: + std::cout<<'\n'; + last_time = seconds(-1); + if(eom_action != EomAction::Quit) + { + movState = nullptr; + while(fileidx < argc && !movState) + { + movState = std::unique_ptr(new MovieState(argv[fileidx++])); + if(!movState->prepare()) movState = nullptr; + } + if(movState) + { + movState->setTitle(screen); + break; + } + } + + /* Nothing more to play. Shut everything down and quit. */ + movState = nullptr; + + CloseAL(); + + SDL_DestroyRenderer(renderer); + renderer = nullptr; + SDL_DestroyWindow(screen); + screen = nullptr; + + SDL_Quit(); + exit(0); + + default: + break; + } + } + + std::cerr<< "SDL_WaitEvent error - "< + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* This file contains an example for controlling multiple reverb zones to + * smoothly transition between reverb environments. The general concept is to + * extend single-reverb by also tracking the closest adjacent environment, and + * utilize EAX Reverb's panning vectors to position them relative to the + * listener. + */ + +#include +#include +#include + +#include + +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" +#include "AL/efx-presets.h" + +#include "common/alhelpers.h" + + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + + +/* Filter object functions */ +static LPALGENFILTERS alGenFilters; +static LPALDELETEFILTERS alDeleteFilters; +static LPALISFILTER alIsFilter; +static LPALFILTERI alFilteri; +static LPALFILTERIV alFilteriv; +static LPALFILTERF alFilterf; +static LPALFILTERFV alFilterfv; +static LPALGETFILTERI alGetFilteri; +static LPALGETFILTERIV alGetFilteriv; +static LPALGETFILTERF alGetFilterf; +static LPALGETFILTERFV alGetFilterfv; + +/* Effect object functions */ +static LPALGENEFFECTS alGenEffects; +static LPALDELETEEFFECTS alDeleteEffects; +static LPALISEFFECT alIsEffect; +static LPALEFFECTI alEffecti; +static LPALEFFECTIV alEffectiv; +static LPALEFFECTF alEffectf; +static LPALEFFECTFV alEffectfv; +static LPALGETEFFECTI alGetEffecti; +static LPALGETEFFECTIV alGetEffectiv; +static LPALGETEFFECTF alGetEffectf; +static LPALGETEFFECTFV alGetEffectfv; + +/* Auxiliary Effect Slot object functions */ +static LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots; +static LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots; +static LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot; +static LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti; +static LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv; +static LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf; +static LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv; +static LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti; +static LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv; +static LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf; +static LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv; + + +/* LoadEffect loads the given initial reverb properties into the given OpenAL + * effect object, and returns non-zero on success. + */ +static int LoadEffect(ALuint effect, const EFXEAXREVERBPROPERTIES *reverb) +{ + ALenum err; + + alGetError(); + + /* Prepare the effect for EAX Reverb (standard reverb doesn't contain + * the needed panning vectors). + */ + alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_EAXREVERB); + if((err=alGetError()) != AL_NO_ERROR) + { + fprintf(stderr, "Failed to set EAX Reverb: %s (0x%04x)\n", alGetString(err), err); + return 0; + } + + /* Load the reverb properties. */ + alEffectf(effect, AL_EAXREVERB_DENSITY, reverb->flDensity); + alEffectf(effect, AL_EAXREVERB_DIFFUSION, reverb->flDiffusion); + alEffectf(effect, AL_EAXREVERB_GAIN, reverb->flGain); + alEffectf(effect, AL_EAXREVERB_GAINHF, reverb->flGainHF); + alEffectf(effect, AL_EAXREVERB_GAINLF, reverb->flGainLF); + alEffectf(effect, AL_EAXREVERB_DECAY_TIME, reverb->flDecayTime); + alEffectf(effect, AL_EAXREVERB_DECAY_HFRATIO, reverb->flDecayHFRatio); + alEffectf(effect, AL_EAXREVERB_DECAY_LFRATIO, reverb->flDecayLFRatio); + alEffectf(effect, AL_EAXREVERB_REFLECTIONS_GAIN, reverb->flReflectionsGain); + alEffectf(effect, AL_EAXREVERB_REFLECTIONS_DELAY, reverb->flReflectionsDelay); + alEffectfv(effect, AL_EAXREVERB_REFLECTIONS_PAN, reverb->flReflectionsPan); + alEffectf(effect, AL_EAXREVERB_LATE_REVERB_GAIN, reverb->flLateReverbGain); + alEffectf(effect, AL_EAXREVERB_LATE_REVERB_DELAY, reverb->flLateReverbDelay); + alEffectfv(effect, AL_EAXREVERB_LATE_REVERB_PAN, reverb->flLateReverbPan); + alEffectf(effect, AL_EAXREVERB_ECHO_TIME, reverb->flEchoTime); + alEffectf(effect, AL_EAXREVERB_ECHO_DEPTH, reverb->flEchoDepth); + alEffectf(effect, AL_EAXREVERB_MODULATION_TIME, reverb->flModulationTime); + alEffectf(effect, AL_EAXREVERB_MODULATION_DEPTH, reverb->flModulationDepth); + alEffectf(effect, AL_EAXREVERB_AIR_ABSORPTION_GAINHF, reverb->flAirAbsorptionGainHF); + alEffectf(effect, AL_EAXREVERB_HFREFERENCE, reverb->flHFReference); + alEffectf(effect, AL_EAXREVERB_LFREFERENCE, reverb->flLFReference); + alEffectf(effect, AL_EAXREVERB_ROOM_ROLLOFF_FACTOR, reverb->flRoomRolloffFactor); + alEffecti(effect, AL_EAXREVERB_DECAY_HFLIMIT, reverb->iDecayHFLimit); + + /* Check if an error occured, and return failure if so. */ + if((err=alGetError()) != AL_NO_ERROR) + { + fprintf(stderr, "Error setting up reverb: %s\n", alGetString(err)); + return 0; + } + + return 1; +} + + +/* LoadBuffer loads the named audio file into an OpenAL buffer object, and + * returns the new buffer ID. + */ +static ALuint LoadSound(const char *filename) +{ + Sound_Sample *sample; + ALenum err, format; + ALuint buffer; + Uint32 slen; + + /* Open the audio file */ + sample = Sound_NewSampleFromFile(filename, NULL, 65536); + if(!sample) + { + fprintf(stderr, "Could not open audio in %s\n", filename); + return 0; + } + + /* Get the sound format, and figure out the OpenAL format */ + if(sample->actual.channels == 1) + { + if(sample->actual.format == AUDIO_U8) + format = AL_FORMAT_MONO8; + else if(sample->actual.format == AUDIO_S16SYS) + format = AL_FORMAT_MONO16; + else + { + fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format); + Sound_FreeSample(sample); + return 0; + } + } + else if(sample->actual.channels == 2) + { + if(sample->actual.format == AUDIO_U8) + format = AL_FORMAT_STEREO8; + else if(sample->actual.format == AUDIO_S16SYS) + format = AL_FORMAT_STEREO16; + else + { + fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format); + Sound_FreeSample(sample); + return 0; + } + } + else + { + fprintf(stderr, "Unsupported channel count: %d\n", sample->actual.channels); + Sound_FreeSample(sample); + return 0; + } + + /* Decode the whole audio stream to a buffer. */ + slen = Sound_DecodeAll(sample); + if(!sample->buffer || slen == 0) + { + fprintf(stderr, "Failed to read audio from %s\n", filename); + Sound_FreeSample(sample); + return 0; + } + + /* Buffer the audio data into a new buffer object, then free the data and + * close the file. */ + buffer = 0; + alGenBuffers(1, &buffer); + alBufferData(buffer, format, sample->buffer, slen, sample->actual.rate); + Sound_FreeSample(sample); + + /* Check if an error occured, and clean up if so. */ + err = alGetError(); + if(err != AL_NO_ERROR) + { + fprintf(stderr, "OpenAL Error: %s\n", alGetString(err)); + if(buffer && alIsBuffer(buffer)) + alDeleteBuffers(1, &buffer); + return 0; + } + + return buffer; +} + + +/* Helper to calculate the dot-product of the two given vectors. */ +static ALfloat dot_product(const ALfloat vec0[3], const ALfloat vec1[3]) +{ + return vec0[0]*vec1[0] + vec0[1]*vec1[1] + vec0[2]*vec1[2]; +} + +/* Helper to normalize a given vector. */ +static void normalize(ALfloat vec[3]) +{ + ALfloat mag = sqrtf(dot_product(vec, vec)); + if(mag > 0.00001f) + { + vec[0] /= mag; + vec[1] /= mag; + vec[2] /= mag; + } + else + { + vec[0] = 0.0f; + vec[1] = 0.0f; + vec[2] = 0.0f; + } +} + + +/* The main update function to update the listener and environment effects. */ +static void UpdateListenerAndEffects(float timediff, const ALuint slots[2], const ALuint effects[2], const EFXEAXREVERBPROPERTIES reverbs[2]) +{ + static const ALfloat listener_move_scale = 10.0f; + /* Individual reverb zones are connected via "portals". Each portal has a + * position (center point of the connecting area), a normal (facing + * direction), and a radius (approximate size of the connecting area). + */ + const ALfloat portal_pos[3] = { 0.0f, 0.0f, 0.0f }; + const ALfloat portal_norm[3] = { sqrtf(0.5f), 0.0f, -sqrtf(0.5f) }; + const ALfloat portal_radius = 2.5f; + ALfloat other_dir[3], this_dir[3]; + ALfloat listener_pos[3]; + ALfloat local_norm[3]; + ALfloat local_dir[3]; + ALfloat near_edge[3]; + ALfloat far_edge[3]; + ALfloat dist, edist; + + /* Update the listener position for the amount of time passed. This uses a + * simple triangular LFO to offset the position (moves along the X axis + * between -listener_move_scale and +listener_move_scale for each + * transition). + */ + listener_pos[0] = (fabsf(2.0f - timediff/2.0f) - 1.0f) * listener_move_scale; + listener_pos[1] = 0.0f; + listener_pos[2] = 0.0f; + alListenerfv(AL_POSITION, listener_pos); + + /* Calculate local_dir, which represents the listener-relative point to the + * adjacent zone (should also include orientation). Because EAX Reverb uses + * left-handed coordinates instead of right-handed like the rest of OpenAL, + * negate Z for the local values. + */ + local_dir[0] = portal_pos[0] - listener_pos[0]; + local_dir[1] = portal_pos[1] - listener_pos[1]; + local_dir[2] = -(portal_pos[2] - listener_pos[2]); + /* A normal application would also rotate the portal's normal given the + * listener orientation, to get the listener-relative normal. + */ + local_norm[0] = portal_norm[0]; + local_norm[1] = portal_norm[1]; + local_norm[2] = -portal_norm[2]; + + /* Calculate the distance from the listener to the portal, and ensure it's + * far enough away to not suffer severe floating-point precision issues. + */ + dist = sqrtf(dot_product(local_dir, local_dir)); + if(dist > 0.00001f) + { + const EFXEAXREVERBPROPERTIES *other_reverb, *this_reverb; + ALuint other_effect, this_effect; + ALfloat magnitude, dir_dot_norm; + + /* Normalize the direction to the portal. */ + local_dir[0] /= dist; + local_dir[1] /= dist; + local_dir[2] /= dist; + + /* Calculate the dot product of the portal's local direction and local + * normal, which is used for angular and side checks later on. + */ + dir_dot_norm = dot_product(local_dir, local_norm); + + /* Figure out which zone we're in. */ + if(dir_dot_norm <= 0.0f) + { + /* We're in front of the portal, so we're in Zone 0. */ + this_effect = effects[0]; + other_effect = effects[1]; + this_reverb = &reverbs[0]; + other_reverb = &reverbs[1]; + } + else + { + /* We're behind the portal, so we're in Zone 1. */ + this_effect = effects[1]; + other_effect = effects[0]; + this_reverb = &reverbs[1]; + other_reverb = &reverbs[0]; + } + + /* Calculate the listener-relative extents of the portal. */ + /* First, project the listener-to-portal vector onto the portal's plane + * to get the portal-relative direction along the plane that goes away + * from the listener (toward the farthest edge of the portal). + */ + far_edge[0] = local_dir[0] - local_norm[0]*dir_dot_norm; + far_edge[1] = local_dir[1] - local_norm[1]*dir_dot_norm; + far_edge[2] = local_dir[2] - local_norm[2]*dir_dot_norm; + + edist = sqrtf(dot_product(far_edge, far_edge)); + if(edist > 0.0001f) + { + /* Rescale the portal-relative vector to be at the radius edge. */ + ALfloat mag = portal_radius / edist; + far_edge[0] *= mag; + far_edge[1] *= mag; + far_edge[2] *= mag; + + /* Calculate the closest edge of the portal by negating the + * farthest, and add an offset to make them both relative to the + * listener. + */ + near_edge[0] = local_dir[0]*dist - far_edge[0]; + near_edge[1] = local_dir[1]*dist - far_edge[1]; + near_edge[2] = local_dir[2]*dist - far_edge[2]; + far_edge[0] += local_dir[0]*dist; + far_edge[1] += local_dir[1]*dist; + far_edge[2] += local_dir[2]*dist; + + /* Normalize the listener-relative extents of the portal, then + * calculate the panning magnitude for the other zone given the + * apparent size of the opening. The panning magnitude affects the + * envelopment of the environment, with 1 being a point, 0.5 being + * half coverage around the listener, and 0 being full coverage. + */ + normalize(far_edge); + normalize(near_edge); + magnitude = 1.0f - acosf(dot_product(far_edge, near_edge))/(float)(M_PI*2.0); + + /* Recalculate the panning direction, to be directly between the + * direction of the two extents. + */ + local_dir[0] = far_edge[0] + near_edge[0]; + local_dir[1] = far_edge[1] + near_edge[1]; + local_dir[2] = far_edge[2] + near_edge[2]; + normalize(local_dir); + } + else + { + /* If we get here, the listener is directly in front of or behind + * the center of the portal, making all aperture edges effectively + * equidistant. Calculating the panning magnitude is simplified, + * using the arctangent of the radius and distance. + */ + magnitude = 1.0f - (atan2f(portal_radius, dist) / (float)M_PI); + } + + /* Scale the other zone's panning vector. */ + other_dir[0] = local_dir[0] * magnitude; + other_dir[1] = local_dir[1] * magnitude; + other_dir[2] = local_dir[2] * magnitude; + /* Pan the current zone to the opposite direction of the portal, and + * take the remaining percentage of the portal's magnitude. + */ + this_dir[0] = local_dir[0] * (magnitude-1.0f); + this_dir[1] = local_dir[1] * (magnitude-1.0f); + this_dir[2] = local_dir[2] * (magnitude-1.0f); + + /* Now set the effects' panning vectors and gain. Energy is shared + * between environments, so attenuate according to each zone's + * contribution (note: gain^2 = energy). + */ + alEffectf(this_effect, AL_EAXREVERB_REFLECTIONS_GAIN, this_reverb->flReflectionsGain * sqrtf(magnitude)); + alEffectf(this_effect, AL_EAXREVERB_LATE_REVERB_GAIN, this_reverb->flLateReverbGain * sqrtf(magnitude)); + alEffectfv(this_effect, AL_EAXREVERB_REFLECTIONS_PAN, this_dir); + alEffectfv(this_effect, AL_EAXREVERB_LATE_REVERB_PAN, this_dir); + + alEffectf(other_effect, AL_EAXREVERB_REFLECTIONS_GAIN, other_reverb->flReflectionsGain * sqrtf(1.0f-magnitude)); + alEffectf(other_effect, AL_EAXREVERB_LATE_REVERB_GAIN, other_reverb->flLateReverbGain * sqrtf(1.0f-magnitude)); + alEffectfv(other_effect, AL_EAXREVERB_REFLECTIONS_PAN, other_dir); + alEffectfv(other_effect, AL_EAXREVERB_LATE_REVERB_PAN, other_dir); + } + else + { + /* We're practically in the center of the portal. Give the panning + * vectors a 50/50 split, with Zone 0 covering the half in front of + * the normal, and Zone 1 covering the half behind. + */ + this_dir[0] = local_norm[0] / 2.0f; + this_dir[1] = local_norm[1] / 2.0f; + this_dir[2] = local_norm[2] / 2.0f; + + other_dir[0] = local_norm[0] / -2.0f; + other_dir[1] = local_norm[1] / -2.0f; + other_dir[2] = local_norm[2] / -2.0f; + + alEffectf(effects[0], AL_EAXREVERB_REFLECTIONS_GAIN, reverbs[0].flReflectionsGain * sqrtf(0.5f)); + alEffectf(effects[0], AL_EAXREVERB_LATE_REVERB_GAIN, reverbs[0].flLateReverbGain * sqrtf(0.5f)); + alEffectfv(effects[0], AL_EAXREVERB_REFLECTIONS_PAN, this_dir); + alEffectfv(effects[0], AL_EAXREVERB_LATE_REVERB_PAN, this_dir); + + alEffectf(effects[1], AL_EAXREVERB_REFLECTIONS_GAIN, reverbs[1].flReflectionsGain * sqrtf(0.5f)); + alEffectf(effects[1], AL_EAXREVERB_LATE_REVERB_GAIN, reverbs[1].flLateReverbGain * sqrtf(0.5f)); + alEffectfv(effects[1], AL_EAXREVERB_REFLECTIONS_PAN, other_dir); + alEffectfv(effects[1], AL_EAXREVERB_LATE_REVERB_PAN, other_dir); + } + + /* Finally, update the effect slots with the updated effect parameters. */ + alAuxiliaryEffectSloti(slots[0], AL_EFFECTSLOT_EFFECT, effects[0]); + alAuxiliaryEffectSloti(slots[1], AL_EFFECTSLOT_EFFECT, effects[1]); +} + + +int main(int argc, char **argv) +{ + static const int MaxTransitions = 8; + EFXEAXREVERBPROPERTIES reverbs[2] = { + EFX_REVERB_PRESET_CARPETEDHALLWAY, + EFX_REVERB_PRESET_BATHROOM + }; + struct timespec basetime; + ALCdevice *device = NULL; + ALCcontext *context = NULL; + ALuint effects[2] = { 0, 0 }; + ALuint slots[2] = { 0, 0 }; + ALuint direct_filter = 0; + ALuint buffer = 0; + ALuint source = 0; + ALCint num_sends = 0; + ALenum state = AL_INITIAL; + ALfloat direct_gain = 1.0f; + int loops = 0; + + /* Print out usage if no arguments were specified */ + if(argc < 2) + { + fprintf(stderr, "Usage: %s [-device ] [options] \n\n" + "Options:\n" + "\t-nodirect\tSilence direct path output (easier to hear reverb)\n\n", + argv[0]); + return 1; + } + + /* Initialize OpenAL, and check for EFX support with at least 2 auxiliary + * sends (if multiple sends are supported, 2 are provided by default; if + * you want more, you have to request it through alcCreateContext). + */ + argv++; argc--; + if(InitAL(&argv, &argc) != 0) + return 1; + + while(argc > 0) + { + if(strcmp(argv[0], "-nodirect") == 0) + direct_gain = 0.0f; + else + break; + argv++; + argc--; + } + if(argc < 1) + { + fprintf(stderr, "No filename spacified.\n"); + CloseAL(); + return 1; + } + + context = alcGetCurrentContext(); + device = alcGetContextsDevice(context); + + if(!alcIsExtensionPresent(device, "ALC_EXT_EFX")) + { + fprintf(stderr, "Error: EFX not supported\n"); + CloseAL(); + return 1; + } + + num_sends = 0; + alcGetIntegerv(device, ALC_MAX_AUXILIARY_SENDS, 1, &num_sends); + if(alcGetError(device) != ALC_NO_ERROR || num_sends < 2) + { + fprintf(stderr, "Error: Device does not support multiple sends (got %d, need 2)\n", + num_sends); + CloseAL(); + return 1; + } + + /* Define a macro to help load the function pointers. */ +#define LOAD_PROC(x) ((x) = alGetProcAddress(#x)) + LOAD_PROC(alGenFilters); + LOAD_PROC(alDeleteFilters); + LOAD_PROC(alIsFilter); + LOAD_PROC(alFilteri); + LOAD_PROC(alFilteriv); + LOAD_PROC(alFilterf); + LOAD_PROC(alFilterfv); + LOAD_PROC(alGetFilteri); + LOAD_PROC(alGetFilteriv); + LOAD_PROC(alGetFilterf); + LOAD_PROC(alGetFilterfv); + + LOAD_PROC(alGenEffects); + LOAD_PROC(alDeleteEffects); + LOAD_PROC(alIsEffect); + LOAD_PROC(alEffecti); + LOAD_PROC(alEffectiv); + LOAD_PROC(alEffectf); + LOAD_PROC(alEffectfv); + LOAD_PROC(alGetEffecti); + LOAD_PROC(alGetEffectiv); + LOAD_PROC(alGetEffectf); + LOAD_PROC(alGetEffectfv); + + LOAD_PROC(alGenAuxiliaryEffectSlots); + LOAD_PROC(alDeleteAuxiliaryEffectSlots); + LOAD_PROC(alIsAuxiliaryEffectSlot); + LOAD_PROC(alAuxiliaryEffectSloti); + LOAD_PROC(alAuxiliaryEffectSlotiv); + LOAD_PROC(alAuxiliaryEffectSlotf); + LOAD_PROC(alAuxiliaryEffectSlotfv); + LOAD_PROC(alGetAuxiliaryEffectSloti); + LOAD_PROC(alGetAuxiliaryEffectSlotiv); + LOAD_PROC(alGetAuxiliaryEffectSlotf); + LOAD_PROC(alGetAuxiliaryEffectSlotfv); +#undef LOAD_PROC + + /* Initialize SDL_sound. */ + Sound_Init(); + + /* Load the sound into a buffer. */ + buffer = LoadSound(argv[0]); + if(!buffer) + { + CloseAL(); + Sound_Quit(); + return 1; + } + + /* Generate two effects for two "zones", and load a reverb into each one. + * Note that unlike single-zone reverb, where you can store one effect per + * preset, for multi-zone reverb you should have one effect per environment + * instance, or one per audible zone. This is because we'll be changing the + * effects' properties in real-time based on the environment instance + * relative to the listener. + */ + alGenEffects(2, effects); + if(!LoadEffect(effects[0], &reverbs[0]) || !LoadEffect(effects[1], &reverbs[1])) + { + alDeleteEffects(2, effects); + alDeleteBuffers(1, &buffer); + Sound_Quit(); + CloseAL(); + return 1; + } + + /* Create the effect slot objects, one for each "active" effect. */ + alGenAuxiliaryEffectSlots(2, slots); + + /* Tell the effect slots to use the loaded effect objects, with slot 0 for + * Zone 0 and slot 1 for Zone 1. Note that this effectively copies the + * effect properties. Modifying or deleting the effect object afterward + * won't directly affect the effect slot until they're reapplied like this. + */ + alAuxiliaryEffectSloti(slots[0], AL_EFFECTSLOT_EFFECT, effects[0]); + alAuxiliaryEffectSloti(slots[1], AL_EFFECTSLOT_EFFECT, effects[1]); + assert(alGetError()==AL_NO_ERROR && "Failed to set effect slot"); + + /* For the purposes of this example, prepare a filter that optionally + * silences the direct path which allows us to hear just the reverberation. + * A filter like this is normally used for obstruction, where the path + * directly between the listener and source is blocked (the exact + * properties depending on the type and thickness of the obstructing + * material). + */ + alGenFilters(1, &direct_filter); + alFilteri(direct_filter, AL_FILTER_TYPE, AL_FILTER_LOWPASS); + alFilterf(direct_filter, AL_LOWPASS_GAIN, direct_gain); + assert(alGetError()==AL_NO_ERROR && "Failed to set direct filter"); + + /* Create the source to play the sound with, place it in front of the + * listener's path in the left zone. + */ + source = 0; + alGenSources(1, &source); + alSourcei(source, AL_LOOPING, AL_TRUE); + alSource3f(source, AL_POSITION, -5.0f, 0.0f, -2.0f); + alSourcei(source, AL_DIRECT_FILTER, direct_filter); + alSourcei(source, AL_BUFFER, buffer); + + /* Connect the source to the effect slots. Here, we connect source send 0 + * to Zone 0's slot, and send 1 to Zone 1's slot. Filters can be specified + * to occlude the source from each zone by varying amounts; for example, a + * source within a particular zone would be unfiltered, while a source that + * can only see a zone through a window or thin wall may be attenuated for + * that zone. + */ + alSource3i(source, AL_AUXILIARY_SEND_FILTER, slots[0], 0, AL_FILTER_NULL); + alSource3i(source, AL_AUXILIARY_SEND_FILTER, slots[1], 1, AL_FILTER_NULL); + assert(alGetError()==AL_NO_ERROR && "Failed to setup sound source"); + + /* Get the current time as the base for timing in the main loop. */ + altimespec_get(&basetime, AL_TIME_UTC); + loops = 0; + printf("Transition %d of %d...\n", loops+1, MaxTransitions); + + /* Play the sound for a while. */ + alSourcePlay(source); + do { + struct timespec curtime; + ALfloat timediff; + + /* Start a batch update, to ensure all changes apply simultaneously. */ + alcSuspendContext(context); + + /* Get the current time to track the amount of time that passed. + * Convert the difference to seconds. + */ + altimespec_get(&curtime, AL_TIME_UTC); + timediff = (ALfloat)(curtime.tv_sec - basetime.tv_sec); + timediff += (ALfloat)(curtime.tv_nsec - basetime.tv_nsec) / 1000000000.0f; + + /* Avoid negative time deltas, in case of non-monotonic clocks. */ + if(timediff < 0.0f) + timediff = 0.0f; + else while(timediff >= 4.0f*((loops&1)+1)) + { + /* For this example, each transition occurs over 4 seconds, and + * there's 2 transitions per cycle. + */ + if(++loops < MaxTransitions) + printf("Transition %d of %d...\n", loops+1, MaxTransitions); + if(!(loops&1)) + { + /* Cycle completed. Decrease the delta and increase the base + * time to start a new cycle. + */ + timediff -= 8.0f; + basetime.tv_sec += 8; + } + } + + /* Update the listener and effects, and finish the batch. */ + UpdateListenerAndEffects(timediff, slots, effects, reverbs); + alcProcessContext(context); + + al_nssleep(10000000); + + alGetSourcei(source, AL_SOURCE_STATE, &state); + } while(alGetError() == AL_NO_ERROR && state == AL_PLAYING && loops < MaxTransitions); + + /* All done. Delete resources, and close down SDL_sound and OpenAL. */ + alDeleteSources(1, &source); + alDeleteAuxiliaryEffectSlots(2, slots); + alDeleteEffects(2, effects); + alDeleteFilters(1, &direct_filter); + alDeleteBuffers(1, &buffer); + + Sound_Quit(); + CloseAL(); + + return 0; +} diff --git a/love/src/jni/openal-soft-1.19.1/examples/alplay.c b/love/src/jni/openal-soft-1.19.1/examples/alplay.c new file mode 100644 index 00000000..81cb56d5 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/examples/alplay.c @@ -0,0 +1,177 @@ +/* + * OpenAL Source Play Example + * + * Copyright (c) 2017 by Chris Robinson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* This file contains an example for playing a sound buffer. */ + +#include +#include + +#include + +#include "AL/al.h" +#include "AL/alc.h" + +#include "common/alhelpers.h" + + +/* LoadBuffer loads the named audio file into an OpenAL buffer object, and + * returns the new buffer ID. + */ +static ALuint LoadSound(const char *filename) +{ + Sound_Sample *sample; + ALenum err, format; + ALuint buffer; + Uint32 slen; + + /* Open the audio file */ + sample = Sound_NewSampleFromFile(filename, NULL, 65536); + if(!sample) + { + fprintf(stderr, "Could not open audio in %s\n", filename); + return 0; + } + + /* Get the sound format, and figure out the OpenAL format */ + if(sample->actual.channels == 1) + { + if(sample->actual.format == AUDIO_U8) + format = AL_FORMAT_MONO8; + else if(sample->actual.format == AUDIO_S16SYS) + format = AL_FORMAT_MONO16; + else + { + fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format); + Sound_FreeSample(sample); + return 0; + } + } + else if(sample->actual.channels == 2) + { + if(sample->actual.format == AUDIO_U8) + format = AL_FORMAT_STEREO8; + else if(sample->actual.format == AUDIO_S16SYS) + format = AL_FORMAT_STEREO16; + else + { + fprintf(stderr, "Unsupported sample format: 0x%04x\n", sample->actual.format); + Sound_FreeSample(sample); + return 0; + } + } + else + { + fprintf(stderr, "Unsupported channel count: %d\n", sample->actual.channels); + Sound_FreeSample(sample); + return 0; + } + + /* Decode the whole audio stream to a buffer. */ + slen = Sound_DecodeAll(sample); + if(!sample->buffer || slen == 0) + { + fprintf(stderr, "Failed to read audio from %s\n", filename); + Sound_FreeSample(sample); + return 0; + } + + /* Buffer the audio data into a new buffer object, then free the data and + * close the file. */ + buffer = 0; + alGenBuffers(1, &buffer); + alBufferData(buffer, format, sample->buffer, slen, sample->actual.rate); + Sound_FreeSample(sample); + + /* Check if an error occured, and clean up if so. */ + err = alGetError(); + if(err != AL_NO_ERROR) + { + fprintf(stderr, "OpenAL Error: %s\n", alGetString(err)); + if(buffer && alIsBuffer(buffer)) + alDeleteBuffers(1, &buffer); + return 0; + } + + return buffer; +} + + +int main(int argc, char **argv) +{ + ALuint source, buffer; + ALfloat offset; + ALenum state; + + /* Print out usage if no arguments were specified */ + if(argc < 2) + { + fprintf(stderr, "Usage: %s [-device ] \n", argv[0]); + return 1; + } + + /* Initialize OpenAL. */ + argv++; argc--; + if(InitAL(&argv, &argc) != 0) + return 1; + + /* Initialize SDL_sound. */ + Sound_Init(); + + /* Load the sound into a buffer. */ + buffer = LoadSound(argv[0]); + if(!buffer) + { + Sound_Quit(); + CloseAL(); + return 1; + } + + /* Create the source to play the sound with. */ + source = 0; + alGenSources(1, &source); + alSourcei(source, AL_BUFFER, buffer); + assert(alGetError()==AL_NO_ERROR && "Failed to setup sound source"); + + /* Play the sound until it finishes. */ + alSourcePlay(source); + do { + al_nssleep(10000000); + alGetSourcei(source, AL_SOURCE_STATE, &state); + + /* Get the source offset. */ + alGetSourcef(source, AL_SEC_OFFSET, &offset); + printf("\rOffset: %f ", offset); + fflush(stdout); + } while(alGetError() == AL_NO_ERROR && state == AL_PLAYING); + printf("\n"); + + /* All done. Delete resources, and close down SDL_sound and OpenAL. */ + alDeleteSources(1, &source); + alDeleteBuffers(1, &buffer); + + Sound_Quit(); + CloseAL(); + + return 0; +} diff --git a/love/src/jni/openal-soft-1.18.2/examples/alrecord.c b/love/src/jni/openal-soft-1.19.1/examples/alrecord.c similarity index 95% rename from love/src/jni/openal-soft-1.18.2/examples/alrecord.c rename to love/src/jni/openal-soft-1.19.1/examples/alrecord.c index 0835b468..43b26d35 100644 --- a/love/src/jni/openal-soft-1.18.2/examples/alrecord.c +++ b/love/src/jni/openal-soft-1.19.1/examples/alrecord.c @@ -45,6 +45,13 @@ #endif +#if defined(_MSC_VER) && (_MSC_VER < 1900) +static float msvc_strtof(const char *str, char **end) +{ return (float)strtod(str, end); } +#define strtof msvc_strtof +#endif + + static void fwrite16le(ALushort val, FILE *f) { ALubyte data[2] = { val&0xff, (val>>8)&0xff }; @@ -63,13 +70,13 @@ typedef struct Recorder { FILE *mFile; long mDataSizeOffset; - size_t mDataSize; + ALuint mDataSize; float mRecTime; int mChannels; int mBits; int mSampleRate; - size_t mFrameSize; + ALuint mFrameSize; ALbyte *mBuffer; ALsizei mBufferSize; } Recorder; @@ -184,7 +191,7 @@ int main(int argc, char **argv) return 1; } - recorder.mRecTime = strtod(argv[1], &end); + recorder.mRecTime = strtof(argv[1], &end); if(!(recorder.mRecTime >= 1.0f && recorder.mRecTime <= 10.0f) || (end && *end != '\0')) { fprintf(stderr, "Invalid record time: %s\n", argv[1]); @@ -314,7 +321,7 @@ int main(int argc, char **argv) (err=alcGetError(recorder.mDevice)) == ALC_NO_ERROR && !ferror(recorder.mFile)) { ALCint count = 0; - fprintf(stderr, "\rCaptured "SZFMT" samples", recorder.mDataSize); + fprintf(stderr, "\rCaptured %u samples", recorder.mDataSize); alcGetIntegerv(recorder.mDevice, ALC_CAPTURE_SAMPLES, 1, &count); if(count < 1) { @@ -357,10 +364,11 @@ int main(int argc, char **argv) } } #endif - recorder.mDataSize += fwrite(recorder.mBuffer, recorder.mFrameSize, count, recorder.mFile); + recorder.mDataSize += (ALuint)fwrite(recorder.mBuffer, recorder.mFrameSize, count, + recorder.mFile); } alcCaptureStop(recorder.mDevice); - fprintf(stderr, "\rCaptured "SZFMT" samples\n", recorder.mDataSize); + fprintf(stderr, "\rCaptured %u samples\n", recorder.mDataSize); if(err != ALC_NO_ERROR) fprintf(stderr, "Got device error 0x%04x: %s\n", err, alcGetString(recorder.mDevice, err)); diff --git a/love/src/jni/openal-soft-1.18.2/examples/alreverb.c b/love/src/jni/openal-soft-1.19.1/examples/alreverb.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/examples/alreverb.c rename to love/src/jni/openal-soft-1.19.1/examples/alreverb.c diff --git a/love/src/jni/openal-soft-1.18.2/examples/alstream.c b/love/src/jni/openal-soft-1.19.1/examples/alstream.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/examples/alstream.c rename to love/src/jni/openal-soft-1.19.1/examples/alstream.c diff --git a/love/src/jni/openal-soft-1.18.2/examples/altonegen.c b/love/src/jni/openal-soft-1.19.1/examples/altonegen.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/examples/altonegen.c rename to love/src/jni/openal-soft-1.19.1/examples/altonegen.c diff --git a/love/src/jni/openal-soft-1.18.2/examples/common/alhelpers.c b/love/src/jni/openal-soft-1.19.1/examples/common/alhelpers.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/examples/common/alhelpers.c rename to love/src/jni/openal-soft-1.19.1/examples/common/alhelpers.c diff --git a/love/src/jni/openal-soft-1.18.2/examples/common/alhelpers.h b/love/src/jni/openal-soft-1.19.1/examples/common/alhelpers.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/examples/common/alhelpers.h rename to love/src/jni/openal-soft-1.19.1/examples/common/alhelpers.h diff --git a/love/src/jni/openal-soft-1.19.1/hrtf/default-44100.mhr b/love/src/jni/openal-soft-1.19.1/hrtf/default-44100.mhr new file mode 100644 index 00000000..f7992e13 Binary files /dev/null and b/love/src/jni/openal-soft-1.19.1/hrtf/default-44100.mhr differ diff --git a/love/src/jni/openal-soft-1.19.1/hrtf/default-48000.mhr b/love/src/jni/openal-soft-1.19.1/hrtf/default-48000.mhr new file mode 100644 index 00000000..66fd4f56 Binary files /dev/null and b/love/src/jni/openal-soft-1.19.1/hrtf/default-48000.mhr differ diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/al.h b/love/src/jni/openal-soft-1.19.1/include/AL/al.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/include/AL/al.h rename to love/src/jni/openal-soft-1.19.1/include/AL/al.h diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/alc.h b/love/src/jni/openal-soft-1.19.1/include/AL/alc.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/include/AL/alc.h rename to love/src/jni/openal-soft-1.19.1/include/AL/alc.h diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/alext.h b/love/src/jni/openal-soft-1.19.1/include/AL/alext.h similarity index 89% rename from love/src/jni/openal-soft-1.18.2/include/AL/alext.h rename to love/src/jni/openal-soft-1.19.1/include/AL/alext.h index 4b9a1553..cd7f2750 100644 --- a/love/src/jni/openal-soft-1.18.2/include/AL/alext.h +++ b/love/src/jni/openal-soft-1.19.1/include/AL/alext.h @@ -97,6 +97,31 @@ extern "C" { #ifndef AL_EXT_MCFORMATS #define AL_EXT_MCFORMATS 1 +/* Provides support for surround sound buffer formats with 8, 16, and 32-bit + * samples. + * + * QUAD8: Unsigned 8-bit, Quadraphonic (Front Left, Front Right, Rear Left, + * Rear Right). + * QUAD16: Signed 16-bit, Quadraphonic. + * QUAD32: 32-bit float, Quadraphonic. + * REAR8: Unsigned 8-bit, Rear Stereo (Rear Left, Rear Right). + * REAR16: Signed 16-bit, Rear Stereo. + * REAR32: 32-bit float, Rear Stereo. + * 51CHN8: Unsigned 8-bit, 5.1 Surround (Front Left, Front Right, Front Center, + * LFE, Side Left, Side Right). Note that some audio systems may label + * 5.1's Side channels as Rear or Surround; they are equivalent for the + * purposes of this extension. + * 51CHN16: Signed 16-bit, 5.1 Surround. + * 51CHN32: 32-bit float, 5.1 Surround. + * 61CHN8: Unsigned 8-bit, 6.1 Surround (Front Left, Front Right, Front Center, + * LFE, Rear Center, Side Left, Side Right). + * 61CHN16: Signed 16-bit, 6.1 Surround. + * 61CHN32: 32-bit float, 6.1 Surround. + * 71CHN8: Unsigned 8-bit, 7.1 Surround (Front Left, Front Right, Front Center, + * LFE, Rear Left, Rear Right, Side Left, Side Right). + * 71CHN16: Signed 16-bit, 7.1 Surround. + * 71CHN32: 32-bit float, 7.1 Surround. + */ #define AL_FORMAT_QUAD8 0x1204 #define AL_FORMAT_QUAD16 0x1205 #define AL_FORMAT_QUAD32 0x1206 @@ -395,6 +420,16 @@ ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device); #ifndef AL_EXT_BFORMAT #define AL_EXT_BFORMAT 1 +/* Provides support for B-Format ambisonic buffers (first-order, FuMa scaling + * and layout). + * + * BFORMAT2D_8: Unsigned 8-bit, 3-channel non-periphonic (WXY). + * BFORMAT2D_16: Signed 16-bit, 3-channel non-periphonic (WXY). + * BFORMAT2D_FLOAT32: 32-bit float, 3-channel non-periphonic (WXY). + * BFORMAT3D_8: Unsigned 8-bit, 4-channel periphonic (WXYZ). + * BFORMAT3D_16: Signed 16-bit, 4-channel periphonic (WXYZ). + * BFORMAT3D_FLOAT32: 32-bit float, 4-channel periphonic (WXYZ). + */ #define AL_FORMAT_BFORMAT2D_8 0x20021 #define AL_FORMAT_BFORMAT2D_16 0x20022 #define AL_FORMAT_BFORMAT2D_FLOAT32 0x20023 @@ -459,6 +494,21 @@ AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index); #define ALC_OUTPUT_LIMITER_SOFT 0x199A #endif +#ifndef ALC_SOFT_device_clock +#define ALC_SOFT_device_clock 1 +typedef int64_t ALCint64SOFT; +typedef uint64_t ALCuint64SOFT; +#define ALC_DEVICE_CLOCK_SOFT 0x1600 +#define ALC_DEVICE_LATENCY_SOFT 0x1601 +#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602 +#define AL_SAMPLE_OFFSET_CLOCK_SOFT 0x1202 +#define AL_SEC_OFFSET_CLOCK_SOFT 0x1203 +typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); +#ifdef AL_ALEXT_PROTOTYPES +ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values); +#endif +#endif + #ifdef __cplusplus } #endif diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/efx-creative.h b/love/src/jni/openal-soft-1.19.1/include/AL/efx-creative.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/include/AL/efx-creative.h rename to love/src/jni/openal-soft-1.19.1/include/AL/efx-creative.h diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/efx-presets.h b/love/src/jni/openal-soft-1.19.1/include/AL/efx-presets.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/include/AL/efx-presets.h rename to love/src/jni/openal-soft-1.19.1/include/AL/efx-presets.h diff --git a/love/src/jni/openal-soft-1.18.2/include/AL/efx.h b/love/src/jni/openal-soft-1.19.1/include/AL/efx.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/include/AL/efx.h rename to love/src/jni/openal-soft-1.19.1/include/AL/efx.h diff --git a/love/src/jni/openal-soft-1.19.1/native-tools/CMakeLists.txt b/love/src/jni/openal-soft-1.19.1/native-tools/CMakeLists.txt new file mode 100644 index 00000000..5e816bba --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/native-tools/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.0.2) + +project(native-tools) + +include(CheckLibraryExists) + +set(CPP_DEFS ) +if(WIN32) + set(CPP_DEFS ${CPP_DEFS} _WIN32) +endif(WIN32) + +check_library_exists(m pow "" HAVE_LIBM) + +add_executable(bin2h bin2h.c) +# Enforce no dressing for executable names, so the main script can find it +set_target_properties(bin2h PROPERTIES OUTPUT_NAME bin2h) +# Avoid configuration-dependent subdirectories while building with Visual Studio +set_target_properties(bin2h PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}") +set_target_properties(bin2h PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}") +target_compile_definitions(bin2h PRIVATE ${CPP_DEFS}) + +add_executable(bsincgen bsincgen.c) +set_target_properties(bsincgen PROPERTIES OUTPUT_NAME bsincgen) +set_target_properties(bsincgen PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}") +set_target_properties(bsincgen PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}") +target_compile_definitions(bsincgen PRIVATE ${CPP_DEFS}) +if(HAVE_LIBM) + target_link_libraries(bsincgen m) +endif(HAVE_LIBM) diff --git a/love/src/jni/openal-soft-1.18.2/native-tools/bin2h.c b/love/src/jni/openal-soft-1.19.1/native-tools/bin2h.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/native-tools/bin2h.c rename to love/src/jni/openal-soft-1.19.1/native-tools/bin2h.c diff --git a/love/src/jni/openal-soft-1.19.1/native-tools/bsincgen.c b/love/src/jni/openal-soft-1.19.1/native-tools/bsincgen.c new file mode 100644 index 00000000..72bd8183 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/native-tools/bsincgen.c @@ -0,0 +1,367 @@ +/* + * Sinc interpolator coefficient and delta generator for the OpenAL Soft + * cross platform audio library. + * + * Copyright (C) 2015 by Christopher Fitzgerald. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Or visit: http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html + * + * -------------------------------------------------------------------------- + * + * This is a modified version of the bandlimited windowed sinc interpolator + * algorithm presented here: + * + * Smith, J.O. "Windowed Sinc Interpolation", in + * Physical Audio Signal Processing, + * https://ccrma.stanford.edu/~jos/pasp/Windowed_Sinc_Interpolation.html, + * online book, + * accessed October 2012. + */ + +#define _UNICODE +#include +#include +#include +#include + +#include "../common/win_main_utf8.h" + + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +#if !(defined(_ISOC99_SOURCE) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L)) +#define log2(x) (log(x) / log(2.0)) +#endif + +/* Same as in alu.h! */ +#define FRACTIONBITS (12) +#define FRACTIONONE (1<= b) ? a : b; } + +/* NOTE: This is the normalized (instead of just sin(x)/x) cardinal sine + * function. + * 2 f_t sinc(2 f_t x) + * f_t -- normalized transition frequency (0.5 is nyquist) + * x -- sample index (-N to N) + */ +static double Sinc(const double x) +{ + if(fabs(x) < 1e-15) + return 1.0; + return sin(M_PI * x) / (M_PI * x); +} + +static double BesselI_0(const double x) +{ + double term, sum, last_sum, x2, y; + int i; + + term = 1.0; + sum = 1.0; + x2 = x / 2.0; + i = 1; + + do { + y = x2 / i; + i++; + last_sum = sum; + term *= y * y; + sum += term; + } while(sum != last_sum); + + return sum; +} + +/* NOTE: k is assumed normalized (-1 to 1) + * beta is equivalent to 2 alpha + */ +static double Kaiser(const double b, const double k) +{ + if(!(k >= -1.0 && k <= 1.0)) + return 0.0; + return BesselI_0(b * sqrt(1.0 - k*k)) / BesselI_0(b); +} + +/* Calculates the (normalized frequency) transition width of the Kaiser window. + * Rejection is in dB. + */ +static double CalcKaiserWidth(const double rejection, const int order) +{ + double w_t = 2.0 * M_PI; + + if(rejection > 21.0) + return (rejection - 7.95) / (order * 2.285 * w_t); + /* This enforces a minimum rejection of just above 21.18dB */ + return 5.79 / (order * w_t); +} + +static double CalcKaiserBeta(const double rejection) +{ + if(rejection > 50.0) + return 0.1102 * (rejection - 8.7); + else if(rejection >= 21.0) + return (0.5842 * pow(rejection - 21.0, 0.4)) + + (0.07886 * (rejection - 21.0)); + return 0.0; +} + +/* Generates the coefficient, delta, and index tables required by the bsinc resampler */ +static void BsiGenerateTables(FILE *output, const char *tabname, const double rejection, const int order) +{ + static double filter[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][BSINC_POINTS_MAX]; + static double scDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT ][BSINC_POINTS_MAX]; + static double phDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][BSINC_POINTS_MAX]; + static double spDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT ][BSINC_POINTS_MAX]; + static int mt[BSINC_SCALE_COUNT]; + static double at[BSINC_SCALE_COUNT]; + const int num_points_min = order + 1; + double width, beta, scaleBase, scaleRange; + int si, pi, i; + + memset(filter, 0, sizeof(filter)); + memset(scDeltas, 0, sizeof(scDeltas)); + memset(phDeltas, 0, sizeof(phDeltas)); + memset(spDeltas, 0, sizeof(spDeltas)); + + /* Calculate windowing parameters. The width describes the transition + band, but it may vary due to the linear interpolation between scales + of the filter. + */ + width = CalcKaiserWidth(rejection, order); + beta = CalcKaiserBeta(rejection); + scaleBase = width / 2.0; + scaleRange = 1.0 - scaleBase; + + // Determine filter scaling. + for(si = 0; si < BSINC_SCALE_COUNT; si++) + { + const double scale = scaleBase + (scaleRange * si / (BSINC_SCALE_COUNT - 1)); + const double a = MinDouble(floor(num_points_min / (2.0 * scale)), num_points_min); + const int m = 2 * (int)a; + + mt[si] = m; + at[si] = a; + } + + /* Calculate the Kaiser-windowed Sinc filter coefficients for each scale + and phase. + */ + for(si = 0; si < BSINC_SCALE_COUNT; si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + const int l = (m / 2) - 1; + const double a = at[si]; + const double scale = scaleBase + (scaleRange * si / (BSINC_SCALE_COUNT - 1)); + const double cutoff = (0.5 * scale) - (scaleBase * MaxDouble(0.5, scale)); + + for(pi = 0; pi <= BSINC_PHASE_COUNT; pi++) + { + const double phase = l + ((double)pi / BSINC_PHASE_COUNT); + + for(i = 0; i < m; i++) + { + const double x = i - phase; + filter[si][pi][o + i] = Kaiser(beta, x / a) * 2.0 * cutoff * Sinc(2.0 * cutoff * x); + } + } + } + + /* Linear interpolation between scales is simplified by pre-calculating + the delta (b - a) in: x = a + f (b - a) + + Given a difference in points between scales, the destination points + will be 0, thus: x = a + f (-a) + */ + for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + + for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) + { + for(i = 0; i < m; i++) + scDeltas[si][pi][o + i] = filter[si + 1][pi][o + i] - filter[si][pi][o + i]; + } + } + + // Linear interpolation between phases is also simplified. + for(si = 0; si < BSINC_SCALE_COUNT; si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + + for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) + { + for(i = 0; i < m; i++) + phDeltas[si][pi][o + i] = filter[si][pi + 1][o + i] - filter[si][pi][o + i]; + } + } + + /* This last simplification is done to complete the bilinear equation for + the combination of scale and phase. + */ + for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + + for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) + { + for(i = 0; i < m; i++) + spDeltas[si][pi][o + i] = phDeltas[si + 1][pi][o + i] - phDeltas[si][pi][o + i]; + } + } + + // Make sure the number of points is a multiple of 4 (for SIMD). + for(si = 0; si < BSINC_SCALE_COUNT; si++) + mt[si] = (mt[si]+3) & ~3; + + fprintf(output, +"/* This %d%s order filter has a rejection of -%.0fdB, yielding a transition width\n" +" * of ~%.3f (normalized frequency). Order increases when downsampling to a\n" +" * limit of one octave, after which the quality of the filter (transition\n" +" * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound\n" +" * after downsampling by ~%.2f octaves.\n" +" */\n" +"const BSincTable %s = {\n", + order, (((order%100)/10) == 1) ? "th" : + ((order%10) == 1) ? "st" : + ((order%10) == 2) ? "nd" : + ((order%10) == 3) ? "rd" : "th", + rejection, width, log2(1.0/scaleBase), tabname); + + /* The scaleBase is calculated from the Kaiser window transition width. + It represents the absolute limit to the filter before it fully cuts + the signal. The limit in octaves can be calculated by taking the + base-2 logarithm of its inverse: log_2(1 / scaleBase) + */ + fprintf(output, " /* scaleBase */ %.9ef, /* scaleRange */ %.9ef,\n", scaleBase, 1.0 / scaleRange); + + fprintf(output, " /* m */ {"); + fprintf(output, " %d", mt[0]); + for(si = 1; si < BSINC_SCALE_COUNT; si++) + fprintf(output, ", %d", mt[si]); + fprintf(output, " },\n"); + + fprintf(output, " /* filterOffset */ {"); + fprintf(output, " %d", 0); + i = mt[0]*4*BSINC_PHASE_COUNT; + for(si = 1; si < BSINC_SCALE_COUNT; si++) + { + fprintf(output, ", %d", i); + i += mt[si]*4*BSINC_PHASE_COUNT; + } + + fprintf(output, " },\n"); + + // Calculate the table size. + i = 0; + for(si = 0; si < BSINC_SCALE_COUNT; si++) + i += 4 * BSINC_PHASE_COUNT * mt[si]; + + fprintf(output, "\n /* Tab (%d entries) */ {\n", i); + for(si = 0; si < BSINC_SCALE_COUNT; si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + + for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) + { + fprintf(output, " /* %2d,%2d (%d) */", si, pi, m); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", filter[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", scDeltas[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", phDeltas[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", spDeltas[si][pi][o + i]); + fprintf(output, "\n"); + } + } + fprintf(output, " }\n};\n\n"); +} + + +int main(int argc, char *argv[]) +{ + FILE *output; + + GET_UNICODE_ARGS(&argc, &argv); + + if(argc > 2) + { + fprintf(stderr, "Usage: %s [output file]\n", argv[0]); + return 1; + } + + if(argc == 2) + { + output = fopen(argv[1], "wb"); + if(!output) + { + fprintf(stderr, "Failed to open %s for writing\n", argv[1]); + return 1; + } + } + else + output = stdout; + + fprintf(output, "/* Generated by bsincgen, do not edit! */\n\n" +"static_assert(BSINC_SCALE_COUNT == %d, \"Unexpected BSINC_SCALE_COUNT value!\");\n" +"static_assert(BSINC_PHASE_COUNT == %d, \"Unexpected BSINC_PHASE_COUNT value!\");\n" +"static_assert(FRACTIONONE == %d, \"Unexpected FRACTIONONE value!\");\n\n" +"typedef struct BSincTable {\n" +" const float scaleBase, scaleRange;\n" +" const int m[BSINC_SCALE_COUNT];\n" +" const int filterOffset[BSINC_SCALE_COUNT];\n" +" alignas(16) const float Tab[];\n" +"} BSincTable;\n\n", BSINC_SCALE_COUNT, BSINC_PHASE_COUNT, FRACTIONONE); + /* A 23rd order filter with a -60dB drop at nyquist. */ + BsiGenerateTables(output, "bsinc24", 60.0, 23); + /* An 11th order filter with a -40dB drop at nyquist. */ + BsiGenerateTables(output, "bsinc12", 40.0, 11); + + if(output != stdout) + fclose(output); + output = NULL; + + return 0; +} diff --git a/love/src/jni/openal-soft-1.18.2/openal.pc.in b/love/src/jni/openal-soft-1.19.1/openal.pc.in similarity index 89% rename from love/src/jni/openal-soft-1.18.2/openal.pc.in rename to love/src/jni/openal-soft-1.19.1/openal.pc.in index 8bdd4f3b..dfa6f573 100644 --- a/love/src/jni/openal-soft-1.18.2/openal.pc.in +++ b/love/src/jni/openal-soft-1.19.1/openal.pc.in @@ -8,4 +8,5 @@ Description: OpenAL is a cross-platform 3D audio API Requires: @PKG_CONFIG_REQUIRES@ Version: @PACKAGE_VERSION@ Libs: -L${libdir} -l@LIBNAME@ @PKG_CONFIG_LIBS@ +Libs.private:@PKG_CONFIG_PRIVATE_LIBS@ Cflags: -I${includedir} -I${includedir}/AL @PKG_CONFIG_CFLAGS@ diff --git a/love/src/jni/openal-soft-1.18.2/presets/3D7.1.ambdec b/love/src/jni/openal-soft-1.19.1/presets/3D7.1.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/3D7.1.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/3D7.1.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/presets/hexagon.ambdec b/love/src/jni/openal-soft-1.19.1/presets/hexagon.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/hexagon.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/hexagon.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/presets/itu5.1-nocenter.ambdec b/love/src/jni/openal-soft-1.19.1/presets/itu5.1-nocenter.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/itu5.1-nocenter.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/itu5.1-nocenter.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/presets/itu5.1.ambdec b/love/src/jni/openal-soft-1.19.1/presets/itu5.1.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/itu5.1.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/itu5.1.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/presets/presets.txt b/love/src/jni/openal-soft-1.19.1/presets/presets.txt similarity index 94% rename from love/src/jni/openal-soft-1.18.2/presets/presets.txt rename to love/src/jni/openal-soft-1.19.1/presets/presets.txt index 94968720..541416e2 100644 --- a/love/src/jni/openal-soft-1.18.2/presets/presets.txt +++ b/love/src/jni/openal-soft-1.19.1/presets/presets.txt @@ -10,12 +10,12 @@ specified angles do not change the decoder behavior). Details of the individual presets are as follows. square.ambdec -Specifies a basic square speaker setup for Quadrophonic output, with identical +Specifies a basic square speaker setup for Quadraphonic output, with identical width and depth. Front speakers are placed at +45 and -45 degrees, and back speakers are placed at +135 and -135 degrees. rectangle.ambdec -Specifies a narrower speaker setup for Quadrophonic output, with a little less +Specifies a narrower speaker setup for Quadraphonic output, with a little less width but a little more depth over a basic square setup. Front speakers are placed at +30 and -30 degrees, providing a bit more compatibility for existing stereo content, with back speakers at +150 and -150 degrees. diff --git a/love/src/jni/openal-soft-1.18.2/presets/rectangle.ambdec b/love/src/jni/openal-soft-1.19.1/presets/rectangle.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/rectangle.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/rectangle.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/presets/square.ambdec b/love/src/jni/openal-soft-1.19.1/presets/square.ambdec similarity index 100% rename from love/src/jni/openal-soft-1.18.2/presets/square.ambdec rename to love/src/jni/openal-soft-1.19.1/presets/square.ambdec diff --git a/love/src/jni/openal-soft-1.18.2/router/al.c b/love/src/jni/openal-soft-1.19.1/router/al.c similarity index 98% rename from love/src/jni/openal-soft-1.18.2/router/al.c rename to love/src/jni/openal-soft-1.19.1/router/al.c index 3349ad13..8dd888d9 100644 --- a/love/src/jni/openal-soft-1.18.2/router/al.c +++ b/love/src/jni/openal-soft-1.19.1/router/al.c @@ -7,7 +7,7 @@ #include "router.h" -ATOMIC(DriverIface*) CurrentCtxDriver = ATOMIC_INIT_STATIC(NULL); +atomic_DriverIfacePtr CurrentCtxDriver = ATOMIC_INIT_STATIC(NULL); #define DECL_THUNK1(R,n,T1) AL_API R AL_APIENTRY n(T1 a) \ { \ diff --git a/love/src/jni/openal-soft-1.18.2/router/alc.c b/love/src/jni/openal-soft-1.19.1/router/alc.c similarity index 100% rename from love/src/jni/openal-soft-1.18.2/router/alc.c rename to love/src/jni/openal-soft-1.19.1/router/alc.c diff --git a/love/src/jni/openal-soft-1.18.2/router/router.c b/love/src/jni/openal-soft-1.19.1/router/router.c similarity index 88% rename from love/src/jni/openal-soft-1.18.2/router/router.c rename to love/src/jni/openal-soft-1.19.1/router/router.c index 0497a1d2..bff73776 100644 --- a/love/src/jni/openal-soft-1.18.2/router/router.c +++ b/love/src/jni/openal-soft-1.19.1/router/router.c @@ -64,7 +64,9 @@ BOOL APIENTRY DllMain(HINSTANCE UNUSED(module), DWORD reason, void* UNUSED(reser break; case DLL_THREAD_ATTACH: + break; case DLL_THREAD_DETACH: + althrd_thread_detach(); break; case DLL_PROCESS_DETACH: @@ -84,6 +86,8 @@ BOOL APIENTRY DllMain(HINSTANCE UNUSED(module), DWORD reason, void* UNUSED(reser if(LogFile && LogFile != stderr) fclose(LogFile); LogFile = NULL; + + althrd_deinit(); break; } return TRUE; @@ -340,26 +344,47 @@ static int GetLoadedModuleDirectory(const WCHAR *name, WCHAR *moddir, DWORD leng void LoadDriverList(void) { - WCHAR path[MAX_PATH+1] = L""; + WCHAR dll_path[MAX_PATH+1] = L""; + WCHAR cwd_path[MAX_PATH+1] = L""; + WCHAR proc_path[MAX_PATH+1] = L""; + WCHAR sys_path[MAX_PATH+1] = L""; int len; - if(GetLoadedModuleDirectory(L"OpenAL32.dll", path, MAX_PATH)) - SearchDrivers(path); + if(GetLoadedModuleDirectory(L"OpenAL32.dll", dll_path, MAX_PATH)) + TRACE("Got DLL path %ls\n", dll_path); - GetCurrentDirectoryW(MAX_PATH, path); - len = lstrlenW(path); - if(len > 0 && (path[len-1] == '\\' || path[len-1] == '/')) - path[len-1] = '\0'; - SearchDrivers(path); + GetCurrentDirectoryW(MAX_PATH, cwd_path); + len = lstrlenW(cwd_path); + if(len > 0 && (cwd_path[len-1] == '\\' || cwd_path[len-1] == '/')) + cwd_path[len-1] = '\0'; + TRACE("Got current working directory %ls\n", cwd_path); - if(GetLoadedModuleDirectory(NULL, path, MAX_PATH)) - SearchDrivers(path); + if(GetLoadedModuleDirectory(NULL, proc_path, MAX_PATH)) + TRACE("Got proc path %ls\n", proc_path); - GetSystemDirectoryW(path, MAX_PATH); - len = lstrlenW(path); - if(len > 0 && (path[len-1] == '\\' || path[len-1] == '/')) - path[len-1] = '\0'; - SearchDrivers(path); + GetSystemDirectoryW(sys_path, MAX_PATH); + len = lstrlenW(sys_path); + if(len > 0 && (sys_path[len-1] == '\\' || sys_path[len-1] == '/')) + sys_path[len-1] = '\0'; + TRACE("Got system path %ls\n", sys_path); + + /* Don't search the DLL's path if it is the same as the current working + * directory, app's path, or system path (don't want to do duplicate + * searches, or increase the priority of the app or system path). + */ + if(dll_path[0] && + (!cwd_path[0] || wcscmp(dll_path, cwd_path) != 0) && + (!proc_path[0] || wcscmp(dll_path, proc_path) != 0) && + (!sys_path[0] || wcscmp(dll_path, sys_path) != 0)) + SearchDrivers(dll_path); + if(cwd_path[0] && + (!proc_path[0] || wcscmp(cwd_path, proc_path) != 0) && + (!sys_path[0] || wcscmp(cwd_path, sys_path) != 0)) + SearchDrivers(cwd_path); + if(proc_path[0] && (!sys_path[0] || wcscmp(proc_path, sys_path) != 0)) + SearchDrivers(proc_path); + if(sys_path[0]) + SearchDrivers(sys_path); } diff --git a/love/src/jni/openal-soft-1.18.2/router/router.h b/love/src/jni/openal-soft-1.19.1/router/router.h similarity index 98% rename from love/src/jni/openal-soft-1.18.2/router/router.h rename to love/src/jni/openal-soft-1.19.1/router/router.h index ee885d85..32a91dcb 100644 --- a/love/src/jni/openal-soft-1.18.2/router/router.h +++ b/love/src/jni/openal-soft-1.19.1/router/router.h @@ -137,7 +137,8 @@ extern DriverIface *DriverList; extern int DriverListSize; extern altss_t ThreadCtxDriver; -extern ATOMIC(DriverIface*) CurrentCtxDriver; +typedef ATOMIC(DriverIface*) atomic_DriverIfacePtr; +extern atomic_DriverIfacePtr CurrentCtxDriver; typedef struct PtrIntMap { diff --git a/love/src/jni/openal-soft-1.19.1/utils/CIAIR.def b/love/src/jni/openal-soft-1.19.1/utils/CIAIR.def new file mode 100644 index 00000000..4876dc50 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/utils/CIAIR.def @@ -0,0 +1,3958 @@ +# This is a makehrtf HRIR definition file. It is used to define the layout +# and source data to be processed into an OpenAL Soft compatible HRTF. +# +# This definition is used to transform the left and right ear HRIRs from a +# data set used in several papers and articles by Fumitada Itakura, Kazuya +# Takeda, Mikio Ikeda, Shoji Kajita, and Takanori Nishino. +# +# The data (data02.tgz) can be obtained from The Database of Head Related +# Transfer Functions hosted by the Takeda Laboratory at Nagoya University: +# +# http://www.sp.m.is.nagoya-u.ac.jp/HRTF/database.html +# +# It is copyright 1999 by Itakura Laboratory and the Center for Integrated +# Acoustic Information Research (CIAIR) of Nagoya University and provided +# free of charge with no restrictions on use so long as the authors (above) +# are cited. + +rate = 44100 + +# The CIAIR set is stereo because it provides both ear HRIRs. +type = stereo + +points = 512 + +# No head radius was provided. Just use the average radius of 9 cm. +radius = 0.09 + +# The CIAIR set is composed of a single field with an unknown distance +# between the source and the listener, so a guess of 1.5 meters is used. +distance = 1.5 + +# This set has a uniform number of azimuths for all but the poles (-90 and 90 +# degree elevation). +azimuths = 1, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 1 + +# The CIAIR source azimuth is counter-clockwise, so it needs to be flipped. +# The extension of the source data may be misleading, they're ASCII text +# lists of floating point values (one per line). Left and right ear HRIRs +# (from the respective files) are used to create a stereo HRTF. +[ 9, 0 ] = ascii (fp) : "./hrtfs/elev-45/L-45e000a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e000a.dat right +[ 9, 1 ] = ascii (fp) : "./hrtfs/elev-45/L-45e355a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e355a.dat right +[ 9, 2 ] = ascii (fp) : "./hrtfs/elev-45/L-45e350a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e350a.dat right +[ 9, 3 ] = ascii (fp) : "./hrtfs/elev-45/L-45e345a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e345a.dat right +[ 9, 4 ] = ascii (fp) : "./hrtfs/elev-45/L-45e340a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e340a.dat right +[ 9, 5 ] = ascii (fp) : "./hrtfs/elev-45/L-45e335a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e335a.dat right +[ 9, 6 ] = ascii (fp) : "./hrtfs/elev-45/L-45e330a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e330a.dat right +[ 9, 7 ] = ascii (fp) : "./hrtfs/elev-45/L-45e325a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e325a.dat right +[ 9, 8 ] = ascii (fp) : "./hrtfs/elev-45/L-45e320a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e320a.dat right +[ 9, 9 ] = ascii (fp) : "./hrtfs/elev-45/L-45e315a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e315a.dat right +[ 9, 10 ] = ascii (fp) : "./hrtfs/elev-45/L-45e310a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e310a.dat right +[ 9, 11 ] = ascii (fp) : "./hrtfs/elev-45/L-45e305a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e305a.dat right +[ 9, 12 ] = ascii (fp) : "./hrtfs/elev-45/L-45e300a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e300a.dat right +[ 9, 13 ] = ascii (fp) : "./hrtfs/elev-45/L-45e295a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e295a.dat right +[ 9, 14 ] = ascii (fp) : "./hrtfs/elev-45/L-45e290a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e290a.dat right +[ 9, 15 ] = ascii (fp) : "./hrtfs/elev-45/L-45e285a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e285a.dat right +[ 9, 16 ] = ascii (fp) : "./hrtfs/elev-45/L-45e280a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e280a.dat right +[ 9, 17 ] = ascii (fp) : "./hrtfs/elev-45/L-45e275a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e275a.dat right +[ 9, 18 ] = ascii (fp) : "./hrtfs/elev-45/L-45e270a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e270a.dat right +[ 9, 19 ] = ascii (fp) : "./hrtfs/elev-45/L-45e265a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e265a.dat right +[ 9, 20 ] = ascii (fp) : "./hrtfs/elev-45/L-45e260a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e260a.dat right +[ 9, 21 ] = ascii (fp) : "./hrtfs/elev-45/L-45e255a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e255a.dat right +[ 9, 22 ] = ascii (fp) : "./hrtfs/elev-45/L-45e250a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e250a.dat right +[ 9, 23 ] = ascii (fp) : "./hrtfs/elev-45/L-45e245a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e245a.dat right +[ 9, 24 ] = ascii (fp) : "./hrtfs/elev-45/L-45e240a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e240a.dat right +[ 9, 25 ] = ascii (fp) : "./hrtfs/elev-45/L-45e235a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e235a.dat right +[ 9, 26 ] = ascii (fp) : "./hrtfs/elev-45/L-45e230a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e230a.dat right +[ 9, 27 ] = ascii (fp) : "./hrtfs/elev-45/L-45e225a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e225a.dat right +[ 9, 28 ] = ascii (fp) : "./hrtfs/elev-45/L-45e220a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e220a.dat right +[ 9, 29 ] = ascii (fp) : "./hrtfs/elev-45/L-45e215a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e215a.dat right +[ 9, 30 ] = ascii (fp) : "./hrtfs/elev-45/L-45e210a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e210a.dat right +[ 9, 31 ] = ascii (fp) : "./hrtfs/elev-45/L-45e205a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e205a.dat right +[ 9, 32 ] = ascii (fp) : "./hrtfs/elev-45/L-45e200a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e200a.dat right +[ 9, 33 ] = ascii (fp) : "./hrtfs/elev-45/L-45e195a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e195a.dat right +[ 9, 34 ] = ascii (fp) : "./hrtfs/elev-45/L-45e190a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e190a.dat right +[ 9, 35 ] = ascii (fp) : "./hrtfs/elev-45/L-45e185a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e185a.dat right +[ 9, 36 ] = ascii (fp) : "./hrtfs/elev-45/L-45e180a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e180a.dat right +[ 9, 37 ] = ascii (fp) : "./hrtfs/elev-45/L-45e175a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e175a.dat right +[ 9, 38 ] = ascii (fp) : "./hrtfs/elev-45/L-45e170a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e170a.dat right +[ 9, 39 ] = ascii (fp) : "./hrtfs/elev-45/L-45e165a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e165a.dat right +[ 9, 40 ] = ascii (fp) : "./hrtfs/elev-45/L-45e160a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e160a.dat right +[ 9, 41 ] = ascii (fp) : "./hrtfs/elev-45/L-45e155a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e155a.dat right +[ 9, 42 ] = ascii (fp) : "./hrtfs/elev-45/L-45e150a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e150a.dat right +[ 9, 43 ] = ascii (fp) : "./hrtfs/elev-45/L-45e145a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e145a.dat right +[ 9, 44 ] = ascii (fp) : "./hrtfs/elev-45/L-45e140a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e140a.dat right +[ 9, 45 ] = ascii (fp) : "./hrtfs/elev-45/L-45e135a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e135a.dat right +[ 9, 46 ] = ascii (fp) : "./hrtfs/elev-45/L-45e130a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e130a.dat right +[ 9, 47 ] = ascii (fp) : "./hrtfs/elev-45/L-45e125a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e125a.dat right +[ 9, 48 ] = ascii (fp) : "./hrtfs/elev-45/L-45e120a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e120a.dat right +[ 9, 49 ] = ascii (fp) : "./hrtfs/elev-45/L-45e115a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e115a.dat right +[ 9, 50 ] = ascii (fp) : "./hrtfs/elev-45/L-45e110a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e110a.dat right +[ 9, 51 ] = ascii (fp) : "./hrtfs/elev-45/L-45e105a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e105a.dat right +[ 9, 52 ] = ascii (fp) : "./hrtfs/elev-45/L-45e100a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e100a.dat right +[ 9, 53 ] = ascii (fp) : "./hrtfs/elev-45/L-45e095a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e095a.dat right +[ 9, 54 ] = ascii (fp) : "./hrtfs/elev-45/L-45e090a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e090a.dat right +[ 9, 55 ] = ascii (fp) : "./hrtfs/elev-45/L-45e085a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e085a.dat right +[ 9, 56 ] = ascii (fp) : "./hrtfs/elev-45/L-45e080a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e080a.dat right +[ 9, 57 ] = ascii (fp) : "./hrtfs/elev-45/L-45e075a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e075a.dat right +[ 9, 58 ] = ascii (fp) : "./hrtfs/elev-45/L-45e070a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e070a.dat right +[ 9, 59 ] = ascii (fp) : "./hrtfs/elev-45/L-45e065a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e065a.dat right +[ 9, 60 ] = ascii (fp) : "./hrtfs/elev-45/L-45e060a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e060a.dat right +[ 9, 61 ] = ascii (fp) : "./hrtfs/elev-45/L-45e055a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e055a.dat right +[ 9, 62 ] = ascii (fp) : "./hrtfs/elev-45/L-45e050a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e050a.dat right +[ 9, 63 ] = ascii (fp) : "./hrtfs/elev-45/L-45e045a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e045a.dat right +[ 9, 64 ] = ascii (fp) : "./hrtfs/elev-45/L-45e040a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e040a.dat right +[ 9, 65 ] = ascii (fp) : "./hrtfs/elev-45/L-45e035a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e035a.dat right +[ 9, 66 ] = ascii (fp) : "./hrtfs/elev-45/L-45e030a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e030a.dat right +[ 9, 67 ] = ascii (fp) : "./hrtfs/elev-45/L-45e025a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e025a.dat right +[ 9, 68 ] = ascii (fp) : "./hrtfs/elev-45/L-45e020a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e020a.dat right +[ 9, 69 ] = ascii (fp) : "./hrtfs/elev-45/L-45e015a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e015a.dat right +[ 9, 70 ] = ascii (fp) : "./hrtfs/elev-45/L-45e010a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e010a.dat right +[ 9, 71 ] = ascii (fp) : "./hrtfs/elev-45/L-45e005a.dat left + + ascii (fp) : "./hrtfs/elev-45/R-45e005a.dat right + +[ 10, 0 ] = ascii (fp) : "./hrtfs/elev-40/L-40e000a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e000a.dat right +[ 10, 1 ] = ascii (fp) : "./hrtfs/elev-40/L-40e355a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e355a.dat right +[ 10, 2 ] = ascii (fp) : "./hrtfs/elev-40/L-40e350a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e350a.dat right +[ 10, 3 ] = ascii (fp) : "./hrtfs/elev-40/L-40e345a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e345a.dat right +[ 10, 4 ] = ascii (fp) : "./hrtfs/elev-40/L-40e340a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e340a.dat right +[ 10, 5 ] = ascii (fp) : "./hrtfs/elev-40/L-40e335a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e335a.dat right +[ 10, 6 ] = ascii (fp) : "./hrtfs/elev-40/L-40e330a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e330a.dat right +[ 10, 7 ] = ascii (fp) : "./hrtfs/elev-40/L-40e325a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e325a.dat right +[ 10, 8 ] = ascii (fp) : "./hrtfs/elev-40/L-40e320a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e320a.dat right +[ 10, 9 ] = ascii (fp) : "./hrtfs/elev-40/L-40e315a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e315a.dat right +[ 10, 10 ] = ascii (fp) : "./hrtfs/elev-40/L-40e310a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e310a.dat right +[ 10, 11 ] = ascii (fp) : "./hrtfs/elev-40/L-40e305a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e305a.dat right +[ 10, 12 ] = ascii (fp) : "./hrtfs/elev-40/L-40e300a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e300a.dat right +[ 10, 13 ] = ascii (fp) : "./hrtfs/elev-40/L-40e295a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e295a.dat right +[ 10, 14 ] = ascii (fp) : "./hrtfs/elev-40/L-40e290a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e290a.dat right +[ 10, 15 ] = ascii (fp) : "./hrtfs/elev-40/L-40e285a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e285a.dat right +[ 10, 16 ] = ascii (fp) : "./hrtfs/elev-40/L-40e280a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e280a.dat right +[ 10, 17 ] = ascii (fp) : "./hrtfs/elev-40/L-40e275a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e275a.dat right +[ 10, 18 ] = ascii (fp) : "./hrtfs/elev-40/L-40e270a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e270a.dat right +[ 10, 19 ] = ascii (fp) : "./hrtfs/elev-40/L-40e265a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e265a.dat right +[ 10, 20 ] = ascii (fp) : "./hrtfs/elev-40/L-40e260a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e260a.dat right +[ 10, 21 ] = ascii (fp) : "./hrtfs/elev-40/L-40e255a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e255a.dat right +[ 10, 22 ] = ascii (fp) : "./hrtfs/elev-40/L-40e250a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e250a.dat right +[ 10, 23 ] = ascii (fp) : "./hrtfs/elev-40/L-40e245a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e245a.dat right +[ 10, 24 ] = ascii (fp) : "./hrtfs/elev-40/L-40e240a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e240a.dat right +[ 10, 25 ] = ascii (fp) : "./hrtfs/elev-40/L-40e235a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e235a.dat right +[ 10, 26 ] = ascii (fp) : "./hrtfs/elev-40/L-40e230a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e230a.dat right +[ 10, 27 ] = ascii (fp) : "./hrtfs/elev-40/L-40e225a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e225a.dat right +[ 10, 28 ] = ascii (fp) : "./hrtfs/elev-40/L-40e220a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e220a.dat right +[ 10, 29 ] = ascii (fp) : "./hrtfs/elev-40/L-40e215a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e215a.dat right +[ 10, 30 ] = ascii (fp) : "./hrtfs/elev-40/L-40e210a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e210a.dat right +[ 10, 31 ] = ascii (fp) : "./hrtfs/elev-40/L-40e205a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e205a.dat right +[ 10, 32 ] = ascii (fp) : "./hrtfs/elev-40/L-40e200a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e200a.dat right +[ 10, 33 ] = ascii (fp) : "./hrtfs/elev-40/L-40e195a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e195a.dat right +[ 10, 34 ] = ascii (fp) : "./hrtfs/elev-40/L-40e190a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e190a.dat right +[ 10, 35 ] = ascii (fp) : "./hrtfs/elev-40/L-40e185a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e185a.dat right +[ 10, 36 ] = ascii (fp) : "./hrtfs/elev-40/L-40e180a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e180a.dat right +[ 10, 37 ] = ascii (fp) : "./hrtfs/elev-40/L-40e175a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e175a.dat right +[ 10, 38 ] = ascii (fp) : "./hrtfs/elev-40/L-40e170a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e170a.dat right +[ 10, 39 ] = ascii (fp) : "./hrtfs/elev-40/L-40e165a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e165a.dat right +[ 10, 40 ] = ascii (fp) : "./hrtfs/elev-40/L-40e160a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e160a.dat right +[ 10, 41 ] = ascii (fp) : "./hrtfs/elev-40/L-40e155a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e155a.dat right +[ 10, 42 ] = ascii (fp) : "./hrtfs/elev-40/L-40e150a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e150a.dat right +[ 10, 43 ] = ascii (fp) : "./hrtfs/elev-40/L-40e145a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e145a.dat right +[ 10, 44 ] = ascii (fp) : "./hrtfs/elev-40/L-40e140a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e140a.dat right +[ 10, 45 ] = ascii (fp) : "./hrtfs/elev-40/L-40e135a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e135a.dat right +[ 10, 46 ] = ascii (fp) : "./hrtfs/elev-40/L-40e130a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e130a.dat right +[ 10, 47 ] = ascii (fp) : "./hrtfs/elev-40/L-40e125a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e125a.dat right +[ 10, 48 ] = ascii (fp) : "./hrtfs/elev-40/L-40e120a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e120a.dat right +[ 10, 49 ] = ascii (fp) : "./hrtfs/elev-40/L-40e115a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e115a.dat right +[ 10, 50 ] = ascii (fp) : "./hrtfs/elev-40/L-40e110a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e110a.dat right +[ 10, 51 ] = ascii (fp) : "./hrtfs/elev-40/L-40e105a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e105a.dat right +[ 10, 52 ] = ascii (fp) : "./hrtfs/elev-40/L-40e100a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e100a.dat right +[ 10, 53 ] = ascii (fp) : "./hrtfs/elev-40/L-40e095a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e095a.dat right +[ 10, 54 ] = ascii (fp) : "./hrtfs/elev-40/L-40e090a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e090a.dat right +[ 10, 55 ] = ascii (fp) : "./hrtfs/elev-40/L-40e085a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e085a.dat right +[ 10, 56 ] = ascii (fp) : "./hrtfs/elev-40/L-40e080a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e080a.dat right +[ 10, 57 ] = ascii (fp) : "./hrtfs/elev-40/L-40e075a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e075a.dat right +[ 10, 58 ] = ascii (fp) : "./hrtfs/elev-40/L-40e070a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e070a.dat right +[ 10, 59 ] = ascii (fp) : "./hrtfs/elev-40/L-40e065a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e065a.dat right +[ 10, 60 ] = ascii (fp) : "./hrtfs/elev-40/L-40e060a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e060a.dat right +[ 10, 61 ] = ascii (fp) : "./hrtfs/elev-40/L-40e055a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e055a.dat right +[ 10, 62 ] = ascii (fp) : "./hrtfs/elev-40/L-40e050a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e050a.dat right +[ 10, 63 ] = ascii (fp) : "./hrtfs/elev-40/L-40e045a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e045a.dat right +[ 10, 64 ] = ascii (fp) : "./hrtfs/elev-40/L-40e040a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e040a.dat right +[ 10, 65 ] = ascii (fp) : "./hrtfs/elev-40/L-40e035a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e035a.dat right +[ 10, 66 ] = ascii (fp) : "./hrtfs/elev-40/L-40e030a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e030a.dat right +[ 10, 67 ] = ascii (fp) : "./hrtfs/elev-40/L-40e025a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e025a.dat right +[ 10, 68 ] = ascii (fp) : "./hrtfs/elev-40/L-40e020a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e020a.dat right +[ 10, 69 ] = ascii (fp) : "./hrtfs/elev-40/L-40e015a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e015a.dat right +[ 10, 70 ] = ascii (fp) : "./hrtfs/elev-40/L-40e010a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e010a.dat right +[ 10, 71 ] = ascii (fp) : "./hrtfs/elev-40/L-40e005a.dat left + + ascii (fp) : "./hrtfs/elev-40/R-40e005a.dat right + +[ 11, 0 ] = ascii (fp) : "./hrtfs/elev-35/L-35e000a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e000a.dat right +[ 11, 1 ] = ascii (fp) : "./hrtfs/elev-35/L-35e355a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e355a.dat right +[ 11, 2 ] = ascii (fp) : "./hrtfs/elev-35/L-35e350a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e350a.dat right +[ 11, 3 ] = ascii (fp) : "./hrtfs/elev-35/L-35e345a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e345a.dat right +[ 11, 4 ] = ascii (fp) : "./hrtfs/elev-35/L-35e340a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e340a.dat right +[ 11, 5 ] = ascii (fp) : "./hrtfs/elev-35/L-35e335a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e335a.dat right +[ 11, 6 ] = ascii (fp) : "./hrtfs/elev-35/L-35e330a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e330a.dat right +[ 11, 7 ] = ascii (fp) : "./hrtfs/elev-35/L-35e325a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e325a.dat right +[ 11, 8 ] = ascii (fp) : "./hrtfs/elev-35/L-35e320a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e320a.dat right +[ 11, 9 ] = ascii (fp) : "./hrtfs/elev-35/L-35e315a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e315a.dat right +[ 11, 10 ] = ascii (fp) : "./hrtfs/elev-35/L-35e310a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e310a.dat right +[ 11, 11 ] = ascii (fp) : "./hrtfs/elev-35/L-35e305a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e305a.dat right +[ 11, 12 ] = ascii (fp) : "./hrtfs/elev-35/L-35e300a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e300a.dat right +[ 11, 13 ] = ascii (fp) : "./hrtfs/elev-35/L-35e295a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e295a.dat right +[ 11, 14 ] = ascii (fp) : "./hrtfs/elev-35/L-35e290a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e290a.dat right +[ 11, 15 ] = ascii (fp) : "./hrtfs/elev-35/L-35e285a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e285a.dat right +[ 11, 16 ] = ascii (fp) : "./hrtfs/elev-35/L-35e280a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e280a.dat right +[ 11, 17 ] = ascii (fp) : "./hrtfs/elev-35/L-35e275a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e275a.dat right +[ 11, 18 ] = ascii (fp) : "./hrtfs/elev-35/L-35e270a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e270a.dat right +[ 11, 19 ] = ascii (fp) : "./hrtfs/elev-35/L-35e265a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e265a.dat right +[ 11, 20 ] = ascii (fp) : "./hrtfs/elev-35/L-35e260a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e260a.dat right +[ 11, 21 ] = ascii (fp) : "./hrtfs/elev-35/L-35e255a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e255a.dat right +[ 11, 22 ] = ascii (fp) : "./hrtfs/elev-35/L-35e250a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e250a.dat right +[ 11, 23 ] = ascii (fp) : "./hrtfs/elev-35/L-35e245a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e245a.dat right +[ 11, 24 ] = ascii (fp) : "./hrtfs/elev-35/L-35e240a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e240a.dat right +[ 11, 25 ] = ascii (fp) : "./hrtfs/elev-35/L-35e235a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e235a.dat right +[ 11, 26 ] = ascii (fp) : "./hrtfs/elev-35/L-35e230a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e230a.dat right +[ 11, 27 ] = ascii (fp) : "./hrtfs/elev-35/L-35e225a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e225a.dat right +[ 11, 28 ] = ascii (fp) : "./hrtfs/elev-35/L-35e220a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e220a.dat right +[ 11, 29 ] = ascii (fp) : "./hrtfs/elev-35/L-35e215a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e215a.dat right +[ 11, 30 ] = ascii (fp) : "./hrtfs/elev-35/L-35e210a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e210a.dat right +[ 11, 31 ] = ascii (fp) : "./hrtfs/elev-35/L-35e205a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e205a.dat right +[ 11, 32 ] = ascii (fp) : "./hrtfs/elev-35/L-35e200a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e200a.dat right +[ 11, 33 ] = ascii (fp) : "./hrtfs/elev-35/L-35e195a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e195a.dat right +[ 11, 34 ] = ascii (fp) : "./hrtfs/elev-35/L-35e190a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e190a.dat right +[ 11, 35 ] = ascii (fp) : "./hrtfs/elev-35/L-35e185a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e185a.dat right +[ 11, 36 ] = ascii (fp) : "./hrtfs/elev-35/L-35e180a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e180a.dat right +[ 11, 37 ] = ascii (fp) : "./hrtfs/elev-35/L-35e175a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e175a.dat right +[ 11, 38 ] = ascii (fp) : "./hrtfs/elev-35/L-35e170a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e170a.dat right +[ 11, 39 ] = ascii (fp) : "./hrtfs/elev-35/L-35e165a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e165a.dat right +[ 11, 40 ] = ascii (fp) : "./hrtfs/elev-35/L-35e160a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e160a.dat right +[ 11, 41 ] = ascii (fp) : "./hrtfs/elev-35/L-35e155a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e155a.dat right +[ 11, 42 ] = ascii (fp) : "./hrtfs/elev-35/L-35e150a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e150a.dat right +[ 11, 43 ] = ascii (fp) : "./hrtfs/elev-35/L-35e145a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e145a.dat right +[ 11, 44 ] = ascii (fp) : "./hrtfs/elev-35/L-35e140a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e140a.dat right +[ 11, 45 ] = ascii (fp) : "./hrtfs/elev-35/L-35e135a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e135a.dat right +[ 11, 46 ] = ascii (fp) : "./hrtfs/elev-35/L-35e130a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e130a.dat right +[ 11, 47 ] = ascii (fp) : "./hrtfs/elev-35/L-35e125a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e125a.dat right +[ 11, 48 ] = ascii (fp) : "./hrtfs/elev-35/L-35e120a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e120a.dat right +[ 11, 49 ] = ascii (fp) : "./hrtfs/elev-35/L-35e115a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e115a.dat right +[ 11, 50 ] = ascii (fp) : "./hrtfs/elev-35/L-35e110a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e110a.dat right +[ 11, 51 ] = ascii (fp) : "./hrtfs/elev-35/L-35e105a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e105a.dat right +[ 11, 52 ] = ascii (fp) : "./hrtfs/elev-35/L-35e100a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e100a.dat right +[ 11, 53 ] = ascii (fp) : "./hrtfs/elev-35/L-35e095a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e095a.dat right +[ 11, 54 ] = ascii (fp) : "./hrtfs/elev-35/L-35e090a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e090a.dat right +[ 11, 55 ] = ascii (fp) : "./hrtfs/elev-35/L-35e085a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e085a.dat right +[ 11, 56 ] = ascii (fp) : "./hrtfs/elev-35/L-35e080a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e080a.dat right +[ 11, 57 ] = ascii (fp) : "./hrtfs/elev-35/L-35e075a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e075a.dat right +[ 11, 58 ] = ascii (fp) : "./hrtfs/elev-35/L-35e070a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e070a.dat right +[ 11, 59 ] = ascii (fp) : "./hrtfs/elev-35/L-35e065a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e065a.dat right +[ 11, 60 ] = ascii (fp) : "./hrtfs/elev-35/L-35e060a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e060a.dat right +[ 11, 61 ] = ascii (fp) : "./hrtfs/elev-35/L-35e055a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e055a.dat right +[ 11, 62 ] = ascii (fp) : "./hrtfs/elev-35/L-35e050a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e050a.dat right +[ 11, 63 ] = ascii (fp) : "./hrtfs/elev-35/L-35e045a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e045a.dat right +[ 11, 64 ] = ascii (fp) : "./hrtfs/elev-35/L-35e040a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e040a.dat right +[ 11, 65 ] = ascii (fp) : "./hrtfs/elev-35/L-35e035a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e035a.dat right +[ 11, 66 ] = ascii (fp) : "./hrtfs/elev-35/L-35e030a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e030a.dat right +[ 11, 67 ] = ascii (fp) : "./hrtfs/elev-35/L-35e025a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e025a.dat right +[ 11, 68 ] = ascii (fp) : "./hrtfs/elev-35/L-35e020a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e020a.dat right +[ 11, 69 ] = ascii (fp) : "./hrtfs/elev-35/L-35e015a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e015a.dat right +[ 11, 70 ] = ascii (fp) : "./hrtfs/elev-35/L-35e010a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e010a.dat right +[ 11, 71 ] = ascii (fp) : "./hrtfs/elev-35/L-35e005a.dat left + + ascii (fp) : "./hrtfs/elev-35/R-35e005a.dat right + +[ 12, 0 ] = ascii (fp) : "./hrtfs/elev-30/L-30e000a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e000a.dat right +[ 12, 1 ] = ascii (fp) : "./hrtfs/elev-30/L-30e355a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e355a.dat right +[ 12, 2 ] = ascii (fp) : "./hrtfs/elev-30/L-30e350a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e350a.dat right +[ 12, 3 ] = ascii (fp) : "./hrtfs/elev-30/L-30e345a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e345a.dat right +[ 12, 4 ] = ascii (fp) : "./hrtfs/elev-30/L-30e340a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e340a.dat right +[ 12, 5 ] = ascii (fp) : "./hrtfs/elev-30/L-30e335a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e335a.dat right +[ 12, 6 ] = ascii (fp) : "./hrtfs/elev-30/L-30e330a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e330a.dat right +[ 12, 7 ] = ascii (fp) : "./hrtfs/elev-30/L-30e325a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e325a.dat right +[ 12, 8 ] = ascii (fp) : "./hrtfs/elev-30/L-30e320a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e320a.dat right +[ 12, 9 ] = ascii (fp) : "./hrtfs/elev-30/L-30e315a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e315a.dat right +[ 12, 10 ] = ascii (fp) : "./hrtfs/elev-30/L-30e310a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e310a.dat right +[ 12, 11 ] = ascii (fp) : "./hrtfs/elev-30/L-30e305a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e305a.dat right +[ 12, 12 ] = ascii (fp) : "./hrtfs/elev-30/L-30e300a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e300a.dat right +[ 12, 13 ] = ascii (fp) : "./hrtfs/elev-30/L-30e295a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e295a.dat right +[ 12, 14 ] = ascii (fp) : "./hrtfs/elev-30/L-30e290a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e290a.dat right +[ 12, 15 ] = ascii (fp) : "./hrtfs/elev-30/L-30e285a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e285a.dat right +[ 12, 16 ] = ascii (fp) : "./hrtfs/elev-30/L-30e280a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e280a.dat right +[ 12, 17 ] = ascii (fp) : "./hrtfs/elev-30/L-30e275a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e275a.dat right +[ 12, 18 ] = ascii (fp) : "./hrtfs/elev-30/L-30e270a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e270a.dat right +[ 12, 19 ] = ascii (fp) : "./hrtfs/elev-30/L-30e265a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e265a.dat right +[ 12, 20 ] = ascii (fp) : "./hrtfs/elev-30/L-30e260a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e260a.dat right +[ 12, 21 ] = ascii (fp) : "./hrtfs/elev-30/L-30e255a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e255a.dat right +[ 12, 22 ] = ascii (fp) : "./hrtfs/elev-30/L-30e250a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e250a.dat right +[ 12, 23 ] = ascii (fp) : "./hrtfs/elev-30/L-30e245a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e245a.dat right +[ 12, 24 ] = ascii (fp) : "./hrtfs/elev-30/L-30e240a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e240a.dat right +[ 12, 25 ] = ascii (fp) : "./hrtfs/elev-30/L-30e235a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e235a.dat right +[ 12, 26 ] = ascii (fp) : "./hrtfs/elev-30/L-30e230a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e230a.dat right +[ 12, 27 ] = ascii (fp) : "./hrtfs/elev-30/L-30e225a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e225a.dat right +[ 12, 28 ] = ascii (fp) : "./hrtfs/elev-30/L-30e220a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e220a.dat right +[ 12, 29 ] = ascii (fp) : "./hrtfs/elev-30/L-30e215a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e215a.dat right +[ 12, 30 ] = ascii (fp) : "./hrtfs/elev-30/L-30e210a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e210a.dat right +[ 12, 31 ] = ascii (fp) : "./hrtfs/elev-30/L-30e205a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e205a.dat right +[ 12, 32 ] = ascii (fp) : "./hrtfs/elev-30/L-30e200a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e200a.dat right +[ 12, 33 ] = ascii (fp) : "./hrtfs/elev-30/L-30e195a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e195a.dat right +[ 12, 34 ] = ascii (fp) : "./hrtfs/elev-30/L-30e190a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e190a.dat right +[ 12, 35 ] = ascii (fp) : "./hrtfs/elev-30/L-30e185a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e185a.dat right +[ 12, 36 ] = ascii (fp) : "./hrtfs/elev-30/L-30e180a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e180a.dat right +[ 12, 37 ] = ascii (fp) : "./hrtfs/elev-30/L-30e175a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e175a.dat right +[ 12, 38 ] = ascii (fp) : "./hrtfs/elev-30/L-30e170a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e170a.dat right +[ 12, 39 ] = ascii (fp) : "./hrtfs/elev-30/L-30e165a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e165a.dat right +[ 12, 40 ] = ascii (fp) : "./hrtfs/elev-30/L-30e160a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e160a.dat right +[ 12, 41 ] = ascii (fp) : "./hrtfs/elev-30/L-30e155a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e155a.dat right +[ 12, 42 ] = ascii (fp) : "./hrtfs/elev-30/L-30e150a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e150a.dat right +[ 12, 43 ] = ascii (fp) : "./hrtfs/elev-30/L-30e145a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e145a.dat right +[ 12, 44 ] = ascii (fp) : "./hrtfs/elev-30/L-30e140a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e140a.dat right +[ 12, 45 ] = ascii (fp) : "./hrtfs/elev-30/L-30e135a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e135a.dat right +[ 12, 46 ] = ascii (fp) : "./hrtfs/elev-30/L-30e130a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e130a.dat right +[ 12, 47 ] = ascii (fp) : "./hrtfs/elev-30/L-30e125a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e125a.dat right +[ 12, 48 ] = ascii (fp) : "./hrtfs/elev-30/L-30e120a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e120a.dat right +[ 12, 49 ] = ascii (fp) : "./hrtfs/elev-30/L-30e115a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e115a.dat right +[ 12, 50 ] = ascii (fp) : "./hrtfs/elev-30/L-30e110a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e110a.dat right +[ 12, 51 ] = ascii (fp) : "./hrtfs/elev-30/L-30e105a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e105a.dat right +[ 12, 52 ] = ascii (fp) : "./hrtfs/elev-30/L-30e100a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e100a.dat right +[ 12, 53 ] = ascii (fp) : "./hrtfs/elev-30/L-30e095a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e095a.dat right +[ 12, 54 ] = ascii (fp) : "./hrtfs/elev-30/L-30e090a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e090a.dat right +[ 12, 55 ] = ascii (fp) : "./hrtfs/elev-30/L-30e085a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e085a.dat right +[ 12, 56 ] = ascii (fp) : "./hrtfs/elev-30/L-30e080a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e080a.dat right +[ 12, 57 ] = ascii (fp) : "./hrtfs/elev-30/L-30e075a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e075a.dat right +[ 12, 58 ] = ascii (fp) : "./hrtfs/elev-30/L-30e070a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e070a.dat right +[ 12, 59 ] = ascii (fp) : "./hrtfs/elev-30/L-30e065a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e065a.dat right +[ 12, 60 ] = ascii (fp) : "./hrtfs/elev-30/L-30e060a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e060a.dat right +[ 12, 61 ] = ascii (fp) : "./hrtfs/elev-30/L-30e055a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e055a.dat right +[ 12, 62 ] = ascii (fp) : "./hrtfs/elev-30/L-30e050a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e050a.dat right +[ 12, 63 ] = ascii (fp) : "./hrtfs/elev-30/L-30e045a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e045a.dat right +[ 12, 64 ] = ascii (fp) : "./hrtfs/elev-30/L-30e040a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e040a.dat right +[ 12, 65 ] = ascii (fp) : "./hrtfs/elev-30/L-30e035a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e035a.dat right +[ 12, 66 ] = ascii (fp) : "./hrtfs/elev-30/L-30e030a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e030a.dat right +[ 12, 67 ] = ascii (fp) : "./hrtfs/elev-30/L-30e025a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e025a.dat right +[ 12, 68 ] = ascii (fp) : "./hrtfs/elev-30/L-30e020a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e020a.dat right +[ 12, 69 ] = ascii (fp) : "./hrtfs/elev-30/L-30e015a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e015a.dat right +[ 12, 70 ] = ascii (fp) : "./hrtfs/elev-30/L-30e010a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e010a.dat right +[ 12, 71 ] = ascii (fp) : "./hrtfs/elev-30/L-30e005a.dat left + + ascii (fp) : "./hrtfs/elev-30/R-30e005a.dat right + +[ 13, 0 ] = ascii (fp) : "./hrtfs/elev-25/L-25e000a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e000a.dat right +[ 13, 1 ] = ascii (fp) : "./hrtfs/elev-25/L-25e355a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e355a.dat right +[ 13, 2 ] = ascii (fp) : "./hrtfs/elev-25/L-25e350a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e350a.dat right +[ 13, 3 ] = ascii (fp) : "./hrtfs/elev-25/L-25e345a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e345a.dat right +[ 13, 4 ] = ascii (fp) : "./hrtfs/elev-25/L-25e340a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e340a.dat right +[ 13, 5 ] = ascii (fp) : "./hrtfs/elev-25/L-25e335a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e335a.dat right +[ 13, 6 ] = ascii (fp) : "./hrtfs/elev-25/L-25e330a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e330a.dat right +[ 13, 7 ] = ascii (fp) : "./hrtfs/elev-25/L-25e325a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e325a.dat right +[ 13, 8 ] = ascii (fp) : "./hrtfs/elev-25/L-25e320a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e320a.dat right +[ 13, 9 ] = ascii (fp) : "./hrtfs/elev-25/L-25e315a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e315a.dat right +[ 13, 10 ] = ascii (fp) : "./hrtfs/elev-25/L-25e310a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e310a.dat right +[ 13, 11 ] = ascii (fp) : "./hrtfs/elev-25/L-25e305a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e305a.dat right +[ 13, 12 ] = ascii (fp) : "./hrtfs/elev-25/L-25e300a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e300a.dat right +[ 13, 13 ] = ascii (fp) : "./hrtfs/elev-25/L-25e295a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e295a.dat right +[ 13, 14 ] = ascii (fp) : "./hrtfs/elev-25/L-25e290a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e290a.dat right +[ 13, 15 ] = ascii (fp) : "./hrtfs/elev-25/L-25e285a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e285a.dat right +[ 13, 16 ] = ascii (fp) : "./hrtfs/elev-25/L-25e280a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e280a.dat right +[ 13, 17 ] = ascii (fp) : "./hrtfs/elev-25/L-25e275a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e275a.dat right +[ 13, 18 ] = ascii (fp) : "./hrtfs/elev-25/L-25e270a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e270a.dat right +[ 13, 19 ] = ascii (fp) : "./hrtfs/elev-25/L-25e265a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e265a.dat right +[ 13, 20 ] = ascii (fp) : "./hrtfs/elev-25/L-25e260a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e260a.dat right +[ 13, 21 ] = ascii (fp) : "./hrtfs/elev-25/L-25e255a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e255a.dat right +[ 13, 22 ] = ascii (fp) : "./hrtfs/elev-25/L-25e250a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e250a.dat right +[ 13, 23 ] = ascii (fp) : "./hrtfs/elev-25/L-25e245a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e245a.dat right +[ 13, 24 ] = ascii (fp) : "./hrtfs/elev-25/L-25e240a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e240a.dat right +[ 13, 25 ] = ascii (fp) : "./hrtfs/elev-25/L-25e235a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e235a.dat right +[ 13, 26 ] = ascii (fp) : "./hrtfs/elev-25/L-25e230a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e230a.dat right +[ 13, 27 ] = ascii (fp) : "./hrtfs/elev-25/L-25e225a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e225a.dat right +[ 13, 28 ] = ascii (fp) : "./hrtfs/elev-25/L-25e220a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e220a.dat right +[ 13, 29 ] = ascii (fp) : "./hrtfs/elev-25/L-25e215a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e215a.dat right +[ 13, 30 ] = ascii (fp) : "./hrtfs/elev-25/L-25e210a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e210a.dat right +[ 13, 31 ] = ascii (fp) : "./hrtfs/elev-25/L-25e205a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e205a.dat right +[ 13, 32 ] = ascii (fp) : "./hrtfs/elev-25/L-25e200a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e200a.dat right +[ 13, 33 ] = ascii (fp) : "./hrtfs/elev-25/L-25e195a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e195a.dat right +[ 13, 34 ] = ascii (fp) : "./hrtfs/elev-25/L-25e190a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e190a.dat right +[ 13, 35 ] = ascii (fp) : "./hrtfs/elev-25/L-25e185a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e185a.dat right +[ 13, 36 ] = ascii (fp) : "./hrtfs/elev-25/L-25e180a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e180a.dat right +[ 13, 37 ] = ascii (fp) : "./hrtfs/elev-25/L-25e175a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e175a.dat right +[ 13, 38 ] = ascii (fp) : "./hrtfs/elev-25/L-25e170a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e170a.dat right +[ 13, 39 ] = ascii (fp) : "./hrtfs/elev-25/L-25e165a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e165a.dat right +[ 13, 40 ] = ascii (fp) : "./hrtfs/elev-25/L-25e160a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e160a.dat right +[ 13, 41 ] = ascii (fp) : "./hrtfs/elev-25/L-25e155a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e155a.dat right +[ 13, 42 ] = ascii (fp) : "./hrtfs/elev-25/L-25e150a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e150a.dat right +[ 13, 43 ] = ascii (fp) : "./hrtfs/elev-25/L-25e145a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e145a.dat right +[ 13, 44 ] = ascii (fp) : "./hrtfs/elev-25/L-25e140a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e140a.dat right +[ 13, 45 ] = ascii (fp) : "./hrtfs/elev-25/L-25e135a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e135a.dat right +[ 13, 46 ] = ascii (fp) : "./hrtfs/elev-25/L-25e130a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e130a.dat right +[ 13, 47 ] = ascii (fp) : "./hrtfs/elev-25/L-25e125a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e125a.dat right +[ 13, 48 ] = ascii (fp) : "./hrtfs/elev-25/L-25e120a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e120a.dat right +[ 13, 49 ] = ascii (fp) : "./hrtfs/elev-25/L-25e115a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e115a.dat right +[ 13, 50 ] = ascii (fp) : "./hrtfs/elev-25/L-25e110a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e110a.dat right +[ 13, 51 ] = ascii (fp) : "./hrtfs/elev-25/L-25e105a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e105a.dat right +[ 13, 52 ] = ascii (fp) : "./hrtfs/elev-25/L-25e100a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e100a.dat right +[ 13, 53 ] = ascii (fp) : "./hrtfs/elev-25/L-25e095a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e095a.dat right +[ 13, 54 ] = ascii (fp) : "./hrtfs/elev-25/L-25e090a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e090a.dat right +[ 13, 55 ] = ascii (fp) : "./hrtfs/elev-25/L-25e085a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e085a.dat right +[ 13, 56 ] = ascii (fp) : "./hrtfs/elev-25/L-25e080a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e080a.dat right +[ 13, 57 ] = ascii (fp) : "./hrtfs/elev-25/L-25e075a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e075a.dat right +[ 13, 58 ] = ascii (fp) : "./hrtfs/elev-25/L-25e070a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e070a.dat right +[ 13, 59 ] = ascii (fp) : "./hrtfs/elev-25/L-25e065a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e065a.dat right +[ 13, 60 ] = ascii (fp) : "./hrtfs/elev-25/L-25e060a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e060a.dat right +[ 13, 61 ] = ascii (fp) : "./hrtfs/elev-25/L-25e055a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e055a.dat right +[ 13, 62 ] = ascii (fp) : "./hrtfs/elev-25/L-25e050a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e050a.dat right +[ 13, 63 ] = ascii (fp) : "./hrtfs/elev-25/L-25e045a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e045a.dat right +[ 13, 64 ] = ascii (fp) : "./hrtfs/elev-25/L-25e040a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e040a.dat right +[ 13, 65 ] = ascii (fp) : "./hrtfs/elev-25/L-25e035a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e035a.dat right +[ 13, 66 ] = ascii (fp) : "./hrtfs/elev-25/L-25e030a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e030a.dat right +[ 13, 67 ] = ascii (fp) : "./hrtfs/elev-25/L-25e025a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e025a.dat right +[ 13, 68 ] = ascii (fp) : "./hrtfs/elev-25/L-25e020a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e020a.dat right +[ 13, 69 ] = ascii (fp) : "./hrtfs/elev-25/L-25e015a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e015a.dat right +[ 13, 70 ] = ascii (fp) : "./hrtfs/elev-25/L-25e010a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e010a.dat right +[ 13, 71 ] = ascii (fp) : "./hrtfs/elev-25/L-25e005a.dat left + + ascii (fp) : "./hrtfs/elev-25/R-25e005a.dat right + +[ 14, 0 ] = ascii (fp) : "./hrtfs/elev-20/L-20e000a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e000a.dat right +[ 14, 1 ] = ascii (fp) : "./hrtfs/elev-20/L-20e355a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e355a.dat right +[ 14, 2 ] = ascii (fp) : "./hrtfs/elev-20/L-20e350a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e350a.dat right +[ 14, 3 ] = ascii (fp) : "./hrtfs/elev-20/L-20e345a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e345a.dat right +[ 14, 4 ] = ascii (fp) : "./hrtfs/elev-20/L-20e340a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e340a.dat right +[ 14, 5 ] = ascii (fp) : "./hrtfs/elev-20/L-20e335a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e335a.dat right +[ 14, 6 ] = ascii (fp) : "./hrtfs/elev-20/L-20e330a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e330a.dat right +[ 14, 7 ] = ascii (fp) : "./hrtfs/elev-20/L-20e325a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e325a.dat right +[ 14, 8 ] = ascii (fp) : "./hrtfs/elev-20/L-20e320a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e320a.dat right +[ 14, 9 ] = ascii (fp) : "./hrtfs/elev-20/L-20e315a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e315a.dat right +[ 14, 10 ] = ascii (fp) : "./hrtfs/elev-20/L-20e310a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e310a.dat right +[ 14, 11 ] = ascii (fp) : "./hrtfs/elev-20/L-20e305a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e305a.dat right +[ 14, 12 ] = ascii (fp) : "./hrtfs/elev-20/L-20e300a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e300a.dat right +[ 14, 13 ] = ascii (fp) : "./hrtfs/elev-20/L-20e295a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e295a.dat right +[ 14, 14 ] = ascii (fp) : "./hrtfs/elev-20/L-20e290a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e290a.dat right +[ 14, 15 ] = ascii (fp) : "./hrtfs/elev-20/L-20e285a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e285a.dat right +[ 14, 16 ] = ascii (fp) : "./hrtfs/elev-20/L-20e280a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e280a.dat right +[ 14, 17 ] = ascii (fp) : "./hrtfs/elev-20/L-20e275a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e275a.dat right +[ 14, 18 ] = ascii (fp) : "./hrtfs/elev-20/L-20e270a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e270a.dat right +[ 14, 19 ] = ascii (fp) : "./hrtfs/elev-20/L-20e265a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e265a.dat right +[ 14, 20 ] = ascii (fp) : "./hrtfs/elev-20/L-20e260a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e260a.dat right +[ 14, 21 ] = ascii (fp) : "./hrtfs/elev-20/L-20e255a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e255a.dat right +[ 14, 22 ] = ascii (fp) : "./hrtfs/elev-20/L-20e250a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e250a.dat right +[ 14, 23 ] = ascii (fp) : "./hrtfs/elev-20/L-20e245a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e245a.dat right +[ 14, 24 ] = ascii (fp) : "./hrtfs/elev-20/L-20e240a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e240a.dat right +[ 14, 25 ] = ascii (fp) : "./hrtfs/elev-20/L-20e235a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e235a.dat right +[ 14, 26 ] = ascii (fp) : "./hrtfs/elev-20/L-20e230a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e230a.dat right +[ 14, 27 ] = ascii (fp) : "./hrtfs/elev-20/L-20e225a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e225a.dat right +[ 14, 28 ] = ascii (fp) : "./hrtfs/elev-20/L-20e220a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e220a.dat right +[ 14, 29 ] = ascii (fp) : "./hrtfs/elev-20/L-20e215a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e215a.dat right +[ 14, 30 ] = ascii (fp) : "./hrtfs/elev-20/L-20e210a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e210a.dat right +[ 14, 31 ] = ascii (fp) : "./hrtfs/elev-20/L-20e205a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e205a.dat right +[ 14, 32 ] = ascii (fp) : "./hrtfs/elev-20/L-20e200a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e200a.dat right +[ 14, 33 ] = ascii (fp) : "./hrtfs/elev-20/L-20e195a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e195a.dat right +[ 14, 34 ] = ascii (fp) : "./hrtfs/elev-20/L-20e190a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e190a.dat right +[ 14, 35 ] = ascii (fp) : "./hrtfs/elev-20/L-20e185a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e185a.dat right +[ 14, 36 ] = ascii (fp) : "./hrtfs/elev-20/L-20e180a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e180a.dat right +[ 14, 37 ] = ascii (fp) : "./hrtfs/elev-20/L-20e175a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e175a.dat right +[ 14, 38 ] = ascii (fp) : "./hrtfs/elev-20/L-20e170a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e170a.dat right +[ 14, 39 ] = ascii (fp) : "./hrtfs/elev-20/L-20e165a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e165a.dat right +[ 14, 40 ] = ascii (fp) : "./hrtfs/elev-20/L-20e160a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e160a.dat right +[ 14, 41 ] = ascii (fp) : "./hrtfs/elev-20/L-20e155a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e155a.dat right +[ 14, 42 ] = ascii (fp) : "./hrtfs/elev-20/L-20e150a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e150a.dat right +[ 14, 43 ] = ascii (fp) : "./hrtfs/elev-20/L-20e145a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e145a.dat right +[ 14, 44 ] = ascii (fp) : "./hrtfs/elev-20/L-20e140a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e140a.dat right +[ 14, 45 ] = ascii (fp) : "./hrtfs/elev-20/L-20e135a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e135a.dat right +[ 14, 46 ] = ascii (fp) : "./hrtfs/elev-20/L-20e130a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e130a.dat right +[ 14, 47 ] = ascii (fp) : "./hrtfs/elev-20/L-20e125a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e125a.dat right +[ 14, 48 ] = ascii (fp) : "./hrtfs/elev-20/L-20e120a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e120a.dat right +[ 14, 49 ] = ascii (fp) : "./hrtfs/elev-20/L-20e115a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e115a.dat right +[ 14, 50 ] = ascii (fp) : "./hrtfs/elev-20/L-20e110a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e110a.dat right +[ 14, 51 ] = ascii (fp) : "./hrtfs/elev-20/L-20e105a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e105a.dat right +[ 14, 52 ] = ascii (fp) : "./hrtfs/elev-20/L-20e100a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e100a.dat right +[ 14, 53 ] = ascii (fp) : "./hrtfs/elev-20/L-20e095a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e095a.dat right +[ 14, 54 ] = ascii (fp) : "./hrtfs/elev-20/L-20e090a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e090a.dat right +[ 14, 55 ] = ascii (fp) : "./hrtfs/elev-20/L-20e085a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e085a.dat right +[ 14, 56 ] = ascii (fp) : "./hrtfs/elev-20/L-20e080a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e080a.dat right +[ 14, 57 ] = ascii (fp) : "./hrtfs/elev-20/L-20e075a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e075a.dat right +[ 14, 58 ] = ascii (fp) : "./hrtfs/elev-20/L-20e070a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e070a.dat right +[ 14, 59 ] = ascii (fp) : "./hrtfs/elev-20/L-20e065a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e065a.dat right +[ 14, 60 ] = ascii (fp) : "./hrtfs/elev-20/L-20e060a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e060a.dat right +[ 14, 61 ] = ascii (fp) : "./hrtfs/elev-20/L-20e055a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e055a.dat right +[ 14, 62 ] = ascii (fp) : "./hrtfs/elev-20/L-20e050a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e050a.dat right +[ 14, 63 ] = ascii (fp) : "./hrtfs/elev-20/L-20e045a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e045a.dat right +[ 14, 64 ] = ascii (fp) : "./hrtfs/elev-20/L-20e040a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e040a.dat right +[ 14, 65 ] = ascii (fp) : "./hrtfs/elev-20/L-20e035a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e035a.dat right +[ 14, 66 ] = ascii (fp) : "./hrtfs/elev-20/L-20e030a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e030a.dat right +[ 14, 67 ] = ascii (fp) : "./hrtfs/elev-20/L-20e025a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e025a.dat right +[ 14, 68 ] = ascii (fp) : "./hrtfs/elev-20/L-20e020a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e020a.dat right +[ 14, 69 ] = ascii (fp) : "./hrtfs/elev-20/L-20e015a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e015a.dat right +[ 14, 70 ] = ascii (fp) : "./hrtfs/elev-20/L-20e010a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e010a.dat right +[ 14, 71 ] = ascii (fp) : "./hrtfs/elev-20/L-20e005a.dat left + + ascii (fp) : "./hrtfs/elev-20/R-20e005a.dat right + +[ 15, 0 ] = ascii (fp) : "./hrtfs/elev-15/L-15e000a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e000a.dat right +[ 15, 1 ] = ascii (fp) : "./hrtfs/elev-15/L-15e355a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e355a.dat right +[ 15, 2 ] = ascii (fp) : "./hrtfs/elev-15/L-15e350a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e350a.dat right +[ 15, 3 ] = ascii (fp) : "./hrtfs/elev-15/L-15e345a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e345a.dat right +[ 15, 4 ] = ascii (fp) : "./hrtfs/elev-15/L-15e340a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e340a.dat right +[ 15, 5 ] = ascii (fp) : "./hrtfs/elev-15/L-15e335a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e335a.dat right +[ 15, 6 ] = ascii (fp) : "./hrtfs/elev-15/L-15e330a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e330a.dat right +[ 15, 7 ] = ascii (fp) : "./hrtfs/elev-15/L-15e325a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e325a.dat right +[ 15, 8 ] = ascii (fp) : "./hrtfs/elev-15/L-15e320a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e320a.dat right +[ 15, 9 ] = ascii (fp) : "./hrtfs/elev-15/L-15e315a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e315a.dat right +[ 15, 10 ] = ascii (fp) : "./hrtfs/elev-15/L-15e310a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e310a.dat right +[ 15, 11 ] = ascii (fp) : "./hrtfs/elev-15/L-15e305a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e305a.dat right +[ 15, 12 ] = ascii (fp) : "./hrtfs/elev-15/L-15e300a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e300a.dat right +[ 15, 13 ] = ascii (fp) : "./hrtfs/elev-15/L-15e295a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e295a.dat right +[ 15, 14 ] = ascii (fp) : "./hrtfs/elev-15/L-15e290a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e290a.dat right +[ 15, 15 ] = ascii (fp) : "./hrtfs/elev-15/L-15e285a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e285a.dat right +[ 15, 16 ] = ascii (fp) : "./hrtfs/elev-15/L-15e280a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e280a.dat right +[ 15, 17 ] = ascii (fp) : "./hrtfs/elev-15/L-15e275a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e275a.dat right +[ 15, 18 ] = ascii (fp) : "./hrtfs/elev-15/L-15e270a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e270a.dat right +[ 15, 19 ] = ascii (fp) : "./hrtfs/elev-15/L-15e265a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e265a.dat right +[ 15, 20 ] = ascii (fp) : "./hrtfs/elev-15/L-15e260a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e260a.dat right +[ 15, 21 ] = ascii (fp) : "./hrtfs/elev-15/L-15e255a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e255a.dat right +[ 15, 22 ] = ascii (fp) : "./hrtfs/elev-15/L-15e250a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e250a.dat right +[ 15, 23 ] = ascii (fp) : "./hrtfs/elev-15/L-15e245a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e245a.dat right +[ 15, 24 ] = ascii (fp) : "./hrtfs/elev-15/L-15e240a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e240a.dat right +[ 15, 25 ] = ascii (fp) : "./hrtfs/elev-15/L-15e235a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e235a.dat right +[ 15, 26 ] = ascii (fp) : "./hrtfs/elev-15/L-15e230a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e230a.dat right +[ 15, 27 ] = ascii (fp) : "./hrtfs/elev-15/L-15e225a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e225a.dat right +[ 15, 28 ] = ascii (fp) : "./hrtfs/elev-15/L-15e220a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e220a.dat right +[ 15, 29 ] = ascii (fp) : "./hrtfs/elev-15/L-15e215a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e215a.dat right +[ 15, 30 ] = ascii (fp) : "./hrtfs/elev-15/L-15e210a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e210a.dat right +[ 15, 31 ] = ascii (fp) : "./hrtfs/elev-15/L-15e205a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e205a.dat right +[ 15, 32 ] = ascii (fp) : "./hrtfs/elev-15/L-15e200a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e200a.dat right +[ 15, 33 ] = ascii (fp) : "./hrtfs/elev-15/L-15e195a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e195a.dat right +[ 15, 34 ] = ascii (fp) : "./hrtfs/elev-15/L-15e190a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e190a.dat right +[ 15, 35 ] = ascii (fp) : "./hrtfs/elev-15/L-15e185a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e185a.dat right +[ 15, 36 ] = ascii (fp) : "./hrtfs/elev-15/L-15e180a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e180a.dat right +[ 15, 37 ] = ascii (fp) : "./hrtfs/elev-15/L-15e175a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e175a.dat right +[ 15, 38 ] = ascii (fp) : "./hrtfs/elev-15/L-15e170a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e170a.dat right +[ 15, 39 ] = ascii (fp) : "./hrtfs/elev-15/L-15e165a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e165a.dat right +[ 15, 40 ] = ascii (fp) : "./hrtfs/elev-15/L-15e160a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e160a.dat right +[ 15, 41 ] = ascii (fp) : "./hrtfs/elev-15/L-15e155a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e155a.dat right +[ 15, 42 ] = ascii (fp) : "./hrtfs/elev-15/L-15e150a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e150a.dat right +[ 15, 43 ] = ascii (fp) : "./hrtfs/elev-15/L-15e145a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e145a.dat right +[ 15, 44 ] = ascii (fp) : "./hrtfs/elev-15/L-15e140a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e140a.dat right +[ 15, 45 ] = ascii (fp) : "./hrtfs/elev-15/L-15e135a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e135a.dat right +[ 15, 46 ] = ascii (fp) : "./hrtfs/elev-15/L-15e130a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e130a.dat right +[ 15, 47 ] = ascii (fp) : "./hrtfs/elev-15/L-15e125a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e125a.dat right +[ 15, 48 ] = ascii (fp) : "./hrtfs/elev-15/L-15e120a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e120a.dat right +[ 15, 49 ] = ascii (fp) : "./hrtfs/elev-15/L-15e115a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e115a.dat right +[ 15, 50 ] = ascii (fp) : "./hrtfs/elev-15/L-15e110a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e110a.dat right +[ 15, 51 ] = ascii (fp) : "./hrtfs/elev-15/L-15e105a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e105a.dat right +[ 15, 52 ] = ascii (fp) : "./hrtfs/elev-15/L-15e100a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e100a.dat right +[ 15, 53 ] = ascii (fp) : "./hrtfs/elev-15/L-15e095a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e095a.dat right +[ 15, 54 ] = ascii (fp) : "./hrtfs/elev-15/L-15e090a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e090a.dat right +[ 15, 55 ] = ascii (fp) : "./hrtfs/elev-15/L-15e085a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e085a.dat right +[ 15, 56 ] = ascii (fp) : "./hrtfs/elev-15/L-15e080a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e080a.dat right +[ 15, 57 ] = ascii (fp) : "./hrtfs/elev-15/L-15e075a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e075a.dat right +[ 15, 58 ] = ascii (fp) : "./hrtfs/elev-15/L-15e070a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e070a.dat right +[ 15, 59 ] = ascii (fp) : "./hrtfs/elev-15/L-15e065a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e065a.dat right +[ 15, 60 ] = ascii (fp) : "./hrtfs/elev-15/L-15e060a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e060a.dat right +[ 15, 61 ] = ascii (fp) : "./hrtfs/elev-15/L-15e055a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e055a.dat right +[ 15, 62 ] = ascii (fp) : "./hrtfs/elev-15/L-15e050a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e050a.dat right +[ 15, 63 ] = ascii (fp) : "./hrtfs/elev-15/L-15e045a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e045a.dat right +[ 15, 64 ] = ascii (fp) : "./hrtfs/elev-15/L-15e040a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e040a.dat right +[ 15, 65 ] = ascii (fp) : "./hrtfs/elev-15/L-15e035a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e035a.dat right +[ 15, 66 ] = ascii (fp) : "./hrtfs/elev-15/L-15e030a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e030a.dat right +[ 15, 67 ] = ascii (fp) : "./hrtfs/elev-15/L-15e025a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e025a.dat right +[ 15, 68 ] = ascii (fp) : "./hrtfs/elev-15/L-15e020a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e020a.dat right +[ 15, 69 ] = ascii (fp) : "./hrtfs/elev-15/L-15e015a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e015a.dat right +[ 15, 70 ] = ascii (fp) : "./hrtfs/elev-15/L-15e010a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e010a.dat right +[ 15, 71 ] = ascii (fp) : "./hrtfs/elev-15/L-15e005a.dat left + + ascii (fp) : "./hrtfs/elev-15/R-15e005a.dat right + +[ 16, 0 ] = ascii (fp) : "./hrtfs/elev-10/L-10e000a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e000a.dat right +[ 16, 1 ] = ascii (fp) : "./hrtfs/elev-10/L-10e355a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e355a.dat right +[ 16, 2 ] = ascii (fp) : "./hrtfs/elev-10/L-10e350a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e350a.dat right +[ 16, 3 ] = ascii (fp) : "./hrtfs/elev-10/L-10e345a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e345a.dat right +[ 16, 4 ] = ascii (fp) : "./hrtfs/elev-10/L-10e340a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e340a.dat right +[ 16, 5 ] = ascii (fp) : "./hrtfs/elev-10/L-10e335a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e335a.dat right +[ 16, 6 ] = ascii (fp) : "./hrtfs/elev-10/L-10e330a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e330a.dat right +[ 16, 7 ] = ascii (fp) : "./hrtfs/elev-10/L-10e325a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e325a.dat right +[ 16, 8 ] = ascii (fp) : "./hrtfs/elev-10/L-10e320a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e320a.dat right +[ 16, 9 ] = ascii (fp) : "./hrtfs/elev-10/L-10e315a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e315a.dat right +[ 16, 10 ] = ascii (fp) : "./hrtfs/elev-10/L-10e310a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e310a.dat right +[ 16, 11 ] = ascii (fp) : "./hrtfs/elev-10/L-10e305a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e305a.dat right +[ 16, 12 ] = ascii (fp) : "./hrtfs/elev-10/L-10e300a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e300a.dat right +[ 16, 13 ] = ascii (fp) : "./hrtfs/elev-10/L-10e295a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e295a.dat right +[ 16, 14 ] = ascii (fp) : "./hrtfs/elev-10/L-10e290a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e290a.dat right +[ 16, 15 ] = ascii (fp) : "./hrtfs/elev-10/L-10e285a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e285a.dat right +[ 16, 16 ] = ascii (fp) : "./hrtfs/elev-10/L-10e280a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e280a.dat right +[ 16, 17 ] = ascii (fp) : "./hrtfs/elev-10/L-10e275a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e275a.dat right +[ 16, 18 ] = ascii (fp) : "./hrtfs/elev-10/L-10e270a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e270a.dat right +[ 16, 19 ] = ascii (fp) : "./hrtfs/elev-10/L-10e265a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e265a.dat right +[ 16, 20 ] = ascii (fp) : "./hrtfs/elev-10/L-10e260a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e260a.dat right +[ 16, 21 ] = ascii (fp) : "./hrtfs/elev-10/L-10e255a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e255a.dat right +[ 16, 22 ] = ascii (fp) : "./hrtfs/elev-10/L-10e250a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e250a.dat right +[ 16, 23 ] = ascii (fp) : "./hrtfs/elev-10/L-10e245a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e245a.dat right +[ 16, 24 ] = ascii (fp) : "./hrtfs/elev-10/L-10e240a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e240a.dat right +[ 16, 25 ] = ascii (fp) : "./hrtfs/elev-10/L-10e235a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e235a.dat right +[ 16, 26 ] = ascii (fp) : "./hrtfs/elev-10/L-10e230a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e230a.dat right +[ 16, 27 ] = ascii (fp) : "./hrtfs/elev-10/L-10e225a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e225a.dat right +[ 16, 28 ] = ascii (fp) : "./hrtfs/elev-10/L-10e220a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e220a.dat right +[ 16, 29 ] = ascii (fp) : "./hrtfs/elev-10/L-10e215a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e215a.dat right +[ 16, 30 ] = ascii (fp) : "./hrtfs/elev-10/L-10e210a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e210a.dat right +[ 16, 31 ] = ascii (fp) : "./hrtfs/elev-10/L-10e205a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e205a.dat right +[ 16, 32 ] = ascii (fp) : "./hrtfs/elev-10/L-10e200a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e200a.dat right +[ 16, 33 ] = ascii (fp) : "./hrtfs/elev-10/L-10e195a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e195a.dat right +[ 16, 34 ] = ascii (fp) : "./hrtfs/elev-10/L-10e190a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e190a.dat right +[ 16, 35 ] = ascii (fp) : "./hrtfs/elev-10/L-10e185a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e185a.dat right +[ 16, 36 ] = ascii (fp) : "./hrtfs/elev-10/L-10e180a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e180a.dat right +[ 16, 37 ] = ascii (fp) : "./hrtfs/elev-10/L-10e175a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e175a.dat right +[ 16, 38 ] = ascii (fp) : "./hrtfs/elev-10/L-10e170a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e170a.dat right +[ 16, 39 ] = ascii (fp) : "./hrtfs/elev-10/L-10e165a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e165a.dat right +[ 16, 40 ] = ascii (fp) : "./hrtfs/elev-10/L-10e160a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e160a.dat right +[ 16, 41 ] = ascii (fp) : "./hrtfs/elev-10/L-10e155a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e155a.dat right +[ 16, 42 ] = ascii (fp) : "./hrtfs/elev-10/L-10e150a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e150a.dat right +[ 16, 43 ] = ascii (fp) : "./hrtfs/elev-10/L-10e145a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e145a.dat right +[ 16, 44 ] = ascii (fp) : "./hrtfs/elev-10/L-10e140a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e140a.dat right +[ 16, 45 ] = ascii (fp) : "./hrtfs/elev-10/L-10e135a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e135a.dat right +[ 16, 46 ] = ascii (fp) : "./hrtfs/elev-10/L-10e130a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e130a.dat right +[ 16, 47 ] = ascii (fp) : "./hrtfs/elev-10/L-10e125a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e125a.dat right +[ 16, 48 ] = ascii (fp) : "./hrtfs/elev-10/L-10e120a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e120a.dat right +[ 16, 49 ] = ascii (fp) : "./hrtfs/elev-10/L-10e115a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e115a.dat right +[ 16, 50 ] = ascii (fp) : "./hrtfs/elev-10/L-10e110a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e110a.dat right +[ 16, 51 ] = ascii (fp) : "./hrtfs/elev-10/L-10e105a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e105a.dat right +[ 16, 52 ] = ascii (fp) : "./hrtfs/elev-10/L-10e100a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e100a.dat right +[ 16, 53 ] = ascii (fp) : "./hrtfs/elev-10/L-10e095a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e095a.dat right +[ 16, 54 ] = ascii (fp) : "./hrtfs/elev-10/L-10e090a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e090a.dat right +[ 16, 55 ] = ascii (fp) : "./hrtfs/elev-10/L-10e085a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e085a.dat right +[ 16, 56 ] = ascii (fp) : "./hrtfs/elev-10/L-10e080a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e080a.dat right +[ 16, 57 ] = ascii (fp) : "./hrtfs/elev-10/L-10e075a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e075a.dat right +[ 16, 58 ] = ascii (fp) : "./hrtfs/elev-10/L-10e070a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e070a.dat right +[ 16, 59 ] = ascii (fp) : "./hrtfs/elev-10/L-10e065a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e065a.dat right +[ 16, 60 ] = ascii (fp) : "./hrtfs/elev-10/L-10e060a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e060a.dat right +[ 16, 61 ] = ascii (fp) : "./hrtfs/elev-10/L-10e055a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e055a.dat right +[ 16, 62 ] = ascii (fp) : "./hrtfs/elev-10/L-10e050a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e050a.dat right +[ 16, 63 ] = ascii (fp) : "./hrtfs/elev-10/L-10e045a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e045a.dat right +[ 16, 64 ] = ascii (fp) : "./hrtfs/elev-10/L-10e040a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e040a.dat right +[ 16, 65 ] = ascii (fp) : "./hrtfs/elev-10/L-10e035a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e035a.dat right +[ 16, 66 ] = ascii (fp) : "./hrtfs/elev-10/L-10e030a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e030a.dat right +[ 16, 67 ] = ascii (fp) : "./hrtfs/elev-10/L-10e025a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e025a.dat right +[ 16, 68 ] = ascii (fp) : "./hrtfs/elev-10/L-10e020a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e020a.dat right +[ 16, 69 ] = ascii (fp) : "./hrtfs/elev-10/L-10e015a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e015a.dat right +[ 16, 70 ] = ascii (fp) : "./hrtfs/elev-10/L-10e010a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e010a.dat right +[ 16, 71 ] = ascii (fp) : "./hrtfs/elev-10/L-10e005a.dat left + + ascii (fp) : "./hrtfs/elev-10/R-10e005a.dat right + +[ 17, 0 ] = ascii (fp) : "./hrtfs/elev-5/L-5e000a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e000a.dat right +[ 17, 1 ] = ascii (fp) : "./hrtfs/elev-5/L-5e355a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e355a.dat right +[ 17, 2 ] = ascii (fp) : "./hrtfs/elev-5/L-5e350a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e350a.dat right +[ 17, 3 ] = ascii (fp) : "./hrtfs/elev-5/L-5e345a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e345a.dat right +[ 17, 4 ] = ascii (fp) : "./hrtfs/elev-5/L-5e340a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e340a.dat right +[ 17, 5 ] = ascii (fp) : "./hrtfs/elev-5/L-5e335a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e335a.dat right +[ 17, 6 ] = ascii (fp) : "./hrtfs/elev-5/L-5e330a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e330a.dat right +[ 17, 7 ] = ascii (fp) : "./hrtfs/elev-5/L-5e325a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e325a.dat right +[ 17, 8 ] = ascii (fp) : "./hrtfs/elev-5/L-5e320a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e320a.dat right +[ 17, 9 ] = ascii (fp) : "./hrtfs/elev-5/L-5e315a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e315a.dat right +[ 17, 10 ] = ascii (fp) : "./hrtfs/elev-5/L-5e310a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e310a.dat right +[ 17, 11 ] = ascii (fp) : "./hrtfs/elev-5/L-5e305a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e305a.dat right +[ 17, 12 ] = ascii (fp) : "./hrtfs/elev-5/L-5e300a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e300a.dat right +[ 17, 13 ] = ascii (fp) : "./hrtfs/elev-5/L-5e295a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e295a.dat right +[ 17, 14 ] = ascii (fp) : "./hrtfs/elev-5/L-5e290a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e290a.dat right +[ 17, 15 ] = ascii (fp) : "./hrtfs/elev-5/L-5e285a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e285a.dat right +[ 17, 16 ] = ascii (fp) : "./hrtfs/elev-5/L-5e280a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e280a.dat right +[ 17, 17 ] = ascii (fp) : "./hrtfs/elev-5/L-5e275a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e275a.dat right +[ 17, 18 ] = ascii (fp) : "./hrtfs/elev-5/L-5e270a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e270a.dat right +[ 17, 19 ] = ascii (fp) : "./hrtfs/elev-5/L-5e265a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e265a.dat right +[ 17, 20 ] = ascii (fp) : "./hrtfs/elev-5/L-5e260a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e260a.dat right +[ 17, 21 ] = ascii (fp) : "./hrtfs/elev-5/L-5e255a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e255a.dat right +[ 17, 22 ] = ascii (fp) : "./hrtfs/elev-5/L-5e250a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e250a.dat right +[ 17, 23 ] = ascii (fp) : "./hrtfs/elev-5/L-5e245a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e245a.dat right +[ 17, 24 ] = ascii (fp) : "./hrtfs/elev-5/L-5e240a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e240a.dat right +[ 17, 25 ] = ascii (fp) : "./hrtfs/elev-5/L-5e235a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e235a.dat right +[ 17, 26 ] = ascii (fp) : "./hrtfs/elev-5/L-5e230a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e230a.dat right +[ 17, 27 ] = ascii (fp) : "./hrtfs/elev-5/L-5e225a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e225a.dat right +[ 17, 28 ] = ascii (fp) : "./hrtfs/elev-5/L-5e220a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e220a.dat right +[ 17, 29 ] = ascii (fp) : "./hrtfs/elev-5/L-5e215a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e215a.dat right +[ 17, 30 ] = ascii (fp) : "./hrtfs/elev-5/L-5e210a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e210a.dat right +[ 17, 31 ] = ascii (fp) : "./hrtfs/elev-5/L-5e205a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e205a.dat right +[ 17, 32 ] = ascii (fp) : "./hrtfs/elev-5/L-5e200a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e200a.dat right +[ 17, 33 ] = ascii (fp) : "./hrtfs/elev-5/L-5e195a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e195a.dat right +[ 17, 34 ] = ascii (fp) : "./hrtfs/elev-5/L-5e190a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e190a.dat right +[ 17, 35 ] = ascii (fp) : "./hrtfs/elev-5/L-5e185a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e185a.dat right +[ 17, 36 ] = ascii (fp) : "./hrtfs/elev-5/L-5e180a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e180a.dat right +[ 17, 37 ] = ascii (fp) : "./hrtfs/elev-5/L-5e175a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e175a.dat right +[ 17, 38 ] = ascii (fp) : "./hrtfs/elev-5/L-5e170a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e170a.dat right +[ 17, 39 ] = ascii (fp) : "./hrtfs/elev-5/L-5e165a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e165a.dat right +[ 17, 40 ] = ascii (fp) : "./hrtfs/elev-5/L-5e160a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e160a.dat right +[ 17, 41 ] = ascii (fp) : "./hrtfs/elev-5/L-5e155a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e155a.dat right +[ 17, 42 ] = ascii (fp) : "./hrtfs/elev-5/L-5e150a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e150a.dat right +[ 17, 43 ] = ascii (fp) : "./hrtfs/elev-5/L-5e145a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e145a.dat right +[ 17, 44 ] = ascii (fp) : "./hrtfs/elev-5/L-5e140a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e140a.dat right +[ 17, 45 ] = ascii (fp) : "./hrtfs/elev-5/L-5e135a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e135a.dat right +[ 17, 46 ] = ascii (fp) : "./hrtfs/elev-5/L-5e130a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e130a.dat right +[ 17, 47 ] = ascii (fp) : "./hrtfs/elev-5/L-5e125a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e125a.dat right +[ 17, 48 ] = ascii (fp) : "./hrtfs/elev-5/L-5e120a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e120a.dat right +[ 17, 49 ] = ascii (fp) : "./hrtfs/elev-5/L-5e115a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e115a.dat right +[ 17, 50 ] = ascii (fp) : "./hrtfs/elev-5/L-5e110a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e110a.dat right +[ 17, 51 ] = ascii (fp) : "./hrtfs/elev-5/L-5e105a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e105a.dat right +[ 17, 52 ] = ascii (fp) : "./hrtfs/elev-5/L-5e100a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e100a.dat right +[ 17, 53 ] = ascii (fp) : "./hrtfs/elev-5/L-5e095a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e095a.dat right +[ 17, 54 ] = ascii (fp) : "./hrtfs/elev-5/L-5e090a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e090a.dat right +[ 17, 55 ] = ascii (fp) : "./hrtfs/elev-5/L-5e085a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e085a.dat right +[ 17, 56 ] = ascii (fp) : "./hrtfs/elev-5/L-5e080a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e080a.dat right +[ 17, 57 ] = ascii (fp) : "./hrtfs/elev-5/L-5e075a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e075a.dat right +[ 17, 58 ] = ascii (fp) : "./hrtfs/elev-5/L-5e070a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e070a.dat right +[ 17, 59 ] = ascii (fp) : "./hrtfs/elev-5/L-5e065a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e065a.dat right +[ 17, 60 ] = ascii (fp) : "./hrtfs/elev-5/L-5e060a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e060a.dat right +[ 17, 61 ] = ascii (fp) : "./hrtfs/elev-5/L-5e055a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e055a.dat right +[ 17, 62 ] = ascii (fp) : "./hrtfs/elev-5/L-5e050a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e050a.dat right +[ 17, 63 ] = ascii (fp) : "./hrtfs/elev-5/L-5e045a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e045a.dat right +[ 17, 64 ] = ascii (fp) : "./hrtfs/elev-5/L-5e040a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e040a.dat right +[ 17, 65 ] = ascii (fp) : "./hrtfs/elev-5/L-5e035a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e035a.dat right +[ 17, 66 ] = ascii (fp) : "./hrtfs/elev-5/L-5e030a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e030a.dat right +[ 17, 67 ] = ascii (fp) : "./hrtfs/elev-5/L-5e025a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e025a.dat right +[ 17, 68 ] = ascii (fp) : "./hrtfs/elev-5/L-5e020a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e020a.dat right +[ 17, 69 ] = ascii (fp) : "./hrtfs/elev-5/L-5e015a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e015a.dat right +[ 17, 70 ] = ascii (fp) : "./hrtfs/elev-5/L-5e010a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e010a.dat right +[ 17, 71 ] = ascii (fp) : "./hrtfs/elev-5/L-5e005a.dat left + + ascii (fp) : "./hrtfs/elev-5/R-5e005a.dat right + +[ 18, 0 ] = ascii (fp) : "./hrtfs/elev0/L0e000a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e000a.dat right +[ 18, 1 ] = ascii (fp) : "./hrtfs/elev0/L0e355a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e355a.dat right +[ 18, 2 ] = ascii (fp) : "./hrtfs/elev0/L0e350a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e350a.dat right +[ 18, 3 ] = ascii (fp) : "./hrtfs/elev0/L0e345a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e345a.dat right +[ 18, 4 ] = ascii (fp) : "./hrtfs/elev0/L0e340a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e340a.dat right +[ 18, 5 ] = ascii (fp) : "./hrtfs/elev0/L0e335a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e335a.dat right +[ 18, 6 ] = ascii (fp) : "./hrtfs/elev0/L0e330a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e330a.dat right +[ 18, 7 ] = ascii (fp) : "./hrtfs/elev0/L0e325a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e325a.dat right +[ 18, 8 ] = ascii (fp) : "./hrtfs/elev0/L0e320a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e320a.dat right +[ 18, 9 ] = ascii (fp) : "./hrtfs/elev0/L0e315a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e315a.dat right +[ 18, 10 ] = ascii (fp) : "./hrtfs/elev0/L0e310a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e310a.dat right +[ 18, 11 ] = ascii (fp) : "./hrtfs/elev0/L0e305a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e305a.dat right +[ 18, 12 ] = ascii (fp) : "./hrtfs/elev0/L0e300a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e300a.dat right +[ 18, 13 ] = ascii (fp) : "./hrtfs/elev0/L0e295a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e295a.dat right +[ 18, 14 ] = ascii (fp) : "./hrtfs/elev0/L0e290a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e290a.dat right +[ 18, 15 ] = ascii (fp) : "./hrtfs/elev0/L0e285a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e285a.dat right +[ 18, 16 ] = ascii (fp) : "./hrtfs/elev0/L0e280a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e280a.dat right +[ 18, 17 ] = ascii (fp) : "./hrtfs/elev0/L0e275a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e275a.dat right +[ 18, 18 ] = ascii (fp) : "./hrtfs/elev0/L0e270a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e270a.dat right +[ 18, 19 ] = ascii (fp) : "./hrtfs/elev0/L0e265a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e265a.dat right +[ 18, 20 ] = ascii (fp) : "./hrtfs/elev0/L0e260a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e260a.dat right +[ 18, 21 ] = ascii (fp) : "./hrtfs/elev0/L0e255a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e255a.dat right +[ 18, 22 ] = ascii (fp) : "./hrtfs/elev0/L0e250a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e250a.dat right +[ 18, 23 ] = ascii (fp) : "./hrtfs/elev0/L0e245a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e245a.dat right +[ 18, 24 ] = ascii (fp) : "./hrtfs/elev0/L0e240a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e240a.dat right +[ 18, 25 ] = ascii (fp) : "./hrtfs/elev0/L0e235a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e235a.dat right +[ 18, 26 ] = ascii (fp) : "./hrtfs/elev0/L0e230a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e230a.dat right +[ 18, 27 ] = ascii (fp) : "./hrtfs/elev0/L0e225a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e225a.dat right +[ 18, 28 ] = ascii (fp) : "./hrtfs/elev0/L0e220a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e220a.dat right +[ 18, 29 ] = ascii (fp) : "./hrtfs/elev0/L0e215a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e215a.dat right +[ 18, 30 ] = ascii (fp) : "./hrtfs/elev0/L0e210a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e210a.dat right +[ 18, 31 ] = ascii (fp) : "./hrtfs/elev0/L0e205a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e205a.dat right +[ 18, 32 ] = ascii (fp) : "./hrtfs/elev0/L0e200a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e200a.dat right +[ 18, 33 ] = ascii (fp) : "./hrtfs/elev0/L0e195a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e195a.dat right +[ 18, 34 ] = ascii (fp) : "./hrtfs/elev0/L0e190a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e190a.dat right +[ 18, 35 ] = ascii (fp) : "./hrtfs/elev0/L0e185a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e185a.dat right +[ 18, 36 ] = ascii (fp) : "./hrtfs/elev0/L0e180a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e180a.dat right +[ 18, 37 ] = ascii (fp) : "./hrtfs/elev0/L0e175a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e175a.dat right +[ 18, 38 ] = ascii (fp) : "./hrtfs/elev0/L0e170a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e170a.dat right +[ 18, 39 ] = ascii (fp) : "./hrtfs/elev0/L0e165a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e165a.dat right +[ 18, 40 ] = ascii (fp) : "./hrtfs/elev0/L0e160a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e160a.dat right +[ 18, 41 ] = ascii (fp) : "./hrtfs/elev0/L0e155a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e155a.dat right +[ 18, 42 ] = ascii (fp) : "./hrtfs/elev0/L0e150a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e150a.dat right +[ 18, 43 ] = ascii (fp) : "./hrtfs/elev0/L0e145a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e145a.dat right +[ 18, 44 ] = ascii (fp) : "./hrtfs/elev0/L0e140a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e140a.dat right +[ 18, 45 ] = ascii (fp) : "./hrtfs/elev0/L0e135a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e135a.dat right +[ 18, 46 ] = ascii (fp) : "./hrtfs/elev0/L0e130a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e130a.dat right +[ 18, 47 ] = ascii (fp) : "./hrtfs/elev0/L0e125a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e125a.dat right +[ 18, 48 ] = ascii (fp) : "./hrtfs/elev0/L0e120a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e120a.dat right +[ 18, 49 ] = ascii (fp) : "./hrtfs/elev0/L0e115a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e115a.dat right +[ 18, 50 ] = ascii (fp) : "./hrtfs/elev0/L0e110a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e110a.dat right +[ 18, 51 ] = ascii (fp) : "./hrtfs/elev0/L0e105a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e105a.dat right +[ 18, 52 ] = ascii (fp) : "./hrtfs/elev0/L0e100a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e100a.dat right +[ 18, 53 ] = ascii (fp) : "./hrtfs/elev0/L0e095a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e095a.dat right +[ 18, 54 ] = ascii (fp) : "./hrtfs/elev0/L0e090a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e090a.dat right +[ 18, 55 ] = ascii (fp) : "./hrtfs/elev0/L0e085a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e085a.dat right +[ 18, 56 ] = ascii (fp) : "./hrtfs/elev0/L0e080a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e080a.dat right +[ 18, 57 ] = ascii (fp) : "./hrtfs/elev0/L0e075a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e075a.dat right +[ 18, 58 ] = ascii (fp) : "./hrtfs/elev0/L0e070a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e070a.dat right +[ 18, 59 ] = ascii (fp) : "./hrtfs/elev0/L0e065a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e065a.dat right +[ 18, 60 ] = ascii (fp) : "./hrtfs/elev0/L0e060a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e060a.dat right +[ 18, 61 ] = ascii (fp) : "./hrtfs/elev0/L0e055a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e055a.dat right +[ 18, 62 ] = ascii (fp) : "./hrtfs/elev0/L0e050a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e050a.dat right +[ 18, 63 ] = ascii (fp) : "./hrtfs/elev0/L0e045a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e045a.dat right +[ 18, 64 ] = ascii (fp) : "./hrtfs/elev0/L0e040a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e040a.dat right +[ 18, 65 ] = ascii (fp) : "./hrtfs/elev0/L0e035a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e035a.dat right +[ 18, 66 ] = ascii (fp) : "./hrtfs/elev0/L0e030a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e030a.dat right +[ 18, 67 ] = ascii (fp) : "./hrtfs/elev0/L0e025a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e025a.dat right +[ 18, 68 ] = ascii (fp) : "./hrtfs/elev0/L0e020a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e020a.dat right +[ 18, 69 ] = ascii (fp) : "./hrtfs/elev0/L0e015a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e015a.dat right +[ 18, 70 ] = ascii (fp) : "./hrtfs/elev0/L0e010a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e010a.dat right +[ 18, 71 ] = ascii (fp) : "./hrtfs/elev0/L0e005a.dat left + + ascii (fp) : "./hrtfs/elev0/R0e005a.dat right + +[ 19, 0 ] = ascii (fp) : "./hrtfs/elev5/L5e000a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e000a.dat right +[ 19, 1 ] = ascii (fp) : "./hrtfs/elev5/L5e355a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e355a.dat right +[ 19, 2 ] = ascii (fp) : "./hrtfs/elev5/L5e350a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e350a.dat right +[ 19, 3 ] = ascii (fp) : "./hrtfs/elev5/L5e345a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e345a.dat right +[ 19, 4 ] = ascii (fp) : "./hrtfs/elev5/L5e340a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e340a.dat right +[ 19, 5 ] = ascii (fp) : "./hrtfs/elev5/L5e335a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e335a.dat right +[ 19, 6 ] = ascii (fp) : "./hrtfs/elev5/L5e330a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e330a.dat right +[ 19, 7 ] = ascii (fp) : "./hrtfs/elev5/L5e325a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e325a.dat right +[ 19, 8 ] = ascii (fp) : "./hrtfs/elev5/L5e320a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e320a.dat right +[ 19, 9 ] = ascii (fp) : "./hrtfs/elev5/L5e315a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e315a.dat right +[ 19, 10 ] = ascii (fp) : "./hrtfs/elev5/L5e310a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e310a.dat right +[ 19, 11 ] = ascii (fp) : "./hrtfs/elev5/L5e305a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e305a.dat right +[ 19, 12 ] = ascii (fp) : "./hrtfs/elev5/L5e300a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e300a.dat right +[ 19, 13 ] = ascii (fp) : "./hrtfs/elev5/L5e295a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e295a.dat right +[ 19, 14 ] = ascii (fp) : "./hrtfs/elev5/L5e290a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e290a.dat right +[ 19, 15 ] = ascii (fp) : "./hrtfs/elev5/L5e285a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e285a.dat right +[ 19, 16 ] = ascii (fp) : "./hrtfs/elev5/L5e280a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e280a.dat right +[ 19, 17 ] = ascii (fp) : "./hrtfs/elev5/L5e275a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e275a.dat right +[ 19, 18 ] = ascii (fp) : "./hrtfs/elev5/L5e270a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e270a.dat right +[ 19, 19 ] = ascii (fp) : "./hrtfs/elev5/L5e265a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e265a.dat right +[ 19, 20 ] = ascii (fp) : "./hrtfs/elev5/L5e260a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e260a.dat right +[ 19, 21 ] = ascii (fp) : "./hrtfs/elev5/L5e255a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e255a.dat right +[ 19, 22 ] = ascii (fp) : "./hrtfs/elev5/L5e250a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e250a.dat right +[ 19, 23 ] = ascii (fp) : "./hrtfs/elev5/L5e245a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e245a.dat right +[ 19, 24 ] = ascii (fp) : "./hrtfs/elev5/L5e240a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e240a.dat right +[ 19, 25 ] = ascii (fp) : "./hrtfs/elev5/L5e235a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e235a.dat right +[ 19, 26 ] = ascii (fp) : "./hrtfs/elev5/L5e230a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e230a.dat right +[ 19, 27 ] = ascii (fp) : "./hrtfs/elev5/L5e225a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e225a.dat right +[ 19, 28 ] = ascii (fp) : "./hrtfs/elev5/L5e220a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e220a.dat right +[ 19, 29 ] = ascii (fp) : "./hrtfs/elev5/L5e215a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e215a.dat right +[ 19, 30 ] = ascii (fp) : "./hrtfs/elev5/L5e210a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e210a.dat right +[ 19, 31 ] = ascii (fp) : "./hrtfs/elev5/L5e205a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e205a.dat right +[ 19, 32 ] = ascii (fp) : "./hrtfs/elev5/L5e200a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e200a.dat right +[ 19, 33 ] = ascii (fp) : "./hrtfs/elev5/L5e195a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e195a.dat right +[ 19, 34 ] = ascii (fp) : "./hrtfs/elev5/L5e190a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e190a.dat right +[ 19, 35 ] = ascii (fp) : "./hrtfs/elev5/L5e185a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e185a.dat right +[ 19, 36 ] = ascii (fp) : "./hrtfs/elev5/L5e180a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e180a.dat right +[ 19, 37 ] = ascii (fp) : "./hrtfs/elev5/L5e175a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e175a.dat right +[ 19, 38 ] = ascii (fp) : "./hrtfs/elev5/L5e170a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e170a.dat right +[ 19, 39 ] = ascii (fp) : "./hrtfs/elev5/L5e165a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e165a.dat right +[ 19, 40 ] = ascii (fp) : "./hrtfs/elev5/L5e160a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e160a.dat right +[ 19, 41 ] = ascii (fp) : "./hrtfs/elev5/L5e155a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e155a.dat right +[ 19, 42 ] = ascii (fp) : "./hrtfs/elev5/L5e150a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e150a.dat right +[ 19, 43 ] = ascii (fp) : "./hrtfs/elev5/L5e145a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e145a.dat right +[ 19, 44 ] = ascii (fp) : "./hrtfs/elev5/L5e140a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e140a.dat right +[ 19, 45 ] = ascii (fp) : "./hrtfs/elev5/L5e135a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e135a.dat right +[ 19, 46 ] = ascii (fp) : "./hrtfs/elev5/L5e130a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e130a.dat right +[ 19, 47 ] = ascii (fp) : "./hrtfs/elev5/L5e125a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e125a.dat right +[ 19, 48 ] = ascii (fp) : "./hrtfs/elev5/L5e120a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e120a.dat right +[ 19, 49 ] = ascii (fp) : "./hrtfs/elev5/L5e115a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e115a.dat right +[ 19, 50 ] = ascii (fp) : "./hrtfs/elev5/L5e110a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e110a.dat right +[ 19, 51 ] = ascii (fp) : "./hrtfs/elev5/L5e105a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e105a.dat right +[ 19, 52 ] = ascii (fp) : "./hrtfs/elev5/L5e100a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e100a.dat right +[ 19, 53 ] = ascii (fp) : "./hrtfs/elev5/L5e095a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e095a.dat right +[ 19, 54 ] = ascii (fp) : "./hrtfs/elev5/L5e090a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e090a.dat right +[ 19, 55 ] = ascii (fp) : "./hrtfs/elev5/L5e085a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e085a.dat right +[ 19, 56 ] = ascii (fp) : "./hrtfs/elev5/L5e080a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e080a.dat right +[ 19, 57 ] = ascii (fp) : "./hrtfs/elev5/L5e075a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e075a.dat right +[ 19, 58 ] = ascii (fp) : "./hrtfs/elev5/L5e070a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e070a.dat right +[ 19, 59 ] = ascii (fp) : "./hrtfs/elev5/L5e065a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e065a.dat right +[ 19, 60 ] = ascii (fp) : "./hrtfs/elev5/L5e060a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e060a.dat right +[ 19, 61 ] = ascii (fp) : "./hrtfs/elev5/L5e055a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e055a.dat right +[ 19, 62 ] = ascii (fp) : "./hrtfs/elev5/L5e050a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e050a.dat right +[ 19, 63 ] = ascii (fp) : "./hrtfs/elev5/L5e045a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e045a.dat right +[ 19, 64 ] = ascii (fp) : "./hrtfs/elev5/L5e040a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e040a.dat right +[ 19, 65 ] = ascii (fp) : "./hrtfs/elev5/L5e035a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e035a.dat right +[ 19, 66 ] = ascii (fp) : "./hrtfs/elev5/L5e030a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e030a.dat right +[ 19, 67 ] = ascii (fp) : "./hrtfs/elev5/L5e025a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e025a.dat right +[ 19, 68 ] = ascii (fp) : "./hrtfs/elev5/L5e020a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e020a.dat right +[ 19, 69 ] = ascii (fp) : "./hrtfs/elev5/L5e015a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e015a.dat right +[ 19, 70 ] = ascii (fp) : "./hrtfs/elev5/L5e010a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e010a.dat right +[ 19, 71 ] = ascii (fp) : "./hrtfs/elev5/L5e005a.dat left + + ascii (fp) : "./hrtfs/elev5/R5e005a.dat right + +[ 20, 0 ] = ascii (fp) : "./hrtfs/elev10/L10e000a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e000a.dat right +[ 20, 1 ] = ascii (fp) : "./hrtfs/elev10/L10e355a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e355a.dat right +[ 20, 2 ] = ascii (fp) : "./hrtfs/elev10/L10e350a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e350a.dat right +[ 20, 3 ] = ascii (fp) : "./hrtfs/elev10/L10e345a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e345a.dat right +[ 20, 4 ] = ascii (fp) : "./hrtfs/elev10/L10e340a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e340a.dat right +[ 20, 5 ] = ascii (fp) : "./hrtfs/elev10/L10e335a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e335a.dat right +[ 20, 6 ] = ascii (fp) : "./hrtfs/elev10/L10e330a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e330a.dat right +[ 20, 7 ] = ascii (fp) : "./hrtfs/elev10/L10e325a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e325a.dat right +[ 20, 8 ] = ascii (fp) : "./hrtfs/elev10/L10e320a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e320a.dat right +[ 20, 9 ] = ascii (fp) : "./hrtfs/elev10/L10e315a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e315a.dat right +[ 20, 10 ] = ascii (fp) : "./hrtfs/elev10/L10e310a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e310a.dat right +[ 20, 11 ] = ascii (fp) : "./hrtfs/elev10/L10e305a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e305a.dat right +[ 20, 12 ] = ascii (fp) : "./hrtfs/elev10/L10e300a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e300a.dat right +[ 20, 13 ] = ascii (fp) : "./hrtfs/elev10/L10e295a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e295a.dat right +[ 20, 14 ] = ascii (fp) : "./hrtfs/elev10/L10e290a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e290a.dat right +[ 20, 15 ] = ascii (fp) : "./hrtfs/elev10/L10e285a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e285a.dat right +[ 20, 16 ] = ascii (fp) : "./hrtfs/elev10/L10e280a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e280a.dat right +[ 20, 17 ] = ascii (fp) : "./hrtfs/elev10/L10e275a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e275a.dat right +[ 20, 18 ] = ascii (fp) : "./hrtfs/elev10/L10e270a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e270a.dat right +[ 20, 19 ] = ascii (fp) : "./hrtfs/elev10/L10e265a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e265a.dat right +[ 20, 20 ] = ascii (fp) : "./hrtfs/elev10/L10e260a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e260a.dat right +[ 20, 21 ] = ascii (fp) : "./hrtfs/elev10/L10e255a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e255a.dat right +[ 20, 22 ] = ascii (fp) : "./hrtfs/elev10/L10e250a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e250a.dat right +[ 20, 23 ] = ascii (fp) : "./hrtfs/elev10/L10e245a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e245a.dat right +[ 20, 24 ] = ascii (fp) : "./hrtfs/elev10/L10e240a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e240a.dat right +[ 20, 25 ] = ascii (fp) : "./hrtfs/elev10/L10e235a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e235a.dat right +[ 20, 26 ] = ascii (fp) : "./hrtfs/elev10/L10e230a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e230a.dat right +[ 20, 27 ] = ascii (fp) : "./hrtfs/elev10/L10e225a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e225a.dat right +[ 20, 28 ] = ascii (fp) : "./hrtfs/elev10/L10e220a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e220a.dat right +[ 20, 29 ] = ascii (fp) : "./hrtfs/elev10/L10e215a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e215a.dat right +[ 20, 30 ] = ascii (fp) : "./hrtfs/elev10/L10e210a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e210a.dat right +[ 20, 31 ] = ascii (fp) : "./hrtfs/elev10/L10e205a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e205a.dat right +[ 20, 32 ] = ascii (fp) : "./hrtfs/elev10/L10e200a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e200a.dat right +[ 20, 33 ] = ascii (fp) : "./hrtfs/elev10/L10e195a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e195a.dat right +[ 20, 34 ] = ascii (fp) : "./hrtfs/elev10/L10e190a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e190a.dat right +[ 20, 35 ] = ascii (fp) : "./hrtfs/elev10/L10e185a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e185a.dat right +[ 20, 36 ] = ascii (fp) : "./hrtfs/elev10/L10e180a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e180a.dat right +[ 20, 37 ] = ascii (fp) : "./hrtfs/elev10/L10e175a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e175a.dat right +[ 20, 38 ] = ascii (fp) : "./hrtfs/elev10/L10e170a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e170a.dat right +[ 20, 39 ] = ascii (fp) : "./hrtfs/elev10/L10e165a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e165a.dat right +[ 20, 40 ] = ascii (fp) : "./hrtfs/elev10/L10e160a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e160a.dat right +[ 20, 41 ] = ascii (fp) : "./hrtfs/elev10/L10e155a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e155a.dat right +[ 20, 42 ] = ascii (fp) : "./hrtfs/elev10/L10e150a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e150a.dat right +[ 20, 43 ] = ascii (fp) : "./hrtfs/elev10/L10e145a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e145a.dat right +[ 20, 44 ] = ascii (fp) : "./hrtfs/elev10/L10e140a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e140a.dat right +[ 20, 45 ] = ascii (fp) : "./hrtfs/elev10/L10e135a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e135a.dat right +[ 20, 46 ] = ascii (fp) : "./hrtfs/elev10/L10e130a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e130a.dat right +[ 20, 47 ] = ascii (fp) : "./hrtfs/elev10/L10e125a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e125a.dat right +[ 20, 48 ] = ascii (fp) : "./hrtfs/elev10/L10e120a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e120a.dat right +[ 20, 49 ] = ascii (fp) : "./hrtfs/elev10/L10e115a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e115a.dat right +[ 20, 50 ] = ascii (fp) : "./hrtfs/elev10/L10e110a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e110a.dat right +[ 20, 51 ] = ascii (fp) : "./hrtfs/elev10/L10e105a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e105a.dat right +[ 20, 52 ] = ascii (fp) : "./hrtfs/elev10/L10e100a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e100a.dat right +[ 20, 53 ] = ascii (fp) : "./hrtfs/elev10/L10e095a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e095a.dat right +[ 20, 54 ] = ascii (fp) : "./hrtfs/elev10/L10e090a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e090a.dat right +[ 20, 55 ] = ascii (fp) : "./hrtfs/elev10/L10e085a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e085a.dat right +[ 20, 56 ] = ascii (fp) : "./hrtfs/elev10/L10e080a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e080a.dat right +[ 20, 57 ] = ascii (fp) : "./hrtfs/elev10/L10e075a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e075a.dat right +[ 20, 58 ] = ascii (fp) : "./hrtfs/elev10/L10e070a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e070a.dat right +[ 20, 59 ] = ascii (fp) : "./hrtfs/elev10/L10e065a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e065a.dat right +[ 20, 60 ] = ascii (fp) : "./hrtfs/elev10/L10e060a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e060a.dat right +[ 20, 61 ] = ascii (fp) : "./hrtfs/elev10/L10e055a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e055a.dat right +[ 20, 62 ] = ascii (fp) : "./hrtfs/elev10/L10e050a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e050a.dat right +[ 20, 63 ] = ascii (fp) : "./hrtfs/elev10/L10e045a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e045a.dat right +[ 20, 64 ] = ascii (fp) : "./hrtfs/elev10/L10e040a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e040a.dat right +[ 20, 65 ] = ascii (fp) : "./hrtfs/elev10/L10e035a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e035a.dat right +[ 20, 66 ] = ascii (fp) : "./hrtfs/elev10/L10e030a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e030a.dat right +[ 20, 67 ] = ascii (fp) : "./hrtfs/elev10/L10e025a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e025a.dat right +[ 20, 68 ] = ascii (fp) : "./hrtfs/elev10/L10e020a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e020a.dat right +[ 20, 69 ] = ascii (fp) : "./hrtfs/elev10/L10e015a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e015a.dat right +[ 20, 70 ] = ascii (fp) : "./hrtfs/elev10/L10e010a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e010a.dat right +[ 20, 71 ] = ascii (fp) : "./hrtfs/elev10/L10e005a.dat left + + ascii (fp) : "./hrtfs/elev10/R10e005a.dat right + +[ 21, 0 ] = ascii (fp) : "./hrtfs/elev15/L15e000a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e000a.dat right +[ 21, 1 ] = ascii (fp) : "./hrtfs/elev15/L15e355a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e355a.dat right +[ 21, 2 ] = ascii (fp) : "./hrtfs/elev15/L15e350a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e350a.dat right +[ 21, 3 ] = ascii (fp) : "./hrtfs/elev15/L15e345a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e345a.dat right +[ 21, 4 ] = ascii (fp) : "./hrtfs/elev15/L15e340a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e340a.dat right +[ 21, 5 ] = ascii (fp) : "./hrtfs/elev15/L15e335a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e335a.dat right +[ 21, 6 ] = ascii (fp) : "./hrtfs/elev15/L15e330a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e330a.dat right +[ 21, 7 ] = ascii (fp) : "./hrtfs/elev15/L15e325a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e325a.dat right +[ 21, 8 ] = ascii (fp) : "./hrtfs/elev15/L15e320a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e320a.dat right +[ 21, 9 ] = ascii (fp) : "./hrtfs/elev15/L15e315a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e315a.dat right +[ 21, 10 ] = ascii (fp) : "./hrtfs/elev15/L15e310a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e310a.dat right +[ 21, 11 ] = ascii (fp) : "./hrtfs/elev15/L15e305a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e305a.dat right +[ 21, 12 ] = ascii (fp) : "./hrtfs/elev15/L15e300a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e300a.dat right +[ 21, 13 ] = ascii (fp) : "./hrtfs/elev15/L15e295a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e295a.dat right +[ 21, 14 ] = ascii (fp) : "./hrtfs/elev15/L15e290a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e290a.dat right +[ 21, 15 ] = ascii (fp) : "./hrtfs/elev15/L15e285a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e285a.dat right +[ 21, 16 ] = ascii (fp) : "./hrtfs/elev15/L15e280a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e280a.dat right +[ 21, 17 ] = ascii (fp) : "./hrtfs/elev15/L15e275a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e275a.dat right +[ 21, 18 ] = ascii (fp) : "./hrtfs/elev15/L15e270a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e270a.dat right +[ 21, 19 ] = ascii (fp) : "./hrtfs/elev15/L15e265a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e265a.dat right +[ 21, 20 ] = ascii (fp) : "./hrtfs/elev15/L15e260a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e260a.dat right +[ 21, 21 ] = ascii (fp) : "./hrtfs/elev15/L15e255a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e255a.dat right +[ 21, 22 ] = ascii (fp) : "./hrtfs/elev15/L15e250a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e250a.dat right +[ 21, 23 ] = ascii (fp) : "./hrtfs/elev15/L15e245a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e245a.dat right +[ 21, 24 ] = ascii (fp) : "./hrtfs/elev15/L15e240a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e240a.dat right +[ 21, 25 ] = ascii (fp) : "./hrtfs/elev15/L15e235a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e235a.dat right +[ 21, 26 ] = ascii (fp) : "./hrtfs/elev15/L15e230a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e230a.dat right +[ 21, 27 ] = ascii (fp) : "./hrtfs/elev15/L15e225a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e225a.dat right +[ 21, 28 ] = ascii (fp) : "./hrtfs/elev15/L15e220a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e220a.dat right +[ 21, 29 ] = ascii (fp) : "./hrtfs/elev15/L15e215a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e215a.dat right +[ 21, 30 ] = ascii (fp) : "./hrtfs/elev15/L15e210a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e210a.dat right +[ 21, 31 ] = ascii (fp) : "./hrtfs/elev15/L15e205a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e205a.dat right +[ 21, 32 ] = ascii (fp) : "./hrtfs/elev15/L15e200a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e200a.dat right +[ 21, 33 ] = ascii (fp) : "./hrtfs/elev15/L15e195a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e195a.dat right +[ 21, 34 ] = ascii (fp) : "./hrtfs/elev15/L15e190a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e190a.dat right +[ 21, 35 ] = ascii (fp) : "./hrtfs/elev15/L15e185a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e185a.dat right +[ 21, 36 ] = ascii (fp) : "./hrtfs/elev15/L15e180a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e180a.dat right +[ 21, 37 ] = ascii (fp) : "./hrtfs/elev15/L15e175a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e175a.dat right +[ 21, 38 ] = ascii (fp) : "./hrtfs/elev15/L15e170a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e170a.dat right +[ 21, 39 ] = ascii (fp) : "./hrtfs/elev15/L15e165a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e165a.dat right +[ 21, 40 ] = ascii (fp) : "./hrtfs/elev15/L15e160a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e160a.dat right +[ 21, 41 ] = ascii (fp) : "./hrtfs/elev15/L15e155a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e155a.dat right +[ 21, 42 ] = ascii (fp) : "./hrtfs/elev15/L15e150a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e150a.dat right +[ 21, 43 ] = ascii (fp) : "./hrtfs/elev15/L15e145a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e145a.dat right +[ 21, 44 ] = ascii (fp) : "./hrtfs/elev15/L15e140a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e140a.dat right +[ 21, 45 ] = ascii (fp) : "./hrtfs/elev15/L15e135a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e135a.dat right +[ 21, 46 ] = ascii (fp) : "./hrtfs/elev15/L15e130a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e130a.dat right +[ 21, 47 ] = ascii (fp) : "./hrtfs/elev15/L15e125a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e125a.dat right +[ 21, 48 ] = ascii (fp) : "./hrtfs/elev15/L15e120a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e120a.dat right +[ 21, 49 ] = ascii (fp) : "./hrtfs/elev15/L15e115a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e115a.dat right +[ 21, 50 ] = ascii (fp) : "./hrtfs/elev15/L15e110a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e110a.dat right +[ 21, 51 ] = ascii (fp) : "./hrtfs/elev15/L15e105a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e105a.dat right +[ 21, 52 ] = ascii (fp) : "./hrtfs/elev15/L15e100a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e100a.dat right +[ 21, 53 ] = ascii (fp) : "./hrtfs/elev15/L15e095a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e095a.dat right +[ 21, 54 ] = ascii (fp) : "./hrtfs/elev15/L15e090a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e090a.dat right +[ 21, 55 ] = ascii (fp) : "./hrtfs/elev15/L15e085a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e085a.dat right +[ 21, 56 ] = ascii (fp) : "./hrtfs/elev15/L15e080a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e080a.dat right +[ 21, 57 ] = ascii (fp) : "./hrtfs/elev15/L15e075a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e075a.dat right +[ 21, 58 ] = ascii (fp) : "./hrtfs/elev15/L15e070a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e070a.dat right +[ 21, 59 ] = ascii (fp) : "./hrtfs/elev15/L15e065a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e065a.dat right +[ 21, 60 ] = ascii (fp) : "./hrtfs/elev15/L15e060a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e060a.dat right +[ 21, 61 ] = ascii (fp) : "./hrtfs/elev15/L15e055a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e055a.dat right +[ 21, 62 ] = ascii (fp) : "./hrtfs/elev15/L15e050a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e050a.dat right +[ 21, 63 ] = ascii (fp) : "./hrtfs/elev15/L15e045a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e045a.dat right +[ 21, 64 ] = ascii (fp) : "./hrtfs/elev15/L15e040a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e040a.dat right +[ 21, 65 ] = ascii (fp) : "./hrtfs/elev15/L15e035a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e035a.dat right +[ 21, 66 ] = ascii (fp) : "./hrtfs/elev15/L15e030a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e030a.dat right +[ 21, 67 ] = ascii (fp) : "./hrtfs/elev15/L15e025a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e025a.dat right +[ 21, 68 ] = ascii (fp) : "./hrtfs/elev15/L15e020a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e020a.dat right +[ 21, 69 ] = ascii (fp) : "./hrtfs/elev15/L15e015a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e015a.dat right +[ 21, 70 ] = ascii (fp) : "./hrtfs/elev15/L15e010a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e010a.dat right +[ 21, 71 ] = ascii (fp) : "./hrtfs/elev15/L15e005a.dat left + + ascii (fp) : "./hrtfs/elev15/R15e005a.dat right + +[ 22, 0 ] = ascii (fp) : "./hrtfs/elev20/L20e000a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e000a.dat right +[ 22, 1 ] = ascii (fp) : "./hrtfs/elev20/L20e355a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e355a.dat right +[ 22, 2 ] = ascii (fp) : "./hrtfs/elev20/L20e350a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e350a.dat right +[ 22, 3 ] = ascii (fp) : "./hrtfs/elev20/L20e345a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e345a.dat right +[ 22, 4 ] = ascii (fp) : "./hrtfs/elev20/L20e340a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e340a.dat right +[ 22, 5 ] = ascii (fp) : "./hrtfs/elev20/L20e335a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e335a.dat right +[ 22, 6 ] = ascii (fp) : "./hrtfs/elev20/L20e330a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e330a.dat right +[ 22, 7 ] = ascii (fp) : "./hrtfs/elev20/L20e325a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e325a.dat right +[ 22, 8 ] = ascii (fp) : "./hrtfs/elev20/L20e320a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e320a.dat right +[ 22, 9 ] = ascii (fp) : "./hrtfs/elev20/L20e315a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e315a.dat right +[ 22, 10 ] = ascii (fp) : "./hrtfs/elev20/L20e310a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e310a.dat right +[ 22, 11 ] = ascii (fp) : "./hrtfs/elev20/L20e305a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e305a.dat right +[ 22, 12 ] = ascii (fp) : "./hrtfs/elev20/L20e300a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e300a.dat right +[ 22, 13 ] = ascii (fp) : "./hrtfs/elev20/L20e295a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e295a.dat right +[ 22, 14 ] = ascii (fp) : "./hrtfs/elev20/L20e290a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e290a.dat right +[ 22, 15 ] = ascii (fp) : "./hrtfs/elev20/L20e285a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e285a.dat right +[ 22, 16 ] = ascii (fp) : "./hrtfs/elev20/L20e280a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e280a.dat right +[ 22, 17 ] = ascii (fp) : "./hrtfs/elev20/L20e275a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e275a.dat right +[ 22, 18 ] = ascii (fp) : "./hrtfs/elev20/L20e270a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e270a.dat right +[ 22, 19 ] = ascii (fp) : "./hrtfs/elev20/L20e265a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e265a.dat right +[ 22, 20 ] = ascii (fp) : "./hrtfs/elev20/L20e260a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e260a.dat right +[ 22, 21 ] = ascii (fp) : "./hrtfs/elev20/L20e255a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e255a.dat right +[ 22, 22 ] = ascii (fp) : "./hrtfs/elev20/L20e250a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e250a.dat right +[ 22, 23 ] = ascii (fp) : "./hrtfs/elev20/L20e245a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e245a.dat right +[ 22, 24 ] = ascii (fp) : "./hrtfs/elev20/L20e240a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e240a.dat right +[ 22, 25 ] = ascii (fp) : "./hrtfs/elev20/L20e235a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e235a.dat right +[ 22, 26 ] = ascii (fp) : "./hrtfs/elev20/L20e230a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e230a.dat right +[ 22, 27 ] = ascii (fp) : "./hrtfs/elev20/L20e225a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e225a.dat right +[ 22, 28 ] = ascii (fp) : "./hrtfs/elev20/L20e220a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e220a.dat right +[ 22, 29 ] = ascii (fp) : "./hrtfs/elev20/L20e215a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e215a.dat right +[ 22, 30 ] = ascii (fp) : "./hrtfs/elev20/L20e210a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e210a.dat right +[ 22, 31 ] = ascii (fp) : "./hrtfs/elev20/L20e205a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e205a.dat right +[ 22, 32 ] = ascii (fp) : "./hrtfs/elev20/L20e200a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e200a.dat right +[ 22, 33 ] = ascii (fp) : "./hrtfs/elev20/L20e195a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e195a.dat right +[ 22, 34 ] = ascii (fp) : "./hrtfs/elev20/L20e190a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e190a.dat right +[ 22, 35 ] = ascii (fp) : "./hrtfs/elev20/L20e185a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e185a.dat right +[ 22, 36 ] = ascii (fp) : "./hrtfs/elev20/L20e180a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e180a.dat right +[ 22, 37 ] = ascii (fp) : "./hrtfs/elev20/L20e175a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e175a.dat right +[ 22, 38 ] = ascii (fp) : "./hrtfs/elev20/L20e170a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e170a.dat right +[ 22, 39 ] = ascii (fp) : "./hrtfs/elev20/L20e165a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e165a.dat right +[ 22, 40 ] = ascii (fp) : "./hrtfs/elev20/L20e160a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e160a.dat right +[ 22, 41 ] = ascii (fp) : "./hrtfs/elev20/L20e155a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e155a.dat right +[ 22, 42 ] = ascii (fp) : "./hrtfs/elev20/L20e150a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e150a.dat right +[ 22, 43 ] = ascii (fp) : "./hrtfs/elev20/L20e145a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e145a.dat right +[ 22, 44 ] = ascii (fp) : "./hrtfs/elev20/L20e140a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e140a.dat right +[ 22, 45 ] = ascii (fp) : "./hrtfs/elev20/L20e135a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e135a.dat right +[ 22, 46 ] = ascii (fp) : "./hrtfs/elev20/L20e130a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e130a.dat right +[ 22, 47 ] = ascii (fp) : "./hrtfs/elev20/L20e125a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e125a.dat right +[ 22, 48 ] = ascii (fp) : "./hrtfs/elev20/L20e120a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e120a.dat right +[ 22, 49 ] = ascii (fp) : "./hrtfs/elev20/L20e115a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e115a.dat right +[ 22, 50 ] = ascii (fp) : "./hrtfs/elev20/L20e110a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e110a.dat right +[ 22, 51 ] = ascii (fp) : "./hrtfs/elev20/L20e105a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e105a.dat right +[ 22, 52 ] = ascii (fp) : "./hrtfs/elev20/L20e100a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e100a.dat right +[ 22, 53 ] = ascii (fp) : "./hrtfs/elev20/L20e095a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e095a.dat right +[ 22, 54 ] = ascii (fp) : "./hrtfs/elev20/L20e090a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e090a.dat right +[ 22, 55 ] = ascii (fp) : "./hrtfs/elev20/L20e085a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e085a.dat right +[ 22, 56 ] = ascii (fp) : "./hrtfs/elev20/L20e080a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e080a.dat right +[ 22, 57 ] = ascii (fp) : "./hrtfs/elev20/L20e075a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e075a.dat right +[ 22, 58 ] = ascii (fp) : "./hrtfs/elev20/L20e070a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e070a.dat right +[ 22, 59 ] = ascii (fp) : "./hrtfs/elev20/L20e065a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e065a.dat right +[ 22, 60 ] = ascii (fp) : "./hrtfs/elev20/L20e060a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e060a.dat right +[ 22, 61 ] = ascii (fp) : "./hrtfs/elev20/L20e055a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e055a.dat right +[ 22, 62 ] = ascii (fp) : "./hrtfs/elev20/L20e050a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e050a.dat right +[ 22, 63 ] = ascii (fp) : "./hrtfs/elev20/L20e045a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e045a.dat right +[ 22, 64 ] = ascii (fp) : "./hrtfs/elev20/L20e040a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e040a.dat right +[ 22, 65 ] = ascii (fp) : "./hrtfs/elev20/L20e035a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e035a.dat right +[ 22, 66 ] = ascii (fp) : "./hrtfs/elev20/L20e030a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e030a.dat right +[ 22, 67 ] = ascii (fp) : "./hrtfs/elev20/L20e025a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e025a.dat right +[ 22, 68 ] = ascii (fp) : "./hrtfs/elev20/L20e020a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e020a.dat right +[ 22, 69 ] = ascii (fp) : "./hrtfs/elev20/L20e015a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e015a.dat right +[ 22, 70 ] = ascii (fp) : "./hrtfs/elev20/L20e010a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e010a.dat right +[ 22, 71 ] = ascii (fp) : "./hrtfs/elev20/L20e005a.dat left + + ascii (fp) : "./hrtfs/elev20/R20e005a.dat right + +[ 23, 0 ] = ascii (fp) : "./hrtfs/elev25/L25e000a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e000a.dat right +[ 23, 1 ] = ascii (fp) : "./hrtfs/elev25/L25e355a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e355a.dat right +[ 23, 2 ] = ascii (fp) : "./hrtfs/elev25/L25e350a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e350a.dat right +[ 23, 3 ] = ascii (fp) : "./hrtfs/elev25/L25e345a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e345a.dat right +[ 23, 4 ] = ascii (fp) : "./hrtfs/elev25/L25e340a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e340a.dat right +[ 23, 5 ] = ascii (fp) : "./hrtfs/elev25/L25e335a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e335a.dat right +[ 23, 6 ] = ascii (fp) : "./hrtfs/elev25/L25e330a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e330a.dat right +[ 23, 7 ] = ascii (fp) : "./hrtfs/elev25/L25e325a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e325a.dat right +[ 23, 8 ] = ascii (fp) : "./hrtfs/elev25/L25e320a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e320a.dat right +[ 23, 9 ] = ascii (fp) : "./hrtfs/elev25/L25e315a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e315a.dat right +[ 23, 10 ] = ascii (fp) : "./hrtfs/elev25/L25e310a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e310a.dat right +[ 23, 11 ] = ascii (fp) : "./hrtfs/elev25/L25e305a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e305a.dat right +[ 23, 12 ] = ascii (fp) : "./hrtfs/elev25/L25e300a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e300a.dat right +[ 23, 13 ] = ascii (fp) : "./hrtfs/elev25/L25e295a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e295a.dat right +[ 23, 14 ] = ascii (fp) : "./hrtfs/elev25/L25e290a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e290a.dat right +[ 23, 15 ] = ascii (fp) : "./hrtfs/elev25/L25e285a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e285a.dat right +[ 23, 16 ] = ascii (fp) : "./hrtfs/elev25/L25e280a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e280a.dat right +[ 23, 17 ] = ascii (fp) : "./hrtfs/elev25/L25e275a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e275a.dat right +[ 23, 18 ] = ascii (fp) : "./hrtfs/elev25/L25e270a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e270a.dat right +[ 23, 19 ] = ascii (fp) : "./hrtfs/elev25/L25e265a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e265a.dat right +[ 23, 20 ] = ascii (fp) : "./hrtfs/elev25/L25e260a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e260a.dat right +[ 23, 21 ] = ascii (fp) : "./hrtfs/elev25/L25e255a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e255a.dat right +[ 23, 22 ] = ascii (fp) : "./hrtfs/elev25/L25e250a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e250a.dat right +[ 23, 23 ] = ascii (fp) : "./hrtfs/elev25/L25e245a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e245a.dat right +[ 23, 24 ] = ascii (fp) : "./hrtfs/elev25/L25e240a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e240a.dat right +[ 23, 25 ] = ascii (fp) : "./hrtfs/elev25/L25e235a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e235a.dat right +[ 23, 26 ] = ascii (fp) : "./hrtfs/elev25/L25e230a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e230a.dat right +[ 23, 27 ] = ascii (fp) : "./hrtfs/elev25/L25e225a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e225a.dat right +[ 23, 28 ] = ascii (fp) : "./hrtfs/elev25/L25e220a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e220a.dat right +[ 23, 29 ] = ascii (fp) : "./hrtfs/elev25/L25e215a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e215a.dat right +[ 23, 30 ] = ascii (fp) : "./hrtfs/elev25/L25e210a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e210a.dat right +[ 23, 31 ] = ascii (fp) : "./hrtfs/elev25/L25e205a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e205a.dat right +[ 23, 32 ] = ascii (fp) : "./hrtfs/elev25/L25e200a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e200a.dat right +[ 23, 33 ] = ascii (fp) : "./hrtfs/elev25/L25e195a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e195a.dat right +[ 23, 34 ] = ascii (fp) : "./hrtfs/elev25/L25e190a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e190a.dat right +[ 23, 35 ] = ascii (fp) : "./hrtfs/elev25/L25e185a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e185a.dat right +[ 23, 36 ] = ascii (fp) : "./hrtfs/elev25/L25e180a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e180a.dat right +[ 23, 37 ] = ascii (fp) : "./hrtfs/elev25/L25e175a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e175a.dat right +[ 23, 38 ] = ascii (fp) : "./hrtfs/elev25/L25e170a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e170a.dat right +[ 23, 39 ] = ascii (fp) : "./hrtfs/elev25/L25e165a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e165a.dat right +[ 23, 40 ] = ascii (fp) : "./hrtfs/elev25/L25e160a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e160a.dat right +[ 23, 41 ] = ascii (fp) : "./hrtfs/elev25/L25e155a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e155a.dat right +[ 23, 42 ] = ascii (fp) : "./hrtfs/elev25/L25e150a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e150a.dat right +[ 23, 43 ] = ascii (fp) : "./hrtfs/elev25/L25e145a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e145a.dat right +[ 23, 44 ] = ascii (fp) : "./hrtfs/elev25/L25e140a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e140a.dat right +[ 23, 45 ] = ascii (fp) : "./hrtfs/elev25/L25e135a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e135a.dat right +[ 23, 46 ] = ascii (fp) : "./hrtfs/elev25/L25e130a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e130a.dat right +[ 23, 47 ] = ascii (fp) : "./hrtfs/elev25/L25e125a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e125a.dat right +[ 23, 48 ] = ascii (fp) : "./hrtfs/elev25/L25e120a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e120a.dat right +[ 23, 49 ] = ascii (fp) : "./hrtfs/elev25/L25e115a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e115a.dat right +[ 23, 50 ] = ascii (fp) : "./hrtfs/elev25/L25e110a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e110a.dat right +[ 23, 51 ] = ascii (fp) : "./hrtfs/elev25/L25e105a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e105a.dat right +[ 23, 52 ] = ascii (fp) : "./hrtfs/elev25/L25e100a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e100a.dat right +[ 23, 53 ] = ascii (fp) : "./hrtfs/elev25/L25e095a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e095a.dat right +[ 23, 54 ] = ascii (fp) : "./hrtfs/elev25/L25e090a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e090a.dat right +[ 23, 55 ] = ascii (fp) : "./hrtfs/elev25/L25e085a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e085a.dat right +[ 23, 56 ] = ascii (fp) : "./hrtfs/elev25/L25e080a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e080a.dat right +[ 23, 57 ] = ascii (fp) : "./hrtfs/elev25/L25e075a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e075a.dat right +[ 23, 58 ] = ascii (fp) : "./hrtfs/elev25/L25e070a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e070a.dat right +[ 23, 59 ] = ascii (fp) : "./hrtfs/elev25/L25e065a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e065a.dat right +[ 23, 60 ] = ascii (fp) : "./hrtfs/elev25/L25e060a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e060a.dat right +[ 23, 61 ] = ascii (fp) : "./hrtfs/elev25/L25e055a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e055a.dat right +[ 23, 62 ] = ascii (fp) : "./hrtfs/elev25/L25e050a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e050a.dat right +[ 23, 63 ] = ascii (fp) : "./hrtfs/elev25/L25e045a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e045a.dat right +[ 23, 64 ] = ascii (fp) : "./hrtfs/elev25/L25e040a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e040a.dat right +[ 23, 65 ] = ascii (fp) : "./hrtfs/elev25/L25e035a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e035a.dat right +[ 23, 66 ] = ascii (fp) : "./hrtfs/elev25/L25e030a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e030a.dat right +[ 23, 67 ] = ascii (fp) : "./hrtfs/elev25/L25e025a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e025a.dat right +[ 23, 68 ] = ascii (fp) : "./hrtfs/elev25/L25e020a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e020a.dat right +[ 23, 69 ] = ascii (fp) : "./hrtfs/elev25/L25e015a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e015a.dat right +[ 23, 70 ] = ascii (fp) : "./hrtfs/elev25/L25e010a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e010a.dat right +[ 23, 71 ] = ascii (fp) : "./hrtfs/elev25/L25e005a.dat left + + ascii (fp) : "./hrtfs/elev25/R25e005a.dat right + +[ 24, 0 ] = ascii (fp) : "./hrtfs/elev30/L30e000a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e000a.dat right +[ 24, 1 ] = ascii (fp) : "./hrtfs/elev30/L30e355a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e355a.dat right +[ 24, 2 ] = ascii (fp) : "./hrtfs/elev30/L30e350a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e350a.dat right +[ 24, 3 ] = ascii (fp) : "./hrtfs/elev30/L30e345a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e345a.dat right +[ 24, 4 ] = ascii (fp) : "./hrtfs/elev30/L30e340a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e340a.dat right +[ 24, 5 ] = ascii (fp) : "./hrtfs/elev30/L30e335a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e335a.dat right +[ 24, 6 ] = ascii (fp) : "./hrtfs/elev30/L30e330a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e330a.dat right +[ 24, 7 ] = ascii (fp) : "./hrtfs/elev30/L30e325a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e325a.dat right +[ 24, 8 ] = ascii (fp) : "./hrtfs/elev30/L30e320a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e320a.dat right +[ 24, 9 ] = ascii (fp) : "./hrtfs/elev30/L30e315a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e315a.dat right +[ 24, 10 ] = ascii (fp) : "./hrtfs/elev30/L30e310a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e310a.dat right +[ 24, 11 ] = ascii (fp) : "./hrtfs/elev30/L30e305a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e305a.dat right +[ 24, 12 ] = ascii (fp) : "./hrtfs/elev30/L30e300a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e300a.dat right +[ 24, 13 ] = ascii (fp) : "./hrtfs/elev30/L30e295a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e295a.dat right +[ 24, 14 ] = ascii (fp) : "./hrtfs/elev30/L30e290a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e290a.dat right +[ 24, 15 ] = ascii (fp) : "./hrtfs/elev30/L30e285a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e285a.dat right +[ 24, 16 ] = ascii (fp) : "./hrtfs/elev30/L30e280a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e280a.dat right +[ 24, 17 ] = ascii (fp) : "./hrtfs/elev30/L30e275a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e275a.dat right +[ 24, 18 ] = ascii (fp) : "./hrtfs/elev30/L30e270a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e270a.dat right +[ 24, 19 ] = ascii (fp) : "./hrtfs/elev30/L30e265a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e265a.dat right +[ 24, 20 ] = ascii (fp) : "./hrtfs/elev30/L30e260a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e260a.dat right +[ 24, 21 ] = ascii (fp) : "./hrtfs/elev30/L30e255a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e255a.dat right +[ 24, 22 ] = ascii (fp) : "./hrtfs/elev30/L30e250a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e250a.dat right +[ 24, 23 ] = ascii (fp) : "./hrtfs/elev30/L30e245a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e245a.dat right +[ 24, 24 ] = ascii (fp) : "./hrtfs/elev30/L30e240a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e240a.dat right +[ 24, 25 ] = ascii (fp) : "./hrtfs/elev30/L30e235a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e235a.dat right +[ 24, 26 ] = ascii (fp) : "./hrtfs/elev30/L30e230a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e230a.dat right +[ 24, 27 ] = ascii (fp) : "./hrtfs/elev30/L30e225a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e225a.dat right +[ 24, 28 ] = ascii (fp) : "./hrtfs/elev30/L30e220a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e220a.dat right +[ 24, 29 ] = ascii (fp) : "./hrtfs/elev30/L30e215a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e215a.dat right +[ 24, 30 ] = ascii (fp) : "./hrtfs/elev30/L30e210a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e210a.dat right +[ 24, 31 ] = ascii (fp) : "./hrtfs/elev30/L30e205a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e205a.dat right +[ 24, 32 ] = ascii (fp) : "./hrtfs/elev30/L30e200a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e200a.dat right +[ 24, 33 ] = ascii (fp) : "./hrtfs/elev30/L30e195a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e195a.dat right +[ 24, 34 ] = ascii (fp) : "./hrtfs/elev30/L30e190a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e190a.dat right +[ 24, 35 ] = ascii (fp) : "./hrtfs/elev30/L30e185a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e185a.dat right +[ 24, 36 ] = ascii (fp) : "./hrtfs/elev30/L30e180a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e180a.dat right +[ 24, 37 ] = ascii (fp) : "./hrtfs/elev30/L30e175a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e175a.dat right +[ 24, 38 ] = ascii (fp) : "./hrtfs/elev30/L30e170a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e170a.dat right +[ 24, 39 ] = ascii (fp) : "./hrtfs/elev30/L30e165a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e165a.dat right +[ 24, 40 ] = ascii (fp) : "./hrtfs/elev30/L30e160a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e160a.dat right +[ 24, 41 ] = ascii (fp) : "./hrtfs/elev30/L30e155a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e155a.dat right +[ 24, 42 ] = ascii (fp) : "./hrtfs/elev30/L30e150a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e150a.dat right +[ 24, 43 ] = ascii (fp) : "./hrtfs/elev30/L30e145a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e145a.dat right +[ 24, 44 ] = ascii (fp) : "./hrtfs/elev30/L30e140a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e140a.dat right +[ 24, 45 ] = ascii (fp) : "./hrtfs/elev30/L30e135a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e135a.dat right +[ 24, 46 ] = ascii (fp) : "./hrtfs/elev30/L30e130a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e130a.dat right +[ 24, 47 ] = ascii (fp) : "./hrtfs/elev30/L30e125a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e125a.dat right +[ 24, 48 ] = ascii (fp) : "./hrtfs/elev30/L30e120a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e120a.dat right +[ 24, 49 ] = ascii (fp) : "./hrtfs/elev30/L30e115a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e115a.dat right +[ 24, 50 ] = ascii (fp) : "./hrtfs/elev30/L30e110a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e110a.dat right +[ 24, 51 ] = ascii (fp) : "./hrtfs/elev30/L30e105a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e105a.dat right +[ 24, 52 ] = ascii (fp) : "./hrtfs/elev30/L30e100a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e100a.dat right +[ 24, 53 ] = ascii (fp) : "./hrtfs/elev30/L30e095a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e095a.dat right +[ 24, 54 ] = ascii (fp) : "./hrtfs/elev30/L30e090a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e090a.dat right +[ 24, 55 ] = ascii (fp) : "./hrtfs/elev30/L30e085a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e085a.dat right +[ 24, 56 ] = ascii (fp) : "./hrtfs/elev30/L30e080a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e080a.dat right +[ 24, 57 ] = ascii (fp) : "./hrtfs/elev30/L30e075a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e075a.dat right +[ 24, 58 ] = ascii (fp) : "./hrtfs/elev30/L30e070a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e070a.dat right +[ 24, 59 ] = ascii (fp) : "./hrtfs/elev30/L30e065a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e065a.dat right +[ 24, 60 ] = ascii (fp) : "./hrtfs/elev30/L30e060a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e060a.dat right +[ 24, 61 ] = ascii (fp) : "./hrtfs/elev30/L30e055a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e055a.dat right +[ 24, 62 ] = ascii (fp) : "./hrtfs/elev30/L30e050a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e050a.dat right +[ 24, 63 ] = ascii (fp) : "./hrtfs/elev30/L30e045a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e045a.dat right +[ 24, 64 ] = ascii (fp) : "./hrtfs/elev30/L30e040a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e040a.dat right +[ 24, 65 ] = ascii (fp) : "./hrtfs/elev30/L30e035a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e035a.dat right +[ 24, 66 ] = ascii (fp) : "./hrtfs/elev30/L30e030a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e030a.dat right +[ 24, 67 ] = ascii (fp) : "./hrtfs/elev30/L30e025a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e025a.dat right +[ 24, 68 ] = ascii (fp) : "./hrtfs/elev30/L30e020a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e020a.dat right +[ 24, 69 ] = ascii (fp) : "./hrtfs/elev30/L30e015a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e015a.dat right +[ 24, 70 ] = ascii (fp) : "./hrtfs/elev30/L30e010a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e010a.dat right +[ 24, 71 ] = ascii (fp) : "./hrtfs/elev30/L30e005a.dat left + + ascii (fp) : "./hrtfs/elev30/R30e005a.dat right + +[ 25, 0 ] = ascii (fp) : "./hrtfs/elev35/L35e000a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e000a.dat right +[ 25, 1 ] = ascii (fp) : "./hrtfs/elev35/L35e355a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e355a.dat right +[ 25, 2 ] = ascii (fp) : "./hrtfs/elev35/L35e350a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e350a.dat right +[ 25, 3 ] = ascii (fp) : "./hrtfs/elev35/L35e345a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e345a.dat right +[ 25, 4 ] = ascii (fp) : "./hrtfs/elev35/L35e340a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e340a.dat right +[ 25, 5 ] = ascii (fp) : "./hrtfs/elev35/L35e335a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e335a.dat right +[ 25, 6 ] = ascii (fp) : "./hrtfs/elev35/L35e330a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e330a.dat right +[ 25, 7 ] = ascii (fp) : "./hrtfs/elev35/L35e325a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e325a.dat right +[ 25, 8 ] = ascii (fp) : "./hrtfs/elev35/L35e320a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e320a.dat right +[ 25, 9 ] = ascii (fp) : "./hrtfs/elev35/L35e315a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e315a.dat right +[ 25, 10 ] = ascii (fp) : "./hrtfs/elev35/L35e310a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e310a.dat right +[ 25, 11 ] = ascii (fp) : "./hrtfs/elev35/L35e305a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e305a.dat right +[ 25, 12 ] = ascii (fp) : "./hrtfs/elev35/L35e300a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e300a.dat right +[ 25, 13 ] = ascii (fp) : "./hrtfs/elev35/L35e295a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e295a.dat right +[ 25, 14 ] = ascii (fp) : "./hrtfs/elev35/L35e290a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e290a.dat right +[ 25, 15 ] = ascii (fp) : "./hrtfs/elev35/L35e285a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e285a.dat right +[ 25, 16 ] = ascii (fp) : "./hrtfs/elev35/L35e280a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e280a.dat right +[ 25, 17 ] = ascii (fp) : "./hrtfs/elev35/L35e275a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e275a.dat right +[ 25, 18 ] = ascii (fp) : "./hrtfs/elev35/L35e270a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e270a.dat right +[ 25, 19 ] = ascii (fp) : "./hrtfs/elev35/L35e265a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e265a.dat right +[ 25, 20 ] = ascii (fp) : "./hrtfs/elev35/L35e260a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e260a.dat right +[ 25, 21 ] = ascii (fp) : "./hrtfs/elev35/L35e255a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e255a.dat right +[ 25, 22 ] = ascii (fp) : "./hrtfs/elev35/L35e250a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e250a.dat right +[ 25, 23 ] = ascii (fp) : "./hrtfs/elev35/L35e245a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e245a.dat right +[ 25, 24 ] = ascii (fp) : "./hrtfs/elev35/L35e240a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e240a.dat right +[ 25, 25 ] = ascii (fp) : "./hrtfs/elev35/L35e235a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e235a.dat right +[ 25, 26 ] = ascii (fp) : "./hrtfs/elev35/L35e230a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e230a.dat right +[ 25, 27 ] = ascii (fp) : "./hrtfs/elev35/L35e225a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e225a.dat right +[ 25, 28 ] = ascii (fp) : "./hrtfs/elev35/L35e220a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e220a.dat right +[ 25, 29 ] = ascii (fp) : "./hrtfs/elev35/L35e215a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e215a.dat right +[ 25, 30 ] = ascii (fp) : "./hrtfs/elev35/L35e210a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e210a.dat right +[ 25, 31 ] = ascii (fp) : "./hrtfs/elev35/L35e205a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e205a.dat right +[ 25, 32 ] = ascii (fp) : "./hrtfs/elev35/L35e200a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e200a.dat right +[ 25, 33 ] = ascii (fp) : "./hrtfs/elev35/L35e195a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e195a.dat right +[ 25, 34 ] = ascii (fp) : "./hrtfs/elev35/L35e190a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e190a.dat right +[ 25, 35 ] = ascii (fp) : "./hrtfs/elev35/L35e185a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e185a.dat right +[ 25, 36 ] = ascii (fp) : "./hrtfs/elev35/L35e180a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e180a.dat right +[ 25, 37 ] = ascii (fp) : "./hrtfs/elev35/L35e175a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e175a.dat right +[ 25, 38 ] = ascii (fp) : "./hrtfs/elev35/L35e170a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e170a.dat right +[ 25, 39 ] = ascii (fp) : "./hrtfs/elev35/L35e165a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e165a.dat right +[ 25, 40 ] = ascii (fp) : "./hrtfs/elev35/L35e160a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e160a.dat right +[ 25, 41 ] = ascii (fp) : "./hrtfs/elev35/L35e155a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e155a.dat right +[ 25, 42 ] = ascii (fp) : "./hrtfs/elev35/L35e150a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e150a.dat right +[ 25, 43 ] = ascii (fp) : "./hrtfs/elev35/L35e145a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e145a.dat right +[ 25, 44 ] = ascii (fp) : "./hrtfs/elev35/L35e140a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e140a.dat right +[ 25, 45 ] = ascii (fp) : "./hrtfs/elev35/L35e135a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e135a.dat right +[ 25, 46 ] = ascii (fp) : "./hrtfs/elev35/L35e130a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e130a.dat right +[ 25, 47 ] = ascii (fp) : "./hrtfs/elev35/L35e125a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e125a.dat right +[ 25, 48 ] = ascii (fp) : "./hrtfs/elev35/L35e120a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e120a.dat right +[ 25, 49 ] = ascii (fp) : "./hrtfs/elev35/L35e115a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e115a.dat right +[ 25, 50 ] = ascii (fp) : "./hrtfs/elev35/L35e110a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e110a.dat right +[ 25, 51 ] = ascii (fp) : "./hrtfs/elev35/L35e105a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e105a.dat right +[ 25, 52 ] = ascii (fp) : "./hrtfs/elev35/L35e100a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e100a.dat right +[ 25, 53 ] = ascii (fp) : "./hrtfs/elev35/L35e095a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e095a.dat right +[ 25, 54 ] = ascii (fp) : "./hrtfs/elev35/L35e090a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e090a.dat right +[ 25, 55 ] = ascii (fp) : "./hrtfs/elev35/L35e085a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e085a.dat right +[ 25, 56 ] = ascii (fp) : "./hrtfs/elev35/L35e080a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e080a.dat right +[ 25, 57 ] = ascii (fp) : "./hrtfs/elev35/L35e075a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e075a.dat right +[ 25, 58 ] = ascii (fp) : "./hrtfs/elev35/L35e070a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e070a.dat right +[ 25, 59 ] = ascii (fp) : "./hrtfs/elev35/L35e065a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e065a.dat right +[ 25, 60 ] = ascii (fp) : "./hrtfs/elev35/L35e060a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e060a.dat right +[ 25, 61 ] = ascii (fp) : "./hrtfs/elev35/L35e055a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e055a.dat right +[ 25, 62 ] = ascii (fp) : "./hrtfs/elev35/L35e050a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e050a.dat right +[ 25, 63 ] = ascii (fp) : "./hrtfs/elev35/L35e045a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e045a.dat right +[ 25, 64 ] = ascii (fp) : "./hrtfs/elev35/L35e040a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e040a.dat right +[ 25, 65 ] = ascii (fp) : "./hrtfs/elev35/L35e035a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e035a.dat right +[ 25, 66 ] = ascii (fp) : "./hrtfs/elev35/L35e030a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e030a.dat right +[ 25, 67 ] = ascii (fp) : "./hrtfs/elev35/L35e025a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e025a.dat right +[ 25, 68 ] = ascii (fp) : "./hrtfs/elev35/L35e020a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e020a.dat right +[ 25, 69 ] = ascii (fp) : "./hrtfs/elev35/L35e015a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e015a.dat right +[ 25, 70 ] = ascii (fp) : "./hrtfs/elev35/L35e010a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e010a.dat right +[ 25, 71 ] = ascii (fp) : "./hrtfs/elev35/L35e005a.dat left + + ascii (fp) : "./hrtfs/elev35/R35e005a.dat right + +[ 26, 0 ] = ascii (fp) : "./hrtfs/elev40/L40e000a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e000a.dat right +[ 26, 1 ] = ascii (fp) : "./hrtfs/elev40/L40e355a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e355a.dat right +[ 26, 2 ] = ascii (fp) : "./hrtfs/elev40/L40e350a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e350a.dat right +[ 26, 3 ] = ascii (fp) : "./hrtfs/elev40/L40e345a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e345a.dat right +[ 26, 4 ] = ascii (fp) : "./hrtfs/elev40/L40e340a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e340a.dat right +[ 26, 5 ] = ascii (fp) : "./hrtfs/elev40/L40e335a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e335a.dat right +[ 26, 6 ] = ascii (fp) : "./hrtfs/elev40/L40e330a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e330a.dat right +[ 26, 7 ] = ascii (fp) : "./hrtfs/elev40/L40e325a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e325a.dat right +[ 26, 8 ] = ascii (fp) : "./hrtfs/elev40/L40e320a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e320a.dat right +[ 26, 9 ] = ascii (fp) : "./hrtfs/elev40/L40e315a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e315a.dat right +[ 26, 10 ] = ascii (fp) : "./hrtfs/elev40/L40e310a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e310a.dat right +[ 26, 11 ] = ascii (fp) : "./hrtfs/elev40/L40e305a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e305a.dat right +[ 26, 12 ] = ascii (fp) : "./hrtfs/elev40/L40e300a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e300a.dat right +[ 26, 13 ] = ascii (fp) : "./hrtfs/elev40/L40e295a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e295a.dat right +[ 26, 14 ] = ascii (fp) : "./hrtfs/elev40/L40e290a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e290a.dat right +[ 26, 15 ] = ascii (fp) : "./hrtfs/elev40/L40e285a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e285a.dat right +[ 26, 16 ] = ascii (fp) : "./hrtfs/elev40/L40e280a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e280a.dat right +[ 26, 17 ] = ascii (fp) : "./hrtfs/elev40/L40e275a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e275a.dat right +[ 26, 18 ] = ascii (fp) : "./hrtfs/elev40/L40e270a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e270a.dat right +[ 26, 19 ] = ascii (fp) : "./hrtfs/elev40/L40e265a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e265a.dat right +[ 26, 20 ] = ascii (fp) : "./hrtfs/elev40/L40e260a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e260a.dat right +[ 26, 21 ] = ascii (fp) : "./hrtfs/elev40/L40e255a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e255a.dat right +[ 26, 22 ] = ascii (fp) : "./hrtfs/elev40/L40e250a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e250a.dat right +[ 26, 23 ] = ascii (fp) : "./hrtfs/elev40/L40e245a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e245a.dat right +[ 26, 24 ] = ascii (fp) : "./hrtfs/elev40/L40e240a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e240a.dat right +[ 26, 25 ] = ascii (fp) : "./hrtfs/elev40/L40e235a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e235a.dat right +[ 26, 26 ] = ascii (fp) : "./hrtfs/elev40/L40e230a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e230a.dat right +[ 26, 27 ] = ascii (fp) : "./hrtfs/elev40/L40e225a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e225a.dat right +[ 26, 28 ] = ascii (fp) : "./hrtfs/elev40/L40e220a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e220a.dat right +[ 26, 29 ] = ascii (fp) : "./hrtfs/elev40/L40e215a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e215a.dat right +[ 26, 30 ] = ascii (fp) : "./hrtfs/elev40/L40e210a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e210a.dat right +[ 26, 31 ] = ascii (fp) : "./hrtfs/elev40/L40e205a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e205a.dat right +[ 26, 32 ] = ascii (fp) : "./hrtfs/elev40/L40e200a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e200a.dat right +[ 26, 33 ] = ascii (fp) : "./hrtfs/elev40/L40e195a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e195a.dat right +[ 26, 34 ] = ascii (fp) : "./hrtfs/elev40/L40e190a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e190a.dat right +[ 26, 35 ] = ascii (fp) : "./hrtfs/elev40/L40e185a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e185a.dat right +[ 26, 36 ] = ascii (fp) : "./hrtfs/elev40/L40e180a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e180a.dat right +[ 26, 37 ] = ascii (fp) : "./hrtfs/elev40/L40e175a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e175a.dat right +[ 26, 38 ] = ascii (fp) : "./hrtfs/elev40/L40e170a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e170a.dat right +[ 26, 39 ] = ascii (fp) : "./hrtfs/elev40/L40e165a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e165a.dat right +[ 26, 40 ] = ascii (fp) : "./hrtfs/elev40/L40e160a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e160a.dat right +[ 26, 41 ] = ascii (fp) : "./hrtfs/elev40/L40e155a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e155a.dat right +[ 26, 42 ] = ascii (fp) : "./hrtfs/elev40/L40e150a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e150a.dat right +[ 26, 43 ] = ascii (fp) : "./hrtfs/elev40/L40e145a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e145a.dat right +[ 26, 44 ] = ascii (fp) : "./hrtfs/elev40/L40e140a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e140a.dat right +[ 26, 45 ] = ascii (fp) : "./hrtfs/elev40/L40e135a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e135a.dat right +[ 26, 46 ] = ascii (fp) : "./hrtfs/elev40/L40e130a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e130a.dat right +[ 26, 47 ] = ascii (fp) : "./hrtfs/elev40/L40e125a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e125a.dat right +[ 26, 48 ] = ascii (fp) : "./hrtfs/elev40/L40e120a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e120a.dat right +[ 26, 49 ] = ascii (fp) : "./hrtfs/elev40/L40e115a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e115a.dat right +[ 26, 50 ] = ascii (fp) : "./hrtfs/elev40/L40e110a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e110a.dat right +[ 26, 51 ] = ascii (fp) : "./hrtfs/elev40/L40e105a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e105a.dat right +[ 26, 52 ] = ascii (fp) : "./hrtfs/elev40/L40e100a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e100a.dat right +[ 26, 53 ] = ascii (fp) : "./hrtfs/elev40/L40e095a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e095a.dat right +[ 26, 54 ] = ascii (fp) : "./hrtfs/elev40/L40e090a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e090a.dat right +[ 26, 55 ] = ascii (fp) : "./hrtfs/elev40/L40e085a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e085a.dat right +[ 26, 56 ] = ascii (fp) : "./hrtfs/elev40/L40e080a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e080a.dat right +[ 26, 57 ] = ascii (fp) : "./hrtfs/elev40/L40e075a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e075a.dat right +[ 26, 58 ] = ascii (fp) : "./hrtfs/elev40/L40e070a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e070a.dat right +[ 26, 59 ] = ascii (fp) : "./hrtfs/elev40/L40e065a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e065a.dat right +[ 26, 60 ] = ascii (fp) : "./hrtfs/elev40/L40e060a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e060a.dat right +[ 26, 61 ] = ascii (fp) : "./hrtfs/elev40/L40e055a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e055a.dat right +[ 26, 62 ] = ascii (fp) : "./hrtfs/elev40/L40e050a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e050a.dat right +[ 26, 63 ] = ascii (fp) : "./hrtfs/elev40/L40e045a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e045a.dat right +[ 26, 64 ] = ascii (fp) : "./hrtfs/elev40/L40e040a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e040a.dat right +[ 26, 65 ] = ascii (fp) : "./hrtfs/elev40/L40e035a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e035a.dat right +[ 26, 66 ] = ascii (fp) : "./hrtfs/elev40/L40e030a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e030a.dat right +[ 26, 67 ] = ascii (fp) : "./hrtfs/elev40/L40e025a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e025a.dat right +[ 26, 68 ] = ascii (fp) : "./hrtfs/elev40/L40e020a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e020a.dat right +[ 26, 69 ] = ascii (fp) : "./hrtfs/elev40/L40e015a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e015a.dat right +[ 26, 70 ] = ascii (fp) : "./hrtfs/elev40/L40e010a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e010a.dat right +[ 26, 71 ] = ascii (fp) : "./hrtfs/elev40/L40e005a.dat left + + ascii (fp) : "./hrtfs/elev40/R40e005a.dat right + +[ 27, 0 ] = ascii (fp) : "./hrtfs/elev45/L45e000a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e000a.dat right +[ 27, 1 ] = ascii (fp) : "./hrtfs/elev45/L45e355a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e355a.dat right +[ 27, 2 ] = ascii (fp) : "./hrtfs/elev45/L45e350a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e350a.dat right +[ 27, 3 ] = ascii (fp) : "./hrtfs/elev45/L45e345a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e345a.dat right +[ 27, 4 ] = ascii (fp) : "./hrtfs/elev45/L45e340a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e340a.dat right +[ 27, 5 ] = ascii (fp) : "./hrtfs/elev45/L45e335a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e335a.dat right +[ 27, 6 ] = ascii (fp) : "./hrtfs/elev45/L45e330a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e330a.dat right +[ 27, 7 ] = ascii (fp) : "./hrtfs/elev45/L45e325a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e325a.dat right +[ 27, 8 ] = ascii (fp) : "./hrtfs/elev45/L45e320a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e320a.dat right +[ 27, 9 ] = ascii (fp) : "./hrtfs/elev45/L45e315a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e315a.dat right +[ 27, 10 ] = ascii (fp) : "./hrtfs/elev45/L45e310a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e310a.dat right +[ 27, 11 ] = ascii (fp) : "./hrtfs/elev45/L45e305a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e305a.dat right +[ 27, 12 ] = ascii (fp) : "./hrtfs/elev45/L45e300a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e300a.dat right +[ 27, 13 ] = ascii (fp) : "./hrtfs/elev45/L45e295a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e295a.dat right +[ 27, 14 ] = ascii (fp) : "./hrtfs/elev45/L45e290a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e290a.dat right +[ 27, 15 ] = ascii (fp) : "./hrtfs/elev45/L45e285a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e285a.dat right +[ 27, 16 ] = ascii (fp) : "./hrtfs/elev45/L45e280a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e280a.dat right +[ 27, 17 ] = ascii (fp) : "./hrtfs/elev45/L45e275a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e275a.dat right +[ 27, 18 ] = ascii (fp) : "./hrtfs/elev45/L45e270a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e270a.dat right +[ 27, 19 ] = ascii (fp) : "./hrtfs/elev45/L45e265a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e265a.dat right +[ 27, 20 ] = ascii (fp) : "./hrtfs/elev45/L45e260a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e260a.dat right +[ 27, 21 ] = ascii (fp) : "./hrtfs/elev45/L45e255a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e255a.dat right +[ 27, 22 ] = ascii (fp) : "./hrtfs/elev45/L45e250a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e250a.dat right +[ 27, 23 ] = ascii (fp) : "./hrtfs/elev45/L45e245a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e245a.dat right +[ 27, 24 ] = ascii (fp) : "./hrtfs/elev45/L45e240a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e240a.dat right +[ 27, 25 ] = ascii (fp) : "./hrtfs/elev45/L45e235a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e235a.dat right +[ 27, 26 ] = ascii (fp) : "./hrtfs/elev45/L45e230a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e230a.dat right +[ 27, 27 ] = ascii (fp) : "./hrtfs/elev45/L45e225a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e225a.dat right +[ 27, 28 ] = ascii (fp) : "./hrtfs/elev45/L45e220a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e220a.dat right +[ 27, 29 ] = ascii (fp) : "./hrtfs/elev45/L45e215a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e215a.dat right +[ 27, 30 ] = ascii (fp) : "./hrtfs/elev45/L45e210a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e210a.dat right +[ 27, 31 ] = ascii (fp) : "./hrtfs/elev45/L45e205a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e205a.dat right +[ 27, 32 ] = ascii (fp) : "./hrtfs/elev45/L45e200a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e200a.dat right +[ 27, 33 ] = ascii (fp) : "./hrtfs/elev45/L45e195a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e195a.dat right +[ 27, 34 ] = ascii (fp) : "./hrtfs/elev45/L45e190a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e190a.dat right +[ 27, 35 ] = ascii (fp) : "./hrtfs/elev45/L45e185a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e185a.dat right +[ 27, 36 ] = ascii (fp) : "./hrtfs/elev45/L45e180a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e180a.dat right +[ 27, 37 ] = ascii (fp) : "./hrtfs/elev45/L45e175a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e175a.dat right +[ 27, 38 ] = ascii (fp) : "./hrtfs/elev45/L45e170a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e170a.dat right +[ 27, 39 ] = ascii (fp) : "./hrtfs/elev45/L45e165a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e165a.dat right +[ 27, 40 ] = ascii (fp) : "./hrtfs/elev45/L45e160a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e160a.dat right +[ 27, 41 ] = ascii (fp) : "./hrtfs/elev45/L45e155a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e155a.dat right +[ 27, 42 ] = ascii (fp) : "./hrtfs/elev45/L45e150a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e150a.dat right +[ 27, 43 ] = ascii (fp) : "./hrtfs/elev45/L45e145a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e145a.dat right +[ 27, 44 ] = ascii (fp) : "./hrtfs/elev45/L45e140a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e140a.dat right +[ 27, 45 ] = ascii (fp) : "./hrtfs/elev45/L45e135a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e135a.dat right +[ 27, 46 ] = ascii (fp) : "./hrtfs/elev45/L45e130a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e130a.dat right +[ 27, 47 ] = ascii (fp) : "./hrtfs/elev45/L45e125a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e125a.dat right +[ 27, 48 ] = ascii (fp) : "./hrtfs/elev45/L45e120a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e120a.dat right +[ 27, 49 ] = ascii (fp) : "./hrtfs/elev45/L45e115a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e115a.dat right +[ 27, 50 ] = ascii (fp) : "./hrtfs/elev45/L45e110a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e110a.dat right +[ 27, 51 ] = ascii (fp) : "./hrtfs/elev45/L45e105a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e105a.dat right +[ 27, 52 ] = ascii (fp) : "./hrtfs/elev45/L45e100a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e100a.dat right +[ 27, 53 ] = ascii (fp) : "./hrtfs/elev45/L45e095a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e095a.dat right +[ 27, 54 ] = ascii (fp) : "./hrtfs/elev45/L45e090a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e090a.dat right +[ 27, 55 ] = ascii (fp) : "./hrtfs/elev45/L45e085a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e085a.dat right +[ 27, 56 ] = ascii (fp) : "./hrtfs/elev45/L45e080a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e080a.dat right +[ 27, 57 ] = ascii (fp) : "./hrtfs/elev45/L45e075a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e075a.dat right +[ 27, 58 ] = ascii (fp) : "./hrtfs/elev45/L45e070a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e070a.dat right +[ 27, 59 ] = ascii (fp) : "./hrtfs/elev45/L45e065a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e065a.dat right +[ 27, 60 ] = ascii (fp) : "./hrtfs/elev45/L45e060a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e060a.dat right +[ 27, 61 ] = ascii (fp) : "./hrtfs/elev45/L45e055a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e055a.dat right +[ 27, 62 ] = ascii (fp) : "./hrtfs/elev45/L45e050a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e050a.dat right +[ 27, 63 ] = ascii (fp) : "./hrtfs/elev45/L45e045a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e045a.dat right +[ 27, 64 ] = ascii (fp) : "./hrtfs/elev45/L45e040a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e040a.dat right +[ 27, 65 ] = ascii (fp) : "./hrtfs/elev45/L45e035a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e035a.dat right +[ 27, 66 ] = ascii (fp) : "./hrtfs/elev45/L45e030a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e030a.dat right +[ 27, 67 ] = ascii (fp) : "./hrtfs/elev45/L45e025a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e025a.dat right +[ 27, 68 ] = ascii (fp) : "./hrtfs/elev45/L45e020a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e020a.dat right +[ 27, 69 ] = ascii (fp) : "./hrtfs/elev45/L45e015a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e015a.dat right +[ 27, 70 ] = ascii (fp) : "./hrtfs/elev45/L45e010a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e010a.dat right +[ 27, 71 ] = ascii (fp) : "./hrtfs/elev45/L45e005a.dat left + + ascii (fp) : "./hrtfs/elev45/R45e005a.dat right + +[ 28, 0 ] = ascii (fp) : "./hrtfs/elev50/L50e000a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e000a.dat right +[ 28, 1 ] = ascii (fp) : "./hrtfs/elev50/L50e355a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e355a.dat right +[ 28, 2 ] = ascii (fp) : "./hrtfs/elev50/L50e350a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e350a.dat right +[ 28, 3 ] = ascii (fp) : "./hrtfs/elev50/L50e345a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e345a.dat right +[ 28, 4 ] = ascii (fp) : "./hrtfs/elev50/L50e340a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e340a.dat right +[ 28, 5 ] = ascii (fp) : "./hrtfs/elev50/L50e335a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e335a.dat right +[ 28, 6 ] = ascii (fp) : "./hrtfs/elev50/L50e330a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e330a.dat right +[ 28, 7 ] = ascii (fp) : "./hrtfs/elev50/L50e325a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e325a.dat right +[ 28, 8 ] = ascii (fp) : "./hrtfs/elev50/L50e320a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e320a.dat right +[ 28, 9 ] = ascii (fp) : "./hrtfs/elev50/L50e315a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e315a.dat right +[ 28, 10 ] = ascii (fp) : "./hrtfs/elev50/L50e310a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e310a.dat right +[ 28, 11 ] = ascii (fp) : "./hrtfs/elev50/L50e305a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e305a.dat right +[ 28, 12 ] = ascii (fp) : "./hrtfs/elev50/L50e300a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e300a.dat right +[ 28, 13 ] = ascii (fp) : "./hrtfs/elev50/L50e295a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e295a.dat right +[ 28, 14 ] = ascii (fp) : "./hrtfs/elev50/L50e290a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e290a.dat right +[ 28, 15 ] = ascii (fp) : "./hrtfs/elev50/L50e285a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e285a.dat right +[ 28, 16 ] = ascii (fp) : "./hrtfs/elev50/L50e280a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e280a.dat right +[ 28, 17 ] = ascii (fp) : "./hrtfs/elev50/L50e275a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e275a.dat right +[ 28, 18 ] = ascii (fp) : "./hrtfs/elev50/L50e270a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e270a.dat right +[ 28, 19 ] = ascii (fp) : "./hrtfs/elev50/L50e265a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e265a.dat right +[ 28, 20 ] = ascii (fp) : "./hrtfs/elev50/L50e260a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e260a.dat right +[ 28, 21 ] = ascii (fp) : "./hrtfs/elev50/L50e255a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e255a.dat right +[ 28, 22 ] = ascii (fp) : "./hrtfs/elev50/L50e250a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e250a.dat right +[ 28, 23 ] = ascii (fp) : "./hrtfs/elev50/L50e245a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e245a.dat right +[ 28, 24 ] = ascii (fp) : "./hrtfs/elev50/L50e240a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e240a.dat right +[ 28, 25 ] = ascii (fp) : "./hrtfs/elev50/L50e235a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e235a.dat right +[ 28, 26 ] = ascii (fp) : "./hrtfs/elev50/L50e230a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e230a.dat right +[ 28, 27 ] = ascii (fp) : "./hrtfs/elev50/L50e225a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e225a.dat right +[ 28, 28 ] = ascii (fp) : "./hrtfs/elev50/L50e220a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e220a.dat right +[ 28, 29 ] = ascii (fp) : "./hrtfs/elev50/L50e215a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e215a.dat right +[ 28, 30 ] = ascii (fp) : "./hrtfs/elev50/L50e210a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e210a.dat right +[ 28, 31 ] = ascii (fp) : "./hrtfs/elev50/L50e205a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e205a.dat right +[ 28, 32 ] = ascii (fp) : "./hrtfs/elev50/L50e200a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e200a.dat right +[ 28, 33 ] = ascii (fp) : "./hrtfs/elev50/L50e195a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e195a.dat right +[ 28, 34 ] = ascii (fp) : "./hrtfs/elev50/L50e190a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e190a.dat right +[ 28, 35 ] = ascii (fp) : "./hrtfs/elev50/L50e185a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e185a.dat right +[ 28, 36 ] = ascii (fp) : "./hrtfs/elev50/L50e180a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e180a.dat right +[ 28, 37 ] = ascii (fp) : "./hrtfs/elev50/L50e175a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e175a.dat right +[ 28, 38 ] = ascii (fp) : "./hrtfs/elev50/L50e170a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e170a.dat right +[ 28, 39 ] = ascii (fp) : "./hrtfs/elev50/L50e165a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e165a.dat right +[ 28, 40 ] = ascii (fp) : "./hrtfs/elev50/L50e160a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e160a.dat right +[ 28, 41 ] = ascii (fp) : "./hrtfs/elev50/L50e155a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e155a.dat right +[ 28, 42 ] = ascii (fp) : "./hrtfs/elev50/L50e150a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e150a.dat right +[ 28, 43 ] = ascii (fp) : "./hrtfs/elev50/L50e145a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e145a.dat right +[ 28, 44 ] = ascii (fp) : "./hrtfs/elev50/L50e140a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e140a.dat right +[ 28, 45 ] = ascii (fp) : "./hrtfs/elev50/L50e135a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e135a.dat right +[ 28, 46 ] = ascii (fp) : "./hrtfs/elev50/L50e130a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e130a.dat right +[ 28, 47 ] = ascii (fp) : "./hrtfs/elev50/L50e125a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e125a.dat right +[ 28, 48 ] = ascii (fp) : "./hrtfs/elev50/L50e120a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e120a.dat right +[ 28, 49 ] = ascii (fp) : "./hrtfs/elev50/L50e115a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e115a.dat right +[ 28, 50 ] = ascii (fp) : "./hrtfs/elev50/L50e110a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e110a.dat right +[ 28, 51 ] = ascii (fp) : "./hrtfs/elev50/L50e105a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e105a.dat right +[ 28, 52 ] = ascii (fp) : "./hrtfs/elev50/L50e100a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e100a.dat right +[ 28, 53 ] = ascii (fp) : "./hrtfs/elev50/L50e095a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e095a.dat right +[ 28, 54 ] = ascii (fp) : "./hrtfs/elev50/L50e090a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e090a.dat right +[ 28, 55 ] = ascii (fp) : "./hrtfs/elev50/L50e085a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e085a.dat right +[ 28, 56 ] = ascii (fp) : "./hrtfs/elev50/L50e080a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e080a.dat right +[ 28, 57 ] = ascii (fp) : "./hrtfs/elev50/L50e075a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e075a.dat right +[ 28, 58 ] = ascii (fp) : "./hrtfs/elev50/L50e070a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e070a.dat right +[ 28, 59 ] = ascii (fp) : "./hrtfs/elev50/L50e065a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e065a.dat right +[ 28, 60 ] = ascii (fp) : "./hrtfs/elev50/L50e060a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e060a.dat right +[ 28, 61 ] = ascii (fp) : "./hrtfs/elev50/L50e055a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e055a.dat right +[ 28, 62 ] = ascii (fp) : "./hrtfs/elev50/L50e050a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e050a.dat right +[ 28, 63 ] = ascii (fp) : "./hrtfs/elev50/L50e045a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e045a.dat right +[ 28, 64 ] = ascii (fp) : "./hrtfs/elev50/L50e040a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e040a.dat right +[ 28, 65 ] = ascii (fp) : "./hrtfs/elev50/L50e035a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e035a.dat right +[ 28, 66 ] = ascii (fp) : "./hrtfs/elev50/L50e030a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e030a.dat right +[ 28, 67 ] = ascii (fp) : "./hrtfs/elev50/L50e025a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e025a.dat right +[ 28, 68 ] = ascii (fp) : "./hrtfs/elev50/L50e020a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e020a.dat right +[ 28, 69 ] = ascii (fp) : "./hrtfs/elev50/L50e015a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e015a.dat right +[ 28, 70 ] = ascii (fp) : "./hrtfs/elev50/L50e010a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e010a.dat right +[ 28, 71 ] = ascii (fp) : "./hrtfs/elev50/L50e005a.dat left + + ascii (fp) : "./hrtfs/elev50/R50e005a.dat right + +[ 29, 0 ] = ascii (fp) : "./hrtfs/elev55/L55e000a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e000a.dat right +[ 29, 1 ] = ascii (fp) : "./hrtfs/elev55/L55e355a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e355a.dat right +[ 29, 2 ] = ascii (fp) : "./hrtfs/elev55/L55e350a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e350a.dat right +[ 29, 3 ] = ascii (fp) : "./hrtfs/elev55/L55e345a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e345a.dat right +[ 29, 4 ] = ascii (fp) : "./hrtfs/elev55/L55e340a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e340a.dat right +[ 29, 5 ] = ascii (fp) : "./hrtfs/elev55/L55e335a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e335a.dat right +[ 29, 6 ] = ascii (fp) : "./hrtfs/elev55/L55e330a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e330a.dat right +[ 29, 7 ] = ascii (fp) : "./hrtfs/elev55/L55e325a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e325a.dat right +[ 29, 8 ] = ascii (fp) : "./hrtfs/elev55/L55e320a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e320a.dat right +[ 29, 9 ] = ascii (fp) : "./hrtfs/elev55/L55e315a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e315a.dat right +[ 29, 10 ] = ascii (fp) : "./hrtfs/elev55/L55e310a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e310a.dat right +[ 29, 11 ] = ascii (fp) : "./hrtfs/elev55/L55e305a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e305a.dat right +[ 29, 12 ] = ascii (fp) : "./hrtfs/elev55/L55e300a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e300a.dat right +[ 29, 13 ] = ascii (fp) : "./hrtfs/elev55/L55e295a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e295a.dat right +[ 29, 14 ] = ascii (fp) : "./hrtfs/elev55/L55e290a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e290a.dat right +[ 29, 15 ] = ascii (fp) : "./hrtfs/elev55/L55e285a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e285a.dat right +[ 29, 16 ] = ascii (fp) : "./hrtfs/elev55/L55e280a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e280a.dat right +[ 29, 17 ] = ascii (fp) : "./hrtfs/elev55/L55e275a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e275a.dat right +[ 29, 18 ] = ascii (fp) : "./hrtfs/elev55/L55e270a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e270a.dat right +[ 29, 19 ] = ascii (fp) : "./hrtfs/elev55/L55e265a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e265a.dat right +[ 29, 20 ] = ascii (fp) : "./hrtfs/elev55/L55e260a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e260a.dat right +[ 29, 21 ] = ascii (fp) : "./hrtfs/elev55/L55e255a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e255a.dat right +[ 29, 22 ] = ascii (fp) : "./hrtfs/elev55/L55e250a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e250a.dat right +[ 29, 23 ] = ascii (fp) : "./hrtfs/elev55/L55e245a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e245a.dat right +[ 29, 24 ] = ascii (fp) : "./hrtfs/elev55/L55e240a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e240a.dat right +[ 29, 25 ] = ascii (fp) : "./hrtfs/elev55/L55e235a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e235a.dat right +[ 29, 26 ] = ascii (fp) : "./hrtfs/elev55/L55e230a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e230a.dat right +[ 29, 27 ] = ascii (fp) : "./hrtfs/elev55/L55e225a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e225a.dat right +[ 29, 28 ] = ascii (fp) : "./hrtfs/elev55/L55e220a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e220a.dat right +[ 29, 29 ] = ascii (fp) : "./hrtfs/elev55/L55e215a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e215a.dat right +[ 29, 30 ] = ascii (fp) : "./hrtfs/elev55/L55e210a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e210a.dat right +[ 29, 31 ] = ascii (fp) : "./hrtfs/elev55/L55e205a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e205a.dat right +[ 29, 32 ] = ascii (fp) : "./hrtfs/elev55/L55e200a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e200a.dat right +[ 29, 33 ] = ascii (fp) : "./hrtfs/elev55/L55e195a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e195a.dat right +[ 29, 34 ] = ascii (fp) : "./hrtfs/elev55/L55e190a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e190a.dat right +[ 29, 35 ] = ascii (fp) : "./hrtfs/elev55/L55e185a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e185a.dat right +[ 29, 36 ] = ascii (fp) : "./hrtfs/elev55/L55e180a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e180a.dat right +[ 29, 37 ] = ascii (fp) : "./hrtfs/elev55/L55e175a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e175a.dat right +[ 29, 38 ] = ascii (fp) : "./hrtfs/elev55/L55e170a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e170a.dat right +[ 29, 39 ] = ascii (fp) : "./hrtfs/elev55/L55e165a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e165a.dat right +[ 29, 40 ] = ascii (fp) : "./hrtfs/elev55/L55e160a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e160a.dat right +[ 29, 41 ] = ascii (fp) : "./hrtfs/elev55/L55e155a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e155a.dat right +[ 29, 42 ] = ascii (fp) : "./hrtfs/elev55/L55e150a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e150a.dat right +[ 29, 43 ] = ascii (fp) : "./hrtfs/elev55/L55e145a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e145a.dat right +[ 29, 44 ] = ascii (fp) : "./hrtfs/elev55/L55e140a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e140a.dat right +[ 29, 45 ] = ascii (fp) : "./hrtfs/elev55/L55e135a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e135a.dat right +[ 29, 46 ] = ascii (fp) : "./hrtfs/elev55/L55e130a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e130a.dat right +[ 29, 47 ] = ascii (fp) : "./hrtfs/elev55/L55e125a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e125a.dat right +[ 29, 48 ] = ascii (fp) : "./hrtfs/elev55/L55e120a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e120a.dat right +[ 29, 49 ] = ascii (fp) : "./hrtfs/elev55/L55e115a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e115a.dat right +[ 29, 50 ] = ascii (fp) : "./hrtfs/elev55/L55e110a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e110a.dat right +[ 29, 51 ] = ascii (fp) : "./hrtfs/elev55/L55e105a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e105a.dat right +[ 29, 52 ] = ascii (fp) : "./hrtfs/elev55/L55e100a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e100a.dat right +[ 29, 53 ] = ascii (fp) : "./hrtfs/elev55/L55e095a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e095a.dat right +[ 29, 54 ] = ascii (fp) : "./hrtfs/elev55/L55e090a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e090a.dat right +[ 29, 55 ] = ascii (fp) : "./hrtfs/elev55/L55e085a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e085a.dat right +[ 29, 56 ] = ascii (fp) : "./hrtfs/elev55/L55e080a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e080a.dat right +[ 29, 57 ] = ascii (fp) : "./hrtfs/elev55/L55e075a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e075a.dat right +[ 29, 58 ] = ascii (fp) : "./hrtfs/elev55/L55e070a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e070a.dat right +[ 29, 59 ] = ascii (fp) : "./hrtfs/elev55/L55e065a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e065a.dat right +[ 29, 60 ] = ascii (fp) : "./hrtfs/elev55/L55e060a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e060a.dat right +[ 29, 61 ] = ascii (fp) : "./hrtfs/elev55/L55e055a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e055a.dat right +[ 29, 62 ] = ascii (fp) : "./hrtfs/elev55/L55e050a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e050a.dat right +[ 29, 63 ] = ascii (fp) : "./hrtfs/elev55/L55e045a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e045a.dat right +[ 29, 64 ] = ascii (fp) : "./hrtfs/elev55/L55e040a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e040a.dat right +[ 29, 65 ] = ascii (fp) : "./hrtfs/elev55/L55e035a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e035a.dat right +[ 29, 66 ] = ascii (fp) : "./hrtfs/elev55/L55e030a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e030a.dat right +[ 29, 67 ] = ascii (fp) : "./hrtfs/elev55/L55e025a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e025a.dat right +[ 29, 68 ] = ascii (fp) : "./hrtfs/elev55/L55e020a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e020a.dat right +[ 29, 69 ] = ascii (fp) : "./hrtfs/elev55/L55e015a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e015a.dat right +[ 29, 70 ] = ascii (fp) : "./hrtfs/elev55/L55e010a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e010a.dat right +[ 29, 71 ] = ascii (fp) : "./hrtfs/elev55/L55e005a.dat left + + ascii (fp) : "./hrtfs/elev55/R55e005a.dat right + +[ 30, 0 ] = ascii (fp) : "./hrtfs/elev60/L60e000a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e000a.dat right +[ 30, 1 ] = ascii (fp) : "./hrtfs/elev60/L60e355a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e355a.dat right +[ 30, 2 ] = ascii (fp) : "./hrtfs/elev60/L60e350a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e350a.dat right +[ 30, 3 ] = ascii (fp) : "./hrtfs/elev60/L60e345a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e345a.dat right +[ 30, 4 ] = ascii (fp) : "./hrtfs/elev60/L60e340a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e340a.dat right +[ 30, 5 ] = ascii (fp) : "./hrtfs/elev60/L60e335a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e335a.dat right +[ 30, 6 ] = ascii (fp) : "./hrtfs/elev60/L60e330a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e330a.dat right +[ 30, 7 ] = ascii (fp) : "./hrtfs/elev60/L60e325a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e325a.dat right +[ 30, 8 ] = ascii (fp) : "./hrtfs/elev60/L60e320a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e320a.dat right +[ 30, 9 ] = ascii (fp) : "./hrtfs/elev60/L60e315a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e315a.dat right +[ 30, 10 ] = ascii (fp) : "./hrtfs/elev60/L60e310a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e310a.dat right +[ 30, 11 ] = ascii (fp) : "./hrtfs/elev60/L60e305a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e305a.dat right +[ 30, 12 ] = ascii (fp) : "./hrtfs/elev60/L60e300a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e300a.dat right +[ 30, 13 ] = ascii (fp) : "./hrtfs/elev60/L60e295a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e295a.dat right +[ 30, 14 ] = ascii (fp) : "./hrtfs/elev60/L60e290a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e290a.dat right +[ 30, 15 ] = ascii (fp) : "./hrtfs/elev60/L60e285a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e285a.dat right +[ 30, 16 ] = ascii (fp) : "./hrtfs/elev60/L60e280a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e280a.dat right +[ 30, 17 ] = ascii (fp) : "./hrtfs/elev60/L60e275a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e275a.dat right +[ 30, 18 ] = ascii (fp) : "./hrtfs/elev60/L60e270a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e270a.dat right +[ 30, 19 ] = ascii (fp) : "./hrtfs/elev60/L60e265a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e265a.dat right +[ 30, 20 ] = ascii (fp) : "./hrtfs/elev60/L60e260a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e260a.dat right +[ 30, 21 ] = ascii (fp) : "./hrtfs/elev60/L60e255a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e255a.dat right +[ 30, 22 ] = ascii (fp) : "./hrtfs/elev60/L60e250a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e250a.dat right +[ 30, 23 ] = ascii (fp) : "./hrtfs/elev60/L60e245a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e245a.dat right +[ 30, 24 ] = ascii (fp) : "./hrtfs/elev60/L60e240a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e240a.dat right +[ 30, 25 ] = ascii (fp) : "./hrtfs/elev60/L60e235a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e235a.dat right +[ 30, 26 ] = ascii (fp) : "./hrtfs/elev60/L60e230a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e230a.dat right +[ 30, 27 ] = ascii (fp) : "./hrtfs/elev60/L60e225a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e225a.dat right +[ 30, 28 ] = ascii (fp) : "./hrtfs/elev60/L60e220a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e220a.dat right +[ 30, 29 ] = ascii (fp) : "./hrtfs/elev60/L60e215a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e215a.dat right +[ 30, 30 ] = ascii (fp) : "./hrtfs/elev60/L60e210a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e210a.dat right +[ 30, 31 ] = ascii (fp) : "./hrtfs/elev60/L60e205a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e205a.dat right +[ 30, 32 ] = ascii (fp) : "./hrtfs/elev60/L60e200a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e200a.dat right +[ 30, 33 ] = ascii (fp) : "./hrtfs/elev60/L60e195a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e195a.dat right +[ 30, 34 ] = ascii (fp) : "./hrtfs/elev60/L60e190a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e190a.dat right +[ 30, 35 ] = ascii (fp) : "./hrtfs/elev60/L60e185a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e185a.dat right +[ 30, 36 ] = ascii (fp) : "./hrtfs/elev60/L60e180a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e180a.dat right +[ 30, 37 ] = ascii (fp) : "./hrtfs/elev60/L60e175a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e175a.dat right +[ 30, 38 ] = ascii (fp) : "./hrtfs/elev60/L60e170a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e170a.dat right +[ 30, 39 ] = ascii (fp) : "./hrtfs/elev60/L60e165a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e165a.dat right +[ 30, 40 ] = ascii (fp) : "./hrtfs/elev60/L60e160a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e160a.dat right +[ 30, 41 ] = ascii (fp) : "./hrtfs/elev60/L60e155a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e155a.dat right +[ 30, 42 ] = ascii (fp) : "./hrtfs/elev60/L60e150a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e150a.dat right +[ 30, 43 ] = ascii (fp) : "./hrtfs/elev60/L60e145a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e145a.dat right +[ 30, 44 ] = ascii (fp) : "./hrtfs/elev60/L60e140a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e140a.dat right +[ 30, 45 ] = ascii (fp) : "./hrtfs/elev60/L60e135a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e135a.dat right +[ 30, 46 ] = ascii (fp) : "./hrtfs/elev60/L60e130a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e130a.dat right +[ 30, 47 ] = ascii (fp) : "./hrtfs/elev60/L60e125a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e125a.dat right +[ 30, 48 ] = ascii (fp) : "./hrtfs/elev60/L60e120a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e120a.dat right +[ 30, 49 ] = ascii (fp) : "./hrtfs/elev60/L60e115a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e115a.dat right +[ 30, 50 ] = ascii (fp) : "./hrtfs/elev60/L60e110a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e110a.dat right +[ 30, 51 ] = ascii (fp) : "./hrtfs/elev60/L60e105a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e105a.dat right +[ 30, 52 ] = ascii (fp) : "./hrtfs/elev60/L60e100a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e100a.dat right +[ 30, 53 ] = ascii (fp) : "./hrtfs/elev60/L60e095a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e095a.dat right +[ 30, 54 ] = ascii (fp) : "./hrtfs/elev60/L60e090a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e090a.dat right +[ 30, 55 ] = ascii (fp) : "./hrtfs/elev60/L60e085a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e085a.dat right +[ 30, 56 ] = ascii (fp) : "./hrtfs/elev60/L60e080a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e080a.dat right +[ 30, 57 ] = ascii (fp) : "./hrtfs/elev60/L60e075a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e075a.dat right +[ 30, 58 ] = ascii (fp) : "./hrtfs/elev60/L60e070a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e070a.dat right +[ 30, 59 ] = ascii (fp) : "./hrtfs/elev60/L60e065a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e065a.dat right +[ 30, 60 ] = ascii (fp) : "./hrtfs/elev60/L60e060a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e060a.dat right +[ 30, 61 ] = ascii (fp) : "./hrtfs/elev60/L60e055a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e055a.dat right +[ 30, 62 ] = ascii (fp) : "./hrtfs/elev60/L60e050a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e050a.dat right +[ 30, 63 ] = ascii (fp) : "./hrtfs/elev60/L60e045a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e045a.dat right +[ 30, 64 ] = ascii (fp) : "./hrtfs/elev60/L60e040a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e040a.dat right +[ 30, 65 ] = ascii (fp) : "./hrtfs/elev60/L60e035a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e035a.dat right +[ 30, 66 ] = ascii (fp) : "./hrtfs/elev60/L60e030a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e030a.dat right +[ 30, 67 ] = ascii (fp) : "./hrtfs/elev60/L60e025a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e025a.dat right +[ 30, 68 ] = ascii (fp) : "./hrtfs/elev60/L60e020a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e020a.dat right +[ 30, 69 ] = ascii (fp) : "./hrtfs/elev60/L60e015a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e015a.dat right +[ 30, 70 ] = ascii (fp) : "./hrtfs/elev60/L60e010a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e010a.dat right +[ 30, 71 ] = ascii (fp) : "./hrtfs/elev60/L60e005a.dat left + + ascii (fp) : "./hrtfs/elev60/R60e005a.dat right + +[ 31, 0 ] = ascii (fp) : "./hrtfs/elev65/L65e000a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e000a.dat right +[ 31, 1 ] = ascii (fp) : "./hrtfs/elev65/L65e355a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e355a.dat right +[ 31, 2 ] = ascii (fp) : "./hrtfs/elev65/L65e350a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e350a.dat right +[ 31, 3 ] = ascii (fp) : "./hrtfs/elev65/L65e345a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e345a.dat right +[ 31, 4 ] = ascii (fp) : "./hrtfs/elev65/L65e340a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e340a.dat right +[ 31, 5 ] = ascii (fp) : "./hrtfs/elev65/L65e335a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e335a.dat right +[ 31, 6 ] = ascii (fp) : "./hrtfs/elev65/L65e330a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e330a.dat right +[ 31, 7 ] = ascii (fp) : "./hrtfs/elev65/L65e325a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e325a.dat right +[ 31, 8 ] = ascii (fp) : "./hrtfs/elev65/L65e320a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e320a.dat right +[ 31, 9 ] = ascii (fp) : "./hrtfs/elev65/L65e315a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e315a.dat right +[ 31, 10 ] = ascii (fp) : "./hrtfs/elev65/L65e310a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e310a.dat right +[ 31, 11 ] = ascii (fp) : "./hrtfs/elev65/L65e305a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e305a.dat right +[ 31, 12 ] = ascii (fp) : "./hrtfs/elev65/L65e300a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e300a.dat right +[ 31, 13 ] = ascii (fp) : "./hrtfs/elev65/L65e295a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e295a.dat right +[ 31, 14 ] = ascii (fp) : "./hrtfs/elev65/L65e290a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e290a.dat right +[ 31, 15 ] = ascii (fp) : "./hrtfs/elev65/L65e285a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e285a.dat right +[ 31, 16 ] = ascii (fp) : "./hrtfs/elev65/L65e280a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e280a.dat right +[ 31, 17 ] = ascii (fp) : "./hrtfs/elev65/L65e275a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e275a.dat right +[ 31, 18 ] = ascii (fp) : "./hrtfs/elev65/L65e270a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e270a.dat right +[ 31, 19 ] = ascii (fp) : "./hrtfs/elev65/L65e265a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e265a.dat right +[ 31, 20 ] = ascii (fp) : "./hrtfs/elev65/L65e260a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e260a.dat right +[ 31, 21 ] = ascii (fp) : "./hrtfs/elev65/L65e255a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e255a.dat right +[ 31, 22 ] = ascii (fp) : "./hrtfs/elev65/L65e250a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e250a.dat right +[ 31, 23 ] = ascii (fp) : "./hrtfs/elev65/L65e245a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e245a.dat right +[ 31, 24 ] = ascii (fp) : "./hrtfs/elev65/L65e240a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e240a.dat right +[ 31, 25 ] = ascii (fp) : "./hrtfs/elev65/L65e235a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e235a.dat right +[ 31, 26 ] = ascii (fp) : "./hrtfs/elev65/L65e230a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e230a.dat right +[ 31, 27 ] = ascii (fp) : "./hrtfs/elev65/L65e225a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e225a.dat right +[ 31, 28 ] = ascii (fp) : "./hrtfs/elev65/L65e220a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e220a.dat right +[ 31, 29 ] = ascii (fp) : "./hrtfs/elev65/L65e215a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e215a.dat right +[ 31, 30 ] = ascii (fp) : "./hrtfs/elev65/L65e210a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e210a.dat right +[ 31, 31 ] = ascii (fp) : "./hrtfs/elev65/L65e205a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e205a.dat right +[ 31, 32 ] = ascii (fp) : "./hrtfs/elev65/L65e200a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e200a.dat right +[ 31, 33 ] = ascii (fp) : "./hrtfs/elev65/L65e195a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e195a.dat right +[ 31, 34 ] = ascii (fp) : "./hrtfs/elev65/L65e190a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e190a.dat right +[ 31, 35 ] = ascii (fp) : "./hrtfs/elev65/L65e185a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e185a.dat right +[ 31, 36 ] = ascii (fp) : "./hrtfs/elev65/L65e180a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e180a.dat right +[ 31, 37 ] = ascii (fp) : "./hrtfs/elev65/L65e175a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e175a.dat right +[ 31, 38 ] = ascii (fp) : "./hrtfs/elev65/L65e170a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e170a.dat right +[ 31, 39 ] = ascii (fp) : "./hrtfs/elev65/L65e165a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e165a.dat right +[ 31, 40 ] = ascii (fp) : "./hrtfs/elev65/L65e160a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e160a.dat right +[ 31, 41 ] = ascii (fp) : "./hrtfs/elev65/L65e155a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e155a.dat right +[ 31, 42 ] = ascii (fp) : "./hrtfs/elev65/L65e150a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e150a.dat right +[ 31, 43 ] = ascii (fp) : "./hrtfs/elev65/L65e145a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e145a.dat right +[ 31, 44 ] = ascii (fp) : "./hrtfs/elev65/L65e140a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e140a.dat right +[ 31, 45 ] = ascii (fp) : "./hrtfs/elev65/L65e135a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e135a.dat right +[ 31, 46 ] = ascii (fp) : "./hrtfs/elev65/L65e130a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e130a.dat right +[ 31, 47 ] = ascii (fp) : "./hrtfs/elev65/L65e125a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e125a.dat right +[ 31, 48 ] = ascii (fp) : "./hrtfs/elev65/L65e120a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e120a.dat right +[ 31, 49 ] = ascii (fp) : "./hrtfs/elev65/L65e115a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e115a.dat right +[ 31, 50 ] = ascii (fp) : "./hrtfs/elev65/L65e110a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e110a.dat right +[ 31, 51 ] = ascii (fp) : "./hrtfs/elev65/L65e105a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e105a.dat right +[ 31, 52 ] = ascii (fp) : "./hrtfs/elev65/L65e100a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e100a.dat right +[ 31, 53 ] = ascii (fp) : "./hrtfs/elev65/L65e095a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e095a.dat right +[ 31, 54 ] = ascii (fp) : "./hrtfs/elev65/L65e090a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e090a.dat right +[ 31, 55 ] = ascii (fp) : "./hrtfs/elev65/L65e085a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e085a.dat right +[ 31, 56 ] = ascii (fp) : "./hrtfs/elev65/L65e080a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e080a.dat right +[ 31, 57 ] = ascii (fp) : "./hrtfs/elev65/L65e075a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e075a.dat right +[ 31, 58 ] = ascii (fp) : "./hrtfs/elev65/L65e070a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e070a.dat right +[ 31, 59 ] = ascii (fp) : "./hrtfs/elev65/L65e065a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e065a.dat right +[ 31, 60 ] = ascii (fp) : "./hrtfs/elev65/L65e060a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e060a.dat right +[ 31, 61 ] = ascii (fp) : "./hrtfs/elev65/L65e055a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e055a.dat right +[ 31, 62 ] = ascii (fp) : "./hrtfs/elev65/L65e050a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e050a.dat right +[ 31, 63 ] = ascii (fp) : "./hrtfs/elev65/L65e045a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e045a.dat right +[ 31, 64 ] = ascii (fp) : "./hrtfs/elev65/L65e040a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e040a.dat right +[ 31, 65 ] = ascii (fp) : "./hrtfs/elev65/L65e035a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e035a.dat right +[ 31, 66 ] = ascii (fp) : "./hrtfs/elev65/L65e030a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e030a.dat right +[ 31, 67 ] = ascii (fp) : "./hrtfs/elev65/L65e025a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e025a.dat right +[ 31, 68 ] = ascii (fp) : "./hrtfs/elev65/L65e020a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e020a.dat right +[ 31, 69 ] = ascii (fp) : "./hrtfs/elev65/L65e015a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e015a.dat right +[ 31, 70 ] = ascii (fp) : "./hrtfs/elev65/L65e010a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e010a.dat right +[ 31, 71 ] = ascii (fp) : "./hrtfs/elev65/L65e005a.dat left + + ascii (fp) : "./hrtfs/elev65/R65e005a.dat right + +[ 32, 0 ] = ascii (fp) : "./hrtfs/elev70/L70e000a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e000a.dat right +[ 32, 1 ] = ascii (fp) : "./hrtfs/elev70/L70e355a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e355a.dat right +[ 32, 2 ] = ascii (fp) : "./hrtfs/elev70/L70e350a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e350a.dat right +[ 32, 3 ] = ascii (fp) : "./hrtfs/elev70/L70e345a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e345a.dat right +[ 32, 4 ] = ascii (fp) : "./hrtfs/elev70/L70e340a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e340a.dat right +[ 32, 5 ] = ascii (fp) : "./hrtfs/elev70/L70e335a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e335a.dat right +[ 32, 6 ] = ascii (fp) : "./hrtfs/elev70/L70e330a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e330a.dat right +[ 32, 7 ] = ascii (fp) : "./hrtfs/elev70/L70e325a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e325a.dat right +[ 32, 8 ] = ascii (fp) : "./hrtfs/elev70/L70e320a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e320a.dat right +[ 32, 9 ] = ascii (fp) : "./hrtfs/elev70/L70e315a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e315a.dat right +[ 32, 10 ] = ascii (fp) : "./hrtfs/elev70/L70e310a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e310a.dat right +[ 32, 11 ] = ascii (fp) : "./hrtfs/elev70/L70e305a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e305a.dat right +[ 32, 12 ] = ascii (fp) : "./hrtfs/elev70/L70e300a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e300a.dat right +[ 32, 13 ] = ascii (fp) : "./hrtfs/elev70/L70e295a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e295a.dat right +[ 32, 14 ] = ascii (fp) : "./hrtfs/elev70/L70e290a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e290a.dat right +[ 32, 15 ] = ascii (fp) : "./hrtfs/elev70/L70e285a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e285a.dat right +[ 32, 16 ] = ascii (fp) : "./hrtfs/elev70/L70e280a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e280a.dat right +[ 32, 17 ] = ascii (fp) : "./hrtfs/elev70/L70e275a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e275a.dat right +[ 32, 18 ] = ascii (fp) : "./hrtfs/elev70/L70e270a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e270a.dat right +[ 32, 19 ] = ascii (fp) : "./hrtfs/elev70/L70e265a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e265a.dat right +[ 32, 20 ] = ascii (fp) : "./hrtfs/elev70/L70e260a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e260a.dat right +[ 32, 21 ] = ascii (fp) : "./hrtfs/elev70/L70e255a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e255a.dat right +[ 32, 22 ] = ascii (fp) : "./hrtfs/elev70/L70e250a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e250a.dat right +[ 32, 23 ] = ascii (fp) : "./hrtfs/elev70/L70e245a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e245a.dat right +[ 32, 24 ] = ascii (fp) : "./hrtfs/elev70/L70e240a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e240a.dat right +[ 32, 25 ] = ascii (fp) : "./hrtfs/elev70/L70e235a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e235a.dat right +[ 32, 26 ] = ascii (fp) : "./hrtfs/elev70/L70e230a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e230a.dat right +[ 32, 27 ] = ascii (fp) : "./hrtfs/elev70/L70e225a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e225a.dat right +[ 32, 28 ] = ascii (fp) : "./hrtfs/elev70/L70e220a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e220a.dat right +[ 32, 29 ] = ascii (fp) : "./hrtfs/elev70/L70e215a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e215a.dat right +[ 32, 30 ] = ascii (fp) : "./hrtfs/elev70/L70e210a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e210a.dat right +[ 32, 31 ] = ascii (fp) : "./hrtfs/elev70/L70e205a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e205a.dat right +[ 32, 32 ] = ascii (fp) : "./hrtfs/elev70/L70e200a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e200a.dat right +[ 32, 33 ] = ascii (fp) : "./hrtfs/elev70/L70e195a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e195a.dat right +[ 32, 34 ] = ascii (fp) : "./hrtfs/elev70/L70e190a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e190a.dat right +[ 32, 35 ] = ascii (fp) : "./hrtfs/elev70/L70e185a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e185a.dat right +[ 32, 36 ] = ascii (fp) : "./hrtfs/elev70/L70e180a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e180a.dat right +[ 32, 37 ] = ascii (fp) : "./hrtfs/elev70/L70e175a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e175a.dat right +[ 32, 38 ] = ascii (fp) : "./hrtfs/elev70/L70e170a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e170a.dat right +[ 32, 39 ] = ascii (fp) : "./hrtfs/elev70/L70e165a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e165a.dat right +[ 32, 40 ] = ascii (fp) : "./hrtfs/elev70/L70e160a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e160a.dat right +[ 32, 41 ] = ascii (fp) : "./hrtfs/elev70/L70e155a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e155a.dat right +[ 32, 42 ] = ascii (fp) : "./hrtfs/elev70/L70e150a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e150a.dat right +[ 32, 43 ] = ascii (fp) : "./hrtfs/elev70/L70e145a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e145a.dat right +[ 32, 44 ] = ascii (fp) : "./hrtfs/elev70/L70e140a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e140a.dat right +[ 32, 45 ] = ascii (fp) : "./hrtfs/elev70/L70e135a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e135a.dat right +[ 32, 46 ] = ascii (fp) : "./hrtfs/elev70/L70e130a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e130a.dat right +[ 32, 47 ] = ascii (fp) : "./hrtfs/elev70/L70e125a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e125a.dat right +[ 32, 48 ] = ascii (fp) : "./hrtfs/elev70/L70e120a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e120a.dat right +[ 32, 49 ] = ascii (fp) : "./hrtfs/elev70/L70e115a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e115a.dat right +[ 32, 50 ] = ascii (fp) : "./hrtfs/elev70/L70e110a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e110a.dat right +[ 32, 51 ] = ascii (fp) : "./hrtfs/elev70/L70e105a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e105a.dat right +[ 32, 52 ] = ascii (fp) : "./hrtfs/elev70/L70e100a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e100a.dat right +[ 32, 53 ] = ascii (fp) : "./hrtfs/elev70/L70e095a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e095a.dat right +[ 32, 54 ] = ascii (fp) : "./hrtfs/elev70/L70e090a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e090a.dat right +[ 32, 55 ] = ascii (fp) : "./hrtfs/elev70/L70e085a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e085a.dat right +[ 32, 56 ] = ascii (fp) : "./hrtfs/elev70/L70e080a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e080a.dat right +[ 32, 57 ] = ascii (fp) : "./hrtfs/elev70/L70e075a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e075a.dat right +[ 32, 58 ] = ascii (fp) : "./hrtfs/elev70/L70e070a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e070a.dat right +[ 32, 59 ] = ascii (fp) : "./hrtfs/elev70/L70e065a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e065a.dat right +[ 32, 60 ] = ascii (fp) : "./hrtfs/elev70/L70e060a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e060a.dat right +[ 32, 61 ] = ascii (fp) : "./hrtfs/elev70/L70e055a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e055a.dat right +[ 32, 62 ] = ascii (fp) : "./hrtfs/elev70/L70e050a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e050a.dat right +[ 32, 63 ] = ascii (fp) : "./hrtfs/elev70/L70e045a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e045a.dat right +[ 32, 64 ] = ascii (fp) : "./hrtfs/elev70/L70e040a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e040a.dat right +[ 32, 65 ] = ascii (fp) : "./hrtfs/elev70/L70e035a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e035a.dat right +[ 32, 66 ] = ascii (fp) : "./hrtfs/elev70/L70e030a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e030a.dat right +[ 32, 67 ] = ascii (fp) : "./hrtfs/elev70/L70e025a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e025a.dat right +[ 32, 68 ] = ascii (fp) : "./hrtfs/elev70/L70e020a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e020a.dat right +[ 32, 69 ] = ascii (fp) : "./hrtfs/elev70/L70e015a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e015a.dat right +[ 32, 70 ] = ascii (fp) : "./hrtfs/elev70/L70e010a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e010a.dat right +[ 32, 71 ] = ascii (fp) : "./hrtfs/elev70/L70e005a.dat left + + ascii (fp) : "./hrtfs/elev70/R70e005a.dat right + +[ 33, 0 ] = ascii (fp) : "./hrtfs/elev75/L75e000a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e000a.dat right +[ 33, 1 ] = ascii (fp) : "./hrtfs/elev75/L75e355a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e355a.dat right +[ 33, 2 ] = ascii (fp) : "./hrtfs/elev75/L75e350a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e350a.dat right +[ 33, 3 ] = ascii (fp) : "./hrtfs/elev75/L75e345a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e345a.dat right +[ 33, 4 ] = ascii (fp) : "./hrtfs/elev75/L75e340a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e340a.dat right +[ 33, 5 ] = ascii (fp) : "./hrtfs/elev75/L75e335a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e335a.dat right +[ 33, 6 ] = ascii (fp) : "./hrtfs/elev75/L75e330a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e330a.dat right +[ 33, 7 ] = ascii (fp) : "./hrtfs/elev75/L75e325a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e325a.dat right +[ 33, 8 ] = ascii (fp) : "./hrtfs/elev75/L75e320a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e320a.dat right +[ 33, 9 ] = ascii (fp) : "./hrtfs/elev75/L75e315a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e315a.dat right +[ 33, 10 ] = ascii (fp) : "./hrtfs/elev75/L75e310a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e310a.dat right +[ 33, 11 ] = ascii (fp) : "./hrtfs/elev75/L75e305a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e305a.dat right +[ 33, 12 ] = ascii (fp) : "./hrtfs/elev75/L75e300a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e300a.dat right +[ 33, 13 ] = ascii (fp) : "./hrtfs/elev75/L75e295a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e295a.dat right +[ 33, 14 ] = ascii (fp) : "./hrtfs/elev75/L75e290a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e290a.dat right +[ 33, 15 ] = ascii (fp) : "./hrtfs/elev75/L75e285a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e285a.dat right +[ 33, 16 ] = ascii (fp) : "./hrtfs/elev75/L75e280a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e280a.dat right +[ 33, 17 ] = ascii (fp) : "./hrtfs/elev75/L75e275a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e275a.dat right +[ 33, 18 ] = ascii (fp) : "./hrtfs/elev75/L75e270a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e270a.dat right +[ 33, 19 ] = ascii (fp) : "./hrtfs/elev75/L75e265a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e265a.dat right +[ 33, 20 ] = ascii (fp) : "./hrtfs/elev75/L75e260a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e260a.dat right +[ 33, 21 ] = ascii (fp) : "./hrtfs/elev75/L75e255a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e255a.dat right +[ 33, 22 ] = ascii (fp) : "./hrtfs/elev75/L75e250a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e250a.dat right +[ 33, 23 ] = ascii (fp) : "./hrtfs/elev75/L75e245a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e245a.dat right +[ 33, 24 ] = ascii (fp) : "./hrtfs/elev75/L75e240a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e240a.dat right +[ 33, 25 ] = ascii (fp) : "./hrtfs/elev75/L75e235a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e235a.dat right +[ 33, 26 ] = ascii (fp) : "./hrtfs/elev75/L75e230a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e230a.dat right +[ 33, 27 ] = ascii (fp) : "./hrtfs/elev75/L75e225a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e225a.dat right +[ 33, 28 ] = ascii (fp) : "./hrtfs/elev75/L75e220a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e220a.dat right +[ 33, 29 ] = ascii (fp) : "./hrtfs/elev75/L75e215a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e215a.dat right +[ 33, 30 ] = ascii (fp) : "./hrtfs/elev75/L75e210a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e210a.dat right +[ 33, 31 ] = ascii (fp) : "./hrtfs/elev75/L75e205a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e205a.dat right +[ 33, 32 ] = ascii (fp) : "./hrtfs/elev75/L75e200a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e200a.dat right +[ 33, 33 ] = ascii (fp) : "./hrtfs/elev75/L75e195a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e195a.dat right +[ 33, 34 ] = ascii (fp) : "./hrtfs/elev75/L75e190a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e190a.dat right +[ 33, 35 ] = ascii (fp) : "./hrtfs/elev75/L75e185a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e185a.dat right +[ 33, 36 ] = ascii (fp) : "./hrtfs/elev75/L75e180a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e180a.dat right +[ 33, 37 ] = ascii (fp) : "./hrtfs/elev75/L75e175a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e175a.dat right +[ 33, 38 ] = ascii (fp) : "./hrtfs/elev75/L75e170a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e170a.dat right +[ 33, 39 ] = ascii (fp) : "./hrtfs/elev75/L75e165a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e165a.dat right +[ 33, 40 ] = ascii (fp) : "./hrtfs/elev75/L75e160a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e160a.dat right +[ 33, 41 ] = ascii (fp) : "./hrtfs/elev75/L75e155a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e155a.dat right +[ 33, 42 ] = ascii (fp) : "./hrtfs/elev75/L75e150a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e150a.dat right +[ 33, 43 ] = ascii (fp) : "./hrtfs/elev75/L75e145a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e145a.dat right +[ 33, 44 ] = ascii (fp) : "./hrtfs/elev75/L75e140a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e140a.dat right +[ 33, 45 ] = ascii (fp) : "./hrtfs/elev75/L75e135a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e135a.dat right +[ 33, 46 ] = ascii (fp) : "./hrtfs/elev75/L75e130a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e130a.dat right +[ 33, 47 ] = ascii (fp) : "./hrtfs/elev75/L75e125a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e125a.dat right +[ 33, 48 ] = ascii (fp) : "./hrtfs/elev75/L75e120a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e120a.dat right +[ 33, 49 ] = ascii (fp) : "./hrtfs/elev75/L75e115a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e115a.dat right +[ 33, 50 ] = ascii (fp) : "./hrtfs/elev75/L75e110a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e110a.dat right +[ 33, 51 ] = ascii (fp) : "./hrtfs/elev75/L75e105a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e105a.dat right +[ 33, 52 ] = ascii (fp) : "./hrtfs/elev75/L75e100a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e100a.dat right +[ 33, 53 ] = ascii (fp) : "./hrtfs/elev75/L75e095a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e095a.dat right +[ 33, 54 ] = ascii (fp) : "./hrtfs/elev75/L75e090a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e090a.dat right +[ 33, 55 ] = ascii (fp) : "./hrtfs/elev75/L75e085a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e085a.dat right +[ 33, 56 ] = ascii (fp) : "./hrtfs/elev75/L75e080a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e080a.dat right +[ 33, 57 ] = ascii (fp) : "./hrtfs/elev75/L75e075a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e075a.dat right +[ 33, 58 ] = ascii (fp) : "./hrtfs/elev75/L75e070a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e070a.dat right +[ 33, 59 ] = ascii (fp) : "./hrtfs/elev75/L75e065a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e065a.dat right +[ 33, 60 ] = ascii (fp) : "./hrtfs/elev75/L75e060a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e060a.dat right +[ 33, 61 ] = ascii (fp) : "./hrtfs/elev75/L75e055a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e055a.dat right +[ 33, 62 ] = ascii (fp) : "./hrtfs/elev75/L75e050a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e050a.dat right +[ 33, 63 ] = ascii (fp) : "./hrtfs/elev75/L75e045a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e045a.dat right +[ 33, 64 ] = ascii (fp) : "./hrtfs/elev75/L75e040a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e040a.dat right +[ 33, 65 ] = ascii (fp) : "./hrtfs/elev75/L75e035a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e035a.dat right +[ 33, 66 ] = ascii (fp) : "./hrtfs/elev75/L75e030a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e030a.dat right +[ 33, 67 ] = ascii (fp) : "./hrtfs/elev75/L75e025a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e025a.dat right +[ 33, 68 ] = ascii (fp) : "./hrtfs/elev75/L75e020a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e020a.dat right +[ 33, 69 ] = ascii (fp) : "./hrtfs/elev75/L75e015a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e015a.dat right +[ 33, 70 ] = ascii (fp) : "./hrtfs/elev75/L75e010a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e010a.dat right +[ 33, 71 ] = ascii (fp) : "./hrtfs/elev75/L75e005a.dat left + + ascii (fp) : "./hrtfs/elev75/R75e005a.dat right + +[ 34, 0 ] = ascii (fp) : "./hrtfs/elev80/L80e000a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e000a.dat right +[ 34, 1 ] = ascii (fp) : "./hrtfs/elev80/L80e355a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e355a.dat right +[ 34, 2 ] = ascii (fp) : "./hrtfs/elev80/L80e350a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e350a.dat right +[ 34, 3 ] = ascii (fp) : "./hrtfs/elev80/L80e345a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e345a.dat right +[ 34, 4 ] = ascii (fp) : "./hrtfs/elev80/L80e340a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e340a.dat right +[ 34, 5 ] = ascii (fp) : "./hrtfs/elev80/L80e335a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e335a.dat right +[ 34, 6 ] = ascii (fp) : "./hrtfs/elev80/L80e330a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e330a.dat right +[ 34, 7 ] = ascii (fp) : "./hrtfs/elev80/L80e325a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e325a.dat right +[ 34, 8 ] = ascii (fp) : "./hrtfs/elev80/L80e320a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e320a.dat right +[ 34, 9 ] = ascii (fp) : "./hrtfs/elev80/L80e315a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e315a.dat right +[ 34, 10 ] = ascii (fp) : "./hrtfs/elev80/L80e310a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e310a.dat right +[ 34, 11 ] = ascii (fp) : "./hrtfs/elev80/L80e305a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e305a.dat right +[ 34, 12 ] = ascii (fp) : "./hrtfs/elev80/L80e300a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e300a.dat right +[ 34, 13 ] = ascii (fp) : "./hrtfs/elev80/L80e295a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e295a.dat right +[ 34, 14 ] = ascii (fp) : "./hrtfs/elev80/L80e290a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e290a.dat right +[ 34, 15 ] = ascii (fp) : "./hrtfs/elev80/L80e285a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e285a.dat right +[ 34, 16 ] = ascii (fp) : "./hrtfs/elev80/L80e280a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e280a.dat right +[ 34, 17 ] = ascii (fp) : "./hrtfs/elev80/L80e275a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e275a.dat right +[ 34, 18 ] = ascii (fp) : "./hrtfs/elev80/L80e270a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e270a.dat right +[ 34, 19 ] = ascii (fp) : "./hrtfs/elev80/L80e265a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e265a.dat right +[ 34, 20 ] = ascii (fp) : "./hrtfs/elev80/L80e260a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e260a.dat right +[ 34, 21 ] = ascii (fp) : "./hrtfs/elev80/L80e255a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e255a.dat right +[ 34, 22 ] = ascii (fp) : "./hrtfs/elev80/L80e250a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e250a.dat right +[ 34, 23 ] = ascii (fp) : "./hrtfs/elev80/L80e245a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e245a.dat right +[ 34, 24 ] = ascii (fp) : "./hrtfs/elev80/L80e240a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e240a.dat right +[ 34, 25 ] = ascii (fp) : "./hrtfs/elev80/L80e235a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e235a.dat right +[ 34, 26 ] = ascii (fp) : "./hrtfs/elev80/L80e230a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e230a.dat right +[ 34, 27 ] = ascii (fp) : "./hrtfs/elev80/L80e225a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e225a.dat right +[ 34, 28 ] = ascii (fp) : "./hrtfs/elev80/L80e220a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e220a.dat right +[ 34, 29 ] = ascii (fp) : "./hrtfs/elev80/L80e215a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e215a.dat right +[ 34, 30 ] = ascii (fp) : "./hrtfs/elev80/L80e210a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e210a.dat right +[ 34, 31 ] = ascii (fp) : "./hrtfs/elev80/L80e205a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e205a.dat right +[ 34, 32 ] = ascii (fp) : "./hrtfs/elev80/L80e200a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e200a.dat right +[ 34, 33 ] = ascii (fp) : "./hrtfs/elev80/L80e195a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e195a.dat right +[ 34, 34 ] = ascii (fp) : "./hrtfs/elev80/L80e190a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e190a.dat right +[ 34, 35 ] = ascii (fp) : "./hrtfs/elev80/L80e185a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e185a.dat right +[ 34, 36 ] = ascii (fp) : "./hrtfs/elev80/L80e180a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e180a.dat right +[ 34, 37 ] = ascii (fp) : "./hrtfs/elev80/L80e175a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e175a.dat right +[ 34, 38 ] = ascii (fp) : "./hrtfs/elev80/L80e170a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e170a.dat right +[ 34, 39 ] = ascii (fp) : "./hrtfs/elev80/L80e165a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e165a.dat right +[ 34, 40 ] = ascii (fp) : "./hrtfs/elev80/L80e160a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e160a.dat right +[ 34, 41 ] = ascii (fp) : "./hrtfs/elev80/L80e155a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e155a.dat right +[ 34, 42 ] = ascii (fp) : "./hrtfs/elev80/L80e150a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e150a.dat right +[ 34, 43 ] = ascii (fp) : "./hrtfs/elev80/L80e145a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e145a.dat right +[ 34, 44 ] = ascii (fp) : "./hrtfs/elev80/L80e140a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e140a.dat right +[ 34, 45 ] = ascii (fp) : "./hrtfs/elev80/L80e135a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e135a.dat right +[ 34, 46 ] = ascii (fp) : "./hrtfs/elev80/L80e130a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e130a.dat right +[ 34, 47 ] = ascii (fp) : "./hrtfs/elev80/L80e125a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e125a.dat right +[ 34, 48 ] = ascii (fp) : "./hrtfs/elev80/L80e120a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e120a.dat right +[ 34, 49 ] = ascii (fp) : "./hrtfs/elev80/L80e115a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e115a.dat right +[ 34, 50 ] = ascii (fp) : "./hrtfs/elev80/L80e110a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e110a.dat right +[ 34, 51 ] = ascii (fp) : "./hrtfs/elev80/L80e105a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e105a.dat right +[ 34, 52 ] = ascii (fp) : "./hrtfs/elev80/L80e100a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e100a.dat right +[ 34, 53 ] = ascii (fp) : "./hrtfs/elev80/L80e095a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e095a.dat right +[ 34, 54 ] = ascii (fp) : "./hrtfs/elev80/L80e090a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e090a.dat right +[ 34, 55 ] = ascii (fp) : "./hrtfs/elev80/L80e085a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e085a.dat right +[ 34, 56 ] = ascii (fp) : "./hrtfs/elev80/L80e080a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e080a.dat right +[ 34, 57 ] = ascii (fp) : "./hrtfs/elev80/L80e075a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e075a.dat right +[ 34, 58 ] = ascii (fp) : "./hrtfs/elev80/L80e070a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e070a.dat right +[ 34, 59 ] = ascii (fp) : "./hrtfs/elev80/L80e065a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e065a.dat right +[ 34, 60 ] = ascii (fp) : "./hrtfs/elev80/L80e060a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e060a.dat right +[ 34, 61 ] = ascii (fp) : "./hrtfs/elev80/L80e055a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e055a.dat right +[ 34, 62 ] = ascii (fp) : "./hrtfs/elev80/L80e050a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e050a.dat right +[ 34, 63 ] = ascii (fp) : "./hrtfs/elev80/L80e045a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e045a.dat right +[ 34, 64 ] = ascii (fp) : "./hrtfs/elev80/L80e040a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e040a.dat right +[ 34, 65 ] = ascii (fp) : "./hrtfs/elev80/L80e035a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e035a.dat right +[ 34, 66 ] = ascii (fp) : "./hrtfs/elev80/L80e030a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e030a.dat right +[ 34, 67 ] = ascii (fp) : "./hrtfs/elev80/L80e025a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e025a.dat right +[ 34, 68 ] = ascii (fp) : "./hrtfs/elev80/L80e020a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e020a.dat right +[ 34, 69 ] = ascii (fp) : "./hrtfs/elev80/L80e015a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e015a.dat right +[ 34, 70 ] = ascii (fp) : "./hrtfs/elev80/L80e010a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e010a.dat right +[ 34, 71 ] = ascii (fp) : "./hrtfs/elev80/L80e005a.dat left + + ascii (fp) : "./hrtfs/elev80/R80e005a.dat right + +[ 35, 0 ] = ascii (fp) : "./hrtfs/elev85/L85e000a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e000a.dat right +[ 35, 1 ] = ascii (fp) : "./hrtfs/elev85/L85e355a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e355a.dat right +[ 35, 2 ] = ascii (fp) : "./hrtfs/elev85/L85e350a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e350a.dat right +[ 35, 3 ] = ascii (fp) : "./hrtfs/elev85/L85e345a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e345a.dat right +[ 35, 4 ] = ascii (fp) : "./hrtfs/elev85/L85e340a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e340a.dat right +[ 35, 5 ] = ascii (fp) : "./hrtfs/elev85/L85e335a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e335a.dat right +[ 35, 6 ] = ascii (fp) : "./hrtfs/elev85/L85e330a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e330a.dat right +[ 35, 7 ] = ascii (fp) : "./hrtfs/elev85/L85e325a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e325a.dat right +[ 35, 8 ] = ascii (fp) : "./hrtfs/elev85/L85e320a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e320a.dat right +[ 35, 9 ] = ascii (fp) : "./hrtfs/elev85/L85e315a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e315a.dat right +[ 35, 10 ] = ascii (fp) : "./hrtfs/elev85/L85e310a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e310a.dat right +[ 35, 11 ] = ascii (fp) : "./hrtfs/elev85/L85e305a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e305a.dat right +[ 35, 12 ] = ascii (fp) : "./hrtfs/elev85/L85e300a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e300a.dat right +[ 35, 13 ] = ascii (fp) : "./hrtfs/elev85/L85e295a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e295a.dat right +[ 35, 14 ] = ascii (fp) : "./hrtfs/elev85/L85e290a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e290a.dat right +[ 35, 15 ] = ascii (fp) : "./hrtfs/elev85/L85e285a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e285a.dat right +[ 35, 16 ] = ascii (fp) : "./hrtfs/elev85/L85e280a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e280a.dat right +[ 35, 17 ] = ascii (fp) : "./hrtfs/elev85/L85e275a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e275a.dat right +[ 35, 18 ] = ascii (fp) : "./hrtfs/elev85/L85e270a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e270a.dat right +[ 35, 19 ] = ascii (fp) : "./hrtfs/elev85/L85e265a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e265a.dat right +[ 35, 20 ] = ascii (fp) : "./hrtfs/elev85/L85e260a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e260a.dat right +[ 35, 21 ] = ascii (fp) : "./hrtfs/elev85/L85e255a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e255a.dat right +[ 35, 22 ] = ascii (fp) : "./hrtfs/elev85/L85e250a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e250a.dat right +[ 35, 23 ] = ascii (fp) : "./hrtfs/elev85/L85e245a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e245a.dat right +[ 35, 24 ] = ascii (fp) : "./hrtfs/elev85/L85e240a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e240a.dat right +[ 35, 25 ] = ascii (fp) : "./hrtfs/elev85/L85e235a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e235a.dat right +[ 35, 26 ] = ascii (fp) : "./hrtfs/elev85/L85e230a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e230a.dat right +[ 35, 27 ] = ascii (fp) : "./hrtfs/elev85/L85e225a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e225a.dat right +[ 35, 28 ] = ascii (fp) : "./hrtfs/elev85/L85e220a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e220a.dat right +[ 35, 29 ] = ascii (fp) : "./hrtfs/elev85/L85e215a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e215a.dat right +[ 35, 30 ] = ascii (fp) : "./hrtfs/elev85/L85e210a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e210a.dat right +[ 35, 31 ] = ascii (fp) : "./hrtfs/elev85/L85e205a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e205a.dat right +[ 35, 32 ] = ascii (fp) : "./hrtfs/elev85/L85e200a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e200a.dat right +[ 35, 33 ] = ascii (fp) : "./hrtfs/elev85/L85e195a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e195a.dat right +[ 35, 34 ] = ascii (fp) : "./hrtfs/elev85/L85e190a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e190a.dat right +[ 35, 35 ] = ascii (fp) : "./hrtfs/elev85/L85e185a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e185a.dat right +[ 35, 36 ] = ascii (fp) : "./hrtfs/elev85/L85e180a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e180a.dat right +[ 35, 37 ] = ascii (fp) : "./hrtfs/elev85/L85e175a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e175a.dat right +[ 35, 38 ] = ascii (fp) : "./hrtfs/elev85/L85e170a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e170a.dat right +[ 35, 39 ] = ascii (fp) : "./hrtfs/elev85/L85e165a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e165a.dat right +[ 35, 40 ] = ascii (fp) : "./hrtfs/elev85/L85e160a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e160a.dat right +[ 35, 41 ] = ascii (fp) : "./hrtfs/elev85/L85e155a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e155a.dat right +[ 35, 42 ] = ascii (fp) : "./hrtfs/elev85/L85e150a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e150a.dat right +[ 35, 43 ] = ascii (fp) : "./hrtfs/elev85/L85e145a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e145a.dat right +[ 35, 44 ] = ascii (fp) : "./hrtfs/elev85/L85e140a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e140a.dat right +[ 35, 45 ] = ascii (fp) : "./hrtfs/elev85/L85e135a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e135a.dat right +[ 35, 46 ] = ascii (fp) : "./hrtfs/elev85/L85e130a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e130a.dat right +[ 35, 47 ] = ascii (fp) : "./hrtfs/elev85/L85e125a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e125a.dat right +[ 35, 48 ] = ascii (fp) : "./hrtfs/elev85/L85e120a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e120a.dat right +[ 35, 49 ] = ascii (fp) : "./hrtfs/elev85/L85e115a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e115a.dat right +[ 35, 50 ] = ascii (fp) : "./hrtfs/elev85/L85e110a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e110a.dat right +[ 35, 51 ] = ascii (fp) : "./hrtfs/elev85/L85e105a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e105a.dat right +[ 35, 52 ] = ascii (fp) : "./hrtfs/elev85/L85e100a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e100a.dat right +[ 35, 53 ] = ascii (fp) : "./hrtfs/elev85/L85e095a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e095a.dat right +[ 35, 54 ] = ascii (fp) : "./hrtfs/elev85/L85e090a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e090a.dat right +[ 35, 55 ] = ascii (fp) : "./hrtfs/elev85/L85e085a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e085a.dat right +[ 35, 56 ] = ascii (fp) : "./hrtfs/elev85/L85e080a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e080a.dat right +[ 35, 57 ] = ascii (fp) : "./hrtfs/elev85/L85e075a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e075a.dat right +[ 35, 58 ] = ascii (fp) : "./hrtfs/elev85/L85e070a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e070a.dat right +[ 35, 59 ] = ascii (fp) : "./hrtfs/elev85/L85e065a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e065a.dat right +[ 35, 60 ] = ascii (fp) : "./hrtfs/elev85/L85e060a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e060a.dat right +[ 35, 61 ] = ascii (fp) : "./hrtfs/elev85/L85e055a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e055a.dat right +[ 35, 62 ] = ascii (fp) : "./hrtfs/elev85/L85e050a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e050a.dat right +[ 35, 63 ] = ascii (fp) : "./hrtfs/elev85/L85e045a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e045a.dat right +[ 35, 64 ] = ascii (fp) : "./hrtfs/elev85/L85e040a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e040a.dat right +[ 35, 65 ] = ascii (fp) : "./hrtfs/elev85/L85e035a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e035a.dat right +[ 35, 66 ] = ascii (fp) : "./hrtfs/elev85/L85e030a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e030a.dat right +[ 35, 67 ] = ascii (fp) : "./hrtfs/elev85/L85e025a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e025a.dat right +[ 35, 68 ] = ascii (fp) : "./hrtfs/elev85/L85e020a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e020a.dat right +[ 35, 69 ] = ascii (fp) : "./hrtfs/elev85/L85e015a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e015a.dat right +[ 35, 70 ] = ascii (fp) : "./hrtfs/elev85/L85e010a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e010a.dat right +[ 35, 71 ] = ascii (fp) : "./hrtfs/elev85/L85e005a.dat left + + ascii (fp) : "./hrtfs/elev85/R85e005a.dat right + +[ 36, 0 ] = ascii (fp) : "./hrtfs/elev90/L90e000a.dat left + + ascii (fp) : "./hrtfs/elev90/R90e000a.dat right + + diff --git a/love/src/jni/openal-soft-1.18.2/utils/IRC_1005.def b/love/src/jni/openal-soft-1.19.1/utils/IRC_1005.def similarity index 73% rename from love/src/jni/openal-soft-1.18.2/utils/IRC_1005.def rename to love/src/jni/openal-soft-1.19.1/utils/IRC_1005.def index f5a16934..c2fd90b5 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/IRC_1005.def +++ b/love/src/jni/openal-soft-1.19.1/utils/IRC_1005.def @@ -1,8 +1,8 @@ # This is a makehrtf HRIR definition file. It is used to define the layout # and source data to be processed into an OpenAL Soft compatible HRTF. # -# This definition is used to transform an average of the left and right ear -# HRIRs from any raw data set from the IRCAM/AKG Listen HRTF database. +# This definition is used to transform the left and right ear HRIRs of any +# raw data set from the IRCAM/AKG Listen HRTF database. # # The data sets are available free of charge from: # @@ -17,405 +17,409 @@ rate = 44100 +# The IRCAM sets are stereo because they provide both ear HRIRs. +type = stereo + # The raw sets have up to 8192 samples, but 2048 seems large enough. points = 2048 -# The IRCAM sets are not as dense as the MIT set. -azimuths = 1, 6, 12, 24, 24, 24, 24, 24, 24, 24, 12, 6, 1 - # No head radius was provided. Just use the average radius of 9 cm. radius = 0.09 -# The distance between the source and the listener (in meters). +# The IRCAM sets are single-field (like most others) with a distance between +# the source and the listener of 1.95 meters. distance = 1.95 +# This set isn't as dense as the MIT set. +azimuths = 1, 6, 12, 24, 24, 24, 24, 24, 24, 24, 12, 6, 1 + # The IRCAM source azimuth is counter-clockwise, so it needs to be flipped. -# Left and right ear HRIRs (from the respective WAVE channels) are averaged. +# Left and right ear HRIRs (from the respective WAVE channels) are used to +# create a stereo HRTF. # Replace all occurrences of IRC_#### for the desired subject (1005 was used # in this demonstration). +[ 3, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P315.wav" right +[ 3, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P315.wav" right +[ 3, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P315.wav" right +[ 3, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P315.wav" right +[ 3, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P315.wav" right +[ 3, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P315.wav" right +[ 3, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P315.wav" right +[ 3, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P315.wav" right +[ 3, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P315.wav" right +[ 3, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P315.wav" right +[ 3, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P315.wav" right +[ 3, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P315.wav" right +[ 3, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P315.wav" right +[ 3, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P315.wav" right +[ 3, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P315.wav" right +[ 3, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P315.wav" right +[ 3, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P315.wav" right +[ 3, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P315.wav" right +[ 3, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P315.wav" right +[ 3, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P315.wav" right +[ 3, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P315.wav" right +[ 3, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P315.wav" right +[ 3, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P315.wav" right +[ 3, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P315.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P315.wav" right -[ 3, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P315.wav" -[ 3, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P315.wav" -[ 3, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P315.wav" -[ 3, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P315.wav" -[ 3, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P315.wav" -[ 3, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P315.wav" -[ 3, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P315.wav" -[ 3, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P315.wav" -[ 3, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P315.wav" -[ 3, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P315.wav" -[ 3, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P315.wav" -[ 3, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P315.wav" -[ 3, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P315.wav" -[ 3, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P315.wav" -[ 3, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P315.wav" -[ 3, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P315.wav" -[ 3, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P315.wav" -[ 3, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P315.wav" -[ 3, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P315.wav" -[ 3, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P315.wav" -[ 3, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P315.wav" -[ 3, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P315.wav" -[ 3, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P315.wav" -[ 3, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P315.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P315.wav" +[ 4, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P330.wav" right +[ 4, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P330.wav" right +[ 4, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P330.wav" right +[ 4, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P330.wav" right +[ 4, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P330.wav" right +[ 4, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P330.wav" right +[ 4, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P330.wav" right +[ 4, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P330.wav" right +[ 4, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P330.wav" right +[ 4, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P330.wav" right +[ 4, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P330.wav" right +[ 4, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P330.wav" right +[ 4, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P330.wav" right +[ 4, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P330.wav" right +[ 4, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P330.wav" right +[ 4, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P330.wav" right +[ 4, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P330.wav" right +[ 4, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P330.wav" right +[ 4, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P330.wav" right +[ 4, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P330.wav" right +[ 4, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P330.wav" right +[ 4, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P330.wav" right +[ 4, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P330.wav" right +[ 4, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P330.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P330.wav" right -[ 4, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P330.wav" -[ 4, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P330.wav" -[ 4, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P330.wav" -[ 4, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P330.wav" -[ 4, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P330.wav" -[ 4, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P330.wav" -[ 4, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P330.wav" -[ 4, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P330.wav" -[ 4, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P330.wav" -[ 4, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P330.wav" -[ 4, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P330.wav" -[ 4, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P330.wav" -[ 4, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P330.wav" -[ 4, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P330.wav" -[ 4, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P330.wav" -[ 4, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P330.wav" -[ 4, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P330.wav" -[ 4, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P330.wav" -[ 4, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P330.wav" -[ 4, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P330.wav" -[ 4, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P330.wav" -[ 4, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P330.wav" -[ 4, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P330.wav" -[ 4, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P330.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P330.wav" +[ 5, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P345.wav" right +[ 5, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P345.wav" right +[ 5, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P345.wav" right +[ 5, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P345.wav" right +[ 5, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P345.wav" right +[ 5, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P345.wav" right +[ 5, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P345.wav" right +[ 5, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P345.wav" right +[ 5, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P345.wav" right +[ 5, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P345.wav" right +[ 5, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P345.wav" right +[ 5, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P345.wav" right +[ 5, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P345.wav" right +[ 5, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P345.wav" right +[ 5, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P345.wav" right +[ 5, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P345.wav" right +[ 5, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P345.wav" right +[ 5, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P345.wav" right +[ 5, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P345.wav" right +[ 5, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P345.wav" right +[ 5, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P345.wav" right +[ 5, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P345.wav" right +[ 5, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P345.wav" right +[ 5, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P345.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P345.wav" right -[ 5, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P345.wav" -[ 5, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P345.wav" -[ 5, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P345.wav" -[ 5, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P345.wav" -[ 5, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P345.wav" -[ 5, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P345.wav" -[ 5, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P345.wav" -[ 5, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P345.wav" -[ 5, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P345.wav" -[ 5, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P345.wav" -[ 5, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P345.wav" -[ 5, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P345.wav" -[ 5, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P345.wav" -[ 5, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P345.wav" -[ 5, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P345.wav" -[ 5, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P345.wav" -[ 5, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P345.wav" -[ 5, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P345.wav" -[ 5, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P345.wav" -[ 5, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P345.wav" -[ 5, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P345.wav" -[ 5, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P345.wav" -[ 5, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P345.wav" -[ 5, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P345.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P345.wav" +[ 6, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P000.wav" right +[ 6, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P000.wav" right +[ 6, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P000.wav" right +[ 6, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P000.wav" right +[ 6, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P000.wav" right +[ 6, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P000.wav" right +[ 6, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P000.wav" right +[ 6, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P000.wav" right +[ 6, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P000.wav" right +[ 6, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P000.wav" right +[ 6, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P000.wav" right +[ 6, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P000.wav" right +[ 6, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P000.wav" right +[ 6, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P000.wav" right +[ 6, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P000.wav" right +[ 6, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P000.wav" right +[ 6, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P000.wav" right +[ 6, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P000.wav" right +[ 6, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P000.wav" right +[ 6, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P000.wav" right +[ 6, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P000.wav" right +[ 6, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P000.wav" right +[ 6, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P000.wav" right +[ 6, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P000.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P000.wav" right -[ 6, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P000.wav" -[ 6, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P000.wav" -[ 6, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P000.wav" -[ 6, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P000.wav" -[ 6, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P000.wav" -[ 6, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P000.wav" -[ 6, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P000.wav" -[ 6, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P000.wav" -[ 6, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P000.wav" -[ 6, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P000.wav" -[ 6, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P000.wav" -[ 6, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P000.wav" -[ 6, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P000.wav" -[ 6, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P000.wav" -[ 6, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P000.wav" -[ 6, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P000.wav" -[ 6, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P000.wav" -[ 6, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P000.wav" -[ 6, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P000.wav" -[ 6, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P000.wav" -[ 6, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P000.wav" -[ 6, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P000.wav" -[ 6, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P000.wav" -[ 6, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P000.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P000.wav" +[ 7, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P015.wav" right +[ 7, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P015.wav" right +[ 7, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P015.wav" right +[ 7, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P015.wav" right +[ 7, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P015.wav" right +[ 7, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P015.wav" right +[ 7, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P015.wav" right +[ 7, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P015.wav" right +[ 7, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P015.wav" right +[ 7, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P015.wav" right +[ 7, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P015.wav" right +[ 7, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P015.wav" right +[ 7, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P015.wav" right +[ 7, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P015.wav" right +[ 7, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P015.wav" right +[ 7, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P015.wav" right +[ 7, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P015.wav" right +[ 7, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P015.wav" right +[ 7, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P015.wav" right +[ 7, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P015.wav" right +[ 7, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P015.wav" right +[ 7, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P015.wav" right +[ 7, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P015.wav" right +[ 7, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P015.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P015.wav" right -[ 7, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P015.wav" -[ 7, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P015.wav" -[ 7, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P015.wav" -[ 7, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P015.wav" -[ 7, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P015.wav" -[ 7, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P015.wav" -[ 7, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P015.wav" -[ 7, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P015.wav" -[ 7, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P015.wav" -[ 7, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P015.wav" -[ 7, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P015.wav" -[ 7, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P015.wav" -[ 7, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P015.wav" -[ 7, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P015.wav" -[ 7, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P015.wav" -[ 7, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P015.wav" -[ 7, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P015.wav" -[ 7, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P015.wav" -[ 7, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P015.wav" -[ 7, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P015.wav" -[ 7, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P015.wav" -[ 7, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P015.wav" -[ 7, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P015.wav" -[ 7, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P015.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P015.wav" +[ 8, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P030.wav" right +[ 8, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P030.wav" right +[ 8, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P030.wav" right +[ 8, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P030.wav" right +[ 8, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P030.wav" right +[ 8, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P030.wav" right +[ 8, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P030.wav" right +[ 8, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P030.wav" right +[ 8, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P030.wav" right +[ 8, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P030.wav" right +[ 8, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P030.wav" right +[ 8, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P030.wav" right +[ 8, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P030.wav" right +[ 8, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P030.wav" right +[ 8, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P030.wav" right +[ 8, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P030.wav" right +[ 8, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P030.wav" right +[ 8, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P030.wav" right +[ 8, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P030.wav" right +[ 8, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P030.wav" right +[ 8, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P030.wav" right +[ 8, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P030.wav" right +[ 8, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P030.wav" right +[ 8, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P030.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P030.wav" right -[ 8, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P030.wav" -[ 8, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P030.wav" -[ 8, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P030.wav" -[ 8, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P030.wav" -[ 8, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P030.wav" -[ 8, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P030.wav" -[ 8, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P030.wav" -[ 8, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P030.wav" -[ 8, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P030.wav" -[ 8, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P030.wav" -[ 8, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P030.wav" -[ 8, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P030.wav" -[ 8, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P030.wav" -[ 8, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P030.wav" -[ 8, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P030.wav" -[ 8, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P030.wav" -[ 8, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P030.wav" -[ 8, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P030.wav" -[ 8, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P030.wav" -[ 8, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P030.wav" -[ 8, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P030.wav" -[ 8, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P030.wav" -[ 8, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P030.wav" -[ 8, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P030.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P030.wav" +[ 9, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P045.wav" right +[ 9, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P045.wav" right +[ 9, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P045.wav" right +[ 9, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P045.wav" right +[ 9, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P045.wav" right +[ 9, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P045.wav" right +[ 9, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P045.wav" right +[ 9, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P045.wav" right +[ 9, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P045.wav" right +[ 9, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P045.wav" right +[ 9, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P045.wav" right +[ 9, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P045.wav" right +[ 9, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P045.wav" right +[ 9, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P045.wav" right +[ 9, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P045.wav" right +[ 9, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P045.wav" right +[ 9, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P045.wav" right +[ 9, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P045.wav" right +[ 9, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P045.wav" right +[ 9, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P045.wav" right +[ 9, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P045.wav" right +[ 9, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P045.wav" right +[ 9, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P045.wav" right +[ 9, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P045.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P045.wav" right -[ 9, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P045.wav" -[ 9, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P045.wav" -[ 9, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P045.wav" -[ 9, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P045.wav" -[ 9, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P045.wav" -[ 9, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P045.wav" -[ 9, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P045.wav" -[ 9, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P045.wav" -[ 9, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P045.wav" -[ 9, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P045.wav" -[ 9, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P045.wav" -[ 9, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P045.wav" -[ 9, 12 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P045.wav" -[ 9, 13 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T165_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T195_P045.wav" -[ 9, 14 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P045.wav" -[ 9, 15 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T135_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T225_P045.wav" -[ 9, 16 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P045.wav" -[ 9, 17 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T105_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T255_P045.wav" -[ 9, 18 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P045.wav" -[ 9, 19 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T075_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T285_P045.wav" -[ 9, 20 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P045.wav" -[ 9, 21 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T045_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T315_P045.wav" -[ 9, 22 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P045.wav" -[ 9, 23 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T015_P045.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T345_P045.wav" +[ 10, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P060.wav" right +[ 10, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P060.wav" right +[ 10, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P060.wav" right +[ 10, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P060.wav" right +[ 10, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P060.wav" right +[ 10, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P060.wav" right +[ 10, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P060.wav" right +[ 10, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P060.wav" right +[ 10, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P060.wav" right +[ 10, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P060.wav" right +[ 10, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P060.wav" right +[ 10, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P060.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P060.wav" right -[ 10, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P060.wav" -[ 10, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P060.wav" -[ 10, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P060.wav" -[ 10, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P060.wav" -[ 10, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P060.wav" -[ 10, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P060.wav" -[ 10, 6 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P060.wav" -[ 10, 7 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T150_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T210_P060.wav" -[ 10, 8 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P060.wav" -[ 10, 9 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T090_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T270_P060.wav" -[ 10, 10 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P060.wav" -[ 10, 11 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T030_P060.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T330_P060.wav" +[ 11, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P075.wav" right +[ 11, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P075.wav" right +[ 11, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P075.wav" right +[ 11, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P075.wav" right +[ 11, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P075.wav" right +[ 11, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P075.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P075.wav" right -[ 11, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P075.wav" -[ 11, 1 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P075.wav" -[ 11, 2 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P075.wav" -[ 11, 3 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T180_P075.wav" -[ 11, 4 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T120_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T240_P075.wav" -[ 11, 5 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T060_P075.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T300_P075.wav" - -[ 12, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P090.wav" - + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P090.wav" +[ 12, 0 ] = wave (0) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P090.wav" left + + wave (1) : "./IRC/RAW/WAV/IRC_1005_R/IRC_1005_R_R0195_T000_P090.wav" right diff --git a/love/src/jni/openal-soft-1.18.2/utils/MIT_KEMAR.def b/love/src/jni/openal-soft-1.19.1/utils/MIT_KEMAR.def similarity index 92% rename from love/src/jni/openal-soft-1.18.2/utils/MIT_KEMAR.def rename to love/src/jni/openal-soft-1.19.1/utils/MIT_KEMAR.def index 1067e0b4..e6b0ddff 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/MIT_KEMAR.def +++ b/love/src/jni/openal-soft-1.19.1/utils/MIT_KEMAR.def @@ -12,26 +12,26 @@ # It is copyrighted 1994 by MIT Media Laboratory, and provided free of charge # with no restrictions on use so long as the authors (above) are cited. # -# This definition is used to generate the internal HRTF table used by OpenAL +# This definition is used to generate the default HRTF table used by OpenAL # Soft. # The following are the data set metrics. They must always be specified at -# start of a definition file, but their order is not important. +# the start of a definition file, but their order is not important. # Sampling rate of the HRIR data (in hertz). rate = 44100 +# The channel type of incoming HRIR data (mono or stereo). Mono channel +# inputs will result in mirroring to provide the right ear HRIRs. If not +# specified, this defaults to mono. +type = mono + # The number of points to use from the HRIR data. This should be a # sufficiently large value (to encompass the entire impulse response). It # cannot be smaller than the truncation size (default is 32) specified on the # command line. points = 512 -# A list of the number of azimuths measured for each elevation. There must -# be at least 5 elevations covering the 180 degrees for the data set to be -# viable. -azimuths = 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1 - # The radius of the listener's head (measured ear-to-ear in meters). The # makehrtf utility uses this value to rescale measured propagation delays # when a custom head radius is specified on the command line. It is also @@ -41,62 +41,83 @@ azimuths = 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12 # default). At the moment, radius rescaling does not adjust HRIR coupling. radius = 0.09 -# The distance between the source and the listener (in meters). This does -# have to match the data set, but it's effect is minimal at the moment due to -# the coupled nature of OpenAL Soft's HRTF model. +# A list of the distances between the source and the listener (in meters) for +# each field. These must start at or above the head radius and proceed in +# ascending order. Since the MIT set is single-field, there is only one +# distance. distance = 1.4 -# Following the metrics is the list of source HRIRs for each elevation and -# azimuth pair. They don't have to be specified in order, but the final -# composition must not be sparse. They can however begin above a number of -# elevations (as typical for HRIR measurements). +# A list of the number of azimuths measured for each elevation per field. +# Elevations are separated by commas (,) while fields are separated by +# semicolons (;). There must be at least 5 elevations covering 180 degrees +# degrees of elevation for the data set to be viable. The poles (first and +# last elevation) must be singular (an azimuth count of 1). +azimuths = 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1 + +# Following the metrics is the list of source HRIRs for each field, +# elevation, and azimuth triplet. They don't have to be specified in order, +# but the final composition must not be sparse. They can however begin above +# a number of elevations (as typical for HRIR measurements). # -# The elevation and azimuth indices are used to determine the resulting polar -# coordinates following OpenAL Soft's convention (-90 degree elevation -# increasing counter-clockwise from the bottom; 0 degree azimuth increasing -# clockwise from the front). +# The field index is used to determine the distance coordinate (for mult- +# field HRTFs) while the elevation and azimuth indices are used to determine +# the resulting polar coordinates following OpenAL Soft's convention (-90 +# degree elevation increasing counter-clockwise from the bottom; 0 degree +# azimuth increasing clockwise from the front). # -# More than one HRIR can be used per source, in which case the average -# magnitude response of all references for that source is used. +# More than one HRIR can be used per source. This allows the composition of +# averaged magnitude responses or the specification of stereo HRTFs. Target +# ears must (and can only be) specified for each source when the type metric +# is set to 'stereo'. # # Source specification is of the form (~BNF): # -# source = '[' ev_index ',' az_index ']' '=' source_ref [ '+' source_ref ]* +# source = ( sf_index | mf_index ) source_ref [ '+' source_ref ]* # +# sf_index = '[' ev_index ',' az_index ']' '=' +# mf_index = '[' fd_index ',' ev_index ',' az_index ']' '=' +# source_ref = mono_ref | stereo_ref +# +# fd_index = unsigned_integer # ev_index = unsigned_integer # az_index = unsigned_integer -# source_ref = ref_spec ':' filename +# mono_ref = ref_spec ':' filename +# stereo_ref = ref_spec ':' filename ear # -# ref_spec = ( wave_fmt '(' wave_parms ')' [ '@' start_sample ] ) | -# ( bin_fmt '(' bini_parms ')' [ '@' start_bytes ] ) | -# ( bin_fmt '(' binf_parms ')' [ '@' start_bytes ] ) | -# ( ascii_fmt '(' asci_parms ')' [ '@' start_elements ] ) | -# ( ascii_fmt '(' ascf_parms ')' [ '@' start_elements ] ) +# ref_spec = ( wave_fmt '(' wave_parms ')' [ '@' start_sample ] ) | +# ( bin_fmt '(' bini_parms ')' [ '@' start_byte ] ) | +# ( bin_fmt '(' binf_parms ')' [ '@' start_byte ] ) | +# ( ascii_fmt '(' asci_parms ')' [ '@' start_element ] ) | +# ( ascii_fmt '(' ascf_parms ')' [ '@' start_element ] ) # filename = double_quoted_string +# ear = 'left' | 'right' # -# wave_fmt = 'wave' -# wave_parms = channel -# bin_fmt = 'bin_le' | 'bin_be' -# bini_parms = 'int' ',' byte_size [ ',' bin_sig_bits ] [ ';' skip_bytes ] -# binf_parms = 'fp' ',' byte_size [ ';' skip_bytes ] -# ascii_fmt = 'ascii' -# asci_parms = 'int' ',' sig_bits [ ';' skip_elements ] -# ascf_parms = 'fp' [ ';' skip_elements ] -# start_sample = unsigned_integer -# start_bytes = unsigned_integer -# start_elements = unsigned_integer +# wave_fmt = 'wave' +# wave_parms = channel +# bin_fmt = 'bin_le' | 'bin_be' +# bini_parms = 'int' ',' byte_size [ ',' bin_sig_bits ] [ ';' skip_bytes ] +# binf_parms = 'fp' ',' byte_size [ ';' skip_bytes ] +# ascii_fmt = 'ascii' +# asci_parms = 'int' ',' sig_bits [ ';' skip_elements ] +# ascf_parms = 'fp' [ ';' skip_elements ] +# start_sample = unsigned_integer +# start_byte = unsigned_integer +# start_element = unsigned_integer # -# channel = unsigned_integer -# byte_size = unsigned_integer -# bin_sig_bits = signed_integer -# skip_bytes = unsigned_integer -# sig_bits = unsigned_integer -# skip_elements = unsigned_integer +# channel = unsigned_integer +# byte_size = unsigned_integer +# bin_sig_bits = signed_integer +# skip_bytes = unsigned_integer +# sig_bits = unsigned_integer +# skip_elements = unsigned_integer # # For bin_sig_bits, positive values mean the significant bits start at the # MSB (padding toward the LSB) while negative values mean they start at the # LSB. +# Even though the MIT set is provided as stereo .wav files, each channel is +# for a different sized KEMAR ear. Since it is not a stereo data set, no ear +# is specified. The smaller KEMAR ear (in the left channel: 0) is used. [ 5, 0 ] = wave (0) : "./MITfull/elev-40/L-40e000a.wav" [ 5, 1 ] = wave (0) : "./MITfull/elev-40/L-40e006a.wav" [ 5, 2 ] = wave (0) : "./MITfull/elev-40/L-40e013a.wav" diff --git a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/CMakeLists.txt b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/CMakeLists.txt similarity index 96% rename from love/src/jni/openal-soft-1.18.2/utils/alsoft-config/CMakeLists.txt rename to love/src/jni/openal-soft-1.19.1/utils/alsoft-config/CMakeLists.txt index 4911b9d8..67cc44c7 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/CMakeLists.txt +++ b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/CMakeLists.txt @@ -4,8 +4,10 @@ option(ALSOFT_NO_QT5 "Use Qt4 instead of Qt5 for alsoft-config" FALSE) include_directories("${alsoft-config_BINARY_DIR}") -set(alsoft-config_SRCS main.cpp - mainwindow.cpp +set(alsoft-config_SRCS + main.cpp + mainwindow.cpp + mainwindow.h ) set(alsoft-config_UIS mainwindow.ui) set(alsoft-config_MOCS mainwindow.h) diff --git a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/main.cpp b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/main.cpp similarity index 100% rename from love/src/jni/openal-soft-1.18.2/utils/alsoft-config/main.cpp rename to love/src/jni/openal-soft-1.19.1/utils/alsoft-config/main.cpp diff --git a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.cpp b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.cpp similarity index 97% rename from love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.cpp rename to love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.cpp index a743ca6a..110fe4ed 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.cpp +++ b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.cpp @@ -44,8 +44,8 @@ static const struct { #ifdef HAVE_QSA { "qsa", "QSA" }, #endif -#ifdef HAVE_MMDEVAPI - { "mmdevapi", "MMDevAPI" }, +#ifdef HAVE_WASAPI + { "wasapi", "WASAPI" }, #endif #ifdef HAVE_DSOUND { "dsound", "DirectSound" }, @@ -74,7 +74,7 @@ static const struct NameValuePair { { "Autodetect", "" }, { "Mono", "mono" }, { "Stereo", "stereo" }, - { "Quadrophonic", "quad" }, + { "Quadraphonic", "quad" }, { "5.1 Surround (Side)", "surround51" }, { "5.1 Surround (Rear)", "surround51rear" }, { "6.1 Surround", "surround61" }, @@ -100,8 +100,9 @@ static const struct NameValuePair { { "Point", "point" }, { "Linear", "linear" }, { "Default (Linear)", "" }, - { "4-Point Sinc", "sinc4" }, - { "Band-limited Sinc", "bsinc" }, + { "Cubic Spline", "cubic" }, + { "11th order Sinc", "bsinc12" }, + { "23rd order Sinc", "bsinc24" }, { "", "" } }, stereoModeList[] = { @@ -369,17 +370,19 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->backendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->defaultReverbComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(enableApplyButton())); - connect(ui->emulateEaxCheckBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableEaxReverbCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableStdReverbCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(ui->enableAutowahCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableChorusCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableCompressorCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableDistortionCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableEchoCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableEqualizerCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableFlangerCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(ui->enableFrequencyShifterCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableModulatorCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->enableDedicatedCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); + connect(ui->enablePitchShifterCheck, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->pulseAutospawnCheckBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); connect(ui->pulseAllowMovesCheckBox, SIGNAL(stateChanged(int)), this, SLOT(enableApplyButton())); @@ -610,6 +613,9 @@ void MainWindow::loadConfig(const QString &fname) */ if(resampler == "cubic" || resampler == "sinc8") resampler = "sinc4"; + /* The "bsinc" resampler name is an alias for "bsinc12". */ + else if(resampler == "bsinc") + resampler = "bsinc12"; for(int i = 0;resamplerList[i].name[0];i++) { if(resampler == resamplerList[i].value) @@ -771,7 +777,16 @@ void MainWindow::loadConfig(const QString &fname) if(drivers.size() == 1) drivers = drivers[0].split(QChar(',')); for(QStringList::iterator iter = drivers.begin();iter != drivers.end();iter++) + { *iter = iter->trimmed(); + /* Convert "mmdevapi" references to "wasapi" for backwards + * compatibility. + */ + if(*iter == "-mmdevapi") + *iter = "-wasapi"; + else if(*iter == "mmdevapi") + *iter = "wasapi"; + } bool lastWasEmpty = false; foreach(const QString &backend, drivers) @@ -818,8 +833,6 @@ void MainWindow::loadConfig(const QString &fname) } } - ui->emulateEaxCheckBox->setChecked(settings.value("reverb/emulate-eax", false).toBool()); - QStringList excludefx = settings.value("excludefx").toStringList(); if(excludefx.size() == 1) excludefx = excludefx[0].split(QChar(',')); @@ -827,14 +840,17 @@ void MainWindow::loadConfig(const QString &fname) *iter = iter->trimmed(); ui->enableEaxReverbCheck->setChecked(!excludefx.contains("eaxreverb", Qt::CaseInsensitive)); ui->enableStdReverbCheck->setChecked(!excludefx.contains("reverb", Qt::CaseInsensitive)); + ui->enableAutowahCheck->setChecked(!excludefx.contains("autowah", Qt::CaseInsensitive)); ui->enableChorusCheck->setChecked(!excludefx.contains("chorus", Qt::CaseInsensitive)); ui->enableCompressorCheck->setChecked(!excludefx.contains("compressor", Qt::CaseInsensitive)); ui->enableDistortionCheck->setChecked(!excludefx.contains("distortion", Qt::CaseInsensitive)); ui->enableEchoCheck->setChecked(!excludefx.contains("echo", Qt::CaseInsensitive)); ui->enableEqualizerCheck->setChecked(!excludefx.contains("equalizer", Qt::CaseInsensitive)); ui->enableFlangerCheck->setChecked(!excludefx.contains("flanger", Qt::CaseInsensitive)); + ui->enableFrequencyShifterCheck->setChecked(!excludefx.contains("fshifter", Qt::CaseInsensitive)); ui->enableModulatorCheck->setChecked(!excludefx.contains("modulator", Qt::CaseInsensitive)); ui->enableDedicatedCheck->setChecked(!excludefx.contains("dedicated", Qt::CaseInsensitive)); + ui->enablePitchShifterCheck->setChecked(!excludefx.contains("pshifter", Qt::CaseInsensitive)); ui->pulseAutospawnCheckBox->setChecked(settings.value("pulse/spawn-server", true).toBool()); ui->pulseAllowMovesCheckBox->setChecked(settings.value("pulse/allow-moves", false).toBool()); @@ -1027,16 +1043,13 @@ void MainWindow::saveConfig(const QString &fname) const settings.setValue("default-reverb", str); } - if(ui->emulateEaxCheckBox->isChecked()) - settings.setValue("reverb/emulate-eax", "true"); - else - settings.remove("reverb/emulate-eax"/*, "false"*/); - strlist.clear(); if(!ui->enableEaxReverbCheck->isChecked()) strlist.append("eaxreverb"); if(!ui->enableStdReverbCheck->isChecked()) strlist.append("reverb"); + if(!ui->enableAutowahCheck->isChecked()) + strlist.append("autowah"); if(!ui->enableChorusCheck->isChecked()) strlist.append("chorus"); if(!ui->enableDistortionCheck->isChecked()) @@ -1049,10 +1062,14 @@ void MainWindow::saveConfig(const QString &fname) const strlist.append("equalizer"); if(!ui->enableFlangerCheck->isChecked()) strlist.append("flanger"); + if(!ui->enableFrequencyShifterCheck->isChecked()) + strlist.append("fshifter"); if(!ui->enableModulatorCheck->isChecked()) strlist.append("modulator"); if(!ui->enableDedicatedCheck->isChecked()) strlist.append("dedicated"); + if(!ui->enablePitchShifterCheck->isChecked()) + strlist.append("pshifter"); settings.setValue("excludefx", strlist.join(QChar(','))); settings.setValue("pulse/spawn-server", @@ -1162,7 +1179,7 @@ void MainWindow::updatePeriodCountSlider() void MainWindow::selectQuadDecoderFile() -{ selectDecoderFile(ui->decoderQuadLineEdit, "Select Quadrophonic Decoder");} +{ selectDecoderFile(ui->decoderQuadLineEdit, "Select Quadraphonic Decoder");} void MainWindow::select51DecoderFile() { selectDecoderFile(ui->decoder51LineEdit, "Select 5.1 Surround Decoder");} void MainWindow::select61DecoderFile() diff --git a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.h b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.h similarity index 100% rename from love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.h rename to love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.h diff --git a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.ui b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.ui similarity index 97% rename from love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.ui rename to love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.ui index 23d7573a..9c89cbc7 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/alsoft-config/mainwindow.ui +++ b/love/src/jni/openal-soft-1.19.1/utils/alsoft-config/mainwindow.ui @@ -52,6 +52,9 @@ 401 + + 5 + Playback @@ -128,8 +131,8 @@ to stereo output. 380 20 - 91 - 29 + 80 + 20 @@ -691,7 +694,7 @@ configuration file. - Quadrophonic: + Quadraphonic: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -1924,34 +1927,13 @@ be useful for preventing those extensions from being used. Effects - - - - 10 - 60 - 161 - 21 - - - - Uses a simpler reverb method to emulate the EAX reverb -effect. This may slightly improve performance at the cost of -some quality. - - - Qt::RightToLeft - - - Emulate EAX Reverb: - - 10 100 511 - 191 + 241 @@ -2029,8 +2011,8 @@ for the system to handle. - 320 - 30 + 70 + 180 131 21 @@ -2046,7 +2028,7 @@ for the system to handle. 320 - 60 + 30 131 21 @@ -2078,7 +2060,7 @@ for the system to handle. 320 - 120 + 150 131 21 @@ -2094,7 +2076,7 @@ for the system to handle. 320 - 150 + 180 131 21 @@ -2126,6 +2108,54 @@ added by the ALC_EXT_DEDICATED extension. true + + + + 320 + 120 + 131 + 21 + + + + Pitch Shifter + + + true + + + + + + 320 + 60 + 131 + 21 + + + + Frequency Shifter + + + true + + + + + + 70 + 210 + 131 + 21 + + + + Autowah + + + true + + @@ -2148,8 +2178,8 @@ added by the ALC_EXT_DEDICATED extension. 160 20 - 123 - 29 + 108 + 20 @@ -2318,7 +2348,7 @@ added by the ALC_EXT_DEDICATED extension. 0 0 564 - 27 + 21 diff --git a/love/src/jni/openal-soft-1.18.2/utils/bsincgen.c b/love/src/jni/openal-soft-1.19.1/utils/bsincgen.c similarity index 53% rename from love/src/jni/openal-soft-1.18.2/utils/bsincgen.c rename to love/src/jni/openal-soft-1.19.1/utils/bsincgen.c index 33783a27..03421da9 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/bsincgen.c +++ b/love/src/jni/openal-soft-1.19.1/utils/bsincgen.c @@ -33,20 +33,32 @@ * accessed October 2012. */ +#define _UNICODE #include #include #include +#include + +#include "win_main_utf8.h" + #ifndef M_PI #define M_PI (3.14159265358979323846) #endif +#if defined(__ANDROID__) && !(defined(_ISOC99_SOURCE) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L)) +#define log2(x) (log(x) / log(2.0)) +#endif + // The number of distinct scale and phase intervals within the filter table. +// Must be the same as in alu.h! #define BSINC_SCALE_COUNT (16) #define BSINC_PHASE_COUNT (16) -#define BSINC_REJECTION (60.0) -#define BSINC_POINTS_MIN (12) +/* 48 points includes the doubling for downsampling, so the maximum number of + * base sample points is 24, which is 23rd order. + */ +#define BSINC_POINTS_MAX (48) static double MinDouble(double a, double b) { return (a <= b) ? a : b; } @@ -93,18 +105,13 @@ static double BesselI_0(const double x) */ static double Kaiser(const double b, const double k) { - double k2; - - if((k < -1.0) || (k > 1.0)) + if(!(k >= -1.0 && k <= 1.0)) return 0.0; - - k2 = MaxDouble(1.0 - (k * k), 0.0); - - return BesselI_0(b * sqrt(k2)) / BesselI_0(b); + return BesselI_0(b * sqrt(1.0 - k*k)) / BesselI_0(b); } -/* NOTE: Calculates the transition width of the Kaiser window. Rejection is - * in dB. +/* Calculates the (normalized frequency) transition width of the Kaiser window. + * Rejection is in dB. */ static double CalcKaiserWidth(const double rejection, const int order) { @@ -112,7 +119,7 @@ static double CalcKaiserWidth(const double rejection, const int order) if(rejection > 21.0) return (rejection - 7.95) / (order * 2.285 * w_t); - + /* This enforces a minimum rejection of just above 21.18dB */ return 5.79 / (order * w_t); } @@ -127,14 +134,15 @@ static double CalcKaiserBeta(const double rejection) } /* Generates the coefficient, delta, and index tables required by the bsinc resampler */ -static void BsiGenerateTables() +static void BsiGenerateTables(FILE *output, const char *tabname, const double rejection, const int order) { - static double filter[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][2 * BSINC_POINTS_MIN]; - static double scDeltas[BSINC_SCALE_COUNT - 1][BSINC_PHASE_COUNT][2 * BSINC_POINTS_MIN]; - static double phDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][2 * BSINC_POINTS_MIN]; - static double spDeltas[BSINC_SCALE_COUNT - 1][BSINC_PHASE_COUNT][2 * BSINC_POINTS_MIN]; + static double filter[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][BSINC_POINTS_MAX]; + static double scDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT ][BSINC_POINTS_MAX]; + static double phDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT + 1][BSINC_POINTS_MAX]; + static double spDeltas[BSINC_SCALE_COUNT][BSINC_PHASE_COUNT ][BSINC_POINTS_MAX]; static int mt[BSINC_SCALE_COUNT]; static double at[BSINC_SCALE_COUNT]; + const int num_points_min = order + 1; double width, beta, scaleBase, scaleRange; int si, pi, i; @@ -147,8 +155,8 @@ static void BsiGenerateTables() band, but it may vary due to the linear interpolation between scales of the filter. */ - width = CalcKaiserWidth(BSINC_REJECTION, BSINC_POINTS_MIN); - beta = CalcKaiserBeta(BSINC_REJECTION); + width = CalcKaiserWidth(rejection, order); + beta = CalcKaiserBeta(rejection); scaleBase = width / 2.0; scaleRange = 1.0 - scaleBase; @@ -156,11 +164,8 @@ static void BsiGenerateTables() for(si = 0; si < BSINC_SCALE_COUNT; si++) { const double scale = scaleBase + (scaleRange * si / (BSINC_SCALE_COUNT - 1)); - const double a = MinDouble(BSINC_POINTS_MIN, BSINC_POINTS_MIN / (2.0 * scale)); - int m = 2 * (int)floor(a); - - // Make sure the number of points is a multiple of 4 (for SSE). - m += ~(m - 1) & 3; + const double a = MinDouble(floor(num_points_min / (2.0 * scale)), num_points_min); + const int m = 2 * (int)a; mt[si] = m; at[si] = a; @@ -172,7 +177,7 @@ static void BsiGenerateTables() for(si = 0; si < BSINC_SCALE_COUNT; si++) { const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); + const int o = num_points_min - (m / 2); const int l = (m / 2) - 1; const double a = at[si]; const double scale = scaleBase + (scaleRange * si / (BSINC_SCALE_COUNT - 1)); @@ -199,7 +204,7 @@ static void BsiGenerateTables() for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) { const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); + const int o = num_points_min - (m / 2); for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) { @@ -212,7 +217,7 @@ static void BsiGenerateTables() for(si = 0; si < BSINC_SCALE_COUNT; si++) { const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); + const int o = num_points_min - (m / 2); for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) { @@ -227,7 +232,7 @@ static void BsiGenerateTables() for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) { const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); + const int o = num_points_min - (m / 2); for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) { @@ -236,140 +241,83 @@ static void BsiGenerateTables() } } - // Calculate the table size. - i = mt[0]; - for(si = 1; si < BSINC_SCALE_COUNT; si++) - i += BSINC_PHASE_COUNT * mt[si]; - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - i += 2 * BSINC_PHASE_COUNT * mt[si]; - for(si = 1; si < BSINC_SCALE_COUNT; si++) - i += BSINC_PHASE_COUNT * mt[si]; + // Make sure the number of points is a multiple of 4 (for SIMD). + for(si = 0; si < BSINC_SCALE_COUNT; si++) + mt[si] = (mt[si]+3) & ~3; - fprintf(stdout, "static const float bsincTab[%d] =\n{\n", i); - - /* Only output enough coefficients for the first (cut) scale as needed to - perform interpolation without extra branching. - */ - fprintf(stdout, " /* %2d,%2d */", mt[0], 0); - for(i = 0; i < mt[0]; i++) - fprintf(stdout, " %+14.9ef,", filter[0][0][i]); - fprintf(stdout, "\n\n"); - - for(si = 1; si < BSINC_SCALE_COUNT; si++) - { - const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); - - for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) - { - fprintf(stdout, " /* %2d,%2d */", m, pi); - for(i = 0; i < m; i++) - fprintf(stdout, " %+14.9ef,", filter[si][pi][o + i]); - fprintf(stdout, "\n"); - } - } - fprintf(stdout, "\n"); - - // There are N-1 scale deltas for N scales. - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - { - const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); - - for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) - { - fprintf(stdout, " /* %2d,%2d */", m, pi); - for(i = 0; i < m; i++) - fprintf(stdout, " %+14.9ef,", scDeltas[si][pi][o + i]); - fprintf(stdout, "\n"); - } - } - fprintf(stdout, "\n"); - - // Exclude phases for the first (cut) scale. - for(si = 1; si < BSINC_SCALE_COUNT; si++) - { - const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); - - for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) - { - fprintf(stdout, " /* %2d,%2d */", m, pi); - for(i = 0; i < m; i++) - fprintf(stdout, " %+14.9ef,", phDeltas[si][pi][o + i]); - fprintf(stdout, "\n"); - } - } - fprintf(stdout, "\n"); - - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - { - const int m = mt[si]; - const int o = BSINC_POINTS_MIN - (m / 2); - - for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) - { - fprintf(stdout, " /* %2d,%2d */", m, pi); - for(i = 0; i < m; i++) - fprintf(stdout, " %+14.9ef,", spDeltas[si][pi][o + i]); - fprintf(stdout, "\n"); - } - } - fprintf(stdout, "};\n\n"); + fprintf(output, +"/* This %d%s order filter has a rejection of -%.0fdB, yielding a transition width\n" +" * of ~%.3f (normalized frequency). Order increases when downsampling to a\n" +" * limit of one octave, after which the quality of the filter (transition\n" +" * width) suffers to reduce the CPU cost. The bandlimiting will cut all sound\n" +" * after downsampling by ~%.2f octaves.\n" +" */\n" +"const BSincTable %s = {\n", + order, (((order%100)/10) == 1) ? "th" : + ((order%10) == 1) ? "st" : + ((order%10) == 2) ? "nd" : + ((order%10) == 3) ? "rd" : "th", + rejection, width, log2(1.0/scaleBase), tabname); /* The scaleBase is calculated from the Kaiser window transition width. It represents the absolute limit to the filter before it fully cuts the signal. The limit in octaves can be calculated by taking the base-2 logarithm of its inverse: log_2(1 / scaleBase) */ - fprintf(stdout, " static const ALfloat scaleBase = %.9ef, scaleRange = %.9ef;\n", scaleBase, 1.0 / scaleRange); - fprintf(stdout, " static const ALuint m[BSINC_SCALE_COUNT] = {"); + fprintf(output, " /* scaleBase */ %.9ef, /* scaleRange */ %.9ef,\n", scaleBase, 1.0 / scaleRange); - fprintf(stdout, " %d", mt[0]); + fprintf(output, " /* m */ {"); + fprintf(output, " %d", mt[0]); for(si = 1; si < BSINC_SCALE_COUNT; si++) - fprintf(stdout, ", %d", mt[si]); + fprintf(output, ", %d", mt[si]); + fprintf(output, " },\n"); - fprintf(stdout, " };\n"); - fprintf(stdout, " static const ALuint to[4][BSINC_SCALE_COUNT] =\n {\n { 0"); - - i = mt[0]; + fprintf(output, " /* filterOffset */ {"); + fprintf(output, " %d", 0); + i = mt[0]*4*BSINC_PHASE_COUNT; for(si = 1; si < BSINC_SCALE_COUNT; si++) { - fprintf(stdout, ", %d", i); - i += BSINC_PHASE_COUNT * mt[si]; + fprintf(output, ", %d", i); + i += mt[si]*4*BSINC_PHASE_COUNT; } - fprintf(stdout, " },\n {"); - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - { - fprintf(stdout, " %d,", i); - i += BSINC_PHASE_COUNT * mt[si]; - } - fprintf(stdout, " 0 },\n { 0"); - for(si = 1; si < BSINC_SCALE_COUNT; si++) - { - fprintf(stdout, ", %d", i); - i += BSINC_PHASE_COUNT * mt[si]; - } - fprintf (stdout, " },\n {"); - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - { - fprintf(stdout, " %d,", i); - i += BSINC_PHASE_COUNT * mt[si]; - } - fprintf(stdout, " 0 }\n };\n"); - fprintf(stdout, " static const ALuint tm[2][BSINC_SCALE_COUNT] = \n {\n { 0"); - for(si = 1; si < BSINC_SCALE_COUNT; si++) - fprintf(stdout, ", %d", mt[si]); - fprintf(stdout, " },\n {"); - for(si = 0; si < (BSINC_SCALE_COUNT - 1); si++) - fprintf(stdout, " %d,", mt[si]); - fprintf(stdout, " 0 }\n };\n\n"); + fprintf(output, " },\n"); + + // Calculate the table size. + i = 0; + for(si = 0; si < BSINC_SCALE_COUNT; si++) + i += 4 * BSINC_PHASE_COUNT * mt[si]; + + fprintf(output, "\n /* Tab (%d entries) */ {\n", i); + for(si = 0; si < BSINC_SCALE_COUNT; si++) + { + const int m = mt[si]; + const int o = num_points_min - (m / 2); + + for(pi = 0; pi < BSINC_PHASE_COUNT; pi++) + { + fprintf(output, " /* %2d,%2d (%d) */", si, pi, m); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", filter[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", scDeltas[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", phDeltas[si][pi][o + i]); + fprintf(output, "\n "); + for(i = 0; i < m; i++) + fprintf(output, " %+14.9ef,", spDeltas[si][pi][o + i]); + fprintf(output, "\n"); + } + } + fprintf(output, " }\n};\n\n"); } /* These methods generate a much simplified 4-point sinc interpolator using a - * Kaiser windows. This is much simpler to process at run-time, but has notably + * Kaiser window. This is much simpler to process at run-time, but has notably * more aliasing noise. */ @@ -377,36 +325,80 @@ static void BsiGenerateTables() #define FRACTIONBITS (12) #define FRACTIONONE (1< 2) + { + fprintf(stderr, "Usage: %s [output file]\n", argv[0]); + return 1; + } + + if(argc == 2) + { + output = fopen(argv[1], "wb"); + if(!output) + { + fprintf(stderr, "Failed to open %s for writing\n", argv[1]); + return 1; + } + } + else + output = stdout; + + fprintf(output, "/* Generated by bsincgen, do not edit! */\n\n" +"static_assert(BSINC_SCALE_COUNT == %d, \"Unexpected BSINC_SCALE_COUNT value!\");\n" +"static_assert(BSINC_PHASE_COUNT == %d, \"Unexpected BSINC_PHASE_COUNT value!\");\n" +"static_assert(FRACTIONONE == %d, \"Unexpected FRACTIONONE value!\");\n\n" +"typedef struct BSincTable {\n" +" const float scaleBase, scaleRange;\n" +" const int m[BSINC_SCALE_COUNT];\n" +" const int filterOffset[BSINC_SCALE_COUNT];\n" +" alignas(16) const float Tab[];\n" +"} BSincTable;\n\n", BSINC_SCALE_COUNT, BSINC_PHASE_COUNT, FRACTIONONE); + /* A 23rd order filter with a -60dB drop at nyquist. */ + BsiGenerateTables(output, "bsinc24", 60.0, 23); + /* An 11th order filter with a -60dB drop at nyquist. */ + BsiGenerateTables(output, "bsinc12", 60.0, 11); + Sinc4GenerateTables(output, 60.0); + + if(output != stdout) + fclose(output); + output = NULL; + return 0; } diff --git a/love/src/jni/openal-soft-1.19.1/utils/getopt.c b/love/src/jni/openal-soft-1.19.1/utils/getopt.c new file mode 100644 index 00000000..ab1a246e --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/utils/getopt.c @@ -0,0 +1,137 @@ +/* $NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $ */ + +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; +#endif /* LIBC_SCCS and not lint */ +#include +#include +#include +#include "getopt.h" + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * Get program name in Windows + */ +const char * _getprogname(void); + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(int nargc, char * const nargv[], const char *ostr) +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || *place == 0) { /* update scanning pointer */ + optreset = 0; + place = nargv[optind]; + if (optind >= nargc || *place++ != '-') { + /* Argument is absent or is not an option */ + place = EMSG; + return (-1); + } + optopt = *place++; + if (optopt == '-' && *place == 0) { + /* "--" => end of options */ + ++optind; + place = EMSG; + return (-1); + } + if (optopt == 0) { + /* Solitary '-', treat as a '-' option + if the program (eg su) is looking for it. */ + place = EMSG; + if (strchr(ostr, '-') == NULL) + return (-1); + optopt = '-'; + } + } else + optopt = *place++; + + /* See if option letter is one the caller wanted... */ + if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { + if (*place == 0) + ++optind; + if (opterr && *ostr != ':') + (void)fprintf(stderr, + "%s: illegal option -- %c\n", _getprogname(), + optopt); + return (BADCH); + } + + /* Does this option need an argument? */ + if (oli[1] != ':') { + /* don't need argument */ + optarg = NULL; + if (*place == 0) + ++optind; + } else { + /* Option-argument is either the rest of this argument or the + entire next argument. */ + if (*place) + optarg = place; + else if (nargc > ++optind) + optarg = nargv[optind]; + else { + /* option-argument absent */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void)fprintf(stderr, + "%s: option requires an argument -- %c\n", + _getprogname(), optopt); + return (BADCH); + } + place = EMSG; + ++optind; + } + return (optopt); /* return option letter */ +} + +const char * _getprogname() { + char *pgmptr = NULL; + _get_pgmptr(&pgmptr); + return strrchr(pgmptr,'\\')+1; +} + diff --git a/love/src/jni/openal-soft-1.19.1/utils/getopt.h b/love/src/jni/openal-soft-1.19.1/utils/getopt.h new file mode 100644 index 00000000..f894d9d9 --- /dev/null +++ b/love/src/jni/openal-soft-1.19.1/utils/getopt.h @@ -0,0 +1,26 @@ +#ifndef GETOPT_H +#define GETOPT_H + +#ifndef _WIN32 + +#include + +#else /* _WIN32 */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern char *optarg; +extern int optind, opterr, optopt, optreset; + +int getopt(int nargc, char * const nargv[], const char *ostr); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* !_WIN32 */ + +#endif /* !GETOPT_H */ + diff --git a/love/src/jni/openal-soft-1.18.2/utils/makehrtf.c b/love/src/jni/openal-soft-1.19.1/utils/makehrtf.c similarity index 60% rename from love/src/jni/openal-soft-1.18.2/utils/makehrtf.c rename to love/src/jni/openal-soft-1.19.1/utils/makehrtf.c index 547c80db..0bd36849 100644 --- a/love/src/jni/openal-soft-1.18.2/utils/makehrtf.c +++ b/love/src/jni/openal-soft-1.19.1/utils/makehrtf.c @@ -60,19 +60,38 @@ #include "config.h" +#define _UNICODE #include #include #include +#include #include +#include #include #include #ifdef HAVE_STRINGS_H #include #endif +#ifdef HAVE_GETOPT +#include +#else +#include "getopt.h" +#endif -// Rely (if naively) on OpenAL's header for the types used for serialization. -#include "AL/al.h" -#include "AL/alext.h" +#include "win_main_utf8.h" + +/* Define int64_t and uint64_t types */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif #ifndef M_PI #define M_PI (3.14159265358979323846) @@ -82,6 +101,7 @@ #define HUGE_VAL (1.0 / 0.0) #endif + // The epsilon used to maintain signal stability. #define EPSILON (1e-9) @@ -109,6 +129,9 @@ #define MIN_POINTS (16) #define MAX_POINTS (8192) +// The limit to the number of 'distances' listed in the data set definition. +#define MAX_FD_COUNT (16) + // The limits to the number of 'azimuths' listed in the data set definition. #define MIN_EV_COUNT (5) #define MAX_EV_COUNT (128) @@ -121,10 +144,10 @@ #define MIN_RADIUS (0.05) #define MAX_RADIUS (0.15) -// The limits for the 'distance' from source to listener in the definition -// file. -#define MIN_DISTANCE (0.5) -#define MAX_DISTANCE (2.5) +// The limits for the 'distance' from source to listener for each field in +// the definition file. +#define MIN_DISTANCE (0.05) +#define MAX_DISTANCE (2.50) // The maximum number of channels that can be addressed for a WAVE file // source listed in the data set definition. @@ -192,8 +215,21 @@ #define MAX_HRTD (63.0) // The OpenAL Soft HRTF format marker. It stands for minimum-phase head -// response protocol 01. -#define MHR_FORMAT ("MinPHR01") +// response protocol 02. +#define MHR_FORMAT ("MinPHR02") + +// Sample and channel type enum values. +typedef enum SampleTypeT { + ST_S16 = 0, + ST_S24 = 1 +} SampleTypeT; + +// Certain iterations rely on these integer enum values. +typedef enum ChannelTypeT { + CT_NONE = -1, + CT_MONO = 0, + CT_STEREO = 1 +} ChannelTypeT; // Byte order for the serialization routines. typedef enum ByteOrderT { @@ -225,20 +261,14 @@ typedef enum HeadModelT { HM_SPHERE // Calculate the onset using a spherical head model. } HeadModelT; -// Desired output format from the command line. -typedef enum OutputFormatT { - OF_NONE, - OF_MHR // OpenAL Soft MHR data set file. -} OutputFormatT; - // Unsigned integer type. typedef unsigned int uint; // Serialization types. The trailing digit indicates the number of bits. -typedef ALubyte uint8; -typedef ALint int32; -typedef ALuint uint32; -typedef ALuint64SOFT uint64; +typedef unsigned char uint8; +typedef int int32; +typedef unsigned int uint32; +typedef uint64_t uint64; // Token reader state for parsing the data set definition. typedef struct TokenReaderT { @@ -263,23 +293,42 @@ typedef struct SourceRefT { char mPath[MAX_PATH_LEN+1]; } SourceRefT; +// Structured HRIR storage for stereo azimuth pairs, elevations, and fields. +typedef struct HrirAzT { + double mAzimuth; + uint mIndex; + double mDelays[2]; + double *mIrs[2]; +} HrirAzT; + +typedef struct HrirEvT { + double mElevation; + uint mIrCount; + uint mAzCount; + HrirAzT *mAzs; +} HrirEvT; + +typedef struct HrirFdT { + double mDistance; + uint mIrCount; + uint mEvCount; + uint mEvStart; + HrirEvT *mEvs; +} HrirFdT; + // The HRIR metrics and data set used when loading, processing, and storing // the resulting HRTF. typedef struct HrirDataT { uint mIrRate; - uint mIrCount; - uint mIrSize; + SampleTypeT mSampleType; + ChannelTypeT mChannelType; uint mIrPoints; uint mFftSize; - uint mEvCount; - uint mEvStart; - uint mAzCount[MAX_EV_COUNT]; - uint mEvOffset[MAX_EV_COUNT]; + uint mIrSize; double mRadius; - double mDistance; - double *mHrirs; - double *mHrtds; - double mMaxHrtd; + uint mIrCount; + uint mFdCount; + HrirFdT *mFds; } HrirDataT; // The resampler metrics and FIR filter. @@ -289,6 +338,66 @@ typedef struct ResamplerT { } ResamplerT; +/**************************************** + *** Complex number type and routines *** + ****************************************/ + +typedef struct { + double Real, Imag; +} Complex; + +static Complex MakeComplex(double r, double i) +{ + Complex c = { r, i }; + return c; +} + +static Complex c_add(Complex a, Complex b) +{ + Complex r; + r.Real = a.Real + b.Real; + r.Imag = a.Imag + b.Imag; + return r; +} + +static Complex c_sub(Complex a, Complex b) +{ + Complex r; + r.Real = a.Real - b.Real; + r.Imag = a.Imag - b.Imag; + return r; +} + +static Complex c_mul(Complex a, Complex b) +{ + Complex r; + r.Real = a.Real*b.Real - a.Imag*b.Imag; + r.Imag = a.Imag*b.Real + a.Real*b.Imag; + return r; +} + +static Complex c_muls(Complex a, double s) +{ + Complex r; + r.Real = a.Real * s; + r.Imag = a.Imag * s; + return r; +} + +static double c_abs(Complex a) +{ + return sqrt(a.Real*a.Real + a.Imag*a.Imag); +} + +static Complex c_exp(Complex a) +{ + Complex r; + double e = exp(a.Real); + r.Real = e * cos(a.Imag); + r.Imag = e * sin(a.Imag); + return r; +} + /***************************** *** Token reader routines *** *****************************/ @@ -444,6 +553,19 @@ static void TrIndication(TokenReaderT *tr, uint *line, uint *column) if(column) *column = tr->mColumn; } +// Checks to see if a token is (likely to be) an identifier. It does not +// display any errors and will not proceed to the next token. +static int TrIsIdent(TokenReaderT *tr) +{ + char ch; + + if(!TrSkipWhitespace(tr)) + return 0; + ch = tr->mRing[tr->mOut&TR_RING_MASK]; + return ch == '_' || isalpha(ch); +} + + // Checks to see if a token is the given operator. It does not display any // errors and will not proceed to the next token. static int TrIsOperator(TokenReaderT *tr, const char *op) @@ -552,9 +674,9 @@ static int TrReadInt(TokenReaderT *tr, const int loBound, const int hiBound, int if(*value < loBound || *value > hiBound) { TrErrorAt(tr, tr->mLine, col, "Expected a value from %d to %d.\n", loBound, hiBound); - return (0); + return 0; } - return (1); + return 1; } } TrErrorAt(tr, tr->mLine, col, "Expected an integer.\n"); @@ -647,7 +769,7 @@ static int TrReadFloat(TokenReaderT *tr, const double loBound, const double hiBo *value = strtod(temp, NULL); if(*value < loBound || *value > hiBound) { - TrErrorAt (tr, tr->mLine, col, "Expected a value from %f to %f.\n", loBound, hiBound); + TrErrorAt(tr, tr->mLine, col, "Expected a value from %f to %f.\n", loBound, hiBound); return 0; } return 1; @@ -683,7 +805,7 @@ static int TrReadString(TokenReaderT *tr, const uint maxLen, char *text) break; if(ch == '\n') { - TrErrorAt (tr, tr->mLine, col, "Unterminated string at end of line.\n"); + TrErrorAt(tr, tr->mLine, col, "Unterminated string at end of line.\n"); return 0; } if(len < maxLen) @@ -699,7 +821,7 @@ static int TrReadString(TokenReaderT *tr, const uint maxLen, char *text) tr->mColumn += 2 + len; if(len > maxLen) { - TrErrorAt (tr, tr->mLine, col, "String is too long.\n"); + TrErrorAt(tr, tr->mLine, col, "String is too long.\n"); return 0; } text[len] = '\0'; @@ -812,30 +934,38 @@ static double Clamp(const double val, const double lower, const double upper) // Performs linear interpolation. static double Lerp(const double a, const double b, const double f) { - return a + (f * (b - a)); + return a + f * (b - a); } -// Performs a high-passed triangular probability density function dither from -// a double to an integer. It assumes the input sample is already scaled. -static int HpTpdfDither(const double in, int *hpHist) +static inline uint dither_rng(uint *seed) { - static const double PRNG_SCALE = 1.0 / (RAND_MAX+1.0); - int prn; - double out; + *seed = *seed * 96314165 + 907633515; + return *seed; +} - prn = rand(); - out = round(in + (PRNG_SCALE * (prn - *hpHist))); - *hpHist = prn; - return (int)out; +// Performs a triangular probability density function dither. The input samples +// should be normalized (-1 to +1). +static void TpdfDither(double *restrict out, const double *restrict in, const double scale, + const int count, const int step, uint *seed) +{ + static const double PRNG_SCALE = 1.0 / UINT_MAX; + uint prn0, prn1; + int i; + + for(i = 0;i < count;i++) + { + prn0 = dither_rng(seed); + prn1 = dither_rng(seed); + out[i*step] = round(in[i]*scale + (prn0*PRNG_SCALE - prn1*PRNG_SCALE)); + } } // Allocates an array of doubles. -static double *CreateArray(size_t n) +static double *CreateDoubles(size_t n) { double *a; - if(n == 0) n = 1; - a = calloc(n, sizeof(double)); + a = calloc(n?n:1, sizeof(*a)); if(a == NULL) { fprintf(stderr, "Error: Out of memory.\n"); @@ -844,146 +974,94 @@ static double *CreateArray(size_t n) return a; } -// Frees an array of doubles. -static void DestroyArray(double *a) -{ free(a); } - -// Complex number routines. All outputs must be non-NULL. - -// Magnitude/absolute value. -static double ComplexAbs(const double r, const double i) +// Allocates an array of complex numbers. +static Complex *CreateComplexes(size_t n) { - return sqrt(r*r + i*i); + Complex *a; + + a = calloc(n?n:1, sizeof(*a)); + if(a == NULL) + { + fprintf(stderr, "Error: Out of memory.\n"); + exit(-1); + } + return a; } -// Multiply. -static void ComplexMul(const double aR, const double aI, const double bR, const double bI, double *outR, double *outI) -{ - *outR = (aR * bR) - (aI * bI); - *outI = (aI * bR) + (aR * bI); -} - -// Base-e exponent. -static void ComplexExp(const double inR, const double inI, double *outR, double *outI) -{ - double e = exp(inR); - *outR = e * cos(inI); - *outI = e * sin(inI); -} - -/* Fast Fourier transform routines. The number of points must be a power of - * two. In-place operation is possible only if both the real and imaginary - * parts are in-place together. +/* Fast Fourier transform routines. The number of points must be a power of + * two. */ // Performs bit-reversal ordering. -static void FftArrange(const uint n, const double *inR, const double *inI, double *outR, double *outI) +static void FftArrange(const uint n, Complex *inout) { uint rk, k, m; - double tempR, tempI; - if(inR == outR && inI == outI) + // Handle in-place arrangement. + rk = 0; + for(k = 0;k < n;k++) { - // Handle in-place arrangement. - rk = 0; - for(k = 0;k < n;k++) + if(rk > k) { - if(rk > k) - { - tempR = inR[rk]; - tempI = inI[rk]; - outR[rk] = inR[k]; - outI[rk] = inI[k]; - outR[k] = tempR; - outI[k] = tempI; - } - m = n; - while(rk&(m >>= 1)) - rk &= ~m; - rk |= m; - } - } - else - { - // Handle copy arrangement. - rk = 0; - for(k = 0;k < n;k++) - { - outR[rk] = inR[k]; - outI[rk] = inI[k]; - m = n; - while(rk&(m >>= 1)) - rk &= ~m; - rk |= m; + Complex temp = inout[rk]; + inout[rk] = inout[k]; + inout[k] = temp; } + + m = n; + while(rk&(m >>= 1)) + rk &= ~m; + rk |= m; } } // Performs the summation. -static void FftSummation(const uint n, const double s, double *re, double *im) +static void FftSummation(const int n, const double s, Complex *cplx) { double pi; - uint m, m2; - double vR, vI, wR, wI; - uint i, k, mk; - double tR, tI; + int m, m2; + int i, k, mk; pi = s * M_PI; for(m = 1, m2 = 2;m < n; m <<= 1, m2 <<= 1) { // v = Complex (-2.0 * sin (0.5 * pi / m) * sin (0.5 * pi / m), -sin (pi / m)) - vR = sin(0.5 * pi / m); - vR = -2.0 * vR * vR; - vI = -sin(pi / m); - // w = Complex (1.0, 0.0) - wR = 1.0; - wI = 0.0; + double sm = sin(0.5 * pi / m); + Complex v = MakeComplex(-2.0*sm*sm, -sin(pi / m)); + Complex w = MakeComplex(1.0, 0.0); for(i = 0;i < m;i++) { for(k = i;k < n;k += m2) { + Complex t; mk = k + m; - // t = ComplexMul(w, out[km2]) - tR = (wR * re[mk]) - (wI * im[mk]); - tI = (wR * im[mk]) + (wI * re[mk]); - // out[mk] = ComplexSub (out [k], t) - re[mk] = re[k] - tR; - im[mk] = im[k] - tI; - // out[k] = ComplexAdd (out [k], t) - re[k] += tR; - im[k] += tI; + t = c_mul(w, cplx[mk]); + cplx[mk] = c_sub(cplx[k], t); + cplx[k] = c_add(cplx[k], t); } - // t = ComplexMul (v, w) - tR = (vR * wR) - (vI * wI); - tI = (vR * wI) + (vI * wR); - // w = ComplexAdd (w, t) - wR += tR; - wI += tI; + w = c_add(w, c_mul(v, w)); } } } // Performs a forward FFT. -static void FftForward(const uint n, const double *inR, const double *inI, double *outR, double *outI) +static void FftForward(const uint n, Complex *inout) { - FftArrange(n, inR, inI, outR, outI); - FftSummation(n, 1.0, outR, outI); + FftArrange(n, inout); + FftSummation(n, 1.0, inout); } // Performs an inverse FFT. -static void FftInverse(const uint n, const double *inR, const double *inI, double *outR, double *outI) +static void FftInverse(const uint n, Complex *inout) { double f; uint i; - FftArrange(n, inR, inI, outR, outI); - FftSummation(n, -1.0, outR, outI); + FftArrange(n, inout); + FftSummation(n, -1.0, inout); f = 1.0 / n; for(i = 0;i < n;i++) - { - outR[i] *= f; - outI[i] *= f; - } + inout[i] = c_muls(inout[i], f); } /* Calculate the complex helical sequence (or discrete-time analytical signal) @@ -991,39 +1069,22 @@ static void FftInverse(const uint n, const double *inR, const double *inI, doubl * of a signal's magnitude response, the imaginary components can be used as * the angles for minimum-phase reconstruction. */ -static void Hilbert(const uint n, const double *in, double *outR, double *outI) +static void Hilbert(const uint n, Complex *inout) { uint i; - if(in == outR) - { - // Handle in-place operation. - for(i = 0;i < n;i++) - outI[i] = 0.0; - } - else - { - // Handle copy operation. - for(i = 0;i < n;i++) - { - outR[i] = in[i]; - outI[i] = 0.0; - } - } - FftInverse(n, outR, outI, outR, outI); + // Handle in-place operation. + for(i = 0;i < n;i++) + inout[i].Imag = 0.0; + + FftInverse(n, inout); for(i = 1;i < (n+1)/2;i++) - { - outR[i] *= 2.0; - outI[i] *= 2.0; - } + inout[i] = c_muls(inout[i], 2.0); /* Increment i if n is even. */ i += (n&1)^1; for(;i < n;i++) - { - outR[i] = 0.0; - outI[i] = 0.0; - } - FftForward(n, outR, outI, outR, outI); + inout[i] = MakeComplex(0.0, 0.0); + FftForward(n, inout); } /* Calculate the magnitude response of the given input. This is used in @@ -1031,21 +1092,20 @@ static void Hilbert(const uint n, const double *in, double *outR, double *outI) * minimum phase reconstruction. The mirrored half of the response is also * discarded. */ -static void MagnitudeResponse(const uint n, const double *inR, const double *inI, double *out) +static void MagnitudeResponse(const uint n, const Complex *in, double *out) { const uint m = 1 + (n / 2); uint i; for(i = 0;i < m;i++) - out[i] = fmax(ComplexAbs(inR[i], inI[i]), EPSILON); + out[i] = fmax(c_abs(in[i]), EPSILON); } /* Apply a range limit (in dB) to the given magnitude response. This is used * to adjust the effects of the diffuse-field average on the equalization * process. */ -static void LimitMagnitudeResponse(const uint n, const double limit, const double *in, double *out) +static void LimitMagnitudeResponse(const uint n, const uint m, const double limit, const double *in, double *out) { - const uint m = 1 + (n / 2); double halfLim; uint i, lower, upper; double ave; @@ -1074,33 +1134,32 @@ static void LimitMagnitudeResponse(const uint n, const double limit, const doubl * residuals (which were discarded). The mirrored half of the response is * reconstructed. */ -static void MinimumPhase(const uint n, const double *in, double *outR, double *outI) +static void MinimumPhase(const uint n, const double *in, Complex *out) { const uint m = 1 + (n / 2); double *mags; - double aR, aI; uint i; - mags = CreateArray(n); + mags = CreateDoubles(n); for(i = 0;i < m;i++) { mags[i] = fmax(EPSILON, in[i]); - outR[i] = log(mags[i]); + out[i] = MakeComplex(log(mags[i]), 0.0); } for(;i < n;i++) { mags[i] = mags[n - i]; - outR[i] = outR[n - i]; + out[i] = out[n - i]; } - Hilbert(n, outR, outR, outI); + Hilbert(n, out); // Remove any DC offset the filter has. mags[0] = EPSILON; for(i = 0;i < n;i++) { - ComplexExp(0.0, outI[i], &aR, &aI); - ComplexMul(mags[i], 0.0, aR, aI, &outR[i], &outI[i]); + Complex a = c_exp(MakeComplex(0.0, out[i].Imag)); + out[i] = c_mul(MakeComplex(mags[i], 0.0), a); } - DestroyArray(mags); + free(mags); } @@ -1276,12 +1335,13 @@ static void ResamplerSetup(ResamplerT *rs, const uint srcRate, const uint dstRat cutoff = 0.475 / rs->mQ; width = 0.05 / rs->mQ; } - // A rejection of -180 dB is used for the stop band. - l = CalcKaiserOrder(180.0, width) / 2; + // A rejection of -180 dB is used for the stop band. Round up when + // calculating the left offset to avoid increasing the transition width. + l = (CalcKaiserOrder(180.0, width)+1) / 2; beta = CalcKaiserBeta(180.0); - rs->mM = (2 * l) + 1; + rs->mM = l*2 + 1; rs->mL = l; - rs->mF = CreateArray(rs->mM); + rs->mF = CreateDoubles(rs->mM); for(i = 0;i < ((int)rs->mM);i++) rs->mF[i] = SincFilter((int)l, beta, rs->mP, cutoff, i); } @@ -1289,7 +1349,7 @@ static void ResamplerSetup(ResamplerT *rs, const uint srcRate, const uint dstRat // Clean up after the resampler. static void ResamplerClear(ResamplerT *rs) { - DestroyArray(rs->mF); + free(rs->mF); rs->mF = NULL; } @@ -1308,7 +1368,7 @@ static void ResamplerRun(ResamplerT *rs, const uint inN, const double *in, const // Handle in-place operation. if(in == out) - work = CreateArray(outN); + work = CreateDoubles(outN); else work = out; // Resample the input. @@ -1331,11 +1391,11 @@ static void ResamplerRun(ResamplerT *rs, const uint inN, const double *in, const work[i] = r; } // Clean up after in-place operation. - if(in == out) + if(work != out) { for(i = 0;i < outN;i++) out[i] = work[i]; - DestroyArray(work); + free(work); } } @@ -1498,18 +1558,18 @@ static int ReadWaveFormat(FILE *fp, const ByteOrderT order, const uint hrirRate, chunkSize = 0; do { - if (chunkSize > 0) - fseek (fp, (long) chunkSize, SEEK_CUR); + if(chunkSize > 0) + fseek (fp, (long) chunkSize, SEEK_CUR); if(!ReadBin4(fp, src->mPath, BO_LITTLE, 4, &fourCC) || !ReadBin4(fp, src->mPath, order, 4, &chunkSize)) - return 0; + return 0; } while(fourCC != FOURCC_FMT); - if(!ReadBin4(fp, src->mPath, order, 2, & format) || - !ReadBin4(fp, src->mPath, order, 2, & channels) || - !ReadBin4(fp, src->mPath, order, 4, & rate) || - !ReadBin4(fp, src->mPath, order, 4, & dummy) || - !ReadBin4(fp, src->mPath, order, 2, & block)) - return (0); + if(!ReadBin4(fp, src->mPath, order, 2, &format) || + !ReadBin4(fp, src->mPath, order, 2, &channels) || + !ReadBin4(fp, src->mPath, order, 4, &rate) || + !ReadBin4(fp, src->mPath, order, 4, &dummy) || + !ReadBin4(fp, src->mPath, order, 2, &block)) + return 0; block /= channels; if(chunkSize > 14) { @@ -1616,10 +1676,11 @@ static int ReadWaveList(FILE *fp, const SourceRefT *src, const ByteOrderT order, uint block, skip, offset, i; double lastSample; - for (;;) { - if(!ReadBin4(fp, src->mPath, BO_LITTLE, 4, & fourCC) || - !ReadBin4(fp, src->mPath, order, 4, & chunkSize)) - return (0); + for(;;) + { + if(!ReadBin4(fp, src->mPath, BO_LITTLE, 4, &fourCC) || + !ReadBin4(fp, src->mPath, order, 4, &chunkSize)) + return 0; if(fourCC == FOURCC_DATA) { @@ -1773,7 +1834,7 @@ static int LoadAsciiSource(FILE *fp, const SourceRefT *src, const uint n, double for(i = 0;i < src->mOffset;i++) { if(!ReadAsciiAsDouble(&tr, src->mPath, src->mType, (uint)src->mBits, &dummy)) - return (0); + return 0; } for(i = 0;i < n;i++) { @@ -1794,7 +1855,7 @@ static int LoadSource(SourceRefT *src, const uint hrirRate, const uint n, double int result; FILE *fp; - if (src->mFormat == SF_ASCII) + if(src->mFormat == SF_ASCII) fp = fopen(src->mPath, "r"); else fp = fopen(src->mPath, "rb"); @@ -1866,9 +1927,11 @@ static int WriteBin4(const ByteOrderT order, const uint bytes, const uint32 in, // Store the OpenAL Soft HRTF data set. static int StoreMhr(const HrirDataT *hData, const char *filename) { - uint e, step, end, n, j, i; - int hpHist, v; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint n = hData->mIrPoints; FILE *fp; + uint fi, ei, ai, i; + uint dither_seed = 22222; if((fp=fopen(filename, "wb")) == NULL) { @@ -1879,34 +1942,73 @@ static int StoreMhr(const HrirDataT *hData, const char *filename) return 0; if(!WriteBin4(BO_LITTLE, 4, (uint32)hData->mIrRate, fp, filename)) return 0; + if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mSampleType, fp, filename)) + return 0; + if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mChannelType, fp, filename)) + return 0; if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mIrPoints, fp, filename)) return 0; - if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mEvCount, fp, filename)) + if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mFdCount, fp, filename)) return 0; - for(e = 0;e < hData->mEvCount;e++) + for(fi = 0;fi < hData->mFdCount;fi++) { - if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mAzCount[e], fp, filename)) + if(!WriteBin4(BO_LITTLE, 2, (uint32)(1000.0 * hData->mFds[fi].mDistance), fp, filename)) return 0; - } - step = hData->mIrSize; - end = hData->mIrCount * step; - n = hData->mIrPoints; - srand(0x31DF840C); - for(j = 0;j < end;j += step) - { - hpHist = 0; - for(i = 0;i < n;i++) + if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mFds[fi].mEvCount, fp, filename)) + return 0; + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) { - v = HpTpdfDither(32767.0 * hData->mHrirs[j+i], &hpHist); - if(!WriteBin4(BO_LITTLE, 2, (uint32)v, fp, filename)) + if(!WriteBin4(BO_LITTLE, 1, (uint32)hData->mFds[fi].mEvs[ei].mAzCount, fp, filename)) return 0; } } - for(j = 0;j < hData->mIrCount;j++) + + for(fi = 0;fi < hData->mFdCount;fi++) { - v = (int)fmin(round(hData->mIrRate * hData->mHrtds[j]), MAX_HRTD); - if(!WriteBin4(BO_LITTLE, 1, (uint32)v, fp, filename)) - return 0; + const double scale = (hData->mSampleType == ST_S16) ? 32767.0 : + ((hData->mSampleType == ST_S24) ? 8388607.0 : 0.0); + const int bps = (hData->mSampleType == ST_S16) ? 2 : + ((hData->mSampleType == ST_S24) ? 3 : 0); + + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + double out[2 * MAX_TRUNCSIZE]; + + TpdfDither(out, azd->mIrs[0], scale, n, channels, &dither_seed); + if(hData->mChannelType == CT_STEREO) + TpdfDither(out+1, azd->mIrs[1], scale, n, channels, &dither_seed); + for(i = 0;i < (channels * n);i++) + { + int v = (int)Clamp(out[i], -scale-1.0, scale); + if(!WriteBin4(BO_LITTLE, bps, (uint32)v, fp, filename)) + return 0; + } + } + } + } + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + int v = (int)fmin(round(hData->mIrRate * azd->mDelays[0]), MAX_HRTD); + + if(!WriteBin4(BO_LITTLE, 1, (uint32)v, fp, filename)) + return 0; + if(hData->mChannelType == CT_STEREO) + { + v = (int)fmin(round(hData->mIrRate * azd->mDelays[1]), MAX_HRTD); + + if(!WriteBin4(BO_LITTLE, 1, (uint32)v, fp, filename)) + return 0; + } + } + } } fclose(fp); return 1; @@ -1918,14 +2020,12 @@ static int StoreMhr(const HrirDataT *hData, const char *filename) ***********************/ // Calculate the onset time of an HRIR and average it with any existing -// timing for its elevation and azimuth. -static void AverageHrirOnset(const double *hrir, const double f, const uint ei, const uint ai, const HrirDataT *hData) +// timing for its field, elevation, azimuth, and ear. +static double AverageHrirOnset(const uint rate, const uint n, const double *hrir, const double f, const double onset) { - double mag; - uint n, i, j; + double mag = 0.0; + uint i; - mag = 0.0; - n = hData->mIrPoints; for(i = 0;i < n;i++) mag = fmax(fabs(hrir[i]), mag); mag *= 0.15; @@ -1934,38 +2034,27 @@ static void AverageHrirOnset(const double *hrir, const double f, const uint ei, if(fabs(hrir[i]) >= mag) break; } - j = hData->mEvOffset[ei] + ai; - hData->mHrtds[j] = Lerp(hData->mHrtds[j], ((double)i) / hData->mIrRate, f); + return Lerp(onset, (double)i / rate, f); } // Calculate the magnitude response of an HRIR and average it with any -// existing responses for its elevation and azimuth. -static void AverageHrirMagnitude(const double *hrir, const double f, const uint ei, const uint ai, const HrirDataT *hData) +// existing responses for its field, elevation, azimuth, and ear. +static void AverageHrirMagnitude(const uint points, const uint n, const double *hrir, const double f, double *mag) { - double *re, *im; - uint n, m, i, j; + uint m = 1 + (n / 2), i; + Complex *h = CreateComplexes(n); + double *r = CreateDoubles(n); - n = hData->mFftSize; - re = CreateArray(n); - im = CreateArray(n); - for(i = 0;i < hData->mIrPoints;i++) - { - re[i] = hrir[i]; - im[i] = 0.0; - } + for(i = 0;i < points;i++) + h[i] = MakeComplex(hrir[i], 0.0); for(;i < n;i++) - { - re[i] = 0.0; - im[i] = 0.0; - } - FftForward(n, re, im, re, im); - MagnitudeResponse(n, re, im, re); - m = 1 + (n / 2); - j = (hData->mEvOffset[ei] + ai) * hData->mIrSize; + h[i] = MakeComplex(0.0, 0.0); + FftForward(n, h); + MagnitudeResponse(n, h, r); for(i = 0;i < m;i++) - hData->mHrirs[j+i] = Lerp(hData->mHrirs[j+i], re[i], f); - DestroyArray(im); - DestroyArray(re); + mag[i] = Lerp(mag[i], r[i], f); + free(r); + free(h); } /* Calculate the contribution of each HRIR to the diffuse-field average based @@ -1974,34 +2063,39 @@ static void AverageHrirMagnitude(const double *hrir, const double f, const uint */ static void CalculateDfWeights(const HrirDataT *hData, double *weights) { - double evs, sum, ev, up_ev, down_ev, solidAngle; - uint ei; + double sum, evs, ev, upperEv, lowerEv, solidAngle; + uint fi, ei; - evs = 90.0 / (hData->mEvCount - 1); sum = 0.0; - for(ei = hData->mEvStart;ei < hData->mEvCount;ei++) + for(fi = 0;fi < hData->mFdCount;fi++) { - // For each elevation, calculate the upper and lower limits of the - // patch band. - ev = -90.0 + (ei * 2.0 * evs); - if(ei < (hData->mEvCount - 1)) - up_ev = (ev + evs) * M_PI / 180.0; - else - up_ev = M_PI / 2.0; - if(ei > 0) - down_ev = (ev - evs) * M_PI / 180.0; - else - down_ev = -M_PI / 2.0; - // Calculate the area of the patch band. - solidAngle = 2.0 * M_PI * (sin(up_ev) - sin(down_ev)); - // Each weight is the area of one patch. - weights[ei] = solidAngle / hData->mAzCount [ei]; - // Sum the total surface area covered by the HRIRs. - sum += solidAngle; + evs = M_PI / 2.0 / (hData->mFds[fi].mEvCount - 1); + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + { + // For each elevation, calculate the upper and lower limits of + // the patch band. + ev = hData->mFds[fi].mEvs[ei].mElevation; + lowerEv = fmax(-M_PI / 2.0, ev - evs); + upperEv = fmin(M_PI / 2.0, ev + evs); + // Calculate the area of the patch band. + solidAngle = 2.0 * M_PI * (sin(upperEv) - sin(lowerEv)); + // Each weight is the area of one patch. + weights[(fi * MAX_EV_COUNT) + ei] = solidAngle / hData->mFds[fi].mEvs[ei].mAzCount; + // Sum the total surface area covered by the HRIRs of all fields. + sum += solidAngle; + } + } + /* TODO: It may be interesting to experiment with how a volume-based + weighting performs compared to the existing distance-indepenent + surface patches. + */ + for(fi = 0;fi < hData->mFdCount;fi++) + { + // Normalize the weights given the total surface coverage for all + // fields. + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + weights[(fi * MAX_EV_COUNT) + ei] /= sum; } - // Normalize the weights given the total surface coverage. - for(ei = hData->mEvStart;ei < hData->mEvCount;ei++) - weights[ei] /= sum; } /* Calculate the diffuse-field average from the given magnitude responses of @@ -2009,12 +2103,11 @@ static void CalculateDfWeights(const HrirDataT *hData, double *weights) * surface area covered by each HRIR. The final average can then be limited * by the specified magnitude range (in positive dB; 0.0 to skip). */ -static void CalculateDiffuseFieldAverage(const HrirDataT *hData, const int weighted, const double limit, double *dfa) +static void CalculateDiffuseFieldAverage(const HrirDataT *hData, const uint channels, const uint m, const int weighted, const double limit, double *dfa) { - uint ei, ai, count, step, start, end, m, j, i; - double *weights; + double *weights = CreateDoubles(hData->mFdCount * MAX_EV_COUNT); + uint count, ti, fi, ei, i, ai; - weights = CreateArray(hData->mEvCount); if(weighted) { // Use coverage weighting to calculate the average. @@ -2022,61 +2115,76 @@ static void CalculateDiffuseFieldAverage(const HrirDataT *hData, const int weigh } else { + double weight; + // If coverage weighting is not used, the weights still need to be - // averaged by the number of HRIRs. - count = 0; - for(ei = hData->mEvStart;ei < hData->mEvCount;ei++) - count += hData->mAzCount [ei]; - for(ei = hData->mEvStart;ei < hData->mEvCount;ei++) - weights[ei] = 1.0 / count; - } - ei = hData->mEvStart; - ai = 0; - step = hData->mIrSize; - start = hData->mEvOffset[ei] * step; - end = hData->mIrCount * step; - m = 1 + (hData->mFftSize / 2); - for(i = 0;i < m;i++) - dfa[i] = 0.0; - for(j = start;j < end;j += step) - { - // Get the weight for this HRIR's contribution. - double weight = weights[ei]; - // Add this HRIR's weighted power average to the total. - for(i = 0;i < m;i++) - dfa[i] += weight * hData->mHrirs[j+i] * hData->mHrirs[j+i]; - // Determine the next weight to use. - ai++; - if(ai >= hData->mAzCount[ei]) + // averaged by the number of existing HRIRs. + count = hData->mIrCount; + for(fi = 0;fi < hData->mFdCount;fi++) { - ei++; - ai = 0; + for(ei = 0;ei < hData->mFds[fi].mEvStart;ei++) + count -= hData->mFds[fi].mEvs[ei].mAzCount; + } + weight = 1.0 / count; + + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + weights[(fi * MAX_EV_COUNT) + ei] = weight; } } - // Finish the average calculation and keep it from being too small. - for(i = 0;i < m;i++) - dfa[i] = fmax(sqrt(dfa[i]), EPSILON); - // Apply a limit to the magnitude range of the diffuse-field average if - // desired. - if(limit > 0.0) - LimitMagnitudeResponse(hData->mFftSize, limit, dfa, dfa); - DestroyArray(weights); + for(ti = 0;ti < channels;ti++) + { + for(i = 0;i < m;i++) + dfa[(ti * m) + i] = 0.0; + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + // Get the weight for this HRIR's contribution. + double weight = weights[(fi * MAX_EV_COUNT) + ei]; + + // Add this HRIR's weighted power average to the total. + for(i = 0;i < m;i++) + dfa[(ti * m) + i] += weight * azd->mIrs[ti][i] * azd->mIrs[ti][i]; + } + } + } + // Finish the average calculation and keep it from being too small. + for(i = 0;i < m;i++) + dfa[(ti * m) + i] = fmax(sqrt(dfa[(ti * m) + i]), EPSILON); + // Apply a limit to the magnitude range of the diffuse-field average + // if desired. + if(limit > 0.0) + LimitMagnitudeResponse(hData->mFftSize, m, limit, &dfa[ti * m], &dfa[ti * m]); + } + free(weights); } // Perform diffuse-field equalization on the magnitude responses of the HRIR // set using the given average response. -static void DiffuseFieldEqualize(const double *dfa, const HrirDataT *hData) +static void DiffuseFieldEqualize(const uint channels, const uint m, const double *dfa, const HrirDataT *hData) { - uint step, start, end, m, j, i; + uint ti, fi, ei, ai, i; - step = hData->mIrSize; - start = hData->mEvOffset[hData->mEvStart] * step; - end = hData->mIrCount * step; - m = 1 + (hData->mFftSize / 2); - for(j = start;j < end;j += step) + for(fi = 0;fi < hData->mFdCount;fi++) { - for(i = 0;i < m;i++) - hData->mHrirs[j+i] /= dfa[i]; + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + for(i = 0;i < m;i++) + azd->mIrs[ti][i] /= dfa[(ti * m) + i]; + } + } + } } } @@ -2084,176 +2192,247 @@ static void DiffuseFieldEqualize(const double *dfa, const HrirDataT *hData) // HRIR set. static void ReconstructHrirs(const HrirDataT *hData) { - uint step, start, end, n, j, i; - double *re, *im; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint n = hData->mFftSize; + uint ti, fi, ei, ai, i; + Complex *h = CreateComplexes(n); + uint total, count, pcdone, lastpc; - step = hData->mIrSize; - start = hData->mEvOffset[hData->mEvStart] * step; - end = hData->mIrCount * step; - n = hData->mFftSize; - re = CreateArray(n); - im = CreateArray(n); - for(j = start;j < end;j += step) + total = hData->mIrCount; + for(fi = 0;fi < hData->mFdCount;fi++) { - MinimumPhase(n, &hData->mHrirs[j], re, im); - FftInverse(n, re, im, re, im); - for(i = 0;i < hData->mIrPoints;i++) - hData->mHrirs[j+i] = re[i]; + for(ei = 0;ei < hData->mFds[fi].mEvStart;ei++) + total -= hData->mFds[fi].mEvs[ei].mAzCount; } - DestroyArray (im); - DestroyArray (re); + total *= channels; + count = pcdone = lastpc = 0; + printf("%3d%% done.", pcdone); + fflush(stdout); + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + MinimumPhase(n, azd->mIrs[ti], h); + FftInverse(n, h); + for(i = 0;i < hData->mIrPoints;i++) + azd->mIrs[ti][i] = h[i].Real; + pcdone = ++count * 100 / total; + if(pcdone != lastpc) + { + lastpc = pcdone; + printf("\r%3d%% done.", pcdone); + fflush(stdout); + } + } + } + } + } + printf("\n"); + free(h); } // Resamples the HRIRs for use at the given sampling rate. static void ResampleHrirs(const uint rate, HrirDataT *hData) { - uint n, step, start, end, j; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint n = hData->mIrPoints; + uint ti, fi, ei, ai; ResamplerT rs; ResamplerSetup(&rs, hData->mIrRate, rate); - n = hData->mIrPoints; - step = hData->mIrSize; - start = hData->mEvOffset[hData->mEvStart] * step; - end = hData->mIrCount * step; - for(j = start;j < end;j += step) - ResamplerRun(&rs, n, &hData->mHrirs[j], n, &hData->mHrirs[j]); - ResamplerClear(&rs); + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = hData->mFds[fi].mEvStart;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + ResamplerRun(&rs, n, azd->mIrs[ti], n, azd->mIrs[ti]); + } + } + } hData->mIrRate = rate; + ResamplerClear(&rs); } -/* Given an elevation index and an azimuth, calculate the indices of the two - * HRIRs that bound the coordinate along with a factor for calculating the - * continous HRIR using interpolation. +/* Given field and elevation indices and an azimuth, calculate the indices of + * the two HRIRs that bound the coordinate along with a factor for + * calculating the continuous HRIR using interpolation. */ -static void CalcAzIndices(const HrirDataT *hData, const uint ei, const double az, uint *j0, uint *j1, double *jf) +static void CalcAzIndices(const HrirDataT *hData, const uint fi, const uint ei, const double az, uint *a0, uint *a1, double *af) { - double af; - uint ai; + double f = (2.0*M_PI + az) * hData->mFds[fi].mEvs[ei].mAzCount / (2.0*M_PI); + uint i = (uint)f % hData->mFds[fi].mEvs[ei].mAzCount; - af = ((2.0*M_PI) + az) * hData->mAzCount[ei] / (2.0*M_PI); - ai = ((uint)af) % hData->mAzCount[ei]; - af -= floor(af); - - *j0 = hData->mEvOffset[ei] + ai; - *j1 = hData->mEvOffset[ei] + ((ai+1) % hData->mAzCount [ei]); - *jf = af; + f -= floor(f); + *a0 = i; + *a1 = (i + 1) % hData->mFds[fi].mEvs[ei].mAzCount; + *af = f; } -// Synthesize any missing onset timings at the bottom elevations. This just -// blends between slightly exaggerated known onsets. Not an accurate model. +// Synthesize any missing onset timings at the bottom elevations of each +// field. This just blends between slightly exaggerated known onsets (not +// an accurate model). static void SynthesizeOnsets(HrirDataT *hData) { - uint oi, e, a, j0, j1; - double t, of, jf; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint ti, fi, oi, ai, ei, a0, a1; + double t, of, af; - oi = hData->mEvStart; - t = 0.0; - for(a = 0;a < hData->mAzCount[oi];a++) - t += hData->mHrtds[hData->mEvOffset[oi] + a]; - hData->mHrtds[0] = 1.32e-4 + (t / hData->mAzCount[oi]); - for(e = 1;e < hData->mEvStart;e++) + for(fi = 0;fi < hData->mFdCount;fi++) { - of = ((double)e) / hData->mEvStart; - for(a = 0;a < hData->mAzCount[e];a++) + if(hData->mFds[fi].mEvStart <= 0) + continue; + oi = hData->mFds[fi].mEvStart; + + for(ti = 0;ti < channels;ti++) { - CalcAzIndices(hData, oi, a * 2.0 * M_PI / hData->mAzCount[e], &j0, &j1, &jf); - hData->mHrtds[hData->mEvOffset[e] + a] = Lerp(hData->mHrtds[0], Lerp(hData->mHrtds[j0], hData->mHrtds[j1], jf), of); + t = 0.0; + for(ai = 0;ai < hData->mFds[fi].mEvs[oi].mAzCount;ai++) + t += hData->mFds[fi].mEvs[oi].mAzs[ai].mDelays[ti]; + hData->mFds[fi].mEvs[0].mAzs[0].mDelays[ti] = 1.32e-4 + (t / hData->mFds[fi].mEvs[oi].mAzCount); + for(ei = 1;ei < hData->mFds[fi].mEvStart;ei++) + { + of = (double)ei / hData->mFds[fi].mEvStart; + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + CalcAzIndices(hData, fi, oi, hData->mFds[fi].mEvs[ei].mAzs[ai].mAzimuth, &a0, &a1, &af); + hData->mFds[fi].mEvs[ei].mAzs[ai].mDelays[ti] = Lerp( + hData->mFds[fi].mEvs[0].mAzs[0].mDelays[ti], + Lerp(hData->mFds[fi].mEvs[oi].mAzs[a0].mDelays[ti], + hData->mFds[fi].mEvs[oi].mAzs[a1].mDelays[ti], af), + of + ); + } + } } } } -/* Attempt to synthesize any missing HRIRs at the bottom elevations. Right - * now this just blends the lowest elevation HRIRs together and applies some - * attenuation and high frequency damping. It is a simple, if inaccurate - * model. +/* Attempt to synthesize any missing HRIRs at the bottom elevations of each + * field. Right now this just blends the lowest elevation HRIRs together and + * applies some attenuation and high frequency damping. It is a simple, if + * inaccurate model. */ -static void SynthesizeHrirs (HrirDataT *hData) +static void SynthesizeHrirs(HrirDataT *hData) { - uint oi, a, e, step, n, i, j; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint n = hData->mIrPoints; + uint ti, fi, ai, ei, i; double lp[4], s0, s1; double of, b; - uint j0, j1; - double jf; + uint a0, a1; + double af; - if(hData->mEvStart <= 0) - return; - step = hData->mIrSize; - oi = hData->mEvStart; - n = hData->mIrPoints; - for(i = 0;i < n;i++) - hData->mHrirs[i] = 0.0; - for(a = 0;a < hData->mAzCount[oi];a++) + for(fi = 0;fi < hData->mFdCount;fi++) { - j = (hData->mEvOffset[oi] + a) * step; - for(i = 0;i < n;i++) - hData->mHrirs[i] += hData->mHrirs[j+i] / hData->mAzCount[oi]; - } - for(e = 1;e < hData->mEvStart;e++) - { - of = ((double)e) / hData->mEvStart; - b = (1.0 - of) * (3.5e-6 * hData->mIrRate); - for(a = 0;a < hData->mAzCount[e];a++) + const uint oi = hData->mFds[fi].mEvStart; + if(oi <= 0) continue; + + for(ti = 0;ti < channels;ti++) { - j = (hData->mEvOffset[e] + a) * step; - CalcAzIndices(hData, oi, a * 2.0 * M_PI / hData->mAzCount[e], &j0, &j1, &jf); - j0 *= step; - j1 *= step; + for(i = 0;i < n;i++) + hData->mFds[fi].mEvs[0].mAzs[0].mIrs[ti][i] = 0.0; + for(ai = 0;ai < hData->mFds[fi].mEvs[oi].mAzCount;ai++) + { + for(i = 0;i < n;i++) + hData->mFds[fi].mEvs[0].mAzs[0].mIrs[ti][i] += hData->mFds[fi].mEvs[oi].mAzs[ai].mIrs[ti][i] / + hData->mFds[fi].mEvs[oi].mAzCount; + } + for(ei = 1;ei < hData->mFds[fi].mEvStart;ei++) + { + of = (double)ei / hData->mFds[fi].mEvStart; + b = (1.0 - of) * (3.5e-6 * hData->mIrRate); + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + CalcAzIndices(hData, fi, oi, hData->mFds[fi].mEvs[ei].mAzs[ai].mAzimuth, &a0, &a1, &af); + lp[0] = 0.0; + lp[1] = 0.0; + lp[2] = 0.0; + lp[3] = 0.0; + for(i = 0;i < n;i++) + { + s0 = hData->mFds[fi].mEvs[0].mAzs[0].mIrs[ti][i]; + s1 = Lerp(hData->mFds[fi].mEvs[oi].mAzs[a0].mIrs[ti][i], + hData->mFds[fi].mEvs[oi].mAzs[a1].mIrs[ti][i], af); + s0 = Lerp(s0, s1, of); + lp[0] = Lerp(s0, lp[0], b); + lp[1] = Lerp(lp[0], lp[1], b); + lp[2] = Lerp(lp[1], lp[2], b); + lp[3] = Lerp(lp[2], lp[3], b); + hData->mFds[fi].mEvs[ei].mAzs[ai].mIrs[ti][i] = lp[3]; + } + } + } + b = 3.5e-6 * hData->mIrRate; lp[0] = 0.0; lp[1] = 0.0; lp[2] = 0.0; lp[3] = 0.0; for(i = 0;i < n;i++) { - s0 = hData->mHrirs[i]; - s1 = Lerp(hData->mHrirs[j0+i], hData->mHrirs[j1+i], jf); - s0 = Lerp(s0, s1, of); + s0 = hData->mFds[fi].mEvs[0].mAzs[0].mIrs[ti][i]; lp[0] = Lerp(s0, lp[0], b); lp[1] = Lerp(lp[0], lp[1], b); lp[2] = Lerp(lp[1], lp[2], b); lp[3] = Lerp(lp[2], lp[3], b); - hData->mHrirs[j+i] = lp[3]; + hData->mFds[fi].mEvs[0].mAzs[0].mIrs[ti][i] = lp[3]; } } + hData->mFds[fi].mEvStart = 0; } - b = 3.5e-6 * hData->mIrRate; - lp[0] = 0.0; - lp[1] = 0.0; - lp[2] = 0.0; - lp[3] = 0.0; - for(i = 0;i < n;i++) - { - s0 = hData->mHrirs[i]; - lp[0] = Lerp(s0, lp[0], b); - lp[1] = Lerp(lp[0], lp[1], b); - lp[2] = Lerp(lp[1], lp[2], b); - lp[3] = Lerp(lp[2], lp[3], b); - hData->mHrirs[i] = lp[3]; - } - hData->mEvStart = 0; } // The following routines assume a full set of HRIRs for all elevations. // Normalize the HRIR set and slightly attenuate the result. -static void NormalizeHrirs (const HrirDataT *hData) +static void NormalizeHrirs(const HrirDataT *hData) { - uint step, end, n, j, i; - double maxLevel; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + uint n = hData->mIrPoints; + uint ti, fi, ei, ai, i; + double maxLevel = 0.0; - step = hData->mIrSize; - end = hData->mIrCount * step; - n = hData->mIrPoints; - maxLevel = 0.0; - for(j = 0;j < end;j += step) + for(fi = 0;fi < hData->mFdCount;fi++) { - for(i = 0;i < n;i++) - maxLevel = fmax(fabs(hData->mHrirs[j+i]), maxLevel); + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + for(i = 0;i < n;i++) + maxLevel = fmax(fabs(azd->mIrs[ti][i]), maxLevel); + } + } + } } maxLevel = 1.01 * maxLevel; - for(j = 0;j < end;j += step) + for(fi = 0;fi < hData->mFdCount;fi++) { - for(i = 0;i < n;i++) - hData->mHrirs[j+i] /= maxLevel; + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + for(i = 0;i < n;i++) + azd->mIrs[ti][i] /= maxLevel; + } + } + } } } @@ -2268,93 +2447,261 @@ static double CalcLTD(const double ev, const double az, const double rad, const al = (0.5 * M_PI) + azp; if(dlp > l) dlp = l + (rad * (al - acos(rad / dist))); - return (dlp / 343.3); + return dlp / 343.3; } // Calculate the effective head-related time delays for each minimum-phase // HRIR. -static void CalculateHrtds (const HeadModelT model, const double radius, HrirDataT *hData) +static void CalculateHrtds(const HeadModelT model, const double radius, HrirDataT *hData) { - double minHrtd, maxHrtd; - uint e, a, j; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + double minHrtd = INFINITY, maxHrtd = -INFINITY; + uint ti, fi, ei, ai; double t; - minHrtd = 1000.0; - maxHrtd = -1000.0; - for(e = 0;e < hData->mEvCount;e++) + if(model == HM_DATASET) { - for(a = 0;a < hData->mAzCount[e];a++) + for(fi = 0;fi < hData->mFdCount;fi++) { - j = hData->mEvOffset[e] + a; - if(model == HM_DATASET) - t = hData->mHrtds[j] * radius / hData->mRadius; - else - t = CalcLTD((-90.0 + (e * 180.0 / (hData->mEvCount - 1))) * M_PI / 180.0, - (a * 360.0 / hData->mAzCount [e]) * M_PI / 180.0, - radius, hData->mDistance); - hData->mHrtds[j] = t; - maxHrtd = fmax(t, maxHrtd); - minHrtd = fmin(t, minHrtd); + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + t = azd->mDelays[ti] * radius / hData->mRadius; + azd->mDelays[ti] = t; + maxHrtd = fmax(t, maxHrtd); + minHrtd = fmin(t, minHrtd); + } + } + } + } + } + else + { + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + HrirEvT *evd = &hData->mFds[fi].mEvs[ei]; + + for(ai = 0;ai < evd->mAzCount;ai++) + { + HrirAzT *azd = &evd->mAzs[ai]; + + for(ti = 0;ti < channels;ti++) + { + t = CalcLTD(evd->mElevation, azd->mAzimuth, radius, hData->mFds[fi].mDistance); + azd->mDelays[ti] = t; + maxHrtd = fmax(t, maxHrtd); + minHrtd = fmin(t, minHrtd); + } + } + } + } + } + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ti = 0;ti < channels;ti++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + hData->mFds[fi].mEvs[ei].mAzs[ai].mDelays[ti] -= minHrtd; + } } } - maxHrtd -= minHrtd; - for(j = 0;j < hData->mIrCount;j++) - hData->mHrtds[j] -= minHrtd; - hData->mMaxHrtd = maxHrtd; } +// Clear the initial HRIR data state. +static void ResetHrirData(HrirDataT *hData) +{ + hData->mIrRate = 0; + hData->mSampleType = ST_S24; + hData->mChannelType = CT_NONE; + hData->mIrPoints = 0; + hData->mFftSize = 0; + hData->mIrSize = 0; + hData->mRadius = 0.0; + hData->mIrCount = 0; + hData->mFdCount = 0; + hData->mFds = NULL; +} + +// Allocate and configure dynamic HRIR structures. +static int PrepareHrirData(const uint fdCount, const double distances[MAX_FD_COUNT], const uint evCounts[MAX_FD_COUNT], const uint azCounts[MAX_FD_COUNT * MAX_EV_COUNT], HrirDataT *hData) +{ + uint evTotal = 0, azTotal = 0, fi, ei, ai; + + for(fi = 0;fi < fdCount;fi++) + { + evTotal += evCounts[fi]; + for(ei = 0;ei < evCounts[fi];ei++) + azTotal += azCounts[(fi * MAX_EV_COUNT) + ei]; + } + if(!fdCount || !evTotal || !azTotal) + return 0; + + hData->mFds = calloc(fdCount, sizeof(*hData->mFds)); + if(hData->mFds == NULL) + return 0; + hData->mFds[0].mEvs = calloc(evTotal, sizeof(*hData->mFds[0].mEvs)); + if(hData->mFds[0].mEvs == NULL) + return 0; + hData->mFds[0].mEvs[0].mAzs = calloc(azTotal, sizeof(*hData->mFds[0].mEvs[0].mAzs)); + if(hData->mFds[0].mEvs[0].mAzs == NULL) + return 0; + hData->mIrCount = azTotal; + hData->mFdCount = fdCount; + evTotal = 0; + azTotal = 0; + for(fi = 0;fi < fdCount;fi++) + { + hData->mFds[fi].mDistance = distances[fi]; + hData->mFds[fi].mEvCount = evCounts[fi]; + hData->mFds[fi].mEvStart = 0; + hData->mFds[fi].mEvs = &hData->mFds[0].mEvs[evTotal]; + evTotal += evCounts[fi]; + for(ei = 0;ei < evCounts[fi];ei++) + { + uint azCount = azCounts[(fi * MAX_EV_COUNT) + ei]; + + hData->mFds[fi].mIrCount += azCount; + hData->mFds[fi].mEvs[ei].mElevation = -M_PI / 2.0 + M_PI * ei / (evCounts[fi] - 1); + hData->mFds[fi].mEvs[ei].mIrCount += azCount; + hData->mFds[fi].mEvs[ei].mAzCount = azCount; + hData->mFds[fi].mEvs[ei].mAzs = &hData->mFds[0].mEvs[0].mAzs[azTotal]; + for(ai = 0;ai < azCount;ai++) + { + hData->mFds[fi].mEvs[ei].mAzs[ai].mAzimuth = 2.0 * M_PI * ai / azCount; + hData->mFds[fi].mEvs[ei].mAzs[ai].mIndex = azTotal + ai; + hData->mFds[fi].mEvs[ei].mAzs[ai].mDelays[0] = 0.0; + hData->mFds[fi].mEvs[ei].mAzs[ai].mDelays[1] = 0.0; + hData->mFds[fi].mEvs[ei].mAzs[ai].mIrs[0] = NULL; + hData->mFds[fi].mEvs[ei].mAzs[ai].mIrs[1] = NULL; + } + azTotal += azCount; + } + } + return 1; +} + +// Clean up HRIR data. +static void FreeHrirData(HrirDataT *hData) +{ + if(hData->mFds != NULL) + { + if(hData->mFds[0].mEvs != NULL) + { + if(hData->mFds[0].mEvs[0].mAzs) + { + free(hData->mFds[0].mEvs[0].mAzs[0].mIrs[0]); + free(hData->mFds[0].mEvs[0].mAzs); + } + free(hData->mFds[0].mEvs); + } + free(hData->mFds); + hData->mFds = NULL; + } +} + +// Match the channel type from a given identifier. +static ChannelTypeT MatchChannelType(const char *ident) +{ + if(strcasecmp(ident, "mono") == 0) + return CT_MONO; + if(strcasecmp(ident, "stereo") == 0) + return CT_STEREO; + return CT_NONE; +} // Process the data set definition to read and validate the data set metrics. static int ProcessMetrics(TokenReaderT *tr, const uint fftSize, const uint truncSize, HrirDataT *hData) { - int hasRate = 0, hasPoints = 0, hasAzimuths = 0; - int hasRadius = 0, hasDistance = 0; + int hasRate = 0, hasType = 0, hasPoints = 0, hasRadius = 0; + int hasDistance = 0, hasAzimuths = 0; char ident[MAX_IDENT_LEN+1]; uint line, col; double fpVal; uint points; int intVal; + double distances[MAX_FD_COUNT]; + uint fdCount = 0; + uint evCounts[MAX_FD_COUNT]; + uint *azCounts = calloc(MAX_FD_COUNT * MAX_EV_COUNT, sizeof(*azCounts)); - while(!(hasRate && hasPoints && hasAzimuths && hasRadius && hasDistance)) + if(azCounts == NULL) { - TrIndication(tr, & line, & col); + fprintf(stderr, "Error: Out of memory.\n"); + exit(-1); + } + TrIndication(tr, &line, &col); + while(TrIsIdent(tr)) + { + TrIndication(tr, &line, &col); if(!TrReadIdent(tr, MAX_IDENT_LEN, ident)) - return 0; + goto error; if(strcasecmp(ident, "rate") == 0) { if(hasRate) { TrErrorAt(tr, line, col, "Redefinition of 'rate'.\n"); - return 0; + goto error; } if(!TrReadOperator(tr, "=")) - return 0; + goto error; if(!TrReadInt(tr, MIN_RATE, MAX_RATE, &intVal)) - return 0; + goto error; hData->mIrRate = (uint)intVal; hasRate = 1; } - else if(strcasecmp(ident, "points") == 0) + else if(strcasecmp(ident, "type") == 0) { - if (hasPoints) { - TrErrorAt(tr, line, col, "Redefinition of 'points'.\n"); - return 0; + char type[MAX_IDENT_LEN+1]; + + if(hasType) + { + TrErrorAt(tr, line, col, "Redefinition of 'type'.\n"); + goto error; } if(!TrReadOperator(tr, "=")) - return 0; + goto error; + + if(!TrReadIdent(tr, MAX_IDENT_LEN, type)) + goto error; + hData->mChannelType = MatchChannelType(type); + if(hData->mChannelType == CT_NONE) + { + TrErrorAt(tr, line, col, "Expected a channel type.\n"); + goto error; + } + hasType = 1; + } + else if(strcasecmp(ident, "points") == 0) + { + if(hasPoints) + { + TrErrorAt(tr, line, col, "Redefinition of 'points'.\n"); + goto error; + } + if(!TrReadOperator(tr, "=")) + goto error; TrIndication(tr, &line, &col); if(!TrReadInt(tr, MIN_POINTS, MAX_POINTS, &intVal)) - return 0; + goto error; points = (uint)intVal; if(fftSize > 0 && points > fftSize) { TrErrorAt(tr, line, col, "Value exceeds the overridden FFT size.\n"); - return 0; + goto error; } if(points < truncSize) { TrErrorAt(tr, line, col, "Value is below the truncation size.\n"); - return 0; + goto error; } hData->mIrPoints = points; if(fftSize <= 0) @@ -2371,90 +2718,178 @@ static int ProcessMetrics(TokenReaderT *tr, const uint fftSize, const uint trunc } hasPoints = 1; } - else if(strcasecmp(ident, "azimuths") == 0) - { - if(hasAzimuths) - { - TrErrorAt(tr, line, col, "Redefinition of 'azimuths'.\n"); - return 0; - } - if(!TrReadOperator(tr, "=")) - return 0; - hData->mIrCount = 0; - hData->mEvCount = 0; - hData->mEvOffset[0] = 0; - for(;;) - { - if(!TrReadInt(tr, MIN_AZ_COUNT, MAX_AZ_COUNT, &intVal)) - return 0; - hData->mAzCount[hData->mEvCount] = (uint)intVal; - hData->mIrCount += (uint)intVal; - hData->mEvCount ++; - if(!TrIsOperator(tr, ",")) - break; - if(hData->mEvCount >= MAX_EV_COUNT) - { - TrError(tr, "Exceeded the maximum of %d elevations.\n", MAX_EV_COUNT); - return 0; - } - hData->mEvOffset[hData->mEvCount] = hData->mEvOffset[hData->mEvCount - 1] + ((uint)intVal); - TrReadOperator(tr, ","); - } - if(hData->mEvCount < MIN_EV_COUNT) - { - TrErrorAt(tr, line, col, "Did not reach the minimum of %d azimuth counts.\n", MIN_EV_COUNT); - return 0; - } - hasAzimuths = 1; - } else if(strcasecmp(ident, "radius") == 0) { if(hasRadius) { TrErrorAt(tr, line, col, "Redefinition of 'radius'.\n"); - return 0; + goto error; } if(!TrReadOperator(tr, "=")) - return 0; + goto error; if(!TrReadFloat(tr, MIN_RADIUS, MAX_RADIUS, &fpVal)) - return 0; + goto error; hData->mRadius = fpVal; hasRadius = 1; } else if(strcasecmp(ident, "distance") == 0) { + uint count = 0; + if(hasDistance) { TrErrorAt(tr, line, col, "Redefinition of 'distance'.\n"); - return 0; + goto error; } if(!TrReadOperator(tr, "=")) - return 0; - if(!TrReadFloat(tr, MIN_DISTANCE, MAX_DISTANCE, & fpVal)) - return 0; - hData->mDistance = fpVal; + goto error; + + for(;;) + { + if(!TrReadFloat(tr, MIN_DISTANCE, MAX_DISTANCE, &fpVal)) + goto error; + if(count > 0 && fpVal <= distances[count - 1]) + { + TrError(tr, "Distances are not ascending.\n"); + goto error; + } + distances[count++] = fpVal; + if(!TrIsOperator(tr, ",")) + break; + if(count >= MAX_FD_COUNT) + { + TrError(tr, "Exceeded the maximum of %d fields.\n", MAX_FD_COUNT); + goto error; + } + TrReadOperator(tr, ","); + } + if(fdCount != 0 && count != fdCount) + { + TrError(tr, "Did not match the specified number of %d fields.\n", fdCount); + goto error; + } + fdCount = count; hasDistance = 1; } + else if(strcasecmp(ident, "azimuths") == 0) + { + uint count = 0; + + if(hasAzimuths) + { + TrErrorAt(tr, line, col, "Redefinition of 'azimuths'.\n"); + goto error; + } + if(!TrReadOperator(tr, "=")) + goto error; + + evCounts[0] = 0; + for(;;) + { + if(!TrReadInt(tr, MIN_AZ_COUNT, MAX_AZ_COUNT, &intVal)) + goto error; + azCounts[(count * MAX_EV_COUNT) + evCounts[count]++] = (uint)intVal; + if(TrIsOperator(tr, ",")) + { + if(evCounts[count] >= MAX_EV_COUNT) + { + TrError(tr, "Exceeded the maximum of %d elevations.\n", MAX_EV_COUNT); + goto error; + } + TrReadOperator(tr, ","); + } + else + { + if(evCounts[count] < MIN_EV_COUNT) + { + TrErrorAt(tr, line, col, "Did not reach the minimum of %d azimuth counts.\n", MIN_EV_COUNT); + goto error; + } + if(azCounts[count * MAX_EV_COUNT] != 1 || azCounts[(count * MAX_EV_COUNT) + evCounts[count] - 1] != 1) + { + TrError(tr, "Poles are not singular for field %d.\n", count - 1); + goto error; + } + count++; + if(TrIsOperator(tr, ";")) + { + if(count >= MAX_FD_COUNT) + { + TrError(tr, "Exceeded the maximum number of %d fields.\n", MAX_FD_COUNT); + goto error; + } + evCounts[count] = 0; + TrReadOperator(tr, ";"); + } + else + { + break; + } + } + } + if(fdCount != 0 && count != fdCount) + { + TrError(tr, "Did not match the specified number of %d fields.\n", fdCount); + goto error; + } + fdCount = count; + hasAzimuths = 1; + } else { TrErrorAt(tr, line, col, "Expected a metric name.\n"); - return 0; + goto error; } - TrSkipWhitespace (tr); + TrSkipWhitespace(tr); } + if(!(hasRate && hasPoints && hasRadius && hasDistance && hasAzimuths)) + { + TrErrorAt(tr, line, col, "Expected a metric name.\n"); + goto error; + } + if(distances[0] < hData->mRadius) + { + TrError(tr, "Distance cannot start below head radius.\n"); + goto error; + } + if(hData->mChannelType == CT_NONE) + hData->mChannelType = CT_MONO; + if(!PrepareHrirData(fdCount, distances, evCounts, azCounts, hData)) + { + fprintf(stderr, "Error: Out of memory.\n"); + exit(-1); + } + free(azCounts); return 1; + +error: + free(azCounts); + return 0; } -// Parse an index pair from the data set definition. -static int ReadIndexPair(TokenReaderT *tr, const HrirDataT *hData, uint *ei, uint *ai) +// Parse an index triplet from the data set definition. +static int ReadIndexTriplet(TokenReaderT *tr, const HrirDataT *hData, uint *fi, uint *ei, uint *ai) { int intVal; - if(!TrReadInt(tr, 0, (int)hData->mEvCount, &intVal)) + + if(hData->mFdCount > 1) + { + if(!TrReadInt(tr, 0, (int)hData->mFdCount - 1, &intVal)) + return 0; + *fi = (uint)intVal; + if(!TrReadOperator(tr, ",")) + return 0; + } + else + { + *fi = 0; + } + if(!TrReadInt(tr, 0, (int)hData->mFds[*fi].mEvCount - 1, &intVal)) return 0; *ei = (uint)intVal; if(!TrReadOperator(tr, ",")) return 0; - if(!TrReadInt(tr, 0, (int)hData->mAzCount[*ei], &intVal)) + if(!TrReadInt(tr, 0, (int)hData->mFds[*fi].mEvs[*ei].mAzCount - 1, &intVal)) return 0; *ai = (uint)intVal; return 1; @@ -2540,7 +2975,7 @@ static int ReadSourceRef(TokenReaderT *tr, SourceRefT *src) TrIndication(tr, &line, &col); if(!TrReadInt(tr, -2147483647-1, 2147483647, &intVal)) return 0; - if(abs(intVal) < MIN_BIN_BITS || ((uint)abs(intVal)) > (8*src->mSize)) + if(abs(intVal) < MIN_BIN_BITS || (uint)abs(intVal) > (8*src->mSize)) { TrErrorAt(tr, line, col, "Expected a value of (+/-) %d to %d.\n", MIN_BIN_BITS, 8*src->mSize); return 0; @@ -2582,7 +3017,7 @@ static int ReadSourceRef(TokenReaderT *tr, SourceRefT *src) else { TrReadOperator(tr, ";"); - if(!TrReadInt (tr, 0, 0x7FFFFFFF, &intVal)) + if(!TrReadInt(tr, 0, 0x7FFFFFFF, &intVal)) return 0; src->mSkip = (uint)intVal; } @@ -2605,27 +3040,41 @@ static int ReadSourceRef(TokenReaderT *tr, SourceRefT *src) return 1; } +// Match the target ear (index) from a given identifier. +static int MatchTargetEar(const char *ident) +{ + if(strcasecmp(ident, "left") == 0) + return 0; + if(strcasecmp(ident, "right") == 0) + return 1; + return -1; +} + // Process the list of sources in the data set definition. static int ProcessSources(const HeadModelT model, TokenReaderT *tr, HrirDataT *hData) { - uint *setCount, *setFlag; - uint line, col, ei, ai; - SourceRefT src; - double factor; - double *hrir; + uint channels = (hData->mChannelType == CT_STEREO) ? 2 : 1; + double *hrirs = CreateDoubles(channels * hData->mIrCount * hData->mIrSize); + double *hrir = CreateDoubles(hData->mIrPoints); + uint line, col, fi, ei, ai, ti; + int count; - setCount = (uint*)calloc(hData->mEvCount, sizeof(uint)); - setFlag = (uint*)calloc(hData->mIrCount, sizeof(uint)); - hrir = CreateArray(hData->mIrPoints); + printf("Loading sources..."); + fflush(stdout); + count = 0; while(TrIsOperator(tr, "[")) { - TrIndication(tr, & line, & col); + double factor[2] = { 1.0, 1.0 }; + + TrIndication(tr, &line, &col); TrReadOperator(tr, "["); - if(!ReadIndexPair(tr, hData, &ei, &ai)) + if(!ReadIndexTriplet(tr, hData, &fi, &ei, &ai)) goto error; if(!TrReadOperator(tr, "]")) goto error; - if(setFlag[hData->mEvOffset[ei] + ai]) + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + if(azd->mIrs[0] != NULL) { TrErrorAt(tr, line, col, "Redefinition of source.\n"); goto error; @@ -2633,55 +3082,119 @@ static int ProcessSources(const HeadModelT model, TokenReaderT *tr, HrirDataT *h if(!TrReadOperator(tr, "=")) goto error; - factor = 1.0; for(;;) { + SourceRefT src; + uint ti = 0; + if(!ReadSourceRef(tr, &src)) goto error; + + // TODO: Would be nice to display 'x of y files', but that would + // require preparing the source refs first to get a total count + // before loading them. + ++count; + printf("\rLoading sources... %d file%s", count, (count==1)?"":"s"); + fflush(stdout); + if(!LoadSource(&src, hData->mIrRate, hData->mIrPoints, hrir)) goto error; + if(hData->mChannelType == CT_STEREO) + { + char ident[MAX_IDENT_LEN+1]; + + if(!TrReadIdent(tr, MAX_IDENT_LEN, ident)) + goto error; + ti = MatchTargetEar(ident); + if((int)ti < 0) + { + TrErrorAt(tr, line, col, "Expected a target ear.\n"); + goto error; + } + } + azd->mIrs[ti] = &hrirs[hData->mIrSize * (ti * hData->mIrCount + azd->mIndex)]; if(model == HM_DATASET) - AverageHrirOnset(hrir, 1.0 / factor, ei, ai, hData); - AverageHrirMagnitude(hrir, 1.0 / factor, ei, ai, hData); - factor += 1.0; + azd->mDelays[ti] = AverageHrirOnset(hData->mIrRate, hData->mIrPoints, hrir, 1.0 / factor[ti], azd->mDelays[ti]); + AverageHrirMagnitude(hData->mIrPoints, hData->mFftSize, hrir, 1.0 / factor[ti], azd->mIrs[ti]); + factor[ti] += 1.0; if(!TrIsOperator(tr, "+")) break; TrReadOperator(tr, "+"); } - setFlag[hData->mEvOffset[ei] + ai] = 1; - setCount[ei]++; - } - - ei = 0; - while(ei < hData->mEvCount && setCount[ei] < 1) - ei++; - if(ei < hData->mEvCount) - { - hData->mEvStart = ei; - while(ei < hData->mEvCount && setCount[ei] == hData->mAzCount[ei]) - ei++; - if(ei >= hData->mEvCount) + if(hData->mChannelType == CT_STEREO) { - if(!TrLoad(tr)) + if(azd->mIrs[0] == NULL) { - DestroyArray(hrir); - free(setFlag); - free(setCount); - return 1; + TrErrorAt(tr, line, col, "Missing left ear source reference(s).\n"); + goto error; + } + else if(azd->mIrs[1] == NULL) + { + TrErrorAt(tr, line, col, "Missing right ear source reference(s).\n"); + goto error; } - TrError(tr, "Errant data at end of source list.\n"); } - else - TrError(tr, "Missing sources for elevation index %d.\n", ei); } - else - TrError(tr, "Missing source references.\n"); + printf("\n"); + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + if(azd->mIrs[0] != NULL) + break; + } + if(ai < hData->mFds[fi].mEvs[ei].mAzCount) + break; + } + if(ei >= hData->mFds[fi].mEvCount) + { + TrError(tr, "Missing source references [ %d, *, * ].\n", fi); + goto error; + } + hData->mFds[fi].mEvStart = ei; + for(;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + if(azd->mIrs[0] == NULL) + { + TrError(tr, "Missing source reference [ %d, %d, %d ].\n", fi, ei, ai); + goto error; + } + } + } + } + for(ti = 0;ti < channels;ti++) + { + for(fi = 0;fi < hData->mFdCount;fi++) + { + for(ei = 0;ei < hData->mFds[fi].mEvCount;ei++) + { + for(ai = 0;ai < hData->mFds[fi].mEvs[ei].mAzCount;ai++) + { + HrirAzT *azd = &hData->mFds[fi].mEvs[ei].mAzs[ai]; + + azd->mIrs[ti] = &hrirs[hData->mIrSize * (ti * hData->mIrCount + azd->mIndex)]; + } + } + } + } + if(!TrLoad(tr)) + { + free(hrir); + return 1; + } + TrError(tr, "Errant data at end of source list.\n"); error: - DestroyArray(hrir); - free(setFlag); - free(setCount); + free(hrir); return 0; } @@ -2689,23 +3202,16 @@ error: * resulting data set as desired. If the input name is NULL it will read * from standard input. */ -static int ProcessDefinition(const char *inName, const uint outRate, const uint fftSize, const int equalize, const int surface, const double limit, const uint truncSize, const HeadModelT model, const double radius, const OutputFormatT outFormat, const char *outName) +static int ProcessDefinition(const char *inName, const uint outRate, const uint fftSize, const int equalize, const int surface, const double limit, const uint truncSize, const HeadModelT model, const double radius, const char *outName) { char rateStr[8+1], expName[MAX_PATH_LEN]; TokenReaderT tr; HrirDataT hData; - double *dfa; FILE *fp; + int ret; - hData.mIrRate = 0; - hData.mIrPoints = 0; - hData.mFftSize = 0; - hData.mIrSize = 0; - hData.mIrCount = 0; - hData.mEvCount = 0; - hData.mRadius = 0; - hData.mDistance = 0; - fprintf(stdout, "Reading HRIR definition...\n"); + ResetHrirData(&hData); + fprintf(stdout, "Reading HRIR definition from %s...\n", inName?inName:"stdin"); if(inName != NULL) { fp = fopen(inName, "r"); @@ -2727,26 +3233,26 @@ static int ProcessDefinition(const char *inName, const uint outRate, const uint fclose(fp); return 0; } - hData.mHrirs = CreateArray(hData.mIrCount * hData.mIrSize); - hData.mHrtds = CreateArray(hData.mIrCount); if(!ProcessSources(model, &tr, &hData)) { - DestroyArray(hData.mHrtds); - DestroyArray(hData.mHrirs); + FreeHrirData(&hData); if(inName != NULL) fclose(fp); return 0; } - if(inName != NULL) + if(fp != stdin) fclose(fp); if(equalize) { - dfa = CreateArray(1 + (hData.mFftSize/2)); + uint c = (hData.mChannelType == CT_STEREO) ? 2 : 1; + uint m = 1 + hData.mFftSize / 2; + double *dfa = CreateDoubles(c * m); + fprintf(stdout, "Calculating diffuse-field average...\n"); - CalculateDiffuseFieldAverage(&hData, surface, limit, dfa); + CalculateDiffuseFieldAverage(&hData, c, m, surface, limit, dfa); fprintf(stdout, "Performing diffuse-field equalization...\n"); - DiffuseFieldEqualize(dfa, &hData); - DestroyArray(dfa); + DiffuseFieldEqualize(c, m, dfa, &hData); + free(dfa); } fprintf(stdout, "Performing minimum phase reconstruction...\n"); ReconstructHrirs(&hData); @@ -2767,55 +3273,39 @@ static int ProcessDefinition(const char *inName, const uint outRate, const uint CalculateHrtds(model, (radius > DEFAULT_CUSTOM_RADIUS) ? radius : hData.mRadius, &hData); snprintf(rateStr, 8, "%u", hData.mIrRate); StrSubst(outName, "%r", rateStr, MAX_PATH_LEN, expName); - switch(outFormat) - { - case OF_MHR: - fprintf(stdout, "Creating MHR data set file...\n"); - if(!StoreMhr(&hData, expName)) - { - DestroyArray(hData.mHrtds); - DestroyArray(hData.mHrirs); - return 0; - } - break; - default: - break; - } - DestroyArray(hData.mHrtds); - DestroyArray(hData.mHrirs); - return 1; + fprintf(stdout, "Creating MHR data set %s...\n", expName); + ret = StoreMhr(&hData, expName); + + FreeHrirData(&hData); + return ret; } static void PrintHelp(const char *argv0, FILE *ofile) { - fprintf(ofile, "Usage: %s [