ref: a80af55313ca99a442b2574dd53ebedfb9e736fc
parent: e586373df54e57b080fb59c06b72ba1f50e975ff
author: spiricom <jeff@snyderphonics.com>
date: Sun Mar 1 10:30:26 EST 2020
not sure - updated things
binary files a/.DS_Store b/.DS_Store differ
binary files a/LEAF/.DS_Store b/LEAF/.DS_Store differ
binary files a/LEAF/Inc/.DS_Store /dev/null differ
--- /dev/null
+++ b/LEAF/Inc/MIDI_application.h
@@ -1,0 +1,50 @@
+/*
+ * MIDI_application.h
+ * Created on: 6 d�c. 2014
+ * Author: Xavier Halgand
+ *
+ * Modified on: 9/12/16 by C.P. to handle the MIDI_IDLE state properly, and
+ * added required code to be compatible with "NucleoSynth"
+ *
+ */
+
+#ifndef MIDI_APPLICATION_H_
+#define MIDI_APPLICATION_H_
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "stdio.h"
+#include "usbh_core.h"
+#include "usbh_MIDI.h"
+#include "main.h"
+
+#include <math.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+/*------------------------------------------------------------------------------*/
+typedef enum
+{
+ MIDI_APPLICATION_IDLE = 0,
+ MIDI_APPLICATION_START,
+ MIDI_APPLICATION_READY,
+ MIDI_APPLICATION_RUNNING,
+ MIDI_APPLICATION_DISCONNECT
+}
+MIDI_ApplicationTypeDef;
+
+
+#define RX_BUFF_SIZE 64 /* Max Received data 64 bytes */
+
+extern uint8_t MIDI_RX_Buffer[RX_BUFF_SIZE];// __ATTR_RAM_D2; // MIDI reception buffer
+extern uint8_t CCs[128];
+
+extern uint8_t MIDIStartOfFrame;
+
+/* Exported functions ------------------------------------------------------- */
+void MIDI_Application(void);
+void LocalMidiHandler(uint8_t param, uint8_t data);
+void ProcessReceivedMidiDatas(uint32_t myLength);
+
+/*------------------------------------------------------------------------------*/
+#endif /* MIDI_APPLICATION_H_ */
--- /dev/null
+++ b/LEAF/Inc/adc.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : ADC.h
+ * Description : This file provides code for the configuration
+ * of the ADC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __adc_H
+#define __adc_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern ADC_HandleTypeDef hadc1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_ADC1_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ adc_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/audiostream.h
@@ -1,0 +1,93 @@
+/**
+ ******************************************************************************
+ * @file Audio_playback_and_record/inc/waveplayer.h
+ * @author MCD Application Team
+ * @version V1.1.0
+ * @date 26-June-2014
+ * @brief Header for waveplayer.c module.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __AUDIOSTREAM_H
+#define __AUDIOSTREAM_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "leaf.h"
+#include "main.h"
+
+#define AUDIO_FRAME_SIZE 128
+#define HALF_BUFFER_SIZE AUDIO_FRAME_SIZE * 2 //number of samples per half of the "double-buffer" (twice the audio frame size because there are interleaved samples for both left and right channels)
+#define AUDIO_BUFFER_SIZE AUDIO_FRAME_SIZE * 4 //number of samples in the whole data structure (four times the audio frame size because of stereo and also double-buffering/ping-ponging)
+
+
+extern int32_t audioOutBuffer[AUDIO_BUFFER_SIZE];
+extern int32_t audioInBuffer[AUDIO_BUFFER_SIZE];
+extern tMempool smallPool;
+extern tMempool largePool;
+extern uint8_t codecReady;
+extern float sample;
+extern float rightOut;
+extern float rightIn;
+extern tRamp adc[6];
+extern float smoothedADC[6];
+extern float audioDisplayBuffer[128];
+extern uint8_t displayBufferIndex;
+
+/* Exported types ------------------------------------------------------------*/
+typedef enum
+{
+ BUFFER_OFFSET_NONE = 0,
+ BUFFER_OFFSET_HALF,
+ BUFFER_OFFSET_FULL,
+}BUFFER_StateTypeDef;
+
+#ifdef SAMPLERATE96K
+#define SAMPLE_RATE 96000.f
+#else
+#define SAMPLE_RATE 48000.f
+#endif
+
+typedef enum BOOL {
+ FALSE = 0,
+ TRUE
+} BOOL;
+
+#define INV_SAMPLE_RATE 1.f/SAMPLE_RATE
+#define SAMPLE_RATE_MS (SAMPLE_RATE / 1000.f)
+#define INV_SR_MS 1.f/SAMPLE_RATE_MS
+#define SAMPLE_RATE_DIV_PARAMS SAMPLE_RATE / 3
+#define SAMPLE_RATE_DIV_PARAMS_MS (SAMPLE_RATE_DIV_PARAMS / 1000.f)
+#define INV_SR_DIV_PARAMS_MS 1.f/SAMPLE_RATE_DIV_PARAMS_MS
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void audioInit(I2C_HandleTypeDef* hi2c, SAI_HandleTypeDef* hsaiOut, SAI_HandleTypeDef* hsaiIn);
+
+void initFunctionPointers(void);
+
+void audioFrame(uint16_t buffer_offset);
+
+void DMA1_TransferCpltCallback(DMA_HandleTypeDef *hdma);
+void DMA1_HalfTransferCpltCallback(DMA_HandleTypeDef *hdma);
+
+#endif /* __AUDIOSTREAM_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/bdma.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : dma.h
+ * Description : This file contains all the function prototypes for
+ * the dma.c file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __bdma_H
+#define __bdma_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* DMA memory to memory transfer handles -------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_BDMA_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __bdma_H */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/bsp_driver_sd.h
@@ -1,0 +1,84 @@
+/**
+ ******************************************************************************
+ * @file bsp_driver_sd.h (based on stm32h743i_eval_sd.h)
+ * @brief This file contains the common defines and functions prototypes for
+ * the bsp_driver_sd.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7_SD_H
+#define __STM32H7_SD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "fatfs_platform.h"
+
+/* Exported types --------------------------------------------------------*/
+/**
+ * @brief SD Card information structure
+ */
+#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef
+
+/* Exported constants --------------------------------------------------------*/
+/**
+ * @brief SD status structure definition
+ */
+#define MSD_OK ((uint8_t)0x00)
+#define MSD_ERROR ((uint8_t)0x01)
+#define MSD_ERROR_SD_NOT_PRESENT ((uint8_t)0x02)
+
+/**
+ * @brief SD transfer state definition
+ */
+#define SD_TRANSFER_OK ((uint8_t)0x00)
+#define SD_TRANSFER_BUSY ((uint8_t)0x01)
+
+#define SD_PRESENT ((uint8_t)0x01)
+#define SD_NOT_PRESENT ((uint8_t)0x00)
+#define SD_DATATIMEOUT ((uint32_t)100000000)
+
+/* USER CODE BEGIN BSP_H_CODE */
+#define SD_DetectIRQHandler() HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8)
+
+/* Exported functions --------------------------------------------------------*/
+uint8_t BSP_SD_Init(void);
+uint8_t BSP_SD_ITConfig(void);
+uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);
+uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);
+uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks);
+uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks);
+uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr);
+uint8_t BSP_SD_GetCardState(void);
+void BSP_SD_GetCardInfo(BSP_SD_CardInfo *CardInfo);
+uint8_t BSP_SD_IsDetected(void);
+
+/* These functions can be modified in case the current settings (e.g. DMA stream)
+ need to be changed for specific application needs */
+void BSP_SD_AbortCallback(void);
+void BSP_SD_WriteCpltCallback(void);
+void BSP_SD_ReadCpltCallback(void);
+/* USER CODE END BSP_H_CODE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7_SD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/codec.h
@@ -1,0 +1,162 @@
+#include "stm32h7xx_hal.h"
+
+#define CODEC_I2C_ADDRESS (0x10 << 1) // 7-bit address goes one bit over to the left to make room for R/W bit
+
+void AudioCodec_init(I2C_HandleTypeDef* hi2c);
+
+
+
+
+
+
+//Settings for CS4271
+// translated from the datasheet by JS
+
+// 01h mode control 1
+//
+// M1 M0 ratio1 ratio0 m/s dac_dif2 dac_dif1 dac_dif0 // unsure if setting bit selects master means 1
+// for 48k == 0 1 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of 256X master clock)
+// == 0x41
+// for 96k == 1 0 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of <= 256X master clock)
+// == 0x81
+// for 192k == 1 1 1 0 0 0 0 1 ( ratio bit chosen as 1 0 based on assumption of 256X master clock, choose 0 0 (full word would be 0xc1 instead of 0xe1) instead if using something like 64X)
+// == 0xe1
+
+// 02h DAC control
+// AMUTE, FILT_SEL, DEM1, DEM0, RMP_UP, RMP_DN, INV_A, INV_B
+// 0 0 0 0 1 1 0 0
+// == 0x0c
+
+// 03h dac volume and mixing
+// (NA) B=A soft zerocross ATAPI3 ATAPI2 ATAPI1 ATAPI0 (B=A makes channel volumes not independent)
+// 0 1 1 1 1 0 0 1 (the last four bits set channel L to go to output A and channel R to go to output B, but this is easily changed with mixing or reversal)
+// == 0x79
+
+// 04h Volume A
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+
+// 05h Volume B
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+
+// 06h ADC control
+// (NA) (NA) Dither16 ADC_DIF MUTEA MUTEB HPFDisableA HPFDisableB
+// 0 0 0 1 0 0 0 0
+// ==0x10
+
+// 07h mode control 2
+// (NA) (NA) (NA) LOOP MUTECA=B FREEZE CPEN PDN
+// for power down version == 0 0 0 0 0 1 1 1
+// == 0x07
+// to send dry ADC input into DAC == 0 0 0 1 0 0 1 0
+// == 0x12
+// for normal operation == 0 0 0 0 0 0 1 0
+// == 0x02
+
+/*
+
+
+#ifndef ADCHPD
+ #define ADCHPD 0
+#elif (ADCHPD == 0)||(ADCHPD == 1)
+#else
+ #error ADCHPD value not defined
+#endif
+
+#ifndef ADCS
+ #define ADCS 2
+#elif (ADCS >=0)&&(ADCS <= 2)
+#else
+ #error ADCS value not defined
+#endif
+
+#ifndef HYST
+ #define HYST 32
+#elif (HYST >= 0)&&(HYST <= 255)
+#else
+ #error HYST value not defined
+#endif
+
+#ifndef LINVOL
+ #define LINVOL 0x17
+#elif (LINVOL >= 0) && (LINVOL <= 0x1f)
+#else
+ #error LINVOL value not defined
+#endif
+
+#ifndef RINVOL
+ #define RINVOL 0x17
+#elif (RINVOL >= 0) && (RINVOL <= 0x1f)
+#else
+ #error RINVOL value not defined
+#endif
+
+#ifndef LHPVOL
+ #define LHPVOL 127
+#elif (LHPVOL == 0) || ((LHPVOL >= 0x30) && (LHPVOL <= 0x7f))
+#else
+ #error LHPVOL value not defined
+#endif
+
+#ifndef RHPVOL
+ #define RHPVOL 127
+#elif (RHPVOL == 0) || ((RHPVOL >= 0x30) && (RHPVOL <= 0x7f))
+#else
+ #error RHPVOL value not defined
+#endif
+
+#ifndef MICBOOST
+ #define MICBOOST 0
+#elif (MICBOOST == 0)||(MICBOOST == 1)
+#else
+ #error MICBOOST value not defined
+#endif
+
+ // 1 = muted
+#ifndef MUTEMIC
+ #define MUTEMIC 1
+#elif (MUTEMIC == 0)||(MUTEMIC == 1)
+#else
+ #error MUTEMIC value not defined
+#endif
+
+ // 0 = line inputs, 1 = mic in
+#ifndef INSEL
+ #define INSEL 0
+#elif (INSEL == 0)||(INSEL == 1)
+#else
+ #error INSEL value not defined
+#endif
+
+#ifndef BYPASS
+ #define BYPASS 0 //setting this to 1 passes the line input straight to the line output
+#elif (BYPASS == 0)||(BYPASS == 1)
+#else
+ #error BYPASS value not defined
+#endif
+
+#ifndef DACSEL
+ #define DACSEL 1
+#elif (DACSEL == 0)||(DACSEL == 1)
+#else
+ #error DACSEL value not defined
+#endif
+
+#ifndef SIDETONE
+ #define SIDETONE 0 // setting this to 1 passes the mic input straight to the line output
+#elif (SIDETONE == 0)||(SIDETONE == 1)
+#else
+ #error SIDETONE value not defined
+#endif
+
+#ifndef SIDEATT
+ #define SIDEATT 0
+#elif (SIDEATT >= 0)&&(SIDEATT <= 3)
+#else
+ #error SIDEATT value not defined
+#endif
+
+*/
--- /dev/null
+++ b/LEAF/Inc/custom_fonts.h
@@ -1,0 +1,6894 @@
+/*
+ * gothic_font.h
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+#ifndef CUSTOM_FONTS_H_
+#define CUSTOM_FONTS_H_
+
+#include "stm32h7xx_hal.h"
+#include "gfx_font.h"
+
+
+#define PROGMEM
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Monospaced_plain_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xFF,0xC3,0xC0, // '!'
+ 0xCF,0x3C,0xF3,0xCC, // '"'
+ 0x04,0xC1,0x90,0x32,0x04,0xC7,0xFE,0xFF,0xC6,0x40,0x98,0xFF,0xDF,0xF8,0xC8,0x11,0x02,0x60,0xCC,0x00, // '#'
+ 0x08,0x04,0x0F,0x8F,0xEC,0x96,0x43,0x20,0xF0,0x0F,0x04,0xC2,0x71,0x3F,0xF3,0xF0,0x20,0x10,0x08,0x00, // '$'
+ 0x78,0x19,0x83,0x30,0x66,0x0C,0xC0,0xF3,0x83,0x83,0x9E,0x06,0x60,0xCC,0x19,0x83,0x30,0x3C, // '%'
+ 0x1F,0x0F,0xC3,0x00,0xC0,0x18,0x0F,0x06,0xCF,0x3B,0xC7,0xF0,0xEE,0x31,0xF6,0x3D,0xC0, // '&'
+ 0xFF,0xC0, // '''
+ 0x32,0x66,0x4C,0xCC,0xCC,0xC4,0x66,0x23, // '('
+ 0xC4,0x66,0x23,0x33,0x33,0x32,0x66,0x4C, // ')'
+ 0x11,0x25,0x51,0xC3,0x8A,0xA4,0x88, // '*'
+ 0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00, // '+'
+ 0x6D,0xE8, // ','
+ 0xFF,0xC0, // '-'
+ 0xFC, // '.'
+ 0x01,0x81,0x80,0xC0,0xC0,0x60,0x60,0x30,0x38,0x18,0x0C,0x0C,0x06,0x06,0x03,0x03,0x00, // '/'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x6F,0x37,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0, // '0'
+ 0x38,0xF8,0xD8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // '1'
+ 0x7E,0x7F,0xA0,0xE0,0x30,0x18,0x1C,0x0C,0x1C,0x1C,0x1C,0x18,0x1F,0xFF,0xF8, // '2'
+ 0x7E,0x7F,0xA0,0xE0,0x30,0x39,0xF8,0xFC,0x07,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // '3'
+ 0x06,0x07,0x03,0x82,0xC3,0x61,0x31,0x99,0x8C,0xFF,0xFF,0xC1,0x80,0xC0,0x60, // '4'
+ 0x7F,0x3F,0x98,0x0C,0x07,0xE3,0xF9,0x0E,0x03,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // '5'
+ 0x1E,0x3F,0x9C,0x5C,0x0C,0x06,0xF3,0xFD,0xC7,0xC1,0xE0,0xD8,0xEF,0xE3,0xE0, // '6'
+ 0xFF,0xFF,0xC0,0xC0,0x60,0x70,0x30,0x18,0x18,0x0C,0x0E,0x06,0x03,0x03,0x00, // '7'
+ 0x3E,0x3F,0xB0,0x78,0x3C,0x1B,0xF9,0xFD,0xC7,0xC1,0xE0,0xF8,0xEF,0xE3,0xE0, // '8'
+ 0x3E,0x3F,0xB8,0xD8,0x3C,0x1F,0x1D,0xFE,0x7B,0x01,0x81,0xD1,0xCF,0xE3,0xC0, // '9'
+ 0xFC,0x0F,0xC0, // ':'
+ 0x6D,0x80,0x1B,0x7A,0x00, // ';'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc0, 0x1c, 0x03, 0xc0, 0x7c, 0x0f,
+ 0xc1, 0xfc, 0x0f, 0xc0, 0x7c, 0x03, 0xc0, 0x1c, 0x00, 0xc0, 0x04, // '<'
+ 0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFC, // '='
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, 0x07, 0x00, 0x78, 0x07, 0xc0, 0x7e,
+ 0x07, 0xf0, 0x7e, 0x07, 0xc0, 0x78, 0x07, 0x00, 0x60, 0x04, 0x00, // '>'
+ 0x7D,0xFE,0x18,0x30,0xE3,0x8E,0x18,0x30,0x60,0x01,0x83,0x00, // '?'
+ 0x1E,0x19,0x98,0x6C,0xFC,0xDE,0x6F,0x37,0x9B,0xCD,0xE6,0xF1,0xEC,0x06,0x01,0x80,0x78, // '@'
+ 0x1C,0x0E,0x07,0x03,0x83,0x61,0xB0,0xD8,0x6C,0x7F,0x3F,0x98,0xD8,0x3C,0x18, // 'A'
+ 0xFE,0x7F,0xB0,0x78,0x3C,0x1F,0xFB,0xFD,0x87,0xC1,0xE0,0xF0,0xFF,0xEF,0xE0, // 'B'
+ 0x1F,0x1F,0xDC,0x3C,0x0C,0x06,0x03,0x01,0x80,0xC0,0x70,0x1C,0x27,0xF1,0xF0, // 'C'
+ 0xFC,0x7F,0x31,0xD8,0x7C,0x1E,0x0F,0x07,0x83,0xC1,0xE1,0xF1,0xDF,0xCF,0xC0, // 'D'
+ 0xFF,0xFF,0xF0,0x18,0x0C,0x07,0xFF,0xFF,0x80,0xC0,0x60,0x30,0x1F,0xFF,0xF8, // 'E'
+ 0xFF,0xFF,0xF0,0x18,0x0C,0x07,0xFB,0xFD,0x80,0xC0,0x60,0x30,0x18,0x0C,0x00, // 'F'
+ 0x1F,0x1F,0xDC,0x3C,0x0C,0x06,0x3F,0x1F,0x83,0xC1,0xF0,0xD8,0x67,0xF1,0xE0, // 'G'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1F,0xFF,0xFF,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x18, // 'H'
+ 0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // 'I'
+ 0x3E,0x7C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0E,0x1F,0xE7,0x80, // 'J'
+ 0xC1,0xB0,0xCC,0x63,0x30,0xD8,0x3E,0x0F,0x83,0x30,0xCE,0x31,0x8C,0x33,0x0E,0xC1,0x80, // 'K'
+ 0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x80,0xC0,0x60,0x30,0x1F,0xFF,0xF8, // 'L'
+ 0xE3,0xF1,0xF8,0xFE,0xFD,0x5E,0xAF,0x77,0x93,0xC1,0xE0,0xF0,0x78,0x3C,0x18, // 'M'
+ 0xE1,0xF0,0xFC,0x7A,0x3D,0x1E,0xCF,0x27,0x9B,0xC5,0xE2,0xF1,0xF8,0x7C,0x38, // 'N'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0, // 'O'
+ 0xFE,0x7F,0xB0,0xF8,0x3C,0x1E,0x1F,0xFD,0xFC,0xC0,0x60,0x30,0x18,0x0C,0x00, // 'P'
+ 0x3E,0x3F,0x98,0xD8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xD8,0xCF,0xE3,0xE0,0x38,0x0C, // 'Q'
+ 0xFE,0x3F,0xCC,0x3B,0x06,0xC1,0xB0,0xEF,0xF3,0xF8,0xC3,0x30,0xEC,0x1B,0x06,0xC0,0xC0, // 'R'
+ 0x3E,0x3F,0xB8,0x58,0x0C,0x03,0xE0,0xFC,0x07,0x01,0x80,0xE0,0xFF,0xE7,0xE0, // 'S'
+ 0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'T'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF8,0xEF,0xE3,0xE0, // 'U'
+ 0xC1,0xE0,0xD8,0xCC,0x66,0x33,0xB8,0xD8,0x6C,0x36,0x0E,0x07,0x03,0x81,0xC0, // 'V'
+ 0xC0,0x78,0x0F,0x01,0xB0,0x66,0xEC,0xDD,0x9A,0xB3,0x56,0x6A,0xCF,0x78,0xC6,0x18,0xC3,0x18, // 'W'
+ 0xE3,0xB1,0x9D,0x86,0xC1,0xC0,0xE0,0x70,0x38,0x3E,0x1B,0x1D,0xCC,0x6E,0x38, // 'X'
+ 0xE1,0xD8,0x67,0x38,0xCC,0x1E,0x07,0x80,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x00, // 'Y'
+ 0xFF,0xFF,0xC0,0xC0,0xE0,0x60,0x60,0x70,0x30,0x38,0x38,0x18,0x1F,0xFF,0xF8, // 'Z'
+ 0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFF, // '['
+ 0xC0,0x30,0x18,0x06,0x03,0x00,0xC0,0x60,0x38,0x0C,0x06,0x01,0x80,0xC0,0x30,0x18,0x06, // '\'
+ 0xFF,0x33,0x33,0x33,0x33,0x33,0x33,0xFF, // ']'
+ 0x0C,0x07,0x83,0x31,0x86,0xC0,0xC0, // '^'
+ 0xFF,0xFF,0xFC, // '_'
+ 0xC6,0x30, // '`'
+ 0x3E,0x3F,0x90,0xE0,0x33,0xFF,0xFF,0x07,0x87,0xFF,0xBE,0xC0, // 'a'
+ 0xC0,0x60,0x30,0x18,0x0D,0xE7,0xFB,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x7F,0xF6,0xF0, // 'b'
+ 0x1E,0x7F,0x61,0xC0,0xC0,0xC0,0xC0,0x61,0x7F,0x1E, // 'c'
+ 0x01,0x80,0xC0,0x60,0x33,0xDB,0xFF,0x8F,0x83,0xC1,0xE0,0xF0,0x7C,0x77,0xF9,0xEC, // 'd'
+ 0x3E,0x3F,0x98,0xF8,0x3F,0xFF,0xFF,0x00,0xC1,0x7F,0x8F,0x80, // 'e'
+ 0x0F,0x1F,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 'f'
+ 0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x68,0x77,0xF1,0xF0, // 'g'
+ 0xC0,0x60,0x30,0x18,0x0C,0xE7,0xFB,0x8F,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0C, // 'h'
+ 0x18,0x18,0x00,0x00,0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xFF, // 'i'
+ 0x0C,0x30,0x00,0x7D,0xF0,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0xFB,0xC0, // 'j'
+ 0xC0,0x60,0x30,0x18,0x0C,0x3E,0x3B,0x39,0xB8,0xF8,0x7E,0x33,0x18,0xCC,0x76,0x1C, // 'k'
+ 0xF8,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0x0F, // 'l'
+ 0xDB,0xBF,0xFC,0xCF,0x33,0xCC,0xF3,0x3C,0xCF,0x33,0xCC,0xF3,0x30, // 'm'
+ 0xCE,0x7F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xC0, // 'n'
+ 0x3E,0x3F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x1F,0x00, // 'o'
+ 0xDE,0x7F,0xB8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0xFF,0x6F,0x30,0x18,0x0C,0x06,0x00, // 'p'
+ 0x3D,0xBF,0xF8,0xF8,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9E,0xC0,0x60,0x30,0x18,0x0C, // 'q'
+ 0xDD,0xBF,0x8E,0x0C,0x18,0x30,0x60,0xC1,0x80, // 'r'
+ 0x3F,0x7F,0xF0,0x3F,0x07,0xF0,0x3C,0x07,0x03,0xFF,0xBF,0x00, // 's'
+ 0x18,0x0C,0x06,0x1F,0xFF,0xF8,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03,0xF0,0xF8, // 't'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0xC7,0x7F,0x9C,0xC0, // 'u'
+ 0xC1,0xB1,0x98,0xCC,0x63,0x61,0xB0,0xD8,0x38,0x1C,0x0E,0x00, // 'v'
+ 0xC0,0x78,0x0D,0x83,0x32,0x66,0xEC,0xD5,0x8E,0xE1,0xDC,0x31,0x86,0x30, // 'w'
+ 0xE3,0xBB,0x8D,0x83,0x81,0xC0,0xE0,0xF8,0x6C,0x63,0x71,0xC0, // 'x'
+ 0xC1,0xB1,0x98,0xCE,0x63,0x61,0xB0,0x78,0x38,0x0C,0x0E,0x06,0x03,0x07,0x83,0x80, // 'y'
+ 0xFF,0xFF,0xC1,0xC1,0xC1,0xC0,0xC0,0xC0,0xE0,0xFF,0xFF,0xC0, // 'z'
+ 0x0F,0x1F,0x18,0x18,0x18,0x18,0x18,0xF0,0xF0,0x38,0x18,0x18,0x18,0x18,0x18,0x1F,0x0F, // '{'
+ 0xFF,0xFF,0xFF,0xFF,0xF0, // '|'
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x81, 0x98, 0x19, 0x81, 0x98, 0x7f,
+ 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe0, 0x00// lock icon
+ //0xF0,0xF8,0x18,0x18,0x18,0x18,0x18,0x0F,0x0F,0x1C,0x18,0x18,0x18,0x18,0x18,0xF8,0xF0 // '}'
+};
+const GFXglyph Monospaced_plain_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 12, 0, 0 }, // ' '
+ { 1, 2, 13, 12, 5, -13 }, // '!'
+ { 5, 6, 5, 12, 3, -13 }, // '"'
+ { 9, 11, 14, 12, 0, -14 }, // '#'
+ { 29, 9, 17, 12, 1, -14 }, // '$'
+ { 49, 11, 13, 12, 0, -13 }, // '%'
+ { 67, 10, 13, 12, 1, -13 }, // '&'
+ { 84, 2, 5, 12, 5, -13 }, // '''
+ { 86, 4, 16, 12, 4, -14 }, // '('
+ { 94, 4, 16, 12, 3, -14 }, // ')'
+ { 102, 7, 8, 12, 2, -13 }, // '*'
+ { 109, 10, 10, 12, 1, -11 }, // '+'
+ { 122, 3, 5, 12, 3, -3 }, // ','
+ { 124, 5, 2, 12, 3, -6 }, // '-'
+ { 126, 2, 3, 12, 4, -3 }, // '.'
+ { 127, 9, 15, 12, 1, -13 }, // '/'
+ { 144, 9, 13, 12, 1, -13 }, // '0'
+ { 159, 8, 13, 12, 2, -13 }, // '1'
+ { 172, 9, 13, 12, 1, -13 }, // '2'
+ { 187, 9, 13, 12, 1, -13 }, // '3'
+ { 202, 9, 13, 12, 1, -13 }, // '4'
+ { 217, 9, 13, 12, 1, -13 }, // '5'
+ { 232, 9, 13, 12, 1, -13 }, // '6'
+ { 247, 9, 13, 12, 1, -13 }, // '7'
+ { 262, 9, 13, 12, 1, -13 }, // '8'
+ { 277, 9, 13, 12, 1, -13 }, // '9'
+ { 292, 2, 9, 12, 4, -9 }, // ':'
+ { 295, 3, 11, 12, 3, -9 }, // ';'
+ { 300, 12, 18, 12, 0, -18 }, // '<'
+ { 327, 9, 6, 12, 1, -9 }, // '='
+ { 334, 12, 18, 12, 0, -18 }, // '>'
+ { 361, 7, 13, 12, 2, -13 }, // '?'
+ { 373, 9, 15, 12, 1, -12 }, // '@'
+ { 390, 9, 13, 12, 1, -13 }, // 'A'
+ { 405, 9, 13, 12, 1, -13 }, // 'B'
+ { 420, 9, 13, 12, 1, -13 }, // 'C'
+ { 435, 9, 13, 12, 1, -13 }, // 'D'
+ { 450, 9, 13, 12, 1, -13 }, // 'E'
+ { 465, 9, 13, 12, 1, -13 }, // 'F'
+ { 480, 9, 13, 12, 1, -13 }, // 'G'
+ { 495, 9, 13, 12, 1, -13 }, // 'H'
+ { 510, 8, 13, 12, 2, -13 }, // 'I'
+ { 524, 7, 13, 12, 1, -13 }, // 'J'
+ { 535, 10, 13, 12, 1, -13 }, // 'K'
+ { 552, 9, 13, 12, 1, -13 }, // 'L'
+ { 567, 9, 13, 12, 1, -13 }, // 'M'
+ { 582, 9, 13, 12, 1, -13 }, // 'N'
+ { 597, 9, 13, 12, 1, -13 }, // 'O'
+ { 612, 9, 13, 12, 1, -13 }, // 'P'
+ { 627, 9, 15, 12, 1, -13 }, // 'Q'
+ { 644, 10, 13, 12, 1, -13 }, // 'R'
+ { 661, 9, 13, 12, 1, -13 }, // 'S'
+ { 676, 10, 13, 12, 1, -13 }, // 'T'
+ { 693, 9, 13, 12, 1, -13 }, // 'U'
+ { 708, 9, 13, 12, 1, -13 }, // 'V'
+ { 723, 11, 13, 12, 0, -13 }, // 'W'
+ { 741, 9, 13, 12, 1, -13 }, // 'X'
+ { 756, 10, 13, 12, 1, -13 }, // 'Y'
+ { 773, 9, 13, 12, 1, -13 }, // 'Z'
+ { 788, 4, 16, 12, 4, -14 }, // '['
+ { 796, 9, 15, 12, 1, -13 }, // '\'
+ { 813, 4, 16, 12, 3, -14 }, // ']'
+ { 821, 10, 5, 12, 1, -13 }, // '^'
+ { 828, 11, 2, 12, 0, 2 }, // '_'
+ { 831, 4, 3, 12, 2, -14 }, // '`'
+ { 833, 9, 10, 12, 1, -10 }, // 'a'
+ { 845, 9, 14, 12, 1, -14 }, // 'b'
+ { 861, 8, 10, 12, 1, -10 }, // 'c'
+ { 871, 9, 14, 12, 1, -14 }, // 'd'
+ { 887, 9, 10, 12, 1, -10 }, // 'e'
+ { 899, 8, 14, 12, 1, -14 }, // 'f'
+ { 913, 9, 14, 12, 1, -10 }, // 'g'
+ { 929, 9, 14, 12, 1, -14 }, // 'h'
+ { 945, 8, 14, 12, 2, -14 }, // 'i'
+ { 959, 6, 18, 12, 1, -14 }, // 'j'
+ { 973, 9, 14, 12, 1, -14 }, // 'k'
+ { 989, 8, 14, 12, 1, -14 }, // 'l'
+ { 1003, 10, 10, 12, 1, -10 }, // 'm'
+ { 1017, 9, 10, 12, 1, -10 }, // 'n'
+ { 1028, 9, 10, 12, 1, -10 }, // 'o'
+ { 1040, 9, 14, 12, 1, -10 }, // 'p'
+ { 1056, 9, 14, 12, 1, -10 }, // 'q'
+ { 1072, 7, 10, 12, 3, -10 }, // 'r'
+ { 1081, 9, 10, 12, 1, -10 }, // 's'
+ { 1093, 9, 13, 12, 1, -13 }, // 't'
+ { 1108, 9, 10, 12, 1, -10 }, // 'u'
+ { 1120, 9, 10, 12, 1, -10 }, // 'v'
+ { 1132, 11, 10, 12, 0, -10 }, // 'w'
+ { 1146, 9, 10, 12, 1, -10 }, // 'x'
+ { 1158, 9, 14, 12, 1, -10 }, // 'y'
+ { 1174, 9, 10, 12, 1, -10 }, // 'z'
+ { 1186, 8, 17, 12, 2, -14 }, // '{'
+ { 1203, 2, 18, 12, 5, -14 }, // '|'
+ { 1208, 12, 18, 12, 0, -18 } // lock icon
+ //{ 1176, 8, 17, 12, 2, -14 } // '}'
+};
+const GFXfont Monospaced_plain_18 PROGMEM = {
+(uint8_t *)Monospaced_plain_18Bitmaps,(GFXglyph *)Monospaced_plain_18Glyphs,0x20, 0x7E, 16};
+
+
+const uint8_t FreeMono9pt7bBitmaps[] = {
+ 0xAA, 0xA8, 0x0C, 0xED, 0x24, 0x92, 0x48, 0x24, 0x48, 0x91, 0x2F, 0xE4,
+ 0x89, 0x7F, 0x28, 0x51, 0x22, 0x40, 0x08, 0x3E, 0x62, 0x40, 0x30, 0x0E,
+ 0x01, 0x81, 0xC3, 0xBE, 0x08, 0x08, 0x71, 0x12, 0x23, 0x80, 0x23, 0xB8,
+ 0x0E, 0x22, 0x44, 0x70, 0x38, 0x81, 0x02, 0x06, 0x1A, 0x65, 0x46, 0xC8,
+ 0xEC, 0xE9, 0x24, 0x5A, 0xAA, 0xA9, 0x40, 0xA9, 0x55, 0x5A, 0x80, 0x10,
+ 0x22, 0x4B, 0xE3, 0x05, 0x11, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04,
+ 0x00, 0x6B, 0x48, 0xFF, 0x00, 0xF0, 0x02, 0x08, 0x10, 0x60, 0x81, 0x04,
+ 0x08, 0x20, 0x41, 0x02, 0x08, 0x00, 0x38, 0x8A, 0x0C, 0x18, 0x30, 0x60,
+ 0xC1, 0x82, 0x88, 0xE0, 0x27, 0x28, 0x42, 0x10, 0x84, 0x21, 0x3E, 0x38,
+ 0x8A, 0x08, 0x10, 0x20, 0x82, 0x08, 0x61, 0x03, 0xF8, 0x7C, 0x06, 0x02,
+ 0x02, 0x1C, 0x06, 0x01, 0x01, 0x01, 0x42, 0x3C, 0x18, 0xA2, 0x92, 0x8A,
+ 0x28, 0xBF, 0x08, 0x21, 0xC0, 0x7C, 0x81, 0x03, 0xE4, 0x40, 0x40, 0x81,
+ 0x03, 0x88, 0xE0, 0x1E, 0x41, 0x04, 0x0B, 0x98, 0xB0, 0xC1, 0xC2, 0x88,
+ 0xE0, 0xFE, 0x04, 0x08, 0x20, 0x40, 0x82, 0x04, 0x08, 0x20, 0x40, 0x38,
+ 0x8A, 0x0C, 0x14, 0x47, 0x11, 0x41, 0x83, 0x8C, 0xE0, 0x38, 0x8A, 0x1C,
+ 0x18, 0x68, 0xCE, 0x81, 0x04, 0x13, 0xC0, 0xF0, 0x0F, 0x6C, 0x00, 0xD2,
+ 0xD2, 0x00, 0x03, 0x04, 0x18, 0x60, 0x60, 0x18, 0x04, 0x03, 0xFF, 0x80,
+ 0x00, 0x1F, 0xF0, 0x40, 0x18, 0x03, 0x00, 0x60, 0x20, 0x60, 0xC0, 0x80,
+ 0x3D, 0x84, 0x08, 0x30, 0xC2, 0x00, 0x00, 0x00, 0x30, 0x3C, 0x46, 0x82,
+ 0x8E, 0xB2, 0xA2, 0xA2, 0x9F, 0x80, 0x80, 0x40, 0x3C, 0x3C, 0x01, 0x40,
+ 0x28, 0x09, 0x01, 0x10, 0x42, 0x0F, 0xC1, 0x04, 0x40, 0x9E, 0x3C, 0xFE,
+ 0x21, 0x90, 0x48, 0x67, 0xE2, 0x09, 0x02, 0x81, 0x41, 0xFF, 0x80, 0x3E,
+ 0xB0, 0xF0, 0x30, 0x08, 0x04, 0x02, 0x00, 0x80, 0x60, 0x8F, 0x80, 0xFE,
+ 0x21, 0x90, 0x68, 0x14, 0x0A, 0x05, 0x02, 0x83, 0x43, 0x7F, 0x00, 0xFF,
+ 0x20, 0x90, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x81, 0x40, 0xFF, 0xC0, 0xFF,
+ 0xA0, 0x50, 0x08, 0x87, 0xC2, 0x21, 0x00, 0x80, 0x40, 0x78, 0x00, 0x1E,
+ 0x98, 0x6C, 0x0A, 0x00, 0x80, 0x20, 0xF8, 0x0B, 0x02, 0x60, 0x87, 0xC0,
+ 0xE3, 0xA0, 0x90, 0x48, 0x27, 0xF2, 0x09, 0x04, 0x82, 0x41, 0x71, 0xC0,
+ 0xF9, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x1F, 0x02, 0x02, 0x02, 0x02,
+ 0x02, 0x82, 0x82, 0xC6, 0x78, 0xE3, 0xA1, 0x11, 0x09, 0x05, 0x83, 0x21,
+ 0x08, 0x84, 0x41, 0x70, 0xC0, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41,
+ 0x41, 0x41, 0xFF, 0xE0, 0xEC, 0x19, 0x45, 0x28, 0xA4, 0xA4, 0x94, 0x91,
+ 0x12, 0x02, 0x40, 0x5C, 0x1C, 0xC3, 0xB0, 0x94, 0x4A, 0x24, 0x92, 0x49,
+ 0x14, 0x8A, 0x43, 0x70, 0x80, 0x1E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06,
+ 0x02, 0x82, 0x63, 0x0F, 0x00, 0xFE, 0x43, 0x41, 0x41, 0x42, 0x7C, 0x40,
+ 0x40, 0x40, 0xF0, 0x1C, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x02, 0x82,
+ 0x63, 0x1F, 0x04, 0x07, 0x92, 0x30, 0xFE, 0x21, 0x90, 0x48, 0x24, 0x23,
+ 0xE1, 0x10, 0x84, 0x41, 0x70, 0xC0, 0x3A, 0xCD, 0x0A, 0x03, 0x01, 0x80,
+ 0xC1, 0xC7, 0x78, 0xFF, 0xC4, 0x62, 0x21, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x1F, 0x00, 0xE3, 0xA0, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x82,
+ 0x22, 0x0E, 0x00, 0xF1, 0xE8, 0x10, 0x82, 0x10, 0x42, 0x10, 0x22, 0x04,
+ 0x80, 0x50, 0x0C, 0x00, 0x80, 0xF1, 0xE8, 0x09, 0x11, 0x25, 0x44, 0xA8,
+ 0x55, 0x0C, 0xA1, 0x8C, 0x31, 0x84, 0x30, 0xE3, 0xA0, 0x88, 0x82, 0x80,
+ 0x80, 0xC0, 0x90, 0x44, 0x41, 0x71, 0xC0, 0xE3, 0xA0, 0x88, 0x82, 0x81,
+ 0x40, 0x40, 0x20, 0x10, 0x08, 0x1F, 0x00, 0xFD, 0x0A, 0x20, 0x81, 0x04,
+ 0x10, 0x21, 0x83, 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x81, 0x03, 0x02,
+ 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0xD5, 0x55, 0x55, 0xC0,
+ 0x10, 0x51, 0x22, 0x28, 0x20, 0xFF, 0xE0, 0x88, 0x80, 0x7E, 0x00, 0x80,
+ 0x47, 0xEC, 0x14, 0x0A, 0x0C, 0xFB, 0xC0, 0x20, 0x10, 0x0B, 0xC6, 0x12,
+ 0x05, 0x02, 0x81, 0x40, 0xB0, 0xB7, 0x80, 0x3A, 0x8E, 0x0C, 0x08, 0x10,
+ 0x10, 0x9E, 0x03, 0x00, 0x80, 0x47, 0xA4, 0x34, 0x0A, 0x05, 0x02, 0x81,
+ 0x21, 0x8F, 0x60, 0x3C, 0x43, 0x81, 0xFF, 0x80, 0x80, 0x61, 0x3E, 0x3D,
+ 0x04, 0x3E, 0x41, 0x04, 0x10, 0x41, 0x0F, 0x80, 0x3D, 0xA1, 0xA0, 0x50,
+ 0x28, 0x14, 0x09, 0x0C, 0x7A, 0x01, 0x01, 0x87, 0x80, 0xC0, 0x20, 0x10,
+ 0x0B, 0xC6, 0x32, 0x09, 0x04, 0x82, 0x41, 0x20, 0xB8, 0xE0, 0x10, 0x01,
+ 0xC0, 0x81, 0x02, 0x04, 0x08, 0x11, 0xFC, 0x10, 0x3E, 0x10, 0x84, 0x21,
+ 0x08, 0x42, 0x3F, 0x00, 0xC0, 0x40, 0x40, 0x4F, 0x44, 0x58, 0x70, 0x48,
+ 0x44, 0x42, 0xC7, 0x70, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x23,
+ 0xF8, 0xB7, 0x64, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x23, 0x91, 0x5E, 0x31,
+ 0x90, 0x48, 0x24, 0x12, 0x09, 0x05, 0xC7, 0x3E, 0x31, 0xA0, 0x30, 0x18,
+ 0x0C, 0x05, 0x8C, 0x7C, 0xDE, 0x30, 0x90, 0x28, 0x14, 0x0A, 0x05, 0x84,
+ 0xBC, 0x40, 0x20, 0x38, 0x00, 0x3D, 0xA1, 0xA0, 0x50, 0x28, 0x14, 0x09,
+ 0x0C, 0x7A, 0x01, 0x00, 0x80, 0xE0, 0xCE, 0xA1, 0x82, 0x04, 0x08, 0x10,
+ 0x7C, 0x3A, 0x8D, 0x0B, 0x80, 0xF0, 0x70, 0xDE, 0x40, 0x40, 0xFC, 0x40,
+ 0x40, 0x40, 0x40, 0x40, 0x41, 0x3E, 0xC3, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x43, 0x3D, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x20, 0xA0, 0x50, 0x10, 0xE3,
+ 0xC0, 0x92, 0x4B, 0x25, 0x92, 0xA9, 0x98, 0x44, 0xE3, 0x31, 0x05, 0x01,
+ 0x01, 0x41, 0x11, 0x05, 0xC7, 0xE3, 0xA0, 0x90, 0x84, 0x42, 0x40, 0xA0,
+ 0x60, 0x10, 0x10, 0x08, 0x3E, 0x00, 0xFD, 0x08, 0x20, 0x82, 0x08, 0x10,
+ 0xBF, 0x29, 0x24, 0xA2, 0x49, 0x26, 0xFF, 0xF8, 0x89, 0x24, 0x8A, 0x49,
+ 0x2C, 0x61, 0x24, 0x30 };
+
+const GFXglyph FreeMono9pt7bGlyphs[] = {
+ { 0, 0, 0, 11, 0, 1 }, // 0x20 ' '
+ { 0, 2, 11, 11, 4, -10 }, // 0x21 '!'
+ { 3, 6, 5, 11, 2, -10 }, // 0x22 '"'
+ { 7, 7, 12, 11, 2, -10 }, // 0x23 '#'
+ { 18, 8, 12, 11, 1, -10 }, // 0x24 '$'
+ { 30, 7, 11, 11, 2, -10 }, // 0x25 '%'
+ { 40, 7, 10, 11, 2, -9 }, // 0x26 '&'
+ { 49, 3, 5, 11, 4, -10 }, // 0x27 '''
+ { 51, 2, 13, 11, 5, -10 }, // 0x28 '('
+ { 55, 2, 13, 11, 4, -10 }, // 0x29 ')'
+ { 59, 7, 7, 11, 2, -10 }, // 0x2A '*'
+ { 66, 7, 7, 11, 2, -8 }, // 0x2B '+'
+ { 73, 3, 5, 11, 2, -1 }, // 0x2C ','
+ { 75, 9, 1, 11, 1, -5 }, // 0x2D '-'
+ { 77, 2, 2, 11, 4, -1 }, // 0x2E '.'
+ { 78, 7, 13, 11, 2, -11 }, // 0x2F '/'
+ { 90, 7, 11, 11, 2, -10 }, // 0x30 '0'
+ { 100, 5, 11, 11, 3, -10 }, // 0x31 '1'
+ { 107, 7, 11, 11, 2, -10 }, // 0x32 '2'
+ { 117, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 128, 6, 11, 11, 3, -10 }, // 0x34 '4'
+ { 137, 7, 11, 11, 2, -10 }, // 0x35 '5'
+ { 147, 7, 11, 11, 2, -10 }, // 0x36 '6'
+ { 157, 7, 11, 11, 2, -10 }, // 0x37 '7'
+ { 167, 7, 11, 11, 2, -10 }, // 0x38 '8'
+ { 177, 7, 11, 11, 2, -10 }, // 0x39 '9'
+ { 187, 2, 8, 11, 4, -7 }, // 0x3A ':'
+ { 189, 3, 11, 11, 3, -7 }, // 0x3B ';'
+ { 194, 8, 8, 11, 1, -8 }, // 0x3C '<'
+ { 202, 9, 4, 11, 1, -6 }, // 0x3D '='
+ { 207, 9, 8, 11, 1, -8 }, // 0x3E '>'
+ { 216, 7, 10, 11, 2, -9 }, // 0x3F '?'
+ { 225, 8, 12, 11, 2, -10 }, // 0x40 '@'
+ { 237, 11, 10, 11, 0, -9 }, // 0x41 'A'
+ { 251, 9, 10, 11, 1, -9 }, // 0x42 'B'
+ { 263, 9, 10, 11, 1, -9 }, // 0x43 'C'
+ { 275, 9, 10, 11, 1, -9 }, // 0x44 'D'
+ { 287, 9, 10, 11, 1, -9 }, // 0x45 'E'
+ { 299, 9, 10, 11, 1, -9 }, // 0x46 'F'
+ { 311, 10, 10, 11, 1, -9 }, // 0x47 'G'
+ { 324, 9, 10, 11, 1, -9 }, // 0x48 'H'
+ { 336, 5, 10, 11, 3, -9 }, // 0x49 'I'
+ { 343, 8, 10, 11, 2, -9 }, // 0x4A 'J'
+ { 353, 9, 10, 11, 1, -9 }, // 0x4B 'K'
+ { 365, 8, 10, 11, 2, -9 }, // 0x4C 'L'
+ { 375, 11, 10, 11, 0, -9 }, // 0x4D 'M'
+ { 389, 9, 10, 11, 1, -9 }, // 0x4E 'N'
+ { 401, 9, 10, 11, 1, -9 }, // 0x4F 'O'
+ { 413, 8, 10, 11, 1, -9 }, // 0x50 'P'
+ { 423, 9, 13, 11, 1, -9 }, // 0x51 'Q'
+ { 438, 9, 10, 11, 1, -9 }, // 0x52 'R'
+ { 450, 7, 10, 11, 2, -9 }, // 0x53 'S'
+ { 459, 9, 10, 11, 1, -9 }, // 0x54 'T'
+ { 471, 9, 10, 11, 1, -9 }, // 0x55 'U'
+ { 483, 11, 10, 11, 0, -9 }, // 0x56 'V'
+ { 497, 11, 10, 11, 0, -9 }, // 0x57 'W'
+ { 511, 9, 10, 11, 1, -9 }, // 0x58 'X'
+ { 523, 9, 10, 11, 1, -9 }, // 0x59 'Y'
+ { 535, 7, 10, 11, 2, -9 }, // 0x5A 'Z'
+ { 544, 2, 13, 11, 5, -10 }, // 0x5B '['
+ { 548, 7, 13, 11, 2, -11 }, // 0x5C '\'
+ { 560, 2, 13, 11, 4, -10 }, // 0x5D ']'
+ { 564, 7, 5, 11, 2, -10 }, // 0x5E '^'
+ { 569, 11, 1, 11, 0, 2 }, // 0x5F '_'
+ { 571, 3, 3, 11, 3, -11 }, // 0x60 '`'
+ { 573, 9, 8, 11, 1, -7 }, // 0x61 'a'
+ { 582, 9, 11, 11, 1, -10 }, // 0x62 'b'
+ { 595, 7, 8, 11, 2, -7 }, // 0x63 'c'
+ { 602, 9, 11, 11, 1, -10 }, // 0x64 'd'
+ { 615, 8, 8, 11, 1, -7 }, // 0x65 'e'
+ { 623, 6, 11, 11, 3, -10 }, // 0x66 'f'
+ { 632, 9, 11, 11, 1, -7 }, // 0x67 'g'
+ { 645, 9, 11, 11, 1, -10 }, // 0x68 'h'
+ { 658, 7, 10, 11, 2, -9 }, // 0x69 'i'
+ { 667, 5, 13, 11, 3, -9 }, // 0x6A 'j'
+ { 676, 8, 11, 11, 2, -10 }, // 0x6B 'k'
+ { 687, 7, 11, 11, 2, -10 }, // 0x6C 'l'
+ { 697, 9, 8, 11, 1, -7 }, // 0x6D 'm'
+ { 706, 9, 8, 11, 1, -7 }, // 0x6E 'n'
+ { 715, 9, 8, 11, 1, -7 }, // 0x6F 'o'
+ { 724, 9, 11, 11, 1, -7 }, // 0x70 'p'
+ { 737, 9, 11, 11, 1, -7 }, // 0x71 'q'
+ { 750, 7, 8, 11, 3, -7 }, // 0x72 'r'
+ { 757, 7, 8, 11, 2, -7 }, // 0x73 's'
+ { 764, 8, 10, 11, 2, -9 }, // 0x74 't'
+ { 774, 8, 8, 11, 1, -7 }, // 0x75 'u'
+ { 782, 9, 8, 11, 1, -7 }, // 0x76 'v'
+ { 791, 9, 8, 11, 1, -7 }, // 0x77 'w'
+ { 800, 9, 8, 11, 1, -7 }, // 0x78 'x'
+ { 809, 9, 11, 11, 1, -7 }, // 0x79 'y'
+ { 822, 7, 8, 11, 2, -7 }, // 0x7A 'z'
+ { 829, 3, 13, 11, 4, -10 }, // 0x7B '{'
+ { 834, 1, 13, 11, 5, -10 }, // 0x7C '|'
+ { 836, 3, 13, 11, 4, -10 }, // 0x7D '}'
+ { 841, 7, 3, 11, 2, -6 } }; // 0x7E '~'
+
+const GFXfont FreeMono9pt7b = {
+ (uint8_t *)FreeMono9pt7bBitmaps,
+ (GFXglyph *)FreeMono9pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+const uint8_t FreeSans12pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x06, 0x30,
+ 0x31, 0x03, 0x18, 0x18, 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x03, 0x18, 0x18,
+ 0xC7, 0xFF, 0xBF, 0xFC, 0x31, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x06, 0x30,
+ 0x04, 0x03, 0xE1, 0xFF, 0x72, 0x6C, 0x47, 0x88, 0xF1, 0x07, 0x20, 0x7E,
+ 0x03, 0xF0, 0x17, 0x02, 0x3C, 0x47, 0x88, 0xF1, 0x1B, 0x26, 0x7F, 0xC3,
+ 0xE0, 0x10, 0x02, 0x00, 0x00, 0x06, 0x03, 0xC0, 0x40, 0x7E, 0x0C, 0x0E,
+ 0x70, 0x80, 0xC3, 0x18, 0x0C, 0x31, 0x00, 0xE7, 0x30, 0x07, 0xE6, 0x00,
+ 0x3C, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x8F, 0xE0, 0x19, 0xC7, 0x01, 0x18,
+ 0x30, 0x31, 0x83, 0x02, 0x1C, 0x70, 0x40, 0xFE, 0x04, 0x07, 0xC0, 0x0F,
+ 0x00, 0x7E, 0x03, 0x9C, 0x0C, 0x30, 0x30, 0xC0, 0xE7, 0x01, 0xF8, 0x03,
+ 0x80, 0x3E, 0x01, 0xCC, 0x6E, 0x19, 0xB0, 0x7C, 0xC0, 0xF3, 0x03, 0xCE,
+ 0x1F, 0x9F, 0xE6, 0x1E, 0x1C, 0xFF, 0xA0, 0x08, 0x8C, 0x66, 0x31, 0x98,
+ 0xC6, 0x31, 0x8C, 0x63, 0x08, 0x63, 0x08, 0x61, 0x0C, 0x20, 0x82, 0x18,
+ 0xC3, 0x18, 0xC3, 0x18, 0xC6, 0x31, 0x8C, 0x62, 0x31, 0x88, 0xC4, 0x62,
+ 0x00, 0x10, 0x23, 0x5B, 0xE3, 0x8D, 0x91, 0x00, 0x0C, 0x03, 0x00, 0xC0,
+ 0x30, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0xF5, 0x60,
+ 0xFF, 0xF0, 0xF0, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x02, 0x0C, 0x10, 0x20,
+ 0xC1, 0x02, 0x0C, 0x10, 0x20, 0xC1, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30,
+ 0x6E, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x1F, 0x00, 0x08, 0xCF, 0xFF, 0x8C, 0x63,
+ 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x1F, 0x0F, 0xF9, 0x87, 0x60, 0x7C,
+ 0x06, 0x00, 0xC0, 0x18, 0x07, 0x01, 0xC0, 0xF0, 0x78, 0x1C, 0x06, 0x00,
+ 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0x3F, 0x0F, 0xF3, 0x87, 0x60, 0x6C,
+ 0x0C, 0x01, 0x80, 0x70, 0x7C, 0x0F, 0x80, 0x18, 0x01, 0x80, 0x3C, 0x07,
+ 0x80, 0xD8, 0x73, 0xFC, 0x1F, 0x00, 0x01, 0x80, 0x70, 0x0E, 0x03, 0xC0,
+ 0xD8, 0x1B, 0x06, 0x61, 0x8C, 0x21, 0x8C, 0x33, 0x06, 0x7F, 0xFF, 0xFE,
+ 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x3F, 0xCF, 0xF9, 0x80, 0x30, 0x06,
+ 0x00, 0xDE, 0x1F, 0xE7, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0x80, 0x30, 0x07,
+ 0x81, 0xF8, 0x73, 0xFC, 0x1F, 0x00, 0x0F, 0x07, 0xF9, 0xC3, 0x30, 0x74,
+ 0x01, 0x80, 0x33, 0xC7, 0xFE, 0xF0, 0xDC, 0x1F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xC1, 0xDC, 0x71, 0xFC, 0x1F, 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x00, 0x60,
+ 0x18, 0x02, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x30, 0x04, 0x01, 0x80,
+ 0x30, 0x06, 0x01, 0x80, 0x30, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x66,
+ 0x0C, 0xC1, 0x8C, 0x61, 0xFC, 0x3F, 0x8E, 0x3B, 0x01, 0xE0, 0x3C, 0x07,
+ 0x80, 0xD8, 0x31, 0xFC, 0x1F, 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x6C,
+ 0x07, 0x80, 0xF0, 0x1E, 0x07, 0x61, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x05,
+ 0x81, 0x98, 0x73, 0xFC, 0x1E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0xF0, 0x00,
+ 0x0F, 0x56, 0x00, 0x00, 0x07, 0x01, 0xE0, 0xF8, 0x3C, 0x0F, 0x00, 0xE0,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xF0, 0x07,
+ 0xC0, 0x0F, 0x00, 0x70, 0x1E, 0x0F, 0x03, 0xC0, 0xF0, 0x08, 0x00, 0x1F,
+ 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0,
+ 0xE0, 0x30, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00, 0xFE,
+ 0x00, 0x0F, 0xFE, 0x00, 0xF0, 0x3E, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x30,
+ 0xC1, 0xE0, 0x66, 0x0F, 0xD9, 0xD8, 0x61, 0xC3, 0xC3, 0x07, 0x0F, 0x1C,
+ 0x1C, 0x3C, 0x60, 0x60, 0xF1, 0x81, 0x83, 0xC6, 0x06, 0x1B, 0x18, 0x38,
+ 0xEE, 0x71, 0xE7, 0x18, 0xFD, 0xF8, 0x71, 0xE7, 0xC0, 0xE0, 0x00, 0x01,
+ 0xE0, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0xFC, 0x00, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x07, 0xE0, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0x0C, 0x30,
+ 0x0C, 0x30, 0x1C, 0x38, 0x18, 0x18, 0x1F, 0xF8, 0x3F, 0xFC, 0x30, 0x1C,
+ 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0xFF, 0xC7, 0xFF, 0x30,
+ 0x19, 0x80, 0x6C, 0x03, 0x60, 0x1B, 0x00, 0xD8, 0x0C, 0xFF, 0xC7, 0xFF,
+ 0x30, 0x0D, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x06, 0xFF, 0xF7,
+ 0xFE, 0x00, 0x07, 0xE0, 0x3F, 0xF0, 0xE0, 0x73, 0x80, 0x66, 0x00, 0x6C,
+ 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00,
+ 0x06, 0x00, 0x6C, 0x00, 0xDC, 0x03, 0x1E, 0x0E, 0x1F, 0xF8, 0x0F, 0xC0,
+ 0xFF, 0x83, 0xFF, 0x8C, 0x07, 0x30, 0x0E, 0xC0, 0x1B, 0x00, 0x7C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x1F, 0x00,
+ 0x6C, 0x03, 0xB0, 0x1C, 0xFF, 0xE3, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xEF, 0xFE, 0xC0,
+ 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, 0xDF,
+ 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00,
+ 0x07, 0xF0, 0x1F, 0xFC, 0x3C, 0x1E, 0x70, 0x06, 0x60, 0x03, 0xE0, 0x00,
+ 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x7F, 0xC0, 0x7F, 0xC0, 0x03, 0xC0, 0x03,
+ 0x60, 0x03, 0x60, 0x07, 0x30, 0x0F, 0x3C, 0x1F, 0x1F, 0xFB, 0x07, 0xE1,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x03, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60,
+ 0x3C, 0x1E, 0x0F, 0x07, 0xC7, 0x7F, 0x1F, 0x00, 0xC0, 0x3B, 0x01, 0xCC,
+ 0x0E, 0x30, 0x70, 0xC3, 0x83, 0x1C, 0x0C, 0xE0, 0x33, 0x80, 0xDE, 0x03,
+ 0xDC, 0x0E, 0x38, 0x30, 0x60, 0xC1, 0xC3, 0x03, 0x8C, 0x06, 0x30, 0x1C,
+ 0xC0, 0x3B, 0x00, 0x60, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xFF, 0xFF, 0xF0, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, 0x0F, 0xD0,
+ 0x0F, 0xD8, 0x1B, 0xD8, 0x1B, 0xD8, 0x1B, 0xCC, 0x33, 0xCC, 0x33, 0xCC,
+ 0x33, 0xC6, 0x63, 0xC6, 0x63, 0xC6, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC1, 0x83, 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xE0, 0x3D, 0x81, 0xEE,
+ 0x0F, 0x30, 0x79, 0xC3, 0xC6, 0x1E, 0x18, 0xF0, 0xE7, 0x83, 0x3C, 0x1D,
+ 0xE0, 0x6F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, 0xC0, 0x03, 0xE0, 0x0F,
+ 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6, 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07,
+ 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00,
+ 0x33, 0x00, 0x18, 0xC0, 0x18, 0x78, 0x3C, 0x1F, 0xFC, 0x03, 0xF8, 0x00,
+ 0xFF, 0x8F, 0xFE, 0xC0, 0x6C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07,
+ 0xFF, 0xEF, 0xFC, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00,
+ 0xC0, 0x0C, 0x00, 0x03, 0xE0, 0x0F, 0xFC, 0x0F, 0x07, 0x86, 0x00, 0xC6,
+ 0x00, 0x33, 0x00, 0x1B, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00,
+ 0xF0, 0x00, 0x78, 0x00, 0x36, 0x00, 0x33, 0x01, 0x98, 0xC0, 0xFC, 0x78,
+ 0x3C, 0x1F, 0xFF, 0x03, 0xF9, 0x80, 0x00, 0x40, 0xFF, 0xC3, 0xFF, 0xCC,
+ 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x0C, 0xFF, 0xE3,
+ 0xFF, 0xCC, 0x03, 0xB0, 0x06, 0xC0, 0x1B, 0x00, 0x6C, 0x01, 0xB0, 0x06,
+ 0xC0, 0x1B, 0x00, 0x70, 0x0F, 0xE0, 0x7F, 0xC3, 0x83, 0x9C, 0x07, 0x60,
+ 0x0D, 0x80, 0x06, 0x00, 0x1E, 0x00, 0x3F, 0x80, 0x3F, 0xC0, 0x0F, 0x80,
+ 0x07, 0xC0, 0x0F, 0x00, 0x3E, 0x00, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x80, 0xEE, 0x0E, 0x3F, 0xE0, 0x7C, 0x00, 0x60, 0x06, 0xC0,
+ 0x1D, 0xC0, 0x31, 0x80, 0x63, 0x01, 0xC7, 0x03, 0x06, 0x06, 0x0C, 0x1C,
+ 0x1C, 0x30, 0x18, 0x60, 0x31, 0xC0, 0x73, 0x00, 0x66, 0x00, 0xDC, 0x01,
+ 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xE0, 0x30, 0x1D, 0x80, 0xE0,
+ 0x76, 0x07, 0x81, 0xD8, 0x1E, 0x06, 0x70, 0x7C, 0x18, 0xC1, 0xB0, 0xE3,
+ 0x0C, 0xC3, 0x8C, 0x33, 0x0C, 0x38, 0xC6, 0x30, 0x67, 0x18, 0xC1, 0x98,
+ 0x67, 0x06, 0x61, 0xD8, 0x1D, 0x83, 0x60, 0x3C, 0x0D, 0x80, 0xF0, 0x3E,
+ 0x03, 0xC0, 0x70, 0x0F, 0x01, 0xC0, 0x18, 0x07, 0x00, 0x70, 0x0E, 0x60,
+ 0x38, 0xE0, 0x60, 0xE1, 0xC0, 0xC3, 0x01, 0xCC, 0x01, 0xF8, 0x01, 0xE0,
+ 0x03, 0x80, 0x07, 0x80, 0x1F, 0x00, 0x33, 0x00, 0xE7, 0x03, 0x86, 0x06,
+ 0x0E, 0x1C, 0x0E, 0x70, 0x0C, 0xC0, 0x1C, 0x60, 0x06, 0x70, 0x0E, 0x30,
+ 0x1C, 0x38, 0x18, 0x1C, 0x38, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x60, 0x03,
+ 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
+ 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0x0E,
+ 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03,
+ 0x80, 0x38, 0x03, 0x80, 0x18, 0x01, 0xC0, 0x1C, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF,
+ 0xF0, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x18, 0x10, 0x20, 0x60, 0x40,
+ 0x81, 0x81, 0x02, 0x06, 0x04, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x0E, 0x05, 0x86, 0xC3, 0x21, 0x19,
+ 0x8C, 0x83, 0xC1, 0x80, 0xFF, 0xFE, 0xE3, 0x8C, 0x30, 0x3F, 0x07, 0xF8,
+ 0xE1, 0xCC, 0x0C, 0x00, 0xC0, 0x1C, 0x3F, 0xCF, 0x8C, 0xC0, 0xCC, 0x0C,
+ 0xE3, 0xC7, 0xEF, 0x3C, 0x70, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0,
+ 0x0C, 0xF8, 0xDF, 0xCF, 0x0E, 0xE0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xE0, 0x6F, 0x0E, 0xDF, 0xCC, 0xF8, 0x1F, 0x0F, 0xE7, 0x1B,
+ 0x83, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x38, 0x37, 0x1C, 0xFE, 0x1F,
+ 0x00, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xFB, 0x8F,
+ 0xE0, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF8, 0x3B, 0x8F, 0x3F,
+ 0x63, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x3C, 0x07, 0xFF, 0xFF, 0xFE,
+ 0x00, 0xC0, 0x1C, 0x0D, 0xC3, 0x1F, 0xE1, 0xF0, 0x3B, 0xD8, 0xC6, 0x7F,
+ 0xEC, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x00, 0x1E, 0x67, 0xFD, 0xC7,
+ 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x9F,
+ 0xB1, 0xE6, 0x00, 0xC0, 0x3E, 0x0E, 0x7F, 0xC7, 0xE0, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x33, 0xCD, 0xFB, 0xC7, 0xE0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0xF0, 0x33, 0x00, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F,
+ 0xE0, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x83, 0x30, 0xC6, 0x30,
+ 0xCC, 0x1B, 0x83, 0xF0, 0x77, 0x0C, 0x61, 0x8E, 0x30, 0xE6, 0x0C, 0xC1,
+ 0xD8, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xCF, 0x1F, 0x6F, 0xDF, 0xFC,
+ 0x78, 0xFC, 0x18, 0x3C, 0x0C, 0x1E, 0x06, 0x0F, 0x03, 0x07, 0x81, 0x83,
+ 0xC0, 0xC1, 0xE0, 0x60, 0xF0, 0x30, 0x78, 0x18, 0x3C, 0x0C, 0x18, 0xCF,
+ 0x37, 0xEF, 0x1F, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xC0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80,
+ 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D, 0xC7, 0x1F, 0xC1, 0xF0, 0xCF, 0x8D,
+ 0xFC, 0xF0, 0xEE, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E,
+ 0x07, 0xF0, 0xEF, 0xFC, 0xCF, 0x8C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00,
+ 0x1E, 0x67, 0xFD, 0xC7, 0xF0, 0x7C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x7C, 0x1D, 0xC7, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0xCF, 0x7F, 0x38, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x1F,
+ 0xEE, 0x1B, 0x00, 0xC0, 0x3C, 0x07, 0xF0, 0x3E, 0x01, 0xF0, 0x3E, 0x1D,
+ 0xFE, 0x3E, 0x00, 0x63, 0x19, 0xFF, 0xB1, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0xE7, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xE0, 0x66, 0x06, 0x60, 0x67, 0x0C,
+ 0x30, 0xC3, 0x0C, 0x39, 0x81, 0x98, 0x19, 0x81, 0xF0, 0x0F, 0x00, 0xE0,
+ 0x0E, 0x00, 0xC1, 0xC1, 0xB0, 0xE1, 0xD8, 0x70, 0xCC, 0x2C, 0x66, 0x36,
+ 0x31, 0x9B, 0x18, 0xCD, 0x98, 0x64, 0x6C, 0x16, 0x36, 0x0F, 0x1A, 0x07,
+ 0x8F, 0x03, 0x83, 0x80, 0xC1, 0xC0, 0x60, 0xEE, 0x18, 0xC6, 0x0C, 0xC1,
+ 0xF0, 0x1C, 0x01, 0x80, 0x78, 0x1B, 0x03, 0x30, 0xC7, 0x30, 0x66, 0x06,
+ 0xE0, 0x6C, 0x0D, 0x83, 0x38, 0x63, 0x0C, 0x63, 0x0E, 0x60, 0xCC, 0x1B,
+ 0x03, 0x60, 0x3C, 0x07, 0x00, 0xE0, 0x18, 0x03, 0x00, 0xE0, 0x78, 0x0E,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x81, 0xC0, 0x60, 0x30,
+ 0x18, 0x0E, 0x03, 0xFF, 0xFF, 0xC0, 0x19, 0xCC, 0x63, 0x18, 0xC6, 0x31,
+ 0x99, 0x86, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x1C, 0x60, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0xC7, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x0C, 0x33, 0x31,
+ 0x8C, 0x63, 0x18, 0xC6, 0x73, 0x00, 0x70, 0x3E, 0x09, 0xE4, 0x1F, 0x03,
+ 0x80 };
+
+const GFXglyph FreeSans12pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
+ { 0, 2, 18, 8, 3, -17 }, // 0x21 '!'
+ { 5, 6, 6, 8, 1, -16 }, // 0x22 '"'
+ { 10, 13, 16, 13, 0, -15 }, // 0x23 '#'
+ { 36, 11, 20, 13, 1, -17 }, // 0x24 '$'
+ { 64, 20, 17, 21, 1, -16 }, // 0x25 '%'
+ { 107, 14, 17, 16, 1, -16 }, // 0x26 '&'
+ { 137, 2, 6, 5, 1, -16 }, // 0x27 '''
+ { 139, 5, 23, 8, 2, -17 }, // 0x28 '('
+ { 154, 5, 23, 8, 1, -17 }, // 0x29 ')'
+ { 169, 7, 7, 9, 1, -17 }, // 0x2A '*'
+ { 176, 10, 11, 14, 2, -10 }, // 0x2B '+'
+ { 190, 2, 6, 7, 2, -1 }, // 0x2C ','
+ { 192, 6, 2, 8, 1, -7 }, // 0x2D '-'
+ { 194, 2, 2, 6, 2, -1 }, // 0x2E '.'
+ { 195, 7, 18, 7, 0, -17 }, // 0x2F '/'
+ { 211, 11, 17, 13, 1, -16 }, // 0x30 '0'
+ { 235, 5, 17, 13, 3, -16 }, // 0x31 '1'
+ { 246, 11, 17, 13, 1, -16 }, // 0x32 '2'
+ { 270, 11, 17, 13, 1, -16 }, // 0x33 '3'
+ { 294, 11, 17, 13, 1, -16 }, // 0x34 '4'
+ { 318, 11, 17, 13, 1, -16 }, // 0x35 '5'
+ { 342, 11, 17, 13, 1, -16 }, // 0x36 '6'
+ { 366, 11, 17, 13, 1, -16 }, // 0x37 '7'
+ { 390, 11, 17, 13, 1, -16 }, // 0x38 '8'
+ { 414, 11, 17, 13, 1, -16 }, // 0x39 '9'
+ { 438, 2, 13, 6, 2, -12 }, // 0x3A ':'
+ { 442, 2, 16, 6, 2, -11 }, // 0x3B ';'
+ { 446, 12, 12, 14, 1, -11 }, // 0x3C '<'
+ { 464, 12, 6, 14, 1, -8 }, // 0x3D '='
+ { 473, 12, 12, 14, 1, -11 }, // 0x3E '>'
+ { 491, 10, 18, 13, 2, -17 }, // 0x3F '?'
+ { 514, 22, 21, 24, 1, -17 }, // 0x40 '@'
+ { 572, 16, 18, 16, 0, -17 }, // 0x41 'A'
+ { 608, 13, 18, 16, 2, -17 }, // 0x42 'B'
+ { 638, 15, 18, 17, 1, -17 }, // 0x43 'C'
+ { 672, 14, 18, 17, 2, -17 }, // 0x44 'D'
+ { 704, 12, 18, 15, 2, -17 }, // 0x45 'E'
+ { 731, 11, 18, 14, 2, -17 }, // 0x46 'F'
+ { 756, 16, 18, 18, 1, -17 }, // 0x47 'G'
+ { 792, 13, 18, 17, 2, -17 }, // 0x48 'H'
+ { 822, 2, 18, 7, 2, -17 }, // 0x49 'I'
+ { 827, 9, 18, 13, 1, -17 }, // 0x4A 'J'
+ { 848, 14, 18, 16, 2, -17 }, // 0x4B 'K'
+ { 880, 10, 18, 14, 2, -17 }, // 0x4C 'L'
+ { 903, 16, 18, 20, 2, -17 }, // 0x4D 'M'
+ { 939, 13, 18, 18, 2, -17 }, // 0x4E 'N'
+ { 969, 17, 18, 19, 1, -17 }, // 0x4F 'O'
+ { 1008, 12, 18, 16, 2, -17 }, // 0x50 'P'
+ { 1035, 17, 19, 19, 1, -17 }, // 0x51 'Q'
+ { 1076, 14, 18, 17, 2, -17 }, // 0x52 'R'
+ { 1108, 14, 18, 16, 1, -17 }, // 0x53 'S'
+ { 1140, 12, 18, 15, 1, -17 }, // 0x54 'T'
+ { 1167, 13, 18, 17, 2, -17 }, // 0x55 'U'
+ { 1197, 15, 18, 15, 0, -17 }, // 0x56 'V'
+ { 1231, 22, 18, 22, 0, -17 }, // 0x57 'W'
+ { 1281, 15, 18, 16, 0, -17 }, // 0x58 'X'
+ { 1315, 16, 18, 16, 0, -17 }, // 0x59 'Y'
+ { 1351, 13, 18, 15, 1, -17 }, // 0x5A 'Z'
+ { 1381, 4, 23, 7, 2, -17 }, // 0x5B '['
+ { 1393, 7, 18, 7, 0, -17 }, // 0x5C '\'
+ { 1409, 4, 23, 7, 1, -17 }, // 0x5D ']'
+ { 1421, 9, 9, 11, 1, -16 }, // 0x5E '^'
+ { 1432, 15, 1, 13, -1, 4 }, // 0x5F '_'
+ { 1434, 5, 4, 6, 1, -17 }, // 0x60 '`'
+ { 1437, 12, 13, 13, 1, -12 }, // 0x61 'a'
+ { 1457, 12, 18, 13, 1, -17 }, // 0x62 'b'
+ { 1484, 10, 13, 12, 1, -12 }, // 0x63 'c'
+ { 1501, 11, 18, 13, 1, -17 }, // 0x64 'd'
+ { 1526, 11, 13, 13, 1, -12 }, // 0x65 'e'
+ { 1544, 5, 18, 7, 1, -17 }, // 0x66 'f'
+ { 1556, 11, 18, 13, 1, -12 }, // 0x67 'g'
+ { 1581, 10, 18, 13, 1, -17 }, // 0x68 'h'
+ { 1604, 2, 18, 5, 2, -17 }, // 0x69 'i'
+ { 1609, 4, 23, 6, 0, -17 }, // 0x6A 'j'
+ { 1621, 11, 18, 12, 1, -17 }, // 0x6B 'k'
+ { 1646, 2, 18, 5, 1, -17 }, // 0x6C 'l'
+ { 1651, 17, 13, 19, 1, -12 }, // 0x6D 'm'
+ { 1679, 10, 13, 13, 1, -12 }, // 0x6E 'n'
+ { 1696, 11, 13, 13, 1, -12 }, // 0x6F 'o'
+ { 1714, 12, 17, 13, 1, -12 }, // 0x70 'p'
+ { 1740, 11, 17, 13, 1, -12 }, // 0x71 'q'
+ { 1764, 6, 13, 8, 1, -12 }, // 0x72 'r'
+ { 1774, 10, 13, 12, 1, -12 }, // 0x73 's'
+ { 1791, 5, 16, 7, 1, -15 }, // 0x74 't'
+ { 1801, 10, 13, 13, 1, -12 }, // 0x75 'u'
+ { 1818, 12, 13, 12, 0, -12 }, // 0x76 'v'
+ { 1838, 17, 13, 17, 0, -12 }, // 0x77 'w'
+ { 1866, 11, 13, 11, 0, -12 }, // 0x78 'x'
+ { 1884, 11, 18, 11, 0, -12 }, // 0x79 'y'
+ { 1909, 10, 13, 12, 1, -12 }, // 0x7A 'z'
+ { 1926, 5, 23, 8, 1, -17 }, // 0x7B '{'
+ { 1941, 2, 23, 6, 2, -17 }, // 0x7C '|'
+ { 1947, 5, 23, 8, 2, -17 }, // 0x7D '}'
+ { 1962, 10, 5, 12, 1, -10 } }; // 0x7E '~'
+
+const GFXfont FreeSans12pt7b PROGMEM = {
+ (uint8_t *)FreeSans12pt7bBitmaps,
+ (GFXglyph *)FreeSans12pt7bGlyphs,
+ 0x20, 0x7E, 29 };
+
+// Approx. 2641 bytes
+const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = {
+ 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF,
+ 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F,
+ 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35,
+ 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40,
+ 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63,
+ 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81,
+ 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4,
+ 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46,
+ 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30,
+ 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10,
+ 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33,
+ 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18,
+ 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07,
+ 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46,
+ 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3,
+ 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78,
+ 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF,
+ 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30,
+ 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0,
+ 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03,
+ 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0,
+ 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF,
+ 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71,
+ 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18,
+ 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01,
+ 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC,
+ 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00,
+ 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81,
+ 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0,
+ 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C,
+ 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0,
+ 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06,
+ 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83,
+ 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36,
+ 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C,
+ 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06,
+ 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07,
+ 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8,
+ 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0,
+ 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13,
+ 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F,
+ 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07,
+ 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8,
+ 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0,
+ 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0,
+ 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C,
+ 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0,
+ 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00,
+ 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0,
+ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F,
+ 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01,
+ 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04,
+ 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30,
+ 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98,
+ 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81,
+ 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00,
+ 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06,
+ 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60,
+ 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03,
+ 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D,
+ 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84,
+ 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2,
+ 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0,
+ 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B,
+ 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C,
+ 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03,
+ 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66,
+ 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66,
+ 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67,
+ 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C,
+ 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF,
+ 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F,
+ 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18,
+ 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E,
+ 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0,
+ 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3,
+ 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36,
+ 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42,
+ 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE,
+ 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E,
+ 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66,
+ 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 };
+
+const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = {
+ { 0, 0, 0, 5, 0, 1 }, // 0x20 ' '
+ { 0, 2, 13, 6, 2, -12 }, // 0x21 '!'
+ { 4, 5, 4, 6, 1, -12 }, // 0x22 '"'
+ { 7, 10, 12, 10, 0, -11 }, // 0x23 '#'
+ { 22, 9, 16, 10, 1, -13 }, // 0x24 '$'
+ { 40, 16, 13, 16, 1, -12 }, // 0x25 '%'
+ { 66, 11, 13, 12, 1, -12 }, // 0x26 '&'
+ { 84, 2, 4, 4, 1, -12 }, // 0x27 '''
+ { 85, 4, 17, 6, 1, -12 }, // 0x28 '('
+ { 94, 4, 17, 6, 1, -12 }, // 0x29 ')'
+ { 103, 5, 5, 7, 1, -12 }, // 0x2A '*'
+ { 107, 6, 8, 11, 3, -7 }, // 0x2B '+'
+ { 113, 2, 4, 5, 2, 0 }, // 0x2C ','
+ { 114, 4, 1, 6, 1, -4 }, // 0x2D '-'
+ { 115, 2, 1, 5, 1, 0 }, // 0x2E '.'
+ { 116, 5, 13, 5, 0, -12 }, // 0x2F '/'
+ { 125, 8, 13, 10, 1, -12 }, // 0x30 '0'
+ { 138, 4, 13, 10, 3, -12 }, // 0x31 '1'
+ { 145, 9, 13, 10, 1, -12 }, // 0x32 '2'
+ { 160, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 173, 7, 13, 10, 2, -12 }, // 0x34 '4'
+ { 185, 9, 13, 10, 1, -12 }, // 0x35 '5'
+ { 200, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 215, 8, 13, 10, 0, -12 }, // 0x37 '7'
+ { 228, 9, 13, 10, 1, -12 }, // 0x38 '8'
+ { 243, 8, 13, 10, 1, -12 }, // 0x39 '9'
+ { 256, 2, 10, 5, 1, -9 }, // 0x3A ':'
+ { 259, 3, 12, 5, 1, -8 }, // 0x3B ';'
+ { 264, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 275, 9, 4, 11, 1, -5 }, // 0x3D '='
+ { 280, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 291, 9, 13, 10, 1, -12 }, // 0x3F '?'
+ { 306, 17, 16, 18, 1, -12 }, // 0x40 '@'
+ { 340, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 360, 11, 13, 12, 1, -12 }, // 0x42 'B'
+ { 378, 11, 13, 13, 1, -12 }, // 0x43 'C'
+ { 396, 11, 13, 13, 1, -12 }, // 0x44 'D'
+ { 414, 9, 13, 11, 1, -12 }, // 0x45 'E'
+ { 429, 8, 13, 11, 1, -12 }, // 0x46 'F'
+ { 442, 12, 13, 14, 1, -12 }, // 0x47 'G'
+ { 462, 11, 13, 13, 1, -12 }, // 0x48 'H'
+ { 480, 2, 13, 5, 2, -12 }, // 0x49 'I'
+ { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J'
+ { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 589, 10, 13, 12, 1, -12 }, // 0x50 'P'
+ { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q'
+ { 629, 12, 13, 13, 1, -12 }, // 0x52 'R'
+ { 649, 10, 13, 12, 1, -12 }, // 0x53 'S'
+ { 666, 9, 13, 11, 1, -12 }, // 0x54 'T'
+ { 681, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 699, 11, 13, 12, 0, -12 }, // 0x56 'V'
+ { 717, 17, 13, 17, 0, -12 }, // 0x57 'W'
+ { 745, 12, 13, 12, 0, -12 }, // 0x58 'X'
+ { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y'
+ { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 802, 3, 17, 5, 1, -12 }, // 0x5B '['
+ { 809, 5, 13, 5, 0, -12 }, // 0x5C '\'
+ { 818, 3, 17, 5, 0, -12 }, // 0x5D ']'
+ { 825, 7, 7, 8, 1, -12 }, // 0x5E '^'
+ { 832, 10, 1, 10, 0, 3 }, // 0x5F '_'
+ { 834, 4, 3, 5, 0, -12 }, // 0x60 '`'
+ { 836, 9, 10, 10, 1, -9 }, // 0x61 'a'
+ { 848, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 863, 8, 10, 9, 1, -9 }, // 0x63 'c'
+ { 873, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 886, 8, 10, 10, 1, -9 }, // 0x65 'e'
+ { 896, 4, 13, 5, 1, -12 }, // 0x66 'f'
+ { 903, 8, 14, 10, 1, -9 }, // 0x67 'g'
+ { 917, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 930, 2, 13, 4, 1, -12 }, // 0x69 'i'
+ { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j'
+ { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n'
+ { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o'
+ { 999, 9, 13, 10, 1, -9 }, // 0x70 'p'
+ { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q'
+ { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1034, 8, 10, 9, 1, -9 }, // 0x73 's'
+ { 1044, 4, 12, 5, 1, -11 }, // 0x74 't'
+ { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u'
+ { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w'
+ { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1124, 4, 17, 6, 1, -12 }, // 0x7B '{'
+ { 1133, 2, 17, 4, 2, -12 }, // 0x7C '|'
+ { 1138, 4, 17, 6, 1, -12 }, // 0x7D '}'
+ { 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~'
+
+const GFXfont FreeSans9pt7b PROGMEM = {
+ (uint8_t *)FreeSans9pt7bBitmaps,
+ (GFXglyph *)FreeSans9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1822 bytes
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t URW_Gothic_L_Book_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xB0, // '!'
+ 0xB6,0xD0, // '"'
+ 0x11,0x08,0x84,0x82,0x4F,0xF9,0x10,0x89,0xFF,0x24,0x22,0x11,0x08,0x80, // '#'
+ 0x21,0xCC,0xA1,0x83,0x07,0x06,0x04,0x18,0x72,0x70,0x80, // '$'
+ 0x78,0x8C,0xD8,0x85,0x08,0x70,0xCE,0x07,0xA0,0x06,0x00,0x5E,0x0F,0x30,0xA1,0x0B,0x31,0x1E, // '%'
+ 0x3C,0x08,0xC1,0x08,0x21,0x03,0xC4,0xF1,0x13,0x64,0x38,0x83,0x10,0x71,0x1B,0x1E,0x30, // '&'
+ 0xF0, // '''
+ 0x13,0x64,0x88,0x88,0x8C,0x46,0x30, // '('
+ 0x8C,0x62,0x11,0x11,0x13,0x26,0xC8, // ')'
+ 0x52,0xBE,0x45,0x00, // '*'
+ 0x10,0x20,0x40,0x8F,0xE2,0x04,0x08, // '+'
+ 0x29,0x00, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x08,0x46,0x21,0x18,0x84,0x62,0x11,0x88,0x40, // '/'
+ 0x38,0x8A,0x0C,0x18,0x30,0x60,0xC1,0x83,0x05,0x11,0xC0, // '0'
+ 0xE4,0x92,0x49,0x24,0x90, // '1'
+ 0x79,0x8A,0x0C,0x10,0x20,0x83,0x0C,0x30,0xC3,0x07,0xF0, // '2'
+ 0x3C,0x26,0x42,0x02,0x06,0x1C,0x02,0x01,0xC1,0x41,0x62,0x3C, // '3'
+ 0x06,0x06,0x0A,0x0A,0x12,0x32,0x22,0x42,0xC2,0xFF,0x02,0x02, // '4'
+ 0x3E,0x20,0x60,0x40,0x7C,0x62,0x01,0x01,0x81,0xC1,0x62,0x3C, // '5'
+ 0x08,0x18,0x10,0x20,0x7C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C, // '6'
+ 0xFE,0x0C,0x10,0x20,0x81,0x04,0x08,0x30,0x41,0x82,0x00, // '7'
+ 0x38,0x89,0x12,0x26,0x47,0x11,0x41,0x83,0x05,0x11,0xC0, // '8'
+ 0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3E,0x04,0x08,0x18,0x10, // '9'
+ 0xC3, // ':'
+ 0x50,0x07,0x80, // ';'
+ 0x01,0x06,0x38,0xE0,0xC0,0x70,0x0C,0x03, // '<'
+ 0xFF,0x00,0x00,0xFF, // '='
+ 0x80,0xE0,0x38,0x06,0x03,0x1C,0x70,0xC0, // '>'
+ 0x38,0x8A,0x0C,0x10,0x20,0x82,0x08,0x10,0x00,0x40,0x80, // '?'
+ 0x0F,0x83,0x04,0x67,0xA4,0xC9,0x88,0x99,0x09,0x91,0x19,0x12,0x53,0x64,0xDC,0x30,0x60,0xF8, // '@'
+ 0x06,0x00,0x60,0x0B,0x00,0x90,0x19,0x01,0x08,0x30,0x83,0xFC,0x20,0x46,0x06,0x40,0x2C,0x02, // 'A'
+ 0xFC,0x86,0x82,0x82,0x86,0xFC,0x82,0x81,0x81,0x81,0x82,0xFC, // 'B'
+ 0x0F,0x86,0x19,0x00,0xA0,0x08,0x01,0x00,0x20,0x04,0x00,0x40,0x08,0x04,0xC3,0x07,0xC0, // 'C'
+ 0xFC,0x20,0xC8,0x0A,0x03,0x80,0x60,0x18,0x06,0x01,0x80,0xE0,0x28,0x33,0xF0, // 'D'
+ 0xFE,0x08,0x20,0x82,0x0F,0xE0,0x82,0x08,0x3F, // 'E'
+ 0xFE,0x08,0x20,0x82,0x0F,0xE0,0x82,0x08,0x20, // 'F'
+ 0x0F,0x83,0x0C,0x40,0x24,0x00,0x80,0x08,0x00,0x80,0x08,0xFF,0x40,0x14,0x02,0x30,0x60,0xF8, // 'G'
+ 0x80,0xC0,0x60,0x30,0x18,0x0F,0xFE,0x03,0x01,0x80,0xC0,0x60,0x30,0x10, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x04,0x10,0x41,0x04,0x10,0x41,0x06,0x1C,0xDE, // 'J'
+ 0x83,0x86,0x8C,0x88,0x90,0xB0,0xF0,0xD8,0x88,0x84,0x86,0x83, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0xC0,0x3C,0x03,0xE0,0x7A,0x05,0xB0,0xD9,0x09,0x90,0x98,0x91,0x89,0x18,0xF1,0x86,0x18,0x61, // 'M'
+ 0xC0,0x78,0x1A,0x06,0x41,0x98,0x63,0x18,0x46,0x09,0x83,0x60,0x78,0x0E,0x01, // 'N'
+ 0x0F,0x03,0x0C,0x40,0x24,0x02,0x80,0x18,0x01,0x80,0x18,0x01,0x40,0x24,0x02,0x30,0xC0,0xF0, // 'O'
+ 0xFC,0x82,0x81,0x81,0x81,0x82,0xFC,0x80,0x80,0x80,0x80,0x80, // 'P'
+ 0x0F,0x83,0x0C,0x40,0x24,0x03,0x80,0x18,0x01,0x80,0x1F,0xC1,0x43,0x36,0x0A,0x30,0xC0,0xFB, // 'Q'
+ 0xFC,0x82,0x81,0x81,0x81,0x83,0x9E,0x98,0x88,0x84,0x86,0x82, // 'R'
+ 0x7B,0x38,0x60,0xC1,0xC1,0x81,0x06,0x1C,0xDE, // 'S'
+ 0xFE,0x20,0x40,0x81,0x02,0x04,0x08,0x10,0x20,0x40,0x80, // 'T'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // 'U'
+ 0xC0,0x28,0x09,0x01,0x10,0x62,0x08,0x61,0x04,0x40,0x88,0x0B,0x01,0x40,0x38,0x02,0x00, // 'V'
+ 0xC1,0x02,0x83,0x05,0x0E,0x12,0x14,0x26,0x28,0x44,0x49,0x89,0x92,0x12,0x24,0x14,0x68,0x28,0x70,0x60,0xC0,0xC1,0x80, // 'W'
+ 0x40,0x98,0x42,0x30,0x48,0x1C,0x03,0x00,0xC0,0x58,0x32,0x08,0x44,0x1B,0x02, // 'X'
+ 0x80,0xA0,0x90,0x44,0x42,0x20,0xA0,0x50,0x10,0x08,0x04,0x02,0x01,0x00, // 'Y'
+ 0xFE,0x02,0x06,0x04,0x08,0x18,0x10,0x30,0x20,0x40,0x40,0xFF, // 'Z'
+ 0x2E,0x49,0x24,0x92,0x66,0x40, // '['
+ 0x41,0x06,0x08,0x20,0x41,0x06,0x08,0x20,0x41, // '\'
+ 0x99,0x92,0x49,0x24,0x9D,0x00, // ']'
+ 0x0C,0x06,0x05,0x82,0x42,0x21,0x09,0x84,0x81,0xC0,0x80, // '^'
+ 0xFF, // '_'
+ 0xC3, // '`'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0x80, // 'a'
+ 0x80,0x40,0x20,0x17,0xCE,0x36,0x0E,0x03,0x01,0x80,0xE0,0xF8,0xD7,0xC0, // 'b'
+ 0x3E,0x31,0xB0,0x70,0x08,0x04,0x03,0x06,0xC6,0x3E,0x00, // 'c'
+ 0x00,0x80,0x40,0x27,0xD6,0x3E,0x0E,0x03,0x01,0x80,0xE0,0xD8,0xE3,0xD0, // 'd'
+ 0x3C,0x21,0xA0,0x50,0x3F,0xFC,0x02,0x04,0x86,0x3C,0x00, // 'e'
+ 0x34,0x4F,0x44,0x44,0x44,0x44, // 'f'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0xE0,0x58,0x47,0xC0, // 'g'
+ 0x80,0x80,0x80,0xBC,0xC2,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'h'
+ 0xDF,0xF0, // 'i'
+ 0x24,0x12,0x49,0x24,0x92,0xF0, // 'j'
+ 0x81,0x02,0x04,0x28,0xD3,0x24,0x50,0xF1,0xB2,0x34,0x20, // 'k'
+ 0xFF,0xF0, // 'l'
+ 0xB8,0xE6,0x28,0xA0,0x83,0x04,0x18,0x20,0xC1,0x06,0x08,0x30,0x41,0x82,0x08, // 'm'
+ 0xBC,0xC2,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'n'
+ 0x3E,0x31,0xB0,0x70,0x18,0x0C,0x07,0x06,0xC6,0x3E,0x00, // 'o'
+ 0xBE,0x71,0xB0,0x70,0x18,0x0C,0x07,0x07,0xC6,0xBE,0x40,0x20,0x10,0x00, // 'p'
+ 0x3E,0xB1,0xF0,0x70,0x18,0x0C,0x07,0x06,0xC7,0x3E,0x80,0x40,0x20,0x10, // 'q'
+ 0xBA,0x49,0x24,0x80, // 'r'
+ 0x74,0x61,0x87,0x06,0x31,0x70, // 's'
+ 0x21,0x09,0xF2,0x10,0x84,0x21,0x08,0x40, // 't'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x43,0x3D, // 'u'
+ 0xC1,0xA0,0x90,0xC4,0x42,0x21,0xA0,0x50,0x38,0x08,0x00, // 'v'
+ 0x80,0x0A,0x10,0xD0,0xC4,0xCA,0x22,0x52,0x12,0xD0,0x72,0x83,0x18,0x18,0xC0, // 'w'
+ 0xC2,0x46,0x2C,0x18,0x18,0x38,0x24,0x46,0xC2, // 'x'
+ 0xC1,0x41,0x42,0x22,0x26,0x34,0x1C,0x18,0x18,0x10,0x10,0x30, // 'y'
+ 0xFC,0x08,0x20,0xC1,0x04,0x18,0x20,0xFE, // 'z'
+ 0x69,0x24,0xB6,0x49,0x24,0x40, // '{'
+ 0xFF,0xF0, // '|'
+ 0xC9,0x24,0x8B,0x49,0x25,0x00 // '}'
+};
+const GFXglyph URW_Gothic_L_Book_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 12, 6, 2, -12 }, // '!'
+ { 3, 3, 4, 6, 1, -12 }, // '"'
+ { 5, 9, 12, 10, 0, -12 }, // '#'
+ { 19, 6, 14, 10, 2, -13 }, // '$'
+ { 30, 12, 12, 13, 0, -12 }, // '%'
+ { 48, 11, 12, 13, 1, -12 }, // '&'
+ { 65, 1, 4, 4, 1, -12 }, // '''
+ { 66, 4, 14, 7, 1, -12 }, // '('
+ { 73, 4, 14, 7, 1, -12 }, // ')'
+ { 80, 5, 5, 8, 1, -12 }, // '*'
+ { 84, 7, 8, 11, 1, -9 }, // '+'
+ { 91, 3, 3, 5, 1, -2 }, // ','
+ { 93, 4, 1, 6, 1, -5 }, // '-'
+ { 94, 1, 2, 5, 2, -2 }, // '.'
+ { 95, 5, 14, 8, 1, -12 }, // '/'
+ { 104, 7, 12, 10, 1, -12 }, // '0'
+ { 115, 3, 12, 10, 3, -12 }, // '1'
+ { 120, 7, 12, 10, 1, -12 }, // '2'
+ { 131, 8, 12, 10, 0, -12 }, // '3'
+ { 143, 8, 12, 10, 0, -12 }, // '4'
+ { 155, 8, 12, 10, 0, -12 }, // '5'
+ { 167, 8, 12, 10, 0, -12 }, // '6'
+ { 179, 7, 12, 10, 1, -12 }, // '7'
+ { 190, 7, 12, 10, 1, -12 }, // '8'
+ { 201, 8, 12, 10, 0, -12 }, // '9'
+ { 213, 1, 8, 5, 2, -8 }, // ':'
+ { 214, 2, 9, 5, 1, -8 }, // ';'
+ { 217, 8, 8, 11, 1, -9 }, // '<'
+ { 225, 8, 4, 11, 1, -7 }, // '='
+ { 229, 8, 8, 11, 1, -9 }, // '>'
+ { 237, 7, 12, 10, 1, -12 }, // '?'
+ { 248, 12, 12, 15, 1, -12 }, // '@'
+ { 266, 12, 12, 13, 0, -12 }, // 'A'
+ { 284, 8, 12, 10, 1, -12 }, // 'B'
+ { 296, 11, 12, 14, 1, -12 }, // 'C'
+ { 313, 10, 12, 13, 1, -12 }, // 'D'
+ { 328, 6, 12, 10, 1, -12 }, // 'E'
+ { 337, 6, 12, 9, 1, -12 }, // 'F'
+ { 346, 12, 12, 15, 1, -12 }, // 'G'
+ { 364, 9, 12, 12, 1, -12 }, // 'H'
+ { 378, 1, 12, 5, 1, -12 }, // 'I'
+ { 380, 6, 12, 9, 0, -12 }, // 'J'
+ { 389, 8, 12, 10, 1, -12 }, // 'K'
+ { 401, 6, 12, 8, 1, -12 }, // 'L'
+ { 410, 12, 12, 16, 1, -12 }, // 'M'
+ { 428, 10, 12, 13, 1, -12 }, // 'N'
+ { 443, 12, 12, 15, 1, -12 }, // 'O'
+ { 461, 8, 12, 10, 1, -12 }, // 'P'
+ { 473, 12, 12, 15, 1, -12 }, // 'Q'
+ { 491, 8, 12, 11, 1, -12 }, // 'R'
+ { 503, 6, 12, 9, 1, -12 }, // 'S'
+ { 512, 7, 12, 8, 0, -12 }, // 'T'
+ { 523, 8, 12, 11, 1, -12 }, // 'U'
+ { 535, 11, 12, 12, 0, -12 }, // 'V'
+ { 552, 15, 12, 16, 0, -12 }, // 'W'
+ { 575, 10, 12, 11, 0, -12 }, // 'X'
+ { 590, 9, 12, 10, 0, -12 }, // 'Y'
+ { 604, 8, 12, 9, 0, -12 }, // 'Z'
+ { 616, 3, 14, 7, 2, -12 }, // '['
+ { 622, 6, 12, 11, 1, -12 }, // '\'
+ { 631, 3, 14, 7, 1, -12 }, // ']'
+ { 637, 9, 9, 11, 0, -12 }, // '^'
+ { 648, 8, 1, 9, 0, 1 }, // '_'
+ { 649, 4, 2, 7, 1, -12 }, // '`'
+ { 650, 9, 9, 12, 1, -9 }, // 'a'
+ { 661, 9, 12, 12, 1, -12 }, // 'b'
+ { 675, 9, 9, 11, 1, -9 }, // 'c'
+ { 686, 9, 12, 12, 1, -12 }, // 'd'
+ { 700, 9, 9, 11, 1, -9 }, // 'e'
+ { 711, 4, 12, 6, 1, -12 }, // 'f'
+ { 717, 9, 12, 12, 1, -9 }, // 'g'
+ { 731, 8, 12, 11, 1, -12 }, // 'h'
+ { 743, 1, 12, 4, 1, -12 }, // 'i'
+ { 745, 3, 15, 4, -1, -12 }, // 'j'
+ { 751, 7, 12, 9, 1, -12 }, // 'k'
+ { 762, 1, 12, 4, 1, -12 }, // 'l'
+ { 764, 13, 9, 16, 1, -9 }, // 'm'
+ { 779, 8, 9, 11, 1, -9 }, // 'n'
+ { 788, 9, 9, 11, 1, -9 }, // 'o'
+ { 799, 9, 12, 12, 1, -9 }, // 'p'
+ { 813, 9, 12, 12, 1, -9 }, // 'q'
+ { 827, 3, 9, 6, 1, -9 }, // 'r'
+ { 831, 5, 9, 7, 1, -9 }, // 's'
+ { 837, 5, 12, 6, 0, -12 }, // 't'
+ { 845, 8, 9, 11, 1, -9 }, // 'u'
+ { 854, 9, 9, 10, 0, -9 }, // 'v'
+ { 865, 13, 9, 14, 0, -9 }, // 'w'
+ { 880, 8, 9, 9, 0, -9 }, // 'x'
+ { 889, 8, 12, 10, 0, -9 }, // 'y'
+ { 901, 7, 9, 8, 0, -9 }, // 'z'
+ { 909, 3, 14, 7, 1, -12 }, // '{'
+ { 915, 1, 12, 12, 5, -12 }, // '|'
+ { 917, 3, 14, 7, 1, -12 } // '}'
+};
+const GFXfont URW_Gothic_L_Book_16 PROGMEM = {
+(uint8_t *)URW_Gothic_L_Book_16Bitmaps,(GFXglyph *)URW_Gothic_L_Book_16Glyphs,0x20, 0x7E, 20};
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Open_Sans_Condensed_Light_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xAA,0xAA,0x0A, // '!'
+ 0xB6,0xD0, // '"'
+ 0x24,0x48,0x91,0x27,0xE5,0x0A,0x7E,0x48,0x91,0x22,0x40, // '#'
+ 0x22,0x7A,0xAA,0xC3,0x33,0x3E,0x22, // '$'
+ 0xC5,0x52,0xA5,0x4B,0x16,0xF6,0x8D,0x2A,0x54,0xAA,0x30, // '%'
+ 0x62,0x49,0x24,0x61,0x0A,0x29,0x9A,0x29,0xB9, // '&'
+ 0xF0, // '''
+ 0x5A,0xAA,0xAA,0x94, // '('
+ 0xA5,0x55,0x55,0x68, // ')'
+ 0x22,0xF6,0x90, // '*'
+ 0x10,0x41,0x3F,0x10,0x41,0x00, // '+'
+ 0xF0, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x04,0x20,0x84,0x10,0x42,0x08,0x21,0x04,0x20, // '/'
+ 0x69,0x99,0x99,0x99,0x99,0x96, // '0'
+ 0x2E,0x92,0x49,0x24,0x90, // '1'
+ 0xE1,0x11,0x11,0x22,0x48,0x8F, // '2'
+ 0xE1,0x11,0x16,0x11,0x11,0x1E, // '3'
+ 0x08,0x61,0x8A,0x29,0x24,0x92,0x8B,0xF0,0x82, // '4'
+ 0xF8,0x88,0x8E,0x11,0x11,0x1E, // '5'
+ 0x74,0x88,0x8E,0x99,0x99,0x96, // '6'
+ 0xF8,0x42,0x10,0x88,0x42,0x21,0x08,0x80, // '7'
+ 0x64,0xA5,0x29,0x32,0x92,0x8C,0x64,0xC0, // '8'
+ 0x69,0x99,0x99,0xF1,0x11,0x2C, // '9'
+ 0xC1,0x80, // ':'
+ 0xC1,0xE0, // ';'
+ 0x04,0x66,0x20,0x60,0x60,0x40, // '<'
+ 0xFC,0x00,0x3F, // '='
+ 0x81,0x81,0x81,0x19,0x88,0x00, // '>'
+ 0x70,0x82,0x11,0x08,0x84,0x40,0x18,0xC0, // '?'
+ 0x3C,0x62,0x41,0x9D,0xA5,0xA5,0xA5,0xA5,0xAD,0x9E,0x80,0x40,0x38, // '@'
+ 0x20,0xC3,0x0C,0x51,0x24,0x9E,0x4A,0x18,0x61, // 'A'
+ 0xF4,0x63,0x18,0xFA,0x31,0x8C,0x63,0xE0, // 'B'
+ 0x39,0x08,0x20,0x82,0x08,0x20,0x82,0x04,0x0E, // 'C'
+ 0xF2,0x28,0x61,0x86,0x18,0x61,0x86,0x18,0xBC, // 'D'
+ 0xF8,0x88,0x8F,0x88,0x88,0x8F, // 'E'
+ 0xFC,0x21,0x08,0x43,0xF0,0x84,0x21,0x00, // 'F'
+ 0x39,0x18,0x20,0x82,0x08,0xE1,0x86,0x14,0x4F, // 'G'
+ 0x86,0x18,0x61,0x87,0xF8,0x61,0x86,0x18,0x61, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x24,0x92,0x49,0x24,0x92,0x70, // 'J'
+ 0x8C,0xA5,0x4A,0x62,0x94,0x94,0xA5,0x10, // 'K'
+ 0x84,0x21,0x08,0x42,0x10,0x84,0x21,0xF0, // 'L'
+ 0xC1,0xE0,0xF0,0x74,0x5A,0x2D,0x16,0x8B,0x29,0x94,0xCA,0x66,0x31,0x10, // 'M'
+ 0xC3,0x86,0x8D,0x1A,0x32,0x64,0xC5,0x8B,0x0E,0x1C,0x30, // 'N'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x86,0x14,0x9E, // 'O'
+ 0xF4,0x63,0x18,0xC7,0xD0,0x84,0x21,0x00, // 'P'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x86,0x14,0x9E,0x08,0x20,0x80, // 'Q'
+ 0xF2,0x28,0xA2,0x8A,0x2F,0x24,0x92,0x28,0xA1, // 'R'
+ 0x78,0x88,0x84,0x31,0x11,0x1E, // 'S'
+ 0xFC,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08, // 'T'
+ 0x86,0x18,0x61,0x86,0x18,0x61,0x86,0x14,0x9E, // 'U'
+ 0x86,0x18,0x52,0x49,0x24,0x94,0x30,0xC3,0x0C, // 'V'
+ 0x84,0x30,0x86,0x28,0xA5,0x24,0xA4,0x94,0x92,0x92,0x8C,0x31,0x86,0x30,0xC6,0x18,0xC0, // 'W'
+ 0x45,0x24,0x8A,0x30,0x43,0x0C,0x49,0x24,0xA1, // 'X'
+ 0x8C,0x54,0xA5,0x28,0x84,0x21,0x08,0x40, // 'Y'
+ 0xF8,0x84,0x21,0x10,0x84,0x42,0x11,0xF0, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x38, // '['
+ 0x81,0x04,0x08,0x20,0x81,0x04,0x10,0x20,0x81, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x78, // ']'
+ 0x20,0xC4,0x92,0x84, // '^'
+ 0xFE, // '_'
+ 0x48,0x80, // '`'
+ 0x61,0x11,0x79,0x99,0xF0, // 'a'
+ 0x84,0x21,0x0F,0x66,0x31,0x8C,0x63,0x9B,0x00, // 'b'
+ 0x78,0x88,0x88,0x88,0x70, // 'c'
+ 0x08,0x42,0x16,0xCE,0x31,0x8C,0x63,0x36,0x80, // 'd'
+ 0x69,0x99,0xF8,0x88,0x70, // 'e'
+ 0x34,0x44,0xF4,0x44,0x44,0x44,0x40, // 'f'
+ 0x3D,0x24,0x92,0x48,0xC4,0x10,0x39,0x18,0x61,0x78, // 'g'
+ 0x84,0x21,0x0B,0x66,0x31,0x8C,0x63,0x18,0x80, // 'h'
+ 0xDF,0xF0, // 'i'
+ 0x51,0x55,0x55,0x56, // 'j'
+ 0x84,0x21,0x09,0x4A,0x94,0xE4,0xA5,0x28,0x80, // 'k'
+ 0xFF,0xF8, // 'l'
+ 0xF6,0x99,0x89,0x89,0x89,0x89,0x89,0x89,0x89, // 'm'
+ 0xB6,0x63,0x18,0xC6,0x31,0x88, // 'n'
+ 0x74,0x63,0x18,0xC6,0x31,0x70, // 'o'
+ 0xB6,0x63,0x18,0xC6,0x39,0xB4,0x21,0x08,0x00, // 'p'
+ 0x7C,0xE3,0x18,0xC6,0x33,0x68,0x42,0x10,0x80, // 'q'
+ 0xF2,0x49,0x24,0x80, // 'r'
+ 0xF2,0x44,0x49,0xE0, // 's'
+ 0x44,0xF4,0x44,0x44,0x44,0x30, // 't'
+ 0x8C,0x63,0x18,0xC6,0x33,0x68, // 'u'
+ 0x8C,0x62,0xA5,0x29,0x44,0x20, // 'v'
+ 0x88,0xC4,0x55,0x4A,0xA5,0x52,0xA9,0x54,0x44,0x22,0x00, // 'w'
+ 0x8A,0x94,0x42,0x11,0x4A,0x88, // 'x'
+ 0x8C,0x54,0xA5,0x29,0x44,0x21,0x08,0x8C,0x00, // 'y'
+ 0x72,0x22,0x44,0x44,0xF0, // 'z'
+ 0x32,0x44,0x44,0x48,0x44,0x44,0x42,0x10, // '{'
+ 0x55,0x55,0x55,0x55,0x40, // '|'
+ 0x84,0x22,0x22,0x21,0x22,0x22,0x24,0x80 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 4, 0, 0 }, // ' '
+ { 1, 2, 12, 5, 1, -12 }, // '!'
+ { 4, 3, 4, 6, 1, -12 }, // '"'
+ { 6, 7, 12, 8, 0, -12 }, // '#'
+ { 17, 4, 14, 7, 1, -13 }, // '$'
+ { 24, 7, 12, 10, 1, -12 }, // '%'
+ { 35, 6, 12, 8, 1, -12 }, // '&'
+ { 44, 1, 4, 4, 1, -12 }, // '''
+ { 45, 2, 15, 5, 1, -12 }, // '('
+ { 49, 2, 15, 5, 1, -12 }, // ')'
+ { 53, 4, 5, 7, 1, -13 }, // '*'
+ { 56, 6, 7, 7, 0, -10 }, // '+'
+ { 62, 1, 4, 4, 1, -2 }, // ','
+ { 63, 4, 1, 5, 0, -5 }, // '-'
+ { 64, 1, 2, 4, 1, -2 }, // '.'
+ { 65, 6, 12, 7, 0, -12 }, // '/'
+ { 74, 4, 12, 7, 1, -12 }, // '0'
+ { 80, 3, 12, 7, 1, -12 }, // '1'
+ { 85, 4, 12, 7, 1, -12 }, // '2'
+ { 91, 4, 12, 7, 1, -12 }, // '3'
+ { 97, 6, 12, 7, 0, -12 }, // '4'
+ { 106, 4, 12, 7, 1, -12 }, // '5'
+ { 112, 4, 12, 7, 1, -12 }, // '6'
+ { 118, 5, 12, 7, 0, -12 }, // '7'
+ { 126, 5, 12, 7, 1, -12 }, // '8'
+ { 134, 4, 12, 7, 1, -12 }, // '9'
+ { 140, 1, 9, 4, 1, -9 }, // ':'
+ { 142, 1, 11, 4, 1, -9 }, // ';'
+ { 144, 6, 7, 7, 0, -10 }, // '<'
+ { 150, 6, 4, 7, 0, -8 }, // '='
+ { 153, 6, 7, 7, 0, -10 }, // '>'
+ { 159, 5, 12, 6, 0, -12 }, // '?'
+ { 167, 8, 13, 11, 1, -12 }, // '@'
+ { 180, 6, 12, 7, 0, -12 }, // 'A'
+ { 189, 5, 12, 8, 1, -12 }, // 'B'
+ { 197, 6, 12, 8, 1, -12 }, // 'C'
+ { 206, 6, 12, 9, 1, -12 }, // 'D'
+ { 215, 4, 12, 7, 1, -12 }, // 'E'
+ { 221, 5, 12, 7, 1, -12 }, // 'F'
+ { 229, 6, 12, 9, 1, -12 }, // 'G'
+ { 238, 6, 12, 9, 1, -12 }, // 'H'
+ { 247, 1, 12, 4, 1, -12 }, // 'I'
+ { 249, 3, 15, 4, -1, -12 }, // 'J'
+ { 255, 5, 12, 7, 1, -12 }, // 'K'
+ { 263, 5, 12, 7, 1, -12 }, // 'L'
+ { 271, 9, 12, 12, 1, -12 }, // 'M'
+ { 285, 7, 12, 10, 1, -12 }, // 'N'
+ { 296, 6, 12, 9, 1, -12 }, // 'O'
+ { 305, 5, 12, 8, 1, -12 }, // 'P'
+ { 313, 6, 15, 9, 1, -12 }, // 'Q'
+ { 325, 6, 12, 8, 1, -12 }, // 'R'
+ { 334, 4, 12, 7, 1, -12 }, // 'S'
+ { 340, 6, 12, 7, 0, -12 }, // 'T'
+ { 349, 6, 12, 9, 1, -12 }, // 'U'
+ { 358, 6, 12, 7, 0, -12 }, // 'V'
+ { 367, 11, 12, 12, 0, -12 }, // 'W'
+ { 384, 6, 12, 7, 0, -12 }, // 'X'
+ { 393, 5, 12, 6, 0, -12 }, // 'Y'
+ { 401, 5, 12, 6, 0, -12 }, // 'Z'
+ { 409, 3, 15, 6, 1, -12 }, // '['
+ { 415, 6, 12, 7, 0, -12 }, // '\'
+ { 424, 3, 15, 6, 1, -12 }, // ']'
+ { 430, 6, 5, 7, 0, -12 }, // '^'
+ { 434, 7, 1, 8, 0, 1 }, // '_'
+ { 435, 3, 3, 10, 3, -13 }, // '`'
+ { 437, 4, 9, 7, 1, -9 }, // 'a'
+ { 442, 5, 13, 8, 1, -13 }, // 'b'
+ { 451, 4, 9, 6, 1, -9 }, // 'c'
+ { 456, 5, 13, 8, 1, -13 }, // 'd'
+ { 465, 4, 9, 7, 1, -9 }, // 'e'
+ { 470, 4, 13, 5, 0, -13 }, // 'f'
+ { 477, 6, 13, 7, 0, -9 }, // 'g'
+ { 487, 5, 13, 8, 1, -13 }, // 'h'
+ { 496, 1, 12, 4, 1, -12 }, // 'i'
+ { 498, 2, 16, 4, 0, -12 }, // 'j'
+ { 502, 5, 13, 7, 1, -13 }, // 'k'
+ { 511, 1, 13, 4, 1, -13 }, // 'l'
+ { 513, 8, 9, 11, 1, -9 }, // 'm'
+ { 522, 5, 9, 8, 1, -9 }, // 'n'
+ { 528, 5, 9, 8, 1, -9 }, // 'o'
+ { 534, 5, 13, 8, 1, -9 }, // 'p'
+ { 543, 5, 13, 8, 1, -9 }, // 'q'
+ { 552, 3, 9, 5, 1, -9 }, // 'r'
+ { 556, 3, 9, 6, 1, -9 }, // 's'
+ { 560, 4, 11, 5, 0, -11 }, // 't'
+ { 566, 5, 9, 8, 1, -9 }, // 'u'
+ { 572, 5, 9, 6, 0, -9 }, // 'v'
+ { 578, 9, 9, 10, 0, -9 }, // 'w'
+ { 589, 5, 9, 6, 0, -9 }, // 'x'
+ { 595, 5, 13, 6, 0, -9 }, // 'y'
+ { 604, 4, 9, 5, 0, -9 }, // 'z'
+ { 609, 4, 15, 7, 1, -12 }, // '{'
+ { 617, 2, 17, 7, 2, -13 }, // '|'
+ { 622, 4, 15, 7, 1, -12 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_16 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_16Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_16Glyphs,0x20, 0x7E, 23};
+
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Open_Sans_Condensed_Light_19Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xF5,0x55,0x50,0xF0, // '!'
+ 0x99,0x99,0x90, // '"'
+ 0x12,0x12,0x14,0x24,0x7F,0x24,0x24,0x24,0x24,0xFE,0x24,0x28,0x48,0x48, // '#'
+ 0x20,0x87,0xF9,0xA2,0x8A,0x18,0x18,0x92,0x49,0x2F,0xE2,0x08, // '$'
+ 0x62,0x51,0x25,0x12,0x89,0x44,0xDA,0x6B,0x59,0x6C,0x8A,0x45,0x22,0x92,0x29,0x18, // '%'
+ 0x70,0xA1,0x42,0x85,0x0A,0x08,0x30,0x95,0x2A,0x34,0x28,0xCE,0x40, // '&'
+ 0xAA,0x80, // '''
+ 0x25,0x29,0x24,0x92,0x48,0x92,0x20, // '('
+ 0x89,0x22,0x49,0x24,0x92,0x92,0x80, // ')'
+ 0x21,0x3E,0xA5,0x00, // '*'
+ 0x20,0x82,0x08,0xFC,0x82,0x08,0x00, // '+'
+ 0x6A, // ','
+ 0xE0, // '-'
+ 0xF0, // '.'
+ 0x08,0x20,0x84,0x10,0x42,0x08,0x21,0x04,0x20,0x82,0x00, // '/'
+ 0x31,0x28,0x61,0x86,0x18,0x61,0x86,0x18,0x61,0x49,0xC0, // '0'
+ 0x13,0xD1,0x11,0x11,0x11,0x11,0x11, // '1'
+ 0x7A,0x20,0x41,0x04,0x10,0x82,0x10,0x82,0x10,0x83,0xF0, // '2'
+ 0x7A,0x20,0x41,0x04,0x27,0x02,0x04,0x10,0x41,0x0B,0xC0, // '3'
+ 0x04,0x0C,0x0C,0x14,0x14,0x24,0x24,0x44,0x44,0x44,0xFF,0x04,0x04,0x04, // '4'
+ 0xFA,0x08,0x20,0x82,0x0F,0x83,0x04,0x10,0x41,0x0B,0xC0, // '5'
+ 0x39,0x84,0x20,0x82,0xEC,0xE1,0x86,0x18,0x61,0x48,0xE0, // '6'
+ 0xFC,0x10,0x42,0x08,0x21,0x04,0x10,0x82,0x08,0x41,0x00, // '7'
+ 0x7B,0x38,0x61,0x85,0x23,0x16,0x86,0x18,0x61,0xC5,0xE0, // '8'
+ 0x73,0x28,0x61,0x86,0x18,0x73,0x74,0x10,0x82,0x1B,0xC0, // '9'
+ 0xF0,0x00,0xF0, // ':'
+ 0xF0,0x00,0x6A, // ';'
+ 0x04,0x23,0x30,0xC0,0xC0,0x81, // '<'
+ 0xFC,0x00,0x00,0xFC, // '='
+ 0x81,0x03,0x03,0x0C,0xC4,0x20, // '>'
+ 0x70,0x82,0x11,0x08,0x84,0x22,0x00,0x06,0x30, // '?'
+ 0x1E,0x11,0x90,0x48,0x18,0xCC,0xA6,0x53,0x29,0x94,0xCA,0x65,0x33,0x68,0x02,0x01,0x80,0x78, // '@'
+ 0x18,0x18,0x18,0x18,0x24,0x24,0x24,0x24,0x7E,0x42,0x42,0x42,0x81,0x81, // 'A'
+ 0xFA,0x38,0x61,0x86,0x2F,0x23,0x86,0x18,0x61,0x87,0xE0, // 'B'
+ 0x1C,0xC1,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x02,0x06,0x03,0x80, // 'C'
+ 0xF9,0x1A,0x14,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x28,0xDF,0x00, // 'D'
+ 0xFC,0x21,0x08,0x43,0xF0,0x84,0x21,0x08,0x7C, // 'E'
+ 0xFC,0x21,0x08,0x42,0x1E,0x84,0x21,0x08,0x40, // 'F'
+ 0x1E,0x21,0x40,0xC0,0x80,0x80,0x80,0x87,0x81,0x81,0xC1,0x41,0x21,0x1F, // 'G'
+ 0x86,0x18,0x61,0x86,0x1F,0xE1,0x86,0x18,0x61,0x86,0x10, // 'H'
+ 0xAA,0xAA,0xAA,0xA0, // 'I'
+ 0x24,0x92,0x49,0x24,0x92,0x49,0xE0, // 'J'
+ 0x8A,0x29,0x24,0xA2,0x8C,0x28,0xA2,0x49,0x22,0x8A,0x10, // 'K'
+ 0x84,0x21,0x08,0x42,0x10,0x84,0x21,0x08,0x7C, // 'L'
+ 0xC0,0x78,0x0E,0x82,0xD0,0x5A,0x0B,0x42,0x64,0x4C,0x89,0x91,0x31,0x46,0x28,0xC5,0x18,0xA3,0x08,0x40, // 'M'
+ 0xC1,0xC1,0xA1,0xA1,0x91,0x91,0x91,0x89,0x89,0x85,0x85,0x85,0x83,0x83, // 'N'
+ 0x3C,0x66,0x42,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x66,0x3C, // 'O'
+ 0xF4,0xE3,0x18,0xC6,0x7E,0x84,0x21,0x08,0x40, // 'P'
+ 0x3C,0x66,0x42,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x66,0x3C,0x04,0x04,0x02, // 'Q'
+ 0xF9,0x1A,0x14,0x28,0x50,0xA3,0x78,0x91,0x12,0x24,0x28,0x50,0x80, // 'R'
+ 0x3F,0x18,0x20,0x83,0x06,0x06,0x04,0x10,0x41,0x0F,0xC0, // 'S'
+ 0xFE,0x20,0x40,0x81,0x02,0x04,0x08,0x10,0x20,0x40,0x81,0x02,0x00, // 'T'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0A,0x24,0x47,0x00, // 'U'
+ 0x83,0x06,0x12,0x24,0x48,0x91,0x14,0x28,0x50,0xA1,0x41,0x02,0x00, // 'V'
+ 0x82,0x0C,0x10,0x51,0x44,0x8A,0x24,0x51,0x22,0x89,0x14,0x45,0x14,0x28,0xA1,0x45,0x0A,0x28,0x51,0x41,0x0C,0x08,0x20, // 'W'
+ 0x42,0x88,0x91,0x22,0x83,0x04,0x0C,0x28,0x50,0x92,0x24,0x50,0x40, // 'X'
+ 0x86,0x14,0x92,0x48,0xC3,0x0C,0x10,0x41,0x04,0x10,0x40, // 'Y'
+ 0xF8,0x84,0x22,0x10,0x88,0x42,0x21,0x08,0x7C, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x24,0xE0, // '['
+ 0x82,0x08,0x10,0x41,0x02,0x08,0x10,0x41,0x02,0x08,0x20, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x49,0xE0, // ']'
+ 0x18,0x18,0x24,0x24,0x42,0x42,0x42, // '^'
+ 0xFF, // '_'
+ 0x88,0x80, // '`'
+ 0x70,0xC2,0x17,0xC6,0x31,0x9B,0x40, // 'a'
+ 0x82,0x08,0x20,0x82,0xEC,0xE1,0x86,0x18,0x61,0x87,0x3B,0x80, // 'b'
+ 0x7A,0x21,0x08,0x42,0x10,0x43,0xC0, // 'c'
+ 0x04,0x10,0x41,0x05,0xDC,0xE1,0x86,0x18,0x61,0x87,0x37,0x40, // 'd'
+ 0x74,0x63,0x1F,0xC2,0x10,0x43,0xC0, // 'e'
+ 0x39,0x10,0x84,0x79,0x08,0x42,0x10,0x84,0x21,0x00, // 'f'
+ 0x3E,0x89,0x12,0x24,0x48,0x8E,0x10,0x40,0x79,0x0C,0x18,0x28,0x9E,0x00, // 'g'
+ 0x82,0x08,0x20,0x82,0xEC,0xA1,0x86,0x18,0x61,0x86,0x18,0x40, // 'h'
+ 0xA0,0xAA,0xAA,0xA0, // 'i'
+ 0x48,0x04,0x92,0x49,0x24,0x92,0x4B,0x00, // 'j'
+ 0x82,0x08,0x20,0x82,0x28,0xA4,0xA2,0xCD,0x24,0x8A,0x28,0x40, // 'k'
+ 0xAA,0xAA,0xAA,0xA8, // 'l'
+ 0xBB,0xB3,0x28,0x46,0x11,0x84,0x61,0x18,0x46,0x11,0x84,0x61,0x10, // 'm'
+ 0xBB,0x28,0x61,0x86,0x18,0x61,0x86,0x10, // 'n'
+ 0x79,0x28,0x61,0x86,0x18,0x61,0x49,0xE0, // 'o'
+ 0xBB,0x38,0x61,0x86,0x18,0x61,0xCE,0xE8,0x20,0x82,0x08,0x00, // 'p'
+ 0x77,0x38,0x61,0x86,0x18,0x61,0xCD,0xD0,0x41,0x04,0x10,0x40, // 'q'
+ 0xBC,0xC8,0x88,0x88,0x88, // 'r'
+ 0x78,0x88,0x43,0x11,0x1E, // 's'
+ 0x44,0xF4,0x44,0x44,0x44,0x43, // 't'
+ 0x86,0x18,0x61,0x86,0x18,0x61,0x4D,0xD0, // 'u'
+ 0x86,0x14,0x92,0x49,0x23,0x0C,0x30,0xC0, // 'v'
+ 0x8C,0x63,0x14,0xC9,0x32,0x4C,0x94,0xA5,0x28,0xCC,0x33,0x08,0x40, // 'w'
+ 0x49,0x24,0x8C,0x30,0xC3,0x12,0x4A,0x10, // 'x'
+ 0x86,0x14,0x92,0x49,0x23,0x0C,0x30,0xC2,0x08,0x20,0x8C,0x00, // 'y'
+ 0xE2,0x22,0x44,0x88,0x8F, // 'z'
+ 0x19,0x08,0x42,0x10,0x84,0xC1,0x08,0x42,0x10,0x84,0x18, // '{'
+ 0xAA,0xAA,0xAA,0xAA,0xAA, // '|'
+ 0xC1,0x08,0x42,0x10,0x84,0x19,0x08,0x42,0x10,0x84,0xC0 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_19Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 2, 14, 5, 1, -14 }, // '!'
+ { 5, 4, 5, 7, 1, -14 }, // '"'
+ { 8, 8, 14, 9, 0, -14 }, // '#'
+ { 22, 6, 16, 9, 1, -15 }, // '$'
+ { 34, 9, 14, 12, 1, -14 }, // '%'
+ { 50, 7, 14, 9, 1, -14 }, // '&'
+ { 63, 2, 5, 5, 1, -14 }, // '''
+ { 65, 3, 17, 6, 1, -14 }, // '('
+ { 72, 3, 17, 6, 1, -14 }, // ')'
+ { 79, 5, 5, 8, 1, -15 }, // '*'
+ { 83, 6, 9, 9, 1, -12 }, // '+'
+ { 90, 2, 4, 5, 1, -2 }, // ','
+ { 91, 3, 1, 6, 1, -6 }, // '-'
+ { 92, 2, 2, 5, 1, -2 }, // '.'
+ { 93, 6, 14, 8, 1, -14 }, // '/'
+ { 104, 6, 14, 9, 1, -14 }, // '0'
+ { 115, 4, 14, 9, 1, -14 }, // '1'
+ { 122, 6, 14, 9, 1, -14 }, // '2'
+ { 133, 6, 14, 9, 1, -14 }, // '3'
+ { 144, 8, 14, 9, 0, -14 }, // '4'
+ { 158, 6, 14, 9, 1, -14 }, // '5'
+ { 169, 6, 14, 9, 1, -14 }, // '6'
+ { 180, 6, 14, 9, 1, -14 }, // '7'
+ { 191, 6, 14, 9, 1, -14 }, // '8'
+ { 202, 6, 14, 9, 1, -14 }, // '9'
+ { 213, 2, 10, 5, 1, -10 }, // ':'
+ { 216, 2, 12, 5, 1, -10 }, // ';'
+ { 219, 6, 8, 9, 1, -11 }, // '<'
+ { 225, 6, 5, 9, 1, -10 }, // '='
+ { 229, 6, 8, 9, 1, -11 }, // '>'
+ { 235, 5, 14, 6, 0, -14 }, // '?'
+ { 244, 9, 16, 12, 1, -14 }, // '@'
+ { 262, 8, 14, 9, 0, -14 }, // 'A'
+ { 276, 6, 14, 9, 1, -14 }, // 'B'
+ { 287, 7, 14, 9, 1, -14 }, // 'C'
+ { 300, 7, 14, 10, 1, -14 }, // 'D'
+ { 313, 5, 14, 8, 1, -14 }, // 'E'
+ { 322, 5, 14, 8, 2, -14 }, // 'F'
+ { 331, 8, 14, 11, 1, -14 }, // 'G'
+ { 345, 6, 14, 11, 2, -14 }, // 'H'
+ { 356, 2, 14, 5, 1, -14 }, // 'I'
+ { 360, 3, 17, 5, -1, -14 }, // 'J'
+ { 367, 6, 14, 9, 2, -14 }, // 'K'
+ { 378, 5, 14, 8, 2, -14 }, // 'L'
+ { 387, 11, 14, 14, 1, -14 }, // 'M'
+ { 407, 8, 14, 11, 1, -14 }, // 'N'
+ { 421, 8, 14, 11, 1, -14 }, // 'O'
+ { 435, 5, 14, 9, 2, -14 }, // 'P'
+ { 444, 8, 17, 11, 1, -14 }, // 'Q'
+ { 461, 7, 14, 9, 1, -14 }, // 'R'
+ { 474, 6, 14, 9, 1, -14 }, // 'S'
+ { 485, 7, 14, 8, 0, -14 }, // 'T'
+ { 498, 7, 14, 10, 1, -14 }, // 'U'
+ { 511, 7, 14, 8, 0, -14 }, // 'V'
+ { 524, 13, 14, 14, 0, -14 }, // 'W'
+ { 547, 7, 14, 8, 0, -14 }, // 'X'
+ { 560, 6, 14, 7, 0, -14 }, // 'Y'
+ { 571, 5, 14, 7, 1, -14 }, // 'Z'
+ { 580, 3, 17, 7, 2, -14 }, // '['
+ { 587, 6, 14, 8, 1, -14 }, // '\'
+ { 598, 3, 17, 7, 1, -14 }, // ']'
+ { 605, 8, 7, 9, 0, -14 }, // '^'
+ { 612, 8, 1, 9, 0, 2 }, // '_'
+ { 613, 3, 3, 11, 4, -15 }, // '`'
+ { 615, 5, 10, 8, 1, -10 }, // 'a'
+ { 622, 6, 15, 9, 1, -15 }, // 'b'
+ { 634, 5, 10, 7, 1, -10 }, // 'c'
+ { 641, 6, 15, 9, 1, -15 }, // 'd'
+ { 653, 5, 10, 8, 1, -10 }, // 'e'
+ { 660, 5, 15, 5, 0, -15 }, // 'f'
+ { 670, 7, 15, 8, 0, -10 }, // 'g'
+ { 684, 6, 15, 9, 1, -15 }, // 'h'
+ { 696, 2, 14, 5, 1, -14 }, // 'i'
+ { 700, 3, 19, 5, 0, -14 }, // 'j'
+ { 708, 6, 15, 8, 1, -15 }, // 'k'
+ { 720, 2, 15, 5, 1, -15 }, // 'l'
+ { 724, 10, 10, 13, 1, -10 }, // 'm'
+ { 737, 6, 10, 9, 1, -10 }, // 'n'
+ { 745, 6, 10, 9, 1, -10 }, // 'o'
+ { 753, 6, 15, 9, 1, -10 }, // 'p'
+ { 765, 6, 15, 9, 1, -10 }, // 'q'
+ { 777, 4, 10, 6, 1, -10 }, // 'r'
+ { 782, 4, 10, 7, 1, -10 }, // 's'
+ { 787, 4, 12, 5, 0, -12 }, // 't'
+ { 793, 6, 10, 9, 1, -10 }, // 'u'
+ { 801, 6, 10, 7, 0, -10 }, // 'v'
+ { 809, 10, 10, 11, 0, -10 }, // 'w'
+ { 822, 6, 10, 7, 0, -10 }, // 'x'
+ { 830, 6, 15, 7, 0, -10 }, // 'y'
+ { 842, 4, 10, 6, 1, -10 }, // 'z'
+ { 847, 5, 17, 8, 1, -14 }, // '{'
+ { 858, 2, 20, 9, 3, -15 }, // '|'
+ { 863, 5, 17, 8, 1, -14 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_19 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_19Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_19Glyphs,0x20, 0x7E, 27};
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Open_Sans_Condensed_Light_22Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xF3, // '!'
+ 0xDE,0xD6,0xA4,0xA4, // '"'
+ 0x12,0x09,0x04,0x82,0x41,0x23,0xFC,0x48,0x44,0x22,0x12,0x3F,0xC4,0x82,0x41,0x20,0x90,0x48, // '#'
+ 0x10,0x20,0xF2,0x89,0x12,0x24,0x28,0x70,0x30,0x50,0x91,0x22,0x45,0x7C,0x10,0x20,0x40, // '$'
+ 0x61,0x12,0x22,0x44,0x49,0x09,0x21,0x24,0x25,0x34,0xA9,0x95,0x2C,0xA4,0x24,0x84,0x90,0x92,0x22,0x44,0x48,0x86, // '%'
+ 0x30,0x48,0x48,0x48,0x48,0x48,0x30,0x20,0x50,0x92,0x8A,0x8A,0x86,0x86,0x8A,0x71, // '&'
+ 0xF5,0x50, // '''
+ 0x12,0x24,0x44,0xC8,0x88,0x88,0x84,0x44,0x22,0x10, // '('
+ 0x84,0x42,0x22,0x31,0x11,0x11,0x12,0x22,0x44,0x80, // ')'
+ 0x30,0x4D,0xCC,0x79,0x20, // '*'
+ 0x10,0x20,0x40,0x81,0x1F,0xC4,0x08,0x10,0x20,0x40, // '+'
+ 0x49,0x48, // ','
+ 0xF0, // '-'
+ 0xC0, // '.'
+ 0x04,0x08,0x10,0x40,0x83,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20,0x40, // '/'
+ 0x38,0x89,0x14,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x28,0x91,0x1C, // '0'
+ 0x35,0x91,0x11,0x11,0x11,0x11,0x11,0x11, // '1'
+ 0x79,0x08,0x10,0x10,0x20,0x81,0x02,0x08,0x10,0x41,0x02,0x08,0x20,0x7F, // '2'
+ 0x79,0x08,0x18,0x10,0x20,0x83,0x18,0x0C,0x0C,0x08,0x10,0x20,0xC1,0x7C, // '3'
+ 0x06,0x03,0x02,0x81,0x40,0xA0,0x90,0x48,0x44,0x22,0x21,0x10,0x9F,0xF0,0x20,0x10,0x08,0x04, // '4'
+ 0x7C,0x82,0x04,0x08,0x10,0x3E,0x02,0x02,0x04,0x08,0x10,0x20,0xA3,0x7C, // '5'
+ 0x1C,0x41,0x02,0x04,0x10,0x2E,0x62,0x83,0x06,0x0C,0x18,0x28,0x51,0x1C, // '6'
+ 0xFE,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20,0x40,0x82,0x04,0x08,0x20, // '7'
+ 0x38,0x8A,0x0C,0x18,0x28,0x99,0x1C,0x69,0x8A,0x0C,0x18,0x30,0x51,0x9C, // '8'
+ 0x38,0x8A,0x14,0x38,0x30,0x60,0xC3,0x46,0x74,0x08,0x20,0x40,0x82,0x38, // '9'
+ 0xC0,0x30, // ':'
+ 0x48,0x00,0x00,0x01,0x25,0x20, // ';'
+ 0x02,0x08,0x63,0x08,0x0C,0x06,0x03,0x02, // '<'
+ 0xFE,0x00,0x00,0x00,0x1F,0xC0, // '='
+ 0x80,0x80,0xC0,0x60,0x21,0x8C,0x60,0x80, // '>'
+ 0x70,0x20,0x83,0x08,0x20,0x84,0x10,0x82,0x08,0x00,0x02,0x08, // '?'
+ 0x0F,0x02,0x30,0x83,0x20,0x24,0x74,0x92,0x62,0x4C,0x99,0x93,0x32,0x46,0x48,0xC9,0x18,0xB4,0x9B,0x90,0x03,0x00,0x31,0x03,0xC0, // '@'
+ 0x08,0x04,0x05,0x02,0x81,0x40,0xA0,0x88,0x44,0x22,0x1F,0x10,0x48,0x24,0x12,0x0A,0x03,0x01, // 'A'
+ 0xF9,0x0A,0x0C,0x18,0x30,0xE1,0x7C,0x85,0x06,0x0C,0x18,0x30,0x61,0x7C, // 'B'
+ 0x1E,0x41,0x02,0x04,0x10,0x20,0x40,0x81,0x02,0x02,0x04,0x0C,0x08,0x0F, // 'C'
+ 0xF8,0x8C,0x86,0x82,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x82,0x82,0x86,0x8C,0xF8, // 'D'
+ 0xFC,0x21,0x08,0x42,0x1F,0x84,0x21,0x08,0x42,0x1F, // 'E'
+ 0xFE,0x08,0x20,0x82,0x08,0x20,0xFA,0x08,0x20,0x82,0x08,0x20, // 'F'
+ 0x0F,0x8C,0x26,0x01,0x00,0x40,0x30,0x08,0x02,0x00,0x83,0xE0,0x1C,0x05,0x01,0x40,0x58,0x13,0x04,0x3E, // 'G'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xFF,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1, // 'H'
+ 0xFF,0xFF, // 'I'
+ 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x2E, // 'J'
+ 0x85,0x0A,0x24,0x49,0x16,0x28,0x70,0xE1,0x22,0x44,0x48,0x90,0xA1,0x41, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0x80,0x38,0x0F,0x01,0xE0,0x3A,0x0B,0x41,0x68,0x2D,0x05,0x91,0x32,0x26,0x44,0xC5,0x18,0xA3,0x14,0x62,0x8C,0x21, // 'M'
+ 0x81,0xC1,0xC1,0xA1,0xA1,0xA1,0x91,0x91,0x89,0x89,0x85,0x85,0x87,0x83,0x83,0x81, // 'N'
+ 0x1C,0x11,0x10,0x48,0x2C,0x1C,0x06,0x03,0x01,0x80,0xC0,0x60,0x38,0x34,0x12,0x08,0x88,0x38, // 'O'
+ 0xF2,0x38,0x61,0x86,0x18,0x62,0xF2,0x08,0x20,0x82,0x08,0x20, // 'P'
+ 0x1C,0x11,0x10,0x48,0x2C,0x1C,0x06,0x03,0x01,0x80,0xC0,0x60,0x38,0x34,0x12,0x08,0x88,0x38,0x04,0x01,0x00,0x80,0x20, // 'Q'
+ 0xF1,0x12,0x14,0x28,0x50,0xA1,0x44,0xF1,0x22,0x44,0x48,0x91,0xA1,0x42, // 'R'
+ 0x3E,0x82,0x04,0x08,0x10,0x10,0x18,0x0C,0x08,0x08,0x10,0x20,0x41,0x7C, // 'S'
+ 0xFF,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, // 'T'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x51,0x9E, // 'U'
+ 0x80,0xC0,0x50,0x48,0x24,0x12,0x08,0x88,0x44,0x22,0x11,0x05,0x02,0x81,0x40,0xA0,0x20,0x10, // 'V'
+ 0x81,0x03,0x82,0x0D,0x0A,0x12,0x14,0x24,0x28,0x48,0x50,0x98,0xA3,0x12,0x24,0x24,0x48,0x48,0x90,0x91,0x20,0xA2,0x81,0x83,0x03,0x06,0x06,0x0C,0x0C,0x18, // 'W'
+ 0x41,0x42,0x22,0x24,0x24,0x14,0x18,0x08,0x18,0x18,0x24,0x24,0x26,0x42,0x42,0x81, // 'X'
+ 0x83,0x8D,0x12,0x24,0x45,0x0A,0x14,0x10,0x20,0x40,0x81,0x02,0x04,0x08, // 'Y'
+ 0xF8,0x20,0x86,0x10,0x43,0x08,0x21,0x84,0x10,0xC2,0x08,0x3F, // 'Z'
+ 0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF0, // '['
+ 0x81,0x01,0x02,0x04,0x04,0x08,0x10,0x10,0x20,0x60,0x40,0x80,0x81,0x02, // '\'
+ 0xF1,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xF0, // ']'
+ 0x08,0x0A,0x05,0x04,0x82,0x21,0x11,0x04,0x82, // '^'
+ 0xFF,0x80, // '_'
+ 0x99,0x10, // '`'
+ 0x78,0x20,0x81,0x04,0xFC,0x61,0x8E,0x38,0xDD, // 'a'
+ 0x81,0x02,0x04,0x08,0x17,0x31,0x43,0x83,0x06,0x0C,0x18,0x30,0x61,0x62,0xB8, // 'b'
+ 0x3D,0x04,0x20,0x82,0x08,0x20,0x81,0x04,0x0E, // 'c'
+ 0x02,0x04,0x08,0x10,0x27,0x51,0xA1,0x83,0x06,0x0C,0x18,0x30,0x70,0xA3,0x3A, // 'd'
+ 0x38,0x89,0x1C,0x18,0x3F,0xE0,0x40,0x80,0x81,0x89,0xE0, // 'e'
+ 0x19,0x08,0x42,0x7C,0x84,0x21,0x08,0x42,0x10,0x84,0x20, // 'f'
+ 0x3F,0x24,0x42,0x42,0x42,0x42,0x24,0x38,0x20,0x20,0x3E,0x43,0x41,0x81,0x81,0x42,0x3C, // 'g'
+ 0x82,0x08,0x20,0x82,0xE4,0xA2,0x86,0x18,0x61,0x86,0x18,0x61,0x84, // 'h'
+ 0xF0,0xFF,0xFF,0xFF, // 'i'
+ 0x6C,0x06,0xDB,0x6D,0xB6,0xDB,0x6D,0x2C, // 'j'
+ 0x82,0x08,0x20,0x82,0x28,0xA4,0xA2,0x8E,0x24,0x92,0x48,0xA2,0x84, // 'k'
+ 0xFF,0xFF,0x80, // 'l'
+ 0xF3,0xA3,0x18,0xC6,0x11,0x84,0x61,0x18,0x46,0x11,0x84,0x61,0x18,0x46,0x11, // 'm'
+ 0x39,0x28,0xA1,0x86,0x18,0x61,0x86,0x18,0x61, // 'n'
+ 0x38,0x8B,0x1C,0x18,0x30,0x60,0xC1,0x83,0x8D,0x11,0xC0, // 'o'
+ 0xB9,0x8A,0x1C,0x18,0x30,0x60,0xC1,0x83,0x0B,0x15,0xC8,0x10,0x20,0x40,0x80, // 'p'
+ 0x3A,0x8D,0x0C,0x18,0x30,0x60,0xC1,0x83,0x85,0x19,0xD0,0x20,0x40,0x81,0x02, // 'q'
+ 0xBC,0x88,0x88,0x88,0x88,0x88, // 'r'
+ 0x7C,0x21,0x08,0x30,0x41,0x08,0x43,0xE0, // 's'
+ 0x21,0x09,0xF2,0x10,0x84,0x21,0x08,0x42,0x10,0xE0, // 't'
+ 0x85,0x0A,0x14,0x28,0x50,0xA1,0x43,0x86,0x8D,0x29,0x90, // 'u'
+ 0x83,0x05,0x12,0x24,0x48,0x8A,0x14,0x28,0x50,0xC0,0x80, // 'v'
+ 0x86,0x14,0x62,0x46,0x24,0x62,0x4A,0x24,0x92,0x29,0x42,0x94,0x29,0x42,0x94,0x30,0xC1,0x08, // 'w'
+ 0x44,0x88,0xA1,0x42,0x82,0x04,0x14,0x28,0x89,0x12,0x20, // 'x'
+ 0x83,0x05,0x12,0x24,0x48,0x8A,0x14,0x28,0x50,0x40,0x81,0x02,0x08,0x10,0xC0, // 'y'
+ 0xF1,0x12,0x22,0x44,0x48,0x8F, // 'z'
+ 0x0C,0x43,0x08,0x20,0x82,0x08,0x23,0x02,0x08,0x20,0x82,0x08,0x10,0x40,0xC0, // '{'
+ 0xFF,0xFF,0xFC, // '|'
+ 0xC0,0x83,0x04,0x10,0x41,0x04,0x10,0x31,0x04,0x10,0x41,0x04,0x20,0x8C,0x00 // '}'
+};
+const GFXglyph Open_Sans_Condensed_Light_22Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 16, 6, 2, -16 }, // '!'
+ { 3, 5, 6, 8, 1, -16 }, // '"'
+ { 7, 9, 16, 10, 0, -16 }, // '#'
+ { 25, 7, 19, 10, 1, -17 }, // '$'
+ { 42, 11, 16, 14, 1, -16 }, // '%'
+ { 64, 8, 16, 10, 1, -16 }, // '&'
+ { 80, 2, 6, 5, 1, -16 }, // '''
+ { 82, 4, 19, 7, 1, -16 }, // '('
+ { 92, 4, 19, 7, 1, -16 }, // ')'
+ { 102, 6, 6, 9, 1, -17 }, // '*'
+ { 107, 7, 11, 10, 1, -14 }, // '+'
+ { 117, 3, 5, 6, 1, -2 }, // ','
+ { 119, 4, 1, 7, 1, -6 }, // '-'
+ { 120, 1, 2, 6, 2, -2 }, // '.'
+ { 121, 7, 16, 9, 1, -16 }, // '/'
+ { 135, 7, 16, 10, 1, -16 }, // '0'
+ { 149, 4, 16, 10, 2, -16 }, // '1'
+ { 157, 7, 16, 10, 1, -16 }, // '2'
+ { 171, 7, 16, 10, 1, -16 }, // '3'
+ { 185, 9, 16, 10, 0, -16 }, // '4'
+ { 203, 7, 16, 10, 1, -16 }, // '5'
+ { 217, 7, 16, 10, 1, -16 }, // '6'
+ { 231, 7, 16, 10, 1, -16 }, // '7'
+ { 245, 7, 16, 10, 1, -16 }, // '8'
+ { 259, 7, 16, 10, 1, -16 }, // '9'
+ { 273, 1, 12, 6, 2, -12 }, // ':'
+ { 275, 3, 15, 6, 1, -12 }, // ';'
+ { 281, 7, 9, 10, 1, -13 }, // '<'
+ { 289, 7, 6, 10, 1, -11 }, // '='
+ { 295, 7, 9, 10, 1, -13 }, // '>'
+ { 303, 6, 16, 7, 0, -16 }, // '?'
+ { 315, 11, 18, 14, 1, -16 }, // '@'
+ { 340, 9, 16, 10, 0, -16 }, // 'A'
+ { 358, 7, 16, 11, 2, -16 }, // 'B'
+ { 372, 7, 16, 10, 1, -16 }, // 'C'
+ { 386, 8, 16, 12, 2, -16 }, // 'D'
+ { 402, 5, 16, 9, 2, -16 }, // 'E'
+ { 412, 6, 16, 9, 2, -16 }, // 'F'
+ { 424, 10, 16, 13, 1, -16 }, // 'G'
+ { 444, 7, 16, 12, 2, -16 }, // 'H'
+ { 458, 1, 16, 5, 2, -16 }, // 'I'
+ { 460, 4, 20, 5, -1, -16 }, // 'J'
+ { 470, 7, 16, 10, 2, -16 }, // 'K'
+ { 484, 6, 16, 9, 2, -16 }, // 'L'
+ { 496, 11, 16, 16, 2, -16 }, // 'M'
+ { 518, 8, 16, 13, 2, -16 }, // 'N'
+ { 534, 9, 16, 12, 1, -16 }, // 'O'
+ { 552, 6, 16, 10, 2, -16 }, // 'P'
+ { 564, 9, 20, 12, 1, -16 }, // 'Q'
+ { 587, 7, 16, 10, 2, -16 }, // 'R'
+ { 601, 7, 16, 10, 1, -16 }, // 'S'
+ { 615, 8, 16, 9, 0, -16 }, // 'T'
+ { 631, 7, 16, 12, 2, -16 }, // 'U'
+ { 645, 9, 16, 10, 0, -16 }, // 'V'
+ { 663, 15, 16, 16, 0, -16 }, // 'W'
+ { 693, 8, 16, 9, 0, -16 }, // 'X'
+ { 709, 7, 16, 8, 0, -16 }, // 'Y'
+ { 723, 6, 16, 8, 1, -16 }, // 'Z'
+ { 735, 4, 19, 8, 2, -16 }, // '['
+ { 745, 7, 16, 9, 1, -16 }, // '\'
+ { 759, 4, 19, 8, 1, -16 }, // ']'
+ { 769, 9, 8, 10, 0, -16 }, // '^'
+ { 778, 9, 1, 10, 0, 2 }, // '_'
+ { 780, 3, 4, 13, 5, -17 }, // '`'
+ { 782, 6, 12, 9, 1, -12 }, // 'a'
+ { 791, 7, 17, 11, 2, -17 }, // 'b'
+ { 806, 6, 12, 8, 1, -12 }, // 'c'
+ { 815, 7, 17, 11, 1, -17 }, // 'd'
+ { 830, 7, 12, 10, 1, -12 }, // 'e'
+ { 841, 5, 17, 6, 0, -17 }, // 'f'
+ { 852, 8, 17, 9, 0, -12 }, // 'g'
+ { 869, 6, 17, 10, 2, -17 }, // 'h'
+ { 882, 2, 16, 5, 1, -16 }, // 'i'
+ { 886, 3, 21, 5, 0, -16 }, // 'j'
+ { 894, 6, 17, 9, 2, -17 }, // 'k'
+ { 907, 1, 17, 5, 2, -17 }, // 'l'
+ { 910, 10, 12, 15, 2, -12 }, // 'm'
+ { 925, 6, 12, 10, 2, -12 }, // 'n'
+ { 934, 7, 12, 10, 1, -12 }, // 'o'
+ { 945, 7, 17, 11, 2, -12 }, // 'p'
+ { 960, 7, 17, 11, 1, -12 }, // 'q'
+ { 975, 4, 12, 7, 2, -12 }, // 'r'
+ { 981, 5, 12, 8, 1, -12 }, // 's'
+ { 989, 5, 15, 6, 0, -15 }, // 't'
+ { 999, 7, 12, 10, 1, -12 }, // 'u'
+ { 1010, 7, 12, 8, 0, -12 }, // 'v'
+ { 1021, 12, 12, 13, 0, -12 }, // 'w'
+ { 1039, 7, 12, 8, 0, -12 }, // 'x'
+ { 1050, 7, 17, 8, 0, -12 }, // 'y'
+ { 1065, 4, 12, 7, 1, -12 }, // 'z'
+ { 1071, 6, 19, 9, 1, -16 }, // '{'
+ { 1086, 1, 22, 10, 4, -17 }, // '|'
+ { 1089, 6, 19, 9, 1, -16 } // '}'
+};
+const GFXfont Open_Sans_Condensed_Light_22 PROGMEM = {
+(uint8_t *)Open_Sans_Condensed_Light_22Bitmaps,(GFXglyph *)Open_Sans_Condensed_Light_22Glyphs,0x20, 0x7E, 31};
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Roboto_Condensed_19Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0xFF,0xCC, // '!'
+ 0xDD,0x99, // '"'
+ 0x09,0x0D,0x84,0xCF,0xF1,0x20,0x90,0xC8,0x6C,0xFF,0x12,0x09,0x04,0x82,0x43,0x20, // '#'
+ 0x10,0x20,0xF3,0x2C,0x78,0xF0,0x20,0x70,0x38,0x18,0x38,0x38,0xF1,0xBE,0x10,0x20, // '$'
+ 0x70,0x26,0x08,0x92,0x24,0x9A,0x1D,0x80,0x40,0x30,0x0B,0x86,0x91,0x64,0xD9,0x22,0x40,0xE0, // '%'
+ 0x38,0x32,0x11,0x08,0x86,0xC3,0xC0,0xC0,0xF0,0xD9,0x66,0xA1,0xD8,0xCC,0x71,0xCC, // '&'
+ 0xF0, // '''
+ 0x11,0x26,0x64,0x4C,0xCC,0xCC,0x44,0x66,0x21,0x10, // '('
+ 0x82,0x08,0x43,0x08,0x43,0x18,0xC6,0x31,0x08,0xC6,0x22,0x20, // ')'
+ 0x18,0x18,0x99,0xFF,0x18,0x3C,0x26,0x64, // '*'
+ 0x18,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x18, // '+'
+ 0x6D,0xAC, // ','
+ 0xF0, // '-'
+ 0xF0, // '.'
+ 0x04,0x10,0xC2,0x08,0x61,0x04,0x30,0x82,0x18,0x41,0x0C,0x00, // '/'
+ 0x3C,0xCB,0x1E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0A,0x36,0x47,0x80, // '0'
+ 0x09,0xF6,0x31,0x8C,0x63,0x18,0xC6,0x31,0x8C, // '1'
+ 0x3C,0x46,0xC6,0xC6,0x06,0x06,0x04,0x0C,0x18,0x18,0x30,0x60,0x40,0xFF, // '2'
+ 0x79,0x8B,0x18,0x30,0x61,0x8E,0x02,0x06,0x0C,0x1C,0x3C,0x4F,0x00, // '3'
+ 0x06,0x03,0x03,0x83,0xC1,0x61,0xB0,0x98,0xCC,0x46,0x7F,0xC1,0x80,0xC0,0x60,0x30, // '4'
+ 0x7E,0x60,0x60,0x60,0x40,0x7C,0x66,0x02,0x03,0x03,0xC3,0x42,0x66,0x3C, // '5'
+ 0x1C,0x61,0x82,0x0C,0x1F,0xB9,0xE3,0xC3,0x87,0x0E,0x36,0x47,0x00, // '6'
+ 0xFF,0x02,0x06,0x06,0x04,0x0C,0x0C,0x18,0x18,0x10,0x30,0x30,0x20,0x60, // '7'
+ 0x38,0x8B,0x1E,0x3C,0x68,0x8E,0x22,0xC7,0x8F,0x1E,0x34,0x47,0x00, // '8'
+ 0x38,0x9B,0x14,0x38,0x70,0xF1,0xE7,0x7E,0x0C,0x10,0x20,0x8E,0x00, // '9'
+ 0xF0,0x00,0xF0, // ':'
+ 0x6C,0x00,0x00,0x6D,0xAC, // ';'
+ 0x04,0x77,0x30,0xC1,0xC1,0xC1, // '<'
+ 0xFE,0x00,0x00,0x0F,0xE0, // '='
+ 0x81,0xC0,0xE0,0x70,0xE7,0x38,0x40, // '>'
+ 0x7B,0x38,0x41,0x0C,0x31,0x8C,0x30,0xC0,0x00,0x30,0xC0, // '?'
+ 0x07,0x80,0xC3,0x0C,0x0C,0x40,0x24,0x39,0x22,0x45,0x32,0x39,0x11,0xC8,0x8E,0x44,0x72,0x27,0x93,0x24,0xEE,0x20,0x00,0x80,0x06,0x10,0x0F,0x80, // '@'
+ 0x04,0x01,0xC0,0x28,0x05,0x01,0xB0,0x36,0x04,0x41,0x8C,0x31,0x87,0xF0,0x83,0x30,0x66,0x0D,0x80,0xC0, // 'A'
+ 0xFE,0xC3,0xC3,0xC3,0xC3,0xC2,0xFC,0xC3,0xC3,0xC1,0xC1,0xC3,0xC3,0xFE, // 'B'
+ 0x1E,0x11,0x98,0x68,0x3C,0x06,0x03,0x01,0x80,0xC0,0x60,0x10,0x6C,0x32,0x30,0xF0, // 'C'
+ 0xF8,0x84,0x86,0x82,0x83,0x83,0x83,0x83,0x83,0x83,0x82,0x86,0x84,0xF8, // 'D'
+ 0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xFE,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF, // 'E'
+ 0xFF,0x83,0x06,0x0C,0x18,0x3F,0xE0,0xC1,0x83,0x06,0x0C,0x18,0x00, // 'F'
+ 0x3E,0x31,0x90,0x78,0x3C,0x06,0x03,0x01,0x8F,0xC1,0xE0,0xF0,0x68,0x36,0x30,0xF0, // 'G'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0x81, // 'H'
+ 0xFF,0xFC, // 'I'
+ 0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0E,0x1C,0x3C,0xCF,0x00, // 'J'
+ 0xC3,0xE1,0xB1,0x99,0x8C,0xC6,0xC3,0xE1,0xF0,0xEC,0x66,0x31,0x98,0x6C,0x36,0x0C, // 'K'
+ 0xC1,0x83,0x06,0x0C,0x18,0x30,0x60,0xC1,0x83,0x06,0x0C,0x1F,0xC0, // 'L'
+ 0xE0,0x3E,0x07,0xE0,0x7F,0x07,0xF0,0xFD,0x0F,0xD8,0xBD,0x9B,0xC9,0xBC,0xD3,0xCF,0x3C,0x73,0xC6,0x3C,0x63, // 'M'
+ 0xC1,0xC1,0xE1,0xE1,0xB1,0xB1,0x99,0x99,0x8D,0x8D,0x87,0x87,0x83,0x83, // 'N'
+ 0x3E,0x31,0x90,0x58,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x68,0x26,0x31,0xF0, // 'O'
+ 0xFC,0x86,0x83,0x83,0x83,0x83,0x86,0xFC,0x80,0x80,0x80,0x80,0x80,0x80, // 'P'
+ 0x3E,0x31,0xB0,0x58,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x26,0x31,0xF8,0x0E,0x03, // 'Q'
+ 0xFC,0x61,0xB0,0xD8,0x6C,0x36,0x1B,0x09,0xF8,0xC4,0x63,0x31,0x98,0x6C,0x36,0x0C, // 'R'
+ 0x3C,0x63,0xC3,0xC3,0xC0,0x60,0x38,0x1E,0x07,0x03,0xC3,0xC3,0xC3,0x3C, // 'S'
+ 0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, // 'T'
+ 0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x68,0x26,0x31,0xF0, // 'U'
+ 0xC1,0xE0,0xF0,0x68,0x26,0x33,0x18,0x8C,0x44,0x36,0x1B,0x05,0x03,0x81,0xC0,0x40, // 'V'
+ 0x82,0x1E,0x30,0xF1,0xC5,0x8E,0x24,0x51,0x26,0x99,0x34,0xCD,0x36,0x68,0xA3,0x45,0x0E,0x28,0x61,0xC3,0x0E,0x18,0x20, // 'W'
+ 0xC1,0xE1,0x98,0xCC,0xC3,0x60,0xE0,0x60,0x38,0x3C,0x1B,0x19,0x8C,0x6C,0x36,0x0C, // 'X'
+ 0xC0,0xD8,0x66,0x18,0xCC,0x33,0x04,0x81,0xE0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00, // 'Y'
+ 0xFF,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x40,0xC0,0xFF, // 'Z'
+ 0xFB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDC, // '['
+ 0xC0,0x81,0x81,0x02,0x06,0x04,0x08,0x18,0x30,0x20,0x60,0xC0,0x81,0x80, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x49,0x3C, // ']'
+ 0x23,0x94,0xAD,0xEE,0x20, // '^'
+ 0xFE, // '_'
+ 0xCC,0x80, // '`'
+ 0x3C,0x8B,0x18,0x33,0xF8,0xF1,0xE3,0xCE,0xEC, // 'a'
+ 0xC1,0x83,0x06,0x0F,0xD8,0xF1,0xE1,0xC3,0x87,0x0E,0x3C,0x7F,0x80, // 'b'
+ 0x3C,0x8F,0x0E,0x1C,0x18,0x30,0x61,0x46,0x78, // 'c'
+ 0x06,0x0C,0x18,0x37,0xF8,0xF1,0xC3,0x87,0x0E,0x1E,0x3C,0x6F,0xC0, // 'd'
+ 0x3C,0x8F,0x1E,0x1F,0xF8,0x30,0x60,0x66,0x78, // 'e'
+ 0x3B,0x18,0xCF,0x31,0x8C,0x63,0x18,0xC6,0x30, // 'f'
+ 0x7F,0x8F,0x1C,0x38,0x70,0xE1,0xE3,0xC6,0xFC,0x1C,0x3C,0x4F,0x00, // 'g'
+ 0xC1,0x83,0x06,0x0F,0xD8,0xF1,0xE3,0xC7,0x8F,0x1E,0x3C,0x78,0xC0, // 'h'
+ 0xF0,0xFF,0xFF,0xF0, // 'i'
+ 0x6C,0x06,0xDB,0x6D,0xB6,0xDB,0x78, // 'j'
+ 0xC0,0xC0,0xC0,0xC0,0xC6,0xCC,0xD8,0xD8,0xF0,0xF8,0xC8,0xCC,0xC6,0xC7, // 'k'
+ 0xFF,0xFF,0xFF,0xF0, // 'l'
+ 0xFD,0xEC,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63,0xC6,0x3C,0x63, // 'm'
+ 0xDD,0xCF,0x1E,0x3C,0x78,0xF1,0xE3,0xC7,0x8C, // 'n'
+ 0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C, // 'o'
+ 0xFD,0x8F,0x1E,0x1C,0x38,0x70,0xE3,0xC7,0xFB,0x06,0x0C,0x18,0x00, // 'p'
+ 0x3A,0xCF,0x0E,0x1C,0x38,0x70,0xE1,0x66,0x74,0x08,0x10,0x20,0x40, // 'q'
+ 0xFE,0xCC,0xCC,0xCC,0xCC, // 'r'
+ 0x3C,0x8B,0x1A,0x07,0x03,0x81,0xE3,0x46,0x78, // 's'
+ 0x31,0xBE,0x63,0x18,0xC6,0x31,0x8C,0x30, // 't'
+ 0xC7,0x8F,0x1E,0x3C,0x78,0xF1,0xE3,0xC6,0xFC, // 'u'
+ 0xC3,0x42,0x66,0x66,0x24,0x24,0x3C,0x18,0x18,0x18, // 'v'
+ 0xC6,0x34,0x62,0x46,0x26,0xF6,0x6F,0x62,0x94,0x29,0x43,0x9C,0x30,0xC1,0x08, // 'w'
+ 0x63,0x66,0x34,0x3C,0x18,0x18,0x3C,0x34,0x66,0xE3, // 'x'
+ 0xC3,0x66,0x66,0x66,0x24,0x3C,0x3C,0x18,0x18,0x18,0x18,0x10,0x30,0x60, // 'y'
+ 0xFC,0x18,0x20,0xC3,0x06,0x18,0x30,0xC1,0xFC, // 'z'
+ 0x11,0xC8,0xC6,0x31,0x8C,0xC3,0x18,0xC6,0x31,0x84,0x30,0xC0, // '{'
+ 0xFF,0xFF,0x80, // '|'
+ 0x47,0x08,0x63,0x18,0xC6,0x19,0x8C,0x63,0x18,0xC4,0x66,0x00 // '}'
+};
+const GFXglyph Roboto_Condensed_19Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 5, 0, 0 }, // ' '
+ { 1, 1, 14, 6, 2, -14 }, // '!'
+ { 3, 4, 4, 7, 1, -14 }, // '"'
+ { 5, 9, 14, 11, 1, -14 }, // '#'
+ { 21, 7, 18, 10, 1, -16 }, // '$'
+ { 37, 10, 14, 13, 1, -14 }, // '%'
+ { 55, 9, 14, 11, 1, -14 }, // '&'
+ { 71, 1, 4, 4, 1, -14 }, // '''
+ { 72, 4, 19, 7, 1, -15 }, // '('
+ { 82, 5, 19, 7, 0, -15 }, // ')'
+ { 94, 8, 8, 9, 0, -14 }, // '*'
+ { 102, 8, 9, 10, 1, -11 }, // '+'
+ { 111, 3, 5, 5, 0, -2 }, // ','
+ { 113, 4, 1, 6, 0, -6 }, // '-'
+ { 114, 2, 2, 6, 1, -2 }, // '.'
+ { 115, 6, 15, 8, 0, -14 }, // '/'
+ { 127, 7, 14, 10, 1, -14 }, // '0'
+ { 140, 5, 14, 10, 1, -14 }, // '1'
+ { 149, 8, 14, 10, 1, -14 }, // '2'
+ { 163, 7, 14, 10, 1, -14 }, // '3'
+ { 176, 9, 14, 10, 0, -14 }, // '4'
+ { 192, 8, 14, 10, 1, -14 }, // '5'
+ { 206, 7, 14, 10, 1, -14 }, // '6'
+ { 219, 8, 14, 10, 1, -14 }, // '7'
+ { 233, 7, 14, 10, 1, -14 }, // '8'
+ { 246, 7, 14, 10, 1, -14 }, // '9'
+ { 259, 2, 10, 5, 1, -10 }, // ':'
+ { 262, 3, 13, 5, 0, -10 }, // ';'
+ { 267, 6, 8, 9, 1, -10 }, // '<'
+ { 273, 7, 5, 10, 1, -9 }, // '='
+ { 278, 7, 8, 10, 1, -10 }, // '>'
+ { 285, 6, 14, 9, 1, -14 }, // '?'
+ { 296, 13, 17, 16, 1, -13 }, // '@'
+ { 324, 11, 14, 12, 0, -14 }, // 'A'
+ { 344, 8, 14, 11, 1, -14 }, // 'B'
+ { 358, 9, 14, 12, 1, -14 }, // 'C'
+ { 374, 8, 14, 12, 2, -14 }, // 'D'
+ { 388, 8, 14, 10, 1, -14 }, // 'E'
+ { 402, 7, 14, 10, 1, -14 }, // 'F'
+ { 415, 9, 14, 12, 1, -14 }, // 'G'
+ { 431, 8, 14, 13, 2, -14 }, // 'H'
+ { 445, 1, 14, 6, 2, -14 }, // 'I'
+ { 447, 7, 14, 10, 1, -14 }, // 'J'
+ { 460, 9, 14, 11, 1, -14 }, // 'K'
+ { 476, 7, 14, 10, 1, -14 }, // 'L'
+ { 489, 12, 14, 15, 1, -14 }, // 'M'
+ { 510, 8, 14, 13, 2, -14 }, // 'N'
+ { 524, 9, 14, 12, 1, -14 }, // 'O'
+ { 540, 8, 14, 12, 2, -14 }, // 'P'
+ { 554, 9, 16, 12, 1, -14 }, // 'Q'
+ { 572, 9, 14, 11, 1, -14 }, // 'R'
+ { 588, 8, 14, 11, 1, -14 }, // 'S'
+ { 602, 8, 14, 11, 1, -14 }, // 'T'
+ { 616, 9, 14, 12, 1, -14 }, // 'U'
+ { 632, 9, 14, 12, 1, -14 }, // 'V'
+ { 648, 13, 14, 15, 1, -14 }, // 'W'
+ { 671, 9, 14, 11, 1, -14 }, // 'X'
+ { 687, 10, 14, 11, 0, -14 }, // 'Y'
+ { 705, 8, 14, 11, 1, -14 }, // 'Z'
+ { 719, 3, 18, 6, 1, -15 }, // '['
+ { 726, 7, 15, 8, 0, -14 }, // '\'
+ { 740, 3, 18, 6, 0, -15 }, // ']'
+ { 747, 5, 7, 8, 1, -14 }, // '^'
+ { 752, 7, 1, 9, 0, 0 }, // '_'
+ { 753, 3, 3, 7, 1, -15 }, // '`'
+ { 755, 7, 10, 10, 1, -10 }, // 'a'
+ { 764, 7, 14, 10, 1, -14 }, // 'b'
+ { 777, 7, 10, 10, 1, -10 }, // 'c'
+ { 786, 7, 14, 10, 1, -14 }, // 'd'
+ { 799, 7, 10, 10, 1, -10 }, // 'e'
+ { 808, 5, 14, 7, 1, -14 }, // 'f'
+ { 817, 7, 14, 10, 1, -10 }, // 'g'
+ { 830, 7, 14, 10, 1, -14 }, // 'h'
+ { 843, 2, 14, 5, 1, -14 }, // 'i'
+ { 847, 3, 18, 5, 0, -14 }, // 'j'
+ { 854, 8, 14, 10, 1, -14 }, // 'k'
+ { 868, 2, 14, 5, 1, -14 }, // 'l'
+ { 872, 12, 10, 15, 1, -10 }, // 'm'
+ { 887, 7, 10, 10, 1, -10 }, // 'n'
+ { 896, 8, 10, 11, 1, -10 }, // 'o'
+ { 906, 7, 14, 10, 1, -10 }, // 'p'
+ { 919, 7, 14, 11, 1, -10 }, // 'q'
+ { 932, 4, 10, 7, 1, -10 }, // 'r'
+ { 937, 7, 10, 10, 1, -10 }, // 's'
+ { 946, 5, 12, 7, 0, -12 }, // 't'
+ { 954, 7, 10, 10, 1, -10 }, // 'u'
+ { 963, 8, 10, 9, 0, -10 }, // 'v'
+ { 973, 12, 10, 13, 0, -10 }, // 'w'
+ { 988, 8, 10, 9, 0, -10 }, // 'x'
+ { 998, 8, 14, 9, 0, -10 }, // 'y'
+ { 1012, 7, 10, 9, 1, -10 }, // 'z'
+ { 1021, 5, 18, 7, 1, -15 }, // '{'
+ { 1033, 1, 17, 6, 2, -14 }, // '|'
+ { 1036, 5, 18, 7, 0, -15 } // '}'
+};
+const GFXfont Roboto_Condensed_19 PROGMEM = {
+(uint8_t *)Roboto_Condensed_19Bitmaps,(GFXglyph *)Roboto_Condensed_19Glyphs,0x20, 0x7E, 23};
+
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t URW_Palladio_L_Roman_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x7F,0x55,0x0F, // '!'
+ 0x9C,0xA5,0x20, // '"'
+ 0x13,0x09,0x04,0x82,0x47,0xF9,0x10,0x89,0xFE,0x24,0x12,0x09,0x08,0x80, // '#'
+ 0x10,0xFA,0x54,0x89,0x1A,0x1F,0x0F,0x12,0x26,0x4C,0xA7,0x82,0x04,0x00, // '$'
+ 0x70,0x44,0x44,0x22,0x21,0x12,0x08,0x90,0x39,0x00,0x09,0xC0,0x99,0x04,0x88,0x44,0x42,0x22,0x21,0x31,0x07,0x00, // '%'
+ 0x1C,0x02,0x40,0x24,0x02,0x80,0x28,0x03,0x3F,0x50,0x89,0x88,0x8C,0x88,0x70,0xC3,0x07,0xCE, // '&'
+ 0xEA, // '''
+ 0x12,0x44,0x88,0x88,0x88,0x88,0x44,0x42,0x10, // '('
+ 0x84,0x22,0x21,0x11,0x11,0x11,0x22,0x44,0x80, // ')'
+ 0x04,0xB8,0x7E,0xD0,0x40, // '*'
+ 0x08,0x04,0x02,0x01,0x0F,0xF8,0x40,0x20,0x10,0x08,0x00, // '+'
+ 0x32,0x64,0x80, // ','
+ 0x78, // '-'
+ 0xF0, // '.'
+ 0x02,0x08,0x10,0x20,0x81,0x04,0x08,0x20,0x40,0x82,0x04,0x10,0x20,0x00, // '/'
+ 0x38,0x8A,0x1C,0x18,0x30,0x60,0xC1,0x83,0x07,0x12,0x23,0x80, // '0'
+ 0x13,0xC1,0x04,0x10,0x41,0x04,0x10,0x41,0x1F, // '1'
+ 0x3C,0x46,0x82,0x02,0x02,0x04,0x04,0x08,0x10,0x20,0x43,0xFF, // '2'
+ 0x3C,0x8D,0x08,0x10,0x43,0x81,0x81,0x03,0x05,0x13,0xC0, // '3'
+ 0x04,0x0C,0x1C,0x14,0x24,0x24,0x44,0x44,0xFF,0x04,0x04,0x1F, // '4'
+ 0x7E,0x81,0x02,0x0B,0xC8,0xC0,0x81,0x03,0x0A,0x13,0xC0, // '5'
+ 0x04,0x30,0x82,0x04,0x17,0xB1,0xC1,0x83,0x05,0x11,0xC0, // '6'
+ 0xFF,0x82,0x86,0x04,0x08,0x08,0x10,0x10,0x20,0x60,0x40,0xC0, // '7'
+ 0x3C,0x8E,0x0C,0x1C,0x4F,0x0F,0x23,0x83,0x06,0x0E,0x27,0x80, // '8'
+ 0x3C,0x42,0x81,0x81,0x81,0x81,0x43,0x3D,0x02,0x02,0x04,0x08,0x70, // '9'
+ 0xF0,0x0F, // ':'
+ 0x50,0x05,0xA8, // ';'
+ 0x01,0x83,0x06,0x0C,0x0C,0x01,0x80,0x30,0x06,0x00,0x80, // '<'
+ 0xFF,0x80,0x00,0x00,0x0F,0xF8, // '='
+ 0xC0,0x18,0x03,0x00,0x60,0x18,0x30,0x60,0xC0,0x80,0x00, // '>'
+ 0x7A,0x30,0x41,0x08,0x43,0x08,0x00,0x02,0x08, // '?'
+ 0x0F,0xC1,0x83,0x18,0x04,0x85,0x98,0xDC,0xCC,0x46,0x46,0x32,0x32,0x53,0xB3,0x66,0xCC,0x0C,0x1F,0x80, // '@'
+ 0x02,0x00,0x18,0x01,0x40,0x0B,0x00,0x88,0x04,0x60,0x43,0x03,0xFC,0x10,0x61,0x01,0x88,0x0D,0xE0,0xF0, // 'A'
+ 0xFE,0x11,0x88,0x44,0x22,0x21,0xF0,0x86,0x41,0x20,0x90,0x48,0x4F,0xC0, // 'B'
+ 0x0F,0x86,0x09,0x01,0x20,0x08,0x01,0x00,0x20,0x04,0x00,0xC0,0x08,0x00,0xC1,0x07,0xC0, // 'C'
+ 0xFF,0x82,0x06,0x20,0x22,0x01,0x20,0x12,0x01,0x20,0x12,0x01,0x20,0x22,0x02,0x20,0xC7,0xF0, // 'D'
+ 0xFF,0x90,0x48,0x24,0x02,0x11,0xF8,0x84,0x42,0x20,0x10,0x48,0x3F,0xF0, // 'E'
+ 0xFF,0x90,0x88,0x04,0x02,0x11,0xF8,0x84,0x42,0x20,0x10,0x08,0x1F,0x00, // 'F'
+ 0x0F,0xE1,0x80,0x90,0x00,0x80,0x08,0x00,0x40,0x02,0x00,0x10,0x1F,0xC0,0x13,0x00,0x8E,0x04,0x1F,0xC0, // 'G'
+ 0x70,0x38,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0xFF,0xC2,0x01,0x08,0x04,0x20,0x10,0x80,0x42,0x01,0x3E,0x1F, // 'H'
+ 0xF9,0x08,0x42,0x10,0x84,0x21,0x09,0xF0, // 'I'
+ 0xF9,0x08,0x42,0x10,0x84,0x21,0x08,0x42,0x11,0x10, // 'J'
+ 0xF8,0xE2,0x08,0x21,0x02,0x20,0x24,0x03,0x80,0x2C,0x02,0x60,0x23,0x02,0x18,0x20,0xEF,0x87, // 'K'
+ 0xF8,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x22,0x09,0xFE, // 'L'
+ 0xF0,0x07,0x38,0x0C,0x38,0x0C,0x2C,0x14,0x2C,0x14,0x26,0x24,0x26,0x24,0x23,0x44,0x23,0x44,0x21,0x84,0x21,0x84,0xF9,0x0F, // 'M'
+ 0xF0,0x3E,0x70,0x10,0xF0,0x21,0x70,0x42,0x60,0x84,0x61,0x08,0x62,0x10,0x64,0x20,0x68,0x40,0xF0,0x80,0xE7,0xC0,0xC0, // 'N'
+ 0x0F,0xC1,0x83,0x10,0x05,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x13,0x00,0x8C,0x18,0x1F,0x00, // 'O'
+ 0xFF,0x88,0x32,0x04,0x81,0x20,0x8B,0xC2,0x00,0x80,0x20,0x08,0x02,0x03,0xE0, // 'P'
+ 0x0F,0xC1,0x83,0x10,0x05,0x00,0x38,0x00,0xC0,0x06,0x00,0x30,0x01,0xC0,0x12,0x00,0x8C,0x08,0x3F,0x80,0x70,0x04,0xFC,0x00,0xC0, // 'Q'
+ 0xFF,0x04,0x30,0x82,0x10,0x42,0x10,0x4C,0x0B,0x81,0x30,0x23,0x04,0x30,0x87,0x7C,0x70, // 'R'
+ 0x3E,0x42,0x82,0x80,0x80,0x78,0x06,0x01,0x01,0x81,0x82,0x7C, // 'S'
+ 0xFF,0xC4,0x42,0x01,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x07,0xC0, // 'T'
+ 0xF8,0x7C,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80,0x42,0x01,0x08,0x04,0x20,0x10,0x80,0x41,0x06,0x03,0xF0, // 'U'
+ 0xF8,0x76,0x02,0x30,0x23,0x04,0x18,0x41,0x84,0x08,0x80,0xC8,0x05,0x00,0x70,0x06,0x00,0x20, // 'V'
+ 0xF8,0x43,0xB0,0x60,0x88,0x30,0x46,0x2C,0x23,0x16,0x21,0x89,0x10,0x48,0xC8,0x34,0x68,0x1C,0x14,0x0E,0x0E,0x02,0x02,0x01,0x01,0x00, // 'W'
+ 0x70,0x66,0x08,0x62,0x0C,0x80,0xD0,0x0C,0x01,0x80,0x58,0x11,0x82,0x30,0x83,0x20,0x30, // 'X'
+ 0xE0,0x44,0x18,0xC2,0x08,0x80,0xA0,0x14,0x01,0x00,0x20,0x04,0x00,0x80,0x10,0x0F,0x80, // 'Y'
+ 0x7F,0xE8,0x19,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0x60,0x18,0x06,0x05,0x80,0xFF,0xF0, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x27, // '['
+ 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x4F, // ']'
+ 0x18,0x0A,0x09,0x04,0x44,0x32,0x0A,0x06, // '^'
+ 0xFF,0x80, // '_'
+ 0x84,0x20, // '`'
+ 0x39,0x98,0x10,0xE6,0x50,0xA3,0x3B, // 'a'
+ 0x00,0xC0,0x40,0x40,0x40,0x5E,0x63,0x41,0x41,0x41,0x42,0x42,0x3C, // 'b'
+ 0x1D,0x98,0x20,0x82,0x04,0x0F, // 'c'
+ 0x00,0x06,0x02,0x02,0x02,0x1E,0x66,0x82,0x82,0x82,0x82,0x82,0x46,0x3B, // 'd'
+ 0x1C,0x62,0x43,0x43,0xFF,0x40,0x40,0x61,0x3E, // 'e'
+ 0x1B,0x10,0x84,0x79,0x08,0x42,0x10,0x8E,0x00, // 'f'
+ 0x1C,0x33,0xD0,0x88,0x46,0x41,0xC1,0x00,0x80,0x7F,0x20,0x60,0x30,0x1C,0x31,0xE0, // 'g'
+ 0x00,0xC0,0x40,0x40,0x40,0x5C,0x66,0x42,0x42,0x42,0x42,0x42,0xE3, // 'h'
+ 0x48,0x2C,0x92,0x49,0x70, // 'i'
+ 0x22,0x03,0x51,0x11,0x11,0x11,0x11,0x12,0xC0, // 'j'
+ 0xC0,0x40,0x40,0x40,0x43,0x44,0x48,0x50,0x70,0x58,0x4C,0x46,0xE3, // 'k'
+ 0xC9,0x24,0x92,0x49,0x2E, // 'l'
+ 0xDC,0xE3,0x38,0x90,0x84,0x84,0x24,0x21,0x21,0x09,0x08,0x5D,0xF3, // 'm'
+ 0xDC,0x66,0x42,0x42,0x42,0x42,0x42,0xE3, // 'n'
+ 0x38,0x8A,0x1C,0x18,0x30,0x70,0xA2,0x38, // 'o'
+ 0xDC,0x62,0x41,0x41,0x41,0x42,0x62,0x7C,0x40,0x40,0x40,0x40,0xE0, // 'p'
+ 0x1C,0x62,0x82,0x82,0x82,0x82,0x82,0x46,0x3A,0x02,0x02,0x02,0x02,0x0F, // 'q'
+ 0x5E,0xD8,0x84,0x21,0x08,0xF0, // 'r'
+ 0x7A,0x28,0x30,0x78,0x10,0x63,0xF0, // 's'
+ 0x44,0x47,0xC4,0x44,0x44,0x70, // 't'
+ 0x42,0xC6,0x42,0x42,0x42,0x42,0x42,0x46,0x3B, // 'u'
+ 0x71,0x88,0x43,0x20,0xC8,0x12,0x07,0x00,0xC0,0x20, // 'v'
+ 0xF1,0x1D,0x84,0x22,0x38,0x88,0xE4,0x34,0x90,0x53,0x81,0x8E,0x06,0x18,0x18,0x40, // 'w'
+ 0xE1,0x19,0x0D,0x03,0x00,0x80,0xE0,0x98,0xC6,0xC3,0x80, // 'x'
+ 0xF3,0xD8,0x42,0x10,0xC8,0x12,0x07,0x01,0xC0,0x30,0x08,0x02,0x01,0x00,0x40,0x60,0x00, // 'y'
+ 0x7F,0x42,0x04,0x0C,0x18,0x30,0x61,0xFF, // 'z'
+ 0x49,0x24,0x92,0x89,0x24,0x92, // '{'
+ 0xFF,0xF8, // '|'
+ 0x89,0x24,0x92,0x29,0x24,0x92 // '}'
+};
+const GFXglyph URW_Palladio_L_Roman_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 6, 0, 0 }, // ' '
+ { 1, 2, 12, 6, 2, -12 }, // '!'
+ { 4, 5, 4, 8, 1, -12 }, // '"'
+ { 7, 9, 12, 10, 0, -12 }, // '#'
+ { 21, 7, 15, 10, 1, -13 }, // '$'
+ { 35, 13, 13, 16, 1, -13 }, // '%'
+ { 57, 12, 12, 15, 1, -12 }, // '&'
+ { 75, 2, 4, 5, 1, -12 }, // '''
+ { 76, 4, 17, 7, 1, -13 }, // '('
+ { 85, 4, 17, 7, 0, -13 }, // ')'
+ { 94, 5, 7, 8, 1, -13 }, // '*'
+ { 99, 9, 9, 12, 1, -9 }, // '+'
+ { 110, 4, 5, 6, 0, -2 }, // ','
+ { 113, 6, 1, 7, 0, -5 }, // '-'
+ { 114, 2, 2, 6, 1, -2 }, // '.'
+ { 115, 7, 15, 12, 2, -13 }, // '/'
+ { 129, 7, 13, 10, 1, -13 }, // '0'
+ { 141, 6, 12, 10, 1, -12 }, // '1'
+ { 150, 8, 12, 10, 0, -12 }, // '2'
+ { 162, 7, 12, 10, 0, -12 }, // '3'
+ { 173, 8, 12, 10, 0, -12 }, // '4'
+ { 185, 7, 12, 10, 1, -12 }, // '5'
+ { 196, 7, 12, 10, 1, -12 }, // '6'
+ { 207, 8, 12, 10, 1, -12 }, // '7'
+ { 219, 7, 13, 10, 1, -13 }, // '8'
+ { 231, 8, 13, 10, 0, -13 }, // '9'
+ { 244, 2, 8, 6, 1, -8 }, // ':'
+ { 246, 2, 11, 6, 1, -8 }, // ';'
+ { 249, 9, 9, 12, 1, -9 }, // '<'
+ { 260, 9, 5, 12, 1, -7 }, // '='
+ { 266, 9, 9, 12, 1, -9 }, // '>'
+ { 277, 6, 12, 9, 0, -12 }, // '?'
+ { 286, 13, 12, 14, 0, -12 }, // '@'
+ { 306, 13, 12, 15, 0, -12 }, // 'A'
+ { 326, 9, 12, 12, 0, -12 }, // 'B'
+ { 340, 11, 12, 14, 0, -12 }, // 'C'
+ { 357, 12, 12, 15, 0, -12 }, // 'D'
+ { 375, 9, 12, 12, 0, -12 }, // 'E'
+ { 389, 9, 12, 11, 0, -12 }, // 'F'
+ { 403, 13, 12, 15, 0, -12 }, // 'G'
+ { 423, 14, 12, 16, 0, -12 }, // 'H'
+ { 444, 5, 12, 7, 0, -12 }, // 'I'
+ { 452, 5, 16, 7, 0, -12 }, // 'J'
+ { 462, 12, 12, 14, 0, -12 }, // 'K'
+ { 480, 10, 12, 12, 0, -12 }, // 'L'
+ { 495, 16, 12, 18, 0, -12 }, // 'M'
+ { 519, 15, 12, 16, 0, -12 }, // 'N'
+ { 542, 13, 12, 15, 0, -12 }, // 'O'
+ { 562, 10, 12, 12, 0, -12 }, // 'P'
+ { 577, 13, 15, 15, 0, -12 }, // 'Q'
+ { 602, 11, 12, 13, 0, -12 }, // 'R'
+ { 619, 8, 12, 10, 0, -12 }, // 'S'
+ { 631, 9, 12, 12, 1, -12 }, // 'T'
+ { 645, 14, 12, 15, 0, -12 }, // 'U'
+ { 666, 12, 12, 14, 0, -12 }, // 'V'
+ { 684, 17, 12, 19, 0, -12 }, // 'W'
+ { 710, 11, 12, 13, 0, -12 }, // 'X'
+ { 727, 11, 12, 13, 0, -12 }, // 'Y'
+ { 744, 11, 12, 13, 0, -12 }, // 'Z'
+ { 761, 3, 16, 7, 2, -14 }, // '['
+ { 767, 8, 13, 12, 1, -13 }, // '\'
+ { 780, 3, 16, 7, 1, -14 }, // ']'
+ { 786, 9, 7, 12, 1, -12 }, // '^'
+ { 794, 9, 1, 10, 0, 1 }, // '_'
+ { 796, 4, 3, 7, 1, -12 }, // '`'
+ { 798, 7, 8, 10, 1, -8 }, // 'a'
+ { 805, 8, 13, 11, 0, -13 }, // 'b'
+ { 818, 6, 8, 9, 1, -8 }, // 'c'
+ { 824, 8, 14, 12, 1, -14 }, // 'd'
+ { 838, 8, 9, 10, 0, -9 }, // 'e'
+ { 847, 5, 13, 7, 1, -13 }, // 'f'
+ { 856, 9, 14, 11, 0, -9 }, // 'g'
+ { 872, 8, 13, 11, 1, -13 }, // 'h'
+ { 885, 3, 12, 6, 1, -12 }, // 'i'
+ { 890, 4, 17, 5, -2, -12 }, // 'j'
+ { 899, 8, 13, 11, 1, -13 }, // 'k'
+ { 912, 3, 13, 6, 1, -13 }, // 'l'
+ { 917, 13, 8, 17, 1, -8 }, // 'm'
+ { 930, 8, 8, 11, 1, -8 }, // 'n'
+ { 938, 7, 9, 11, 1, -9 }, // 'o'
+ { 946, 8, 13, 12, 1, -8 }, // 'p'
+ { 959, 8, 14, 11, 1, -9 }, // 'q'
+ { 973, 5, 9, 8, 1, -9 }, // 'r'
+ { 979, 6, 9, 9, 1, -9 }, // 's'
+ { 986, 4, 11, 7, 1, -11 }, // 't'
+ { 992, 8, 9, 12, 1, -9 }, // 'u'
+ { 1001, 10, 8, 11, 0, -8 }, // 'v'
+ { 1011, 14, 9, 16, 0, -9 }, // 'w'
+ { 1027, 9, 9, 10, 0, -9 }, // 'x'
+ { 1038, 10, 13, 11, 0, -8 }, // 'y'
+ { 1055, 8, 8, 10, 0, -8 }, // 'z'
+ { 1063, 3, 16, 7, 1, -13 }, // '{'
+ { 1069, 1, 13, 12, 5, -13 }, // '|'
+ { 1071, 3, 16, 7, 1, -13 } // '}'
+};
+const GFXfont URW_Palladio_L_Roman_18 PROGMEM = {
+(uint8_t *)URW_Palladio_L_Roman_18Bitmaps,(GFXglyph *)URW_Palladio_L_Roman_18Glyphs,0x20, 0x7E, 24};
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t URW_Palladio_L_Bold_18Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x7F,0xB4,0x92,0x0F,0xF0, // '!'
+ 0x67,0xDD,0x9A,0x24,0x48,0x80, // '"'
+ 0x13,0x09,0x84,0x82,0x47,0xF9,0x90,0xD9,0xFE,0x24,0x12,0x09,0x0C,0x80, // '#'
+ 0x10,0x7E,0xD2,0xD2,0xD0,0xF0,0xFE,0x3F,0x17,0x93,0x93,0x96,0xFC,0x10,0x10, // '$'
+ 0x78,0x43,0x31,0x0C,0xC8,0x33,0x20,0xCD,0x01,0xE4,0x00,0x27,0x81,0x33,0x04,0xCC,0x23,0x30,0x8C,0xC4,0x1E, // '%'
+ 0x0E,0x00,0x98,0x0C,0xC0,0x64,0x03,0xC0,0x1C,0x7D,0xF1,0x19,0xC8,0xC7,0x47,0x1C,0x1C,0x7E,0x7C,0xE0, // '&'
+ 0xFF,0xC0, // '''
+ 0x12,0x64,0xCC,0xCC,0xCC,0xC4,0x62,0x10, // '('
+ 0x84,0x62,0x33,0x33,0x33,0x32,0x64,0x80, // ')'
+ 0x1B,0x43,0xF4,0x18, // '*'
+ 0x0C,0x03,0x00,0xC0,0x30,0xFF,0xFF,0xF0,0xC0,0x30,0x0C,0x03,0x00, // '+'
+ 0x07,0x66,0xC8, // ','
+ 0x7F,0xE0, // '-'
+ 0xDF,0x00, // '.'
+ 0x08,0xC6,0x23,0x18,0x84,0x63,0x11,0x8C,0x00, // '/'
+ 0x38,0xDB,0x1E,0x3C,0x78,0xF1,0xE3,0xC7,0x8D,0xB1,0xC0, // '0'
+ 0x19,0xF2,0x60,0xC1,0x83,0x06,0x0C,0x18,0x30,0x63,0xF0, // '1'
+ 0x78,0x7E,0xCE,0x86,0x06,0x04,0x0C,0x18,0x10,0x20,0x7F,0xFF, // '2'
+ 0x3C,0x7E,0x46,0x86,0x04,0x3C,0x3F,0x03,0x03,0x83,0xC6,0xF8, // '3'
+ 0x02,0x07,0x03,0x82,0xC3,0x61,0x31,0x18,0x8C,0x7F,0x83,0x01,0x83,0xF0, // '4'
+ 0x7F,0x7F,0x40,0x40,0x5E,0x7F,0x47,0x03,0x03,0x82,0x46,0x78, // '5'
+ 0x04,0x31,0x82,0x0D,0xDF,0xF3,0xE3,0xC7,0x8D,0x91,0xC0, // '6'
+ 0xFF,0xFE,0x82,0x84,0x04,0x08,0x08,0x10,0x30,0x30,0x60,0x60, // '7'
+ 0x3C,0xCF,0x9F,0x3F,0x47,0x8B,0xA3,0xC7,0x8F,0x93,0xC0, // '8'
+ 0x38,0x9B,0x1E,0x3C,0x7C,0xFF,0xBB,0x0C,0x18,0x63,0x80, // '9'
+ 0xDF,0x01,0xBE, // ':'
+ 0x6D,0x80,0x1B,0x5A,0x00, // ';'
+ 0x00,0x81,0xC3,0xC7,0x8E,0x07,0x01,0xE0,0x1C,0x03,0x80,0x40, // '<'
+ 0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFC, // '='
+ 0x00,0x70,0x1E,0x03,0xC0,0x38,0x1C,0x3C,0x70,0xE0,0x40,0x00, // '>'
+ 0x7B,0xF8,0xC3,0x08,0x42,0x08,0x00,0x86,0x18, // '?'
+ 0x0F,0x83,0x04,0x40,0x24,0x69,0x99,0x9B,0x99,0xB1,0x9B,0x32,0x75,0x65,0xDF,0x30,0x60,0xF8, // '@'
+ 0x03,0x00,0x0C,0x00,0x78,0x01,0xE0,0x09,0xC0,0x27,0x01,0x8E,0x07,0xF8,0x10,0x60,0x81,0xC2,0x07,0x3E,0x3F, // 'A'
+ 0xFF,0x0C,0x63,0x18,0xC6,0x33,0x0F,0xE3,0x1C,0xC3,0x30,0xCC,0x33,0x19,0xFC, // 'B'
+ 0x0F,0xC6,0x0D,0x80,0xE0,0x1C,0x01,0x80,0x30,0x06,0x00,0x60,0x0C,0x00,0xE0,0x87,0xE0, // 'C'
+ 0xFF,0xE0,0xC1,0xE3,0x01,0x8C,0x03,0x30,0x0C,0xC0,0x33,0x00,0xCC,0x03,0x30,0x18,0xC0,0x63,0x06,0x1F,0xE0, // 'D'
+ 0xFF,0x8C,0x23,0x00,0xC0,0x31,0x0F,0xC3,0x10,0xC0,0x30,0x0C,0x13,0x05,0xFE, // 'E'
+ 0xFF,0x98,0x4C,0x26,0x03,0x11,0xF8,0xC4,0x62,0x30,0x18,0x0C,0x1F,0x80, // 'F'
+ 0x0F,0xE1,0x81,0x98,0x05,0x80,0x2C,0x00,0x60,0x03,0x00,0x18,0x1F,0x60,0x33,0x01,0x8E,0x0C,0x1F,0x80, // 'G'
+ 0xFC,0xFC,0xC0,0xC3,0x03,0x0C,0x0C,0x30,0x30,0xFF,0xC3,0x03,0x0C,0x0C,0x30,0x30,0xC0,0xC3,0x03,0x3F,0x3F, // 'H'
+ 0xFC,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x3F, // 'I'
+ 0xFC,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0xC3,0x0C,0x30,0x82,0x30, // 'J'
+ 0xFC,0x79,0x83,0x0C,0x20,0x62,0x03,0x20,0x1F,0x00,0xDC,0x06,0xF0,0x33,0xC1,0x8F,0x0C,0x3D,0xF8,0xF0, // 'K'
+ 0xFC,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x13,0x05,0xFE, // 'L'
+ 0xF8,0x07,0x9C,0x07,0x0F,0x03,0x85,0x82,0xC2,0xE1,0x61,0x31,0x30,0x9C,0x98,0x46,0x8C,0x23,0xC6,0x10,0xC3,0x08,0x61,0x9F,0x33,0xF0, // 'M'
+ 0xF8,0x3C,0xE0,0x23,0xC0,0x8B,0x82,0x27,0x08,0x9E,0x22,0x3C,0x88,0x7A,0x20,0xF8,0x81,0xE2,0x03,0xBE,0x06, // 'N'
+ 0x0F,0xC1,0x83,0x18,0x0D,0x80,0x7C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xE0,0x1B,0x01,0x8C,0x18,0x3F,0x00, // 'O'
+ 0xFF,0x8C,0x73,0x0C,0xC3,0x31,0x8D,0xC3,0x00,0xC0,0x30,0x0C,0x03,0x03,0xF0, // 'P'
+ 0x0F,0xC1,0x83,0x18,0x0D,0x80,0x7C,0x01,0xE0,0x0F,0x00,0x78,0x03,0xE0,0x1B,0x01,0x8C,0x18,0x3F,0x00,0xF0,0x1F,0xF4,0x01,0xC0, // 'Q'
+ 0xFF,0x83,0x1C,0x30,0xC3,0x0C,0x30,0x83,0x30,0x37,0x03,0x38,0x33,0xC3,0x1C,0x30,0xEF,0xCF, // 'R'
+ 0x3F,0x31,0xB0,0x58,0x0F,0x03,0xF0,0x7E,0x07,0x81,0xC0,0xF0,0xCF,0xC0, // 'S'
+ 0xFF,0xE3,0x18,0xC4,0x30,0x0C,0x03,0x00,0xC0,0x30,0x0C,0x03,0x00,0xC0,0xFC, // 'T'
+ 0xFC,0x7C,0xC0,0x43,0x01,0x0C,0x04,0x30,0x10,0xC0,0x43,0x01,0x0C,0x04,0x30,0x10,0xC0,0x41,0x82,0x03,0xF0, // 'U'
+ 0xFC,0x3C,0xE0,0x43,0x81,0x07,0x0C,0x1C,0x20,0x30,0x80,0xE4,0x01,0x90,0x07,0x80,0x1E,0x00,0x30,0x00,0xC0, // 'V'
+ 0xFC,0x43,0xDC,0x18,0x63,0x0E,0x10,0xE3,0xC4,0x39,0xF1,0x0E,0x4C,0x81,0x93,0xA0,0x78,0xE8,0x1E,0x1E,0x07,0x07,0x00,0xC0,0xC0,0x30,0x30, // 'W'
+ 0xF0,0x73,0x84,0x1C,0x81,0xD8,0x0F,0x00,0x60,0x07,0x00,0xB8,0x1B,0x81,0x1C,0x21,0xCE,0x0F, // 'X'
+ 0xF0,0x6E,0x08,0xE3,0x0C,0x40,0xD0,0x1A,0x01,0x80,0x30,0x06,0x00,0xC0,0x18,0x0F,0xC0, // 'Y'
+ 0x7F,0xE8,0x39,0x07,0x01,0xC0,0x70,0x0E,0x03,0x80,0xE0,0x1C,0x07,0x05,0xC0,0xFF,0xF0, // 'Z'
+ 0xFC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xF0, // '['
+ 0x40,0x30,0x08,0x06,0x01,0x00,0xC0,0x20,0x18,0x04,0x03,0x00,0x80,0x60,0x10, // '\'
+ 0xF3,0x33,0x33,0x33,0x33,0x33,0x33,0xF0, // ']'
+ 0x1C,0x0E,0x0D,0x86,0xC6,0x32,0x1B,0x06, // '^'
+ 0xFF,0x80, // '_'
+ 0xC3,0x0C, // '`'
+ 0x78,0x18,0x31,0xEC,0xD9,0xBF,0x37, // 'a'
+ 0xE0,0x30,0x18,0x0D,0xE7,0xF3,0x1D,0x86,0xC3,0x61,0xB0,0x98,0x8F,0x80, // 'b'
+ 0x1C,0xCB,0x16,0x0C,0x18,0x18,0x1E, // 'c'
+ 0x07,0x01,0x80,0xC0,0x61,0xF3,0x3B,0x0D,0x86,0xC3,0x71,0x9F,0xC7,0x70, // 'd'
+ 0x3C,0x8F,0x1F,0xFC,0x18,0x38,0x1F, // 'e'
+ 0x0C,0xF6,0x18,0x63,0xE6,0x18,0x61,0x86,0x18,0xF8, // 'f'
+ 0x3C,0x23,0xF1,0x98,0xCC,0x63,0xC1,0x01,0xFE,0xFF,0xA0,0xF0,0x78,0x3E,0x33,0xE0, // 'g'
+ 0xE0,0x30,0x18,0x0D,0xC7,0xF3,0x19,0x8C,0xC6,0x63,0x31,0x98,0xDE,0x70, // 'h'
+ 0x66,0x60,0x2E,0x66,0x66,0x66,0xF0, // 'i'
+ 0x33,0x30,0x17,0x33,0x33,0x33,0x33,0x33,0x2C, // 'j'
+ 0xE0,0x18,0x06,0x01,0x80,0x63,0x99,0x86,0xC1,0xF0,0x6E,0x1B,0xC6,0x7B,0xCF, // 'k'
+ 0xE6,0x66,0x66,0x66,0x66,0x6F, // 'l'
+ 0x6E,0x73,0xFF,0xE6,0x31,0x98,0xC6,0x63,0x19,0x8C,0x66,0x31,0x98,0xC6,0xF7,0x9C, // 'm'
+ 0x2E,0x7F,0x98,0xCC,0x66,0x33,0x19,0x8C,0xC6,0xF3,0x80, // 'n'
+ 0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xC3,0x66,0x3C, // 'o'
+ 0x2F,0x7F,0x98,0xEC,0x36,0x1B,0x0D,0x84,0xC4,0x7C,0x30,0x18,0x0C,0x06,0x07,0x80, // 'p'
+ 0x1F,0x33,0xB0,0xD8,0x6C,0x37,0x19,0xFC,0xF6,0x03,0x01,0x80,0xC0,0x60,0x78, // 'q'
+ 0x2F,0xF6,0x58,0x61,0x86,0x18,0xF8, // 'r'
+ 0x7B,0x2C,0x3C,0x7C,0x78,0xE3,0xF8, // 's'
+ 0x23,0x18,0xCF,0xB1,0x8C,0x63,0x1E,0x60, // 't'
+ 0x21,0x73,0x98,0xCC,0x66,0x33,0x19,0x8C,0xFE,0x3B,0x80, // 'u'
+ 0x71,0x8C,0x43,0x10,0xEC,0x1A,0x07,0x81,0xC0,0x30, // 'v'
+ 0xF9,0x9E,0x63,0x18,0xC7,0x21,0x96,0x43,0xAD,0x83,0x9E,0x07,0x1C,0x0C,0x38,0x18,0x20, // 'w'
+ 0xE1,0x99,0x0F,0x03,0x81,0xC0,0xF0,0xD8,0x4E,0xC3,0x80, // 'x'
+ 0xF3,0xB0,0x9C,0x46,0x43,0x21,0xE0,0x70,0x30,0x08,0x04,0x04,0x12,0x0E,0x00, // 'y'
+ 0x7F,0x46,0x0E,0x1C,0x18,0x30,0x71,0xFF, // 'z'
+ 0x18,0xC3,0x0C,0x30,0xC3,0x10,0x30,0xC3,0x0C,0x30,0xC1,0x80, // '{'
+ 0xFF,0xFF,0xFF,0xC0, // '|'
+ 0x60,0xC3,0x0C,0x30,0xC3,0x02,0x30,0xC3,0x0C,0x30,0xC6,0x00 // '}'
+};
+const GFXglyph URW_Palladio_L_Bold_18Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 6, 0, 0 }, // ' '
+ { 1, 3, 12, 6, 1, -12 }, // '!'
+ { 6, 7, 6, 8, 0, -12 }, // '"'
+ { 12, 9, 12, 10, 0, -12 }, // '#'
+ { 26, 8, 15, 10, 1, -13 }, // '$'
+ { 41, 14, 12, 17, 1, -12 }, // '%'
+ { 62, 13, 12, 16, 1, -12 }, // '&'
+ { 82, 2, 6, 5, 1, -12 }, // '''
+ { 84, 4, 15, 7, 1, -13 }, // '('
+ { 92, 4, 15, 7, 1, -13 }, // ')'
+ { 100, 6, 5, 9, 1, -12 }, // '*'
+ { 104, 10, 10, 12, 1, -10 }, // '+'
+ { 117, 4, 6, 6, 0, -3 }, // ','
+ { 120, 6, 2, 7, 0, -6 }, // '-'
+ { 122, 3, 3, 6, 1, -3 }, // '.'
+ { 124, 5, 13, 6, 0, -13 }, // '/'
+ { 133, 7, 12, 10, 1, -12 }, // '0'
+ { 144, 7, 12, 10, 1, -12 }, // '1'
+ { 155, 8, 12, 10, 1, -12 }, // '2'
+ { 167, 8, 12, 10, 0, -12 }, // '3'
+ { 179, 9, 12, 10, 0, -12 }, // '4'
+ { 193, 8, 12, 10, 0, -12 }, // '5'
+ { 205, 7, 12, 10, 1, -12 }, // '6'
+ { 216, 8, 12, 10, 1, -12 }, // '7'
+ { 228, 7, 12, 10, 1, -12 }, // '8'
+ { 239, 7, 12, 10, 1, -12 }, // '9'
+ { 250, 3, 8, 6, 1, -8 }, // ':'
+ { 253, 3, 11, 6, 0, -8 }, // ';'
+ { 258, 9, 10, 12, 1, -10 }, // '<'
+ { 270, 9, 6, 12, 1, -8 }, // '='
+ { 277, 9, 10, 12, 1, -10 }, // '>'
+ { 289, 6, 12, 9, 1, -12 }, // '?'
+ { 298, 12, 12, 14, 1, -12 }, // '@'
+ { 316, 14, 12, 15, 0, -12 }, // 'A'
+ { 337, 10, 12, 13, 0, -12 }, // 'B'
+ { 352, 11, 12, 14, 1, -12 }, // 'C'
+ { 369, 14, 12, 16, 0, -12 }, // 'D'
+ { 390, 10, 12, 12, 0, -12 }, // 'E'
+ { 405, 9, 12, 11, 0, -12 }, // 'F'
+ { 419, 13, 12, 16, 1, -12 }, // 'G'
+ { 439, 14, 12, 16, 0, -12 }, // 'H'
+ { 460, 6, 12, 8, 0, -12 }, // 'I'
+ { 469, 6, 16, 8, 0, -12 }, // 'J'
+ { 481, 13, 12, 15, 0, -12 }, // 'K'
+ { 501, 10, 12, 12, 0, -12 }, // 'L'
+ { 516, 17, 12, 19, 0, -12 }, // 'M'
+ { 542, 14, 12, 16, 0, -12 }, // 'N'
+ { 563, 13, 12, 16, 1, -12 }, // 'O'
+ { 583, 10, 12, 12, 0, -12 }, // 'P'
+ { 598, 13, 15, 16, 1, -12 }, // 'Q'
+ { 623, 12, 12, 14, 0, -12 }, // 'R'
+ { 641, 9, 12, 12, 1, -12 }, // 'S'
+ { 655, 10, 12, 13, 1, -12 }, // 'T'
+ { 670, 14, 12, 15, 0, -12 }, // 'U'
+ { 691, 14, 12, 15, 0, -12 }, // 'V'
+ { 712, 18, 12, 19, 0, -12 }, // 'W'
+ { 739, 12, 12, 13, 0, -12 }, // 'X'
+ { 757, 11, 12, 13, 0, -12 }, // 'Y'
+ { 774, 11, 12, 13, 0, -12 }, // 'Z'
+ { 791, 4, 15, 7, 1, -13 }, // '['
+ { 799, 9, 13, 12, 1, -13 }, // '\'
+ { 814, 4, 15, 7, 1, -13 }, // ']'
+ { 822, 9, 7, 12, 1, -12 }, // '^'
+ { 830, 9, 1, 10, 0, 1 }, // '_'
+ { 832, 5, 3, 7, 0, -12 }, // '`'
+ { 834, 7, 8, 10, 1, -8 }, // 'a'
+ { 841, 9, 12, 12, 1, -12 }, // 'b'
+ { 855, 7, 8, 9, 1, -8 }, // 'c'
+ { 862, 9, 12, 12, 1, -12 }, // 'd'
+ { 876, 7, 8, 10, 1, -8 }, // 'e'
+ { 883, 6, 13, 8, 1, -13 }, // 'f'
+ { 893, 9, 14, 11, 1, -9 }, // 'g'
+ { 909, 9, 12, 12, 1, -12 }, // 'h'
+ { 923, 4, 13, 7, 1, -13 }, // 'i'
+ { 930, 4, 18, 7, 0, -13 }, // 'j'
+ { 939, 10, 12, 12, 1, -12 }, // 'k'
+ { 954, 4, 12, 7, 1, -12 }, // 'l'
+ { 960, 14, 9, 17, 1, -9 }, // 'm'
+ { 976, 9, 9, 12, 1, -9 }, // 'n'
+ { 987, 8, 9, 11, 1, -9 }, // 'o'
+ { 996, 9, 14, 12, 1, -9 }, // 'p'
+ { 1012, 9, 13, 12, 1, -8 }, // 'q'
+ { 1027, 6, 9, 8, 1, -9 }, // 'r'
+ { 1034, 6, 9, 9, 1, -9 }, // 's'
+ { 1041, 5, 12, 7, 1, -12 }, // 't'
+ { 1049, 9, 9, 12, 1, -9 }, // 'u'
+ { 1060, 10, 8, 11, 0, -8 }, // 'v'
+ { 1070, 15, 9, 16, 0, -9 }, // 'w'
+ { 1087, 9, 9, 10, 0, -9 }, // 'x'
+ { 1098, 9, 13, 11, 0, -8 }, // 'y'
+ { 1113, 8, 8, 10, 0, -8 }, // 'z'
+ { 1121, 6, 15, 7, 0, -14 }, // '{'
+ { 1133, 2, 13, 12, 5, -13 }, // '|'
+ { 1137, 6, 15, 7, 0, -14 } // '}'
+};
+const GFXfont URW_Palladio_L_Bold_18 PROGMEM = {
+(uint8_t *)URW_Palladio_L_Bold_18Bitmaps,(GFXglyph *)URW_Palladio_L_Bold_18Glyphs,0x20, 0x7E, 24};
+
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Lato_Hairline_16Bitmaps[] PROGMEM = {
+
+ // Bitmap Data:
+ 0x00, // ' '
+ 0x55,0x55,0x07, // '!'
+ 0xB6,0xDA, // '"'
+ 0x12,0x12,0x12,0xFF,0x24,0x24,0x24,0x24,0xFF,0x48,0x48,0x48, // '#'
+ 0x08,0x08,0x1C,0x6A,0x48,0x48,0x48,0x30,0x0E,0x12,0x11,0x12,0xD2,0x3C,0x10,0x10, // '$'
+ 0x60,0x53,0x12,0x22,0x44,0x88,0xA1,0xA8,0x09,0x70,0x51,0x12,0x24,0x44,0x88,0xA0,0xE0, // '%'
+ 0x1C,0x04,0x40,0x88,0x10,0x02,0x00,0x60,0x12,0x24,0x24,0x82,0x90,0x23,0x0A,0x1E,0x30, // '&'
+ 0xF8, // '''
+ 0x25,0x29,0x24,0x92,0x24,0x88, // '('
+ 0x91,0x24,0x49,0x25,0x25,0x20, // ')'
+ 0x27,0x4D,0xD2,0x00, // '*'
+ 0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10, // '+'
+ 0x76, // ','
+ 0xF0, // '-'
+ 0x70, // '.'
+ 0x04,0x20,0x82,0x10,0x42,0x08,0x41,0x04,0x20,0x80, // '/'
+ 0x18,0x66,0x82,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // '0'
+ 0x10,0xC5,0x24,0x10,0x41,0x04,0x10,0x41,0x3F, // '1'
+ 0x18,0x66,0x42,0x81,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0xFF, // '2'
+ 0x18,0x66,0x42,0x82,0x02,0x06,0x1E,0x02,0x01,0x81,0x42,0x3C, // '3'
+ 0x02,0x01,0x01,0x81,0x41,0x21,0x10,0x88,0x84,0xFF,0x81,0x00,0x80,0x40, // '4'
+ 0x3E,0x41,0x02,0x04,0x0F,0x80,0x81,0x02,0x06,0x0B,0xE0, // '5'
+ 0x04,0x08,0x08,0x10,0x20,0x7E,0x42,0x81,0x81,0x81,0x42,0x3C, // '6'
+ 0xFF,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x60, // '7'
+ 0x18,0x66,0x42,0x82,0x42,0x66,0x7E,0x82,0x81,0x81,0x42,0x3C, // '8'
+ 0x18,0x66,0x82,0x81,0x83,0x66,0x1E,0x04,0x08,0x18,0x10,0x20, // '9'
+ 0x70,0x01,0xC0, // ':'
+ 0x70,0x01,0xD8, // ';'
+ 0x06,0x30,0x86,0x03,0x01,0x80,0x80, // '<'
+ 0xFF,0x00,0xFF, // '='
+ 0xC0,0xC0,0x81,0x19,0x88,0x00, // '>'
+ 0x74,0x42,0x10,0x88,0x84,0x00,0x08,0xC0, // '?'
+ 0x1F,0x82,0x06,0x40,0x24,0x79,0x88,0x99,0x11,0x91,0x19,0x12,0x93,0x24,0xCC,0x20,0x01,0x8E,0x07,0x00, // '@'
+ 0x04,0x00,0x80,0x28,0x05,0x01,0x20,0x22,0x04,0x41,0x04,0x3F,0x88,0x09,0x01,0x40,0x30, // 'A'
+ 0xF9,0x0A,0x0C,0x18,0x30,0xBF,0x41,0x83,0x06,0x0F,0xE0, // 'B'
+ 0x0E,0x0C,0x74,0x01,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x10,0x02,0x0C,0x7C, // 'C'
+ 0xFC,0x20,0xC8,0x0A,0x02,0x80,0x60,0x18,0x06,0x01,0x80,0xA0,0x28,0x13,0xF8, // 'D'
+ 0xFF,0x02,0x04,0x08,0x10,0x3F,0x40,0x81,0x02,0x07,0xF0, // 'E'
+ 0xFF,0x02,0x04,0x08,0x10,0x3F,0x40,0x81,0x02,0x04,0x00, // 'F'
+ 0x0F,0x0C,0x34,0x01,0x00,0x80,0x20,0x08,0x02,0x07,0x80,0x50,0x12,0x04,0x7E, // 'G'
+ 0x80,0xC0,0x60,0x30,0x18,0x0C,0x07,0xFF,0x01,0x80,0xC0,0x60,0x30,0x10, // 'H'
+ 0xFF,0xF0, // 'I'
+ 0x08,0x42,0x10,0x84,0x21,0x08,0x43,0xE0, // 'J'
+ 0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x81,0x20,0x88,0x42,0x20,0x90,0x30, // 'K'
+ 0x82,0x08,0x20,0x82,0x08,0x20,0x82,0x08,0x3F, // 'L'
+ 0x80,0x30,0x07,0x01,0xD0,0x5A,0x0B,0x22,0x64,0x4C,0x51,0x8A,0x30,0x86,0x00,0xC0,0x10, // 'M'
+ 0x80,0xC0,0x70,0x34,0x19,0x0C,0x86,0x23,0x09,0x84,0xC1,0x60,0x70,0x10, // 'N'
+ 0x0E,0x06,0x31,0x01,0x20,0x18,0x03,0x00,0x60,0x0C,0x01,0x80,0x28,0x08,0x82,0x0F,0x80, // 'O'
+ 0xF1,0x1A,0x0C,0x18,0x30,0xA3,0x78,0x81,0x02,0x04,0x00, // 'P'
+ 0x0E,0x03,0x18,0x40,0x44,0x02,0x80,0x28,0x02,0x80,0x28,0x02,0x80,0x24,0x04,0x20,0xC1,0xF8,0x00,0x40,0x02,0x00,0x30, // 'Q'
+ 0xF8,0x84,0x82,0x82,0x82,0x8C,0xF0,0x90,0x88,0x84,0x82,0x81, // 'R'
+ 0x38,0x8E,0x04,0x04,0x06,0x03,0x01,0x02,0x06,0x1B,0xC0, // 'S'
+ 0xFF,0xC2,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20,0x08,0x02,0x00,0x80,0x20, // 'T'
+ 0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x42,0x3C, // 'U'
+ 0x80,0x28,0x09,0x01,0x20,0x42,0x08,0x41,0x04,0x40,0x88,0x0A,0x01,0x40,0x30,0x02,0x00, // 'V'
+ 0x80,0x81,0x40,0x81,0x41,0x81,0x41,0x42,0x22,0x42,0x22,0x22,0x22,0x24,0x14,0x24,0x14,0x14,0x14,0x18,0x08,0x18,0x08,0x08, // 'W'
+ 0x80,0x50,0x22,0x10,0x44,0x12,0x03,0x00,0xC0,0x28,0x11,0x08,0x44,0x0B,0x01, // 'X'
+ 0x80,0x50,0x24,0x10,0x84,0x12,0x05,0x00,0xC0,0x20,0x08,0x02,0x00,0x80,0x20, // 'Y'
+ 0xFF,0x01,0x02,0x06,0x04,0x08,0x10,0x10,0x20,0x40,0x80,0xFF, // 'Z'
+ 0xF2,0x49,0x24,0x92,0x49,0x38, // '['
+ 0x82,0x08,0x10,0x40,0x82,0x04,0x10,0x40,0x82,0x04, // '\'
+ 0xE4,0x92,0x49,0x24,0x92,0x78, // ']'
+ 0x10,0x30,0x61,0x24,0x58,0x40, // '^'
+ 0xFE, // '_'
+ 0x89,0x80, // '`'
+ 0x33,0x20,0x41,0x7E,0x18,0x63,0x74, // 'a'
+ 0x81,0x02,0x04,0xCE,0x78,0x60,0xC1,0x83,0x07,0x0D,0xE0, // 'b'
+ 0x38,0x8A,0x04,0x08,0x10,0x20,0x23,0x3C, // 'c'
+ 0x02,0x04,0x09,0xD4,0x70,0x60,0xC1,0x83,0x05,0x19,0xD0, // 'd'
+ 0x38,0x8A,0x0C,0x1F,0xF0,0x20,0x21,0x3C, // 'e'
+ 0x1C,0x82,0x3F,0x20,0x82,0x08,0x20,0x82,0x08, // 'f'
+ 0x3E,0x8A,0x14,0x24,0xCE,0x20,0x20,0xFF,0x06,0x0B,0xE0, // 'g'
+ 0x81,0x02,0x04,0xCE,0x58,0x60,0xC1,0x83,0x06,0x0C,0x10, // 'h'
+ 0xB2,0xAA,0xAA, // 'i'
+ 0x23,0x02,0x22,0x22,0x22,0x22,0x22,0xE0, // 'j'
+ 0x81,0x02,0x04,0x38,0x92,0x28,0x70,0xB1,0x32,0x34,0x30, // 'k'
+ 0xAA,0xAA,0xAA, // 'l'
+ 0x91,0x9D,0xCA,0x10,0xC2,0x18,0x43,0x08,0x61,0x0C,0x21,0x84,0x20, // 'm'
+ 0x99,0xCB,0x0C,0x18,0x30,0x60,0xC1,0x82, // 'n'
+ 0x38,0x8A,0x0C,0x18,0x30,0x60,0xA1,0x3C, // 'o'
+ 0x99,0xCF,0x0C,0x18,0x30,0x60,0xE1,0xFD,0x02,0x04,0x00, // 'p'
+ 0x3A,0x8E,0x0C,0x18,0x30,0x60,0xA3,0x3A,0x04,0x08,0x10, // 'q'
+ 0x9F,0x31,0x08,0x42,0x10,0x80, // 'r'
+ 0x36,0x61,0x07,0x04,0x31,0x70, // 's'
+ 0x42,0x11,0xE4,0x21,0x08,0x42,0x12,0xE0, // 't'
+ 0x83,0x06,0x0C,0x18,0x30,0x60,0xA3,0x3A, // 'u'
+ 0x81,0x41,0x42,0x22,0x24,0x24,0x14,0x18,0x08, // 'v'
+ 0x82,0x14,0x21,0x46,0x14,0x52,0x25,0x22,0x92,0x28,0xC1,0x0C,0x10,0x80, // 'w'
+ 0x82,0x42,0x24,0x28,0x10,0x18,0x24,0x42,0xC3, // 'x'
+ 0x81,0x41,0x42,0x22,0x22,0x24,0x14,0x18,0x08,0x10,0x10,0x30, // 'y'
+ 0xFC,0x10,0x84,0x20,0x84,0x20,0xFC, // 'z'
+ 0x74,0x44,0x44,0x4C,0x44,0x44,0x44,0x30, // '{'
+ 0xFF,0xFF, // '|'
+ 0xC2,0x22,0x44,0x43,0x44,0x22,0x24,0x80 // '}'
+};
+const GFXglyph Lato_Hairline_16Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+ { 0, 1, 1, 7, 0, 0 }, // ' '
+ { 1, 2, 12, 6, 1, -12 }, // '!'
+ { 4, 3, 5, 7, 1, -12 }, // '"'
+ { 6, 8, 12, 11, 1, -12 }, // '#'
+ { 18, 8, 16, 11, 1, -14 }, // '$'
+ { 34, 11, 12, 14, 1, -12 }, // '%'
+ { 51, 11, 12, 13, 1, -12 }, // '&'
+ { 68, 1, 5, 5, 1, -12 }, // '''
+ { 69, 3, 15, 6, 1, -13 }, // '('
+ { 75, 3, 15, 6, 1, -13 }, // ')'
+ { 81, 5, 5, 9, 1, -12 }, // '*'
+ { 85, 8, 8, 11, 1, -10 }, // '+'
+ { 93, 2, 4, 5, 1, -2 }, // ','
+ { 94, 4, 1, 8, 1, -5 }, // '-'
+ { 95, 2, 2, 6, 1, -2 }, // '.'
+ { 96, 6, 13, 9, 1, -12 }, // '/'
+ { 106, 8, 12, 11, 1, -12 }, // '0'
+ { 118, 6, 12, 11, 2, -12 }, // '1'
+ { 127, 8, 12, 11, 1, -12 }, // '2'
+ { 139, 8, 12, 11, 1, -12 }, // '3'
+ { 151, 9, 12, 11, 0, -12 }, // '4'
+ { 165, 7, 12, 11, 1, -12 }, // '5'
+ { 176, 8, 12, 11, 1, -12 }, // '6'
+ { 188, 8, 12, 11, 1, -12 }, // '7'
+ { 200, 8, 12, 11, 1, -12 }, // '8'
+ { 212, 8, 12, 11, 1, -12 }, // '9'
+ { 224, 2, 9, 6, 1, -9 }, // ':'
+ { 227, 2, 11, 6, 1, -9 }, // ';'
+ { 230, 7, 7, 11, 1, -9 }, // '<'
+ { 237, 8, 3, 11, 1, -7 }, // '='
+ { 240, 6, 7, 11, 2, -9 }, // '>'
+ { 246, 5, 12, 9, 1, -12 }, // '?'
+ { 254, 12, 13, 15, 1, -11 }, // '@'
+ { 274, 11, 12, 12, 0, -12 }, // 'A'
+ { 291, 7, 12, 12, 2, -12 }, // 'B'
+ { 302, 10, 12, 13, 1, -12 }, // 'C'
+ { 317, 10, 12, 14, 2, -12 }, // 'D'
+ { 332, 7, 12, 11, 2, -12 }, // 'E'
+ { 343, 7, 12, 11, 2, -12 }, // 'F'
+ { 354, 10, 12, 14, 1, -12 }, // 'G'
+ { 369, 9, 12, 14, 2, -12 }, // 'H'
+ { 383, 1, 12, 6, 2, -12 }, // 'I'
+ { 385, 5, 12, 9, 0, -12 }, // 'J'
+ { 393, 9, 12, 12, 2, -12 }, // 'K'
+ { 407, 6, 12, 10, 2, -12 }, // 'L'
+ { 416, 11, 12, 16, 2, -12 }, // 'M'
+ { 433, 9, 12, 14, 2, -12 }, // 'N'
+ { 447, 11, 12, 15, 1, -12 }, // 'O'
+ { 464, 7, 12, 11, 2, -12 }, // 'P'
+ { 475, 12, 15, 15, 1, -12 }, // 'Q'
+ { 498, 8, 12, 11, 2, -12 }, // 'R'
+ { 510, 7, 12, 10, 1, -12 }, // 'S'
+ { 521, 10, 12, 11, 0, -12 }, // 'T'
+ { 536, 8, 12, 14, 2, -12 }, // 'U'
+ { 548, 11, 12, 12, 0, -12 }, // 'V'
+ { 565, 16, 12, 18, 0, -12 }, // 'W'
+ { 589, 10, 12, 12, 0, -12 }, // 'X'
+ { 604, 10, 12, 11, 0, -12 }, // 'Y'
+ { 619, 8, 12, 12, 1, -12 }, // 'Z'
+ { 631, 3, 15, 7, 2, -13 }, // '['
+ { 637, 6, 13, 9, 1, -12 }, // '\'
+ { 647, 3, 15, 7, 1, -13 }, // ']'
+ { 653, 7, 6, 11, 1, -12 }, // '^'
+ { 659, 7, 1, 9, 0, 1 }, // '_'
+ { 660, 3, 3, 8, 2, -12 }, // '`'
+ { 662, 6, 9, 10, 1, -9 }, // 'a'
+ { 669, 7, 12, 11, 1, -12 }, // 'b'
+ { 680, 7, 9, 9, 1, -9 }, // 'c'
+ { 688, 7, 12, 11, 1, -12 }, // 'd'
+ { 699, 7, 9, 10, 1, -9 }, // 'e'
+ { 707, 6, 12, 7, 0, -12 }, // 'f'
+ { 716, 7, 12, 10, 1, -9 }, // 'g'
+ { 727, 7, 12, 11, 1, -12 }, // 'h'
+ { 738, 2, 12, 5, 1, -12 }, // 'i'
+ { 741, 4, 15, 5, -1, -12 }, // 'j'
+ { 749, 7, 12, 9, 1, -12 }, // 'k'
+ { 760, 2, 12, 5, 1, -12 }, // 'l'
+ { 763, 11, 9, 15, 1, -9 }, // 'm'
+ { 776, 7, 9, 11, 1, -9 }, // 'n'
+ { 784, 7, 9, 11, 1, -9 }, // 'o'
+ { 792, 7, 12, 11, 1, -9 }, // 'p'
+ { 803, 7, 12, 11, 1, -9 }, // 'q'
+ { 814, 5, 9, 8, 1, -9 }, // 'r'
+ { 820, 5, 9, 9, 1, -9 }, // 's'
+ { 826, 5, 12, 7, 1, -12 }, // 't'
+ { 834, 7, 9, 11, 1, -9 }, // 'u'
+ { 842, 8, 9, 10, 0, -9 }, // 'v'
+ { 851, 12, 9, 14, 0, -9 }, // 'w'
+ { 865, 8, 9, 9, 0, -9 }, // 'x'
+ { 874, 8, 12, 10, 0, -9 }, // 'y'
+ { 886, 6, 9, 9, 1, -9 }, // 'z'
+ { 893, 4, 15, 7, 1, -13 }, // '{'
+ { 901, 1, 16, 6, 2, -13 }, // '|'
+ { 903, 4, 15, 7, 1, -13 } // '}'
+};
+const GFXfont Lato_Hairline_16 PROGMEM = {
+(uint8_t *)Lato_Hairline_16Bitmaps,(GFXglyph *)Lato_Hairline_16Glyphs,0x20, 0x7E, 20};
+
+
+
+const uint8_t sourcesans8pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0x60, 0x99, 0x99, 0x12, 0x12, 0x3F, 0x24, 0x24, 0x24, 0xFC,
+ 0x24, 0x48, 0x48, 0x10, 0x47, 0xB1, 0x83, 0x07, 0x06, 0x04, 0x18, 0x5E,
+ 0x10, 0x60, 0x89, 0x10, 0x91, 0x09, 0x20, 0x92, 0xE9, 0x5B, 0x69, 0x10,
+ 0x91, 0x11, 0x11, 0x11, 0x20, 0xE0, 0x30, 0x48, 0x48, 0x58, 0x70, 0x61,
+ 0xF3, 0x9A, 0x8E, 0xCE, 0x79, 0xF0, 0x09, 0x29, 0x24, 0x92, 0x24, 0x88,
+ 0x09, 0x22, 0x49, 0x24, 0xA4, 0xA0, 0x25, 0x5C, 0xE5, 0x00, 0x21, 0x09,
+ 0xF2, 0x10, 0x80, 0xD8, 0xE0, 0xC0, 0x00, 0x44, 0x21, 0x08, 0x84, 0x22,
+ 0x10, 0x84, 0x42, 0x00, 0x79, 0x28, 0x61, 0x86, 0x18, 0x61, 0x49, 0xE0,
+ 0xE1, 0x08, 0x42, 0x10, 0x84, 0x27, 0xC0, 0x79, 0x98, 0x10, 0x20, 0xC1,
+ 0x04, 0x10, 0x41, 0xFC, 0x79, 0x10, 0x43, 0x30, 0x30, 0x41, 0x8D, 0xE0,
+ 0x18, 0x62, 0x8A, 0x4A, 0x2F, 0xC2, 0x08, 0x20, 0x7E, 0x08, 0x20, 0xF8,
+ 0x30, 0x41, 0x8D, 0xE0, 0x39, 0x0C, 0x20, 0xBB, 0x18, 0x61, 0x4C, 0xE0,
+ 0xFC, 0x20, 0x84, 0x10, 0x42, 0x08, 0x20, 0x80, 0x39, 0x14, 0x51, 0x39,
+ 0x28, 0x61, 0xC5, 0xE0, 0x73, 0x28, 0x61, 0x8D, 0xD0, 0x43, 0x09, 0xC0,
+ 0xC3, 0xC1, 0xC0, 0x00, 0x37, 0x20, 0xE0, 0x70, 0x40, 0xFC, 0x00, 0x00,
+ 0xFC, 0x03, 0x03, 0x81, 0x1F, 0x88, 0x00, 0x74, 0x42, 0x11, 0x10, 0x84,
+ 0x01, 0x08, 0x0F, 0x83, 0x06, 0x60, 0x24, 0x71, 0x89, 0x19, 0x11, 0x91,
+ 0x19, 0x32, 0x8D, 0xC4, 0x00, 0x60, 0x01, 0xF0, 0x18, 0x18, 0x1C, 0x24,
+ 0x24, 0x24, 0x66, 0x7E, 0x42, 0xC3, 0x81, 0xF9, 0x1A, 0x14, 0x28, 0xDF,
+ 0x21, 0xC1, 0x83, 0x0F, 0xF0, 0x3C, 0xC7, 0x04, 0x08, 0x10, 0x20, 0x40,
+ 0xC0, 0xC4, 0xF0, 0xF8, 0x86, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82,
+ 0x86, 0xF8, 0xFE, 0x08, 0x20, 0x83, 0xE8, 0x20, 0x82, 0x0F, 0xC0, 0xFE,
+ 0x08, 0x20, 0x83, 0xE8, 0x20, 0x82, 0x08, 0x00, 0x1E, 0x61, 0x40, 0x80,
+ 0x80, 0x87, 0x81, 0x81, 0x41, 0x61, 0x1E, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0xE0, 0x08, 0x42, 0x10, 0x84,
+ 0x21, 0x0C, 0x5C, 0x87, 0x1A, 0x64, 0x8B, 0x1E, 0x36, 0x44, 0x85, 0x0E,
+ 0x08, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x3E, 0xC1, 0xE0, 0xF0, 0x74,
+ 0x5A, 0x2D, 0x16, 0x53, 0x29, 0x88, 0xC4, 0x60, 0x20, 0x81, 0xC1, 0xE1,
+ 0xA1, 0x91, 0x99, 0x89, 0x85, 0x87, 0x83, 0x81, 0x3C, 0x42, 0x42, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x3C, 0xFD, 0x0E, 0x0C, 0x18, 0x7F,
+ 0x20, 0x40, 0x81, 0x02, 0x00, 0x3C, 0x42, 0x42, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0xC3, 0x42, 0x3C, 0x18, 0x0C, 0x07, 0xFC, 0x86, 0x82, 0x82, 0x86,
+ 0xFC, 0x88, 0x8C, 0x84, 0x86, 0x82, 0x3E, 0x63, 0x40, 0x40, 0x30, 0x1E,
+ 0x07, 0x01, 0x01, 0xC3, 0x3C, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08,
+ 0x10, 0x20, 0x40, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x42, 0x3C, 0x81, 0x81, 0x42, 0x42, 0x42, 0x24, 0x24, 0x24, 0x38, 0x18,
+ 0x18, 0x86, 0x18, 0x61, 0x86, 0x14, 0xD2, 0x4D, 0x24, 0x92, 0x49, 0x25,
+ 0x8A, 0x38, 0xC3, 0x0C, 0x30, 0xC0, 0x43, 0x62, 0x24, 0x34, 0x18, 0x18,
+ 0x1C, 0x24, 0x26, 0x42, 0x43, 0x82, 0x89, 0x13, 0x62, 0x85, 0x04, 0x08,
+ 0x10, 0x20, 0x40, 0xFE, 0x08, 0x30, 0x41, 0x82, 0x08, 0x30, 0x41, 0x83,
+ 0xF8, 0xF2, 0x49, 0x24, 0x92, 0x49, 0xC0, 0x81, 0x04, 0x10, 0x20, 0x82,
+ 0x04, 0x10, 0x20, 0x82, 0x04, 0x00, 0xE4, 0x92, 0x49, 0x24, 0x93, 0xC0,
+ 0x30, 0xC3, 0x12, 0x4A, 0x30, 0xFF, 0xCC, 0x78, 0x10, 0x4F, 0xC6, 0x18,
+ 0xDD, 0x81, 0x02, 0x05, 0xEC, 0x50, 0x60, 0xC1, 0x83, 0x8A, 0xE0, 0x79,
+ 0x08, 0x20, 0x82, 0x04, 0x1E, 0x04, 0x10, 0x5F, 0x46, 0x18, 0x61, 0x87,
+ 0x37, 0x40, 0x39, 0x38, 0x7F, 0x82, 0x04, 0x0E, 0x34, 0x44, 0xE4, 0x44,
+ 0x44, 0x44, 0x7F, 0x9A, 0x14, 0x2C, 0xCF, 0x20, 0x3E, 0x83, 0x07, 0x13,
+ 0xC0, 0x82, 0x08, 0x2E, 0xC6, 0x18, 0x61, 0x86, 0x18, 0x40, 0xBF, 0xC0,
+ 0x20, 0x92, 0x49, 0x24, 0x9E, 0x82, 0x08, 0x22, 0x9A, 0xCA, 0x34, 0x9A,
+ 0x28, 0xC0, 0xAA, 0xAA, 0xAC, 0xB9, 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43,
+ 0x08, 0x61, 0x0C, 0x21, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x61, 0x38, 0x8A,
+ 0x0C, 0x18, 0x30, 0x51, 0x1C, 0xBD, 0x8A, 0x0C, 0x18, 0x30, 0x71, 0x5C,
+ 0x81, 0x02, 0x00, 0x7D, 0x18, 0x61, 0x86, 0x1C, 0xDD, 0x04, 0x10, 0x40,
+ 0xBC, 0x88, 0x88, 0x88, 0x74, 0x20, 0xC3, 0x86, 0x3E, 0x44, 0xF4, 0x44,
+ 0x44, 0x43, 0x86, 0x18, 0x61, 0x86, 0x18, 0xDD, 0xC2, 0x8D, 0x13, 0x22,
+ 0x45, 0x0E, 0x0C, 0x86, 0x30, 0xC5, 0x29, 0x25, 0x24, 0x94, 0x52, 0x8A,
+ 0x61, 0x8C, 0x44, 0xC8, 0xA0, 0xC3, 0x85, 0x11, 0x23, 0xC2, 0x89, 0x11,
+ 0x22, 0x87, 0x06, 0x08, 0x10, 0x61, 0x80, 0x7C, 0x30, 0x84, 0x30, 0x84,
+ 0x3F, 0x69, 0x24, 0x94, 0x49, 0x24, 0xC0, 0xFF, 0xFF, 0xC9, 0x24, 0x91,
+ 0x49, 0x25, 0x80, 0xE0, 0x70 };
+
+const GFXglyph sourcesans8pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 3, 0, 0 }, // 0x20 ' '
+ { 1, 1, 11, 5, 1, -10 }, // 0x21 '!'
+ { 3, 4, 4, 7, 1, -10 }, // 0x22 '"'
+ { 5, 8, 10, 8, 0, -9 }, // 0x23 '#'
+ { 15, 6, 13, 8, 1, -11 }, // 0x24 '$'
+ { 25, 12, 11, 13, 1, -10 }, // 0x25 '%'
+ { 42, 8, 11, 10, 1, -10 }, // 0x26 '&'
+ { 53, 1, 4, 4, 1, -10 }, // 0x27 '''
+ { 54, 3, 15, 5, 1, -11 }, // 0x28 '('
+ { 60, 3, 15, 5, 0, -11 }, // 0x29 ')'
+ { 66, 5, 5, 7, 1, -11 }, // 0x2A '*'
+ { 70, 5, 7, 8, 1, -8 }, // 0x2B '+'
+ { 75, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 76, 3, 1, 5, 1, -4 }, // 0x2D '-'
+ { 77, 1, 2, 4, 1, -1 }, // 0x2E '.'
+ { 78, 5, 15, 6, 0, -11 }, // 0x2F '/'
+ { 88, 6, 10, 8, 1, -9 }, // 0x30 '0'
+ { 96, 5, 10, 8, 2, -9 }, // 0x31 '1'
+ { 103, 7, 10, 8, 0, -9 }, // 0x32 '2'
+ { 112, 6, 10, 8, 1, -9 }, // 0x33 '3'
+ { 120, 6, 10, 8, 1, -9 }, // 0x34 '4'
+ { 128, 6, 10, 8, 1, -9 }, // 0x35 '5'
+ { 136, 6, 10, 8, 1, -9 }, // 0x36 '6'
+ { 144, 6, 10, 8, 1, -9 }, // 0x37 '7'
+ { 152, 6, 10, 8, 1, -9 }, // 0x38 '8'
+ { 160, 6, 10, 8, 1, -9 }, // 0x39 '9'
+ { 168, 1, 8, 4, 1, -7 }, // 0x3A ':'
+ { 169, 1, 11, 4, 1, -7 }, // 0x3B ';'
+ { 171, 6, 7, 8, 1, -8 }, // 0x3C '<'
+ { 177, 6, 5, 8, 1, -7 }, // 0x3D '='
+ { 181, 6, 7, 8, 1, -8 }, // 0x3E '>'
+ { 187, 5, 11, 7, 1, -10 }, // 0x3F '?'
+ { 194, 12, 12, 14, 1, -9 }, // 0x40 '@'
+ { 212, 8, 11, 9, 0, -10 }, // 0x41 'A'
+ { 223, 7, 11, 9, 1, -10 }, // 0x42 'B'
+ { 233, 7, 11, 9, 1, -10 }, // 0x43 'C'
+ { 243, 8, 11, 10, 1, -10 }, // 0x44 'D'
+ { 254, 6, 11, 8, 1, -10 }, // 0x45 'E'
+ { 263, 6, 11, 8, 1, -10 }, // 0x46 'F'
+ { 272, 8, 11, 10, 1, -10 }, // 0x47 'G'
+ { 283, 8, 11, 10, 1, -10 }, // 0x48 'H'
+ { 294, 1, 11, 4, 1, -10 }, // 0x49 'I'
+ { 296, 5, 11, 8, 1, -10 }, // 0x4A 'J'
+ { 303, 7, 11, 9, 1, -10 }, // 0x4B 'K'
+ { 313, 5, 11, 8, 1, -10 }, // 0x4C 'L'
+ { 320, 9, 11, 12, 1, -10 }, // 0x4D 'M'
+ { 333, 8, 11, 10, 1, -10 }, // 0x4E 'N'
+ { 344, 8, 11, 11, 1, -10 }, // 0x4F 'O'
+ { 355, 7, 11, 9, 1, -10 }, // 0x50 'P'
+ { 365, 8, 14, 11, 1, -10 }, // 0x51 'Q'
+ { 379, 8, 11, 9, 1, -10 }, // 0x52 'R'
+ { 390, 8, 11, 9, 0, -10 }, // 0x53 'S'
+ { 401, 7, 11, 9, 1, -10 }, // 0x54 'T'
+ { 411, 8, 11, 10, 1, -10 }, // 0x55 'U'
+ { 422, 8, 11, 8, 0, -10 }, // 0x56 'V'
+ { 433, 12, 11, 13, 0, -10 }, // 0x57 'W'
+ { 450, 8, 11, 8, 0, -10 }, // 0x58 'X'
+ { 461, 7, 11, 8, 0, -10 }, // 0x59 'Y'
+ { 471, 7, 11, 9, 1, -10 }, // 0x5A 'Z'
+ { 481, 3, 14, 5, 2, -11 }, // 0x5B '['
+ { 487, 6, 14, 6, 0, -10 }, // 0x5C '\'
+ { 498, 3, 14, 5, 1, -11 }, // 0x5D ']'
+ { 504, 6, 6, 8, 1, -10 }, // 0x5E '^'
+ { 509, 8, 1, 8, 0, 2 }, // 0x5F '_'
+ { 510, 3, 2, 9, 3, -10 }, // 0x60 '`'
+ { 511, 6, 8, 8, 1, -7 }, // 0x61 'a'
+ { 517, 7, 11, 9, 1, -10 }, // 0x62 'b'
+ { 527, 6, 8, 7, 1, -7 }, // 0x63 'c'
+ { 533, 6, 11, 9, 1, -10 }, // 0x64 'd'
+ { 542, 6, 8, 8, 1, -7 }, // 0x65 'e'
+ { 548, 4, 12, 5, 1, -11 }, // 0x66 'f'
+ { 554, 7, 12, 8, 1, -7 }, // 0x67 'g'
+ { 565, 6, 11, 9, 1, -10 }, // 0x68 'h'
+ { 574, 1, 10, 4, 1, -9 }, // 0x69 'i'
+ { 576, 3, 13, 4, -1, -9 }, // 0x6A 'j'
+ { 581, 6, 11, 8, 1, -10 }, // 0x6B 'k'
+ { 590, 2, 11, 4, 1, -10 }, // 0x6C 'l'
+ { 593, 11, 8, 13, 1, -7 }, // 0x6D 'm'
+ { 604, 6, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 610, 7, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 617, 7, 11, 9, 1, -7 }, // 0x70 'p'
+ { 627, 6, 11, 9, 1, -7 }, // 0x71 'q'
+ { 636, 4, 8, 6, 1, -7 }, // 0x72 'r'
+ { 640, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 645, 4, 10, 5, 1, -9 }, // 0x74 't'
+ { 650, 6, 8, 9, 1, -7 }, // 0x75 'u'
+ { 656, 7, 8, 7, 0, -7 }, // 0x76 'v'
+ { 663, 11, 8, 11, 0, -7 }, // 0x77 'w'
+ { 674, 7, 8, 7, 0, -7 }, // 0x78 'x'
+ { 681, 7, 11, 7, 0, -7 }, // 0x79 'y'
+ { 691, 6, 8, 7, 0, -7 }, // 0x7A 'z'
+ { 697, 3, 14, 5, 1, -11 }, // 0x7B '{'
+ { 703, 1, 16, 4, 1, -11 }, // 0x7C '|'
+ { 705, 3, 14, 5, 1, -11 }, // 0x7D '}'
+ { 711, 6, 2, 8, 1, -5 } }; // 0x7E '~'
+
+const GFXfont sourcesans8pt7b PROGMEM = {
+ (uint8_t *)sourcesans8pt7bBitmaps,
+ (GFXglyph *)sourcesans8pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+
+const uint8_t sourcesans10pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xC0, 0xDE, 0xF7, 0xBD, 0x80, 0x22, 0x22, 0xFF,
+ 0xFF, 0x22, 0x22, 0xFF, 0xFF, 0x44, 0x44, 0x44, 0x44, 0x30, 0x61, 0xF6,
+ 0x2C, 0x18, 0x38, 0x38, 0x1C, 0x1C, 0x18, 0x38, 0xFF, 0x9E, 0x18, 0x78,
+ 0x10, 0xFC, 0x20, 0xCC, 0x20, 0xCC, 0x40, 0xCC, 0x9C, 0xCC, 0xBE, 0xCD,
+ 0x77, 0x7A, 0x63, 0x32, 0x63, 0x04, 0x63, 0x08, 0x63, 0x08, 0x7F, 0x10,
+ 0x3E, 0x1E, 0x03, 0xE0, 0xCC, 0x19, 0x83, 0x60, 0x38, 0x0E, 0x1B, 0x62,
+ 0xC6, 0xD8, 0x73, 0x8F, 0x3F, 0xB3, 0xC2, 0xFF, 0xC0, 0x11, 0x22, 0x64,
+ 0xCC, 0xCC, 0xCC, 0xC4, 0x62, 0x21, 0x00, 0x88, 0x44, 0x62, 0x33, 0x33,
+ 0x33, 0x32, 0x64, 0x48, 0x00, 0x10, 0x21, 0xF1, 0xC2, 0x88, 0x80, 0x30,
+ 0xC3, 0x3F, 0xFC, 0xC3, 0x0C, 0x33, 0x36, 0xC0, 0xFF, 0xFC, 0x00, 0x03,
+ 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30,
+ 0x60, 0x60, 0x60, 0xC0, 0x00, 0x3C, 0x7E, 0x66, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x7E, 0x3C, 0x71, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0x30, 0xC3, 0x3F, 0xFC, 0x3C, 0x3F, 0x31, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0xFC, 0x1E, 0x1F, 0x98,
+ 0xE0, 0x30, 0x18, 0x1C, 0x38, 0x1E, 0x03, 0x80, 0xC0, 0x60, 0x3C, 0x31,
+ 0xF0, 0x06, 0x0E, 0x16, 0x16, 0x26, 0x46, 0x86, 0xFF, 0xFF, 0x06, 0x06,
+ 0x06, 0x06, 0x3F, 0x18, 0x0C, 0x07, 0xC3, 0xF1, 0x1C, 0x06, 0x03, 0x01,
+ 0x80, 0xF0, 0xC7, 0x80, 0x1F, 0x18, 0x98, 0x18, 0x0C, 0xE6, 0xFB, 0x8F,
+ 0x83, 0xC1, 0xF0, 0xD8, 0xEF, 0xE1, 0xE0, 0xFE, 0x0C, 0x10, 0x60, 0x83,
+ 0x06, 0x08, 0x30, 0x60, 0xC1, 0x80, 0x1C, 0x3E, 0x63, 0x63, 0x63, 0x32,
+ 0x1C, 0x2E, 0xC3, 0xC3, 0xC3, 0xE3, 0x7E, 0x3C, 0x3C, 0x7E, 0xE6, 0xC3,
+ 0xC3, 0xC3, 0xE7, 0x7F, 0x3B, 0x03, 0x02, 0x06, 0x44, 0x78, 0xFC, 0x03,
+ 0xF0, 0xFC, 0x00, 0xFF, 0x80, 0x00, 0x07, 0x1C, 0xF0, 0xC0, 0x70, 0x1E,
+ 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE0, 0x38, 0x0F, 0x03,
+ 0x0E, 0x70, 0xC0, 0x7D, 0x0C, 0x18, 0x30, 0xC3, 0x04, 0x18, 0x00, 0x00,
+ 0xC1, 0x83, 0x00, 0x03, 0xF0, 0x0F, 0xF8, 0x1C, 0x1C, 0x38, 0x06, 0x70,
+ 0x06, 0x63, 0x83, 0xE7, 0xA3, 0xC6, 0x63, 0xCC, 0x63, 0xCC, 0x63, 0xCC,
+ 0x66, 0xCF, 0xFE, 0xE7, 0x38, 0x70, 0x00, 0x38, 0x00, 0x1F, 0xE0, 0x07,
+ 0xC0, 0x0E, 0x01, 0x40, 0x28, 0x0D, 0x81, 0xB0, 0x22, 0x0C, 0x61, 0x8C,
+ 0x3F, 0x8F, 0xF9, 0x83, 0x30, 0x6C, 0x06, 0xFC, 0x7F, 0xB0, 0xD8, 0x6C,
+ 0x37, 0xE3, 0xFD, 0x87, 0xC1, 0xE0, 0xF0, 0xFF, 0xEF, 0xE0, 0x0F, 0x0F,
+ 0xE7, 0x09, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x18, 0x07, 0x0C,
+ 0xFE, 0x0F, 0x00, 0xFE, 0x3F, 0xCC, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xF0, 0x6C, 0x3B, 0xFC, 0xFC, 0x00, 0xFF, 0x83, 0x06, 0x0C,
+ 0x18, 0x3F, 0x60, 0xC1, 0x83, 0x06, 0x0F, 0xE0, 0xFF, 0x83, 0x06, 0x0C,
+ 0x18, 0x3F, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x00, 0x1F, 0x0F, 0xE7, 0x0B,
+ 0x80, 0xC0, 0x30, 0x0C, 0x3F, 0x03, 0xC0, 0xD8, 0x37, 0x0C, 0xFF, 0x1F,
+ 0x00, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xC7, 0x7E, 0x3C, 0xC1,
+ 0xB0, 0xCC, 0x63, 0x18, 0xCC, 0x37, 0x0F, 0xC3, 0x98, 0xC2, 0x30, 0xCC,
+ 0x1B, 0x06, 0xC0, 0xC0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1,
+ 0x83, 0x06, 0x0F, 0xE0, 0xE0, 0xFC, 0x1F, 0x83, 0xF8, 0x7D, 0x17, 0xA2,
+ 0xF4, 0x5E, 0x53, 0xCA, 0x79, 0x4F, 0x11, 0xE2, 0x3C, 0x06, 0xC0, 0xF8,
+ 0x3F, 0x0F, 0x43, 0xD8, 0xF2, 0x3C, 0xCF, 0x13, 0xC6, 0xF0, 0xBC, 0x3F,
+ 0x07, 0xC0, 0xC0, 0x1F, 0x83, 0xFC, 0x70, 0xE6, 0x06, 0xC0, 0x3C, 0x03,
+ 0xC0, 0x3C, 0x03, 0xC0, 0x36, 0x06, 0x70, 0xE3, 0xFC, 0x1F, 0x80, 0xFE,
+ 0x7F, 0xB0, 0xF8, 0x3C, 0x1E, 0x1F, 0xF9, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x00, 0x0F, 0x03, 0xFC, 0x70, 0xE6, 0x06, 0xC0, 0x3C, 0x03, 0xC0,
+ 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0x60, 0x67, 0x0E, 0x1F, 0x80, 0x60, 0x03,
+ 0x00, 0x1F, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E, 0x1B, 0xF9, 0x98, 0xC6,
+ 0x63, 0x30, 0xD8, 0x6C, 0x18, 0x1F, 0x0F, 0xE7, 0x09, 0x80, 0x60, 0x0E,
+ 0x00, 0xF0, 0x0E, 0x00, 0xC0, 0x36, 0x1D, 0xFE, 0x1F, 0x00, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36,
+ 0x19, 0xFE, 0x3F, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x30, 0x62, 0x0C, 0x63,
+ 0x0C, 0x60, 0x8C, 0x19, 0x03, 0x60, 0x2C, 0x07, 0x00, 0xE0, 0xC1, 0x03,
+ 0xC1, 0x83, 0x43, 0x86, 0x62, 0x86, 0x62, 0x86, 0x62, 0x46, 0x66, 0x4C,
+ 0x24, 0x4C, 0x34, 0x4C, 0x34, 0x2C, 0x3C, 0x38, 0x38, 0x38, 0x18, 0x38,
+ 0x60, 0x98, 0x63, 0x10, 0x4C, 0x1A, 0x03, 0x80, 0xC0, 0x78, 0x12, 0x0C,
+ 0xC2, 0x19, 0x86, 0x40, 0xC0, 0xC0, 0xD8, 0x26, 0x18, 0x84, 0x33, 0x04,
+ 0x81, 0xE0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x00, 0x7F, 0x81,
+ 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x10, 0x18, 0x18, 0x0F,
+ 0xF8, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x80, 0x80, 0x40, 0x40,
+ 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,
+ 0x01, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x18, 0x38, 0x24, 0x24,
+ 0x66, 0x42, 0x42, 0xFF, 0xFF, 0xF0, 0xC8, 0x80, 0x3C, 0x7E, 0x03, 0x1F,
+ 0x7F, 0xE3, 0xC3, 0xC7, 0xFF, 0x7B, 0xC0, 0xC0, 0xC0, 0xC0, 0xDC, 0xE6,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xFC, 0x1E, 0x3F, 0x60, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0x61, 0x1E, 0x01, 0x80, 0xC0, 0x60, 0x33, 0xFB,
+ 0x1D, 0x87, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x36, 0x39, 0xEC, 0x3E, 0x3F,
+ 0xB0, 0x7F, 0xFF, 0xFE, 0x03, 0x00, 0xC2, 0x7F, 0x0F, 0x00, 0x3D, 0xF6,
+ 0x18, 0x63, 0xCF, 0x18, 0x61, 0x86, 0x18, 0x61, 0x86, 0x00, 0x3F, 0x9F,
+ 0xEE, 0x63, 0x0C, 0xC3, 0x39, 0xC7, 0xE3, 0x70, 0xFF, 0x9F, 0xFC, 0x0F,
+ 0x07, 0xFF, 0x9F, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xF0, 0xFF, 0xFF, 0xF0, 0x33, 0x00,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3,
+ 0xC6, 0xCC, 0xD8, 0xD8, 0xFC, 0xE4, 0xC6, 0xC3, 0xC3, 0xDB, 0x6D, 0xB6,
+ 0xDB, 0x6C, 0xC0, 0xDE, 0x77, 0x3C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1,
+ 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x1C, 0x3F, 0x98, 0xD8, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0x63, 0x1F, 0x00, 0xDC, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xE6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x3D, 0xB1, 0xD8, 0x78,
+ 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0x63, 0x9E, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0xDF, 0xEE, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x00, 0x79, 0xFB, 0x16, 0x07,
+ 0x03, 0x81, 0xC3, 0xFC, 0xF0, 0x61, 0x8F, 0xBE, 0x61, 0x86, 0x18, 0x61,
+ 0x87, 0xCF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B,
+ 0xC1, 0xA0, 0xD8, 0x4C, 0x62, 0x31, 0x90, 0x58, 0x2C, 0x1C, 0x06, 0x00,
+ 0xC7, 0x0F, 0x1C, 0x36, 0x78, 0x99, 0xA6, 0x66, 0x98, 0x9A, 0x43, 0x6D,
+ 0x0F, 0x14, 0x3C, 0x60, 0x71, 0x80, 0x63, 0x31, 0x8D, 0x82, 0x81, 0xC0,
+ 0xE0, 0xD0, 0x4C, 0x63, 0x20, 0x80, 0xC1, 0xE0, 0x90, 0xCC, 0x62, 0x21,
+ 0x30, 0xD8, 0x28, 0x1C, 0x0E, 0x06, 0x07, 0x0F, 0x07, 0x00, 0xFF, 0xFC,
+ 0x30, 0x41, 0x06, 0x18, 0x20, 0xFF, 0xFC, 0x19, 0x8C, 0x63, 0x18, 0xDC,
+ 0xE1, 0x8C, 0x63, 0x18, 0xC6, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3,
+ 0x18, 0xC6, 0x31, 0x87, 0x3B, 0x18, 0xC6, 0x31, 0x8C, 0xC0, 0x60, 0xF1,
+ 0x8F, 0x06 };
+
+const GFXglyph sourcesans10pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 6, 2, -12 }, // 0x21 '!'
+ { 5, 5, 5, 9, 2, -13 }, // 0x22 '"'
+ { 9, 8, 12, 10, 1, -11 }, // 0x23 '#'
+ { 21, 7, 16, 10, 2, -14 }, // 0x24 '$'
+ { 35, 16, 13, 16, 1, -12 }, // 0x25 '%'
+ { 61, 11, 13, 12, 1, -12 }, // 0x26 '&'
+ { 79, 2, 5, 5, 2, -13 }, // 0x27 '''
+ { 81, 4, 19, 6, 2, -14 }, // 0x28 '('
+ { 91, 4, 19, 6, 1, -14 }, // 0x29 ')'
+ { 101, 7, 6, 8, 1, -13 }, // 0x2A '*'
+ { 107, 6, 8, 10, 2, -10 }, // 0x2B '+'
+ { 113, 4, 5, 5, 1, -1 }, // 0x2C ','
+ { 116, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 117, 2, 3, 5, 1, -2 }, // 0x2E '.'
+ { 118, 8, 19, 7, 0, -14 }, // 0x2F '/'
+ { 137, 8, 14, 10, 1, -13 }, // 0x30 '0'
+ { 151, 6, 13, 10, 3, -12 }, // 0x31 '1'
+ { 161, 9, 14, 10, 1, -13 }, // 0x32 '2'
+ { 177, 9, 14, 10, 0, -13 }, // 0x33 '3'
+ { 193, 8, 13, 10, 1, -12 }, // 0x34 '4'
+ { 206, 9, 12, 10, 0, -11 }, // 0x35 '5'
+ { 220, 9, 13, 10, 1, -12 }, // 0x36 '6'
+ { 235, 7, 12, 10, 2, -11 }, // 0x37 '7'
+ { 246, 8, 14, 10, 1, -13 }, // 0x38 '8'
+ { 260, 8, 14, 10, 1, -13 }, // 0x39 '9'
+ { 274, 2, 10, 5, 1, -9 }, // 0x3A ':'
+ { 277, 2, 13, 4, 1, -9 }, // 0x3B ';'
+ { 281, 8, 8, 10, 1, -10 }, // 0x3C '<'
+ { 289, 8, 6, 10, 1, -9 }, // 0x3D '='
+ { 295, 8, 8, 10, 1, -10 }, // 0x3E '>'
+ { 303, 7, 13, 8, 1, -12 }, // 0x3F '?'
+ { 315, 16, 17, 17, 1, -13 }, // 0x40 '@'
+ { 349, 11, 13, 11, 0, -12 }, // 0x41 'A'
+ { 367, 9, 13, 12, 2, -12 }, // 0x42 'B'
+ { 382, 10, 13, 11, 1, -12 }, // 0x43 'C'
+ { 399, 10, 13, 12, 2, -12 }, // 0x44 'D'
+ { 416, 7, 13, 11, 2, -12 }, // 0x45 'E'
+ { 428, 7, 13, 10, 2, -12 }, // 0x46 'F'
+ { 440, 10, 13, 12, 1, -12 }, // 0x47 'G'
+ { 457, 10, 13, 13, 2, -12 }, // 0x48 'H'
+ { 474, 2, 13, 5, 2, -12 }, // 0x49 'I'
+ { 478, 8, 13, 10, 0, -12 }, // 0x4A 'J'
+ { 491, 10, 13, 12, 2, -12 }, // 0x4B 'K'
+ { 508, 7, 13, 10, 2, -12 }, // 0x4C 'L'
+ { 520, 11, 13, 15, 2, -12 }, // 0x4D 'M'
+ { 538, 10, 13, 13, 2, -12 }, // 0x4E 'N'
+ { 555, 12, 13, 13, 1, -12 }, // 0x4F 'O'
+ { 575, 9, 13, 12, 2, -12 }, // 0x50 'P'
+ { 590, 12, 16, 13, 1, -12 }, // 0x51 'Q'
+ { 614, 9, 13, 12, 2, -12 }, // 0x52 'R'
+ { 629, 10, 13, 11, 0, -12 }, // 0x53 'S'
+ { 646, 8, 13, 11, 2, -12 }, // 0x54 'T'
+ { 659, 10, 13, 13, 2, -12 }, // 0x55 'U'
+ { 676, 11, 13, 10, 0, -12 }, // 0x56 'V'
+ { 694, 16, 13, 16, 0, -12 }, // 0x57 'W'
+ { 720, 10, 13, 10, 0, -12 }, // 0x58 'X'
+ { 737, 10, 13, 10, 0, -12 }, // 0x59 'Y'
+ { 754, 9, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 769, 3, 17, 6, 2, -13 }, // 0x5B '['
+ { 776, 8, 17, 7, 0, -13 }, // 0x5C '\'
+ { 793, 3, 17, 6, 1, -13 }, // 0x5D ']'
+ { 800, 8, 7, 10, 1, -12 }, // 0x5E '^'
+ { 807, 10, 2, 10, 0, 2 }, // 0x5F '_'
+ { 810, 3, 3, 11, 3, -13 }, // 0x60 '`'
+ { 812, 8, 10, 10, 1, -9 }, // 0x61 'a'
+ { 822, 8, 14, 11, 2, -13 }, // 0x62 'b'
+ { 836, 8, 10, 9, 1, -9 }, // 0x63 'c'
+ { 846, 9, 14, 11, 1, -13 }, // 0x64 'd'
+ { 862, 9, 10, 10, 1, -9 }, // 0x65 'e'
+ { 874, 6, 15, 6, 1, -14 }, // 0x66 'f'
+ { 886, 10, 14, 10, 1, -9 }, // 0x67 'g'
+ { 904, 8, 14, 11, 2, -13 }, // 0x68 'h'
+ { 918, 2, 14, 5, 1, -13 }, // 0x69 'i'
+ { 922, 4, 18, 5, 0, -13 }, // 0x6A 'j'
+ { 931, 8, 14, 10, 2, -13 }, // 0x6B 'k'
+ { 945, 3, 14, 5, 2, -13 }, // 0x6C 'l'
+ { 951, 13, 10, 17, 2, -9 }, // 0x6D 'm'
+ { 968, 8, 10, 11, 2, -9 }, // 0x6E 'n'
+ { 978, 9, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 990, 8, 14, 11, 2, -9 }, // 0x70 'p'
+ { 1004, 9, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1020, 6, 10, 7, 2, -9 }, // 0x72 'r'
+ { 1028, 7, 10, 8, 1, -9 }, // 0x73 's'
+ { 1037, 6, 12, 7, 1, -11 }, // 0x74 't'
+ { 1046, 8, 10, 11, 2, -9 }, // 0x75 'u'
+ { 1056, 9, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1068, 14, 10, 14, 0, -9 }, // 0x77 'w'
+ { 1086, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1098, 9, 14, 9, 1, -9 }, // 0x79 'y'
+ { 1114, 7, 10, 8, 1, -9 }, // 0x7A 'z'
+ { 1123, 5, 17, 6, 0, -13 }, // 0x7B '{'
+ { 1134, 2, 20, 5, 2, -14 }, // 0x7C '|'
+ { 1139, 5, 17, 6, 2, -13 }, // 0x7D '}'
+ { 1150, 8, 4, 10, 1, -8 } }; // 0x7E '~'
+
+const GFXfont sourcesans10pt7b PROGMEM = {
+ (uint8_t *)sourcesans10pt7bBitmaps,
+ (GFXglyph *)sourcesans10pt7bGlyphs,
+ 0x20, 0x7E, 26 };
+
+const uint8_t sourcesans9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0x0F, 0xDE, 0xF7, 0xBD, 0x80, 0x24, 0x48, 0x97, 0xF2,
+ 0x4D, 0xBF, 0xA4, 0x48, 0x91, 0x20, 0x18, 0x31, 0xF7, 0x2C, 0x18, 0x18,
+ 0x0C, 0x0E, 0x0C, 0x1C, 0x37, 0xC3, 0x00, 0x78, 0x43, 0x21, 0x0C, 0xC8,
+ 0x33, 0x20, 0xCD, 0x03, 0x35, 0xE7, 0xAC, 0xC1, 0x33, 0x04, 0xCC, 0x23,
+ 0x30, 0x84, 0x84, 0x1E, 0x1E, 0x06, 0x60, 0xCC, 0x19, 0x81, 0x60, 0x30,
+ 0x1E, 0x1F, 0x22, 0xC2, 0xD8, 0x71, 0x8F, 0x1F, 0x30, 0xFF, 0xC0, 0x12,
+ 0x26, 0x4C, 0xCC, 0xCC, 0xC4, 0x62, 0x21, 0x84, 0x46, 0x23, 0x33, 0x33,
+ 0x32, 0x64, 0x48, 0x21, 0x3E, 0xED, 0x80, 0x30, 0xC3, 0x3F, 0x30, 0xC3,
+ 0x00, 0x33, 0x64, 0xF0, 0xF0, 0x00, 0x08, 0x10, 0x20, 0x81, 0x02, 0x08,
+ 0x10, 0x40, 0x81, 0x04, 0x08, 0x20, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x71, 0x8C, 0x63, 0x18, 0xC6,
+ 0x31, 0xBE, 0x78, 0x8C, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x30,
+ 0x20, 0x7F, 0x3C, 0x66, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x03, 0x03, 0x03,
+ 0xC6, 0x7C, 0x0C, 0x18, 0xF1, 0x64, 0xD1, 0xA3, 0x7F, 0x0C, 0x18, 0x30,
+ 0x7E, 0x60, 0x60, 0x40, 0xFC, 0x46, 0x03, 0x03, 0x03, 0xC6, 0x7C, 0x3E,
+ 0x62, 0x60, 0xC0, 0xDC, 0xE7, 0xC3, 0xC3, 0x43, 0x66, 0x3C, 0xFC, 0x21,
+ 0x84, 0x30, 0xC2, 0x18, 0x61, 0x86, 0x00, 0x3E, 0x63, 0x63, 0x63, 0x32,
+ 0x1C, 0x2E, 0xC3, 0xC3, 0xC3, 0x63, 0x3C, 0x3C, 0x66, 0xC6, 0xC3, 0xC3,
+ 0xC3, 0x67, 0x3B, 0x03, 0x06, 0x46, 0x7C, 0xF0, 0x0F, 0xF0, 0x03, 0xF8,
+ 0x00, 0x0C, 0xE6, 0x0C, 0x07, 0x03, 0x80, 0xFE, 0x00, 0x00, 0x0F, 0xE0,
+ 0x01, 0x80, 0xE0, 0x30, 0x67, 0x38, 0x00, 0x7B, 0x30, 0xC3, 0x08, 0x41,
+ 0x0C, 0x00, 0x03, 0x0C, 0x07, 0xC0, 0x60, 0xC3, 0x01, 0x98, 0x07, 0x67,
+ 0x0F, 0x32, 0x3D, 0x88, 0xF6, 0x23, 0xD8, 0x8B, 0x66, 0x6C, 0xEF, 0x18,
+ 0x00, 0x60, 0x00, 0xE0, 0x00, 0xF8, 0x00, 0x0C, 0x03, 0x01, 0xE0, 0x48,
+ 0x12, 0x0C, 0xC3, 0x30, 0xFC, 0x61, 0x98, 0x64, 0x0B, 0x03, 0xFC, 0xC6,
+ 0xC6, 0xC6, 0xC4, 0xF8, 0xC6, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0x1F, 0x18,
+ 0xD8, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x30, 0x0C, 0x63, 0xE0,
+ 0xFC, 0x63, 0x30, 0xD8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xB1,
+ 0x9F, 0x80, 0xFF, 0x0C, 0x30, 0xC3, 0xEC, 0x30, 0xC3, 0x0C, 0x3F, 0xFF,
+ 0x0C, 0x30, 0xC3, 0x0F, 0xF0, 0xC3, 0x0C, 0x30, 0x1F, 0x8C, 0x26, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x1F, 0x03, 0xC0, 0xD8, 0x33, 0x0C, 0x7E, 0xC1,
+ 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 0xFF, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78,
+ 0x30, 0xFF, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0F, 0x33, 0xC0, 0xC1, 0x61, 0x31, 0x99, 0x8D, 0x87, 0xE3, 0xB1, 0xCC,
+ 0xC2, 0x61, 0xB0, 0x58, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0x3F, 0xC0, 0xF8, 0x7E, 0x1F, 0x87, 0xD2, 0xF4, 0xBD, 0x2F, 0x33,
+ 0xCC, 0xF3, 0x3C, 0x0F, 0x03, 0xC1, 0xF0, 0xF8, 0x7A, 0x3D, 0x1E, 0x4F,
+ 0x27, 0x8B, 0xC5, 0xE1, 0xF0, 0xF8, 0x30, 0x1E, 0x1C, 0xE6, 0x1B, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x63, 0x30, 0x78, 0xFC, 0xC7,
+ 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1E, 0x1C,
+ 0xE6, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18,
+ 0xFC, 0x0C, 0x01, 0x80, 0x3C, 0xFC, 0xC7, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC,
+ 0xC8, 0xCC, 0xC6, 0xC6, 0xC3, 0x3C, 0xE2, 0xC0, 0xC0, 0x60, 0x38, 0x0E,
+ 0x07, 0x03, 0x03, 0xC6, 0x7C, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC7, 0xC0, 0xC0, 0xD0, 0x36, 0x19, 0x86,
+ 0x21, 0x8C, 0xC3, 0x30, 0x4C, 0x16, 0x07, 0x80, 0xE0, 0x30, 0xC3, 0x0F,
+ 0x0C, 0x34, 0x30, 0x99, 0xC6, 0x64, 0x99, 0x92, 0x66, 0x49, 0x09, 0x24,
+ 0x38, 0x70, 0xE1, 0xC3, 0x86, 0x0E, 0x18, 0x41, 0x31, 0x88, 0x86, 0xC1,
+ 0xC0, 0x60, 0x70, 0x28, 0x36, 0x11, 0x98, 0xC8, 0x30, 0x40, 0x98, 0x62,
+ 0x10, 0xCC, 0x12, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xFF, 0x02, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x60, 0xC0, 0xFF,
+ 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB7, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08,
+ 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x81, 0x01, 0xED, 0xB6, 0xDB, 0x6D,
+ 0xB6, 0xDF, 0x10, 0x50, 0xA3, 0x64, 0x48, 0xB1, 0x80, 0xFF, 0x80, 0xC8,
+ 0x80, 0x7C, 0x8C, 0x18, 0xF6, 0x78, 0xF1, 0xE7, 0x76, 0xC0, 0x60, 0x30,
+ 0x18, 0x0D, 0xE7, 0x1B, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0,
+ 0x1E, 0xC5, 0x06, 0x0C, 0x18, 0x30, 0x31, 0x1E, 0x03, 0x03, 0x03, 0x03,
+ 0x3F, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, 0xC3,
+ 0xC3, 0xFF, 0xC0, 0xC0, 0x62, 0x3E, 0x39, 0x86, 0x18, 0xF1, 0x86, 0x18,
+ 0x61, 0x86, 0x18, 0x60, 0x7F, 0x62, 0x31, 0x98, 0xCE, 0xC3, 0xC3, 0x01,
+ 0x80, 0x7F, 0x60, 0xF0, 0x78, 0x67, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xDE,
+ 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0x30,
+ 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3E, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6,
+ 0xC4, 0xC8, 0xD8, 0xF8, 0xEC, 0xC4, 0xC6, 0xC3, 0xDB, 0x6D, 0xB6, 0xDB,
+ 0x6E, 0xDE, 0x77, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, 0x0C,
+ 0x78, 0x63, 0xC3, 0x18, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x66, 0x3C, 0xDE, 0x71,
+ 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xC6, 0xDE, 0x60, 0x30, 0x18, 0x0C,
+ 0x00, 0x3F, 0x63, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03,
+ 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, 0xC0, 0x7D, 0x8B, 0x07, 0x03, 0xC1,
+ 0xC1, 0xC3, 0x7C, 0x61, 0x8F, 0x18, 0x61, 0x86, 0x18, 0x61, 0x83, 0xC0,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0x43, 0x62,
+ 0x62, 0x26, 0x34, 0x34, 0x1C, 0x18, 0xC2, 0x1E, 0x38, 0xD9, 0x4C, 0xCA,
+ 0x66, 0x53, 0x14, 0xD0, 0xE2, 0x87, 0x1C, 0x38, 0xC0, 0x42, 0x66, 0x34,
+ 0x1C, 0x18, 0x3C, 0x24, 0x66, 0x42, 0x41, 0xA0, 0x98, 0xC4, 0x62, 0x21,
+ 0xB0, 0x58, 0x28, 0x0C, 0x06, 0x06, 0x02, 0x06, 0x00, 0xFC, 0x31, 0x84,
+ 0x31, 0x84, 0x30, 0xFC, 0x19, 0x8C, 0x63, 0x18, 0xD8, 0x31, 0x8C, 0x63,
+ 0x18, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xC3, 0x18, 0xC6, 0x31, 0x83,
+ 0x63, 0x18, 0xC6, 0x31, 0x98, 0xE3, 0x3C };
+
+const GFXglyph sourcesans9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 5, 2, -11 }, // 0x21 '!'
+ { 4, 5, 5, 8, 2, -12 }, // 0x22 '"'
+ { 8, 7, 11, 9, 1, -10 }, // 0x23 '#'
+ { 18, 7, 14, 9, 1, -12 }, // 0x24 '$'
+ { 31, 14, 12, 15, 1, -11 }, // 0x25 '%'
+ { 52, 11, 12, 11, 1, -11 }, // 0x26 '&'
+ { 69, 2, 5, 4, 2, -12 }, // 0x27 '''
+ { 71, 4, 16, 5, 1, -12 }, // 0x28 '('
+ { 79, 4, 16, 5, 1, -12 }, // 0x29 ')'
+ { 87, 5, 5, 8, 1, -12 }, // 0x2A '*'
+ { 91, 6, 7, 9, 2, -8 }, // 0x2B '+'
+ { 97, 4, 4, 4, 0, 0 }, // 0x2C ','
+ { 99, 4, 1, 6, 1, -4 }, // 0x2D '-'
+ { 100, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 101, 7, 16, 6, 0, -12 }, // 0x2F '/'
+ { 115, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 127, 5, 11, 9, 2, -10 }, // 0x31 '1'
+ { 134, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 146, 8, 12, 9, 1, -11 }, // 0x33 '3'
+ { 158, 7, 11, 9, 1, -10 }, // 0x34 '4'
+ { 168, 8, 11, 9, 1, -10 }, // 0x35 '5'
+ { 179, 8, 11, 9, 1, -10 }, // 0x36 '6'
+ { 190, 6, 11, 9, 2, -10 }, // 0x37 '7'
+ { 199, 8, 12, 9, 1, -11 }, // 0x38 '8'
+ { 211, 8, 12, 9, 1, -11 }, // 0x39 '9'
+ { 223, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 225, 2, 11, 4, 1, -7 }, // 0x3B ';'
+ { 228, 7, 8, 9, 1, -9 }, // 0x3C '<'
+ { 235, 7, 5, 9, 1, -7 }, // 0x3D '='
+ { 240, 7, 8, 9, 1, -9 }, // 0x3E '>'
+ { 247, 6, 12, 8, 1, -11 }, // 0x3F '?'
+ { 256, 14, 15, 15, 1, -11 }, // 0x40 '@'
+ { 283, 10, 12, 10, 0, -11 }, // 0x41 'A'
+ { 298, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 310, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 324, 9, 12, 11, 2, -11 }, // 0x44 'D'
+ { 338, 6, 12, 9, 2, -11 }, // 0x45 'E'
+ { 347, 6, 12, 9, 2, -11 }, // 0x46 'F'
+ { 356, 10, 12, 11, 1, -11 }, // 0x47 'G'
+ { 371, 9, 12, 12, 2, -11 }, // 0x48 'H'
+ { 385, 2, 12, 5, 2, -11 }, // 0x49 'I'
+ { 388, 7, 12, 9, 1, -11 }, // 0x4A 'J'
+ { 399, 9, 12, 10, 2, -11 }, // 0x4B 'K'
+ { 413, 6, 12, 9, 2, -11 }, // 0x4C 'L'
+ { 422, 10, 12, 13, 2, -11 }, // 0x4D 'M'
+ { 437, 9, 12, 12, 2, -11 }, // 0x4E 'N'
+ { 451, 10, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 466, 8, 12, 10, 2, -11 }, // 0x50 'P'
+ { 478, 10, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 497, 8, 12, 10, 2, -11 }, // 0x52 'R'
+ { 509, 8, 12, 10, 1, -11 }, // 0x53 'S'
+ { 521, 8, 12, 10, 1, -11 }, // 0x54 'T'
+ { 533, 9, 12, 12, 2, -11 }, // 0x55 'U'
+ { 547, 10, 12, 9, 0, -11 }, // 0x56 'V'
+ { 562, 14, 12, 14, 0, -11 }, // 0x57 'W'
+ { 583, 9, 12, 9, 0, -11 }, // 0x58 'X'
+ { 597, 10, 12, 9, 0, -11 }, // 0x59 'Y'
+ { 612, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 624, 3, 16, 5, 2, -12 }, // 0x5B '['
+ { 630, 7, 16, 6, 0, -12 }, // 0x5C '\'
+ { 644, 3, 16, 5, 1, -12 }, // 0x5D ']'
+ { 650, 7, 7, 9, 1, -11 }, // 0x5E '^'
+ { 657, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 659, 3, 3, 10, 3, -12 }, // 0x60 '`'
+ { 661, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 669, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 684, 7, 9, 8, 1, -8 }, // 0x63 'c'
+ { 692, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 705, 8, 9, 9, 1, -8 }, // 0x65 'e'
+ { 714, 6, 13, 5, 1, -12 }, // 0x66 'f'
+ { 724, 9, 13, 9, 1, -8 }, // 0x67 'g'
+ { 739, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 752, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 755, 4, 16, 4, 0, -11 }, // 0x6A 'j'
+ { 763, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 776, 3, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 781, 13, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 796, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 805, 8, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 814, 9, 13, 10, 1, -8 }, // 0x70 'p'
+ { 829, 8, 12, 10, 1, -8 }, // 0x71 'q'
+ { 841, 5, 9, 6, 1, -8 }, // 0x72 'r'
+ { 847, 7, 9, 8, 1, -8 }, // 0x73 's'
+ { 855, 6, 11, 6, 1, -10 }, // 0x74 't'
+ { 864, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 873, 8, 9, 8, 0, -8 }, // 0x76 'v'
+ { 882, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 897, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 906, 9, 13, 8, 0, -8 }, // 0x79 'y'
+ { 921, 6, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 928, 5, 16, 5, 0, -12 }, // 0x7B '{'
+ { 938, 2, 19, 4, 2, -13 }, // 0x7C '|'
+ { 943, 5, 16, 5, 1, -12 }, // 0x7D '}'
+ { 953, 7, 2, 9, 1, -6 } }; // 0x7E '~'
+
+const GFXfont sourcesans9pt7b PROGMEM = {
+ (uint8_t *)sourcesans9pt7bBitmaps,
+ (GFXglyph *)sourcesans9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1627 bytes
+const uint8_t sourcesans_semi9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xD5, 0x3F, 0xCF, 0x3C, 0xF3, 0xCC, 0x24, 0x4B, 0xFF, 0xF2,
+ 0x5F, 0xFF, 0xA4, 0x48, 0x91, 0x20, 0x18, 0x31, 0xFE, 0x2C, 0x1C, 0x1E,
+ 0x0E, 0x0E, 0x0E, 0x1F, 0xF7, 0xC3, 0x00, 0x78, 0x43, 0xF1, 0x0C, 0xC8,
+ 0x33, 0x20, 0xCD, 0x7B, 0x35, 0xE7, 0xAC, 0xDE, 0xB3, 0x04, 0xCC, 0x13,
+ 0x30, 0x8F, 0xC2, 0x1E, 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x6C, 0x0E, 0x07,
+ 0x8F, 0x76, 0xCF, 0x31, 0xE7, 0xFC, 0xF3, 0xFF, 0xC0, 0x32, 0x66, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0x66, 0x23, 0xC4, 0x66, 0x33, 0x33, 0x33, 0x33, 0x66,
+ 0x4C, 0x10, 0x21, 0xF1, 0xC2, 0x85, 0x00, 0x30, 0xCF, 0xFF, 0x30, 0xC0,
+ 0x33, 0x36, 0xC0, 0xFF, 0xFC, 0x00, 0x10, 0x82, 0x18, 0x41, 0x0C, 0x30,
+ 0x82, 0x18, 0x41, 0x08, 0x00, 0x3C, 0x7E, 0x66, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0x66, 0x7E, 0x3C, 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33,
+ 0xFF, 0xC0, 0x78, 0xFC, 0xCE, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x70,
+ 0xFF, 0xFF, 0x3E, 0x7F, 0x23, 0x03, 0x07, 0x1E, 0x1E, 0x03, 0x03, 0x43,
+ 0xFE, 0x3C, 0x0E, 0x1E, 0x1E, 0x36, 0x66, 0x46, 0xFF, 0xFF, 0x06, 0x06,
+ 0x06, 0x3E, 0x3E, 0x30, 0x60, 0x6C, 0x7E, 0x07, 0x03, 0x03, 0x47, 0x7E,
+ 0x3C, 0x1E, 0x7F, 0x62, 0xC0, 0xDC, 0xFE, 0xE3, 0xC3, 0xC3, 0x67, 0x7E,
+ 0x3C, 0xFF, 0xFC, 0x10, 0x60, 0x83, 0x06, 0x08, 0x30, 0x60, 0xC1, 0x80,
+ 0x38, 0xFB, 0x1E, 0x3E, 0x6F, 0x9F, 0x63, 0xC7, 0x8D, 0xF1, 0xC0, 0x38,
+ 0xFB, 0x36, 0x3C, 0x79, 0xDF, 0xBB, 0x06, 0x1B, 0xF3, 0xC0, 0xFC, 0x0F,
+ 0xC0, 0xFC, 0x03, 0xFE, 0x01, 0x0F, 0x3C, 0xE0, 0xE0, 0x7C, 0x0F, 0x01,
+ 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE0, 0x7C, 0x0F, 0x0F, 0x7C,
+ 0xE0, 0x80, 0x79, 0xFD, 0x18, 0x30, 0xE3, 0x86, 0x18, 0x30, 0x00, 0xC1,
+ 0x83, 0x00, 0x07, 0xC0, 0xFF, 0x8E, 0x0C, 0xE6, 0xB6, 0x7C, 0xE7, 0x67,
+ 0x33, 0x39, 0x91, 0xCC, 0x9E, 0x7F, 0xB9, 0x98, 0xC0, 0x07, 0x84, 0x1F,
+ 0xE0, 0x3E, 0x00, 0x0C, 0x07, 0x81, 0xE0, 0x48, 0x33, 0x0C, 0xC3, 0x31,
+ 0xFE, 0x7F, 0x98, 0x6C, 0x0F, 0x03, 0xFC, 0xFE, 0xC6, 0xC6, 0xFC, 0xFE,
+ 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0x1E, 0x1F, 0xDC, 0x5C, 0x0C, 0x06,
+ 0x03, 0x01, 0x80, 0xE0, 0x30, 0x9F, 0xE3, 0xC0, 0xF8, 0xFE, 0xC6, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC6, 0xFE, 0xF8, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x1F, 0xBF, 0x60, 0xC1, 0x83, 0xFF, 0xF0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F,
+ 0xBF, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x1E, 0x1F, 0xDC, 0x4C, 0x0C, 0x06,
+ 0x03, 0x1F, 0x8F, 0xC1, 0xB0, 0xDF, 0xE3, 0xE0, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0xFF, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xFF, 0x06,
+ 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x8D, 0xF1, 0xE0, 0xC3, 0x63,
+ 0x33, 0x99, 0x8D, 0x87, 0xC3, 0xF1, 0xDC, 0xC6, 0x63, 0xB0, 0xD8, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0xE0, 0xF8, 0x7E,
+ 0x1F, 0xC7, 0xF3, 0xF4, 0xBD, 0x2F, 0x7B, 0xCC, 0xF3, 0x3C, 0xCF, 0x03,
+ 0xC3, 0xE3, 0xE3, 0xF3, 0xD3, 0xDB, 0xDB, 0xCB, 0xCF, 0xC7, 0xC7, 0xC3,
+ 0x1E, 0x1F, 0xE6, 0x1B, 0x87, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xD8,
+ 0x67, 0xF0, 0x78, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0x1E, 0x0F, 0xF1, 0x86, 0x70, 0xEC, 0x0D, 0x81, 0xB0,
+ 0x36, 0x06, 0xC0, 0xCC, 0x30, 0xFC, 0x0F, 0x00, 0xE0, 0x0F, 0x80, 0xF8,
+ 0xFC, 0x7F, 0x31, 0xD8, 0x6C, 0x36, 0x3B, 0xF9, 0xF8, 0xCC, 0x63, 0x31,
+ 0xD8, 0x60, 0x1E, 0x1F, 0xD8, 0x4C, 0x07, 0x01, 0xF0, 0x3C, 0x07, 0x01,
+ 0xB0, 0xDF, 0xC7, 0xC0, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07,
+ 0x83, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC0, 0xF0, 0x36, 0x19, 0x86, 0x61,
+ 0x8C, 0xC3, 0x30, 0xCC, 0x1E, 0x07, 0x81, 0xE0, 0x70, 0xC3, 0x8F, 0x0E,
+ 0x3E, 0x38, 0xD8, 0xE2, 0x66, 0xD9, 0x9B, 0x66, 0x4D, 0x9D, 0x36, 0x3C,
+ 0xD0, 0xF1, 0xC3, 0xC7, 0x0E, 0x1C, 0x61, 0x98, 0xC3, 0x30, 0xD8, 0x1E,
+ 0x07, 0x01, 0xC0, 0x78, 0x37, 0x0C, 0xC6, 0x39, 0x86, 0x61, 0x98, 0x63,
+ 0x30, 0xCC, 0x1A, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xFF, 0xFF, 0x06, 0x0E, 0x0C, 0x18, 0x38, 0x30, 0x60, 0xE0, 0xFF, 0xFF,
+ 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB7, 0x01, 0x01, 0x02, 0x02, 0x04, 0x0C,
+ 0x08, 0x10, 0x30, 0x20, 0x40, 0x40, 0x81, 0x01, 0xED, 0xB6, 0xDB, 0x6D,
+ 0xB6, 0xDF, 0x18, 0x70, 0xA3, 0x66, 0x48, 0xF1, 0x80, 0xFF, 0xFF, 0xC0,
+ 0xC9, 0x80, 0x3D, 0xFC, 0x18, 0xF7, 0xFC, 0xF1, 0xFF, 0x76, 0xC0, 0xC0,
+ 0xC0, 0xDC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xDC, 0x3C, 0xFF,
+ 0x86, 0x0C, 0x18, 0x38, 0x3F, 0x3C, 0x03, 0x03, 0x03, 0x3B, 0x7F, 0xE3,
+ 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x3C, 0xFE, 0x1F, 0xFF, 0xF0, 0x30,
+ 0x3E, 0x3C, 0x3B, 0xD8, 0xCF, 0x79, 0x8C, 0x63, 0x18, 0xC6, 0x00, 0x7F,
+ 0xFF, 0xC6, 0xC6, 0x7E, 0x7C, 0xC0, 0xFE, 0x7F, 0xC3, 0xC3, 0xFE, 0x7C,
+ 0xC0, 0xC0, 0xC0, 0xDE, 0xFF, 0xE3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xF3, 0xFF, 0xFF, 0x33, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xDC, 0xD8, 0xF8, 0xEC, 0xCC, 0xC6, 0xC7,
+ 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xDE, 0x77, 0xFF, 0xF8, 0xE7, 0x86, 0x3C,
+ 0x31, 0xE1, 0x8F, 0x0C, 0x78, 0x63, 0xC3, 0x18, 0xDE, 0xFF, 0xE3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xC3, 0xE7,
+ 0x7E, 0x3C, 0xDC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0xDC, 0xC0,
+ 0xC0, 0xC0, 0x3B, 0x7F, 0xE3, 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x03,
+ 0x03, 0xDF, 0xF9, 0x8C, 0x63, 0x18, 0xC0, 0x7B, 0xFC, 0x38, 0x78, 0x38,
+ 0xFF, 0x78, 0x61, 0x8F, 0xBE, 0x61, 0x86, 0x18, 0x61, 0xE3, 0xC0, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xFF, 0x7B, 0xC1, 0xB1, 0x98, 0xCC,
+ 0x63, 0x61, 0xB0, 0xD8, 0x38, 0x1C, 0x00, 0xC3, 0x1E, 0x1C, 0xD9, 0xE4,
+ 0xCB, 0x66, 0x5B, 0x3A, 0xD8, 0xF3, 0x87, 0x1C, 0x38, 0xE0, 0x63, 0x76,
+ 0x36, 0x1C, 0x1C, 0x3C, 0x36, 0x66, 0x63, 0xC3, 0xC3, 0xC6, 0x66, 0x66,
+ 0x2C, 0x3C, 0x3C, 0x18, 0x18, 0x30, 0xF0, 0xE0, 0xFD, 0xF8, 0x70, 0xC3,
+ 0x0C, 0x38, 0x7F, 0xFE, 0x19, 0x8C, 0x63, 0x18, 0xDC, 0xE1, 0x8C, 0x63,
+ 0x18, 0xC3, 0xFF, 0xFF, 0xE0, 0xC3, 0x18, 0xC6, 0x31, 0x87, 0x3B, 0x18,
+ 0xC6, 0x31, 0x98, 0x60, 0xF2, 0x9E, 0x0C };
+
+const GFXglyph sourcesans_semi9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 6, 2, -11 }, // 0x21 '!'
+ { 4, 6, 5, 9, 1, -11 }, // 0x22 '"'
+ { 8, 7, 11, 9, 1, -10 }, // 0x23 '#'
+ { 18, 7, 14, 9, 1, -12 }, // 0x24 '$'
+ { 31, 14, 12, 15, 1, -11 }, // 0x25 '%'
+ { 52, 10, 12, 12, 1, -11 }, // 0x26 '&'
+ { 67, 2, 5, 5, 1, -11 }, // 0x27 '''
+ { 69, 4, 16, 6, 1, -12 }, // 0x28 '('
+ { 77, 4, 16, 6, 1, -12 }, // 0x29 ')'
+ { 85, 7, 6, 8, 0, -12 }, // 0x2A '*'
+ { 91, 6, 6, 9, 2, -8 }, // 0x2B '+'
+ { 96, 4, 5, 5, 1, -1 }, // 0x2C ','
+ { 99, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 100, 2, 3, 5, 1, -2 }, // 0x2E '.'
+ { 101, 6, 16, 6, 0, -12 }, // 0x2F '/'
+ { 113, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 125, 6, 11, 9, 2, -10 }, // 0x31 '1'
+ { 134, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 146, 8, 12, 9, 0, -11 }, // 0x33 '3'
+ { 158, 8, 11, 9, 0, -10 }, // 0x34 '4'
+ { 169, 8, 12, 9, 0, -11 }, // 0x35 '5'
+ { 181, 8, 12, 9, 1, -11 }, // 0x36 '6'
+ { 193, 7, 12, 9, 1, -11 }, // 0x37 '7'
+ { 204, 7, 12, 9, 1, -11 }, // 0x38 '8'
+ { 215, 7, 12, 9, 1, -11 }, // 0x39 '9'
+ { 226, 2, 9, 5, 1, -8 }, // 0x3A ':'
+ { 229, 2, 12, 4, 1, -8 }, // 0x3B ';'
+ { 232, 8, 8, 9, 1, -9 }, // 0x3C '<'
+ { 240, 8, 6, 9, 1, -8 }, // 0x3D '='
+ { 246, 8, 8, 9, 1, -9 }, // 0x3E '>'
+ { 254, 7, 13, 8, 0, -12 }, // 0x3F '?'
+ { 266, 13, 15, 16, 1, -11 }, // 0x40 '@'
+ { 291, 10, 12, 10, 0, -11 }, // 0x41 'A'
+ { 306, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 318, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 332, 8, 12, 11, 2, -11 }, // 0x44 'D'
+ { 344, 7, 12, 10, 2, -11 }, // 0x45 'E'
+ { 355, 7, 12, 9, 2, -11 }, // 0x46 'F'
+ { 366, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 380, 8, 12, 12, 2, -11 }, // 0x48 'H'
+ { 392, 2, 12, 5, 2, -11 }, // 0x49 'I'
+ { 395, 7, 12, 9, 0, -11 }, // 0x4A 'J'
+ { 406, 9, 12, 11, 2, -11 }, // 0x4B 'K'
+ { 420, 6, 12, 9, 2, -11 }, // 0x4C 'L'
+ { 429, 10, 12, 13, 2, -11 }, // 0x4D 'M'
+ { 444, 8, 12, 12, 2, -11 }, // 0x4E 'N'
+ { 456, 10, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 471, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 483, 11, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 504, 9, 12, 11, 2, -11 }, // 0x52 'R'
+ { 518, 9, 12, 10, 0, -11 }, // 0x53 'S'
+ { 532, 8, 12, 10, 1, -11 }, // 0x54 'T'
+ { 544, 9, 12, 12, 1, -11 }, // 0x55 'U'
+ { 558, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 573, 14, 12, 14, 0, -11 }, // 0x57 'W'
+ { 594, 10, 12, 10, 0, -11 }, // 0x58 'X'
+ { 609, 10, 12, 9, -1, -11 }, // 0x59 'Y'
+ { 624, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 636, 3, 16, 6, 2, -12 }, // 0x5B '['
+ { 642, 7, 16, 6, 0, -12 }, // 0x5C '\'
+ { 656, 3, 16, 6, 1, -12 }, // 0x5D ']'
+ { 662, 7, 7, 9, 1, -11 }, // 0x5E '^'
+ { 669, 9, 2, 9, 0, 1 }, // 0x5F '_'
+ { 672, 3, 3, 10, 3, -12 }, // 0x60 '`'
+ { 674, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 682, 8, 12, 10, 1, -11 }, // 0x62 'b'
+ { 694, 7, 9, 8, 1, -8 }, // 0x63 'c'
+ { 702, 8, 12, 10, 1, -11 }, // 0x64 'd'
+ { 714, 7, 9, 9, 2, -8 }, // 0x65 'e'
+ { 722, 5, 13, 6, 1, -12 }, // 0x66 'f'
+ { 731, 8, 13, 9, 1, -8 }, // 0x67 'g'
+ { 744, 8, 12, 10, 1, -11 }, // 0x68 'h'
+ { 756, 2, 12, 5, 1, -11 }, // 0x69 'i'
+ { 759, 4, 16, 5, -1, -11 }, // 0x6A 'j'
+ { 767, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 780, 3, 12, 5, 1, -11 }, // 0x6C 'l'
+ { 785, 13, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 800, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 809, 8, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 818, 8, 12, 10, 1, -8 }, // 0x70 'p'
+ { 830, 8, 11, 10, 1, -8 }, // 0x71 'q'
+ { 841, 5, 9, 7, 1, -8 }, // 0x72 'r'
+ { 847, 6, 9, 8, 1, -8 }, // 0x73 's'
+ { 854, 6, 11, 6, 1, -10 }, // 0x74 't'
+ { 863, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 872, 9, 9, 9, 0, -8 }, // 0x76 'v'
+ { 883, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 898, 8, 9, 9, 0, -8 }, // 0x78 'x'
+ { 907, 8, 13, 9, 1, -8 }, // 0x79 'y'
+ { 920, 7, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 928, 5, 16, 6, 0, -12 }, // 0x7B '{'
+ { 938, 1, 19, 5, 2, -13 }, // 0x7C '|'
+ { 941, 5, 16, 6, 1, -12 }, // 0x7D '}'
+ { 951, 8, 4, 9, 1, -7 } }; // 0x7E '~'
+
+const GFXfont sourcesans_semi9pt7b PROGMEM = {
+ (uint8_t *)sourcesans_semi9pt7bBitmaps,
+ (GFXglyph *)sourcesans_semi9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1627 bytes
+const uint8_t sourcesans_bold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFF, 0x1F, 0xF0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x42,
+ 0x24, 0x4B, 0xFF, 0xF2, 0x4D, 0xBF, 0xFF, 0x48, 0x91, 0x20, 0x18, 0x18,
+ 0x7E, 0xFF, 0xE2, 0xE0, 0xF0, 0x7C, 0x1E, 0x0F, 0x07, 0xC7, 0xFE, 0x7C,
+ 0x18, 0x18, 0x78, 0x21, 0xF8, 0xC3, 0x31, 0x06, 0x66, 0x0C, 0xC9, 0x99,
+ 0xB7, 0x9E, 0xD9, 0x99, 0x33, 0x06, 0x66, 0x08, 0xCC, 0x31, 0xF8, 0x41,
+ 0xE0, 0x0E, 0x01, 0xF0, 0x3B, 0x03, 0xB0, 0x3E, 0x01, 0xC7, 0x7C, 0x7F,
+ 0x6E, 0xE7, 0xCE, 0x3E, 0x7F, 0xF3, 0xE3, 0xFF, 0xFE, 0x80, 0x19, 0x9C,
+ 0xE6, 0x73, 0x9C, 0xE7, 0x38, 0xC7, 0x38, 0xC3, 0xC3, 0x1C, 0xE3, 0x1C,
+ 0xE7, 0x39, 0xCE, 0x67, 0x39, 0x98, 0x10, 0x23, 0xFB, 0xE3, 0x8D, 0x80,
+ 0x00, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0xDF, 0x97, 0xA0,
+ 0xFF, 0xFF, 0x80, 0x00, 0x86, 0x31, 0x8C, 0x46, 0x31, 0x88, 0x46, 0x31,
+ 0x88, 0x46, 0x31, 0x88, 0x00, 0x3C, 0x7E, 0x66, 0xE7, 0xE7, 0xE7, 0xE7,
+ 0xE7, 0xE7, 0x66, 0x7E, 0x3C, 0x79, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x3B,
+ 0xFF, 0xC0, 0x3C, 0x7F, 0x11, 0xC0, 0xE0, 0x70, 0x38, 0x38, 0x3C, 0x1C,
+ 0x1C, 0x1F, 0xEF, 0xF0, 0x1E, 0x3F, 0x88, 0xE0, 0x70, 0x78, 0xF0, 0x7C,
+ 0x07, 0x03, 0xA1, 0xFF, 0xC7, 0xC0, 0x0E, 0x1E, 0x3E, 0x2E, 0x6E, 0xCE,
+ 0xFF, 0xFF, 0x0E, 0x0E, 0x0E, 0x3F, 0x1F, 0x9C, 0x0E, 0x07, 0xE3, 0xF8,
+ 0x0E, 0x07, 0x43, 0xFF, 0x8F, 0x80, 0x1E, 0x7F, 0x72, 0xE0, 0xE0, 0xEE,
+ 0xFF, 0xE7, 0xE7, 0xE7, 0x7E, 0x3C, 0xFF, 0xF0, 0x86, 0x18, 0xC3, 0x1C,
+ 0x71, 0xC7, 0x00, 0x3C, 0x7E, 0xE7, 0xE7, 0xF7, 0x7C, 0x7E, 0xE7, 0xE7,
+ 0xE7, 0x7E, 0x3C, 0x3C, 0x7E, 0xE6, 0xE7, 0xE7, 0xE7, 0x7F, 0x37, 0x07,
+ 0x0E, 0xFE, 0x7C, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xE5, 0xE8,
+ 0x03, 0x0F, 0x7E, 0xF0, 0xF0, 0x7E, 0x0F, 0x03, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0x80, 0xF0, 0x7C, 0x0F, 0x0F, 0x7C, 0xF0, 0x80, 0x3C, 0xFF,
+ 0x47, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x00, 0x38, 0x38, 0x38, 0x07, 0xE0,
+ 0x7F, 0xC3, 0xC1, 0x9C, 0x02, 0x63, 0xE7, 0x9F, 0x9C, 0xEC, 0x73, 0x31,
+ 0xCC, 0xCF, 0x3D, 0xEE, 0x77, 0x18, 0x00, 0x78, 0x00, 0xFF, 0x00, 0xFC,
+ 0x00, 0x0E, 0x03, 0xE0, 0x6C, 0x0D, 0x83, 0xB8, 0x77, 0x0C, 0x63, 0xFE,
+ 0x7F, 0xCE, 0x3B, 0x83, 0xF0, 0x70, 0xFE, 0x3F, 0xEE, 0x3B, 0x8E, 0xE3,
+ 0xBF, 0xCF, 0xFB, 0x87, 0xE1, 0xF8, 0x7F, 0xFB, 0xFC, 0x1F, 0x0F, 0xE7,
+ 0x11, 0xC0, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xF0, 0x1C, 0x63, 0xFC, 0x7C,
+ 0xFE, 0x3F, 0xCE, 0x3B, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xF8,
+ 0xEF, 0xF3, 0xF8, 0xFF, 0xFF, 0x87, 0x0E, 0x1F, 0xBF, 0x70, 0xE1, 0xC3,
+ 0xFF, 0xF0, 0xFF, 0xFF, 0x87, 0x0E, 0x1F, 0xBF, 0x70, 0xE1, 0xC3, 0x87,
+ 0x00, 0x1F, 0x0F, 0xF7, 0x13, 0x80, 0xE0, 0x38, 0xFE, 0x3F, 0x87, 0xF1,
+ 0xDC, 0x73, 0xFC, 0x7E, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xFF, 0xFF,
+ 0xFF, 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x47, 0xFE, 0x3C,
+ 0xE3, 0xB8, 0xCE, 0x73, 0xB8, 0xFC, 0x3F, 0x0F, 0xE3, 0xDC, 0xE7, 0x38,
+ 0xEE, 0x3B, 0x87, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3,
+ 0xFF, 0xF0, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x9F, 0xF9, 0xFF, 0x9F, 0xEF,
+ 0x7E, 0xF7, 0xE6, 0x7E, 0x67, 0xE6, 0x7E, 0x07, 0xE1, 0xFC, 0x7F, 0x1F,
+ 0xE7, 0xF9, 0xFB, 0x7E, 0xDF, 0x9F, 0xE7, 0xF8, 0xFE, 0x3F, 0x87, 0x1F,
+ 0x07, 0xF1, 0xC7, 0x70, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xEE,
+ 0x38, 0xFE, 0x0F, 0x80, 0xFF, 0x3F, 0xEE, 0x3F, 0x87, 0xE1, 0xF8, 0xFF,
+ 0xFB, 0xFC, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0x1F, 0x07, 0xF1, 0xC7, 0x70,
+ 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xEE, 0x38, 0xFE, 0x0F, 0x80,
+ 0x70, 0x0F, 0xC0, 0x78, 0xFF, 0x3F, 0xEE, 0x3F, 0x87, 0xE1, 0xF8, 0xFF,
+ 0xFB, 0xFC, 0xE7, 0x38, 0xEE, 0x3B, 0x87, 0x3E, 0x3F, 0xB8, 0xDC, 0x0F,
+ 0x83, 0xF0, 0xFC, 0x0F, 0x03, 0xA1, 0xFF, 0xCF, 0xC0, 0xFF, 0xFC, 0xE1,
+ 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0xE1, 0xF8, 0x7E, 0x1F,
+ 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xDC, 0xE7, 0xF8, 0xFC, 0xE1,
+ 0xF8, 0x77, 0x39, 0xCE, 0x73, 0x8C, 0xC3, 0x30, 0xFC, 0x1E, 0x07, 0x81,
+ 0xE0, 0x70, 0xE3, 0x8F, 0xC7, 0x1F, 0x8E, 0x33, 0x1C, 0xE7, 0x7D, 0xCE,
+ 0xDB, 0x9D, 0xB7, 0x3B, 0x6C, 0x34, 0xD8, 0x79, 0xF0, 0xF1, 0xE1, 0xE3,
+ 0xC0, 0x71, 0xDC, 0xE3, 0x38, 0xEC, 0x1F, 0x07, 0x81, 0xE0, 0x7C, 0x3F,
+ 0x0C, 0xE7, 0x3B, 0x87, 0x60, 0xCE, 0x38, 0xC6, 0x1D, 0xC1, 0xB0, 0x3E,
+ 0x07, 0xC0, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xFF, 0xFF, 0x06,
+ 0x0E, 0x1C, 0x1C, 0x38, 0x30, 0x70, 0xE0, 0xFF, 0xFF, 0xFF, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0x08, 0x8C, 0xCC, 0x44, 0x46, 0x66, 0x62,
+ 0x22, 0x33, 0x31, 0x20, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFF,
+ 0x38, 0x38, 0x3C, 0x6C, 0x66, 0x66, 0xC6, 0xFF, 0xFF, 0xC0, 0x63, 0x3C,
+ 0x7E, 0x47, 0x1F, 0x7F, 0xE7, 0xE7, 0xFF, 0x7F, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0E, 0xE7, 0xFB, 0x8F, 0xC7, 0xE3, 0xF1, 0xF9, 0xFF, 0xED, 0xE0, 0x1E,
+ 0x7E, 0xF0, 0xE0, 0xE0, 0xE0, 0xF2, 0x7E, 0x3E, 0x07, 0x07, 0x07, 0x07,
+ 0x3F, 0x7F, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x7F, 0x3F, 0x3C, 0x7E, 0xC7,
+ 0xFF, 0xFF, 0xC0, 0xE0, 0x7E, 0x3E, 0x1D, 0xF7, 0x1C, 0xFB, 0xE7, 0x1C,
+ 0x71, 0xC7, 0x1C, 0x70, 0x3F, 0xFF, 0xF9, 0xDC, 0xE7, 0xF3, 0xE1, 0x80,
+ 0xFE, 0x7F, 0xF1, 0xF8, 0xFF, 0xE7, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x0E,
+ 0xF7, 0xFF, 0x8F, 0xC7, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x38, 0xFC, 0x7F,
+ 0xFF, 0xFF, 0xF0, 0x39, 0xC0, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F,
+ 0xFE, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x77, 0x3B, 0xB9, 0xF8, 0xFC, 0x7F,
+ 0x39, 0x9C, 0xEE, 0x38, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0x70, 0xFE,
+ 0x7B, 0xFF, 0xFE, 0x71, 0xF9, 0xC7, 0xE7, 0x1F, 0x9C, 0x7E, 0x71, 0xF9,
+ 0xC7, 0xE7, 0x1C, 0xEF, 0x7F, 0xF8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7,
+ 0xE3, 0x80, 0x3E, 0x3F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8E, 0xFE, 0x3E,
+ 0x00, 0xFE, 0x7F, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x9F, 0xFE, 0xFE, 0x70,
+ 0x38, 0x1C, 0x00, 0x3B, 0x7F, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x7F, 0x3F,
+ 0x07, 0x07, 0x07, 0xEF, 0xFF, 0x38, 0xE3, 0x8E, 0x38, 0xE0, 0x7D, 0xFF,
+ 0x97, 0x87, 0xC3, 0xD3, 0xFF, 0x7C, 0x71, 0xCF, 0xBE, 0x71, 0xC7, 0x1C,
+ 0x71, 0xF3, 0xC0, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xFF, 0x7F,
+ 0xC3, 0xF1, 0xB9, 0xCC, 0xE6, 0x63, 0xB0, 0xF8, 0x78, 0x3C, 0x00, 0xE3,
+ 0x1F, 0x8E, 0x77, 0x79, 0x9D, 0xEE, 0x77, 0xB8, 0xD3, 0xC3, 0xCF, 0x0F,
+ 0x3C, 0x3C, 0xF0, 0x73, 0xBB, 0x8F, 0x87, 0xC1, 0xC1, 0xF0, 0xD8, 0xEE,
+ 0x63, 0x80, 0xE3, 0xB1, 0xDC, 0xC6, 0x63, 0x71, 0xF0, 0x78, 0x38, 0x0C,
+ 0x0E, 0x1E, 0x0E, 0x00, 0xFF, 0xFC, 0x71, 0xC3, 0x8E, 0x38, 0x7F, 0xFE,
+ 0x3B, 0xDC, 0xE3, 0x18, 0xDE, 0xF1, 0x8C, 0xE7, 0x39, 0xE7, 0xFF, 0xFF,
+ 0xE0, 0xE7, 0x9C, 0xE6, 0x31, 0x8F, 0x7B, 0x18, 0xC7, 0x3B, 0xDC, 0x72,
+ 0xFF, 0x8E };
+
+const GFXglyph sourcesans_bold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 6, 1, -11 }, // 0x21 '!'
+ { 6, 8, 6, 10, 1, -11 }, // 0x22 '"'
+ { 12, 7, 11, 10, 1, -10 }, // 0x23 '#'
+ { 22, 8, 16, 9, 1, -13 }, // 0x24 '$'
+ { 38, 15, 12, 15, 0, -11 }, // 0x25 '%'
+ { 61, 12, 12, 12, 0, -11 }, // 0x26 '&'
+ { 79, 3, 6, 5, 1, -11 }, // 0x27 '''
+ { 82, 5, 16, 6, 1, -12 }, // 0x28 '('
+ { 92, 5, 16, 6, 1, -12 }, // 0x29 ')'
+ { 102, 7, 7, 8, 0, -12 }, // 0x2A '*'
+ { 109, 8, 8, 9, 1, -9 }, // 0x2B '+'
+ { 117, 3, 7, 5, 1, -2 }, // 0x2C ','
+ { 120, 4, 2, 6, 1, -5 }, // 0x2D '-'
+ { 121, 3, 3, 5, 1, -2 }, // 0x2E '.'
+ { 123, 5, 22, 6, 0, -15 }, // 0x2F '/'
+ { 137, 8, 12, 10, 1, -11 }, // 0x30 '0'
+ { 149, 6, 11, 9, 2, -10 }, // 0x31 '1'
+ { 158, 9, 12, 9, 1, -11 }, // 0x32 '2'
+ { 172, 9, 12, 9, 0, -11 }, // 0x33 '3'
+ { 186, 8, 11, 9, 1, -10 }, // 0x34 '4'
+ { 197, 9, 11, 9, 0, -10 }, // 0x35 '5'
+ { 210, 8, 12, 10, 1, -11 }, // 0x36 '6'
+ { 222, 6, 11, 9, 2, -10 }, // 0x37 '7'
+ { 231, 8, 12, 10, 1, -11 }, // 0x38 '8'
+ { 243, 8, 12, 10, 1, -11 }, // 0x39 '9'
+ { 255, 3, 9, 5, 1, -8 }, // 0x3A ':'
+ { 259, 3, 13, 5, 1, -8 }, // 0x3B ';'
+ { 264, 8, 8, 10, 1, -9 }, // 0x3C '<'
+ { 272, 8, 6, 9, 1, -8 }, // 0x3D '='
+ { 278, 8, 8, 10, 1, -9 }, // 0x3E '>'
+ { 286, 8, 12, 8, 0, -11 }, // 0x3F '?'
+ { 298, 14, 15, 16, 1, -11 }, // 0x40 '@'
+ { 325, 11, 12, 10, 0, -11 }, // 0x41 'A'
+ { 342, 10, 12, 11, 1, -11 }, // 0x42 'B'
+ { 357, 10, 12, 10, 1, -11 }, // 0x43 'C'
+ { 372, 10, 12, 11, 1, -11 }, // 0x44 'D'
+ { 387, 7, 12, 10, 1, -11 }, // 0x45 'E'
+ { 398, 7, 12, 9, 1, -11 }, // 0x46 'F'
+ { 409, 10, 12, 11, 1, -11 }, // 0x47 'G'
+ { 424, 10, 12, 12, 1, -11 }, // 0x48 'H'
+ { 439, 3, 12, 5, 1, -11 }, // 0x49 'I'
+ { 444, 8, 12, 9, 0, -11 }, // 0x4A 'J'
+ { 456, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 471, 7, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 482, 12, 12, 14, 1, -11 }, // 0x4D 'M'
+ { 500, 10, 12, 12, 1, -11 }, // 0x4E 'N'
+ { 515, 11, 12, 12, 1, -11 }, // 0x4F 'O'
+ { 532, 10, 12, 11, 1, -11 }, // 0x50 'P'
+ { 547, 11, 15, 12, 1, -11 }, // 0x51 'Q'
+ { 568, 10, 12, 11, 1, -11 }, // 0x52 'R'
+ { 583, 9, 12, 10, 1, -11 }, // 0x53 'S'
+ { 597, 7, 12, 10, 2, -11 }, // 0x54 'T'
+ { 608, 10, 12, 12, 1, -11 }, // 0x55 'U'
+ { 623, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 638, 15, 12, 15, 0, -11 }, // 0x57 'W'
+ { 661, 10, 12, 10, 0, -11 }, // 0x58 'X'
+ { 676, 11, 12, 9, -1, -11 }, // 0x59 'Y'
+ { 693, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 705, 4, 16, 6, 2, -12 }, // 0x5B '['
+ { 713, 4, 22, 6, 1, -15 }, // 0x5C '\'
+ { 724, 4, 16, 6, 1, -12 }, // 0x5D ']'
+ { 732, 8, 7, 10, 1, -11 }, // 0x5E '^'
+ { 739, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 742, 4, 2, 10, 2, -11 }, // 0x60 '`'
+ { 743, 8, 9, 10, 1, -8 }, // 0x61 'a'
+ { 752, 9, 13, 10, 1, -12 }, // 0x62 'b'
+ { 767, 8, 9, 8, 1, -8 }, // 0x63 'c'
+ { 776, 8, 13, 10, 1, -12 }, // 0x64 'd'
+ { 789, 8, 9, 9, 1, -8 }, // 0x65 'e'
+ { 798, 6, 13, 6, 1, -12 }, // 0x66 'f'
+ { 808, 9, 13, 10, 1, -8 }, // 0x67 'g'
+ { 823, 9, 13, 10, 1, -12 }, // 0x68 'h'
+ { 838, 3, 12, 5, 1, -11 }, // 0x69 'i'
+ { 843, 5, 16, 5, -1, -11 }, // 0x6A 'j'
+ { 853, 9, 13, 10, 1, -12 }, // 0x6B 'k'
+ { 868, 4, 13, 5, 1, -12 }, // 0x6C 'l'
+ { 875, 14, 9, 15, 1, -8 }, // 0x6D 'm'
+ { 891, 9, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 902, 9, 9, 10, 1, -8 }, // 0x6F 'o'
+ { 913, 9, 12, 10, 1, -8 }, // 0x70 'p'
+ { 927, 8, 12, 10, 1, -8 }, // 0x71 'q'
+ { 939, 6, 9, 7, 1, -8 }, // 0x72 'r'
+ { 946, 7, 9, 8, 1, -8 }, // 0x73 's'
+ { 954, 6, 11, 7, 1, -10 }, // 0x74 't'
+ { 963, 8, 9, 10, 1, -8 }, // 0x75 'u'
+ { 972, 9, 9, 9, 1, -8 }, // 0x76 'v'
+ { 983, 14, 9, 14, 0, -8 }, // 0x77 'w'
+ { 999, 9, 9, 9, 0, -8 }, // 0x78 'x'
+ { 1010, 9, 12, 9, 0, -8 }, // 0x79 'y'
+ { 1024, 7, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 1032, 5, 16, 6, 1, -12 }, // 0x7B '{'
+ { 1042, 1, 19, 5, 2, -13 }, // 0x7C '|'
+ { 1045, 5, 16, 6, 1, -12 }, // 0x7D '}'
+ { 1055, 8, 3, 9, 1, -6 } }; // 0x7E '~'
+
+const GFXfont sourcesans_bold9pt7b PROGMEM = {
+ (uint8_t *)sourcesans_bold9pt7bBitmaps,
+ (GFXglyph *)sourcesans_bold9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+const uint8_t DINAlternateBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x32, 0x32, 0x36, 0xFF, 0x26, 0x24,
+ 0x64, 0xFF, 0x64, 0x4C, 0x4C, 0x4C, 0x08, 0x08, 0x3E, 0x7E, 0x68, 0x68,
+ 0x68, 0x3C, 0x1E, 0x0B, 0x0B, 0x4B, 0xFE, 0x3C, 0x08, 0x08, 0xE3, 0x4A,
+ 0x97, 0x40, 0x82, 0x04, 0x17, 0x2A, 0x95, 0x2C, 0x70, 0x3C, 0x0F, 0xC1,
+ 0x98, 0x33, 0x03, 0xC0, 0x70, 0x13, 0x06, 0x36, 0xC3, 0x9C, 0x71, 0xFF,
+ 0x1E, 0x60, 0xFC, 0x22, 0x64, 0xCC, 0xCC, 0xCC, 0x46, 0x22, 0x84, 0x62,
+ 0x33, 0x33, 0x33, 0x26, 0x48, 0x27, 0xC9, 0xF2, 0x00, 0x18, 0x0C, 0x06,
+ 0x03, 0x0F, 0xFF, 0xFC, 0x60, 0x30, 0x18, 0x00, 0xF8, 0xFF, 0xC0, 0xF0,
+ 0x0C, 0x21, 0x86, 0x10, 0xC2, 0x08, 0x61, 0x04, 0x30, 0x39, 0xFF, 0x1E,
+ 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8F, 0xF9, 0xC0, 0x7F, 0xB3, 0x33, 0x33,
+ 0x33, 0x33, 0x38, 0xFB, 0x1E, 0x30, 0x61, 0x86, 0x18, 0x70, 0xC3, 0xFF,
+ 0xF0, 0x79, 0xFF, 0x18, 0x33, 0xC7, 0x83, 0x83, 0x07, 0x9F, 0xF3, 0xC0,
+ 0x0C, 0x18, 0x18, 0x30, 0x30, 0x66, 0x66, 0xC6, 0xFF, 0xFF, 0x06, 0x06,
+ 0xFF, 0xFF, 0x07, 0xEF, 0xD8, 0xC1, 0x83, 0x07, 0x8F, 0xF1, 0xC0, 0x18,
+ 0x30, 0xC1, 0x86, 0x0F, 0x3F, 0x63, 0xC7, 0x8F, 0x3F, 0xE3, 0x00, 0xFF,
+ 0xFF, 0x1E, 0x60, 0xC1, 0x86, 0x0C, 0x30, 0x60, 0xC3, 0x00, 0x7D, 0xFF,
+ 0x1E, 0x37, 0xCF, 0xBB, 0xE3, 0xC7, 0xDD, 0xF1, 0xC0, 0x7D, 0xCF, 0x1E,
+ 0x3C, 0x7F, 0xDF, 0x06, 0x18, 0x30, 0xC1, 0x80, 0xF0, 0xF0, 0xF0, 0xF8,
+ 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x03, 0x80, 0x70, 0x0F, 0x00, 0x80, 0xFF,
+ 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x80, 0x70, 0x0F, 0x00, 0xE0, 0x18, 0x38,
+ 0x71, 0xE0, 0x80, 0x00, 0x7B, 0xFC, 0xF3, 0x0C, 0x63, 0x8C, 0x30, 0x03,
+ 0x0C, 0x0F, 0xC1, 0xFF, 0x1F, 0xDD, 0xF1, 0xFF, 0x89, 0xF8, 0x4F, 0xC6,
+ 0x7E, 0x26, 0x7F, 0xC3, 0x83, 0x8F, 0xF8, 0x1F, 0x00, 0x0C, 0x01, 0xC0,
+ 0x38, 0x0D, 0x81, 0xB0, 0x62, 0x0C, 0x61, 0xFC, 0x7F, 0x8C, 0x19, 0x83,
+ 0x60, 0x30, 0xFE, 0x7F, 0xF0, 0x78, 0x3C, 0x3F, 0xFB, 0xFD, 0x83, 0xC1,
+ 0xE0, 0xFF, 0xDF, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x06, 0x03, 0x01,
+ 0x80, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xFF, 0xDF, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x3E, 0x3F, 0xB8, 0xF8,
+ 0x0C, 0x06, 0x3F, 0x1F, 0x83, 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC1, 0xE0,
+ 0xF0, 0x78, 0x3C, 0x1F, 0xFF, 0xFF, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30,
+ 0xFF, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1F,
+ 0xF3, 0xC0, 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xDC, 0x37, 0x0F, 0xE3, 0x98,
+ 0xC3, 0x30, 0xCC, 0x1B, 0x07, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x7C, 0x1F, 0x83, 0xF0, 0xFF, 0x1F,
+ 0xE3, 0xF6, 0xDE, 0xDB, 0xCE, 0x79, 0xCF, 0x01, 0xE0, 0x30, 0xC1, 0xF0,
+ 0xF8, 0x7E, 0x3D, 0x9E, 0xCF, 0x37, 0x9B, 0xC7, 0xE1, 0xF0, 0xF8, 0x30,
+ 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xF1, 0xDF,
+ 0xC7, 0xC0, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x3F, 0xFB, 0xF9, 0x80, 0xC0,
+ 0x60, 0x30, 0x18, 0x00, 0x3E, 0x1F, 0xCE, 0x3B, 0x06, 0xC1, 0xB0, 0x6C,
+ 0x1B, 0x16, 0xCF, 0xB8, 0xE7, 0xFC, 0xFB, 0xFE, 0x3F, 0xCC, 0x1B, 0x06,
+ 0xC3, 0xBF, 0xCF, 0xE3, 0x18, 0xC6, 0x30, 0xCC, 0x3B, 0x06, 0x1F, 0x0F,
+ 0xF7, 0x09, 0x80, 0x60, 0x0F, 0x80, 0xF8, 0x03, 0x00, 0xD8, 0x77, 0xF8,
+ 0x7C, 0xFF, 0xFF, 0xC6, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0x06, 0x03, 0x00, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xC1, 0xF1, 0xDF, 0xC7, 0xC0, 0xC0, 0xD0, 0x66, 0x19, 0x86, 0x23, 0x0C,
+ 0xC3, 0x30, 0x58, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0xC3, 0x0D, 0x8C, 0x36,
+ 0x38, 0xD8, 0xE3, 0x66, 0x98, 0x9B, 0x63, 0x4D, 0x8F, 0x36, 0x3C, 0x70,
+ 0x71, 0xC1, 0x87, 0x06, 0x08, 0xE1, 0x98, 0xC3, 0x30, 0xD8, 0x1E, 0x07,
+ 0x01, 0xC0, 0x78, 0x36, 0x1C, 0xC6, 0x1B, 0x06, 0xE1, 0xD8, 0x63, 0x30,
+ 0xCC, 0x1E, 0x07, 0x80, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xFF,
+ 0xFF, 0x06, 0x06, 0x0C, 0x18, 0x18, 0x30, 0x60, 0xE0, 0xFF, 0xFF, 0xFC,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xC1, 0x04, 0x18, 0x20, 0x83, 0x04,
+ 0x18, 0x60, 0x83, 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x08, 0x0C,
+ 0x05, 0x06, 0x82, 0x63, 0x11, 0x0D, 0x82, 0xFF, 0x80, 0xE6, 0x30, 0x3C,
+ 0xFC, 0x1B, 0xFF, 0xF8, 0xF1, 0xFF, 0x7E, 0xC1, 0x83, 0x06, 0xEF, 0xF8,
+ 0xF1, 0xC3, 0xC7, 0x8F, 0xFE, 0xE0, 0x3C, 0xFF, 0x8E, 0x0C, 0x18, 0x38,
+ 0x3F, 0x3C, 0x06, 0x0C, 0x1B, 0xBF, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F, 0xFB,
+ 0xB0, 0x38, 0xFB, 0x1F, 0xFF, 0xF8, 0x39, 0x3F, 0x3C, 0x3B, 0xD9, 0xFF,
+ 0xB1, 0x8C, 0x63, 0x18, 0xC0, 0x77, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xFF,
+ 0x76, 0x0D, 0x3F, 0xE7, 0x80, 0xC1, 0x83, 0x06, 0xEF, 0xF8, 0xF1, 0xE3,
+ 0xC7, 0x8F, 0x1E, 0x30, 0xF3, 0xFF, 0xFF, 0x33, 0x03, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0xFE, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xD8, 0xF8, 0xEC,
+ 0xCC, 0xC6, 0xC3, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xDD, 0xEF, 0xFF, 0xC6,
+ 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xDD, 0xFF,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC6, 0x38, 0xFB, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xBE, 0x38, 0xDD, 0xFF, 0x1E, 0x38, 0x78, 0xF1, 0xFF, 0xDD, 0x83, 0x06,
+ 0x0C, 0x00, 0x77, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xFF, 0x76, 0x0C, 0x18,
+ 0x30, 0x60, 0xDF, 0xFC, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x3E, 0x7F, 0x62,
+ 0x60, 0x3E, 0x03, 0x43, 0x7F, 0x3E, 0x66, 0x6F, 0xF6, 0x66, 0x66, 0x73,
+ 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xFF, 0x76, 0xC3, 0xC2, 0x66, 0x66,
+ 0x24, 0x3C, 0x3C, 0x18, 0x18, 0xC2, 0x1A, 0x31, 0x99, 0xCC, 0xCA, 0x66,
+ 0xD2, 0x16, 0xF0, 0xE7, 0x87, 0x18, 0x18, 0xC0, 0x63, 0x66, 0x3E, 0x1C,
+ 0x18, 0x3C, 0x36, 0x66, 0xE3, 0xC3, 0xC2, 0x66, 0x66, 0x24, 0x3C, 0x3C,
+ 0x18, 0x18, 0x18, 0x30, 0x70, 0x60, 0xFF, 0xF0, 0x86, 0x31, 0x84, 0x3F,
+ 0xFC, 0x1C, 0xC3, 0x0C, 0x30, 0xCC, 0x1C, 0x30, 0xC3, 0x0C, 0x30, 0x70,
+ 0xFF, 0xFF, 0xFF, 0xE1, 0x8C, 0x63, 0x18, 0x63, 0x31, 0x8C, 0x63, 0x70,
+ 0x71, 0xFF, 0x8E };
+
+const GFXglyph DINAlternateBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 4, 1, -11 }, // 0x21 '!'
+ { 4, 4, 3, 6, 1, -11 }, // 0x22 '"'
+ { 6, 8, 12, 10, 1, -11 }, // 0x23 '#'
+ { 18, 8, 16, 9, 0, -13 }, // 0x24 '$'
+ { 34, 7, 12, 9, 1, -11 }, // 0x25 '%'
+ { 45, 11, 12, 12, 1, -11 }, // 0x26 '&'
+ { 62, 2, 3, 4, 1, -11 }, // 0x27 '''
+ { 63, 4, 14, 5, 1, -11 }, // 0x28 '('
+ { 70, 4, 14, 5, 0, -11 }, // 0x29 ')'
+ { 77, 5, 5, 7, 1, -11 }, // 0x2A '*'
+ { 81, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 92, 2, 3, 4, 1, -1 }, // 0x2C ','
+ { 93, 5, 2, 7, 1, -5 }, // 0x2D '-'
+ { 95, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 96, 6, 12, 6, 0, -11 }, // 0x2F '/'
+ { 105, 7, 12, 8, 1, -11 }, // 0x30 '0'
+ { 116, 4, 12, 8, 2, -11 }, // 0x31 '1'
+ { 122, 7, 12, 8, 1, -11 }, // 0x32 '2'
+ { 133, 7, 12, 8, 1, -11 }, // 0x33 '3'
+ { 144, 8, 12, 8, 1, -11 }, // 0x34 '4'
+ { 156, 7, 12, 8, 1, -11 }, // 0x35 '5'
+ { 167, 7, 13, 8, 1, -11 }, // 0x36 '6'
+ { 179, 7, 12, 8, 1, -11 }, // 0x37 '7'
+ { 190, 7, 12, 8, 1, -11 }, // 0x38 '8'
+ { 201, 7, 12, 8, 1, -11 }, // 0x39 '9'
+ { 212, 2, 6, 4, 1, -5 }, // 0x3A ':'
+ { 214, 2, 7, 4, 1, -5 }, // 0x3B ';'
+ { 216, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 227, 9, 5, 11, 1, -6 }, // 0x3D '='
+ { 233, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 244, 6, 12, 8, 1, -11 }, // 0x3F '?'
+ { 253, 13, 12, 15, 1, -11 }, // 0x40 '@'
+ { 273, 11, 12, 11, 0, -11 }, // 0x41 'A'
+ { 290, 9, 12, 11, 1, -11 }, // 0x42 'B'
+ { 304, 9, 12, 10, 1, -11 }, // 0x43 'C'
+ { 318, 9, 12, 11, 1, -11 }, // 0x44 'D'
+ { 332, 8, 12, 10, 1, -11 }, // 0x45 'E'
+ { 344, 8, 12, 10, 1, -11 }, // 0x46 'F'
+ { 356, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 370, 9, 12, 11, 1, -11 }, // 0x48 'H'
+ { 384, 2, 12, 4, 1, -11 }, // 0x49 'I'
+ { 387, 7, 12, 8, 0, -11 }, // 0x4A 'J'
+ { 398, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 413, 8, 12, 10, 1, -11 }, // 0x4C 'L'
+ { 425, 11, 12, 13, 1, -11 }, // 0x4D 'M'
+ { 442, 9, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 456, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 470, 9, 12, 11, 1, -11 }, // 0x50 'P'
+ { 484, 10, 12, 11, 1, -11 }, // 0x51 'Q'
+ { 499, 10, 12, 11, 1, -11 }, // 0x52 'R'
+ { 514, 10, 12, 11, 0, -11 }, // 0x53 'S'
+ { 529, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 543, 9, 12, 11, 1, -11 }, // 0x55 'U'
+ { 557, 10, 12, 10, 0, -11 }, // 0x56 'V'
+ { 572, 14, 12, 15, 0, -11 }, // 0x57 'W'
+ { 593, 10, 12, 9, 0, -11 }, // 0x58 'X'
+ { 608, 10, 12, 10, 0, -11 }, // 0x59 'Y'
+ { 623, 8, 12, 10, 1, -11 }, // 0x5A 'Z'
+ { 635, 4, 14, 5, 1, -11 }, // 0x5B '['
+ { 642, 6, 12, 6, 0, -11 }, // 0x5C '\'
+ { 651, 4, 14, 5, 0, -11 }, // 0x5D ']'
+ { 658, 9, 8, 11, 1, -12 }, // 0x5E '^'
+ { 667, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 669, 4, 3, 4, -1, -12 }, // 0x60 '`'
+ { 671, 7, 9, 9, 1, -8 }, // 0x61 'a'
+ { 679, 7, 12, 9, 1, -11 }, // 0x62 'b'
+ { 690, 7, 9, 9, 1, -8 }, // 0x63 'c'
+ { 698, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 709, 7, 9, 9, 1, -8 }, // 0x65 'e'
+ { 717, 5, 12, 6, 1, -11 }, // 0x66 'f'
+ { 725, 7, 13, 9, 1, -8 }, // 0x67 'g'
+ { 737, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 748, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 751, 4, 16, 4, -1, -11 }, // 0x6A 'j'
+ { 759, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 771, 3, 12, 5, 1, -11 }, // 0x6C 'l'
+ { 776, 12, 9, 14, 1, -8 }, // 0x6D 'm'
+ { 790, 7, 9, 9, 1, -8 }, // 0x6E 'n'
+ { 798, 7, 9, 9, 1, -8 }, // 0x6F 'o'
+ { 806, 7, 13, 9, 1, -8 }, // 0x70 'p'
+ { 818, 7, 13, 9, 1, -8 }, // 0x71 'q'
+ { 830, 6, 9, 7, 1, -8 }, // 0x72 'r'
+ { 837, 8, 9, 9, 0, -8 }, // 0x73 's'
+ { 846, 4, 12, 6, 1, -11 }, // 0x74 't'
+ { 852, 7, 9, 9, 1, -8 }, // 0x75 'u'
+ { 860, 8, 9, 8, 0, -8 }, // 0x76 'v'
+ { 869, 13, 9, 13, 0, -8 }, // 0x77 'w'
+ { 884, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 893, 8, 13, 8, 0, -8 }, // 0x79 'y'
+ { 906, 6, 9, 8, 1, -8 }, // 0x7A 'z'
+ { 913, 6, 14, 6, 0, -11 }, // 0x7B '{'
+ { 924, 2, 12, 4, 1, -11 }, // 0x7C '|'
+ { 927, 5, 14, 6, 0, -11 }, // 0x7D '}'
+ { 936, 8, 3, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont DINAlternateBold9pt7b PROGMEM = {
+ (uint8_t *)DINAlternateBold9pt7bBitmaps,
+ (GFXglyph *)DINAlternateBold9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1611 bytes
+const uint8_t DINCondensedBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xFF, 0xF0, 0x25, 0x96, 0xFF, 0x49, 0x24, 0xBF,
+ 0xDB, 0x69, 0x24, 0x10, 0xE7, 0xF7, 0xDF, 0x4F, 0x0F, 0x1C, 0x7D, 0xF7,
+ 0x7C, 0x41, 0x00, 0xEE, 0xAE, 0x86, 0x10, 0x42, 0x08, 0x7D, 0x55, 0x77,
+ 0x78, 0xFC, 0xCC, 0xCC, 0x78, 0x30, 0x70, 0xDB, 0xCE, 0xCE, 0xFE, 0x73,
+ 0xFC, 0x2D, 0x2D, 0xB6, 0xD9, 0x26, 0x40, 0x99, 0x26, 0xDB, 0x6D, 0x2D,
+ 0x00, 0x25, 0x5C, 0xEA, 0x90, 0x18, 0x0C, 0x06, 0x03, 0x0F, 0xFF, 0xFC,
+ 0x60, 0x30, 0x18, 0x00, 0xF8, 0xFF, 0xC0, 0xF0, 0x33, 0x22, 0x26, 0x64,
+ 0x44, 0xCC, 0x77, 0xF7, 0xBD, 0xEF, 0x7B, 0xDE, 0xFE, 0xE0, 0x7F, 0xB3,
+ 0x33, 0x33, 0x33, 0x33, 0x77, 0xF7, 0xB1, 0x98, 0xCC, 0x66, 0x3F, 0xF0,
+ 0x77, 0xF6, 0x33, 0x98, 0x63, 0xDE, 0xFE, 0xE0, 0x30, 0xC6, 0x18, 0x61,
+ 0x6D, 0xB6, 0xFF, 0xF1, 0x86, 0xFF, 0xF1, 0x8F, 0x7E, 0x63, 0x1E, 0xFE,
+ 0xE0, 0x31, 0x88, 0xC6, 0x7F, 0x7B, 0xDE, 0xFE, 0xE0, 0xFF, 0xFC, 0x86,
+ 0x18, 0x63, 0x0C, 0x31, 0x86, 0x18, 0x77, 0xF7, 0xBF, 0xFF, 0x7B, 0xDE,
+ 0xFE, 0xE0, 0x77, 0xF7, 0xBD, 0xEF, 0xE6, 0x31, 0x18, 0xC0, 0xF0, 0xF0,
+ 0xF0, 0xF8, 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x03, 0x80, 0x70, 0x0E, 0x00,
+ 0x80, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0x80, 0x70, 0x0F, 0x00, 0xE0,
+ 0x18, 0x38, 0x70, 0xE0, 0x80, 0x00, 0x77, 0xF3, 0x90, 0x8C, 0xC6, 0x30,
+ 0x0C, 0x60, 0x0F, 0x81, 0xC3, 0x1B, 0xDC, 0xFE, 0xBD, 0x89, 0xF8, 0x4F,
+ 0xC6, 0xFE, 0x26, 0x7F, 0xF3, 0xE7, 0x8E, 0x18, 0x1F, 0x00, 0x10, 0x70,
+ 0xE1, 0x42, 0x85, 0x9B, 0x3E, 0x7C, 0x8F, 0x1E, 0x30, 0xFB, 0xFC, 0xF3,
+ 0xFB, 0xEC, 0xF3, 0xCF, 0x3F, 0xFE, 0x7B, 0xFC, 0xF3, 0xC3, 0x0C, 0x30,
+ 0xCF, 0x3F, 0xDE, 0xFB, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xFE,
+ 0xFF, 0xFC, 0x30, 0xC3, 0xEF, 0xB0, 0xC3, 0x0F, 0xFF, 0xFF, 0xFC, 0x30,
+ 0xC3, 0xEF, 0xB0, 0xC3, 0x0C, 0x30, 0x7B, 0xFC, 0xF0, 0xC3, 0x7D, 0xF3,
+ 0xCF, 0x3F, 0xDE, 0xCF, 0x3C, 0xF3, 0xCF, 0xFF, 0xF3, 0xCF, 0x3C, 0xF3,
+ 0xFF, 0xFF, 0xFF, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x37, 0xDE,
+ 0xCD, 0x9B, 0x66, 0xCF, 0x1E, 0x3E, 0x7C, 0xCD, 0x9B, 0x36, 0x30, 0xC3,
+ 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0F, 0xFF, 0xC3, 0xC3, 0xE7, 0xE7,
+ 0xE7, 0xFF, 0xDB, 0xDB, 0xDB, 0xDB, 0xC3, 0xC3, 0xCF, 0x3E, 0xFB, 0xEF,
+ 0xBD, 0xF7, 0xDF, 0x7C, 0xF3, 0x7B, 0xFC, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF,
+ 0x3F, 0xDE, 0xFB, 0xFC, 0xF3, 0xCF, 0xFF, 0xB0, 0xC3, 0x0C, 0x30, 0x79,
+ 0xFB, 0x36, 0x6C, 0xD9, 0xB3, 0x66, 0xDD, 0xBB, 0xF3, 0xA0, 0xFB, 0xFC,
+ 0xF3, 0xCF, 0xFF, 0x36, 0xDB, 0x2C, 0xF3, 0x7B, 0xFC, 0xF3, 0xC1, 0xC1,
+ 0xC3, 0xCF, 0x3F, 0xDE, 0xFF, 0xF3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x0C, 0xCF, 0x3C, 0xF3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3F, 0xDE, 0xC6, 0x8D,
+ 0x93, 0x66, 0xCD, 0x8B, 0x14, 0x38, 0x70, 0xE0, 0x80, 0xCC, 0xD3, 0x34,
+ 0xCD, 0xBB, 0x6E, 0x9F, 0xA7, 0xA9, 0xEE, 0x33, 0x8C, 0xE3, 0x38, 0xC4,
+ 0xC6, 0xD9, 0xB1, 0xC3, 0x86, 0x0E, 0x1C, 0x68, 0xD9, 0x36, 0x30, 0xCF,
+ 0x3C, 0xDE, 0x79, 0xE3, 0x0C, 0x30, 0xC3, 0x0C, 0xFF, 0xC6, 0x23, 0x19,
+ 0x8C, 0x46, 0x3F, 0xF0, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xC0, 0xCC, 0x44,
+ 0x46, 0x62, 0x22, 0x33, 0xED, 0xB6, 0xDB, 0x6D, 0xB7, 0xC0, 0x08, 0x0C,
+ 0x07, 0x06, 0x82, 0x23, 0x11, 0x05, 0x82, 0xFF, 0x80, 0xC6, 0x20, 0x7B,
+ 0xF0, 0xDF, 0xFF, 0x3C, 0xFF, 0x6C, 0xC6, 0x31, 0xFF, 0xEF, 0x7B, 0xDE,
+ 0xFF, 0xF0, 0x73, 0xEC, 0xB0, 0xC3, 0x0C, 0xBE, 0x70, 0x18, 0xC7, 0xFF,
+ 0xEF, 0x7B, 0xDE, 0xFF, 0xF0, 0x77, 0xF7, 0xFF, 0xE3, 0x7F, 0x70, 0x37,
+ 0x6F, 0xF6, 0x66, 0x66, 0x66, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xF7,
+ 0xF7, 0x00, 0xC6, 0x31, 0xFF, 0xEF, 0x7B, 0xDE, 0xF7, 0xB0, 0xF3, 0xFF,
+ 0xFF, 0x6C, 0x36, 0xDB, 0x6D, 0xB6, 0xFE, 0xC3, 0x0C, 0x33, 0xDB, 0x6F,
+ 0x3C, 0xFB, 0x6C, 0xF3, 0xDB, 0x6D, 0xB6, 0xDB, 0xB0, 0xF6, 0xFF, 0xDB,
+ 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0xF7, 0xBD, 0xEF, 0x7B, 0xD8,
+ 0x77, 0xF7, 0xBD, 0xEF, 0x7F, 0x70, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xFE,
+ 0x31, 0x8C, 0x00, 0xFF, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xC6, 0x31, 0x80,
+ 0xDF, 0xCC, 0xCC, 0xCC, 0xC0, 0x77, 0xF7, 0x87, 0x0F, 0x7F, 0x70, 0x66,
+ 0x6F, 0xF6, 0x66, 0x66, 0x73, 0xDE, 0xF7, 0xBD, 0xEF, 0x7F, 0xF8, 0xCF,
+ 0x34, 0xDA, 0x79, 0xE3, 0x8C, 0x30, 0xCD, 0xE6, 0xD3, 0x6F, 0xB7, 0xD3,
+ 0xB8, 0xDC, 0x6E, 0x32, 0x00, 0xCD, 0x67, 0x8C, 0x31, 0xC7, 0x96, 0xCC,
+ 0xC4, 0xD9, 0xB3, 0x62, 0x85, 0x0E, 0x1C, 0x18, 0x20, 0xC3, 0x86, 0x00,
+ 0xFF, 0xC6, 0x62, 0x33, 0x1F, 0xF8, 0x36, 0x66, 0x66, 0x68, 0x66, 0x66,
+ 0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, 0x66, 0x61, 0x66, 0x66,
+ 0x6C, 0x71, 0xFF, 0x8E };
+
+const GFXglyph DINCondensedBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 3, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 4, 1, -11 }, // 0x21 '!'
+ { 4, 4, 3, 6, 1, -11 }, // 0x22 '"'
+ { 6, 6, 12, 8, 1, -11 }, // 0x23 '#'
+ { 15, 6, 15, 8, 1, -12 }, // 0x24 '$'
+ { 27, 6, 12, 8, 1, -11 }, // 0x25 '%'
+ { 36, 8, 12, 9, 1, -11 }, // 0x26 '&'
+ { 48, 2, 3, 4, 1, -11 }, // 0x27 '''
+ { 49, 3, 14, 4, 1, -11 }, // 0x28 '('
+ { 55, 3, 14, 4, 0, -11 }, // 0x29 ')'
+ { 61, 5, 6, 7, 1, -11 }, // 0x2A '*'
+ { 65, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 76, 2, 3, 4, 1, -1 }, // 0x2C ','
+ { 77, 5, 2, 7, 1, -5 }, // 0x2D '-'
+ { 79, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 80, 4, 12, 4, 0, -11 }, // 0x2F '/'
+ { 86, 5, 12, 7, 1, -11 }, // 0x30 '0'
+ { 94, 4, 12, 7, 1, -11 }, // 0x31 '1'
+ { 100, 5, 12, 7, 1, -11 }, // 0x32 '2'
+ { 108, 5, 12, 7, 1, -11 }, // 0x33 '3'
+ { 116, 6, 12, 7, 1, -11 }, // 0x34 '4'
+ { 125, 5, 12, 7, 1, -11 }, // 0x35 '5'
+ { 133, 5, 12, 7, 1, -11 }, // 0x36 '6'
+ { 141, 6, 12, 7, 1, -11 }, // 0x37 '7'
+ { 150, 5, 12, 7, 1, -11 }, // 0x38 '8'
+ { 158, 5, 12, 7, 1, -11 }, // 0x39 '9'
+ { 166, 2, 6, 4, 1, -5 }, // 0x3A ':'
+ { 168, 2, 7, 4, 1, -5 }, // 0x3B ';'
+ { 170, 9, 9, 11, 1, -8 }, // 0x3C '<'
+ { 181, 9, 5, 11, 1, -6 }, // 0x3D '='
+ { 187, 9, 9, 11, 1, -8 }, // 0x3E '>'
+ { 198, 5, 12, 7, 1, -11 }, // 0x3F '?'
+ { 206, 13, 12, 15, 1, -11 }, // 0x40 '@'
+ { 226, 7, 12, 7, 0, -11 }, // 0x41 'A'
+ { 237, 6, 12, 8, 1, -11 }, // 0x42 'B'
+ { 246, 6, 12, 8, 1, -11 }, // 0x43 'C'
+ { 255, 6, 12, 8, 1, -11 }, // 0x44 'D'
+ { 264, 6, 12, 7, 1, -11 }, // 0x45 'E'
+ { 273, 6, 12, 7, 1, -11 }, // 0x46 'F'
+ { 282, 6, 12, 8, 1, -11 }, // 0x47 'G'
+ { 291, 6, 12, 8, 1, -11 }, // 0x48 'H'
+ { 300, 2, 12, 4, 1, -11 }, // 0x49 'I'
+ { 303, 6, 12, 6, -1, -11 }, // 0x4A 'J'
+ { 312, 7, 12, 8, 1, -11 }, // 0x4B 'K'
+ { 323, 6, 12, 7, 1, -11 }, // 0x4C 'L'
+ { 332, 8, 12, 10, 1, -11 }, // 0x4D 'M'
+ { 344, 6, 12, 8, 1, -11 }, // 0x4E 'N'
+ { 353, 6, 12, 8, 1, -11 }, // 0x4F 'O'
+ { 362, 6, 12, 8, 1, -11 }, // 0x50 'P'
+ { 371, 7, 12, 8, 1, -11 }, // 0x51 'Q'
+ { 382, 6, 12, 8, 1, -11 }, // 0x52 'R'
+ { 391, 6, 12, 8, 1, -11 }, // 0x53 'S'
+ { 400, 6, 12, 6, 0, -11 }, // 0x54 'T'
+ { 409, 6, 12, 8, 1, -11 }, // 0x55 'U'
+ { 418, 7, 12, 7, 0, -11 }, // 0x56 'V'
+ { 429, 10, 12, 10, 0, -11 }, // 0x57 'W'
+ { 444, 7, 12, 7, 0, -11 }, // 0x58 'X'
+ { 455, 6, 12, 8, 1, -11 }, // 0x59 'Y'
+ { 464, 5, 12, 7, 1, -11 }, // 0x5A 'Z'
+ { 472, 3, 14, 4, 1, -11 }, // 0x5B '['
+ { 478, 4, 12, 4, 0, -11 }, // 0x5C '\'
+ { 484, 3, 14, 4, 0, -11 }, // 0x5D ']'
+ { 490, 9, 8, 11, 1, -12 }, // 0x5E '^'
+ { 499, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 501, 4, 3, 3, -1, -12 }, // 0x60 '`'
+ { 503, 6, 9, 8, 1, -8 }, // 0x61 'a'
+ { 510, 5, 12, 7, 1, -11 }, // 0x62 'b'
+ { 518, 6, 9, 7, 1, -8 }, // 0x63 'c'
+ { 525, 5, 12, 7, 1, -11 }, // 0x64 'd'
+ { 533, 5, 9, 7, 1, -8 }, // 0x65 'e'
+ { 539, 4, 12, 5, 1, -11 }, // 0x66 'f'
+ { 545, 5, 13, 7, 1, -8 }, // 0x67 'g'
+ { 554, 5, 12, 7, 1, -11 }, // 0x68 'h'
+ { 562, 2, 12, 4, 1, -11 }, // 0x69 'i'
+ { 565, 3, 16, 4, 0, -11 }, // 0x6A 'j'
+ { 571, 6, 12, 7, 1, -11 }, // 0x6B 'k'
+ { 580, 3, 12, 4, 1, -11 }, // 0x6C 'l'
+ { 585, 8, 9, 10, 1, -8 }, // 0x6D 'm'
+ { 594, 5, 9, 7, 1, -8 }, // 0x6E 'n'
+ { 600, 5, 9, 7, 1, -8 }, // 0x6F 'o'
+ { 606, 5, 13, 7, 1, -8 }, // 0x70 'p'
+ { 615, 5, 13, 7, 1, -8 }, // 0x71 'q'
+ { 624, 4, 9, 5, 1, -8 }, // 0x72 'r'
+ { 629, 5, 9, 7, 1, -8 }, // 0x73 's'
+ { 635, 4, 12, 4, 0, -11 }, // 0x74 't'
+ { 641, 5, 9, 7, 1, -8 }, // 0x75 'u'
+ { 647, 6, 9, 6, 0, -8 }, // 0x76 'v'
+ { 654, 9, 9, 9, 0, -8 }, // 0x77 'w'
+ { 665, 6, 9, 6, 0, -8 }, // 0x78 'x'
+ { 672, 7, 13, 6, 0, -8 }, // 0x79 'y'
+ { 684, 5, 9, 7, 1, -8 }, // 0x7A 'z'
+ { 690, 4, 14, 5, 1, -11 }, // 0x7B '{'
+ { 697, 2, 17, 4, 1, -12 }, // 0x7C '|'
+ { 702, 4, 14, 4, 0, -11 }, // 0x7D '}'
+ { 709, 8, 3, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont DINCondensedBold9pt7b PROGMEM = {
+ (uint8_t *)DINCondensedBold9pt7bBitmaps,
+ (GFXglyph *)DINCondensedBold9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1384 bytes
+const uint8_t EuphemiaCAS9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xF0, 0x40, 0xDE, 0xD2, 0x0C, 0x20, 0x20, 0x80, 0x82,
+ 0x1F, 0xFF, 0x08, 0x60, 0x21, 0x01, 0x84, 0x06, 0x10, 0x10, 0x40, 0x41,
+ 0x0F, 0xFF, 0x84, 0x30, 0x10, 0x80, 0xC2, 0x03, 0x08, 0x00, 0x08, 0x1E,
+ 0x3B, 0x4A, 0x48, 0x48, 0x68, 0x3C, 0x0E, 0x0B, 0x09, 0x09, 0x49, 0xEA,
+ 0x3E, 0x08, 0x08, 0x70, 0x14, 0x41, 0x22, 0x19, 0x10, 0x88, 0x88, 0x44,
+ 0x82, 0x2C, 0x0E, 0xDE, 0x05, 0x08, 0x48, 0x46, 0x42, 0x62, 0x12, 0x19,
+ 0xA0, 0x7B, 0x00, 0x00, 0x3C, 0x0C, 0x41, 0x08, 0x21, 0x02, 0x40, 0x70,
+ 0x1E, 0x06, 0x63, 0x84, 0x50, 0x5A, 0x06, 0x21, 0xE3, 0xE6, 0xF4, 0x12,
+ 0x44, 0xC8, 0x88, 0x88, 0x84, 0x44, 0x21, 0x84, 0x22, 0x31, 0x11, 0x11,
+ 0x12, 0x22, 0x48, 0x11, 0xAC, 0xE0, 0x83, 0x9A, 0xC4, 0x00, 0x08, 0x04,
+ 0x02, 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD6, 0xF8, 0xC0,
+ 0x00, 0x80, 0x40, 0x40, 0x60, 0x20, 0x30, 0x10, 0x10, 0x08, 0x08, 0x04,
+ 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x80, 0x00, 0x3C, 0x42, 0x42, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x3C, 0x33, 0xC9, 0x04,
+ 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x7C, 0x3E, 0x63, 0x01, 0x01, 0x01,
+ 0x03, 0x06, 0x0C, 0x10, 0x60, 0x40, 0x80, 0xFE, 0x7C, 0x82, 0x01, 0x02,
+ 0x02, 0x1C, 0x02, 0x01, 0x01, 0x01, 0x01, 0x82, 0xFC, 0x02, 0x06, 0x0A,
+ 0x0A, 0x12, 0x22, 0x62, 0x42, 0xFF, 0x02, 0x02, 0x02, 0x02, 0xFD, 0x02,
+ 0x04, 0x0F, 0x90, 0x80, 0x81, 0x02, 0x04, 0x0C, 0x2F, 0x80, 0x1F, 0x22,
+ 0x40, 0xC0, 0xFC, 0xC2, 0x81, 0x81, 0x81, 0x81, 0xC1, 0x42, 0x3C, 0xFF,
+ 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20,
+ 0x3C, 0xC3, 0x81, 0x81, 0xC3, 0x3C, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x42,
+ 0x3C, 0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3F, 0x03, 0x03, 0x02,
+ 0x84, 0xF8, 0xC0, 0x03, 0xC0, 0x03, 0x58, 0x04, 0x1C, 0x61, 0x82, 0x08,
+ 0x20, 0x20, 0x20, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x80, 0x00, 0x1F, 0xF0,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x86, 0x18, 0x61, 0x86, 0x08, 0x00,
+ 0xFA, 0x20, 0x41, 0x04, 0x10, 0x8C, 0x21, 0x86, 0x00, 0x40, 0x07, 0xE0,
+ 0x18, 0x18, 0x30, 0x04, 0x60, 0x02, 0x40, 0x02, 0x87, 0xE1, 0x88, 0x21,
+ 0x90, 0x21, 0x90, 0x21, 0x90, 0x21, 0x90, 0x22, 0x88, 0x62, 0x47, 0xBC,
+ 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x07, 0xC0, 0x04, 0x01, 0x40, 0x28,
+ 0x05, 0x81, 0x10, 0x22, 0x04, 0x61, 0xFC, 0x20, 0x84, 0x19, 0x03, 0x20,
+ 0x2C, 0x06, 0xFD, 0x0E, 0x0C, 0x18, 0x5F, 0x21, 0x41, 0x83, 0x06, 0x0C,
+ 0x2F, 0x80, 0x1F, 0x30, 0xD0, 0x18, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80,
+ 0x60, 0x10, 0x2C, 0x31, 0xF0, 0xFC, 0x20, 0xC8, 0x0A, 0x03, 0x80, 0x60,
+ 0x18, 0x06, 0x01, 0x80, 0x60, 0x28, 0x1A, 0x0C, 0xFC, 0x00, 0xFF, 0x02,
+ 0x04, 0x08, 0x1F, 0xA0, 0x40, 0x81, 0x02, 0x04, 0x0F, 0xE0, 0xFF, 0x02,
+ 0x04, 0x08, 0x1F, 0xA0, 0x40, 0x81, 0x02, 0x04, 0x08, 0x00, 0x1F, 0x88,
+ 0x34, 0x01, 0x00, 0x80, 0x20, 0x08, 0x02, 0x01, 0x80, 0x50, 0x14, 0x04,
+ 0xC1, 0x1F, 0x80, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0xFE,
+ 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x40, 0xFF, 0xF8, 0x02, 0x04,
+ 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x07, 0x0E, 0x37, 0xC0, 0x83, 0x43,
+ 0x23, 0x13, 0x0B, 0x07, 0x03, 0x01, 0xC0, 0xB0, 0x4C, 0x23, 0x10, 0xC8,
+ 0x38, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x0F,
+ 0xE0, 0x80, 0x1C, 0x03, 0xC0, 0x3E, 0x07, 0xA0, 0x5A, 0x05, 0xB0, 0xD9,
+ 0x09, 0x99, 0x98, 0x91, 0x8F, 0x18, 0x61, 0x86, 0x10, 0x80, 0x70, 0x1E,
+ 0x06, 0xC1, 0x90, 0x66, 0x18, 0xC6, 0x19, 0x86, 0x60, 0xD8, 0x1E, 0x07,
+ 0x80, 0xC0, 0x0F, 0x83, 0x0C, 0x40, 0x24, 0x02, 0x80, 0x18, 0x01, 0x80,
+ 0x18, 0x01, 0x80, 0x14, 0x02, 0x40, 0x23, 0x0C, 0x1F, 0x00, 0xFC, 0x82,
+ 0x81, 0x81, 0x81, 0x86, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0F,
+ 0x83, 0x0C, 0x40, 0x24, 0x02, 0x80, 0x18, 0x01, 0x80, 0x18, 0x01, 0x80,
+ 0x14, 0x03, 0x40, 0x23, 0x0C, 0x1F, 0x80, 0x10, 0x01, 0x80, 0x0C, 0x00,
+ 0x60, 0xFC, 0x41, 0x20, 0x50, 0x28, 0x14, 0x33, 0xF1, 0x18, 0x84, 0x43,
+ 0x20, 0x90, 0x68, 0x18, 0x1F, 0x10, 0xD0, 0x08, 0x06, 0x01, 0xC0, 0x38,
+ 0x06, 0x00, 0x80, 0x50, 0x3C, 0x23, 0xE0, 0xFF, 0x84, 0x02, 0x01, 0x00,
+ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x80, 0x30,
+ 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06,
+ 0x00, 0xB0, 0x63, 0xF8, 0xC0, 0x50, 0x36, 0x0D, 0x82, 0x21, 0x8C, 0x43,
+ 0x10, 0x4C, 0x1A, 0x06, 0x80, 0xE0, 0x30, 0x0C, 0x00, 0xC1, 0x06, 0x83,
+ 0x0D, 0x06, 0x13, 0x14, 0x26, 0x28, 0xC4, 0x59, 0x89, 0x92, 0x1A, 0x24,
+ 0x34, 0x68, 0x28, 0xF0, 0x70, 0xC0, 0xC1, 0x81, 0x83, 0x00, 0x60, 0xC4,
+ 0x10, 0xC6, 0x0D, 0x80, 0xA0, 0x18, 0x03, 0x80, 0x50, 0x1B, 0x02, 0x20,
+ 0x82, 0x30, 0x6C, 0x06, 0xC1, 0xA0, 0x98, 0xC4, 0x41, 0x40, 0xA0, 0x20,
+ 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x7F, 0x80, 0xC0, 0x40, 0x40,
+ 0x60, 0x20, 0x20, 0x30, 0x10, 0x18, 0x18, 0x08, 0x0F, 0xF8, 0xF2, 0x49,
+ 0x24, 0x92, 0x49, 0x24, 0xE0, 0x80, 0x40, 0x10, 0x08, 0x02, 0x01, 0x00,
+ 0x40, 0x20, 0x08, 0x04, 0x01, 0x00, 0xC0, 0x20, 0x18, 0x04, 0x03, 0x00,
+ 0x80, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x49, 0xE0, 0x08, 0x05, 0x01, 0x20,
+ 0x88, 0x61, 0x10, 0x68, 0x0C, 0xFF, 0x80, 0x4C, 0x21, 0x3C, 0x31, 0x00,
+ 0x80, 0x47, 0xE6, 0x12, 0x09, 0x0C, 0x7B, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0xBC, 0xC2, 0x81, 0x81, 0x81, 0x81, 0x83, 0x86, 0xFC, 0x3E, 0x43, 0x80,
+ 0x80, 0x80, 0x80, 0xC0, 0x63, 0x3E, 0x01, 0x01, 0x01, 0x01, 0x3F, 0x41,
+ 0xC1, 0x81, 0x81, 0x81, 0xC1, 0x41, 0x3F, 0x3C, 0x8E, 0x0F, 0xF8, 0x10,
+ 0x30, 0x23, 0x3C, 0x3D, 0x04, 0x10, 0xF1, 0x04, 0x10, 0x41, 0x04, 0x10,
+ 0x40, 0x3F, 0xE3, 0x20, 0x90, 0x4C, 0x63, 0xE2, 0x01, 0x00, 0x7C, 0x43,
+ 0x20, 0x90, 0xC7, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xBE, 0xC3, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0xC0, 0x55, 0x55, 0x40, 0x30, 0x00, 0x22,
+ 0x22, 0x22, 0x22, 0x22, 0x26, 0xC0, 0x81, 0x02, 0x04, 0x08, 0x73, 0x2C,
+ 0x70, 0xB1, 0x32, 0x24, 0x68, 0x60, 0x92, 0x49, 0x24, 0x92, 0x4E, 0xB9,
+ 0xD8, 0xC6, 0x10, 0xC2, 0x18, 0x43, 0x08, 0x61, 0x0C, 0x21, 0x84, 0x20,
+ 0xBE, 0xC3, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x3E, 0x30, 0xB0,
+ 0x70, 0x18, 0x0C, 0x07, 0x06, 0xC6, 0x3E, 0x00, 0xBC, 0xC2, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x82, 0xFC, 0x80, 0x80, 0x80, 0x80, 0x3F, 0x41, 0x81,
+ 0x81, 0x81, 0x81, 0xC1, 0x41, 0x3F, 0x01, 0x01, 0x01, 0x01, 0xBE, 0x21,
+ 0x08, 0x42, 0x10, 0x80, 0x7D, 0x0E, 0x06, 0x03, 0x80, 0xC0, 0xE1, 0x7C,
+ 0x42, 0x11, 0xE4, 0x21, 0x08, 0x42, 0x10, 0xF0, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC3, 0x7A, 0x81, 0x83, 0x82, 0x46, 0x46, 0x24, 0x2C, 0x2C,
+ 0x18, 0xC4, 0x34, 0x62, 0x46, 0x66, 0xA6, 0x29, 0x42, 0x94, 0x29, 0xC1,
+ 0x18, 0x10, 0x80, 0x43, 0x26, 0x24, 0x18, 0x18, 0x1C, 0x24, 0x66, 0xC3,
+ 0xC1, 0xA0, 0x98, 0xC4, 0x43, 0x20, 0xA0, 0x50, 0x38, 0x08, 0x04, 0x06,
+ 0x02, 0x0E, 0x00, 0xFE, 0x08, 0x30, 0xC3, 0x04, 0x10, 0x60, 0xFE, 0x19,
+ 0x08, 0x42, 0x10, 0x84, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x18, 0xFF, 0xFF,
+ 0x80, 0xC1, 0x08, 0x42, 0x10, 0x84, 0x19, 0x08, 0x42, 0x10, 0x84, 0xC0,
+ 0x70, 0xC7, 0x80 };
+
+const GFXglyph EuphemiaCAS9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 4, 1, -12 }, // 0x21 '!'
+ { 5, 5, 3, 7, 1, -12 }, // 0x22 '"'
+ { 7, 14, 15, 16, 1, -13 }, // 0x23 '#'
+ { 34, 8, 17, 10, 1, -14 }, // 0x24 '$'
+ { 51, 13, 15, 17, 2, -13 }, // 0x25 '%'
+ { 76, 11, 13, 13, 1, -12 }, // 0x26 '&'
+ { 94, 2, 3, 4, 1, -12 }, // 0x27 '''
+ { 95, 4, 16, 6, 1, -14 }, // 0x28 '('
+ { 103, 4, 16, 6, 1, -14 }, // 0x29 ')'
+ { 111, 7, 7, 9, 1, -14 }, // 0x2A '*'
+ { 118, 9, 9, 11, 1, -9 }, // 0x2B '+'
+ { 129, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 130, 5, 1, 7, 1, -6 }, // 0x2D '-'
+ { 131, 2, 1, 4, 1, 0 }, // 0x2E '.'
+ { 132, 9, 17, 11, 1, -14 }, // 0x2F '/'
+ { 152, 8, 13, 10, 1, -12 }, // 0x30 '0'
+ { 165, 6, 13, 10, 2, -12 }, // 0x31 '1'
+ { 175, 8, 13, 10, 1, -12 }, // 0x32 '2'
+ { 188, 8, 13, 10, 1, -12 }, // 0x33 '3'
+ { 201, 8, 13, 10, 1, -12 }, // 0x34 '4'
+ { 214, 7, 13, 10, 2, -12 }, // 0x35 '5'
+ { 226, 8, 13, 10, 1, -12 }, // 0x36 '6'
+ { 239, 8, 13, 10, 1, -12 }, // 0x37 '7'
+ { 252, 8, 13, 10, 1, -12 }, // 0x38 '8'
+ { 265, 8, 13, 10, 1, -12 }, // 0x39 '9'
+ { 278, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 280, 2, 11, 4, 1, -7 }, // 0x3B ';'
+ { 283, 7, 13, 9, 1, -12 }, // 0x3C '<'
+ { 295, 9, 4, 11, 1, -8 }, // 0x3D '='
+ { 300, 7, 13, 9, 1, -12 }, // 0x3E '>'
+ { 312, 6, 13, 9, 1, -12 }, // 0x3F '?'
+ { 322, 16, 17, 18, 1, -12 }, // 0x40 '@'
+ { 356, 11, 13, 11, 0, -12 }, // 0x41 'A'
+ { 374, 7, 13, 11, 2, -12 }, // 0x42 'B'
+ { 386, 9, 13, 12, 1, -12 }, // 0x43 'C'
+ { 401, 10, 13, 12, 1, -12 }, // 0x44 'D'
+ { 418, 7, 13, 10, 2, -12 }, // 0x45 'E'
+ { 430, 7, 13, 9, 2, -12 }, // 0x46 'F'
+ { 442, 10, 13, 12, 1, -12 }, // 0x47 'G'
+ { 459, 10, 13, 12, 1, -12 }, // 0x48 'H'
+ { 476, 1, 13, 4, 2, -12 }, // 0x49 'I'
+ { 478, 7, 13, 9, 1, -12 }, // 0x4A 'J'
+ { 490, 9, 13, 11, 2, -12 }, // 0x4B 'K'
+ { 505, 7, 13, 9, 2, -12 }, // 0x4C 'L'
+ { 517, 12, 13, 14, 1, -12 }, // 0x4D 'M'
+ { 537, 10, 13, 12, 1, -12 }, // 0x4E 'N'
+ { 554, 12, 13, 14, 1, -12 }, // 0x4F 'O'
+ { 574, 8, 13, 10, 1, -12 }, // 0x50 'P'
+ { 587, 12, 17, 14, 1, -12 }, // 0x51 'Q'
+ { 613, 9, 13, 11, 1, -12 }, // 0x52 'R'
+ { 628, 9, 13, 11, 0, -12 }, // 0x53 'S'
+ { 643, 9, 13, 11, 1, -12 }, // 0x54 'T'
+ { 658, 11, 13, 13, 1, -12 }, // 0x55 'U'
+ { 676, 10, 13, 11, 0, -12 }, // 0x56 'V'
+ { 693, 15, 13, 16, 0, -12 }, // 0x57 'W'
+ { 718, 11, 13, 11, 0, -12 }, // 0x58 'X'
+ { 736, 9, 13, 10, 1, -12 }, // 0x59 'Y'
+ { 751, 9, 13, 10, 0, -12 }, // 0x5A 'Z'
+ { 766, 3, 17, 5, 1, -14 }, // 0x5B '['
+ { 773, 9, 17, 11, 1, -14 }, // 0x5C '\'
+ { 793, 3, 17, 5, 1, -14 }, // 0x5D ']'
+ { 800, 10, 7, 11, 1, -13 }, // 0x5E '^'
+ { 809, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 811, 4, 4, 0, -2, -13 }, // 0x60 '`'
+ { 813, 9, 9, 10, 1, -8 }, // 0x61 'a'
+ { 824, 8, 13, 10, 1, -12 }, // 0x62 'b'
+ { 837, 8, 9, 9, 1, -8 }, // 0x63 'c'
+ { 846, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 859, 7, 9, 10, 1, -8 }, // 0x65 'e'
+ { 867, 6, 13, 6, 1, -12 }, // 0x66 'f'
+ { 877, 9, 13, 10, 1, -8 }, // 0x67 'g'
+ { 892, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 905, 2, 13, 4, 1, -12 }, // 0x69 'i'
+ { 909, 4, 17, 4, -1, -12 }, // 0x6A 'j'
+ { 918, 7, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 930, 3, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 935, 11, 9, 13, 1, -8 }, // 0x6D 'm'
+ { 948, 8, 9, 10, 1, -8 }, // 0x6E 'n'
+ { 957, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 968, 8, 13, 10, 1, -8 }, // 0x70 'p'
+ { 981, 8, 13, 10, 1, -8 }, // 0x71 'q'
+ { 994, 5, 9, 7, 1, -8 }, // 0x72 'r'
+ { 1000, 7, 9, 9, 1, -8 }, // 0x73 's'
+ { 1008, 5, 12, 6, 1, -11 }, // 0x74 't'
+ { 1016, 7, 9, 10, 1, -8 }, // 0x75 'u'
+ { 1024, 8, 9, 8, -1, -8 }, // 0x76 'v'
+ { 1033, 12, 9, 12, 0, -8 }, // 0x77 'w'
+ { 1047, 8, 9, 8, 0, -8 }, // 0x78 'x'
+ { 1056, 9, 13, 9, 0, -8 }, // 0x79 'y'
+ { 1071, 7, 9, 9, 1, -8 }, // 0x7A 'z'
+ { 1079, 5, 17, 6, 0, -13 }, // 0x7B '{'
+ { 1090, 1, 17, 9, 4, -12 }, // 0x7C '|'
+ { 1093, 5, 17, 6, 1, -13 }, // 0x7D '}'
+ { 1104, 9, 2, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont EuphemiaCAS9pt7b PROGMEM = {
+ (uint8_t *)EuphemiaCAS9pt7bBitmaps,
+ (GFXglyph *)EuphemiaCAS9pt7bGlyphs,
+ 0x20, 0x7E, 24 };
+
+// Approx. 1779 bytes
+const uint8_t Futura9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFC, 0xF0, 0xDE, 0xF7, 0xBD, 0x80, 0x11, 0x84, 0x61,
+ 0x18, 0xC6, 0xFF, 0xFF, 0xF3, 0x30, 0xCC, 0xFF, 0xFF, 0xF2, 0x31, 0x8C,
+ 0x62, 0x18, 0x80, 0x0C, 0x06, 0x0F, 0xCE, 0x76, 0x03, 0x01, 0xC0, 0x78,
+ 0x1F, 0x03, 0xC0, 0x68, 0x3C, 0x1B, 0x1D, 0xFC, 0x7C, 0x0C, 0x06, 0x00,
+ 0x38, 0x30, 0xF8, 0x43, 0x19, 0x86, 0x32, 0x0C, 0x6C, 0x0F, 0x90, 0x0E,
+ 0x40, 0x00, 0x9C, 0x02, 0x7C, 0x05, 0x8C, 0x13, 0x18, 0x66, 0x30, 0x87,
+ 0xC3, 0x07, 0x00, 0x1E, 0x03, 0xF0, 0x33, 0x03, 0x30, 0x3F, 0x01, 0xE0,
+ 0x3C, 0x07, 0xE0, 0xE7, 0x6C, 0x3C, 0xC1, 0x8E, 0x3C, 0x7E, 0xE3, 0xC6,
+ 0xFF, 0xC0, 0x76, 0x66, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xE6, 0x66, 0x20,
+ 0xC6, 0x66, 0x33, 0x33, 0x33, 0x33, 0x33, 0x76, 0x66, 0x40, 0x18, 0x18,
+ 0x7E, 0x7E, 0x3C, 0x66, 0x24, 0x0C, 0x06, 0x03, 0x1F, 0xFF, 0xF8, 0x60,
+ 0x30, 0x18, 0x0C, 0x00, 0x23, 0x26, 0x6C, 0xFF, 0xF0, 0x01, 0x80, 0xC0,
+ 0xC0, 0x60, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x02, 0x03, 0x01,
+ 0x81, 0x80, 0xC0, 0xC0, 0x60, 0x10, 0x00, 0x1C, 0x1F, 0x18, 0xDC, 0x6C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF8, 0xCC, 0x63, 0xE0, 0xE0, 0x7F,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x3F, 0x98, 0xEC, 0x30, 0x18,
+ 0x0C, 0x0C, 0x0E, 0x0E, 0x06, 0x06, 0x06, 0x07, 0xFF, 0xFC, 0x3C, 0x7E,
+ 0xE7, 0x03, 0x03, 0x1E, 0x1E, 0x07, 0x03, 0x03, 0xC3, 0xC7, 0x7E, 0x3C,
+ 0x00, 0x00, 0x10, 0x06, 0x00, 0xC0, 0x38, 0x0F, 0x01, 0xE0, 0x6C, 0x1D,
+ 0x83, 0x30, 0xC6, 0x3F, 0xF7, 0xFE, 0x03, 0x00, 0x60, 0x1F, 0x8F, 0xC6,
+ 0x06, 0x03, 0xE1, 0xF9, 0x8C, 0x03, 0x01, 0x80, 0xD0, 0x7C, 0x67, 0xF1,
+ 0xE0, 0x00, 0x03, 0x03, 0x81, 0x81, 0x81, 0xC0, 0xF8, 0xFE, 0xE3, 0xE0,
+ 0xF0, 0x78, 0x3E, 0x33, 0xF8, 0x78, 0xFF, 0xFF, 0xE0, 0x30, 0x0C, 0x06,
+ 0x01, 0x80, 0xC0, 0x70, 0x18, 0x0C, 0x03, 0x01, 0x80, 0xE0, 0x30, 0x00,
+ 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7,
+ 0x7E, 0x3C, 0x3C, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFE, 0x3E,
+ 0x07, 0x03, 0x03, 0x03, 0x81, 0x80, 0x00, 0xF0, 0x03, 0xC0, 0x33, 0x00,
+ 0x00, 0x32, 0x66, 0x44, 0x01, 0x83, 0xC7, 0x8F, 0x0E, 0x07, 0x01, 0xE0,
+ 0x3C, 0x07, 0x80, 0xC0, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xF8, 0xC0, 0x78,
+ 0x0E, 0x01, 0xC0, 0x38, 0x3C, 0x78, 0xF0, 0xE0, 0x40, 0x00, 0x38, 0xFB,
+ 0x1E, 0x30, 0xE7, 0xBC, 0x60, 0xCD, 0xF9, 0xE0, 0x03, 0x06, 0x00, 0x0F,
+ 0xC0, 0x61, 0xC3, 0x01, 0x99, 0xD6, 0xCF, 0xCF, 0x73, 0x3D, 0x84, 0xF6,
+ 0x33, 0xD8, 0xDB, 0xBD, 0xE7, 0x77, 0x0E, 0x00, 0x3F, 0xE0, 0x3F, 0x00,
+ 0x02, 0x00, 0x10, 0x01, 0xC0, 0x0E, 0x00, 0xF8, 0x06, 0xC0, 0x73, 0x03,
+ 0x18, 0x18, 0xE1, 0xFF, 0x0F, 0xF8, 0xC0, 0x66, 0x03, 0x60, 0x0C, 0xF8,
+ 0xFC, 0xCE, 0xC6, 0xC6, 0xCE, 0xFC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE,
+ 0xFC, 0x0F, 0x83, 0xFC, 0xE1, 0xB0, 0x0E, 0x01, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x1C, 0x01, 0x80, 0x9C, 0x31, 0xFE, 0x1F, 0x00, 0xFC, 0x3F, 0xCC,
+ 0x7B, 0x06, 0xC1, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x7C, 0x1B, 0x1E,
+ 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x06, 0x0C, 0x1F, 0xFF, 0xE0, 0xC1, 0x83,
+ 0x06, 0x0F, 0xFF, 0xC0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F, 0xFF, 0xE0, 0xC1,
+ 0x83, 0x06, 0x0C, 0x18, 0x00, 0x0F, 0x80, 0xFF, 0x0E, 0x1C, 0xC0, 0x4E,
+ 0x00, 0x60, 0x03, 0x07, 0xF8, 0x3F, 0xC0, 0x1F, 0x01, 0xD8, 0x0C, 0x71,
+ 0xE1, 0xFE, 0x07, 0xC0, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xFF, 0xFF,
+ 0xFF, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0xFF, 0xFF,
+ 0xFF, 0xF0, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC7, 0xFB,
+ 0xC0, 0xC1, 0xB0, 0xCC, 0x73, 0x38, 0xDC, 0x3E, 0x0F, 0x03, 0xE0, 0xDC,
+ 0x33, 0x0C, 0x63, 0x1C, 0xC3, 0xB0, 0x70, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x30, 0xC3, 0x0C, 0x30, 0xFF, 0xF0, 0x00, 0x00, 0x20, 0x20, 0xC0, 0x61,
+ 0x80, 0xC3, 0x83, 0x87, 0x07, 0x0F, 0x1E, 0x16, 0x34, 0x6C, 0xEC, 0xCD,
+ 0x99, 0x9B, 0x33, 0x1C, 0x66, 0x38, 0xD8, 0x21, 0xB0, 0x41, 0x80, 0x80,
+ 0x00, 0x08, 0x03, 0xC0, 0x3E, 0x03, 0xF0, 0x3F, 0x83, 0xDC, 0x3C, 0xE3,
+ 0xC7, 0x3C, 0x3B, 0xC1, 0xFC, 0x0F, 0xC0, 0x7C, 0x03, 0xC0, 0x10, 0x00,
+ 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE0, 0x1F, 0x00, 0x3C, 0x00,
+ 0xF0, 0x03, 0xC0, 0x0F, 0x80, 0x76, 0x01, 0x8E, 0x1C, 0x1F, 0xE0, 0x3F,
+ 0x00, 0xF9, 0xFB, 0x3E, 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x06, 0x0C,
+ 0x18, 0x00, 0x0F, 0xC0, 0x7F, 0x83, 0x87, 0x18, 0x06, 0xE0, 0x1F, 0x00,
+ 0x3C, 0x00, 0xF0, 0x03, 0xC3, 0x8F, 0x87, 0x76, 0x0F, 0x8E, 0x1C, 0x1F,
+ 0xF8, 0x3E, 0x70, 0xF8, 0xFC, 0xCE, 0xC6, 0xC6, 0xCE, 0xFC, 0xF8, 0xD0,
+ 0xD8, 0xCC, 0xCC, 0xC6, 0xC7, 0x1E, 0x1F, 0x9C, 0xCC, 0x06, 0x01, 0xC0,
+ 0x78, 0x0E, 0x01, 0x80, 0xF8, 0x6C, 0x77, 0xF0, 0xF0, 0xFF, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C,
+ 0x0D, 0x86, 0x7F, 0x87, 0x80, 0xC0, 0x76, 0x06, 0x60, 0x67, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x19, 0x81, 0x98, 0x1F, 0x00, 0xF0, 0x0F, 0x00, 0x60, 0x06,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x19, 0x81, 0x03, 0x30,
+ 0x60, 0xE7, 0x0E, 0x18, 0x63, 0xC3, 0x0C, 0x78, 0xC0, 0xCD, 0x98, 0x1B,
+ 0x37, 0x03, 0x63, 0xC0, 0x3C, 0x78, 0x07, 0x0E, 0x00, 0xE0, 0xC0, 0x0C,
+ 0x18, 0x01, 0x02, 0x00, 0x00, 0x00, 0x60, 0xC6, 0x38, 0xC6, 0x0D, 0xC1,
+ 0xB0, 0x1C, 0x03, 0x80, 0x70, 0x1F, 0x03, 0x60, 0xC6, 0x18, 0xC6, 0x0D,
+ 0xC1, 0x80, 0xC0, 0xF8, 0x76, 0x18, 0xCC, 0x33, 0x07, 0x81, 0xE0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x9F, 0xE0, 0x30,
+ 0x0C, 0x06, 0x03, 0x80, 0xC0, 0x70, 0x18, 0x0E, 0x03, 0x01, 0x80, 0x7F,
+ 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCF, 0xF0,
+ 0xC0, 0x20, 0x18, 0x0C, 0x03, 0x01, 0x80, 0x40, 0x30, 0x18, 0x06, 0x03,
+ 0x00, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x01, 0x80, 0xC0, 0x00, 0xFF, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x0C, 0x07, 0x81, 0xE0,
+ 0xCC, 0x33, 0x18, 0x66, 0x18, 0xFF, 0xFF, 0xF0, 0xCE, 0x62, 0x3D, 0xBF,
+ 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xC0, 0x60, 0x30,
+ 0x18, 0x0C, 0x06, 0x03, 0x79, 0xFE, 0xE3, 0xE0, 0xF0, 0x78, 0x3E, 0x3F,
+ 0xFB, 0x78, 0x3E, 0xFF, 0x8E, 0x0C, 0x18, 0x38, 0xBF, 0x3E, 0x01, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0x0C, 0xF6, 0xFF, 0xE3, 0xE0, 0xF0, 0x78, 0x3E,
+ 0x3B, 0xFC, 0xF6, 0x3C, 0x7E, 0xE3, 0xFF, 0xFF, 0xC0, 0xE3, 0x7E, 0x3C,
+ 0x3B, 0xD8, 0xC6, 0x33, 0xFF, 0x63, 0x18, 0xC6, 0x31, 0x80, 0x3D, 0xBF,
+ 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xF0, 0x6C, 0x77,
+ 0xF0, 0xF0, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x37, 0x7F, 0xE7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xF1, 0x80, 0xF0, 0x3F, 0xFF, 0xF0, 0xF0, 0x3F, 0xFF, 0xFF,
+ 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xCE, 0xDC, 0xF8, 0xF0, 0xF0,
+ 0xD8, 0xDC, 0xCC, 0xC6, 0xFF, 0xFF, 0xFF, 0xFC, 0xDD, 0xEF, 0xFF, 0xE7,
+ 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xDD, 0xFF,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC6, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x8E, 0xFE, 0x3E, 0x00, 0xDE, 0x7F, 0xB8, 0xF8, 0x3C, 0x1E, 0x0F,
+ 0x8F, 0xFE, 0xDE, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x3D, 0xBF, 0xF8,
+ 0xF8, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0xFB, 0xEE, 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x73, 0xEC, 0x38, 0x38,
+ 0x3C, 0xFF, 0x78, 0x66, 0x6F, 0xF6, 0x66, 0x66, 0x66, 0xC7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xF1, 0xBE, 0x38, 0xC3, 0xB1, 0x99, 0xC6, 0xC3, 0x60, 0xE0,
+ 0x70, 0x10, 0x08, 0x00, 0x00, 0x03, 0x08, 0x66, 0x31, 0x99, 0xCC, 0x37,
+ 0xB0, 0xDF, 0x81, 0xCE, 0x07, 0x38, 0x08, 0xC0, 0x21, 0x00, 0x61, 0x8C,
+ 0xC1, 0xE0, 0x78, 0x0C, 0x07, 0x83, 0x31, 0xCE, 0xE1, 0x80, 0xE1, 0xB0,
+ 0xDC, 0xC6, 0x63, 0xE0, 0xF0, 0x70, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x07,
+ 0x03, 0x00, 0x7F, 0xBF, 0x81, 0x81, 0x81, 0xC1, 0xC0, 0xC0, 0xFF, 0xFF,
+ 0x80, 0x3B, 0xD8, 0xC6, 0x31, 0x8C, 0xE6, 0x38, 0xC6, 0x31, 0x8C, 0x63,
+ 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xE7, 0x8C, 0x63, 0x18, 0xC6, 0x38,
+ 0xCE, 0x63, 0x18, 0xC6, 0x37, 0xB8, 0x78, 0xFF, 0xE3, 0xC0 };
+
+const GFXglyph Futura9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
+ { 1, 2, 14, 6, 2, -13 }, // 0x21 '!'
+ { 5, 5, 5, 7, 1, -13 }, // 0x22 '"'
+ { 9, 10, 14, 12, 1, -13 }, // 0x23 '#'
+ { 27, 9, 18, 11, 1, -15 }, // 0x24 '$'
+ { 48, 15, 14, 17, 1, -13 }, // 0x25 '%'
+ { 75, 12, 14, 13, 1, -13 }, // 0x26 '&'
+ { 96, 2, 5, 4, 1, -13 }, // 0x27 '''
+ { 98, 4, 19, 7, 2, -14 }, // 0x28 '('
+ { 108, 4, 19, 7, 1, -14 }, // 0x29 ')'
+ { 118, 8, 7, 12, 2, -14 }, // 0x2A '*'
+ { 125, 9, 9, 11, 1, -11 }, // 0x2B '+'
+ { 136, 4, 6, 5, 0, -2 }, // 0x2C ','
+ { 139, 4, 2, 4, 0, -5 }, // 0x2D '-'
+ { 140, 2, 2, 6, 2, -1 }, // 0x2E '.'
+ { 141, 9, 19, 9, 0, -14 }, // 0x2F '/'
+ { 163, 9, 14, 11, 1, -13 }, // 0x30 '0'
+ { 179, 4, 14, 11, 3, -13 }, // 0x31 '1'
+ { 186, 9, 14, 11, 0, -13 }, // 0x32 '2'
+ { 202, 8, 14, 11, 1, -13 }, // 0x33 '3'
+ { 216, 11, 15, 11, 0, -14 }, // 0x34 '4'
+ { 237, 9, 14, 11, 1, -13 }, // 0x35 '5'
+ { 253, 9, 15, 11, 1, -14 }, // 0x36 '6'
+ { 270, 10, 14, 11, 1, -13 }, // 0x37 '7'
+ { 288, 8, 14, 11, 1, -13 }, // 0x38 '8'
+ { 302, 9, 15, 11, 1, -13 }, // 0x39 '9'
+ { 319, 2, 9, 6, 2, -8 }, // 0x3A ':'
+ { 322, 4, 12, 5, 0, -8 }, // 0x3B ';'
+ { 328, 9, 10, 11, 1, -11 }, // 0x3C '<'
+ { 340, 9, 5, 11, 1, -9 }, // 0x3D '='
+ { 346, 9, 10, 11, 1, -11 }, // 0x3E '>'
+ { 358, 7, 14, 9, 1, -13 }, // 0x3F '?'
+ { 371, 14, 14, 16, 1, -13 }, // 0x40 '@'
+ { 396, 13, 14, 13, 0, -13 }, // 0x41 'A'
+ { 419, 8, 14, 11, 2, -13 }, // 0x42 'B'
+ { 433, 11, 14, 12, 1, -13 }, // 0x43 'C'
+ { 453, 10, 14, 13, 2, -13 }, // 0x44 'D'
+ { 471, 7, 14, 10, 2, -13 }, // 0x45 'E'
+ { 484, 7, 14, 9, 2, -13 }, // 0x46 'F'
+ { 497, 13, 14, 15, 1, -13 }, // 0x47 'G'
+ { 520, 10, 14, 14, 2, -13 }, // 0x48 'H'
+ { 538, 2, 14, 6, 2, -13 }, // 0x49 'I'
+ { 542, 6, 14, 8, 0, -13 }, // 0x4A 'J'
+ { 553, 10, 14, 12, 2, -13 }, // 0x4B 'K'
+ { 571, 6, 14, 9, 2, -13 }, // 0x4C 'L'
+ { 582, 15, 16, 17, 1, -14 }, // 0x4D 'M'
+ { 612, 12, 16, 16, 2, -14 }, // 0x4E 'N'
+ { 636, 14, 14, 16, 1, -13 }, // 0x4F 'O'
+ { 661, 7, 14, 10, 2, -13 }, // 0x50 'P'
+ { 674, 14, 14, 16, 1, -13 }, // 0x51 'Q'
+ { 699, 8, 14, 11, 2, -13 }, // 0x52 'R'
+ { 713, 9, 14, 11, 1, -13 }, // 0x53 'S'
+ { 729, 8, 14, 10, 1, -13 }, // 0x54 'T'
+ { 743, 10, 14, 14, 2, -13 }, // 0x55 'U'
+ { 761, 12, 15, 12, 0, -13 }, // 0x56 'V'
+ { 784, 19, 16, 19, 0, -14 }, // 0x57 'W'
+ { 822, 11, 14, 11, 0, -13 }, // 0x58 'X'
+ { 842, 10, 14, 10, 0, -13 }, // 0x59 'Y'
+ { 860, 10, 14, 11, 1, -13 }, // 0x5A 'Z'
+ { 878, 4, 19, 6, 2, -14 }, // 0x5B '['
+ { 888, 9, 19, 9, 0, -14 }, // 0x5C '\'
+ { 910, 4, 19, 6, 0, -14 }, // 0x5D ']'
+ { 920, 10, 7, 10, 0, -13 }, // 0x5E '^'
+ { 929, 10, 2, 10, 0, 2 }, // 0x5F '_'
+ { 932, 4, 4, 10, 2, -13 }, // 0x60 '`'
+ { 934, 9, 9, 11, 1, -8 }, // 0x61 'a'
+ { 945, 9, 15, 11, 1, -14 }, // 0x62 'b'
+ { 962, 7, 9, 9, 1, -8 }, // 0x63 'c'
+ { 970, 9, 15, 11, 1, -14 }, // 0x64 'd'
+ { 987, 8, 9, 10, 1, -8 }, // 0x65 'e'
+ { 996, 5, 15, 6, 1, -14 }, // 0x66 'f'
+ { 1006, 9, 14, 11, 1, -8 }, // 0x67 'g'
+ { 1022, 7, 15, 9, 1, -14 }, // 0x68 'h'
+ { 1036, 2, 14, 4, 1, -13 }, // 0x69 'i'
+ { 1040, 2, 19, 4, 1, -13 }, // 0x6A 'j'
+ { 1045, 8, 15, 9, 1, -14 }, // 0x6B 'k'
+ { 1060, 2, 15, 4, 1, -14 }, // 0x6C 'l'
+ { 1064, 12, 9, 14, 1, -8 }, // 0x6D 'm'
+ { 1078, 7, 9, 9, 1, -8 }, // 0x6E 'n'
+ { 1086, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 1097, 9, 14, 11, 1, -8 }, // 0x70 'p'
+ { 1113, 9, 14, 11, 1, -8 }, // 0x71 'q'
+ { 1129, 6, 9, 6, 1, -8 }, // 0x72 'r'
+ { 1136, 6, 9, 8, 1, -8 }, // 0x73 's'
+ { 1143, 4, 12, 6, 1, -11 }, // 0x74 't'
+ { 1149, 7, 9, 9, 1, -8 }, // 0x75 'u'
+ { 1157, 9, 9, 9, 0, -8 }, // 0x76 'v'
+ { 1168, 14, 10, 14, 0, -9 }, // 0x77 'w'
+ { 1186, 10, 9, 10, 0, -8 }, // 0x78 'x'
+ { 1198, 9, 14, 10, 0, -8 }, // 0x79 'y'
+ { 1214, 9, 9, 9, 0, -8 }, // 0x7A 'z'
+ { 1225, 5, 19, 6, 1, -14 }, // 0x7B '{'
+ { 1237, 2, 17, 10, 4, -13 }, // 0x7C '|'
+ { 1242, 5, 19, 6, 0, -14 }, // 0x7D '}'
+ { 1254, 9, 3, 13, 2, -14 } }; // 0x7E '~'
+
+const GFXfont Futura9pt7b PROGMEM = {
+ (uint8_t *)Futura9pt7bBitmaps,
+ (GFXglyph *)Futura9pt7bGlyphs,
+ 0x20, 0x7E, 23 };
+
+// Approx. 1930 bytes
+const uint8_t GillSans9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFE, 0x0F, 0xDE, 0xF7, 0xBD, 0x80, 0x08, 0x82, 0x10, 0x42,
+ 0x7F, 0xF1, 0x08, 0x42, 0x08, 0x47, 0xFF, 0x21, 0x0C, 0x21, 0x08, 0x21,
+ 0x00, 0x18, 0x3C, 0xFE, 0xDA, 0xD8, 0xF8, 0x7C, 0x1E, 0x1B, 0x9B, 0xFF,
+ 0x7E, 0x18, 0x18, 0x70, 0x5F, 0x13, 0x64, 0x7C, 0x87, 0x20, 0x08, 0x01,
+ 0x00, 0x4E, 0x13, 0xE2, 0x6C, 0x8F, 0xA0, 0xE0, 0x1E, 0x07, 0xE0, 0xCC,
+ 0x19, 0x83, 0xE0, 0x30, 0x0F, 0x3B, 0x3E, 0xC3, 0x98, 0xF3, 0xF3, 0x3C,
+ 0x70, 0xFF, 0xC0, 0x18, 0x88, 0xC4, 0x63, 0x18, 0xC6, 0x30, 0x86, 0x10,
+ 0xC3, 0xC3, 0x08, 0x61, 0x0C, 0x63, 0x18, 0xC6, 0x23, 0x11, 0x18, 0x10,
+ 0x23, 0x5B, 0xE1, 0x0F, 0xB5, 0x88, 0x10, 0x08, 0x04, 0x02, 0x01, 0x0F,
+ 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xF6, 0xFF, 0xF0, 0x08, 0x44, 0x21,
+ 0x10, 0x88, 0x42, 0x21, 0x00, 0x38, 0xF9, 0xB6, 0x3C, 0x78, 0xF1, 0xE3,
+ 0xC6, 0xD9, 0xF1, 0xC0, 0xFF, 0xFF, 0xFF, 0x78, 0xFC, 0xCE, 0x86, 0x06,
+ 0x04, 0x0C, 0x18, 0x10, 0x20, 0x7F, 0xFF, 0x7B, 0xF8, 0xC3, 0x0C, 0xE3,
+ 0xC3, 0x0E, 0x3F, 0x9C, 0x06, 0x06, 0x0E, 0x1E, 0x36, 0x26, 0x66, 0xFF,
+ 0xFF, 0x06, 0x06, 0x06, 0x7C, 0xF9, 0x83, 0x07, 0x8F, 0x83, 0x83, 0x07,
+ 0x1F, 0xF3, 0xC0, 0x10, 0x70, 0xC3, 0x86, 0x1F, 0xBF, 0xE3, 0xC7, 0x8D,
+ 0xF1, 0xC0, 0xFF, 0xFE, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30,
+ 0x60, 0x60, 0x38, 0xFB, 0x1E, 0x3C, 0x67, 0x1F, 0x63, 0xC7, 0x8D, 0xF1,
+ 0xC0, 0x38, 0xFB, 0x1E, 0x3C, 0x6F, 0xCF, 0x86, 0x1C, 0x71, 0xC1, 0x00,
+ 0xF0, 0x0F, 0xF0, 0x0F, 0x60, 0x00, 0x83, 0xCF, 0xDF, 0x0C, 0x07, 0xC0,
+ 0xFC, 0x0F, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x1F, 0xF0, 0x80, 0x78, 0x1F,
+ 0x81, 0xF0, 0x18, 0x7D, 0xF9, 0xE0, 0x80, 0x00, 0x6F, 0x33, 0x37, 0x66,
+ 0x20, 0x66, 0x07, 0xF0, 0x0F, 0xF8, 0x3C, 0x1C, 0x30, 0x06, 0x63, 0x9F,
+ 0x67, 0xF3, 0xC6, 0x73, 0xCC, 0x33, 0xCC, 0x33, 0xCC, 0x66, 0xCC, 0x6E,
+ 0xCF, 0xFC, 0x67, 0x78, 0x70, 0x03, 0x3C, 0x0E, 0x1F, 0xFC, 0x07, 0xF0,
+ 0x02, 0x00, 0x38, 0x01, 0xC0, 0x1B, 0x00, 0xD8, 0x0C, 0x60, 0x63, 0x07,
+ 0xFC, 0x3F, 0xE3, 0x01, 0x98, 0x0D, 0x80, 0x30, 0xFC, 0xFE, 0xC6, 0xC6,
+ 0xC6, 0xFC, 0xFE, 0xC3, 0xC3, 0xC3, 0xFE, 0xFC, 0x0F, 0xC7, 0xFD, 0xC0,
+ 0xB0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0x60, 0x0E, 0x04, 0xFF, 0x87,
+ 0xE0, 0xFF, 0x0F, 0xFC, 0xC0, 0xEC, 0x06, 0xC0, 0x3C, 0x03, 0xC0, 0x3C,
+ 0x03, 0xC0, 0x6C, 0x0E, 0xFF, 0xCF, 0xF0, 0xFF, 0xFF, 0x06, 0x0C, 0x1F,
+ 0xFF, 0xE0, 0xC1, 0x83, 0xFF, 0xF0, 0xFF, 0xFC, 0x30, 0xC3, 0xFF, 0xF0,
+ 0xC3, 0x0C, 0x30, 0x0F, 0xC7, 0xFD, 0xC0, 0xB0, 0x0C, 0x01, 0x80, 0x30,
+ 0x7E, 0x0F, 0xE0, 0x6E, 0x0C, 0xFF, 0x87, 0xC0, 0xC0, 0x78, 0x0F, 0x01,
+ 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
+ 0x30, 0xFF, 0xFF, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFE,
+ 0xC1, 0xB0, 0xCC, 0x63, 0x30, 0xD8, 0x3C, 0x0D, 0x83, 0x30, 0xC6, 0x30,
+ 0xCC, 0x1B, 0x03, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83,
+ 0xFF, 0xF0, 0xC0, 0xFC, 0x1F, 0xC7, 0xED, 0xBD, 0xF7, 0x9C, 0xF1, 0x1E,
+ 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x30, 0xC0, 0x3E, 0x03, 0xF0, 0x3D,
+ 0x83, 0xCC, 0x3C, 0x63, 0xC6, 0x3C, 0x33, 0xC1, 0xBC, 0x0F, 0xC0, 0x7C,
+ 0x03, 0x0F, 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x03, 0x60, 0x33, 0x83, 0x8F, 0xF8, 0x1F, 0x00, 0xFC, 0xFE, 0xC3,
+ 0xC3, 0xC3, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x81, 0xFF,
+ 0x1C, 0x1C, 0xC0, 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xE0, 0x33,
+ 0x83, 0x8F, 0xF8, 0x3F, 0x00, 0x3F, 0x80, 0x78, 0xF8, 0x7E, 0x31, 0x98,
+ 0xCC, 0x67, 0xE3, 0xE1, 0x98, 0xC6, 0x63, 0x30, 0xD8, 0x30, 0x7B, 0xFC,
+ 0x70, 0xC1, 0xC3, 0x83, 0x0E, 0x3F, 0xDE, 0xFF, 0xFF, 0xF0, 0xC0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xC0, 0x78,
+ 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x7C, 0x1D,
+ 0xFF, 0x0F, 0x80, 0xC0, 0x6C, 0x19, 0x83, 0x30, 0x63, 0x18, 0x63, 0x06,
+ 0xC0, 0xD8, 0x0E, 0x01, 0xC0, 0x38, 0x02, 0x00, 0xC0, 0xE0, 0x6C, 0x1C,
+ 0x19, 0x86, 0x83, 0x38, 0xD8, 0xE3, 0x1B, 0x18, 0x66, 0x33, 0x06, 0xC6,
+ 0xC0, 0xD8, 0xD8, 0x0E, 0x0E, 0x01, 0xC1, 0xC0, 0x38, 0x38, 0x02, 0x02,
+ 0x00, 0xC0, 0x1B, 0x01, 0x8C, 0x18, 0x31, 0x80, 0xD8, 0x03, 0x80, 0x1C,
+ 0x01, 0xB0, 0x18, 0xC1, 0x83, 0x18, 0x0D, 0x80, 0x70, 0xC0, 0x6C, 0x18,
+ 0xC6, 0x0C, 0xC0, 0xF0, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18,
+ 0x03, 0x00, 0x7F, 0xEF, 0xF8, 0x06, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00,
+ 0xC0, 0x18, 0x06, 0x01, 0xFF, 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC,
+ 0xCC, 0xCC, 0xFF, 0x84, 0x10, 0x84, 0x10, 0x82, 0x10, 0x82, 0x10, 0xFF,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFF, 0x38, 0x71, 0xB3, 0x66, 0xD8,
+ 0xF1, 0x80, 0xFF, 0xC0, 0xCC, 0x80, 0x79, 0xFA, 0x30, 0xE6, 0xD9, 0xB3,
+ 0x3F, 0xC1, 0x83, 0x06, 0x0D, 0xDF, 0xB3, 0xE3, 0xC7, 0x9F, 0xF7, 0xC0,
+ 0x3D, 0xFE, 0x30, 0xC3, 0x87, 0xCF, 0x06, 0x0C, 0x18, 0x33, 0xEF, 0xF9,
+ 0xE3, 0xC7, 0x8D, 0xF9, 0xF0, 0x38, 0xFB, 0x1F, 0xFC, 0x1C, 0x1F, 0x9F,
+ 0x3B, 0xD8, 0xCF, 0x79, 0x8C, 0x63, 0x18, 0xC0, 0x7F, 0x9F, 0x36, 0x67,
+ 0x98, 0x3C, 0x3E, 0xCF, 0x0F, 0x3B, 0xE0, 0xC1, 0x83, 0x06, 0x0D, 0xDF,
+ 0xF9, 0xE3, 0xC7, 0x8F, 0x1E, 0x30, 0xF3, 0xFF, 0xFC, 0x6C, 0x36, 0xDB,
+ 0x6D, 0xB7, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0xD8, 0xF0, 0xD8,
+ 0xCC, 0xC6, 0xC3, 0xFF, 0xFF, 0xFF, 0xDC, 0xEF, 0xFF, 0xC6, 0x3C, 0x63,
+ 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xDD, 0xFF, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xE3, 0x3C, 0x7E, 0xE7, 0xC3, 0xC3, 0xE7, 0x7E, 0x3C, 0xF9, 0xFB, 0x3E,
+ 0x3C, 0x79, 0xFF, 0x7C, 0xC1, 0x83, 0x06, 0x00, 0x3E, 0xFF, 0x9E, 0x3C,
+ 0x7C, 0xDF, 0x9F, 0x06, 0x0C, 0x18, 0x30, 0xDB, 0xFE, 0xB0, 0xC3, 0x0C,
+ 0x30, 0x77, 0xF2, 0xC3, 0x4F, 0xEE, 0x00, 0x87, 0xFF, 0x61, 0x86, 0x18,
+ 0x7C, 0xF0, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xFF, 0xBB, 0xC7, 0x8D, 0xB3,
+ 0x66, 0xC7, 0x8E, 0x1C, 0xC7, 0x1E, 0x38, 0xD9, 0xCC, 0xDB, 0x66, 0xDB,
+ 0x1C, 0x70, 0xE3, 0x86, 0x0C, 0xC1, 0xB1, 0x8D, 0x83, 0x81, 0xC1, 0xB1,
+ 0x8D, 0x83, 0xC3, 0x66, 0x66, 0x3C, 0x3C, 0x18, 0x18, 0x30, 0x30, 0x60,
+ 0x60, 0xC0, 0xFF, 0xF8, 0x70, 0xC3, 0x0E, 0x1F, 0xFF, 0x1C, 0xF3, 0x0C,
+ 0x30, 0xC3, 0x18, 0x83, 0x87, 0x0C, 0x30, 0xC3, 0x0F, 0x1C, 0xFF, 0xFF,
+ 0xE3, 0xC3, 0x0C, 0x30, 0xC3, 0x06, 0x04, 0x73, 0x8C, 0x30, 0xC3, 0x3C,
+ 0xE0, 0xF8, 0xC7, 0xC0 };
+
+const GFXglyph GillSans9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 5, 1, -11 }, // 0x21 '!'
+ { 4, 5, 5, 6, 1, -11 }, // 0x22 '"'
+ { 8, 11, 12, 11, 0, -11 }, // 0x23 '#'
+ { 25, 8, 14, 10, 1, -11 }, // 0x24 '$'
+ { 39, 11, 12, 12, 0, -11 }, // 0x25 '%'
+ { 56, 11, 12, 11, 1, -11 }, // 0x26 '&'
+ { 73, 2, 5, 3, 1, -11 }, // 0x27 '''
+ { 75, 5, 16, 6, 1, -11 }, // 0x28 '('
+ { 85, 5, 16, 6, 0, -11 }, // 0x29 ')'
+ { 95, 7, 9, 8, 0, -12 }, // 0x2A '*'
+ { 103, 9, 9, 11, 1, -10 }, // 0x2B '+'
+ { 114, 2, 4, 4, 1, -1 }, // 0x2C ','
+ { 115, 4, 2, 6, 1, -4 }, // 0x2D '-'
+ { 116, 2, 2, 4, 1, -1 }, // 0x2E '.'
+ { 117, 5, 12, 5, 0, -11 }, // 0x2F '/'
+ { 125, 7, 12, 9, 1, -11 }, // 0x30 '0'
+ { 136, 2, 12, 9, 3, -11 }, // 0x31 '1'
+ { 139, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 151, 6, 12, 9, 1, -11 }, // 0x33 '3'
+ { 160, 8, 12, 9, 0, -11 }, // 0x34 '4'
+ { 172, 7, 12, 9, 1, -11 }, // 0x35 '5'
+ { 183, 7, 12, 9, 1, -11 }, // 0x36 '6'
+ { 194, 8, 12, 9, 1, -11 }, // 0x37 '7'
+ { 206, 7, 12, 9, 1, -11 }, // 0x38 '8'
+ { 217, 7, 12, 9, 1, -11 }, // 0x39 '9'
+ { 228, 2, 8, 4, 1, -7 }, // 0x3A ':'
+ { 230, 2, 10, 4, 1, -7 }, // 0x3B ';'
+ { 233, 9, 9, 11, 1, -10 }, // 0x3C '<'
+ { 244, 9, 4, 11, 1, -8 }, // 0x3D '='
+ { 249, 9, 9, 11, 1, -10 }, // 0x3E '>'
+ { 260, 4, 12, 6, 1, -11 }, // 0x3F '?'
+ { 266, 16, 17, 18, 1, -12 }, // 0x40 '@'
+ { 300, 13, 12, 12, 0, -11 }, // 0x41 'A'
+ { 320, 8, 12, 10, 1, -11 }, // 0x42 'B'
+ { 332, 11, 12, 13, 1, -11 }, // 0x43 'C'
+ { 349, 12, 12, 14, 1, -11 }, // 0x44 'D'
+ { 367, 7, 12, 9, 1, -11 }, // 0x45 'E'
+ { 378, 6, 12, 8, 1, -11 }, // 0x46 'F'
+ { 387, 11, 12, 13, 1, -11 }, // 0x47 'G'
+ { 404, 11, 12, 13, 1, -11 }, // 0x48 'H'
+ { 421, 2, 12, 5, 1, -11 }, // 0x49 'I'
+ { 424, 4, 16, 5, -1, -11 }, // 0x4A 'J'
+ { 432, 10, 12, 12, 1, -11 }, // 0x4B 'K'
+ { 447, 7, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 458, 11, 12, 14, 1, -11 }, // 0x4D 'M'
+ { 475, 12, 12, 14, 1, -11 }, // 0x4E 'N'
+ { 493, 13, 12, 15, 1, -11 }, // 0x4F 'O'
+ { 513, 8, 12, 9, 1, -11 }, // 0x50 'P'
+ { 525, 13, 14, 15, 1, -11 }, // 0x51 'Q'
+ { 548, 9, 12, 11, 1, -11 }, // 0x52 'R'
+ { 562, 6, 12, 8, 1, -11 }, // 0x53 'S'
+ { 571, 10, 12, 11, 0, -11 }, // 0x54 'T'
+ { 586, 11, 12, 13, 1, -11 }, // 0x55 'U'
+ { 603, 11, 12, 11, 0, -11 }, // 0x56 'V'
+ { 620, 19, 12, 19, 0, -11 }, // 0x57 'W'
+ { 649, 13, 12, 13, 0, -11 }, // 0x58 'X'
+ { 669, 11, 12, 11, 0, -11 }, // 0x59 'Y'
+ { 686, 11, 12, 12, 0, -11 }, // 0x5A 'Z'
+ { 703, 4, 16, 6, 2, -11 }, // 0x5B '['
+ { 711, 5, 12, 5, 0, -11 }, // 0x5C '\'
+ { 719, 4, 16, 6, 0, -11 }, // 0x5D ']'
+ { 727, 7, 7, 8, 0, -11 }, // 0x5E '^'
+ { 734, 10, 1, 10, 0, 4 }, // 0x5F '_'
+ { 736, 3, 3, 6, 1, -12 }, // 0x60 '`'
+ { 738, 7, 8, 8, 1, -7 }, // 0x61 'a'
+ { 745, 7, 12, 9, 1, -11 }, // 0x62 'b'
+ { 756, 6, 8, 8, 1, -7 }, // 0x63 'c'
+ { 762, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 773, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 780, 5, 12, 5, 0, -11 }, // 0x66 'f'
+ { 788, 7, 12, 8, 1, -7 }, // 0x67 'g'
+ { 799, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 810, 2, 11, 4, 1, -10 }, // 0x69 'i'
+ { 813, 3, 15, 4, 0, -10 }, // 0x6A 'j'
+ { 819, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 831, 2, 12, 4, 1, -11 }, // 0x6C 'l'
+ { 834, 12, 8, 14, 1, -7 }, // 0x6D 'm'
+ { 846, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 853, 8, 8, 10, 1, -7 }, // 0x6F 'o'
+ { 861, 7, 12, 9, 1, -7 }, // 0x70 'p'
+ { 872, 7, 12, 9, 1, -7 }, // 0x71 'q'
+ { 883, 6, 8, 7, 1, -7 }, // 0x72 'r'
+ { 889, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 894, 6, 10, 6, 0, -9 }, // 0x74 't'
+ { 902, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 909, 7, 8, 8, 0, -7 }, // 0x76 'v'
+ { 916, 13, 8, 13, 0, -7 }, // 0x77 'w'
+ { 929, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 938, 8, 12, 8, 0, -7 }, // 0x79 'y'
+ { 950, 7, 8, 8, 0, -7 }, // 0x7A 'z'
+ { 957, 6, 17, 6, 0, -12 }, // 0x7B '{'
+ { 970, 1, 16, 5, 2, -11 }, // 0x7C '|'
+ { 972, 6, 17, 6, 0, -12 }, // 0x7D '}'
+ { 985, 9, 2, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont GillSans9pt7b PROGMEM = {
+ (uint8_t *)GillSans9pt7bBitmaps,
+ (GFXglyph *)GillSans9pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+
+// Approx. 1660 bytes
+const uint8_t ptmono9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xCF, 0xC0, 0xCF, 0x3C, 0xF3, 0xCE, 0x20, 0x1D, 0xC6,
+ 0x61, 0x99, 0xFF, 0x7F, 0xCC, 0xC3, 0x33, 0xFE, 0xFF, 0x8C, 0xC6, 0x61,
+ 0x98, 0x18, 0x18, 0x3E, 0x7E, 0xCA, 0xC8, 0xE8, 0x78, 0x7E, 0x1F, 0x17,
+ 0x13, 0x93, 0xFE, 0xFC, 0x18, 0x18, 0x70, 0x5F, 0x0F, 0x63, 0x6C, 0xCF,
+ 0xB0, 0xEC, 0x01, 0x00, 0x6E, 0x1B, 0xE6, 0x6D, 0x8D, 0xE1, 0xF4, 0x1C,
+ 0x3C, 0x1F, 0x86, 0x61, 0x98, 0x3C, 0x0E, 0x07, 0x8F, 0x33, 0xC6, 0xF0,
+ 0xEE, 0x39, 0xFF, 0x3C, 0x40, 0xFF, 0xE0, 0x06, 0x3C, 0xE3, 0x86, 0x1C,
+ 0x30, 0x60, 0xC1, 0x83, 0x07, 0x06, 0x0E, 0x0E, 0x0F, 0x06, 0xC1, 0xE0,
+ 0xE0, 0xE0, 0xC1, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x70, 0xC3, 0x8E, 0x78,
+ 0xC0, 0x22, 0x3B, 0x85, 0x1F, 0xFF, 0xF8, 0xA1, 0xD8, 0x46, 0x18, 0x18,
+ 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x67, 0x71, 0x2C, 0xFF,
+ 0xC0, 0xFF, 0x80, 0x02, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18,
+ 0x30, 0x30, 0x70, 0x60, 0x60, 0xC0, 0x40, 0x3E, 0x3F, 0x98, 0xD8, 0x3C,
+ 0x7E, 0x7F, 0x77, 0xF3, 0xE1, 0xE0, 0xD8, 0xCF, 0xE3, 0xE0, 0x18, 0x38,
+ 0x78, 0xD8, 0x98, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x7C,
+ 0xFE, 0x47, 0x03, 0x03, 0x03, 0x06, 0x0C, 0x18, 0x38, 0x60, 0xFF, 0xFF,
+ 0xFE, 0xFE, 0x0C, 0x1C, 0x18, 0x3E, 0x3F, 0x07, 0x03, 0x03, 0x87, 0xFE,
+ 0xFC, 0x03, 0x01, 0xC0, 0xF0, 0x7C, 0x3B, 0x0C, 0xC6, 0x33, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x7F, 0x60, 0x60, 0x60, 0x7C,
+ 0x7E, 0x07, 0x03, 0x03, 0x87, 0xFE, 0xFC, 0x06, 0x0F, 0x0E, 0x0E, 0x06,
+ 0x06, 0xF3, 0xFD, 0xC7, 0xC1, 0xE0, 0xF8, 0xEF, 0xE3, 0xE0, 0xFF, 0xFF,
+ 0x07, 0x06, 0x0E, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0xE0, 0x3E,
+ 0x3F, 0xF8, 0xF8, 0x3E, 0x31, 0xF0, 0xFC, 0xCF, 0xC1, 0xE0, 0xF8, 0xEF,
+ 0xE3, 0xE0, 0x3E, 0x3F, 0xB8, 0xF8, 0x3C, 0x1F, 0x0D, 0xFE, 0x7B, 0x03,
+ 0x01, 0x83, 0x87, 0x83, 0x80, 0xFF, 0x80, 0x07, 0xFC, 0x77, 0x70, 0x00,
+ 0x06, 0x77, 0x12, 0xC0, 0x01, 0x01, 0xC3, 0xC7, 0x87, 0x07, 0x01, 0xE0,
+ 0x78, 0x0F, 0x01, 0xC0, 0x40, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC,
+ 0x40, 0x70, 0x1E, 0x03, 0xC0, 0x70, 0x1C, 0x3C, 0x3C, 0x78, 0x70, 0x10,
+ 0x00, 0x3E, 0x3F, 0xF0, 0x60, 0x30, 0x38, 0x38, 0x38, 0x30, 0x18, 0x00,
+ 0x06, 0x03, 0x81, 0x80, 0x0F, 0x07, 0xF1, 0xC3, 0x30, 0x6E, 0x0D, 0x9F,
+ 0xB7, 0xF6, 0xC6, 0xD8, 0xDB, 0xFF, 0xBB, 0xB0, 0x07, 0x88, 0x7F, 0x83,
+ 0xF0, 0x0C, 0x03, 0x01, 0xE0, 0x78, 0x1E, 0x0C, 0xC3, 0x30, 0xCC, 0x7F,
+ 0x9F, 0xE6, 0x1B, 0x03, 0xC0, 0xC0, 0xFE, 0x7F, 0xF0, 0x78, 0x3C, 0x37,
+ 0xF3, 0xFD, 0x87, 0xC1, 0xE0, 0xF0, 0xFF, 0xEF, 0xE0, 0x1F, 0x9F, 0xDC,
+ 0x6C, 0x3C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x70, 0xDC, 0x67, 0xF1, 0xF0,
+ 0xFC, 0x7F, 0xB0, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xF1,
+ 0xDF, 0xCF, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x1F, 0x9F, 0xDC, 0x6C, 0x3C, 0x06, 0x03,
+ 0x1F, 0x8F, 0xC1, 0xB0, 0xDC, 0x67, 0xF1, 0xF0, 0xC1, 0xE0, 0xF0, 0x78,
+ 0x3C, 0x1F, 0xFF, 0xFF, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x18, 0xFF,
+ 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x87, 0xFE,
+ 0x7C, 0xC1, 0xF0, 0xEC, 0x73, 0x1C, 0xCE, 0x3F, 0x0F, 0xC3, 0x38, 0xC6,
+ 0x31, 0xCC, 0x3B, 0x0E, 0xC1, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC1, 0xF1, 0xFD, 0xFE, 0xFF,
+ 0xFE, 0xEF, 0x27, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x18, 0xC1, 0xF0,
+ 0xF8, 0x7E, 0x3F, 0x9F, 0xCF, 0x77, 0xBF, 0xCF, 0xE3, 0xF1, 0xF8, 0x7C,
+ 0x18, 0x1E, 0x1F, 0xE6, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0,
+ 0xF0, 0x36, 0x19, 0xFE, 0x1E, 0x00, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E,
+ 0x0F, 0x0F, 0xFE, 0xFC, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x1E, 0x1F, 0xE6,
+ 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36, 0x19, 0xFE,
+ 0x1E, 0x03, 0x00, 0x7C, 0x0F, 0xFC, 0x7F, 0x31, 0xD8, 0x6C, 0x36, 0x3B,
+ 0xF9, 0xF8, 0xCE, 0x67, 0x31, 0xD8, 0xEC, 0x38, 0x3F, 0xBF, 0xF0, 0x78,
+ 0x3E, 0x03, 0xC0, 0xF8, 0x1F, 0x01, 0xE0, 0xF0, 0xFF, 0xE7, 0xE0, 0xFF,
+ 0xFF, 0xFC, 0xCF, 0x33, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0xFC, 0x3F, 0x00, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07,
+ 0x83, 0xC1, 0xE0, 0xF8, 0xEF, 0xE3, 0xE0, 0xE1, 0xF8, 0x76, 0x19, 0xC6,
+ 0x73, 0x8C, 0xC3, 0x30, 0xEC, 0x3F, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00,
+ 0xC0, 0x78, 0x0F, 0x01, 0xF0, 0x3E, 0x66, 0xDD, 0x9B, 0xB3, 0x5E, 0x7B,
+ 0xCF, 0x79, 0xC7, 0x38, 0xE7, 0x1C, 0xE0, 0xEE, 0x38, 0xE6, 0x1D, 0xC1,
+ 0xF0, 0x3E, 0x03, 0x80, 0xF8, 0x1B, 0x07, 0x71, 0xC7, 0x38, 0xEE, 0x0E,
+ 0xE1, 0xD8, 0x67, 0x38, 0xCC, 0x3F, 0x07, 0x81, 0xE0, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x00, 0xFF, 0xFF, 0xC0, 0xE0, 0xE0, 0xE0, 0x60,
+ 0x70, 0x70, 0x70, 0x38, 0x38, 0x1F, 0xFF, 0xF8, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0xFE, 0x40,
+ 0xC0, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06,
+ 0x06, 0x03, 0x02, 0xFF, 0xFC, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xC1, 0xFF, 0xFE, 0x0C, 0x03, 0x81, 0xE0, 0xCC, 0x33,
+ 0x18, 0x6E, 0x1C, 0xFF, 0xFF, 0xE7, 0x30, 0x7E, 0x3F, 0x80, 0xC7, 0xEF,
+ 0xF6, 0x1B, 0x0D, 0xFF, 0x7B, 0x80, 0xE0, 0x38, 0x06, 0x01, 0x80, 0x6F,
+ 0x1F, 0xE7, 0x1D, 0x83, 0x60, 0xD8, 0x36, 0x1D, 0xFE, 0x3E, 0x00, 0x1F,
+ 0x3F, 0xF8, 0x78, 0x3C, 0x06, 0x03, 0x84, 0xFF, 0x3F, 0x00, 0x03, 0x80,
+ 0xE0, 0x18, 0x06, 0x1F, 0x9F, 0xEE, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x39,
+ 0xFF, 0x3C, 0xC0, 0x3E, 0x3F, 0xB0, 0x7F, 0xFF, 0xFE, 0x03, 0x84, 0xFF,
+ 0x3F, 0x00, 0x0F, 0x8F, 0xCC, 0x46, 0x0F, 0xF7, 0xF8, 0xC0, 0x60, 0x30,
+ 0x18, 0x0C, 0x1F, 0xEF, 0xF0, 0x3F, 0xBF, 0xF8, 0x78, 0x3C, 0x1E, 0x0F,
+ 0x8E, 0xFF, 0x3F, 0x80, 0xC8, 0xEF, 0xE3, 0xE0, 0xE0, 0x70, 0x18, 0x0C,
+ 0x06, 0xF3, 0xFD, 0xC6, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x18, 0x1C,
+ 0x1C, 0x1C, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF,
+ 0x0E, 0x1C, 0x38, 0x07, 0xEF, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60,
+ 0xE3, 0xFE, 0x78, 0xE0, 0x38, 0x06, 0x01, 0x80, 0x63, 0x99, 0xC6, 0xE1,
+ 0xB0, 0x7C, 0x1B, 0x86, 0x71, 0x9F, 0x63, 0xC0, 0xF0, 0xF0, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x1E, 0xFB, 0xBF, 0xFC,
+ 0xCF, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xC0, 0xEF, 0x7F, 0xDC,
+ 0xEC, 0x36, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0x80, 0x3F, 0x1F, 0xEE, 0x1F,
+ 0x03, 0xC0, 0xF0, 0x3E, 0x1D, 0xFE, 0x3F, 0x00, 0xEF, 0x3F, 0xE7, 0x1D,
+ 0x83, 0x60, 0xD8, 0x36, 0x1D, 0xFE, 0x7F, 0x18, 0x06, 0x01, 0x80, 0x60,
+ 0x00, 0x1F, 0xBF, 0xF8, 0x78, 0x3C, 0x1E, 0x0F, 0x8E, 0xFF, 0x3D, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0xF7, 0x7F, 0xCE, 0x66, 0x03, 0x01, 0x80, 0xC1,
+ 0xFE, 0xFF, 0x00, 0x7E, 0xFF, 0xC2, 0xF0, 0x7E, 0x07, 0x43, 0xFF, 0x3E,
+ 0x10, 0x0C, 0x03, 0x03, 0xFE, 0xFF, 0x8C, 0x03, 0x00, 0xC0, 0x30, 0x0E,
+ 0x21, 0xFC, 0x3C, 0xE3, 0xB8, 0xE6, 0x19, 0x86, 0x61, 0x98, 0x66, 0x39,
+ 0xFF, 0x3C, 0xC0, 0xE1, 0xD8, 0x67, 0x18, 0xCE, 0x3B, 0x0E, 0xC1, 0xE0,
+ 0x78, 0x0E, 0x00, 0xC0, 0x7C, 0x0D, 0x9B, 0x37, 0x66, 0xEC, 0xDF, 0x9E,
+ 0xF1, 0xDC, 0x39, 0x80, 0xE3, 0xB9, 0x8D, 0x87, 0xC1, 0xC1, 0xF1, 0xDC,
+ 0xC6, 0xE3, 0x80, 0xE1, 0xD8, 0x76, 0x19, 0xC6, 0x33, 0x8E, 0xC1, 0xB0,
+ 0x7C, 0x0E, 0x01, 0x84, 0xE1, 0xF0, 0x38, 0x00, 0xFF, 0xFF, 0x06, 0x0C,
+ 0x18, 0x30, 0x60, 0xFF, 0xFF, 0x0F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x38, 0xF0, 0xF0, 0x38, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x0F, 0xFF, 0xFF,
+ 0xFF, 0xFC, 0xF0, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x0F, 0x0F,
+ 0x1C, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF0, 0x72, 0xFF, 0x8F };
+
+const GFXglyph ptmono9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 11, 4, -12 }, // 0x21 '!'
+ { 5, 6, 6, 11, 2, -12 }, // 0x22 '"'
+ { 10, 10, 12, 11, 0, -11 }, // 0x23 '#'
+ { 25, 8, 17, 11, 1, -14 }, // 0x24 '$'
+ { 42, 11, 13, 11, 0, -12 }, // 0x25 '%'
+ { 60, 10, 13, 11, 0, -12 }, // 0x26 '&'
+ { 77, 2, 6, 11, 4, -12 }, // 0x27 '''
+ { 79, 7, 17, 11, 2, -12 }, // 0x28 '('
+ { 94, 7, 17, 11, 2, -12 }, // 0x29 ')'
+ { 109, 9, 8, 11, 1, -12 }, // 0x2A '*'
+ { 118, 8, 10, 11, 1, -10 }, // 0x2B '+'
+ { 128, 4, 6, 11, 3, -2 }, // 0x2C ','
+ { 131, 5, 2, 11, 3, -5 }, // 0x2D '-'
+ { 133, 3, 3, 11, 4, -2 }, // 0x2E '.'
+ { 135, 8, 16, 11, 1, -12 }, // 0x2F '/'
+ { 151, 9, 13, 11, 1, -12 }, // 0x30 '0'
+ { 166, 8, 13, 11, 2, -12 }, // 0x31 '1'
+ { 179, 8, 13, 11, 1, -12 }, // 0x32 '2'
+ { 192, 8, 13, 11, 2, -12 }, // 0x33 '3'
+ { 205, 10, 13, 11, 0, -12 }, // 0x34 '4'
+ { 222, 8, 13, 11, 1, -12 }, // 0x35 '5'
+ { 235, 9, 13, 11, 1, -12 }, // 0x36 '6'
+ { 250, 8, 13, 11, 1, -12 }, // 0x37 '7'
+ { 263, 9, 13, 11, 1, -12 }, // 0x38 '8'
+ { 278, 9, 13, 11, 1, -12 }, // 0x39 '9'
+ { 293, 3, 10, 11, 4, -9 }, // 0x3A ':'
+ { 297, 4, 13, 11, 3, -9 }, // 0x3B ';'
+ { 304, 9, 11, 11, 1, -10 }, // 0x3C '<'
+ { 317, 9, 6, 11, 1, -8 }, // 0x3D '='
+ { 324, 9, 11, 11, 1, -10 }, // 0x3E '>'
+ { 337, 9, 13, 11, 1, -12 }, // 0x3F '?'
+ { 352, 11, 15, 11, 0, -10 }, // 0x40 '@'
+ { 373, 10, 13, 11, 0, -12 }, // 0x41 'A'
+ { 390, 9, 13, 11, 1, -12 }, // 0x42 'B'
+ { 405, 9, 13, 11, 1, -12 }, // 0x43 'C'
+ { 420, 9, 13, 11, 1, -12 }, // 0x44 'D'
+ { 435, 8, 13, 11, 1, -12 }, // 0x45 'E'
+ { 448, 8, 13, 11, 2, -12 }, // 0x46 'F'
+ { 461, 9, 13, 11, 1, -12 }, // 0x47 'G'
+ { 476, 9, 13, 11, 1, -12 }, // 0x48 'H'
+ { 491, 8, 13, 11, 1, -12 }, // 0x49 'I'
+ { 504, 8, 13, 11, 1, -12 }, // 0x4A 'J'
+ { 517, 10, 13, 11, 1, -12 }, // 0x4B 'K'
+ { 534, 8, 13, 11, 2, -12 }, // 0x4C 'L'
+ { 547, 9, 13, 11, 1, -12 }, // 0x4D 'M'
+ { 562, 9, 13, 11, 1, -12 }, // 0x4E 'N'
+ { 577, 10, 13, 11, 0, -12 }, // 0x4F 'O'
+ { 594, 9, 13, 11, 1, -12 }, // 0x50 'P'
+ { 609, 10, 16, 11, 0, -12 }, // 0x51 'Q'
+ { 629, 9, 13, 11, 1, -12 }, // 0x52 'R'
+ { 644, 9, 13, 11, 1, -12 }, // 0x53 'S'
+ { 659, 10, 13, 11, 0, -12 }, // 0x54 'T'
+ { 676, 9, 13, 11, 1, -12 }, // 0x55 'U'
+ { 691, 10, 13, 11, 0, -12 }, // 0x56 'V'
+ { 708, 11, 13, 11, 0, -12 }, // 0x57 'W'
+ { 726, 11, 13, 11, 0, -12 }, // 0x58 'X'
+ { 744, 10, 13, 11, 0, -12 }, // 0x59 'Y'
+ { 761, 9, 13, 11, 1, -12 }, // 0x5A 'Z'
+ { 776, 7, 17, 11, 2, -12 }, // 0x5B '['
+ { 791, 8, 16, 11, 1, -12 }, // 0x5C '\'
+ { 807, 7, 17, 11, 2, -12 }, // 0x5D ']'
+ { 822, 10, 7, 11, 0, -12 }, // 0x5E '^'
+ { 831, 8, 2, 11, 1, 3 }, // 0x5F '_'
+ { 833, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 835, 9, 9, 11, 1, -8 }, // 0x61 'a'
+ { 846, 10, 13, 11, 0, -12 }, // 0x62 'b'
+ { 863, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 874, 10, 13, 11, 0, -12 }, // 0x64 'd'
+ { 891, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 902, 9, 13, 11, 1, -12 }, // 0x66 'f'
+ { 917, 9, 13, 11, 1, -8 }, // 0x67 'g'
+ { 932, 9, 13, 11, 0, -12 }, // 0x68 'h'
+ { 947, 8, 13, 11, 1, -12 }, // 0x69 'i'
+ { 960, 7, 17, 11, 1, -12 }, // 0x6A 'j'
+ { 975, 10, 13, 11, 1, -12 }, // 0x6B 'k'
+ { 992, 8, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 1005, 10, 9, 11, 0, -8 }, // 0x6D 'm'
+ { 1017, 9, 9, 11, 1, -8 }, // 0x6E 'n'
+ { 1028, 10, 9, 11, 0, -8 }, // 0x6F 'o'
+ { 1040, 10, 13, 11, 0, -8 }, // 0x70 'p'
+ { 1057, 9, 13, 11, 1, -8 }, // 0x71 'q'
+ { 1072, 9, 9, 11, 1, -8 }, // 0x72 'r'
+ { 1083, 8, 9, 11, 1, -8 }, // 0x73 's'
+ { 1092, 10, 12, 11, 0, -11 }, // 0x74 't'
+ { 1107, 10, 9, 11, 0, -8 }, // 0x75 'u'
+ { 1119, 10, 9, 11, 0, -8 }, // 0x76 'v'
+ { 1131, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 1144, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 1155, 10, 13, 11, 0, -8 }, // 0x79 'y'
+ { 1172, 8, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 1181, 8, 17, 11, 1, -12 }, // 0x7B '{'
+ { 1198, 2, 15, 11, 4, -12 }, // 0x7C '|'
+ { 1202, 8, 17, 11, 2, -12 }, // 0x7D '}'
+ { 1219, 8, 3, 11, 1, -7 } }; // 0x7E '~'
+
+const GFXfont ptmono9pt7b PROGMEM = {
+ (uint8_t *)ptmono9pt7bBitmaps,
+ (GFXglyph *)ptmono9pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+
+// Approx. 1894 bytes
+const uint8_t SourceCodePro_Regular9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x49, 0x24, 0x90, 0x1B, 0xE0, 0xCF, 0x34, 0x51, 0x45, 0x10, 0x24,
+ 0x48, 0x97, 0xF4, 0x48, 0xBF, 0xA4, 0x48, 0x91, 0x20, 0x10, 0x21, 0xF6,
+ 0x38, 0x18, 0x1E, 0x0E, 0x06, 0x06, 0x1B, 0xE1, 0x02, 0x04, 0x00, 0x38,
+ 0x13, 0x14, 0x4D, 0x16, 0x4D, 0x0E, 0x80, 0x38, 0x13, 0x14, 0x49, 0x16,
+ 0x4F, 0x0E, 0x38, 0x32, 0x11, 0x0D, 0x83, 0x81, 0x85, 0xC3, 0xB3, 0x8D,
+ 0x43, 0x31, 0xEF, 0x10, 0xF5, 0x50, 0x11, 0xD8, 0x8C, 0x42, 0x10, 0x84,
+ 0x21, 0x84, 0x30, 0xC3, 0xC3, 0x08, 0x21, 0x0C, 0x21, 0x08, 0x46, 0x21,
+ 0x11, 0x98, 0x10, 0x22, 0x4B, 0xE3, 0x8D, 0x11, 0x00, 0x10, 0x20, 0x40,
+ 0x8F, 0xE2, 0x04, 0x08, 0x10, 0xFF, 0x97, 0xA0, 0xFC, 0xFF, 0x80, 0x02,
+ 0x08, 0x10, 0x60, 0x81, 0x06, 0x08, 0x10, 0x60, 0x83, 0x04, 0x08, 0x30,
+ 0x40, 0x3C, 0x31, 0x10, 0x58, 0x2D, 0x96, 0xEF, 0x05, 0x82, 0x41, 0x31,
+ 0x0F, 0x00, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0xFF, 0x3C, 0xC2, 0x03, 0x03, 0x03, 0x06, 0x04, 0x08, 0x30, 0x60, 0xFF,
+ 0x3C, 0xC3, 0x03, 0x03, 0x06, 0x1C, 0x03, 0x01, 0x01, 0xC3, 0x7E, 0x06,
+ 0x05, 0x06, 0x82, 0x42, 0x22, 0x13, 0x09, 0xFF, 0x02, 0x01, 0x00, 0x80,
+ 0x7F, 0x60, 0x60, 0x40, 0x7E, 0x43, 0x01, 0x01, 0x01, 0xC3, 0x7C, 0x1F,
+ 0x10, 0x98, 0x08, 0x0D, 0xE7, 0x1B, 0x06, 0x83, 0x41, 0x31, 0x87, 0x80,
+ 0xFF, 0x81, 0x80, 0x80, 0x80, 0x40, 0x40, 0x20, 0x30, 0x18, 0x0C, 0x06,
+ 0x00, 0x3E, 0x31, 0x90, 0x4C, 0x23, 0x31, 0xF1, 0x99, 0x82, 0xC1, 0xA1,
+ 0x8F, 0x80, 0x3C, 0x42, 0xC1, 0xC1, 0x41, 0x3F, 0x01, 0x01, 0x03, 0x46,
+ 0xFC, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0xE5, 0xE8, 0x02, 0x18,
+ 0x63, 0x08, 0x0C, 0x06, 0x06, 0x02, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x80,
+ 0x80, 0xC0, 0x60, 0x61, 0x8C, 0x20, 0x80, 0x79, 0x88, 0x18, 0x20, 0x82,
+ 0x0C, 0x00, 0x00, 0x60, 0xC1, 0x80, 0x1E, 0x10, 0x90, 0x38, 0x18, 0x7C,
+ 0xC6, 0x43, 0x23, 0x8E, 0xC0, 0x30, 0x08, 0x02, 0x10, 0xF0, 0x18, 0x0A,
+ 0x05, 0x06, 0x82, 0x61, 0x11, 0x88, 0xFE, 0x41, 0x60, 0xB0, 0x70, 0x10,
+ 0xFC, 0x86, 0x82, 0x82, 0x86, 0xF8, 0x86, 0x83, 0x83, 0x83, 0x86, 0xFC,
+ 0x1F, 0x18, 0xD8, 0x08, 0x0C, 0x06, 0x03, 0x01, 0x80, 0x40, 0x30, 0x0C,
+ 0x63, 0xE0, 0xF8, 0x8C, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x86,
+ 0x8C, 0xF8, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0x1F, 0x10, 0x90, 0x18, 0x0C, 0x06, 0x03, 0x1F, 0x83, 0xC1,
+ 0xA0, 0xD8, 0x63, 0xC0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xFF, 0xC1, 0xC1,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x47, 0xF0, 0x7F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x83, 0x42, 0x3C, 0x83, 0x86, 0x8C, 0x98, 0x90, 0xB8, 0xE8, 0xCC, 0x84,
+ 0x86, 0x83, 0x83, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xFF, 0xC1, 0xE3, 0xE3, 0xE5, 0xD5, 0xD5, 0xD9, 0xC9, 0xC1,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xE1, 0xE1, 0xD1, 0xD1, 0xD9, 0xC9, 0xCD, 0xC5,
+ 0xC3, 0xC3, 0xC1, 0x3C, 0x31, 0x90, 0x58, 0x3C, 0x1C, 0x0E, 0x07, 0x83,
+ 0xC1, 0xA0, 0x98, 0xC7, 0x80, 0xFC, 0x82, 0x83, 0x83, 0x83, 0x86, 0xFC,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x31, 0x90, 0x58, 0x3C, 0x1C, 0x0E,
+ 0x07, 0x83, 0xC1, 0xA0, 0x98, 0xC7, 0x80, 0x80, 0x60, 0x0E, 0xFC, 0x86,
+ 0x83, 0x83, 0x82, 0x86, 0xFC, 0x88, 0x8C, 0x84, 0x86, 0x83, 0x3E, 0x30,
+ 0x90, 0x08, 0x06, 0x01, 0xE0, 0x3C, 0x06, 0x01, 0x80, 0xF0, 0xC7, 0xC0,
+ 0xFF, 0x84, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02,
+ 0x01, 0x00, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x41,
+ 0x63, 0x3E, 0x81, 0xE0, 0xD0, 0x48, 0x26, 0x33, 0x10, 0x88, 0x4C, 0x34,
+ 0x0A, 0x05, 0x03, 0x00, 0xC0, 0x78, 0x09, 0x01, 0x20, 0x24, 0x44, 0x98,
+ 0x92, 0xB3, 0x56, 0x6A, 0x86, 0x30, 0xC6, 0x18, 0xC0, 0xC1, 0xB1, 0x88,
+ 0x86, 0xC1, 0x40, 0xE0, 0x70, 0x28, 0x26, 0x31, 0x10, 0xD8, 0x30, 0xC1,
+ 0xE0, 0x98, 0xCC, 0x43, 0x60, 0xA0, 0x70, 0x10, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x7F, 0x81, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x60, 0x20, 0x30, 0x30,
+ 0x10, 0x1F, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42,
+ 0x1F, 0x81, 0x81, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x10, 0x30, 0x20, 0x40,
+ 0xC0, 0x81, 0x01, 0xF8, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84,
+ 0x3F, 0x10, 0x70, 0xA3, 0x44, 0x48, 0xA1, 0x80, 0xFF, 0x80, 0xC6, 0x30,
+ 0x3E, 0x43, 0x01, 0x0F, 0x71, 0x41, 0xC1, 0x43, 0x3D, 0x80, 0x80, 0x80,
+ 0x80, 0xBC, 0xC6, 0x82, 0x83, 0x83, 0x83, 0x82, 0xC6, 0xBC, 0x1F, 0x10,
+ 0xD8, 0x08, 0x0C, 0x02, 0x01, 0x00, 0xC2, 0x1F, 0x80, 0x01, 0x01, 0x01,
+ 0x01, 0x3D, 0x63, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x1E, 0x31,
+ 0x90, 0x58, 0x3F, 0xFE, 0x01, 0x00, 0xC2, 0x1F, 0x00, 0x0F, 0x10, 0x30,
+ 0x30, 0xFE, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0xB1,
+ 0x10, 0xC8, 0x66, 0x21, 0xE1, 0x00, 0x80, 0x3F, 0x20, 0x70, 0x28, 0x33,
+ 0xE0, 0x81, 0x02, 0x04, 0x09, 0xDC, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x20, 0x18, 0xC0, 0x0F, 0x84, 0x21, 0x08, 0x42, 0x10, 0x80, 0x0C, 0x30,
+ 0x00, 0x7C, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, 0x43, 0xF8, 0x80,
+ 0x80, 0x80, 0x80, 0x83, 0x84, 0x88, 0x98, 0xB8, 0xCC, 0x84, 0x82, 0x83,
+ 0xF8, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06,
+ 0x01, 0x00, 0x78, 0xBB, 0x66, 0xF2, 0x39, 0x1C, 0x8E, 0x47, 0x23, 0x91,
+ 0xC8, 0x80, 0x9D, 0xCE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x82, 0x3C, 0x31,
+ 0xB0, 0x58, 0x3C, 0x1E, 0x0F, 0x04, 0xC6, 0x3C, 0x00, 0xBC, 0xC6, 0x82,
+ 0x83, 0x83, 0x83, 0x82, 0xC6, 0xBC, 0x80, 0x80, 0x80, 0x80, 0x3D, 0x63,
+ 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x63, 0x3D, 0x01, 0x01, 0x01, 0x01, 0x9F,
+ 0x43, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x3E, 0x61, 0x40, 0x70, 0x1E,
+ 0x03, 0x01, 0x43, 0xBE, 0x10, 0x08, 0x3F, 0xC2, 0x01, 0x00, 0x80, 0x40,
+ 0x20, 0x10, 0x0C, 0x03, 0xE0, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0xC3,
+ 0x45, 0x39, 0xC1, 0xA0, 0x90, 0xCC, 0x42, 0x21, 0xB0, 0x50, 0x28, 0x18,
+ 0x00, 0xC4, 0x78, 0x89, 0x29, 0x25, 0x26, 0xAC, 0xD5, 0x8C, 0xA1, 0x8C,
+ 0x31, 0x80, 0xC3, 0x31, 0x0D, 0x82, 0x81, 0x80, 0xE0, 0x98, 0xC6, 0xC1,
+ 0x80, 0xC1, 0xA0, 0x90, 0x4C, 0x62, 0x21, 0xB0, 0x50, 0x38, 0x0C, 0x04,
+ 0x06, 0x02, 0x0E, 0x00, 0x7F, 0x01, 0x81, 0x81, 0x81, 0x80, 0x80, 0xC0,
+ 0xC0, 0xFF, 0x80, 0x1E, 0x20, 0x40, 0x81, 0x02, 0x0C, 0x60, 0x30, 0x20,
+ 0x40, 0x81, 0x02, 0x04, 0x0F, 0xFF, 0xFF, 0xC0, 0xE0, 0x20, 0x40, 0x81,
+ 0x02, 0x04, 0x07, 0x18, 0x20, 0x40, 0x81, 0x02, 0x04, 0x70, 0x31, 0x49,
+ 0x86 };
+
+const GFXglyph SourceCodePro_Regular9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 11, 4, -11 }, // 0x21 '!'
+ { 6, 6, 6, 11, 2, -11 }, // 0x22 '"'
+ { 11, 7, 11, 11, 2, -10 }, // 0x23 '#'
+ { 21, 7, 15, 11, 2, -12 }, // 0x24 '$'
+ { 35, 10, 12, 11, 0, -11 }, // 0x25 '%'
+ { 50, 9, 12, 11, 1, -11 }, // 0x26 '&'
+ { 64, 2, 6, 11, 4, -11 }, // 0x27 '''
+ { 66, 5, 16, 11, 4, -12 }, // 0x28 '('
+ { 76, 5, 16, 11, 2, -12 }, // 0x29 ')'
+ { 86, 7, 7, 11, 2, -12 }, // 0x2A '*'
+ { 93, 7, 9, 11, 2, -9 }, // 0x2B '+'
+ { 101, 3, 7, 11, 4, -2 }, // 0x2C ','
+ { 104, 6, 1, 11, 2, -5 }, // 0x2D '-'
+ { 105, 3, 3, 11, 4, -2 }, // 0x2E '.'
+ { 107, 7, 16, 11, 2, -12 }, // 0x2F '/'
+ { 121, 9, 11, 11, 1, -10 }, // 0x30 '0'
+ { 134, 8, 11, 11, 2, -10 }, // 0x31 '1'
+ { 145, 8, 11, 11, 1, -10 }, // 0x32 '2'
+ { 156, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 167, 9, 11, 11, 1, -10 }, // 0x34 '4'
+ { 180, 8, 11, 11, 1, -10 }, // 0x35 '5'
+ { 191, 9, 11, 11, 1, -10 }, // 0x36 '6'
+ { 204, 9, 11, 11, 1, -10 }, // 0x37 '7'
+ { 217, 9, 11, 11, 1, -10 }, // 0x38 '8'
+ { 230, 8, 11, 11, 1, -10 }, // 0x39 '9'
+ { 241, 3, 9, 11, 4, -8 }, // 0x3A ':'
+ { 245, 3, 13, 11, 4, -8 }, // 0x3B ';'
+ { 250, 7, 9, 11, 2, -9 }, // 0x3C '<'
+ { 258, 7, 5, 11, 2, -7 }, // 0x3D '='
+ { 263, 7, 9, 11, 2, -9 }, // 0x3E '>'
+ { 271, 7, 12, 11, 2, -11 }, // 0x3F '?'
+ { 282, 9, 14, 11, 1, -10 }, // 0x40 '@'
+ { 298, 9, 12, 11, 1, -11 }, // 0x41 'A'
+ { 312, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 324, 9, 12, 11, 1, -11 }, // 0x43 'C'
+ { 338, 8, 12, 11, 2, -11 }, // 0x44 'D'
+ { 350, 8, 12, 11, 2, -11 }, // 0x45 'E'
+ { 362, 8, 12, 11, 2, -11 }, // 0x46 'F'
+ { 374, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 388, 8, 12, 11, 1, -11 }, // 0x48 'H'
+ { 400, 7, 12, 11, 2, -11 }, // 0x49 'I'
+ { 411, 8, 12, 11, 1, -11 }, // 0x4A 'J'
+ { 423, 8, 12, 11, 2, -11 }, // 0x4B 'K'
+ { 435, 8, 12, 11, 2, -11 }, // 0x4C 'L'
+ { 447, 8, 12, 11, 1, -11 }, // 0x4D 'M'
+ { 459, 8, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 471, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 485, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 497, 9, 15, 11, 1, -11 }, // 0x51 'Q'
+ { 514, 8, 12, 11, 2, -11 }, // 0x52 'R'
+ { 526, 9, 12, 11, 1, -11 }, // 0x53 'S'
+ { 540, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 554, 8, 12, 11, 1, -11 }, // 0x55 'U'
+ { 566, 9, 12, 11, 1, -11 }, // 0x56 'V'
+ { 580, 11, 12, 11, 0, -11 }, // 0x57 'W'
+ { 597, 9, 12, 11, 1, -11 }, // 0x58 'X'
+ { 611, 9, 12, 11, 1, -11 }, // 0x59 'Y'
+ { 625, 9, 12, 11, 1, -11 }, // 0x5A 'Z'
+ { 639, 5, 16, 11, 4, -12 }, // 0x5B '['
+ { 649, 7, 16, 11, 2, -12 }, // 0x5C '\'
+ { 663, 5, 16, 11, 2, -12 }, // 0x5D ']'
+ { 673, 7, 7, 11, 2, -11 }, // 0x5E '^'
+ { 680, 9, 1, 11, 1, 2 }, // 0x5F '_'
+ { 682, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 684, 8, 9, 11, 1, -8 }, // 0x61 'a'
+ { 693, 8, 13, 11, 2, -12 }, // 0x62 'b'
+ { 706, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 717, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 730, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 741, 8, 13, 11, 2, -12 }, // 0x66 'f'
+ { 754, 9, 13, 11, 1, -8 }, // 0x67 'g'
+ { 769, 7, 13, 11, 2, -12 }, // 0x68 'h'
+ { 781, 5, 13, 11, 2, -12 }, // 0x69 'i'
+ { 790, 6, 17, 11, 1, -12 }, // 0x6A 'j'
+ { 803, 8, 13, 11, 2, -12 }, // 0x6B 'k'
+ { 816, 9, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 831, 9, 9, 11, 1, -8 }, // 0x6D 'm'
+ { 842, 7, 9, 11, 2, -8 }, // 0x6E 'n'
+ { 850, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 861, 8, 13, 11, 2, -8 }, // 0x70 'p'
+ { 874, 8, 13, 11, 1, -8 }, // 0x71 'q'
+ { 887, 7, 9, 11, 3, -8 }, // 0x72 'r'
+ { 895, 8, 9, 11, 1, -8 }, // 0x73 's'
+ { 904, 9, 11, 11, 1, -10 }, // 0x74 't'
+ { 917, 8, 9, 11, 1, -8 }, // 0x75 'u'
+ { 926, 9, 9, 11, 1, -8 }, // 0x76 'v'
+ { 937, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 950, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 961, 9, 13, 11, 1, -8 }, // 0x79 'y'
+ { 976, 9, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 987, 7, 16, 11, 2, -12 }, // 0x7B '{'
+ { 1001, 1, 18, 11, 5, -12 }, // 0x7C '|'
+ { 1004, 7, 16, 11, 2, -12 }, // 0x7D '}'
+ { 1018, 8, 3, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont SourceCodePro_Regular9pt7b PROGMEM = {
+ (uint8_t *)SourceCodePro_Regular9pt7bBitmaps,
+ (GFXglyph *)SourceCodePro_Regular9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1693 bytes
+const uint8_t SourceCodePro_SemiBold9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x64, 0x92, 0x1F, 0xF0, 0xEF, 0xDF, 0xBE, 0x64, 0x48, 0x80,
+ 0x12, 0x12, 0x7F, 0x7F, 0x22, 0x26, 0xFF, 0xFF, 0x24, 0x24, 0x64, 0x08,
+ 0x08, 0x3E, 0x7F, 0x62, 0x70, 0x3C, 0x0F, 0x03, 0x43, 0xFF, 0x3E, 0x08,
+ 0x08, 0x08, 0x38, 0x1F, 0x14, 0xCD, 0x36, 0x7F, 0x0E, 0x00, 0x38, 0x1F,
+ 0x14, 0xCD, 0x36, 0x7F, 0x0E, 0x38, 0x3E, 0x1B, 0x0D, 0x87, 0xC1, 0xCF,
+ 0xC7, 0xB3, 0xCF, 0x63, 0xBF, 0xEF, 0x10, 0xFF, 0xE4, 0x80, 0x08, 0x73,
+ 0x08, 0x61, 0x84, 0x30, 0xC1, 0x06, 0x18, 0x20, 0xC1, 0x83, 0x47, 0x0C,
+ 0x61, 0x8C, 0x61, 0x08, 0xC6, 0x33, 0x19, 0x98, 0x10, 0x23, 0x5F, 0xF3,
+ 0x87, 0x1B, 0x22, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x77,
+ 0x71, 0x36, 0xC0, 0xFF, 0xF0, 0xFF, 0xF0, 0x06, 0x0C, 0x10, 0x60, 0xC3,
+ 0x06, 0x08, 0x30, 0x60, 0x83, 0x06, 0x18, 0x30, 0x60, 0x3C, 0x3F, 0x98,
+ 0xDB, 0x6D, 0xDE, 0xCF, 0x07, 0x86, 0x63, 0x3F, 0x8F, 0x00, 0xF8, 0xF8,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x3C, 0x3F, 0x30,
+ 0xC0, 0x60, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7F, 0xFF, 0xE0, 0x3E, 0x7F,
+ 0xC3, 0x03, 0x1E, 0x1E, 0x03, 0x03, 0xC3, 0xFF, 0x3E, 0x0E, 0x07, 0x07,
+ 0x86, 0xC6, 0x66, 0x33, 0xFF, 0xFF, 0x06, 0x03, 0x01, 0x80, 0x7F, 0x7F,
+ 0x60, 0x7E, 0x7F, 0x63, 0x03, 0x03, 0xC3, 0xFF, 0x3C, 0x1E, 0x1F, 0x98,
+ 0x6C, 0x0D, 0xE7, 0xFB, 0x8F, 0x83, 0x63, 0xBF, 0x87, 0x80, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x3E,
+ 0x3F, 0x98, 0xCC, 0x63, 0xE1, 0xF1, 0x9D, 0x83, 0xC3, 0xBF, 0x8F, 0x80,
+ 0x3C, 0x3F, 0x30, 0xD8, 0x2C, 0x3B, 0xFC, 0xE4, 0x06, 0x47, 0x7F, 0x0F,
+ 0x00, 0xFF, 0xF0, 0x3F, 0xFC, 0x77, 0x77, 0x00, 0x07, 0x77, 0x13, 0x6C,
+ 0x02, 0x0C, 0x31, 0xC7, 0x18, 0x30, 0x38, 0x38, 0x18, 0x18, 0x10, 0xFF,
+ 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0x83, 0x81, 0xC1, 0xC1, 0xC3, 0x8E,
+ 0x39, 0xC3, 0x04, 0x00, 0x79, 0xF9, 0x38, 0x30, 0xC3, 0x0C, 0x18, 0x00,
+ 0x60, 0xE1, 0x80, 0x1E, 0x1F, 0x98, 0x78, 0x3C, 0x0C, 0x3E, 0x3F, 0x33,
+ 0x99, 0xCF, 0xF3, 0xB8, 0x06, 0x11, 0xF8, 0x78, 0x0E, 0x03, 0x81, 0xA0,
+ 0x6C, 0x1B, 0x0C, 0xC3, 0x18, 0xFE, 0x7F, 0x98, 0x76, 0x0F, 0x83, 0xFC,
+ 0xFE, 0xC6, 0xC6, 0xFC, 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0x1E,
+ 0x1F, 0xDC, 0x5C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x38, 0xCF, 0xE3,
+ 0xE0, 0xFC, 0x7F, 0x31, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xE3,
+ 0xBF, 0x9F, 0x80, 0xFE, 0xFE, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xFE, 0xFE, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0x1E, 0x3F, 0x9C, 0x7C, 0x0C, 0x06, 0x3F, 0x1F, 0x83,
+ 0xE1, 0xB0, 0xDF, 0xE3, 0xC0, 0xC3, 0xE1, 0xF0, 0xF8, 0x7C, 0x3F, 0xFF,
+ 0xFF, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x70, 0xFF, 0xFC, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x63, 0xFF, 0xF0, 0x7F, 0x7F, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x47, 0xFE, 0x3C, 0xE3, 0xB8, 0xCE, 0x63, 0xB0, 0xFC,
+ 0x3F, 0x0F, 0xE3, 0x98, 0xE7, 0x38, 0xCE, 0x3B, 0x87, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xE3, 0xE3, 0xE3,
+ 0xE7, 0xF5, 0xD5, 0xD5, 0xD9, 0xC9, 0xC1, 0xC1, 0xC1, 0xE3, 0xE3, 0xF3,
+ 0xD3, 0xDB, 0xDB, 0xCB, 0xCD, 0xC5, 0xC7, 0xC3, 0xC3, 0x3C, 0x3F, 0xB8,
+ 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xB1, 0x9F, 0xC7, 0x80, 0xFC,
+ 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0xC0, 0x3C,
+ 0x3F, 0xB8, 0xD8, 0x7C, 0x1E, 0x0F, 0x07, 0x83, 0xC3, 0xF1, 0x9F, 0xC7,
+ 0xC0, 0xC0, 0x7C, 0x1E, 0xFC, 0xFE, 0xC7, 0xC3, 0xC7, 0xFE, 0xFC, 0xCC,
+ 0xCC, 0xC6, 0xC6, 0xC3, 0x3E, 0x3F, 0x98, 0x4C, 0x07, 0x01, 0xE0, 0x7C,
+ 0x07, 0x01, 0xA1, 0xFF, 0xC7, 0xC0, 0xFF, 0xFF, 0xC6, 0x03, 0x01, 0x80,
+ 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xC3, 0xE1, 0xF0, 0xF8,
+ 0x7C, 0x3E, 0x1F, 0x0F, 0x86, 0xE3, 0x31, 0x9F, 0xC7, 0xC0, 0xE0, 0xD8,
+ 0x36, 0x1C, 0xC6, 0x31, 0x8C, 0x63, 0x30, 0x6C, 0x1B, 0x06, 0x80, 0xE0,
+ 0x38, 0xC0, 0x78, 0x0B, 0x03, 0x32, 0x66, 0xEC, 0xD5, 0x9A, 0xB3, 0x56,
+ 0x7B, 0xCF, 0x70, 0xC6, 0x18, 0xC0, 0xC3, 0xB1, 0x99, 0xC6, 0xC3, 0x40,
+ 0xE0, 0x70, 0x7C, 0x36, 0x33, 0xB8, 0xD8, 0x30, 0xE0, 0xD8, 0x73, 0x18,
+ 0xC6, 0x1B, 0x06, 0xC0, 0xE0, 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7F,
+ 0xBF, 0xC0, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0x30, 0x30, 0x3F, 0xFF,
+ 0xF0, 0xFF, 0xE1, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x43, 0xFF, 0xC1,
+ 0x83, 0x03, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x60, 0x60, 0xC0, 0x81,
+ 0x83, 0xFF, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8F, 0xFF, 0x30,
+ 0x70, 0xA3, 0x64, 0xD8, 0xB1, 0x80, 0xFF, 0xFF, 0xC0, 0xC6, 0x30, 0x3E,
+ 0x7F, 0x43, 0x1F, 0x7F, 0xE3, 0xC3, 0x7F, 0x79, 0xE0, 0x70, 0x38, 0x1C,
+ 0x0F, 0xE7, 0xFB, 0x8F, 0xC3, 0xE1, 0xF0, 0xF8, 0xDF, 0xED, 0xE0, 0x1E,
+ 0x3F, 0xDC, 0x5C, 0x0C, 0x07, 0x01, 0xC4, 0xFF, 0x1E, 0x00, 0x03, 0x03,
+ 0x03, 0x03, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x39, 0x1E,
+ 0x3F, 0x98, 0x7F, 0xFF, 0xFE, 0x01, 0x84, 0xFE, 0x1E, 0x00, 0x0F, 0x1F,
+ 0x38, 0x30, 0xFF, 0xFF, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F,
+ 0xBF, 0xD8, 0x8C, 0x67, 0xE3, 0xE1, 0x00, 0xFE, 0x7F, 0xE0, 0xFF, 0xEF,
+ 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0xE7, 0xFB, 0xCD, 0xC7, 0xE3, 0xF1,
+ 0xF8, 0xFC, 0x7E, 0x38, 0x18, 0x71, 0x80, 0x03, 0xEF, 0x86, 0x18, 0x61,
+ 0x86, 0x18, 0x60, 0x0C, 0x1C, 0x30, 0x00, 0x0F, 0x9F, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x7E, 0xF8, 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xCE,
+ 0xDC, 0xF8, 0xF8, 0xEC, 0xCE, 0xC6, 0xC3, 0xF8, 0x7C, 0x06, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0xE0, 0xF8, 0xFB, 0x7F,
+ 0xF3, 0x79, 0x3C, 0x9E, 0x4F, 0x27, 0x93, 0xC9, 0x80, 0xCE, 0x7F, 0xBC,
+ 0xDC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0xE3, 0x80, 0x3E, 0x3F, 0xB8, 0xD8,
+ 0x3C, 0x1E, 0x0F, 0x8C, 0xFE, 0x3E, 0x00, 0xDE, 0x7F, 0xB8, 0xFC, 0x3E,
+ 0x1F, 0x0F, 0x8D, 0xFE, 0xFE, 0x70, 0x38, 0x1C, 0x00, 0x3D, 0x7F, 0xE3,
+ 0xC3, 0xC3, 0xC3, 0xE3, 0x7F, 0x3B, 0x03, 0x03, 0x03, 0xCF, 0xDF, 0xF0,
+ 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x3E, 0x3F, 0x98, 0x4E, 0x03, 0xE0,
+ 0x39, 0x07, 0xFE, 0x3E, 0x00, 0x10, 0x08, 0x3F, 0xFF, 0xF3, 0x01, 0x80,
+ 0xC0, 0x70, 0x18, 0x0F, 0xC3, 0xE0, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xE7, 0x7F, 0x79, 0xC1, 0xE0, 0x98, 0xCC, 0x67, 0x61, 0xB0, 0xD8, 0x38,
+ 0x1C, 0x00, 0xC4, 0x79, 0xC9, 0xBB, 0x35, 0x66, 0xAC, 0xD5, 0x9E, 0xB1,
+ 0xDC, 0x31, 0x80, 0xE3, 0xB1, 0x8D, 0x83, 0x81, 0xC1, 0xE0, 0xD8, 0xC6,
+ 0xC3, 0x80, 0xC1, 0xE0, 0x98, 0xCC, 0x63, 0x21, 0xB0, 0x50, 0x38, 0x1C,
+ 0x0C, 0x3E, 0x1C, 0x00, 0x7F, 0xBF, 0x81, 0x81, 0xC1, 0xC1, 0xC1, 0xC1,
+ 0xFF, 0xFF, 0x80, 0x1E, 0x3C, 0xC1, 0x81, 0x02, 0x0C, 0x78, 0xF0, 0x60,
+ 0x40, 0x83, 0x06, 0x07, 0x8F, 0xFF, 0xFF, 0xC0, 0xF1, 0xE0, 0x40, 0x81,
+ 0x02, 0x06, 0x0F, 0x1E, 0x30, 0x40, 0x81, 0x02, 0x3C, 0x78, 0x79, 0xBF,
+ 0xB3, 0x80 };
+
+const GFXglyph SourceCodePro_SemiBold9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 11, 0, 0 }, // 0x20 ' '
+ { 1, 3, 12, 11, 4, -11 }, // 0x21 '!'
+ { 6, 7, 6, 11, 2, -11 }, // 0x22 '"'
+ { 12, 8, 11, 11, 1, -10 }, // 0x23 '#'
+ { 23, 8, 15, 11, 1, -12 }, // 0x24 '$'
+ { 38, 10, 12, 11, 0, -11 }, // 0x25 '%'
+ { 53, 9, 12, 11, 1, -11 }, // 0x26 '&'
+ { 67, 3, 6, 11, 4, -11 }, // 0x27 '''
+ { 70, 6, 16, 11, 3, -12 }, // 0x28 '('
+ { 82, 5, 16, 11, 2, -12 }, // 0x29 ')'
+ { 92, 7, 8, 11, 2, -12 }, // 0x2A '*'
+ { 99, 8, 8, 11, 1, -9 }, // 0x2B '+'
+ { 107, 4, 7, 11, 3, -2 }, // 0x2C ','
+ { 111, 6, 2, 11, 2, -5 }, // 0x2D '-'
+ { 113, 3, 4, 11, 4, -3 }, // 0x2E '.'
+ { 115, 7, 16, 11, 2, -12 }, // 0x2F '/'
+ { 129, 9, 11, 11, 1, -10 }, // 0x30 '0'
+ { 142, 8, 11, 11, 2, -10 }, // 0x31 '1'
+ { 153, 9, 11, 11, 1, -10 }, // 0x32 '2'
+ { 166, 8, 11, 11, 1, -10 }, // 0x33 '3'
+ { 177, 9, 11, 11, 1, -10 }, // 0x34 '4'
+ { 190, 8, 11, 11, 1, -10 }, // 0x35 '5'
+ { 201, 9, 11, 11, 1, -10 }, // 0x36 '6'
+ { 214, 9, 11, 11, 1, -10 }, // 0x37 '7'
+ { 227, 9, 11, 11, 1, -10 }, // 0x38 '8'
+ { 240, 9, 11, 11, 1, -10 }, // 0x39 '9'
+ { 253, 3, 10, 11, 4, -9 }, // 0x3A ':'
+ { 257, 4, 14, 11, 3, -9 }, // 0x3B ';'
+ { 264, 7, 12, 11, 2, -11 }, // 0x3C '<'
+ { 275, 8, 6, 11, 1, -8 }, // 0x3D '='
+ { 281, 7, 12, 11, 2, -11 }, // 0x3E '>'
+ { 292, 7, 12, 11, 2, -11 }, // 0x3F '?'
+ { 303, 9, 15, 11, 1, -11 }, // 0x40 '@'
+ { 320, 10, 12, 11, 0, -11 }, // 0x41 'A'
+ { 335, 8, 12, 11, 2, -11 }, // 0x42 'B'
+ { 347, 9, 12, 11, 1, -11 }, // 0x43 'C'
+ { 361, 9, 12, 11, 1, -11 }, // 0x44 'D'
+ { 375, 8, 12, 11, 2, -11 }, // 0x45 'E'
+ { 387, 8, 12, 11, 2, -11 }, // 0x46 'F'
+ { 399, 9, 12, 11, 1, -11 }, // 0x47 'G'
+ { 413, 9, 12, 11, 1, -11 }, // 0x48 'H'
+ { 427, 7, 12, 11, 2, -11 }, // 0x49 'I'
+ { 438, 8, 12, 11, 1, -11 }, // 0x4A 'J'
+ { 450, 10, 12, 11, 1, -11 }, // 0x4B 'K'
+ { 465, 8, 12, 11, 2, -11 }, // 0x4C 'L'
+ { 477, 8, 12, 11, 1, -11 }, // 0x4D 'M'
+ { 489, 8, 12, 11, 1, -11 }, // 0x4E 'N'
+ { 501, 9, 12, 11, 1, -11 }, // 0x4F 'O'
+ { 515, 8, 12, 11, 2, -11 }, // 0x50 'P'
+ { 527, 9, 15, 11, 1, -11 }, // 0x51 'Q'
+ { 544, 8, 12, 11, 2, -11 }, // 0x52 'R'
+ { 556, 9, 12, 11, 1, -11 }, // 0x53 'S'
+ { 570, 9, 12, 11, 1, -11 }, // 0x54 'T'
+ { 584, 9, 12, 11, 1, -11 }, // 0x55 'U'
+ { 598, 10, 12, 11, 0, -11 }, // 0x56 'V'
+ { 613, 11, 12, 11, 0, -11 }, // 0x57 'W'
+ { 630, 9, 12, 11, 1, -11 }, // 0x58 'X'
+ { 644, 10, 12, 11, 0, -11 }, // 0x59 'Y'
+ { 659, 9, 12, 11, 1, -11 }, // 0x5A 'Z'
+ { 673, 5, 16, 11, 4, -12 }, // 0x5B '['
+ { 683, 7, 16, 11, 2, -12 }, // 0x5C '\'
+ { 697, 5, 16, 11, 2, -12 }, // 0x5D ']'
+ { 707, 7, 7, 11, 2, -11 }, // 0x5E '^'
+ { 714, 9, 2, 11, 1, 2 }, // 0x5F '_'
+ { 717, 4, 3, 11, 3, -12 }, // 0x60 '`'
+ { 719, 8, 9, 11, 1, -8 }, // 0x61 'a'
+ { 728, 9, 13, 11, 1, -12 }, // 0x62 'b'
+ { 743, 9, 9, 11, 1, -8 }, // 0x63 'c'
+ { 754, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 767, 9, 9, 11, 1, -8 }, // 0x65 'e'
+ { 778, 8, 13, 11, 2, -12 }, // 0x66 'f'
+ { 791, 9, 12, 11, 1, -8 }, // 0x67 'g'
+ { 805, 9, 13, 11, 1, -12 }, // 0x68 'h'
+ { 820, 6, 14, 11, 2, -13 }, // 0x69 'i'
+ { 831, 7, 17, 11, 1, -13 }, // 0x6A 'j'
+ { 846, 8, 13, 11, 2, -12 }, // 0x6B 'k'
+ { 859, 9, 13, 11, 1, -12 }, // 0x6C 'l'
+ { 874, 9, 9, 11, 1, -8 }, // 0x6D 'm'
+ { 885, 9, 9, 11, 1, -8 }, // 0x6E 'n'
+ { 896, 9, 9, 11, 1, -8 }, // 0x6F 'o'
+ { 907, 9, 12, 11, 1, -8 }, // 0x70 'p'
+ { 921, 8, 12, 11, 1, -8 }, // 0x71 'q'
+ { 933, 8, 9, 11, 2, -8 }, // 0x72 'r'
+ { 942, 9, 9, 11, 1, -8 }, // 0x73 's'
+ { 953, 9, 11, 11, 1, -10 }, // 0x74 't'
+ { 966, 8, 9, 11, 1, -8 }, // 0x75 'u'
+ { 975, 9, 9, 11, 1, -8 }, // 0x76 'v'
+ { 986, 11, 9, 11, 0, -8 }, // 0x77 'w'
+ { 999, 9, 9, 11, 1, -8 }, // 0x78 'x'
+ { 1010, 9, 12, 11, 1, -8 }, // 0x79 'y'
+ { 1024, 9, 9, 11, 1, -8 }, // 0x7A 'z'
+ { 1035, 7, 16, 11, 2, -12 }, // 0x7B '{'
+ { 1049, 1, 18, 11, 5, -12 }, // 0x7C '|'
+ { 1052, 7, 16, 11, 2, -12 }, // 0x7D '}'
+ { 1066, 9, 3, 11, 1, -6 } }; // 0x7E '~'
+
+const GFXfont SourceCodePro_SemiBold9pt7b PROGMEM = {
+ (uint8_t *)SourceCodePro_SemiBold9pt7bBitmaps,
+ (GFXglyph *)SourceCodePro_SemiBold9pt7bGlyphs,
+ 0x20, 0x7E, 22 };
+
+// Approx. 1742 bytes
+const uint8_t Shree7149pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xEA, 0x80, 0xC0, 0x99, 0x99, 0x04, 0x20, 0x21, 0x01, 0x10,
+ 0x77, 0xE0, 0x84, 0x04, 0x40, 0x42, 0x1F, 0xFE, 0x11, 0x01, 0x08, 0x08,
+ 0x40, 0x04, 0x07, 0x82, 0x59, 0x13, 0x44, 0x51, 0x06, 0x40, 0xF0, 0x07,
+ 0x01, 0x30, 0x45, 0x11, 0x44, 0x59, 0x21, 0xF0, 0x10, 0x04, 0x00, 0x00,
+ 0x09, 0xE0, 0x44, 0x42, 0x20, 0x90, 0x82, 0x41, 0x12, 0x03, 0x90, 0x00,
+ 0x80, 0x02, 0xF0, 0x12, 0x20, 0x90, 0x44, 0x42, 0x10, 0x88, 0x81, 0xC0,
+ 0x00, 0x03, 0xC0, 0x84, 0x11, 0x01, 0x20, 0x28, 0x06, 0x01, 0x20, 0x42,
+ 0x50, 0x2A, 0x05, 0x20, 0x44, 0x14, 0x7C, 0x40, 0xEA, 0x12, 0x44, 0x44,
+ 0x88, 0x88, 0x84, 0x44, 0x21, 0x04, 0x22, 0x21, 0x11, 0x11, 0x12, 0x22,
+ 0x40, 0x18, 0x18, 0xF3, 0x24, 0x24, 0x53, 0x18, 0x18, 0x08, 0x04, 0x02,
+ 0x01, 0x0F, 0xF8, 0x40, 0x20, 0x10, 0x08, 0x00, 0xD4, 0x7E, 0xC0, 0x01,
+ 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40,
+ 0x40, 0x3E, 0x20, 0x90, 0x50, 0x28, 0x14, 0x06, 0x03, 0x01, 0x81, 0x40,
+ 0x90, 0x48, 0x43, 0xC0, 0x11, 0xF1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3E,
+ 0x41, 0x41, 0x01, 0x01, 0x01, 0x02, 0x0C, 0x30, 0x40, 0x40, 0x80, 0xFF,
+ 0x7E, 0x20, 0xA0, 0x40, 0x20, 0x10, 0x10, 0x78, 0x02, 0x01, 0x40, 0x60,
+ 0x48, 0x23, 0xE0, 0x06, 0x03, 0x02, 0x82, 0x41, 0x21, 0x11, 0x08, 0x84,
+ 0x82, 0x7F, 0xC0, 0x80, 0x40, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x04, 0x03,
+ 0xF1, 0x04, 0x02, 0x00, 0x80, 0x60, 0x48, 0x23, 0xE0, 0x3E, 0x30, 0x90,
+ 0x30, 0x08, 0x05, 0xF3, 0x05, 0x82, 0x80, 0xC0, 0x50, 0x48, 0x23, 0xE0,
+ 0x7F, 0x02, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20,
+ 0x20, 0x3E, 0x20, 0x90, 0x48, 0x24, 0x11, 0xB0, 0xB8, 0x82, 0x81, 0x40,
+ 0x60, 0x48, 0x23, 0xE0, 0x7E, 0x21, 0xA0, 0x50, 0x28, 0x14, 0x0D, 0x0A,
+ 0x79, 0x01, 0x00, 0xA0, 0x48, 0x43, 0xC0, 0xF0, 0x00, 0x30, 0xF0, 0x00,
+ 0x35, 0x00, 0x02, 0x18, 0xC2, 0x0C, 0x04, 0x06, 0x03, 0x00, 0xFF, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x43, 0x18, 0x41, 0x00,
+ 0x18, 0x66, 0x41, 0x81, 0x01, 0x01, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x08, 0x07, 0xF8, 0x06, 0x01, 0x82, 0x00, 0x11, 0x00, 0x02, 0x40,
+ 0x00, 0xA0, 0xFA, 0x18, 0x41, 0x86, 0x10, 0x21, 0x84, 0x08, 0x61, 0x02,
+ 0x18, 0x40, 0x86, 0x08, 0x62, 0x41, 0x6C, 0x90, 0x20, 0xC2, 0x00, 0x00,
+ 0x60, 0x08, 0x07, 0xFC, 0x00, 0x06, 0x00, 0x60, 0x09, 0x00, 0x90, 0x09,
+ 0x01, 0x08, 0x10, 0x82, 0x04, 0x3F, 0xC2, 0x04, 0x40, 0x24, 0x02, 0x80,
+ 0x10, 0xFF, 0xA0, 0x28, 0x06, 0x02, 0x80, 0xA0, 0x6F, 0xFA, 0x01, 0x80,
+ 0x60, 0x18, 0x06, 0x02, 0xFF, 0x00, 0x06, 0x07, 0x31, 0x81, 0x20, 0x18,
+ 0x01, 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0xA0, 0x12, 0x04,
+ 0x3F, 0x00, 0xFF, 0x10, 0x12, 0x01, 0x40, 0x28, 0x03, 0x00, 0x60, 0x0C,
+ 0x01, 0x80, 0x50, 0x0A, 0x01, 0x40, 0x4F, 0xF0, 0xFF, 0xC0, 0x20, 0x10,
+ 0x08, 0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0F, 0xF8, 0xFF,
+ 0xC0, 0x20, 0x10, 0x08, 0x04, 0x03, 0xFD, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x00, 0x06, 0x03, 0x31, 0x81, 0x20, 0x18, 0x01, 0x00, 0x20, 0x04,
+ 0x1F, 0x80, 0x30, 0x06, 0x00, 0xA0, 0x32, 0x06, 0x3F, 0x40, 0x80, 0x60,
+ 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0xFE, 0x01, 0x80, 0x60, 0x18, 0x06,
+ 0x01, 0x80, 0x40, 0xFF, 0xF8, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81,
+ 0x03, 0x06, 0x0A, 0x13, 0xC0, 0x80, 0xE0, 0x48, 0x22, 0x10, 0x88, 0x26,
+ 0x0A, 0x83, 0x10, 0x82, 0x20, 0x48, 0x1A, 0x02, 0x80, 0x40, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xC0,
+ 0x1D, 0x00, 0xE8, 0x0B, 0x40, 0x59, 0x02, 0xC8, 0x26, 0x21, 0x31, 0x11,
+ 0x88, 0x8C, 0x24, 0x61, 0x43, 0x06, 0x18, 0x20, 0x80, 0xC0, 0x34, 0x06,
+ 0x80, 0xC8, 0x18, 0x83, 0x10, 0x61, 0x0C, 0x11, 0x82, 0x30, 0x26, 0x02,
+ 0xC0, 0x58, 0x06, 0x0E, 0x03, 0x18, 0x40, 0x44, 0x02, 0x80, 0x28, 0x02,
+ 0x80, 0x28, 0x01, 0x80, 0x28, 0x02, 0x80, 0x24, 0x04, 0x20, 0xC1, 0xF0,
+ 0xFF, 0x20, 0x28, 0x0A, 0x01, 0x80, 0xA0, 0x2F, 0xF2, 0x00, 0x80, 0x20,
+ 0x08, 0x02, 0x00, 0x80, 0x00, 0x06, 0x07, 0x31, 0x81, 0x20, 0x28, 0x03,
+ 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xA0, 0xB2, 0x0C, 0x37,
+ 0xC1, 0x08, 0xFF, 0xA0, 0x18, 0x06, 0x01, 0x80, 0x60, 0x2F, 0xF2, 0x02,
+ 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x40, 0x18, 0x33, 0xA0, 0x50, 0x18,
+ 0x04, 0x01, 0x80, 0x3C, 0x01, 0x00, 0x60, 0x30, 0x1C, 0x13, 0xF0, 0xFF,
+ 0xC1, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00,
+ 0x40, 0x10, 0x04, 0x00, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18,
+ 0x06, 0x01, 0x80, 0x60, 0x14, 0x05, 0x02, 0x3F, 0x00, 0xC0, 0x48, 0x09,
+ 0x01, 0x10, 0x42, 0x08, 0x41, 0x04, 0x40, 0x88, 0x11, 0x01, 0x40, 0x28,
+ 0x05, 0x00, 0x40, 0x81, 0x81, 0x41, 0x81, 0x41, 0x41, 0x41, 0x42, 0x22,
+ 0x42, 0x22, 0x22, 0x22, 0x24, 0x24, 0x24, 0x14, 0x24, 0x14, 0x14, 0x14,
+ 0x18, 0x18, 0x18, 0x08, 0x18, 0x40, 0xC8, 0x22, 0x10, 0x44, 0x0A, 0x03,
+ 0x00, 0xC0, 0x28, 0x12, 0x0C, 0x42, 0x09, 0x02, 0x40, 0x40, 0x40, 0x6C,
+ 0x08, 0x82, 0x08, 0xC1, 0x90, 0x14, 0x01, 0x80, 0x20, 0x04, 0x00, 0x80,
+ 0x10, 0x02, 0x00, 0x40, 0x7F, 0xC0, 0x20, 0x18, 0x04, 0x02, 0x01, 0x00,
+ 0xC0, 0x20, 0x10, 0x08, 0x06, 0x01, 0x00, 0xFF, 0xC0, 0xF8, 0x88, 0x88,
+ 0x88, 0x88, 0x88, 0x88, 0x8F, 0x01, 0x04, 0x10, 0x20, 0x81, 0x04, 0x10,
+ 0x20, 0x82, 0x04, 0xF1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F, 0x08,
+ 0x0A, 0x09, 0x04, 0x44, 0x12, 0x08, 0xFF, 0x80, 0x49, 0x00, 0x38, 0xC6,
+ 0x82, 0x02, 0x06, 0x7A, 0x82, 0x82, 0x82, 0x7F, 0x80, 0x40, 0x20, 0x13,
+ 0x8A, 0x26, 0x0B, 0x03, 0x01, 0x80, 0xC0, 0x70, 0x58, 0x2B, 0xE0, 0x1C,
+ 0x62, 0xC1, 0x80, 0x80, 0x80, 0x80, 0x81, 0x41, 0x3E, 0x01, 0x01, 0x01,
+ 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43, 0x3D, 0x3C, 0x42,
+ 0x81, 0x81, 0xFF, 0x80, 0x80, 0x81, 0x41, 0x3E, 0x32, 0x22, 0x72, 0x22,
+ 0x22, 0x22, 0x20, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43,
+ 0x3D, 0x81, 0x81, 0x7E, 0x80, 0x80, 0x80, 0x9C, 0xA2, 0xC1, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x9F, 0xF8, 0x20, 0x12, 0x49, 0x24, 0x92,
+ 0x49, 0xC0, 0x80, 0x80, 0x80, 0x83, 0x84, 0x88, 0x90, 0xB0, 0xC8, 0x84,
+ 0x84, 0x82, 0x81, 0xFF, 0xF8, 0x98, 0x65, 0x3C, 0xF0, 0x83, 0x04, 0x18,
+ 0x20, 0xC1, 0x06, 0x08, 0x30, 0x41, 0x82, 0x0C, 0x10, 0x40, 0x9C, 0xA2,
+ 0xC1, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x3C, 0x21, 0xA0, 0x50,
+ 0x18, 0x0C, 0x06, 0x03, 0x02, 0x41, 0x1F, 0x00, 0x9C, 0x51, 0xB0, 0x58,
+ 0x18, 0x0C, 0x06, 0x03, 0x82, 0xA1, 0x4B, 0x22, 0x10, 0x08, 0x04, 0x00,
+ 0x3D, 0x43, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x43, 0x25, 0x19, 0x01,
+ 0x01, 0x01, 0x9D, 0x31, 0x88, 0x42, 0x10, 0x84, 0x00, 0x79, 0x0A, 0x0C,
+ 0x06, 0x03, 0x80, 0x81, 0x82, 0xF8, 0x44, 0xF4, 0x44, 0x44, 0x44, 0x43,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x83, 0x43, 0x7D, 0x81, 0x41,
+ 0x41, 0x42, 0x22, 0x24, 0x24, 0x14, 0x18, 0x08, 0x82, 0x0C, 0x10, 0x51,
+ 0x44, 0x8A, 0x24, 0x51, 0x12, 0x90, 0xA2, 0x85, 0x14, 0x18, 0xC0, 0x82,
+ 0x00, 0x41, 0x21, 0x08, 0x82, 0x81, 0x80, 0xC0, 0x50, 0x44, 0x42, 0x20,
+ 0x80, 0x80, 0x41, 0x41, 0x42, 0x22, 0x22, 0x24, 0x14, 0x18, 0x08, 0x08,
+ 0x10, 0x30, 0x40, 0x7E, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x40,
+ 0xFF, 0x08, 0x42, 0x08, 0x20, 0x82, 0x08, 0xC0, 0x82, 0x08, 0x20, 0x82,
+ 0x04, 0x18, 0x10, 0xFF, 0xFF, 0x80, 0x40, 0x82, 0x04, 0x10, 0x41, 0x04,
+ 0x0C, 0x41, 0x04, 0x10, 0x41, 0x08, 0x62, 0x00, 0x70, 0x0F };
+
+const GFXglyph Shree7149pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 2, 13, 4, 1, -12 }, // 0x21 '!'
+ { 5, 4, 4, 6, 1, -13 }, // 0x22 '"'
+ { 7, 13, 11, 15, 1, -10 }, // 0x23 '#'
+ { 25, 10, 17, 13, 1, -14 }, // 0x24 '$'
+ { 47, 14, 14, 16, 1, -13 }, // 0x25 '%'
+ { 72, 11, 14, 11, 0, -13 }, // 0x26 '&'
+ { 92, 2, 4, 4, 1, -13 }, // 0x27 '''
+ { 93, 4, 16, 6, 1, -13 }, // 0x28 '('
+ { 101, 4, 16, 6, 1, -13 }, // 0x29 ')'
+ { 109, 8, 8, 10, 1, -13 }, // 0x2A '*'
+ { 117, 9, 9, 11, 1, -8 }, // 0x2B '+'
+ { 128, 2, 4, 4, 1, 0 }, // 0x2C ','
+ { 129, 8, 1, 10, 1, -4 }, // 0x2D '-'
+ { 130, 2, 1, 4, 1, 0 }, // 0x2E '.'
+ { 131, 8, 14, 11, 1, -12 }, // 0x2F '/'
+ { 145, 9, 13, 11, 1, -12 }, // 0x30 '0'
+ { 160, 4, 13, 11, 3, -12 }, // 0x31 '1'
+ { 167, 8, 13, 11, 1, -12 }, // 0x32 '2'
+ { 180, 9, 13, 11, 1, -12 }, // 0x33 '3'
+ { 195, 9, 13, 11, 1, -12 }, // 0x34 '4'
+ { 210, 9, 13, 11, 1, -12 }, // 0x35 '5'
+ { 225, 9, 13, 11, 1, -12 }, // 0x36 '6'
+ { 240, 8, 13, 11, 1, -12 }, // 0x37 '7'
+ { 253, 9, 13, 11, 1, -12 }, // 0x38 '8'
+ { 268, 9, 13, 11, 1, -12 }, // 0x39 '9'
+ { 283, 2, 10, 4, 1, -9 }, // 0x3A ':'
+ { 286, 2, 13, 4, 1, -9 }, // 0x3B ';'
+ { 290, 7, 9, 10, 1, -8 }, // 0x3C '<'
+ { 298, 8, 5, 10, 1, -6 }, // 0x3D '='
+ { 303, 7, 10, 10, 1, -9 }, // 0x3E '>'
+ { 312, 8, 14, 11, 1, -13 }, // 0x3F '?'
+ { 326, 18, 17, 20, 1, -13 }, // 0x40 '@'
+ { 365, 12, 13, 12, 0, -12 }, // 0x41 'A'
+ { 385, 10, 13, 12, 1, -12 }, // 0x42 'B'
+ { 402, 11, 14, 12, 1, -13 }, // 0x43 'C'
+ { 422, 11, 13, 12, 1, -12 }, // 0x44 'D'
+ { 440, 9, 13, 10, 1, -12 }, // 0x45 'E'
+ { 455, 9, 13, 10, 1, -12 }, // 0x46 'F'
+ { 470, 11, 14, 13, 1, -13 }, // 0x47 'G'
+ { 490, 10, 13, 13, 1, -12 }, // 0x48 'H'
+ { 507, 1, 13, 4, 1, -12 }, // 0x49 'I'
+ { 509, 7, 13, 9, 0, -12 }, // 0x4A 'J'
+ { 521, 10, 13, 12, 1, -12 }, // 0x4B 'K'
+ { 538, 8, 13, 10, 1, -12 }, // 0x4C 'L'
+ { 551, 13, 13, 15, 1, -12 }, // 0x4D 'M'
+ { 573, 11, 13, 13, 1, -12 }, // 0x4E 'N'
+ { 591, 12, 14, 13, 1, -13 }, // 0x4F 'O'
+ { 612, 10, 13, 11, 1, -12 }, // 0x50 'P'
+ { 629, 11, 15, 13, 1, -13 }, // 0x51 'Q'
+ { 650, 10, 13, 12, 1, -12 }, // 0x52 'R'
+ { 667, 9, 14, 11, 1, -13 }, // 0x53 'S'
+ { 683, 10, 13, 10, 0, -12 }, // 0x54 'T'
+ { 700, 10, 13, 12, 1, -12 }, // 0x55 'U'
+ { 717, 11, 13, 11, 0, -12 }, // 0x56 'V'
+ { 735, 16, 13, 17, 0, -12 }, // 0x57 'W'
+ { 761, 10, 13, 11, 0, -12 }, // 0x58 'X'
+ { 778, 11, 13, 11, 0, -12 }, // 0x59 'Y'
+ { 796, 10, 13, 11, 0, -12 }, // 0x5A 'Z'
+ { 813, 4, 16, 6, 1, -13 }, // 0x5B '['
+ { 821, 6, 13, 8, 1, -11 }, // 0x5C '\'
+ { 831, 4, 16, 6, 1, -13 }, // 0x5D ']'
+ { 839, 9, 6, 11, 1, -7 }, // 0x5E '^'
+ { 846, 9, 1, 9, 0, 3 }, // 0x5F '_'
+ { 848, 3, 3, 5, 1, -13 }, // 0x60 '`'
+ { 850, 8, 10, 10, 1, -9 }, // 0x61 'a'
+ { 860, 9, 13, 11, 1, -12 }, // 0x62 'b'
+ { 875, 8, 10, 10, 1, -9 }, // 0x63 'c'
+ { 885, 8, 13, 11, 1, -12 }, // 0x64 'd'
+ { 898, 8, 10, 10, 1, -9 }, // 0x65 'e'
+ { 908, 4, 13, 4, 0, -12 }, // 0x66 'f'
+ { 915, 8, 13, 11, 1, -9 }, // 0x67 'g'
+ { 928, 8, 13, 10, 1, -12 }, // 0x68 'h'
+ { 941, 1, 13, 4, 1, -12 }, // 0x69 'i'
+ { 943, 3, 17, 4, 0, -12 }, // 0x6A 'j'
+ { 950, 8, 13, 9, 1, -12 }, // 0x6B 'k'
+ { 963, 1, 13, 4, 1, -12 }, // 0x6C 'l'
+ { 965, 13, 10, 15, 1, -9 }, // 0x6D 'm'
+ { 982, 8, 10, 10, 1, -9 }, // 0x6E 'n'
+ { 992, 9, 10, 11, 1, -9 }, // 0x6F 'o'
+ { 1004, 9, 14, 11, 1, -9 }, // 0x70 'p'
+ { 1020, 8, 14, 11, 1, -9 }, // 0x71 'q'
+ { 1034, 5, 10, 6, 1, -9 }, // 0x72 'r'
+ { 1041, 7, 10, 9, 1, -9 }, // 0x73 's'
+ { 1050, 4, 12, 4, 0, -11 }, // 0x74 't'
+ { 1056, 8, 10, 10, 1, -9 }, // 0x75 'u'
+ { 1066, 8, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1076, 13, 10, 13, 0, -9 }, // 0x77 'w'
+ { 1093, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1105, 8, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1119, 8, 10, 8, 0, -9 }, // 0x7A 'z'
+ { 1129, 6, 18, 8, 1, -13 }, // 0x7B '{'
+ { 1143, 1, 17, 4, 1, -13 }, // 0x7C '|'
+ { 1146, 6, 18, 8, 1, -13 }, // 0x7D '}'
+ { 1160, 8, 2, 11, 1, -5 } }; // 0x7E '~'
+
+const GFXfont Shree7149pt7b PROGMEM = {
+ (uint8_t *)Shree7149pt7bBitmaps,
+ (GFXglyph *)Shree7149pt7bGlyphs,
+ 0x20, 0x7E, 26 };
+
+// Approx. 1834 bytes
+
+
+// Approx. 1730 bytes
+
+// Approx. 1385 bytes
+
+const uint8_t C649pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xF0, 0xF0, 0x7F, 0x83,
+ 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0x3C, 0x1E, 0x0F, 0x07, 0x83,
+ 0xC1, 0xE0, 0xF0, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC1, 0xE0, 0xF0,
+ 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0x07, 0x80, 0x3C, 0x0F, 0xFE, 0x7F, 0xFF,
+ 0x00, 0x78, 0x00, 0xFF, 0x87, 0xFC, 0x00, 0x78, 0x03, 0xC0, 0x19, 0xFF,
+ 0xCF, 0xFE, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x1F, 0x01, 0xF0, 0xFF, 0x0F,
+ 0x03, 0xC0, 0x3C, 0x07, 0x80, 0x78, 0x04, 0x03, 0xC0, 0x30, 0x0F, 0x0F,
+ 0xF0, 0xFC, 0x0F, 0xC0, 0xF0, 0x3F, 0xE0, 0x7F, 0xC3, 0xC1, 0xE7, 0x83,
+ 0xC3, 0xFE, 0x07, 0xFC, 0x0F, 0xE0, 0x1F, 0xC0, 0x30, 0x81, 0xE0, 0xFF,
+ 0xC1, 0xFF, 0x83, 0xCF, 0x07, 0x87, 0xFF, 0xCF, 0xFF, 0x80, 0x07, 0x83,
+ 0xCF, 0x07, 0x8F, 0x07, 0x80, 0x07, 0x83, 0xCF, 0x07, 0x8F, 0x07, 0x83,
+ 0xC1, 0xE0, 0xF0, 0x78, 0x0F, 0x07, 0x83, 0xC0, 0x3C, 0x1E, 0xF0, 0x78,
+ 0x0F, 0x07, 0x80, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xCF, 0x07, 0x83,
+ 0xC7, 0x83, 0xC0, 0x3C, 0x1E, 0x0F, 0x07, 0x80, 0xFF, 0x80, 0x3F, 0xE0,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x80, 0x3F, 0xE0, 0x3C, 0x1E, 0x0F,
+ 0x07, 0x80, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x3C, 0xF3, 0xCF, 0xF3,
+ 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x00, 0x0F, 0x80, 0x07, 0xC0,
+ 0x1E, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x06, 0x00, 0x0F, 0x00,
+ 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x00, 0x3F,
+ 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x3F, 0xF9, 0xFF, 0xF9, 0xFF, 0xCF,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x03, 0xF8, 0x1F, 0xC0, 0x1E, 0x00,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x7F, 0xFF, 0xFF,
+ 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C, 0x07,
+ 0x80, 0x3C, 0x3C, 0x01, 0xE0, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF,
+ 0xFF, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07, 0x80, 0x3C,
+ 0x3F, 0x81, 0xFC, 0x00, 0x60, 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F,
+ 0xF0, 0xFF, 0x80, 0x00, 0x78, 0x00, 0x78, 0x03, 0xF8, 0x03, 0xF8, 0x0F,
+ 0xF8, 0x0F, 0xF8, 0xF0, 0x78, 0xF0, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0xFF, 0xFF, 0xFF,
+ 0xFC, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x78,
+ 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0x3F, 0xE1,
+ 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xFF, 0x9F, 0xFC, 0xF0,
+ 0x67, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x1F, 0xE0, 0xF0, 0x1E, 0x00, 0xF0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0x87,
+ 0xFC, 0x30, 0x67, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF,
+ 0x80, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF,
+ 0xE7, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0,
+ 0xFF, 0x80, 0xFF, 0x00, 0x00, 0xFF, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x0F,
+ 0x3C, 0xF3, 0xFC, 0xF0, 0x03, 0xF8, 0x1F, 0xC1, 0xE0, 0x0F, 0x03, 0xC0,
+ 0x1E, 0x03, 0xC0, 0x1E, 0x00, 0x30, 0x01, 0xE0, 0x01, 0xE0, 0x0F, 0x00,
+ 0x78, 0x01, 0xFC, 0x0F, 0xE0, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F,
+ 0xFF, 0xFF, 0xFC, 0xFE, 0x07, 0xF0, 0x01, 0xE0, 0x0F, 0x00, 0x1E, 0x00,
+ 0xF0, 0x01, 0xE0, 0x0F, 0x00, 0x60, 0x0F, 0x01, 0xE0, 0x0F, 0x00, 0x78,
+ 0x7F, 0x03, 0xF8, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xF0, 0x07,
+ 0x80, 0x3C, 0x07, 0x80, 0x3C, 0x07, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xC0, 0x1E, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF,
+ 0x3F, 0xF9, 0xFF, 0xCF, 0xFE, 0x7F, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x3F, 0x01, 0x9F, 0xF0, 0xFF, 0x80, 0x07, 0x80, 0x3C, 0x0F, 0xF8, 0x7F,
+ 0xCF, 0x07, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xE0, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x67, 0x83, 0xFC,
+ 0x1F, 0xE0, 0xFF, 0x07, 0xFF, 0xF3, 0xFF, 0x80, 0x3F, 0xE1, 0xFF, 0x3C,
+ 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0x87, 0xFC,
+ 0x3C, 0x79, 0xE3, 0xCF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F,
+ 0x83, 0xFC, 0x79, 0xE3, 0xCF, 0x1E, 0x7F, 0xC3, 0xFE, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFE, 0x1F, 0xF0, 0xF0,
+ 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xFF,
+ 0xFF, 0xFF, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFE, 0x1F, 0xF0,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x00,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03, 0xCF, 0xFE,
+ 0x7F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF,
+ 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF,
+ 0xFF, 0xFF, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F,
+ 0xC1, 0xE0, 0xFF, 0xFF, 0xCF, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC7, 0xFF, 0xFE, 0x0F, 0xF8, 0x7F, 0xC0, 0x78,
+ 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00,
+ 0x79, 0xE3, 0xCF, 0x1E, 0x1F, 0xC0, 0xFE, 0x00, 0xF0, 0x7F, 0x83, 0xFC,
+ 0x79, 0xE3, 0xCF, 0xF8, 0x7F, 0xC3, 0xF8, 0x1F, 0xC0, 0xFE, 0x07, 0xFC,
+ 0x3C, 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0x3F, 0xC1, 0xE0, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xF0, 0x1F,
+ 0xE0, 0x3F, 0xF9, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0xF8,
+ 0xCF, 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03,
+ 0xFC, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFF, 0x9F, 0xFC, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x9F, 0xFC, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3F, 0xC1, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF,
+ 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF,
+ 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x00, 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E,
+ 0x7F, 0xC3, 0xFE, 0x01, 0xFC, 0x0F, 0xE0, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F,
+ 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xFF, 0x87, 0xFC, 0x3C,
+ 0x79, 0xE3, 0xCF, 0x1E, 0x78, 0x3F, 0xC1, 0xE0, 0x3F, 0xE1, 0xFF, 0x3C,
+ 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x00, 0xFF, 0x87, 0xFC, 0x00, 0x60, 0x03,
+ 0xC0, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF,
+ 0xC1, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80,
+ 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x7F,
+ 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x9F, 0xF0, 0xFF, 0x80, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0x7F, 0xC3, 0xFE, 0x03, 0xC0, 0x1E, 0x00,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x03, 0xFC,
+ 0x67, 0xF8, 0xCF, 0xF1, 0x9F, 0xFF, 0xFF, 0xF9, 0xFF, 0xF3, 0xFF, 0xE7,
+ 0xFE, 0x03, 0xFC, 0x07, 0x80, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xF3,
+ 0xFE, 0x1F, 0xF0, 0x1E, 0x00, 0xF0, 0x3F, 0xE1, 0xFF, 0x0C, 0x19, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xE0, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0x87, 0xFC, 0x07, 0x80, 0x3C, 0x01, 0xE0,
+ 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E,
+ 0x00, 0xF0, 0x1E, 0x00, 0xF0, 0x1E, 0x00, 0xF0, 0x3C, 0x01, 0xE0, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFC, 0x1E,
+ 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xFF,
+ 0xFE, 0xF0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00,
+ 0x3C, 0x00, 0x06, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E,
+ 0x00, 0x01, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0xC1, 0xE0, 0xF0, 0x78, 0x3C,
+ 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7F, 0xFF, 0xFE, 0x01, 0x80,
+ 0x03, 0x00, 0x1F, 0x80, 0x3F, 0x00, 0x46, 0x07, 0x8F, 0x0E, 0x06, 0x7C,
+ 0x0F, 0xF8, 0x1F, 0x80, 0x0F, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
+ 0xC3, 0x00, 0x0C, 0x30, 0x30, 0xC0, 0x3F, 0xE1, 0xFF, 0x00, 0x1E, 0x00,
+ 0xF3, 0xFF, 0x9F, 0xFC, 0xC1, 0xFE, 0x0F, 0xF0, 0x79, 0xFF, 0xCF, 0xFE,
+ 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF3, 0xC1, 0x9E,
+ 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xFF, 0xCF, 0xFE, 0x00, 0x3F, 0xE7,
+ 0xFF, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0x30, 0x07, 0xFC,
+ 0xFF, 0x80, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF3, 0xFF, 0x9F, 0xFC,
+ 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E, 0x7F, 0xF3, 0xFF, 0x80,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E,
+ 0x00, 0x30, 0x01, 0xFF, 0x0F, 0xF8, 0x0F, 0xE1, 0xFC, 0xF0, 0x1E, 0x0F,
+ 0xFF, 0xFF, 0xCF, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0,
+ 0x3F, 0xF9, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3C, 0xFF, 0xE7,
+ 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xFF, 0xCF, 0xFE, 0x00, 0xF0, 0x07,
+ 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0xFE, 0x7F, 0xF3, 0xC1, 0x9E, 0x0F, 0xF0,
+ 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0x80, 0x3C, 0x1E, 0x00, 0x00,
+ 0x0F, 0xC7, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x1F, 0xFF, 0xF8, 0x01,
+ 0xE0, 0x3C, 0x00, 0x00, 0x00, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0,
+ 0x3C, 0x07, 0x80, 0xF0, 0x1F, 0xFF, 0x3F, 0xE0, 0xF0, 0x07, 0x80, 0x3C,
+ 0x01, 0xE0, 0x0F, 0x1E, 0x78, 0xF3, 0xFE, 0x1F, 0xF0, 0xF1, 0xE7, 0x8F,
+ 0x3C, 0x79, 0xE0, 0xFF, 0x07, 0x80, 0xFC, 0x7E, 0x0F, 0x07, 0x83, 0xC1,
+ 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x1F, 0xFF, 0xF8, 0xF0, 0x79, 0xE0,
+ 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0xF8, 0xCF,
+ 0xF1, 0x9F, 0xE0, 0x3F, 0xC0, 0x78, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x0F, 0xF0, 0x7F, 0x83, 0xFC, 0x1E,
+ 0x3F, 0xE1, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
+ 0x0F, 0x30, 0x61, 0xFF, 0x0F, 0xF8, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x9F, 0xFC, 0xF0, 0x07, 0x80, 0x3C, 0x01,
+ 0xE0, 0x0F, 0x00, 0x00, 0x3F, 0xF9, 0xFF, 0xFC, 0x1F, 0xE0, 0xFF, 0x07,
+ 0xF8, 0x3C, 0xFF, 0xE7, 0xFF, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0,
+ 0x07, 0x80, 0xFF, 0xE7, 0xFF, 0x3C, 0x1F, 0xE0, 0xFF, 0x00, 0x78, 0x03,
+ 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x00, 0x3F, 0xF9, 0xFF, 0xFC,
+ 0x01, 0xE0, 0x03, 0xFE, 0x1F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x7F, 0xFF,
+ 0x3F, 0xF8, 0x07, 0x80, 0x3C, 0x3F, 0xFF, 0xFF, 0xF0, 0x78, 0x03, 0xC0,
+ 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x07, 0xF0, 0x3F, 0x80,
+ 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE,
+ 0x0F, 0xF0, 0x79, 0xFF, 0xCF, 0xFE, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0,
+ 0xFF, 0x07, 0xF8, 0x3C, 0xC1, 0x87, 0xFC, 0x3F, 0xE0, 0x3C, 0x01, 0xE0,
+ 0xF0, 0x1F, 0xE0, 0x3F, 0xC6, 0x7F, 0x8C, 0xFF, 0x19, 0xFF, 0xFF, 0xCF,
+ 0xFE, 0x1F, 0xFC, 0x3C, 0x78, 0x78, 0xF0, 0xF1, 0xE0, 0xF0, 0x7F, 0x83,
+ 0xCF, 0xF8, 0x7F, 0xC0, 0x78, 0x03, 0xC0, 0xFF, 0x87, 0xFC, 0x30, 0x67,
+ 0x83, 0xFC, 0x1E, 0xF0, 0x7F, 0x83, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF8,
+ 0x3C, 0xFF, 0xE7, 0xFF, 0x01, 0xE0, 0x0F, 0x00, 0x79, 0xFF, 0x0F, 0xF8,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x78, 0x03, 0xC0, 0x78, 0x03, 0xC0, 0x1E,
+ 0x07, 0x80, 0x3C, 0x07, 0xFF, 0xFF, 0xFE, 0x07, 0x83, 0xCF, 0x07, 0x83,
+ 0xC1, 0xE3, 0xC1, 0xE0, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC0, 0x3C, 0x1E,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x78, 0x0F,
+ 0x07, 0x83, 0xC1, 0xE0, 0x1E, 0x0F, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC7,
+ 0x83, 0xC0, 0x3F, 0x86, 0x7F, 0x0F, 0x0F, 0xE6, 0x1F, 0xC0 };
+
+const GFXglyph C649pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 18, 0, 0 }, // 0x20 ' '
+ { 1, 4, 15, 18, 7, -14 }, // 0x21 '!'
+ { 9, 13, 6, 18, 2, -14 }, // 0x22 '"'
+ { 19, 18, 15, 18, 0, -14 }, // 0x23 '#'
+ { 53, 13, 15, 18, 2, -14 }, // 0x24 '$'
+ { 78, 12, 15, 18, 2, -14 }, // 0x25 '%'
+ { 101, 15, 15, 18, 2, -14 }, // 0x26 '&'
+ { 130, 9, 6, 18, 7, -14 }, // 0x27 '''
+ { 137, 9, 15, 18, 4, -14 }, // 0x28 '('
+ { 154, 9, 15, 18, 4, -14 }, // 0x29 ')'
+ { 171, 18, 10, 18, 0, -12 }, // 0x2A '*'
+ { 194, 13, 11, 18, 2, -12 }, // 0x2B '+'
+ { 212, 6, 6, 18, 4, -3 }, // 0x2C ','
+ { 217, 13, 2, 18, 2, -8 }, // 0x2D '-'
+ { 221, 4, 4, 18, 7, -3 }, // 0x2E '.'
+ { 223, 17, 13, 18, 2, -12 }, // 0x2F '/'
+ { 251, 13, 15, 18, 2, -14 }, // 0x30 '0'
+ { 276, 13, 15, 18, 2, -14 }, // 0x31 '1'
+ { 301, 13, 15, 18, 2, -14 }, // 0x32 '2'
+ { 326, 13, 15, 18, 2, -14 }, // 0x33 '3'
+ { 351, 16, 15, 18, 2, -14 }, // 0x34 '4'
+ { 381, 13, 15, 18, 2, -14 }, // 0x35 '5'
+ { 406, 13, 15, 18, 2, -14 }, // 0x36 '6'
+ { 431, 13, 15, 18, 2, -14 }, // 0x37 '7'
+ { 456, 13, 15, 18, 2, -14 }, // 0x38 '8'
+ { 481, 13, 15, 18, 2, -14 }, // 0x39 '9'
+ { 506, 4, 8, 18, 7, -10 }, // 0x3A ':'
+ { 510, 6, 13, 18, 4, -10 }, // 0x3B ';'
+ { 520, 13, 15, 18, 2, -14 }, // 0x3C '<'
+ { 545, 13, 6, 18, 2, -10 }, // 0x3D '='
+ { 555, 13, 15, 18, 2, -14 }, // 0x3E '>'
+ { 580, 13, 15, 18, 2, -14 }, // 0x3F '?'
+ { 605, 13, 15, 18, 2, -14 }, // 0x40 '@'
+ { 630, 13, 15, 18, 2, -14 }, // 0x41 'A'
+ { 655, 13, 15, 18, 2, -14 }, // 0x42 'B'
+ { 680, 13, 15, 18, 2, -14 }, // 0x43 'C'
+ { 705, 13, 15, 18, 2, -14 }, // 0x44 'D'
+ { 730, 13, 15, 18, 2, -14 }, // 0x45 'E'
+ { 755, 13, 15, 18, 2, -14 }, // 0x46 'F'
+ { 780, 13, 15, 18, 2, -14 }, // 0x47 'G'
+ { 805, 13, 15, 18, 2, -14 }, // 0x48 'H'
+ { 830, 9, 15, 18, 4, -14 }, // 0x49 'I'
+ { 847, 13, 15, 18, 2, -14 }, // 0x4A 'J'
+ { 872, 13, 15, 18, 2, -14 }, // 0x4B 'K'
+ { 897, 13, 15, 18, 2, -14 }, // 0x4C 'L'
+ { 922, 15, 15, 18, 2, -14 }, // 0x4D 'M'
+ { 951, 13, 15, 18, 2, -14 }, // 0x4E 'N'
+ { 976, 13, 15, 18, 2, -14 }, // 0x4F 'O'
+ { 1001, 13, 15, 18, 2, -14 }, // 0x50 'P'
+ { 1026, 13, 15, 18, 2, -14 }, // 0x51 'Q'
+ { 1051, 13, 15, 18, 2, -14 }, // 0x52 'R'
+ { 1076, 13, 15, 18, 2, -14 }, // 0x53 'S'
+ { 1101, 13, 15, 18, 2, -14 }, // 0x54 'T'
+ { 1126, 13, 15, 18, 2, -14 }, // 0x55 'U'
+ { 1151, 13, 15, 18, 2, -14 }, // 0x56 'V'
+ { 1176, 15, 15, 18, 2, -14 }, // 0x57 'W'
+ { 1205, 13, 15, 18, 2, -14 }, // 0x58 'X'
+ { 1230, 13, 15, 18, 2, -14 }, // 0x59 'Y'
+ { 1255, 13, 15, 18, 2, -14 }, // 0x5A 'Z'
+ { 1280, 9, 15, 18, 4, -14 }, // 0x5B '['
+ { 1297, 17, 13, 18, 2, -12 }, // 0x5C '\'
+ { 1325, 9, 15, 18, 4, -14 }, // 0x5D ']'
+ { 1342, 15, 11, 18, 2, -14 }, // 0x5E '^'
+ { 1363, 18, 2, 18, 0, 1 }, // 0x5F '_'
+ { 1368, 6, 7, 18, 4, -15 }, // 0x60 '`'
+ { 1374, 13, 11, 18, 2, -10 }, // 0x61 'a'
+ { 1392, 13, 13, 18, 2, -12 }, // 0x62 'b'
+ { 1414, 11, 11, 18, 2, -10 }, // 0x63 'c'
+ { 1430, 13, 13, 18, 2, -12 }, // 0x64 'd'
+ { 1452, 13, 11, 18, 2, -10 }, // 0x65 'e'
+ { 1470, 11, 13, 18, 4, -12 }, // 0x66 'f'
+ { 1488, 13, 13, 18, 2, -10 }, // 0x67 'g'
+ { 1510, 13, 13, 18, 2, -12 }, // 0x68 'h'
+ { 1532, 9, 13, 18, 4, -12 }, // 0x69 'i'
+ { 1547, 11, 15, 18, 4, -12 }, // 0x6A 'j'
+ { 1568, 13, 13, 18, 2, -12 }, // 0x6B 'k'
+ { 1590, 9, 13, 18, 4, -12 }, // 0x6C 'l'
+ { 1605, 15, 11, 18, 2, -10 }, // 0x6D 'm'
+ { 1626, 13, 11, 18, 2, -10 }, // 0x6E 'n'
+ { 1644, 13, 11, 18, 2, -10 }, // 0x6F 'o'
+ { 1662, 13, 13, 18, 2, -10 }, // 0x70 'p'
+ { 1684, 13, 13, 18, 2, -10 }, // 0x71 'q'
+ { 1706, 13, 11, 18, 2, -10 }, // 0x72 'r'
+ { 1724, 13, 11, 18, 2, -10 }, // 0x73 's'
+ { 1742, 13, 13, 18, 2, -12 }, // 0x74 't'
+ { 1764, 13, 11, 18, 2, -10 }, // 0x75 'u'
+ { 1782, 13, 11, 18, 2, -10 }, // 0x76 'v'
+ { 1800, 15, 11, 18, 2, -10 }, // 0x77 'w'
+ { 1821, 13, 11, 18, 2, -10 }, // 0x78 'x'
+ { 1839, 13, 13, 18, 2, -10 }, // 0x79 'y'
+ { 1861, 13, 11, 18, 2, -10 }, // 0x7A 'z'
+ { 1879, 9, 15, 18, 4, -14 }, // 0x7B '{'
+ { 1896, 4, 17, 18, 7, -14 }, // 0x7C '|'
+ { 1905, 9, 15, 18, 4, -14 }, // 0x7D '}'
+ { 1922, 15, 4, 18, 2, -7 } }; // 0x7E '~'
+
+const GFXfont C649pt7b PROGMEM = {
+ (uint8_t *)C649pt7bBitmaps,
+ (GFXglyph *)C649pt7bGlyphs,
+ 0x20, 0x7E, 18 };
+
+// Approx. 2602 bytes
+const uint8_t C645pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xC3, 0xC7, 0x8F, 0x18, 0x63, 0x18, 0xCF, 0xFD, 0x8C, 0xFF,
+ 0xD8, 0xC6, 0x31, 0x8C, 0x18, 0xFF, 0x03, 0xE0, 0x60, 0xBF, 0x0C, 0xC3,
+ 0x31, 0x86, 0x21, 0x0C, 0xE3, 0x7C, 0xC6, 0x7C, 0x78, 0x48, 0xC7, 0xC6,
+ 0x7F, 0x1B, 0x30, 0x1B, 0x31, 0x8C, 0x21, 0x83, 0xC3, 0x06, 0x31, 0x91,
+ 0x98, 0x63, 0x0F, 0x8F, 0xFC, 0xF8, 0x63, 0x00, 0x18, 0x30, 0x67, 0xF1,
+ 0x83, 0x00, 0x6F, 0x00, 0xFE, 0xF0, 0x01, 0xC1, 0x80, 0xE0, 0x20, 0x30,
+ 0x18, 0x0C, 0x00, 0x7D, 0x8F, 0x7F, 0xBC, 0x78, 0xF1, 0xBE, 0x18, 0x31,
+ 0xE0, 0xC1, 0x83, 0x06, 0x7F, 0x7D, 0x8C, 0x18, 0x66, 0x08, 0x30, 0x7F,
+ 0x7D, 0x8C, 0x19, 0xE0, 0x40, 0xF1, 0xBE, 0x06, 0x1E, 0x3E, 0xC6, 0xFF,
+ 0x06, 0x06, 0x06, 0xFF, 0x83, 0xF0, 0x20, 0x60, 0xF1, 0xBE, 0x7D, 0x8F,
+ 0x07, 0xEC, 0x58, 0xF1, 0xBE, 0xFF, 0x8C, 0x30, 0xC1, 0x83, 0x06, 0x0C,
+ 0x7D, 0x8F, 0x1B, 0xE4, 0x58, 0xF1, 0xBE, 0x7D, 0x8F, 0x1B, 0xF0, 0x60,
+ 0xF1, 0xBE, 0xC3, 0x60, 0x06, 0xF0, 0x0F, 0x18, 0x60, 0xC0, 0x40, 0x20,
+ 0x18, 0x0F, 0xFE, 0x03, 0xF8, 0xF0, 0x30, 0x30, 0x30, 0x41, 0x06, 0x78,
+ 0x7D, 0x8C, 0x18, 0x61, 0x80, 0x00, 0x0C, 0x7D, 0x8F, 0x3E, 0x7C, 0x18,
+ 0x30, 0xBE, 0x18, 0xFB, 0x1F, 0xFC, 0x78, 0xF1, 0xE3, 0xFD, 0x8F, 0x1F,
+ 0xEC, 0x58, 0xF1, 0xFE, 0x7D, 0x8F, 0x06, 0x0C, 0x18, 0x31, 0xBE, 0xF9,
+ 0x9B, 0x1E, 0x3C, 0x78, 0xB3, 0x7C, 0xFF, 0x83, 0x07, 0x8C, 0x18, 0x30,
+ 0x7F, 0xFF, 0x83, 0x07, 0x8C, 0x18, 0x30, 0x60, 0x7D, 0x8F, 0x06, 0xFC,
+ 0x78, 0xF1, 0xBE, 0xC7, 0x8F, 0x1F, 0xFC, 0x78, 0xF1, 0xE3, 0xFB, 0x18,
+ 0xC6, 0x31, 0x9F, 0x3E, 0x18, 0x30, 0x60, 0xC1, 0xB3, 0x3C, 0xC7, 0x9B,
+ 0xE7, 0x8F, 0x19, 0x33, 0x63, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x7F,
+ 0xC3, 0xF7, 0xFF, 0xCB, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xEF, 0xFF, 0xFD,
+ 0xF8, 0xF1, 0xE3, 0x7D, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xBE, 0xFD, 0x8F,
+ 0x1F, 0xEC, 0x18, 0x30, 0x60, 0x7C, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x7C,
+ 0x0F, 0xFD, 0x8F, 0x1F, 0xEF, 0x99, 0x31, 0x63, 0x7D, 0x8F, 0x03, 0xE0,
+ 0x40, 0xF1, 0xBE, 0xFE, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0xC7, 0x8F,
+ 0x1E, 0x3C, 0x78, 0xF1, 0xBE, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xDF, 0x0C,
+ 0xC3, 0xC3, 0xC3, 0xCB, 0xCB, 0xF7, 0xF7, 0xC3, 0xC7, 0x8D, 0xF0, 0xC1,
+ 0x8C, 0xB1, 0xE3, 0xC7, 0x8F, 0x1B, 0xE1, 0x83, 0x06, 0x0C, 0xFE, 0x0C,
+ 0x30, 0xC6, 0x08, 0x30, 0x7F, 0xFC, 0xCC, 0xCC, 0xCF, 0xC0, 0x18, 0x01,
+ 0x80, 0x20, 0x06, 0x01, 0x80, 0x1C, 0xF3, 0x33, 0x33, 0x3F, 0x08, 0x3C,
+ 0x24, 0x42, 0xC3, 0x81, 0xFF, 0xC0, 0x81, 0x10, 0x7C, 0x0D, 0xFA, 0x3C,
+ 0x6F, 0xC0, 0xC1, 0x83, 0xF6, 0x2C, 0x78, 0xFF, 0x00, 0x7F, 0x0C, 0x30,
+ 0x41, 0xF0, 0x06, 0x0D, 0xFA, 0x3C, 0x78, 0xDF, 0x80, 0x7D, 0x8F, 0xFE,
+ 0x04, 0x0F, 0x80, 0x3D, 0x8F, 0xD8, 0x61, 0x86, 0x00, 0x7F, 0x8F, 0x1B,
+ 0xF0, 0x60, 0xFF, 0x00, 0xC1, 0x83, 0xF6, 0x2C, 0x78, 0xF1, 0x80, 0x60,
+ 0x38, 0xC6, 0x33, 0xE0, 0x0C, 0x00, 0xC3, 0x0C, 0x30, 0xFE, 0xC1, 0x83,
+ 0x37, 0xCC, 0x99, 0xB1, 0x80, 0xE3, 0x18, 0xC6, 0x33, 0xE0, 0xC6, 0xFF,
+ 0xFF, 0xCB, 0xC3, 0xC3, 0xFD, 0x8F, 0x1E, 0x3C, 0x78, 0xC0, 0x7D, 0x8F,
+ 0x1E, 0x34, 0x4F, 0x80, 0xFD, 0x8F, 0x1F, 0xEC, 0x18, 0x30, 0x00, 0x7F,
+ 0x8F, 0x1B, 0xF0, 0x60, 0xC1, 0x80, 0xFD, 0x8F, 0x06, 0x0C, 0x18, 0x00,
+ 0x7F, 0x81, 0xF0, 0x20, 0x7F, 0x80, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18,
+ 0x0F, 0xC7, 0x8F, 0x1E, 0x3C, 0x6F, 0xC0, 0xC7, 0x8F, 0x1A, 0x23, 0x83,
+ 0x00, 0xC3, 0xCB, 0xCB, 0x7E, 0x66, 0x66, 0xC6, 0xF8, 0x60, 0xC6, 0x58,
+ 0xC0, 0xC7, 0x8F, 0x1B, 0xF0, 0xC1, 0xBE, 0x00, 0xFE, 0x18, 0x60, 0xC6,
+ 0x1F, 0xC0, 0x1B, 0x19, 0x86, 0x31, 0x83, 0xFF, 0xFF, 0xC0, 0xC3, 0x18,
+ 0x36, 0x31, 0x98, 0x79, 0x8F };
+
+const GFXglyph C645pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 10, 0, 0 }, // 0x20 ' '
+ { 1, 2, 8, 10, 4, -7 }, // 0x21 '!'
+ { 3, 7, 3, 10, 1, -7 }, // 0x22 '"'
+ { 6, 10, 8, 10, 0, -7 }, // 0x23 '#'
+ { 16, 7, 8, 10, 1, -7 }, // 0x24 '$'
+ { 23, 6, 8, 10, 1, -7 }, // 0x25 '%'
+ { 29, 8, 8, 10, 1, -7 }, // 0x26 '&'
+ { 37, 5, 3, 10, 4, -7 }, // 0x27 '''
+ { 39, 5, 8, 10, 2, -7 }, // 0x28 '('
+ { 44, 5, 8, 10, 2, -7 }, // 0x29 ')'
+ { 49, 10, 5, 10, 0, -6 }, // 0x2A '*'
+ { 56, 7, 6, 10, 1, -6 }, // 0x2B '+'
+ { 62, 3, 3, 10, 2, -1 }, // 0x2C ','
+ { 64, 7, 1, 10, 1, -4 }, // 0x2D '-'
+ { 65, 2, 2, 10, 4, -1 }, // 0x2E '.'
+ { 66, 10, 7, 10, 1, -6 }, // 0x2F '/'
+ { 75, 7, 8, 10, 1, -7 }, // 0x30 '0'
+ { 82, 7, 8, 10, 1, -7 }, // 0x31 '1'
+ { 89, 7, 8, 10, 1, -7 }, // 0x32 '2'
+ { 96, 7, 8, 10, 1, -7 }, // 0x33 '3'
+ { 103, 8, 8, 10, 1, -7 }, // 0x34 '4'
+ { 111, 7, 8, 10, 1, -7 }, // 0x35 '5'
+ { 118, 7, 8, 10, 1, -7 }, // 0x36 '6'
+ { 125, 7, 8, 10, 1, -7 }, // 0x37 '7'
+ { 132, 7, 8, 10, 1, -7 }, // 0x38 '8'
+ { 139, 7, 8, 10, 1, -7 }, // 0x39 '9'
+ { 146, 2, 4, 10, 4, -5 }, // 0x3A ':'
+ { 147, 3, 7, 10, 2, -5 }, // 0x3B ';'
+ { 150, 8, 8, 10, 1, -7 }, // 0x3C '<'
+ { 158, 7, 3, 10, 1, -5 }, // 0x3D '='
+ { 161, 7, 8, 10, 1, -7 }, // 0x3E '>'
+ { 168, 7, 8, 10, 1, -7 }, // 0x3F '?'
+ { 175, 7, 8, 10, 1, -7 }, // 0x40 '@'
+ { 182, 7, 8, 10, 1, -7 }, // 0x41 'A'
+ { 189, 7, 8, 10, 1, -7 }, // 0x42 'B'
+ { 196, 7, 8, 10, 1, -7 }, // 0x43 'C'
+ { 203, 7, 8, 10, 1, -7 }, // 0x44 'D'
+ { 210, 7, 8, 10, 1, -7 }, // 0x45 'E'
+ { 217, 7, 8, 10, 1, -7 }, // 0x46 'F'
+ { 224, 7, 8, 10, 1, -7 }, // 0x47 'G'
+ { 231, 7, 8, 10, 1, -7 }, // 0x48 'H'
+ { 238, 5, 8, 10, 2, -7 }, // 0x49 'I'
+ { 243, 7, 8, 10, 1, -7 }, // 0x4A 'J'
+ { 250, 7, 8, 10, 1, -7 }, // 0x4B 'K'
+ { 257, 7, 8, 10, 1, -7 }, // 0x4C 'L'
+ { 264, 8, 8, 10, 1, -7 }, // 0x4D 'M'
+ { 272, 7, 8, 10, 1, -7 }, // 0x4E 'N'
+ { 279, 7, 8, 10, 1, -7 }, // 0x4F 'O'
+ { 286, 7, 8, 10, 1, -7 }, // 0x50 'P'
+ { 293, 8, 8, 10, 1, -7 }, // 0x51 'Q'
+ { 301, 7, 8, 10, 1, -7 }, // 0x52 'R'
+ { 308, 7, 8, 10, 1, -7 }, // 0x53 'S'
+ { 315, 7, 8, 10, 1, -7 }, // 0x54 'T'
+ { 322, 7, 8, 10, 1, -7 }, // 0x55 'U'
+ { 329, 7, 8, 10, 1, -7 }, // 0x56 'V'
+ { 336, 8, 8, 10, 1, -7 }, // 0x57 'W'
+ { 344, 7, 8, 10, 1, -7 }, // 0x58 'X'
+ { 351, 7, 8, 10, 1, -7 }, // 0x59 'Y'
+ { 358, 7, 8, 10, 1, -7 }, // 0x5A 'Z'
+ { 365, 4, 8, 10, 2, -7 }, // 0x5B '['
+ { 369, 10, 7, 10, 1, -6 }, // 0x5C '\'
+ { 378, 4, 8, 10, 3, -7 }, // 0x5D ']'
+ { 382, 8, 6, 10, 1, -7 }, // 0x5E '^'
+ { 388, 10, 1, 10, 0, 1 }, // 0x5F '_'
+ { 390, 3, 4, 10, 2, -8 }, // 0x60 '`'
+ { 392, 7, 6, 10, 1, -5 }, // 0x61 'a'
+ { 398, 7, 7, 10, 1, -6 }, // 0x62 'b'
+ { 405, 6, 6, 10, 1, -5 }, // 0x63 'c'
+ { 410, 7, 7, 10, 1, -6 }, // 0x64 'd'
+ { 417, 7, 6, 10, 1, -5 }, // 0x65 'e'
+ { 423, 6, 7, 10, 2, -6 }, // 0x66 'f'
+ { 429, 7, 7, 10, 1, -5 }, // 0x67 'g'
+ { 436, 7, 7, 10, 1, -6 }, // 0x68 'h'
+ { 443, 5, 7, 10, 2, -6 }, // 0x69 'i'
+ { 448, 6, 8, 10, 2, -6 }, // 0x6A 'j'
+ { 454, 7, 7, 10, 1, -6 }, // 0x6B 'k'
+ { 461, 5, 7, 10, 2, -6 }, // 0x6C 'l'
+ { 466, 8, 6, 10, 1, -5 }, // 0x6D 'm'
+ { 472, 7, 6, 10, 1, -5 }, // 0x6E 'n'
+ { 478, 7, 6, 10, 1, -5 }, // 0x6F 'o'
+ { 484, 7, 7, 10, 1, -5 }, // 0x70 'p'
+ { 491, 7, 7, 10, 1, -5 }, // 0x71 'q'
+ { 498, 7, 6, 10, 1, -5 }, // 0x72 'r'
+ { 504, 7, 6, 10, 1, -5 }, // 0x73 's'
+ { 510, 8, 7, 10, 1, -6 }, // 0x74 't'
+ { 517, 7, 6, 10, 1, -5 }, // 0x75 'u'
+ { 523, 7, 6, 10, 1, -5 }, // 0x76 'v'
+ { 529, 8, 6, 10, 1, -5 }, // 0x77 'w'
+ { 535, 7, 6, 10, 1, -5 }, // 0x78 'x'
+ { 541, 7, 7, 10, 1, -5 }, // 0x79 'y'
+ { 548, 7, 6, 10, 1, -5 }, // 0x7A 'z'
+ { 554, 5, 8, 10, 2, -7 }, // 0x7B '{'
+ { 559, 2, 9, 10, 4, -7 }, // 0x7C '|'
+ { 562, 5, 8, 10, 2, -7 }, // 0x7D '}'
+ { 567, 8, 2, 10, 1, -4 } }; // 0x7E '~'
+
+const GFXfont C645pt7b PROGMEM = {
+ (uint8_t *)C645pt7bBitmaps,
+ (GFXglyph *)C645pt7bGlyphs,
+ 0x20, 0x7E, 10 };
+
+// Approx. 1241 bytes
+
+const uint8_t FUTRFW8pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xD0, 0x99, 0x99, 0x90, 0x16, 0x14, 0x14, 0x14, 0x7F, 0x28,
+ 0x28, 0xFE, 0x28, 0x50, 0x50, 0x18, 0x3C, 0x5A, 0x58, 0x58, 0x78, 0x1C,
+ 0x1F, 0x19, 0xD9, 0xDB, 0x7E, 0x18, 0x18, 0x70, 0x46, 0xC2, 0x22, 0x21,
+ 0x12, 0x08, 0x90, 0x39, 0x00, 0x18, 0x00, 0x9E, 0x09, 0x08, 0x48, 0x44,
+ 0x46, 0x61, 0xE0, 0x3C, 0x10, 0x84, 0x21, 0x08, 0x24, 0x0E, 0x06, 0x83,
+ 0x32, 0x84, 0xA0, 0xC4, 0x78, 0xF2, 0xF8, 0x29, 0x69, 0x24, 0x92, 0x24,
+ 0x88, 0x89, 0x32, 0x49, 0x24, 0xA4, 0xA0, 0x25, 0x5C, 0xEE, 0x90, 0x10,
+ 0x20, 0x47, 0xF1, 0x02, 0x04, 0x08, 0x2D, 0x20, 0xF0, 0x80, 0x04, 0x08,
+ 0x10, 0x40, 0x82, 0x04, 0x18, 0x20, 0x41, 0x02, 0x00, 0x38, 0x89, 0x14,
+ 0x18, 0x30, 0x60, 0xC1, 0x83, 0x89, 0x11, 0xC0, 0x71, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x78, 0x8E, 0x0C, 0x10, 0x20, 0x81, 0x04, 0x18, 0x61, 0x87,
+ 0xF0, 0x7C, 0x8A, 0x08, 0x10, 0x20, 0x86, 0x03, 0x03, 0x07, 0x1B, 0xE0,
+ 0x04, 0x04, 0x0C, 0x1C, 0x14, 0x24, 0x24, 0x44, 0xC4, 0xFF, 0x04, 0x04,
+ 0x3E, 0x40, 0x82, 0x04, 0x0F, 0x01, 0x81, 0x03, 0x07, 0x13, 0xC0, 0x0C,
+ 0x10, 0x41, 0x82, 0x0F, 0x11, 0xC1, 0x83, 0x05, 0x13, 0xC0, 0xFE, 0x04,
+ 0x10, 0x20, 0x81, 0x04, 0x08, 0x20, 0x41, 0x04, 0x00, 0x7D, 0x8E, 0x0C,
+ 0x14, 0x47, 0x11, 0x41, 0x83, 0x05, 0x11, 0xC0, 0x38, 0x8A, 0x0C, 0x18,
+ 0x28, 0x8F, 0x04, 0x18, 0x20, 0x80, 0xC0, 0x20, 0x20, 0x02, 0x56, 0xC0,
+ 0x03, 0x1C, 0xE0, 0xE0, 0x1C, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xC0, 0x38,
+ 0x07, 0x07, 0x38, 0xC0, 0x7B, 0x18, 0x43, 0x19, 0xCC, 0x22, 0x89, 0xC0,
+ 0x08, 0x1F, 0x06, 0x11, 0x01, 0x67, 0x59, 0x1B, 0x43, 0x68, 0x4D, 0x09,
+ 0xF3, 0x4B, 0xB0, 0xC0, 0x0F, 0xC0, 0x04, 0x00, 0x80, 0x28, 0x05, 0x01,
+ 0x90, 0x22, 0x04, 0x21, 0xFC, 0x20, 0x88, 0x09, 0x01, 0x20, 0x10, 0xF9,
+ 0x0A, 0x0C, 0x18, 0x30, 0xBF, 0x43, 0x83, 0x06, 0x1F, 0xE0, 0x1F, 0x18,
+ 0x50, 0x08, 0x08, 0x04, 0x02, 0x01, 0x00, 0xC0, 0x20, 0x0C, 0x23, 0xF0,
+ 0xFE, 0x20, 0xC8, 0x0A, 0x03, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0xE0,
+ 0x28, 0x13, 0xF8, 0xFE, 0x08, 0x20, 0x83, 0xF8, 0x20, 0x82, 0x08, 0x3F,
+ 0xFE, 0x08, 0x20, 0x83, 0xF8, 0x20, 0x82, 0x08, 0x20, 0x1F, 0x83, 0x0E,
+ 0x40, 0x2C, 0x00, 0x80, 0x08, 0x00, 0x81, 0xF8, 0x01, 0xC0, 0x14, 0x02,
+ 0x30, 0x40, 0xF8, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xFE, 0x03, 0x01,
+ 0x80, 0xC0, 0x60, 0x30, 0x10, 0xFF, 0xF0, 0x08, 0x42, 0x10, 0x84, 0x21,
+ 0x08, 0x42, 0xE0, 0x83, 0x43, 0x23, 0x11, 0x09, 0x07, 0x02, 0x41, 0x30,
+ 0x8C, 0x42, 0x20, 0x90, 0x20, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21,
+ 0xF0, 0x20, 0x20, 0xC0, 0xC3, 0x03, 0x0A, 0x14, 0x28, 0x50, 0xA1, 0x44,
+ 0x49, 0x91, 0x26, 0x43, 0x09, 0x0C, 0x24, 0x20, 0xA0, 0x02, 0x00, 0x60,
+ 0x1C, 0x06, 0x81, 0x90, 0x66, 0x18, 0xC6, 0x19, 0x83, 0x60, 0x78, 0x0E,
+ 0x01, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0x80, 0x28, 0x00, 0xC0, 0x06, 0x00,
+ 0x30, 0x01, 0x40, 0x13, 0x01, 0x8C, 0x18, 0x1F, 0x00, 0xF9, 0x0E, 0x0C,
+ 0x18, 0x30, 0xBE, 0x40, 0x81, 0x02, 0x04, 0x00, 0x0F, 0x81, 0x83, 0x10,
+ 0x04, 0x80, 0x28, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x41, 0x9B, 0x06,
+ 0x8C, 0x08, 0x1F, 0xE0, 0x01, 0x00, 0xFD, 0x0A, 0x0C, 0x18, 0x30, 0xFF,
+ 0x70, 0xB1, 0x32, 0x34, 0x30, 0x7D, 0x8E, 0x04, 0x04, 0x06, 0x03, 0x01,
+ 0x03, 0x07, 0x13, 0xC0, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01,
+ 0x80, 0xC0, 0xD0, 0x47, 0xC0, 0x80, 0xB0, 0x24, 0x19, 0x04, 0x61, 0x08,
+ 0x82, 0x20, 0x48, 0x14, 0x07, 0x00, 0x80, 0x20, 0xC1, 0x02, 0x83, 0x05,
+ 0x06, 0x1B, 0x0C, 0x22, 0x2C, 0x44, 0x49, 0x8C, 0x92, 0x0A, 0x34, 0x1C,
+ 0x38, 0x38, 0x60, 0x20, 0xC0, 0x40, 0x80, 0x41, 0x31, 0x08, 0x82, 0x81,
+ 0x40, 0x40, 0x20, 0x28, 0x22, 0x11, 0x10, 0x58, 0x30, 0x80, 0xA0, 0x98,
+ 0xC4, 0x41, 0x40, 0xA0, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x7F,
+ 0x00, 0x80, 0x80, 0x80, 0x40, 0x40, 0x60, 0x20, 0x20, 0x10, 0x10, 0x1F,
+ 0xF0, 0xF2, 0x49, 0x24, 0x92, 0x49, 0x38, 0x40, 0x40, 0x20, 0x10, 0x10,
+ 0x08, 0x0C, 0x04, 0x02, 0x02, 0x01, 0xE4, 0x92, 0x49, 0x24, 0x92, 0x78,
+ 0x32, 0x96, 0x7F, 0xFE, 0xC8, 0x80, 0x3D, 0x43, 0x81, 0x81, 0x81, 0x43,
+ 0x3D, 0x81, 0x02, 0x04, 0x08, 0x17, 0xB1, 0x41, 0x83, 0x07, 0x15, 0xC0,
+ 0x3D, 0x08, 0x20, 0x81, 0x03, 0xC0, 0x02, 0x04, 0x08, 0x10, 0x27, 0x51,
+ 0xC1, 0x83, 0x05, 0x19, 0xD0, 0x3C, 0x8E, 0x0F, 0xF8, 0x08, 0xCF, 0x00,
+ 0x3A, 0x10, 0x84, 0x7D, 0x08, 0x42, 0x10, 0x80, 0x3D, 0x43, 0x81, 0x81,
+ 0x81, 0x43, 0x3D, 0x01, 0x83, 0x7C, 0x82, 0x08, 0x20, 0x83, 0xEC, 0xE1,
+ 0x86, 0x18, 0x61, 0x8F, 0xF0, 0x8F, 0xFE, 0x81, 0x02, 0x04, 0x08, 0x11,
+ 0xA6, 0x58, 0xE1, 0x22, 0x24, 0x20, 0xFF, 0xF0, 0xF7, 0x46, 0x62, 0x31,
+ 0x18, 0x8C, 0x46, 0x22, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x40, 0x3C, 0x42,
+ 0x81, 0x81, 0x81, 0x42, 0x3C, 0xB9, 0x8A, 0x0C, 0x18, 0x38, 0xAF, 0x40,
+ 0x81, 0x00, 0x3A, 0x8E, 0x0C, 0x18, 0x28, 0xCE, 0x81, 0x02, 0x04, 0xBC,
+ 0x88, 0x88, 0x80, 0x7A, 0x18, 0x1E, 0x04, 0x1F, 0x80, 0x49, 0x2E, 0x92,
+ 0x49, 0x00, 0x86, 0x18, 0x61, 0x87, 0x37, 0x80, 0xC2, 0x42, 0x64, 0x24,
+ 0x38, 0x18, 0x10, 0x44, 0x34, 0x62, 0x66, 0x62, 0x94, 0x29, 0x41, 0x08,
+ 0x10, 0x80, 0x42, 0x24, 0x18, 0x18, 0x3C, 0x24, 0x42, 0x42, 0x62, 0x24,
+ 0x24, 0x18, 0x18, 0x10, 0x10, 0x20, 0x20, 0xFC, 0x21, 0x08, 0x61, 0x0F,
+ 0xC0, 0x74, 0x44, 0x44, 0x48, 0x44, 0x44, 0x44, 0x70, 0xFF, 0xE0, 0xE2,
+ 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0xE0, 0x71, 0x59, 0x86 };
+
+const GFXglyph FUTRFW8pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 16, 0, 0 }, // 0x20 ' '
+ { 1, 1, 12, 16, 7, -11 }, // 0x21 '!'
+ { 3, 4, 5, 16, 5, -11 }, // 0x22 '"'
+ { 6, 8, 11, 16, 4, -10 }, // 0x23 '#'
+ { 17, 8, 14, 16, 4, -11 }, // 0x24 '$'
+ { 31, 13, 12, 16, 1, -11 }, // 0x25 '%'
+ { 51, 10, 12, 16, 3, -11 }, // 0x26 '&'
+ { 66, 1, 5, 16, 7, -11 }, // 0x27 '''
+ { 67, 3, 15, 16, 6, -11 }, // 0x28 '('
+ { 73, 3, 15, 16, 6, -11 }, // 0x29 ')'
+ { 79, 5, 6, 16, 5, -11 }, // 0x2A '*'
+ { 83, 7, 8, 16, 4, -7 }, // 0x2B '+'
+ { 90, 3, 5, 16, 6, -1 }, // 0x2C ','
+ { 92, 4, 1, 16, 6, -3 }, // 0x2D '-'
+ { 93, 1, 1, 16, 4, 0 }, // 0x2E '.'
+ { 94, 7, 12, 16, 3, -11 }, // 0x2F '/'
+ { 105, 7, 12, 16, 3, -11 }, // 0x30 '0'
+ { 116, 4, 12, 16, 5, -11 }, // 0x31 '1'
+ { 122, 7, 12, 16, 4, -11 }, // 0x32 '2'
+ { 133, 7, 12, 16, 4, -11 }, // 0x33 '3'
+ { 144, 8, 12, 16, 3, -11 }, // 0x34 '4'
+ { 156, 7, 12, 16, 4, -11 }, // 0x35 '5'
+ { 167, 7, 12, 16, 4, -11 }, // 0x36 '6'
+ { 178, 7, 12, 16, 4, -11 }, // 0x37 '7'
+ { 189, 7, 12, 16, 4, -11 }, // 0x38 '8'
+ { 200, 7, 11, 16, 4, -11 }, // 0x39 '9'
+ { 210, 2, 6, 16, 5, -5 }, // 0x3A ':'
+ { 212, 3, 9, 16, 4, -5 }, // 0x3B ';'
+ { 216, 8, 6, 16, 3, -6 }, // 0x3C '<'
+ { 222, 8, 4, 16, 4, -5 }, // 0x3D '='
+ { 226, 8, 6, 16, 4, -6 }, // 0x3E '>'
+ { 232, 6, 12, 16, 5, -11 }, // 0x3F '?'
+ { 241, 11, 12, 16, 2, -11 }, // 0x40 '@'
+ { 258, 11, 12, 16, 2, -11 }, // 0x41 'A'
+ { 275, 7, 12, 16, 4, -11 }, // 0x42 'B'
+ { 286, 9, 12, 16, 2, -11 }, // 0x43 'C'
+ { 300, 10, 12, 16, 3, -11 }, // 0x44 'D'
+ { 315, 6, 12, 16, 4, -11 }, // 0x45 'E'
+ { 324, 6, 12, 16, 5, -11 }, // 0x46 'F'
+ { 333, 12, 12, 16, 2, -11 }, // 0x47 'G'
+ { 351, 9, 12, 16, 3, -11 }, // 0x48 'H'
+ { 365, 1, 12, 16, 7, -11 }, // 0x49 'I'
+ { 367, 5, 12, 16, 4, -11 }, // 0x4A 'J'
+ { 375, 9, 12, 16, 4, -11 }, // 0x4B 'K'
+ { 389, 5, 12, 16, 4, -11 }, // 0x4C 'L'
+ { 397, 14, 12, 16, 1, -11 }, // 0x4D 'M'
+ { 418, 10, 12, 16, 3, -11 }, // 0x4E 'N'
+ { 433, 13, 12, 16, 1, -11 }, // 0x4F 'O'
+ { 453, 7, 12, 16, 5, -11 }, // 0x50 'P'
+ { 464, 13, 13, 16, 2, -11 }, // 0x51 'Q'
+ { 486, 7, 12, 16, 4, -11 }, // 0x52 'R'
+ { 497, 7, 12, 16, 4, -11 }, // 0x53 'S'
+ { 508, 7, 12, 16, 3, -11 }, // 0x54 'T'
+ { 519, 9, 12, 16, 3, -11 }, // 0x55 'U'
+ { 533, 10, 12, 16, 2, -11 }, // 0x56 'V'
+ { 548, 15, 12, 16, 0, -11 }, // 0x57 'W'
+ { 571, 9, 12, 16, 3, -11 }, // 0x58 'X'
+ { 585, 9, 12, 16, 3, -11 }, // 0x59 'Y'
+ { 599, 9, 12, 16, 3, -11 }, // 0x5A 'Z'
+ { 613, 3, 15, 16, 6, -11 }, // 0x5B '['
+ { 619, 8, 11, 16, 4, -10 }, // 0x5C '\'
+ { 630, 3, 15, 16, 6, -11 }, // 0x5D ']'
+ { 636, 5, 3, 16, 5, -10 }, // 0x5E '^'
+ { 638, 16, 1, 16, 0, 1 }, // 0x5F '_'
+ { 640, 3, 3, 16, 5, -10 }, // 0x60 '`'
+ { 642, 8, 7, 16, 4, -6 }, // 0x61 'a'
+ { 649, 7, 12, 16, 4, -11 }, // 0x62 'b'
+ { 660, 6, 7, 16, 4, -6 }, // 0x63 'c'
+ { 666, 7, 12, 16, 3, -11 }, // 0x64 'd'
+ { 677, 7, 7, 16, 4, -6 }, // 0x65 'e'
+ { 684, 5, 12, 16, 5, -11 }, // 0x66 'f'
+ { 692, 8, 10, 16, 4, -6 }, // 0x67 'g'
+ { 702, 6, 12, 16, 5, -11 }, // 0x68 'h'
+ { 711, 1, 12, 16, 7, -11 }, // 0x69 'i'
+ { 713, 1, 15, 16, 7, -11 }, // 0x6A 'j'
+ { 715, 7, 12, 16, 5, -11 }, // 0x6B 'k'
+ { 726, 1, 12, 16, 7, -11 }, // 0x6C 'l'
+ { 728, 9, 7, 16, 3, -6 }, // 0x6D 'm'
+ { 736, 6, 7, 16, 5, -6 }, // 0x6E 'n'
+ { 742, 8, 7, 16, 4, -6 }, // 0x6F 'o'
+ { 749, 7, 10, 16, 4, -6 }, // 0x70 'p'
+ { 758, 7, 10, 16, 4, -6 }, // 0x71 'q'
+ { 767, 4, 7, 16, 6, -6 }, // 0x72 'r'
+ { 771, 6, 7, 16, 5, -6 }, // 0x73 's'
+ { 777, 3, 11, 16, 6, -10 }, // 0x74 't'
+ { 782, 6, 7, 16, 5, -6 }, // 0x75 'u'
+ { 788, 8, 7, 16, 4, -6 }, // 0x76 'v'
+ { 795, 12, 7, 16, 2, -6 }, // 0x77 'w'
+ { 806, 8, 7, 16, 4, -6 }, // 0x78 'x'
+ { 813, 8, 10, 16, 4, -6 }, // 0x79 'y'
+ { 823, 6, 7, 16, 4, -6 }, // 0x7A 'z'
+ { 829, 4, 15, 16, 5, -11 }, // 0x7B '{'
+ { 837, 1, 11, 16, 7, -10 }, // 0x7C '|'
+ { 839, 4, 15, 16, 6, -11 }, // 0x7D '}'
+ { 847, 8, 3, 16, 4, -4 } }; // 0x7E '~'
+
+const GFXfont FUTRFW8pt7b PROGMEM = {
+ (uint8_t *)FUTRFW8pt7bBitmaps,
+ (GFXglyph *)FUTRFW8pt7bGlyphs,
+ 0x20, 0x7E, 20 };
+const uint8_t nk57_monospace_cd_rg9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x64, 0x92, 0x48, 0x0D, 0xF0, 0x8C, 0x63, 0x18, 0xC4, 0x00,
+ 0x12, 0x09, 0x0C, 0x86, 0x43, 0x23, 0xFC, 0x88, 0x44, 0x26, 0x7F, 0xBF,
+ 0xC4, 0x82, 0x43, 0x21, 0x90, 0x08, 0x08, 0x3E, 0x7F, 0x63, 0x43, 0x40,
+ 0x60, 0x1C, 0x03, 0x01, 0xC1, 0x41, 0x63, 0x7E, 0x18, 0x08, 0x08, 0x20,
+ 0x78, 0x26, 0x11, 0x08, 0x8C, 0xCF, 0xC8, 0x48, 0x18, 0x11, 0x13, 0xD1,
+ 0x30, 0x88, 0x44, 0x26, 0x1E, 0x07, 0x00, 0x3C, 0x1F, 0x18, 0x8C, 0x46,
+ 0x21, 0x30, 0xF0, 0x30, 0x79, 0xA4, 0xB1, 0xD8, 0xCC, 0x63, 0xF8, 0xE6,
+ 0xFC, 0x0C, 0x63, 0x0C, 0x61, 0x84, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C,
+ 0x10, 0x61, 0x83, 0x0C, 0x18, 0x30, 0xC1, 0x82, 0x0C, 0x10, 0x61, 0x82,
+ 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0x86, 0x18, 0x43, 0x08, 0x63, 0x00, 0x10,
+ 0x22, 0x5B, 0xE3, 0x0F, 0xA5, 0x88, 0x10, 0x08, 0x08, 0x08, 0x08, 0xFF,
+ 0xFF, 0x08, 0x08, 0x08, 0xDF, 0xA5, 0x00, 0xFF, 0xF0, 0xDF, 0x00, 0x01,
+ 0x80, 0x80, 0x40, 0x60, 0x20, 0x30, 0x18, 0x08, 0x0C, 0x04, 0x02, 0x03,
+ 0x01, 0x01, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x10, 0x18, 0x00, 0x38, 0xFB,
+ 0x16, 0x28, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1E, 0x3C, 0x4F, 0x8E, 0x00,
+ 0x10, 0x20, 0x47, 0x8F, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F,
+ 0xFF, 0x80, 0x79, 0xFA, 0x1C, 0x30, 0x60, 0xC1, 0x82, 0x0C, 0x10, 0x61,
+ 0x86, 0x1F, 0xFF, 0x80, 0x79, 0xFA, 0x1C, 0x30, 0x60, 0xCF, 0x1E, 0x06,
+ 0x0E, 0x0C, 0x3C, 0x7F, 0x9E, 0x00, 0x02, 0x06, 0x06, 0x0E, 0x1A, 0x12,
+ 0x32, 0x22, 0x62, 0x42, 0xFF, 0xFF, 0x02, 0x02, 0x02, 0x7E, 0xFD, 0x06,
+ 0x0C, 0x1F, 0xBF, 0x43, 0x06, 0x04, 0x0C, 0x38, 0x7F, 0x9E, 0x00, 0x3C,
+ 0xFF, 0x1E, 0x38, 0x17, 0xBF, 0xC3, 0x83, 0x06, 0x0E, 0x3C, 0x6F, 0x9E,
+ 0x00, 0xFF, 0xFC, 0x18, 0x20, 0xC1, 0x82, 0x0C, 0x18, 0x20, 0xC1, 0x83,
+ 0x04, 0x18, 0x00, 0x3C, 0x7E, 0x63, 0x41, 0x41, 0x63, 0x3E, 0x3E, 0x63,
+ 0x41, 0xC1, 0x41, 0x63, 0x7E, 0x3C, 0x3E, 0x7F, 0x63, 0x43, 0xC1, 0xC1,
+ 0x41, 0x43, 0x63, 0x3F, 0x1A, 0x06, 0x04, 0x0C, 0x18, 0xDF, 0x00, 0x37,
+ 0xC0, 0xDF, 0x00, 0x37, 0xE9, 0x40, 0x01, 0x03, 0x0E, 0x18, 0x70, 0xC0,
+ 0xE0, 0x38, 0x1C, 0x07, 0x01, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF,
+ 0xFF, 0x80, 0xE0, 0x30, 0x1C, 0x07, 0x01, 0x03, 0x0E, 0x38, 0x70, 0xC0,
+ 0x80, 0x7D, 0xFE, 0x1C, 0x10, 0x20, 0xC1, 0x86, 0x18, 0x20, 0x40, 0x03,
+ 0x07, 0x0C, 0x00, 0x3E, 0x7F, 0x41, 0x41, 0x4D, 0x4F, 0xD9, 0xD9, 0xD9,
+ 0xC9, 0x4F, 0x45, 0x40, 0x41, 0x7F, 0x3E, 0x18, 0x1C, 0x1C, 0x14, 0x14,
+ 0x34, 0x36, 0x26, 0x22, 0x22, 0x7E, 0x7F, 0x43, 0x43, 0xC1, 0xFD, 0xFE,
+ 0x1C, 0x38, 0x70, 0xFF, 0x7E, 0x87, 0x06, 0x0C, 0x18, 0x7F, 0xFF, 0x00,
+ 0x7D, 0xFF, 0x1E, 0x38, 0x10, 0x20, 0x40, 0x81, 0x02, 0x06, 0x3C, 0x7F,
+ 0x9F, 0x00, 0xF9, 0xFA, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
+ 0x38, 0x7F, 0xBE, 0x00, 0xFF, 0xFE, 0x04, 0x08, 0x10, 0x3F, 0xFF, 0x81,
+ 0x02, 0x04, 0x08, 0x1F, 0xFF, 0x80, 0xFF, 0xFE, 0x04, 0x08, 0x10, 0x20,
+ 0x7F, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7D, 0xFF, 0x1E, 0x38,
+ 0x10, 0x20, 0x47, 0x8F, 0x0E, 0x1E, 0x3C, 0x7F, 0xDC, 0x80, 0x87, 0x0E,
+ 0x1C, 0x38, 0x70, 0xFF, 0xFF, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x80,
+ 0xFF, 0xFC, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x1F,
+ 0xFF, 0x80, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0E, 0x1C,
+ 0x38, 0x7F, 0x9E, 0x00, 0x83, 0x86, 0x84, 0x8C, 0x98, 0x98, 0xB8, 0xAC,
+ 0xEC, 0xC4, 0xC4, 0x86, 0x86, 0x86, 0x83, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x1F, 0xFF, 0x80, 0xC1, 0xC3, 0xE3,
+ 0xE3, 0xF5, 0xD5, 0xDD, 0xD9, 0xC9, 0xC9, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
+ 0xC3, 0x87, 0x0F, 0x1E, 0x34, 0x6C, 0xC9, 0x9B, 0x16, 0x2C, 0x78, 0x70,
+ 0xE0, 0x80, 0x7D, 0xFF, 0x1C, 0x38, 0x70, 0x60, 0xC1, 0x83, 0x06, 0x1C,
+ 0x3C, 0x7F, 0xDF, 0x00, 0xFD, 0xFE, 0x1C, 0x18, 0x30, 0x60, 0xC3, 0xFF,
+ 0xFA, 0x04, 0x08, 0x10, 0x20, 0x00, 0x7D, 0xFF, 0x1C, 0x38, 0x30, 0x60,
+ 0xC1, 0x83, 0x06, 0x0C, 0x3C, 0x7F, 0xDF, 0x04, 0x08, 0x1C, 0x18, 0xFC,
+ 0xFE, 0x86, 0x82, 0x82, 0x82, 0x86, 0xFE, 0xFC, 0x98, 0x88, 0x8C, 0x84,
+ 0x86, 0x83, 0x3E, 0x7F, 0x43, 0xC3, 0x40, 0x60, 0x7C, 0x1E, 0x03, 0x03,
+ 0x01, 0xC3, 0x43, 0x7E, 0x3C, 0xFF, 0xFF, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x87, 0x0E, 0x1C, 0x38,
+ 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x3C, 0x7F, 0xDF, 0x00, 0xC1, 0x43,
+ 0x63, 0x63, 0x62, 0x62, 0x26, 0x26, 0x36, 0x34, 0x14, 0x1C, 0x1C, 0x18,
+ 0x18, 0xC1, 0xE0, 0xF2, 0x79, 0x2D, 0x96, 0xC9, 0x74, 0xAA, 0x55, 0x2A,
+ 0x99, 0xCC, 0xE6, 0x33, 0x19, 0x8C, 0x63, 0x31, 0x8C, 0x86, 0xC1, 0x40,
+ 0xE0, 0x70, 0x38, 0x1C, 0x1A, 0x0D, 0x84, 0xC6, 0x32, 0x1B, 0x06, 0xC1,
+ 0xB1, 0x98, 0xC6, 0xC3, 0x60, 0xE0, 0x70, 0x10, 0x08, 0x04, 0x02, 0x01,
+ 0x00, 0x80, 0x40, 0x20, 0xFF, 0xFC, 0x10, 0x60, 0xC3, 0x06, 0x18, 0x30,
+ 0x41, 0x83, 0x0C, 0x1F, 0xFF, 0x80, 0xFF, 0xE1, 0x08, 0x42, 0x10, 0x84,
+ 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x0F, 0xFC, 0xC0, 0x60, 0x10, 0x0C,
+ 0x06, 0x01, 0x00, 0xC0, 0x20, 0x10, 0x0C, 0x02, 0x01, 0x80, 0xC0, 0x20,
+ 0x18, 0x04, 0x02, 0x01, 0x80, 0x40, 0x30, 0xFF, 0xF0, 0xC3, 0x0C, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0xFF, 0xF0,
+ 0x18, 0x0E, 0x05, 0x06, 0x82, 0x63, 0x11, 0x8D, 0x83, 0xFF, 0xFF, 0xC0,
+ 0xE2, 0x10, 0x79, 0xFB, 0x18, 0x33, 0xFC, 0xE1, 0xC3, 0xFE, 0xEC, 0xC1,
+ 0x83, 0x06, 0x0C, 0x1B, 0xBF, 0x63, 0xC7, 0x8F, 0x1E, 0x3C, 0x7F, 0xF7,
+ 0x00, 0x7D, 0xFF, 0x1E, 0x38, 0x10, 0x30, 0x63, 0xFC, 0xF8, 0x06, 0x0C,
+ 0x18, 0x30, 0x6E, 0xFF, 0xE3, 0x87, 0x0E, 0x1C, 0x3C, 0x7F, 0xDD, 0x80,
+ 0x78, 0xFB, 0x1C, 0x3F, 0xFF, 0xE0, 0x63, 0xFC, 0xF8, 0x1E, 0x3F, 0x21,
+ 0x20, 0x20, 0xFF, 0xFF, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x01, 0x81, 0xC0, 0x87, 0xC7, 0xF3, 0x19, 0x0C, 0xC6, 0x7F, 0x1F, 0x18,
+ 0x0F, 0xC7, 0xF2, 0x0F, 0x07, 0xFE, 0x7F, 0x00, 0xC1, 0x83, 0x06, 0x0C,
+ 0x1B, 0xBF, 0xE3, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0x80, 0x31, 0xC3,
+ 0x00, 0xE3, 0x82, 0x08, 0x20, 0x82, 0x08, 0xFF, 0xF0, 0x0C, 0x30, 0xC0,
+ 0x3C, 0xF0, 0x41, 0x04, 0x10, 0x41, 0x04, 0x18, 0x61, 0xFD, 0xE0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xCC, 0xD8, 0xD8, 0xEC, 0xEC, 0xC4, 0xC6,
+ 0xC6, 0xC3, 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33,
+ 0xFF, 0xC0, 0xF3, 0x7F, 0xB2, 0x79, 0x3C, 0x9E, 0x4F, 0x27, 0x93, 0xC9,
+ 0xE4, 0xC0, 0xDD, 0xFF, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC7, 0x8C, 0x79,
+ 0xFB, 0x1E, 0x38, 0x70, 0xF1, 0xE3, 0xFC, 0xF0, 0xFD, 0xFB, 0x1E, 0x3C,
+ 0x78, 0xF1, 0xE3, 0xFD, 0xBB, 0x06, 0x0C, 0x18, 0x00, 0x77, 0xFF, 0x1C,
+ 0x38, 0x70, 0xE1, 0xE3, 0xFE, 0xEC, 0x18, 0x30, 0x60, 0xC0, 0xDD, 0xFF,
+ 0x8E, 0x1C, 0x18, 0x30, 0x60, 0xC1, 0x80, 0x79, 0xFA, 0x14, 0x07, 0x81,
+ 0xC1, 0xC3, 0xFC, 0xF0, 0x20, 0x20, 0x20, 0xFF, 0xFF, 0x20, 0x20, 0x20,
+ 0x20, 0x21, 0x21, 0x37, 0x1E, 0xC7, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3,
+ 0xFE, 0xEC, 0xC1, 0x43, 0x63, 0x62, 0x26, 0x36, 0x34, 0x1C, 0x1C, 0x18,
+ 0xC1, 0xE0, 0xF2, 0x49, 0x25, 0x92, 0xA9, 0x5C, 0xCE, 0x67, 0x31, 0x00,
+ 0x63, 0x11, 0x0D, 0x83, 0x81, 0x80, 0xE0, 0xD0, 0x4C, 0x63, 0x60, 0xC0,
+ 0xC1, 0x63, 0x62, 0x26, 0x36, 0x3C, 0x1C, 0x18, 0x18, 0x10, 0x30, 0x30,
+ 0x20, 0x60, 0xFF, 0xFC, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xFF, 0xFC, 0x1E,
+ 0x3C, 0xC0, 0x81, 0x02, 0x06, 0x0C, 0x18, 0x33, 0xE7, 0x81, 0x83, 0x06,
+ 0x0C, 0x18, 0x20, 0x41, 0x81, 0xE3, 0xC0, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8,
+ 0x08, 0x08, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x1F, 0x1F, 0x10, 0x10,
+ 0x10, 0x18, 0x18, 0x18, 0x08, 0x08, 0xF8, 0xF8, 0x71, 0xDF, 0x87 };
+
+const GFXglyph nk57_monospace_cd_rg9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 3, 15, 9, 3, -14 }, // 0x21 '!'
+ { 7, 5, 7, 9, 2, -14 }, // 0x22 '"'
+ { 12, 9, 15, 9, 0, -14 }, // 0x23 '#'
+ { 29, 8, 18, 9, 0, -15 }, // 0x24 '$'
+ { 47, 9, 17, 9, 0, -15 }, // 0x25 '%'
+ { 67, 9, 15, 9, 0, -14 }, // 0x26 '&'
+ { 84, 1, 6, 9, 4, -14 }, // 0x27 '''
+ { 85, 6, 22, 9, 2, -17 }, // 0x28 '('
+ { 102, 6, 22, 9, 1, -17 }, // 0x29 ')'
+ { 119, 7, 9, 9, 1, -14 }, // 0x2A '*'
+ { 127, 8, 9, 9, 0, -11 }, // 0x2B '+'
+ { 136, 3, 6, 9, 3, -2 }, // 0x2C ','
+ { 139, 6, 2, 9, 1, -6 }, // 0x2D '-'
+ { 141, 3, 3, 9, 3, -2 }, // 0x2E '.'
+ { 143, 9, 20, 9, 0, -16 }, // 0x2F '/'
+ { 166, 7, 15, 9, 1, -14 }, // 0x30 '0'
+ { 180, 7, 15, 9, 1, -14 }, // 0x31 '1'
+ { 194, 7, 15, 9, 1, -14 }, // 0x32 '2'
+ { 208, 7, 15, 9, 1, -14 }, // 0x33 '3'
+ { 222, 8, 15, 9, 0, -14 }, // 0x34 '4'
+ { 237, 7, 15, 9, 1, -14 }, // 0x35 '5'
+ { 251, 7, 15, 9, 1, -14 }, // 0x36 '6'
+ { 265, 7, 15, 9, 1, -14 }, // 0x37 '7'
+ { 279, 8, 15, 9, 0, -14 }, // 0x38 '8'
+ { 294, 8, 15, 9, 0, -14 }, // 0x39 '9'
+ { 309, 3, 9, 9, 3, -8 }, // 0x3A ':'
+ { 313, 3, 12, 9, 3, -9 }, // 0x3B ';'
+ { 318, 8, 12, 9, 0, -12 }, // 0x3C '<'
+ { 330, 8, 7, 9, 0, -10 }, // 0x3D '='
+ { 337, 8, 12, 9, 0, -12 }, // 0x3E '>'
+ { 349, 7, 15, 9, 1, -14 }, // 0x3F '?'
+ { 363, 8, 16, 9, 0, -12 }, // 0x40 '@'
+ { 379, 8, 15, 9, 0, -14 }, // 0x41 'A'
+ { 394, 7, 15, 9, 1, -14 }, // 0x42 'B'
+ { 408, 7, 15, 9, 1, -14 }, // 0x43 'C'
+ { 422, 7, 15, 9, 1, -14 }, // 0x44 'D'
+ { 436, 7, 15, 9, 1, -14 }, // 0x45 'E'
+ { 450, 7, 15, 9, 1, -14 }, // 0x46 'F'
+ { 464, 7, 15, 9, 1, -14 }, // 0x47 'G'
+ { 478, 7, 15, 9, 1, -14 }, // 0x48 'H'
+ { 492, 7, 15, 9, 1, -14 }, // 0x49 'I'
+ { 506, 7, 15, 9, 1, -14 }, // 0x4A 'J'
+ { 520, 8, 15, 9, 1, -14 }, // 0x4B 'K'
+ { 535, 7, 15, 9, 1, -14 }, // 0x4C 'L'
+ { 549, 8, 15, 9, 0, -14 }, // 0x4D 'M'
+ { 564, 7, 15, 9, 1, -14 }, // 0x4E 'N'
+ { 578, 7, 15, 9, 1, -14 }, // 0x4F 'O'
+ { 592, 7, 15, 9, 1, -14 }, // 0x50 'P'
+ { 606, 7, 19, 9, 1, -14 }, // 0x51 'Q'
+ { 623, 8, 15, 9, 1, -14 }, // 0x52 'R'
+ { 638, 8, 15, 9, 0, -14 }, // 0x53 'S'
+ { 653, 8, 15, 9, 0, -14 }, // 0x54 'T'
+ { 668, 7, 15, 9, 1, -14 }, // 0x55 'U'
+ { 682, 8, 15, 9, 0, -14 }, // 0x56 'V'
+ { 697, 9, 15, 9, 0, -14 }, // 0x57 'W'
+ { 714, 9, 15, 9, 0, -14 }, // 0x58 'X'
+ { 731, 9, 15, 9, 0, -14 }, // 0x59 'Y'
+ { 748, 7, 15, 9, 1, -14 }, // 0x5A 'Z'
+ { 762, 5, 22, 9, 3, -17 }, // 0x5B '['
+ { 776, 9, 20, 9, 0, -16 }, // 0x5C '\'
+ { 799, 6, 22, 9, 0, -17 }, // 0x5D ']'
+ { 816, 9, 8, 9, 0, -14 }, // 0x5E '^'
+ { 825, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 828, 4, 3, 9, 2, -13 }, // 0x60 '`'
+ { 830, 7, 10, 9, 1, -9 }, // 0x61 'a'
+ { 839, 7, 15, 9, 1, -14 }, // 0x62 'b'
+ { 853, 7, 10, 9, 1, -9 }, // 0x63 'c'
+ { 862, 7, 15, 9, 1, -14 }, // 0x64 'd'
+ { 876, 7, 10, 9, 1, -9 }, // 0x65 'e'
+ { 885, 8, 15, 9, 0, -14 }, // 0x66 'f'
+ { 900, 9, 17, 9, 0, -12 }, // 0x67 'g'
+ { 920, 7, 15, 9, 1, -14 }, // 0x68 'h'
+ { 934, 6, 14, 9, 2, -13 }, // 0x69 'i'
+ { 945, 6, 18, 9, 1, -13 }, // 0x6A 'j'
+ { 959, 8, 15, 9, 1, -14 }, // 0x6B 'k'
+ { 974, 6, 15, 9, 2, -14 }, // 0x6C 'l'
+ { 986, 9, 10, 9, 0, -9 }, // 0x6D 'm'
+ { 998, 7, 10, 9, 1, -9 }, // 0x6E 'n'
+ { 1007, 7, 10, 9, 1, -9 }, // 0x6F 'o'
+ { 1016, 7, 14, 9, 1, -9 }, // 0x70 'p'
+ { 1029, 7, 14, 9, 1, -9 }, // 0x71 'q'
+ { 1042, 7, 10, 9, 1, -9 }, // 0x72 'r'
+ { 1051, 7, 10, 9, 1, -9 }, // 0x73 's'
+ { 1060, 8, 13, 9, 0, -12 }, // 0x74 't'
+ { 1073, 7, 10, 9, 1, -9 }, // 0x75 'u'
+ { 1082, 8, 10, 9, 0, -9 }, // 0x76 'v'
+ { 1092, 9, 10, 9, 0, -9 }, // 0x77 'w'
+ { 1104, 9, 10, 9, 0, -9 }, // 0x78 'x'
+ { 1116, 8, 14, 9, 0, -9 }, // 0x79 'y'
+ { 1130, 7, 10, 9, 1, -9 }, // 0x7A 'z'
+ { 1139, 7, 22, 9, 1, -17 }, // 0x7B '{'
+ { 1159, 1, 22, 9, 4, -17 }, // 0x7C '|'
+ { 1162, 8, 22, 9, 0, -17 }, // 0x7D '}'
+ { 1184, 8, 3, 9, 0, -8 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_cd_rg9pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_cd_rg9pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_cd_rg9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 1859 bytes
+
+const uint8_t nk57_monospace_no_rg9pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xDB, 0x6D, 0xB6, 0xD8, 0x0D, 0xF0, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
+ 0xC3, 0x00, 0x08, 0x40, 0x84, 0x08, 0xC1, 0x8C, 0x18, 0xC7, 0xFF, 0x18,
+ 0x81, 0x08, 0x10, 0x8F, 0xFE, 0xFF, 0xE3, 0x18, 0x31, 0x83, 0x18, 0x21,
+ 0x00, 0x0C, 0x01, 0x80, 0xFE, 0x7F, 0xEC, 0x0D, 0x81, 0xB0, 0x07, 0x00,
+ 0x3F, 0x00, 0x78, 0x03, 0x00, 0x3C, 0x05, 0x81, 0xBF, 0xF1, 0xF8, 0x0C,
+ 0x01, 0x80, 0x18, 0x07, 0xE0, 0x62, 0x04, 0x20, 0x42, 0x16, 0x23, 0x7E,
+ 0xC1, 0xB0, 0x06, 0x01, 0x98, 0x67, 0xE8, 0x62, 0x04, 0x20, 0x42, 0x04,
+ 0x20, 0x7E, 0x03, 0xC0, 0x1F, 0x03, 0xFC, 0x30, 0xC2, 0x0C, 0x20, 0xC3,
+ 0x18, 0x1F, 0x00, 0xE0, 0x36, 0x36, 0x22, 0xC1, 0x6C, 0x1C, 0xE0, 0xC7,
+ 0xFE, 0x3E, 0x30, 0xFF, 0xF0, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x60, 0x60,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30,
+ 0x18, 0x0C, 0x07, 0xE0, 0x30, 0x18, 0x0C, 0x0E, 0x06, 0x07, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x18, 0x30,
+ 0xE0, 0x0C, 0x03, 0x04, 0xCB, 0xFF, 0x1E, 0x07, 0x8F, 0x7D, 0x32, 0x0C,
+ 0x03, 0x00, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x0F, 0xFF, 0xFF, 0xC3, 0x00,
+ 0x60, 0x0C, 0x00, 0xDF, 0xAD, 0x00, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x30,
+ 0x03, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x10, 0x03, 0x00,
+ 0x20, 0x06, 0x00, 0x40, 0x0C, 0x01, 0x80, 0x18, 0x03, 0x00, 0x30, 0x06,
+ 0x00, 0x60, 0x0C, 0x00, 0x1E, 0x0F, 0xC6, 0x1B, 0x06, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x06, 0x61, 0x8F, 0xC1, 0xE0, 0x04,
+ 0x03, 0x00, 0xC1, 0xF0, 0x7C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x3F, 0x3F, 0xEC, 0x0F, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x06, 0x03, 0x81, 0xC0, 0xE0, 0x60, 0x30, 0x3F, 0xFF,
+ 0xFC, 0x3F, 0x3F, 0xEC, 0x0F, 0x03, 0x00, 0xC0, 0x31, 0xF8, 0x7E, 0x00,
+ 0xC0, 0x3C, 0x0F, 0x03, 0xC0, 0xDF, 0xE3, 0xF0, 0x01, 0x80, 0x70, 0x0E,
+ 0x03, 0xC0, 0xD8, 0x33, 0x0C, 0x61, 0x0C, 0x61, 0x98, 0x33, 0xFF, 0xFF,
+ 0xF0, 0x18, 0x03, 0x00, 0x60, 0x7F, 0xDF, 0xF6, 0x01, 0x80, 0x60, 0x17,
+ 0xC7, 0xFB, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0x03, 0xC0, 0xDF, 0xE3, 0xF0,
+ 0x1F, 0x8F, 0xF6, 0x0D, 0x03, 0xC0, 0x37, 0xCF, 0xFF, 0x03, 0xC0, 0xF0,
+ 0x1C, 0x07, 0x03, 0x60, 0xDF, 0xE3, 0xF0, 0xFF, 0xFF, 0xF0, 0x0C, 0x06,
+ 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x06,
+ 0x03, 0x00, 0x3F, 0x1F, 0xEC, 0x0F, 0x03, 0xC0, 0xF0, 0x37, 0xF9, 0xFE,
+ 0xE1, 0xF0, 0x3C, 0x07, 0x03, 0xC0, 0xDF, 0xE3, 0xF0, 0x3F, 0x1F, 0xEC,
+ 0x0F, 0x03, 0xC0, 0x70, 0x1C, 0x0F, 0x03, 0xE1, 0xDF, 0xF1, 0x98, 0x0C,
+ 0x03, 0x01, 0x81, 0xC0, 0xDF, 0x00, 0x37, 0xC0, 0xDF, 0x00, 0x37, 0xEB,
+ 0x40, 0x00, 0x60, 0x3C, 0x1E, 0x0E, 0x0F, 0x01, 0x80, 0x38, 0x01, 0xC0,
+ 0x0F, 0x00, 0x78, 0x03, 0x80, 0x10, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00,
+ 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x1C, 0x01, 0xE0, 0x07, 0x00, 0x3C, 0x01,
+ 0xC0, 0x78, 0x38, 0x3C, 0x1E, 0x03, 0x00, 0x40, 0x00, 0x3F, 0x3F, 0xFC,
+ 0x0F, 0x03, 0x00, 0xC0, 0x30, 0x1C, 0x0C, 0x06, 0x03, 0x00, 0xC0, 0x00,
+ 0x0C, 0x03, 0x80, 0xC0, 0x3F, 0x0F, 0xFB, 0x03, 0x60, 0x28, 0x75, 0x1F,
+ 0xA2, 0x14, 0x42, 0x88, 0x51, 0x8A, 0x3F, 0x43, 0x2C, 0x01, 0x80, 0x5F,
+ 0xF9, 0xFC, 0x06, 0x00, 0x70, 0x0F, 0x00, 0xF0, 0x0D, 0x81, 0x98, 0x19,
+ 0x81, 0x88, 0x30, 0xC3, 0x0C, 0x3F, 0xC3, 0xFE, 0x60, 0x66, 0x06, 0xC0,
+ 0x30, 0xFF, 0x1F, 0xFB, 0x03, 0x60, 0x6C, 0x0D, 0x81, 0xBF, 0xE7, 0xFC,
+ 0xC0, 0xD8, 0x1B, 0x01, 0xE0, 0x3C, 0x0D, 0xFF, 0xBF, 0xE0, 0x3F, 0x9F,
+ 0xFE, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x03, 0xE0, 0xDF, 0xE3, 0xF0, 0xFF, 0x3F, 0xEC, 0x1F, 0x03, 0xC0, 0xF0,
+ 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC1, 0xFF, 0xEF, 0xF0,
+ 0xFF, 0xFF, 0xFC, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0xFF, 0xFF, 0xC0, 0x30,
+ 0x0C, 0x03, 0x00, 0xC0, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFC, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0xFF, 0xFF, 0xF0, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0x0C, 0x00, 0x3F, 0x9F, 0xFE, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x03, 0x1F,
+ 0xC7, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xDF, 0xD3, 0xE4, 0xC0, 0xF0, 0x3C,
+ 0x0F, 0x03, 0xC0, 0xF0, 0x3F, 0xFF, 0xFF, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0C, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x00,
+ 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x3C,
+ 0x0F, 0x03, 0xC1, 0xDF, 0xE3, 0xF0, 0xC0, 0xF8, 0x1B, 0x06, 0x61, 0x8C,
+ 0x61, 0x9C, 0x33, 0xC6, 0xD8, 0xF3, 0x9C, 0x33, 0x06, 0x60, 0x6C, 0x0D,
+ 0x81, 0xB0, 0x18, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x3F, 0xFF, 0xFC, 0xC0, 0x78,
+ 0x1F, 0x83, 0xD0, 0xFB, 0x37, 0x26, 0xE7, 0x9C, 0x73, 0x8C, 0x70, 0x8E,
+ 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x18, 0xC0, 0xF8, 0x3E, 0x0F, 0xC3,
+ 0xF8, 0xF6, 0x3C, 0xCF, 0x33, 0xC6, 0xF1, 0xBC, 0x3F, 0x07, 0xC1, 0xF0,
+ 0x3C, 0x0C, 0x3F, 0x9F, 0xFC, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xDF, 0xF3, 0xF8, 0xFF, 0x9F, 0xFB,
+ 0x03, 0x60, 0x6C, 0x07, 0x80, 0xF0, 0x36, 0x06, 0xFF, 0xDF, 0xF3, 0x00,
+ 0x60, 0x0C, 0x01, 0x80, 0x30, 0x00, 0x3F, 0x0F, 0xF3, 0x03, 0x60, 0x6C,
+ 0x0D, 0x81, 0xB0, 0x36, 0x06, 0xC0, 0xD8, 0x1B, 0x03, 0x60, 0x6C, 0x0C,
+ 0xFF, 0x8F, 0xC0, 0x10, 0x02, 0x00, 0x7C, 0x07, 0x80, 0xFF, 0x9F, 0xFB,
+ 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x37, 0xFE, 0xFF, 0x98, 0xC3, 0x0C,
+ 0x61, 0xCC, 0x19, 0x81, 0xB0, 0x38, 0x3F, 0x9F, 0xFC, 0x0F, 0x03, 0xC0,
+ 0x38, 0x07, 0xE0, 0x7E, 0x01, 0xC0, 0x30, 0x0F, 0x03, 0xC0, 0xFF, 0xE3,
+ 0xF0, 0xFF, 0xFF, 0xFC, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60,
+ 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, 0xF0,
+ 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xDF, 0xF3, 0xF8, 0xE0, 0x36, 0x06, 0x60, 0x63, 0x06, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC1, 0x88, 0x19, 0x81, 0x98, 0x0D, 0x00, 0xF0, 0x0F,
+ 0x00, 0x70, 0x06, 0x00, 0xC0, 0x3C, 0x03, 0xC6, 0x3C, 0x63, 0x46, 0x34,
+ 0x73, 0x6F, 0x26, 0x92, 0x69, 0x66, 0x9E, 0x79, 0xE7, 0x0E, 0x30, 0xE3,
+ 0x0E, 0x30, 0xC0, 0x70, 0x73, 0x06, 0x38, 0xC1, 0x9C, 0x0D, 0x80, 0xF0,
+ 0x07, 0x00, 0x70, 0x0F, 0x01, 0xD8, 0x19, 0x83, 0x0C, 0x30, 0xE6, 0x06,
+ 0xE0, 0x70, 0xE0, 0x36, 0x06, 0x30, 0xC1, 0x8C, 0x19, 0x80, 0xF0, 0x07,
+ 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06,
+ 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0E, 0x03, 0x01, 0x80, 0x60, 0x30, 0x1C,
+ 0x06, 0x03, 0x01, 0xC0, 0x60, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0x04, 0x00, 0x60, 0x02, 0x00,
+ 0x30, 0x01, 0x00, 0x18, 0x00, 0xC0, 0x0C, 0x00, 0x60, 0x06, 0x00, 0x30,
+ 0x03, 0x00, 0x18, 0x01, 0x80, 0x0C, 0x00, 0x40, 0x06, 0x00, 0x20, 0x03,
+ 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0x06, 0x00,
+ 0xF0, 0x0D, 0x01, 0x98, 0x18, 0xC3, 0x0C, 0x60, 0x6E, 0x07, 0xFF, 0xFF,
+ 0xFF, 0xE0, 0xC0, 0xC0, 0x3F, 0x0F, 0xF1, 0x02, 0x00, 0x61, 0xFC, 0xF1,
+ 0xB0, 0x36, 0x0E, 0xFF, 0xEF, 0x9C, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0,
+ 0x33, 0xCF, 0xFB, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE0, 0xFF, 0xEC,
+ 0xF0, 0x3F, 0x1F, 0xF6, 0x0F, 0x03, 0xC0, 0x30, 0x0C, 0x01, 0x83, 0x7F,
+ 0x8F, 0xC0, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xCF, 0x37, 0xFF, 0x87,
+ 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xDF, 0xF3, 0xEC, 0x3F, 0x1F, 0xE6,
+ 0x0F, 0x03, 0xFF, 0xFF, 0xFC, 0x01, 0x83, 0x7F, 0x8F, 0xC0, 0x0F, 0xC3,
+ 0xFC, 0xC1, 0x98, 0x03, 0x01, 0xFF, 0xFF, 0xF9, 0x80, 0x30, 0x06, 0x00,
+ 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x70, 0x0F, 0x00, 0x81,
+ 0xF8, 0x3F, 0xC6, 0x06, 0x60, 0x66, 0x06, 0x3F, 0xE1, 0xF8, 0x30, 0x07,
+ 0xFC, 0x7F, 0xF4, 0x03, 0xC0, 0x3F, 0xFF, 0x7F, 0xE0, 0xC0, 0x30, 0x0C,
+ 0x03, 0x00, 0xC0, 0x33, 0xEF, 0xFB, 0x83, 0xC0, 0xF0, 0x3C, 0x0F, 0x03,
+ 0xC0, 0xF0, 0x3C, 0x0C, 0x1C, 0x0E, 0x07, 0x00, 0x0F, 0x87, 0xC0, 0x60,
+ 0x30, 0x18, 0x0C, 0x06, 0x03, 0x0F, 0xFF, 0xFC, 0x01, 0x81, 0xC0, 0x60,
+ 0x01, 0xF8, 0xFC, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F,
+ 0x07, 0x83, 0x7F, 0x9F, 0x80, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01,
+ 0x81, 0xF0, 0x66, 0x38, 0xCF, 0x1B, 0x63, 0xC6, 0x60, 0xCC, 0x0D, 0x81,
+ 0xB0, 0x18, 0xFC, 0x7E, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C,
+ 0x06, 0x03, 0x01, 0x80, 0xC7, 0xFF, 0xFE, 0xDC, 0xEF, 0xFF, 0xC6, 0x3C,
+ 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xCF, 0xBF,
+ 0xEE, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x30, 0x3F,
+ 0x1F, 0xE6, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x83, 0x7F, 0x8F, 0xC0,
+ 0xCF, 0x3F, 0xEE, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x83, 0xDF, 0xB3,
+ 0xEC, 0x03, 0x00, 0xC0, 0x30, 0x00, 0x3C, 0xDF, 0xFE, 0x1F, 0x03, 0xC0,
+ 0xF0, 0x3C, 0x0F, 0x87, 0x7F, 0xCF, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0xC7, 0xB7, 0xFF, 0x07, 0x81, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30,
+ 0x00, 0x3F, 0x1F, 0xEC, 0x0B, 0x00, 0x7F, 0x00, 0xE0, 0x0F, 0x03, 0x73,
+ 0x8F, 0xC0, 0x30, 0x06, 0x00, 0xC0, 0x7F, 0xFF, 0xFE, 0x60, 0x0C, 0x01,
+ 0x80, 0x30, 0x06, 0x0C, 0xC1, 0x8F, 0xF0, 0xFC, 0xC0, 0xF0, 0x3C, 0x0F,
+ 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0x7F, 0xCF, 0x30, 0xE0, 0x36, 0x06,
+ 0x30, 0x63, 0x0C, 0x10, 0xC1, 0x98, 0x19, 0x80, 0xF0, 0x0F, 0x00, 0x60,
+ 0xC0, 0x3C, 0x63, 0x46, 0x34, 0x62, 0x6F, 0x66, 0x96, 0x69, 0x63, 0x9E,
+ 0x30, 0xC3, 0x0C, 0x70, 0x73, 0x8C, 0x19, 0x80, 0xF0, 0x07, 0x00, 0xF0,
+ 0x19, 0x83, 0x8C, 0x70, 0xEE, 0x07, 0xE0, 0x76, 0x06, 0x30, 0xC3, 0x0C,
+ 0x19, 0x81, 0xB0, 0x0F, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x18, 0x01, 0x80,
+ 0x30, 0x07, 0x00, 0xFF, 0xFF, 0xF0, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81,
+ 0xC0, 0xFF, 0xFF, 0xF0, 0x07, 0xE1, 0xFC, 0x30, 0x06, 0x00, 0xC0, 0x18,
+ 0x01, 0x80, 0x30, 0x06, 0x00, 0xC3, 0xF8, 0x7F, 0x00, 0x60, 0x0C, 0x01,
+ 0x80, 0x30, 0x06, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFE, 0x0F, 0xC0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF8, 0x3F, 0x00, 0xC0, 0x30, 0x0C, 0x03,
+ 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xFC, 0x3F, 0x18, 0x06, 0x01, 0x80,
+ 0x60, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xFC, 0x3E, 0x00, 0x78, 0x3B, 0xFE,
+ 0x1E, 0x00 };
+
+const GFXglyph nk57_monospace_no_rg9pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 12, 0, 0 }, // 0x20 ' '
+ { 1, 3, 15, 12, 5, -14 }, // 0x21 '!'
+ { 7, 8, 7, 12, 2, -14 }, // 0x22 '"'
+ { 14, 12, 15, 12, 0, -14 }, // 0x23 '#'
+ { 37, 11, 18, 12, 1, -15 }, // 0x24 '$'
+ { 62, 12, 17, 12, 0, -15 }, // 0x25 '%'
+ { 88, 12, 15, 12, 0, -14 }, // 0x26 '&'
+ { 111, 2, 6, 12, 5, -14 }, // 0x27 '''
+ { 113, 8, 22, 12, 3, -17 }, // 0x28 '('
+ { 135, 8, 22, 12, 1, -17 }, // 0x29 ')'
+ { 157, 10, 10, 12, 1, -14 }, // 0x2A '*'
+ { 170, 11, 9, 12, 1, -11 }, // 0x2B '+'
+ { 183, 3, 6, 12, 5, -2 }, // 0x2C ','
+ { 186, 8, 2, 12, 2, -6 }, // 0x2D '-'
+ { 188, 3, 3, 12, 5, -2 }, // 0x2E '.'
+ { 190, 12, 20, 12, 0, -16 }, // 0x2F '/'
+ { 220, 10, 15, 12, 1, -14 }, // 0x30 '0'
+ { 239, 10, 15, 12, 1, -14 }, // 0x31 '1'
+ { 258, 10, 15, 12, 1, -14 }, // 0x32 '2'
+ { 277, 10, 15, 12, 1, -14 }, // 0x33 '3'
+ { 296, 11, 15, 12, 1, -14 }, // 0x34 '4'
+ { 317, 10, 15, 12, 1, -14 }, // 0x35 '5'
+ { 336, 10, 15, 12, 1, -14 }, // 0x36 '6'
+ { 355, 10, 15, 12, 1, -14 }, // 0x37 '7'
+ { 374, 10, 15, 12, 1, -14 }, // 0x38 '8'
+ { 393, 10, 15, 12, 1, -14 }, // 0x39 '9'
+ { 412, 3, 9, 12, 5, -8 }, // 0x3A ':'
+ { 416, 3, 12, 12, 5, -9 }, // 0x3B ';'
+ { 421, 11, 12, 12, 1, -12 }, // 0x3C '<'
+ { 438, 11, 7, 12, 1, -10 }, // 0x3D '='
+ { 448, 11, 12, 12, 1, -12 }, // 0x3E '>'
+ { 465, 10, 15, 12, 1, -14 }, // 0x3F '?'
+ { 484, 11, 16, 12, 1, -12 }, // 0x40 '@'
+ { 506, 12, 15, 12, 0, -14 }, // 0x41 'A'
+ { 529, 11, 15, 12, 1, -14 }, // 0x42 'B'
+ { 550, 10, 15, 12, 1, -14 }, // 0x43 'C'
+ { 569, 10, 15, 12, 1, -14 }, // 0x44 'D'
+ { 588, 10, 15, 12, 1, -14 }, // 0x45 'E'
+ { 607, 10, 15, 12, 1, -14 }, // 0x46 'F'
+ { 626, 10, 15, 12, 1, -14 }, // 0x47 'G'
+ { 645, 10, 15, 12, 1, -14 }, // 0x48 'H'
+ { 664, 10, 15, 12, 1, -14 }, // 0x49 'I'
+ { 683, 10, 15, 12, 1, -14 }, // 0x4A 'J'
+ { 702, 11, 15, 12, 1, -14 }, // 0x4B 'K'
+ { 723, 10, 15, 12, 1, -14 }, // 0x4C 'L'
+ { 742, 11, 15, 12, 1, -14 }, // 0x4D 'M'
+ { 763, 10, 15, 12, 1, -14 }, // 0x4E 'N'
+ { 782, 10, 15, 12, 1, -14 }, // 0x4F 'O'
+ { 801, 11, 15, 12, 1, -14 }, // 0x50 'P'
+ { 822, 11, 19, 12, 1, -14 }, // 0x51 'Q'
+ { 849, 11, 15, 12, 1, -14 }, // 0x52 'R'
+ { 870, 10, 15, 12, 1, -14 }, // 0x53 'S'
+ { 889, 11, 15, 12, 1, -14 }, // 0x54 'T'
+ { 910, 10, 15, 12, 1, -14 }, // 0x55 'U'
+ { 929, 12, 15, 12, 0, -14 }, // 0x56 'V'
+ { 952, 12, 15, 12, 0, -14 }, // 0x57 'W'
+ { 975, 12, 15, 12, 0, -14 }, // 0x58 'X'
+ { 998, 12, 15, 12, 0, -14 }, // 0x59 'Y'
+ { 1021, 10, 15, 12, 1, -14 }, // 0x5A 'Z'
+ { 1040, 8, 22, 12, 4, -17 }, // 0x5B '['
+ { 1062, 12, 20, 12, 0, -16 }, // 0x5C '\'
+ { 1092, 8, 22, 12, 1, -17 }, // 0x5D ']'
+ { 1114, 12, 8, 12, 0, -14 }, // 0x5E '^'
+ { 1126, 12, 2, 12, 0, 2 }, // 0x5F '_'
+ { 1129, 6, 3, 12, 3, -13 }, // 0x60 '`'
+ { 1132, 11, 10, 12, 1, -9 }, // 0x61 'a'
+ { 1146, 10, 15, 12, 1, -14 }, // 0x62 'b'
+ { 1165, 10, 10, 12, 1, -9 }, // 0x63 'c'
+ { 1178, 10, 15, 12, 1, -14 }, // 0x64 'd'
+ { 1197, 10, 10, 12, 1, -9 }, // 0x65 'e'
+ { 1210, 11, 15, 12, 0, -14 }, // 0x66 'f'
+ { 1231, 12, 17, 12, 0, -12 }, // 0x67 'g'
+ { 1257, 10, 15, 12, 1, -14 }, // 0x68 'h'
+ { 1276, 9, 14, 12, 2, -13 }, // 0x69 'i'
+ { 1292, 9, 18, 12, 1, -13 }, // 0x6A 'j'
+ { 1313, 11, 15, 12, 1, -14 }, // 0x6B 'k'
+ { 1334, 9, 15, 12, 2, -14 }, // 0x6C 'l'
+ { 1351, 12, 10, 12, 0, -9 }, // 0x6D 'm'
+ { 1366, 10, 10, 12, 1, -9 }, // 0x6E 'n'
+ { 1379, 10, 10, 12, 1, -9 }, // 0x6F 'o'
+ { 1392, 10, 14, 12, 1, -9 }, // 0x70 'p'
+ { 1410, 10, 14, 12, 1, -9 }, // 0x71 'q'
+ { 1428, 10, 10, 12, 1, -9 }, // 0x72 'r'
+ { 1441, 10, 10, 12, 1, -9 }, // 0x73 's'
+ { 1454, 11, 13, 12, 0, -12 }, // 0x74 't'
+ { 1472, 10, 10, 12, 1, -9 }, // 0x75 'u'
+ { 1485, 12, 10, 12, 0, -9 }, // 0x76 'v'
+ { 1500, 12, 10, 12, 0, -9 }, // 0x77 'w'
+ { 1515, 12, 10, 12, 0, -9 }, // 0x78 'x'
+ { 1530, 12, 14, 12, 0, -9 }, // 0x79 'y'
+ { 1551, 10, 10, 12, 1, -9 }, // 0x7A 'z'
+ { 1564, 11, 22, 12, 1, -17 }, // 0x7B '{'
+ { 1595, 2, 22, 12, 5, -17 }, // 0x7C '|'
+ { 1601, 10, 22, 12, 1, -17 }, // 0x7D '}'
+ { 1629, 11, 3, 12, 1, -8 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_rg9pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_rg9pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_rg9pt7bGlyphs,
+ 0x20, 0x7E, 21 };
+
+// Approx. 2306 bytes
+const uint8_t nk57_monospace_no_rg7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0xEA, 0x3F, 0xCE, 0x28, 0xA2, 0x88, 0x00, 0x11, 0x08, 0x84,
+ 0x42, 0x67, 0xF9, 0x90, 0x89, 0xFF, 0x22, 0x11, 0x09, 0x8C, 0xC0, 0x10,
+ 0x10, 0x7E, 0xC3, 0x83, 0x80, 0xE0, 0x3C, 0x03, 0x03, 0x83, 0xC3, 0x7E,
+ 0x10, 0x10, 0x78, 0x64, 0x22, 0x11, 0x17, 0x88, 0x18, 0x30, 0x20, 0x67,
+ 0x46, 0x42, 0x21, 0x10, 0xC8, 0x3C, 0x3E, 0x31, 0x98, 0xCC, 0x62, 0x60,
+ 0xC0, 0xE2, 0x9B, 0xC7, 0x61, 0x99, 0xC7, 0x90, 0xEA, 0x80, 0x0E, 0x30,
+ 0xC1, 0x06, 0x08, 0x30, 0x60, 0xC1, 0x83, 0x02, 0x06, 0x04, 0x0C, 0x0C,
+ 0x0E, 0xC0, 0x81, 0x06, 0x08, 0x30, 0xC1, 0x04, 0x10, 0xC3, 0x08, 0x61,
+ 0x08, 0xC0, 0x11, 0x27, 0x59, 0xE3, 0x9A, 0xE4, 0x88, 0x08, 0x04, 0x02,
+ 0x1F, 0xF0, 0x80, 0x40, 0x20, 0xFE, 0xFC, 0xFC, 0x00, 0x80, 0x40, 0x40,
+ 0x20, 0x20, 0x30, 0x10, 0x18, 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01,
+ 0x01, 0x80, 0x38, 0x66, 0xC6, 0x82, 0x83, 0x83, 0x83, 0x83, 0x82, 0xC6,
+ 0x66, 0x3C, 0x18, 0x30, 0x67, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x67,
+ 0xF0, 0x7C, 0xC6, 0x83, 0x03, 0x03, 0x02, 0x06, 0x0C, 0x18, 0x30, 0xC0,
+ 0xFF, 0x7C, 0xC6, 0x83, 0x03, 0x02, 0x3C, 0x02, 0x03, 0x83, 0x83, 0xC6,
+ 0x7C, 0x03, 0x03, 0x81, 0xC1, 0x61, 0xB1, 0x98, 0x8C, 0x86, 0xFF, 0x81,
+ 0x80, 0xC0, 0x60, 0x7E, 0x40, 0x40, 0xC0, 0xFC, 0xC6, 0x03, 0x03, 0x83,
+ 0x83, 0xC6, 0x7C, 0x3E, 0x63, 0xC3, 0x80, 0xBC, 0xE6, 0x83, 0x83, 0x83,
+ 0xC3, 0x66, 0x7C, 0xFF, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10,
+ 0x30, 0x30, 0x60, 0x7C, 0xC6, 0x83, 0x83, 0xC2, 0x7C, 0xC6, 0x83, 0x83,
+ 0x83, 0xC6, 0x7C, 0x7C, 0xC6, 0x83, 0x83, 0x83, 0x83, 0xC3, 0x7E, 0x06,
+ 0x0C, 0x08, 0x30, 0xFC, 0x0F, 0xC0, 0xFC, 0x03, 0xF8, 0x01, 0x83, 0x87,
+ 0x0C, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x00,
+ 0x0F, 0xF8, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x18, 0x38, 0xE1, 0xC0, 0x80,
+ 0x00, 0x7E, 0xC7, 0x83, 0x03, 0x03, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x18,
+ 0x18, 0x3F, 0x30, 0x90, 0x29, 0xD4, 0x9A, 0x47, 0x22, 0x93, 0x4F, 0xA0,
+ 0x10, 0x0C, 0x13, 0xF8, 0x0C, 0x06, 0x07, 0x02, 0xC1, 0x61, 0x90, 0xCC,
+ 0x46, 0x63, 0x3F, 0x90, 0x78, 0x30, 0xFE, 0x86, 0x83, 0x83, 0x82, 0xFC,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xFE, 0x7E, 0xC3, 0xC3, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x83, 0xC3, 0xC6, 0x7C, 0xFC, 0x86, 0x82, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x82, 0x86, 0xFC, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0xFF,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7E, 0xC3, 0xC3, 0x80, 0x80, 0x8F,
+ 0x83, 0x83, 0x83, 0xC3, 0xC7, 0x79, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFF,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFE, 0x30, 0x60, 0xC1, 0x83, 0x06,
+ 0x0C, 0x18, 0x30, 0x67, 0xF0, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x03, 0x83, 0x82, 0xC6, 0x7C, 0x83, 0x86, 0x84, 0x8C, 0x9C, 0xBC, 0xA4,
+ 0xC6, 0xC6, 0x82, 0x83, 0x83, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xC1, 0xF0, 0xF8, 0xFE, 0x5D, 0x6E, 0xE7,
+ 0x33, 0x91, 0xC0, 0xE0, 0x70, 0x38, 0x10, 0xC3, 0xC3, 0xE3, 0xA3, 0xB3,
+ 0x93, 0x9B, 0x8B, 0x87, 0x87, 0x83, 0x83, 0x7E, 0xC6, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xC6, 0x7E, 0xFE, 0x87, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0xFE, 0x80, 0x80, 0x80, 0x80, 0x7C, 0xC6, 0x83, 0x83, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0xC6, 0x7E, 0x08, 0x0C, 0x07, 0xFE, 0x83,
+ 0x83, 0x83, 0x83, 0x83, 0xFE, 0x88, 0x8C, 0x86, 0x82, 0x83, 0x3F, 0x31,
+ 0xD0, 0x68, 0x06, 0x01, 0xF0, 0x1C, 0x03, 0xC1, 0xA0, 0xD8, 0xC7, 0xC0,
+ 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xC3, 0xC6, 0x7E,
+ 0xC1, 0xA0, 0xD8, 0x4C, 0x22, 0x31, 0x10, 0xC8, 0x2C, 0x16, 0x0E, 0x03,
+ 0x01, 0x80, 0xC0, 0xE4, 0x72, 0x39, 0x94, 0xCA, 0xAD, 0x56, 0xA7, 0x53,
+ 0x31, 0x98, 0xCC, 0x20, 0x61, 0x91, 0x8C, 0xC2, 0xC1, 0xC0, 0x60, 0x70,
+ 0x2C, 0x32, 0x11, 0x98, 0x78, 0x30, 0xC1, 0xB0, 0x88, 0xC6, 0xC1, 0xC0,
+ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xFE, 0x04, 0x18, 0x60,
+ 0xC3, 0x04, 0x18, 0x60, 0xC3, 0x07, 0xF0, 0xFE, 0x08, 0x20, 0x82, 0x08,
+ 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0xFC, 0x80, 0x20, 0x10, 0x04,
+ 0x03, 0x00, 0x80, 0x60, 0x10, 0x0C, 0x02, 0x01, 0x80, 0x40, 0x30, 0x08,
+ 0x06, 0x01, 0xFE, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x30, 0x60, 0xC1, 0x83, 0xFE, 0x0C, 0x0E, 0x05, 0x86, 0x42, 0x33, 0x0B,
+ 0x06, 0xFF, 0x80, 0xC3, 0x7C, 0xC6, 0xC2, 0x1E, 0xE2, 0x82, 0xCE, 0x7B,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xDE, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xDE,
+ 0x7D, 0x8F, 0x0C, 0x08, 0x18, 0x71, 0xBE, 0x02, 0x04, 0x08, 0x17, 0xB8,
+ 0xF0, 0xC1, 0x83, 0x87, 0x1B, 0xD0, 0x7D, 0x8E, 0x0F, 0xF8, 0x18, 0x71,
+ 0xBE, 0x1F, 0x18, 0xC8, 0x64, 0x0F, 0xF1, 0x00, 0x80, 0x40, 0x20, 0x10,
+ 0x08, 0x04, 0x00, 0x01, 0x81, 0x0F, 0x8C, 0x24, 0x1B, 0x08, 0xFC, 0x60,
+ 0x40, 0x3F, 0xF0, 0x38, 0x17, 0xF8, 0xC1, 0x83, 0x06, 0x0D, 0xFC, 0xF0,
+ 0xE1, 0xC3, 0x87, 0x0E, 0x10, 0x30, 0xC0, 0x00, 0xF0, 0xC3, 0x0C, 0x30,
+ 0xC3, 0x3F, 0x06, 0x0C, 0x00, 0x03, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x18,
+ 0x38, 0x78, 0xDF, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0xC4, 0xDC, 0xF4,
+ 0xE6, 0xC2, 0xC3, 0xC1, 0xF0, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3,
+ 0x3F, 0xFB, 0xE6, 0x72, 0x39, 0x1C, 0x8E, 0x47, 0x23, 0x91, 0xDF, 0xCF,
+ 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0x7C, 0xC6, 0xC2, 0x83, 0x83, 0xC2, 0xC6,
+ 0x7C, 0xFE, 0xE6, 0xC3, 0xC3, 0xC3, 0xC3, 0xE6, 0xFE, 0xC0, 0xC0, 0xC0,
+ 0x7B, 0x8F, 0x0C, 0x18, 0x38, 0x71, 0xBD, 0x02, 0x04, 0x08, 0xDE, 0xF3,
+ 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x7D, 0x8E, 0x03, 0xE0, 0x70, 0x71,
+ 0xBE, 0x20, 0x10, 0x3F, 0xC4, 0x02, 0x01, 0x00, 0x80, 0x43, 0x31, 0x8F,
+ 0x80, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x71, 0xBD, 0xC1, 0xB0, 0x98, 0xC4,
+ 0x63, 0x20, 0xB0, 0x70, 0x18, 0x80, 0xE4, 0x53, 0x2B, 0xB5, 0x5A, 0x99,
+ 0x8C, 0x46, 0x61, 0x99, 0x87, 0x81, 0x81, 0xC1, 0xB1, 0x8D, 0x83, 0xC1,
+ 0xB0, 0x88, 0xC6, 0xC1, 0x40, 0xE0, 0x20, 0x30, 0x30, 0x10, 0x18, 0x00,
+ 0xFE, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0x7F, 0x1F, 0x18, 0x10, 0x18, 0x18,
+ 0x08, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x08, 0x18, 0x18, 0x10, 0x18, 0x1F,
+ 0xFF, 0xFF, 0x80, 0xF8, 0x0C, 0x0C, 0x08, 0x08, 0x18, 0x18, 0x18, 0x0F,
+ 0x18, 0x10, 0x18, 0x08, 0x08, 0x0C, 0x0C, 0xF8, 0x78, 0xC7, 0xC0 };
+
+const GFXglyph nk57_monospace_no_rg7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 9, 4, -11 }, // 0x21 '!'
+ { 4, 6, 6, 9, 2, -11 }, // 0x22 '"'
+ { 9, 9, 12, 9, 0, -11 }, // 0x23 '#'
+ { 23, 8, 15, 9, 1, -13 }, // 0x24 '$'
+ { 38, 9, 14, 9, 0, -11 }, // 0x25 '%'
+ { 54, 9, 12, 9, 0, -11 }, // 0x26 '&'
+ { 68, 2, 5, 9, 4, -11 }, // 0x27 '''
+ { 70, 7, 17, 9, 2, -13 }, // 0x28 '('
+ { 85, 6, 17, 9, 1, -13 }, // 0x29 ')'
+ { 98, 7, 8, 9, 1, -11 }, // 0x2A '*'
+ { 105, 9, 7, 9, 0, -8 }, // 0x2B '+'
+ { 113, 2, 4, 9, 4, -1 }, // 0x2C ','
+ { 114, 6, 1, 9, 2, -5 }, // 0x2D '-'
+ { 115, 2, 3, 9, 4, -2 }, // 0x2E '.'
+ { 116, 9, 16, 9, 0, -13 }, // 0x2F '/'
+ { 134, 8, 12, 9, 1, -11 }, // 0x30 '0'
+ { 146, 7, 12, 9, 1, -11 }, // 0x31 '1'
+ { 157, 8, 12, 9, 1, -11 }, // 0x32 '2'
+ { 169, 8, 12, 9, 1, -11 }, // 0x33 '3'
+ { 181, 9, 12, 9, 0, -11 }, // 0x34 '4'
+ { 195, 8, 12, 9, 1, -11 }, // 0x35 '5'
+ { 207, 8, 12, 9, 1, -11 }, // 0x36 '6'
+ { 219, 8, 12, 9, 1, -11 }, // 0x37 '7'
+ { 231, 8, 12, 9, 1, -11 }, // 0x38 '8'
+ { 243, 8, 12, 9, 1, -11 }, // 0x39 '9'
+ { 255, 2, 9, 9, 4, -8 }, // 0x3A ':'
+ { 258, 2, 11, 9, 4, -8 }, // 0x3B ';'
+ { 261, 9, 9, 9, 0, -9 }, // 0x3C '<'
+ { 272, 9, 5, 9, 0, -7 }, // 0x3D '='
+ { 278, 9, 9, 9, 0, -9 }, // 0x3E '>'
+ { 289, 8, 12, 9, 1, -11 }, // 0x3F '?'
+ { 301, 9, 13, 9, 0, -10 }, // 0x40 '@'
+ { 316, 9, 12, 9, 0, -11 }, // 0x41 'A'
+ { 330, 8, 12, 9, 1, -11 }, // 0x42 'B'
+ { 342, 8, 12, 9, 1, -11 }, // 0x43 'C'
+ { 354, 8, 12, 9, 1, -11 }, // 0x44 'D'
+ { 366, 8, 12, 9, 1, -11 }, // 0x45 'E'
+ { 378, 8, 12, 9, 1, -11 }, // 0x46 'F'
+ { 390, 8, 12, 9, 1, -11 }, // 0x47 'G'
+ { 402, 8, 12, 9, 1, -11 }, // 0x48 'H'
+ { 414, 7, 12, 9, 1, -11 }, // 0x49 'I'
+ { 425, 8, 12, 9, 1, -11 }, // 0x4A 'J'
+ { 437, 8, 12, 9, 1, -11 }, // 0x4B 'K'
+ { 449, 8, 12, 9, 1, -11 }, // 0x4C 'L'
+ { 461, 9, 12, 9, 0, -11 }, // 0x4D 'M'
+ { 475, 8, 12, 9, 1, -11 }, // 0x4E 'N'
+ { 487, 8, 12, 9, 1, -11 }, // 0x4F 'O'
+ { 499, 8, 12, 9, 1, -11 }, // 0x50 'P'
+ { 511, 8, 15, 9, 1, -11 }, // 0x51 'Q'
+ { 526, 8, 12, 9, 1, -11 }, // 0x52 'R'
+ { 538, 9, 12, 9, 0, -11 }, // 0x53 'S'
+ { 552, 8, 12, 9, 1, -11 }, // 0x54 'T'
+ { 564, 8, 12, 9, 1, -11 }, // 0x55 'U'
+ { 576, 9, 12, 9, 0, -11 }, // 0x56 'V'
+ { 590, 9, 12, 9, 0, -11 }, // 0x57 'W'
+ { 604, 9, 12, 9, 0, -11 }, // 0x58 'X'
+ { 618, 9, 12, 9, 0, -11 }, // 0x59 'Y'
+ { 632, 7, 12, 9, 1, -11 }, // 0x5A 'Z'
+ { 643, 6, 17, 9, 3, -13 }, // 0x5B '['
+ { 656, 9, 16, 9, 0, -13 }, // 0x5C '\'
+ { 674, 7, 17, 9, 0, -13 }, // 0x5D ']'
+ { 689, 9, 7, 9, 0, -11 }, // 0x5E '^'
+ { 697, 9, 1, 9, 0, 2 }, // 0x5F '_'
+ { 699, 4, 2, 9, 3, -11 }, // 0x60 '`'
+ { 700, 8, 8, 9, 1, -7 }, // 0x61 'a'
+ { 708, 8, 12, 9, 1, -11 }, // 0x62 'b'
+ { 720, 7, 8, 9, 1, -7 }, // 0x63 'c'
+ { 727, 7, 12, 9, 1, -11 }, // 0x64 'd'
+ { 738, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 745, 9, 12, 9, 0, -11 }, // 0x66 'f'
+ { 759, 9, 13, 9, 0, -9 }, // 0x67 'g'
+ { 774, 7, 12, 9, 1, -11 }, // 0x68 'h'
+ { 785, 6, 12, 9, 2, -11 }, // 0x69 'i'
+ { 794, 7, 15, 9, 1, -11 }, // 0x6A 'j'
+ { 808, 8, 12, 9, 1, -11 }, // 0x6B 'k'
+ { 820, 6, 12, 9, 2, -11 }, // 0x6C 'l'
+ { 829, 9, 8, 9, 0, -7 }, // 0x6D 'm'
+ { 838, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 845, 8, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 853, 8, 11, 9, 1, -7 }, // 0x70 'p'
+ { 864, 7, 11, 9, 1, -7 }, // 0x71 'q'
+ { 874, 8, 8, 9, 1, -7 }, // 0x72 'r'
+ { 882, 7, 8, 9, 1, -7 }, // 0x73 's'
+ { 889, 9, 10, 9, 0, -9 }, // 0x74 't'
+ { 901, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 908, 9, 8, 9, 0, -7 }, // 0x76 'v'
+ { 917, 9, 8, 9, 0, -7 }, // 0x77 'w'
+ { 926, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 935, 9, 11, 9, 0, -7 }, // 0x79 'y'
+ { 948, 7, 8, 9, 1, -7 }, // 0x7A 'z'
+ { 955, 8, 17, 9, 1, -13 }, // 0x7B '{'
+ { 972, 1, 17, 9, 4, -13 }, // 0x7C '|'
+ { 975, 8, 17, 9, 0, -13 }, // 0x7D '}'
+ { 992, 9, 2, 9, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_rg7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_rg7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_rg7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1667 bytes
+const uint8_t nk57_monospace_cd_rg7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0x55, 0x55, 0x1D, 0x4A, 0x52, 0x94, 0x80, 0x24, 0x48, 0x91, 0x2F,
+ 0xE5, 0x12, 0x7E, 0x48, 0x91, 0x22, 0x40, 0x10, 0x47, 0xD1, 0xC7, 0x06,
+ 0x0F, 0x04, 0x1C, 0x51, 0x78, 0x41, 0x00, 0x70, 0xA2, 0x42, 0x97, 0x41,
+ 0x04, 0x10, 0x5D, 0x28, 0x91, 0x21, 0x43, 0x80, 0x38, 0x91, 0x12, 0x47,
+ 0x86, 0x1D, 0xEA, 0x8D, 0x13, 0x33, 0xB0, 0xF8, 0x32, 0x44, 0xC8, 0x88,
+ 0x88, 0x88, 0xC4, 0x42, 0x30, 0x84, 0x62, 0x31, 0x11, 0x11, 0x11, 0x32,
+ 0x64, 0x80, 0x11, 0x5F, 0xC4, 0xFD, 0x51, 0x00, 0x10, 0x41, 0x3F, 0x10,
+ 0x41, 0x00, 0xD5, 0xF8, 0x74, 0x02, 0x08, 0x10, 0x20, 0x81, 0x06, 0x08,
+ 0x10, 0x60, 0x81, 0x04, 0x08, 0x10, 0x40, 0x39, 0xA4, 0x51, 0x47, 0x1C,
+ 0x51, 0x45, 0x16, 0x8E, 0x21, 0x09, 0xC2, 0x10, 0x84, 0x21, 0x09, 0xF0,
+ 0xF4, 0xE2, 0x10, 0x84, 0x62, 0x22, 0x21, 0xF0, 0xF4, 0xE2, 0x10, 0xB8,
+ 0x21, 0x8C, 0x66, 0xE0, 0x0C, 0x18, 0x70, 0xE2, 0xC5, 0x93, 0x26, 0xFE,
+ 0x18, 0x30, 0x60, 0xFC, 0x21, 0x0F, 0x4C, 0x21, 0x8C, 0x66, 0xE0, 0x7E,
+ 0x63, 0x0F, 0x6E, 0x31, 0x8C, 0x76, 0xE0, 0xF8, 0x42, 0x31, 0x08, 0xC4,
+ 0x23, 0x10, 0x80, 0x39, 0x34, 0x51, 0x44, 0xE4, 0xF1, 0xC7, 0x16, 0xCE,
+ 0x39, 0x3C, 0x71, 0xC7, 0x14, 0x5F, 0x0C, 0x21, 0x0C, 0x74, 0x07, 0x40,
+ 0x74, 0x03, 0x54, 0x04, 0x73, 0x30, 0xC1, 0x81, 0x83, 0x04, 0xFC, 0x00,
+ 0x00, 0xFC, 0xC1, 0x81, 0x83, 0x04, 0x63, 0x30, 0x80, 0xF4, 0xE2, 0x10,
+ 0x88, 0x84, 0x01, 0x18, 0x40, 0x79, 0x14, 0x67, 0x96, 0x59, 0x65, 0x9E,
+ 0x04, 0x11, 0x7C, 0x10, 0x60, 0xE1, 0x42, 0x85, 0x1A, 0x26, 0x4C, 0xF9,
+ 0x16, 0x30, 0xF4, 0x63, 0x18, 0xFA, 0x31, 0x8C, 0x63, 0xF0, 0x3D, 0x94,
+ 0x50, 0xC3, 0x0C, 0x30, 0x45, 0x16, 0xCE, 0xF4, 0xE3, 0x18, 0xC6, 0x31,
+ 0x8C, 0x67, 0xE0, 0xFC, 0x21, 0x08, 0x7E, 0x10, 0x84, 0x21, 0xF0, 0xFC,
+ 0x21, 0x08, 0x7E, 0x10, 0x84, 0x21, 0x00, 0x3D, 0x94, 0x50, 0xC3, 0x3C,
+ 0x71, 0x45, 0x14, 0xDD, 0x8C, 0x63, 0x18, 0xFE, 0x31, 0x8C, 0x63, 0x10,
+ 0xF9, 0x08, 0x42, 0x10, 0x84, 0x21, 0x09, 0xF0, 0x04, 0x10, 0x41, 0x04,
+ 0x10, 0x41, 0xC5, 0x14, 0xDE, 0x8E, 0x29, 0x24, 0xB2, 0xCD, 0x36, 0x8A,
+ 0x28, 0xA3, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0xF0, 0xC7, 0x8F,
+ 0x3D, 0x7A, 0xF6, 0xE5, 0xCB, 0x87, 0x0E, 0x1C, 0x30, 0x8C, 0x73, 0x9E,
+ 0xD6, 0xB3, 0x9C, 0xE3, 0x10, 0x79, 0x34, 0x71, 0xC7, 0x1C, 0x71, 0xC5,
+ 0x14, 0xDE, 0xF4, 0xE3, 0x18, 0xC6, 0x3F, 0x84, 0x21, 0x00, 0x78, 0x99,
+ 0x12, 0x2C, 0x58, 0xB1, 0x62, 0x44, 0x89, 0x33, 0xC0, 0x81, 0x03, 0x80,
+ 0xFA, 0x28, 0xA2, 0x8A, 0x2F, 0xAC, 0x92, 0x68, 0xA3, 0x3D, 0x3C, 0x70,
+ 0x41, 0xE0, 0xC1, 0xC7, 0x14, 0xDE, 0xFC, 0x41, 0x04, 0x10, 0x41, 0x04,
+ 0x10, 0x41, 0x04, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x67, 0xE0, 0xC6,
+ 0x89, 0x12, 0x24, 0xCD, 0x0A, 0x14, 0x28, 0x70, 0xC0, 0x80, 0x83, 0x06,
+ 0x5C, 0xBD, 0x5E, 0x9B, 0x36, 0x6C, 0xD9, 0x32, 0x20, 0x44, 0xC8, 0xA1,
+ 0x43, 0x82, 0x0C, 0x14, 0x68, 0x99, 0x16, 0x30, 0xC6, 0x89, 0xB1, 0x43,
+ 0x82, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x46, 0x23, 0x11, 0x8C,
+ 0x46, 0x21, 0xF0, 0xFC, 0x21, 0x08, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42,
+ 0x10, 0xF8, 0x81, 0x81, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20,
+ 0x40, 0xC0, 0x81, 0x03, 0xF8, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31,
+ 0x8C, 0x63, 0xF8, 0x10, 0x70, 0xA1, 0x44, 0xC8, 0xB1, 0x80, 0xFE, 0xCC,
+ 0x74, 0xE2, 0x7C, 0xC6, 0x7D, 0x84, 0x21, 0x0B, 0x6E, 0x31, 0x8C, 0x77,
+ 0x60, 0x76, 0x63, 0x08, 0x47, 0x6E, 0x08, 0x42, 0x1E, 0xCE, 0x31, 0x8C,
+ 0x67, 0xD0, 0x74, 0xE3, 0xF8, 0x47, 0x6E, 0x3D, 0x94, 0x50, 0xFD, 0x04,
+ 0x10, 0x41, 0x04, 0x10, 0x06, 0x11, 0xE2, 0x24, 0x48, 0x9F, 0x30, 0x40,
+ 0xFA, 0x0C, 0x3F, 0xC0, 0x84, 0x21, 0x0B, 0x6E, 0x31, 0x8C, 0x63, 0x10,
+ 0x21, 0x00, 0x0E, 0x10, 0x84, 0x21, 0x09, 0xF0, 0x18, 0xC0, 0x07, 0x8C,
+ 0x63, 0x18, 0xC6, 0x39, 0xCF, 0xC0, 0x82, 0x08, 0x20, 0x8E, 0x4B, 0x3C,
+ 0xD2, 0x28, 0xA3, 0xE1, 0x08, 0x42, 0x10, 0x84, 0x21, 0x09, 0xF0, 0xFD,
+ 0xAE, 0x4C, 0x99, 0x32, 0x64, 0xC9, 0xB6, 0xE3, 0x18, 0xC6, 0x31, 0x76,
+ 0xE3, 0x18, 0xC7, 0x6E, 0xB6, 0xE3, 0x18, 0xC7, 0x76, 0x84, 0x20, 0xEC,
+ 0xE3, 0x18, 0xC6, 0x7D, 0x08, 0x42, 0xBE, 0x63, 0x08, 0x42, 0x10, 0xF4,
+ 0xE1, 0xE1, 0xC6, 0x7E, 0x41, 0x0F, 0xD0, 0x41, 0x04, 0x11, 0x64, 0xF0,
+ 0x8C, 0x63, 0x18, 0xC6, 0x7D, 0xC6, 0x89, 0x13, 0x42, 0x85, 0x0C, 0x08,
+ 0x83, 0x0E, 0x56, 0xA6, 0xCD, 0x9B, 0x26, 0x44, 0xD8, 0xA0, 0x83, 0x85,
+ 0x13, 0x63, 0xC6, 0x89, 0x31, 0x43, 0x86, 0x04, 0x10, 0x20, 0xC1, 0x00,
+ 0xF8, 0xC4, 0x46, 0x22, 0x1F, 0x3C, 0x82, 0x08, 0x20, 0xC3, 0x0C, 0xE0,
+ 0xC3, 0x0C, 0x20, 0x82, 0x08, 0x3C, 0xFF, 0xFF, 0x80, 0xF0, 0x41, 0x04,
+ 0x30, 0xC2, 0x08, 0x1C, 0x82, 0x08, 0x30, 0x41, 0x04, 0xF0, 0x76, 0x70 };
+
+const GFXglyph nk57_monospace_cd_rg7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 2, 12, 7, 2, -11 }, // 0x21 '!'
+ { 4, 5, 6, 7, 1, -11 }, // 0x22 '"'
+ { 8, 7, 12, 7, 0, -11 }, // 0x23 '#'
+ { 19, 6, 15, 7, 0, -13 }, // 0x24 '$'
+ { 31, 7, 14, 7, 0, -11 }, // 0x25 '%'
+ { 44, 7, 12, 7, 0, -11 }, // 0x26 '&'
+ { 55, 1, 5, 7, 3, -11 }, // 0x27 '''
+ { 56, 4, 17, 7, 2, -13 }, // 0x28 '('
+ { 65, 4, 17, 7, 1, -13 }, // 0x29 ')'
+ { 74, 6, 7, 7, 0, -11 }, // 0x2A '*'
+ { 80, 6, 7, 7, 0, -8 }, // 0x2B '+'
+ { 86, 2, 4, 7, 2, -1 }, // 0x2C ','
+ { 87, 5, 1, 7, 1, -5 }, // 0x2D '-'
+ { 88, 2, 3, 7, 2, -2 }, // 0x2E '.'
+ { 89, 7, 16, 7, 0, -13 }, // 0x2F '/'
+ { 103, 6, 12, 7, 0, -11 }, // 0x30 '0'
+ { 112, 5, 12, 7, 1, -11 }, // 0x31 '1'
+ { 120, 5, 12, 7, 1, -11 }, // 0x32 '2'
+ { 128, 5, 12, 7, 1, -11 }, // 0x33 '3'
+ { 136, 7, 12, 7, 0, -11 }, // 0x34 '4'
+ { 147, 5, 12, 7, 1, -11 }, // 0x35 '5'
+ { 155, 5, 12, 7, 1, -11 }, // 0x36 '6'
+ { 163, 5, 12, 7, 1, -11 }, // 0x37 '7'
+ { 171, 6, 12, 7, 0, -11 }, // 0x38 '8'
+ { 180, 6, 12, 7, 0, -11 }, // 0x39 '9'
+ { 189, 2, 9, 7, 2, -8 }, // 0x3A ':'
+ { 192, 2, 11, 7, 2, -8 }, // 0x3B ';'
+ { 195, 6, 9, 7, 0, -9 }, // 0x3C '<'
+ { 202, 6, 5, 7, 0, -7 }, // 0x3D '='
+ { 206, 6, 9, 7, 0, -9 }, // 0x3E '>'
+ { 213, 5, 12, 7, 1, -11 }, // 0x3F '?'
+ { 221, 6, 13, 7, 0, -10 }, // 0x40 '@'
+ { 231, 7, 12, 7, 0, -11 }, // 0x41 'A'
+ { 242, 5, 12, 7, 1, -11 }, // 0x42 'B'
+ { 250, 6, 12, 7, 0, -11 }, // 0x43 'C'
+ { 259, 5, 12, 7, 1, -11 }, // 0x44 'D'
+ { 267, 5, 12, 7, 1, -11 }, // 0x45 'E'
+ { 275, 5, 12, 7, 1, -11 }, // 0x46 'F'
+ { 283, 6, 12, 7, 0, -11 }, // 0x47 'G'
+ { 292, 5, 12, 7, 1, -11 }, // 0x48 'H'
+ { 300, 5, 12, 7, 1, -11 }, // 0x49 'I'
+ { 308, 6, 12, 7, 0, -11 }, // 0x4A 'J'
+ { 317, 6, 12, 7, 1, -11 }, // 0x4B 'K'
+ { 326, 5, 12, 7, 1, -11 }, // 0x4C 'L'
+ { 334, 7, 12, 7, 0, -11 }, // 0x4D 'M'
+ { 345, 5, 12, 7, 1, -11 }, // 0x4E 'N'
+ { 353, 6, 12, 7, 0, -11 }, // 0x4F 'O'
+ { 362, 5, 12, 7, 1, -11 }, // 0x50 'P'
+ { 370, 7, 15, 7, 0, -11 }, // 0x51 'Q'
+ { 384, 6, 12, 7, 1, -11 }, // 0x52 'R'
+ { 393, 6, 12, 7, 0, -11 }, // 0x53 'S'
+ { 402, 6, 12, 7, 0, -11 }, // 0x54 'T'
+ { 411, 5, 12, 7, 1, -11 }, // 0x55 'U'
+ { 419, 7, 12, 7, 0, -11 }, // 0x56 'V'
+ { 430, 7, 12, 7, 0, -11 }, // 0x57 'W'
+ { 441, 7, 12, 7, 0, -11 }, // 0x58 'X'
+ { 452, 7, 12, 7, 0, -11 }, // 0x59 'Y'
+ { 463, 5, 12, 7, 1, -11 }, // 0x5A 'Z'
+ { 471, 5, 17, 7, 2, -13 }, // 0x5B '['
+ { 482, 7, 16, 7, 0, -13 }, // 0x5C '\'
+ { 496, 5, 17, 7, 0, -13 }, // 0x5D ']'
+ { 507, 7, 7, 7, 0, -11 }, // 0x5E '^'
+ { 514, 7, 1, 7, 0, 2 }, // 0x5F '_'
+ { 515, 3, 2, 7, 2, -11 }, // 0x60 '`'
+ { 516, 5, 8, 7, 1, -7 }, // 0x61 'a'
+ { 521, 5, 12, 7, 1, -11 }, // 0x62 'b'
+ { 529, 5, 8, 7, 1, -7 }, // 0x63 'c'
+ { 534, 5, 12, 7, 1, -11 }, // 0x64 'd'
+ { 542, 5, 8, 7, 1, -7 }, // 0x65 'e'
+ { 547, 6, 12, 7, 0, -11 }, // 0x66 'f'
+ { 556, 7, 13, 7, 0, -9 }, // 0x67 'g'
+ { 568, 5, 12, 7, 1, -11 }, // 0x68 'h'
+ { 576, 5, 12, 7, 1, -11 }, // 0x69 'i'
+ { 584, 5, 15, 7, 1, -11 }, // 0x6A 'j'
+ { 594, 6, 12, 7, 1, -11 }, // 0x6B 'k'
+ { 603, 5, 12, 7, 1, -11 }, // 0x6C 'l'
+ { 611, 7, 8, 7, 0, -7 }, // 0x6D 'm'
+ { 618, 5, 8, 7, 1, -7 }, // 0x6E 'n'
+ { 623, 5, 8, 7, 1, -7 }, // 0x6F 'o'
+ { 628, 5, 11, 7, 1, -7 }, // 0x70 'p'
+ { 635, 5, 11, 7, 1, -7 }, // 0x71 'q'
+ { 642, 5, 8, 7, 1, -7 }, // 0x72 'r'
+ { 647, 5, 8, 7, 1, -7 }, // 0x73 's'
+ { 652, 6, 10, 7, 0, -9 }, // 0x74 't'
+ { 660, 5, 8, 7, 1, -7 }, // 0x75 'u'
+ { 665, 7, 8, 7, 0, -7 }, // 0x76 'v'
+ { 672, 7, 8, 7, 0, -7 }, // 0x77 'w'
+ { 679, 7, 8, 7, 0, -7 }, // 0x78 'x'
+ { 686, 7, 11, 7, 0, -7 }, // 0x79 'y'
+ { 696, 5, 8, 7, 1, -7 }, // 0x7A 'z'
+ { 701, 6, 17, 7, 1, -13 }, // 0x7B '{'
+ { 714, 1, 17, 7, 3, -13 }, // 0x7C '|'
+ { 717, 6, 17, 7, 0, -13 }, // 0x7D '}'
+ { 730, 6, 2, 7, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_cd_rg7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_cd_rg7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_cd_rg7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1404 bytes
+const uint8_t nk57_monospace_no_bd7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFD, 0xB6, 0xD8, 0xFF, 0x80, 0xCF, 0x3C, 0xF3, 0xCC, 0x13, 0x09,
+ 0x8C, 0xCF, 0xF7, 0xF9, 0x93, 0xFF, 0xFF, 0x26, 0x33, 0x19, 0x80, 0x18,
+ 0x18, 0x7E, 0xC3, 0xC0, 0xE0, 0xFC, 0x1F, 0x07, 0xC3, 0xC7, 0xFE, 0x18,
+ 0x18, 0x78, 0x64, 0x32, 0x19, 0x17, 0x98, 0x18, 0x30, 0x60, 0xC7, 0xC6,
+ 0x43, 0x21, 0x90, 0x78, 0x3E, 0x3F, 0x98, 0xC6, 0xC3, 0xC3, 0xCD, 0xB7,
+ 0x8E, 0xE3, 0x3F, 0x8F, 0x60, 0xFF, 0xC0, 0x0E, 0x30, 0xC3, 0x86, 0x0C,
+ 0x38, 0x70, 0xE1, 0xC3, 0x83, 0x06, 0x0E, 0x0C, 0x0C, 0x0E, 0xE1, 0xC3,
+ 0x06, 0x1C, 0x70, 0xC3, 0x0C, 0x30, 0xC7, 0x1C, 0x63, 0x1C, 0xE0, 0x19,
+ 0x27, 0x5B, 0xE3, 0xDE, 0xE4, 0x8C, 0x0C, 0x06, 0x03, 0x1F, 0xFF, 0xF8,
+ 0x60, 0x30, 0x7F, 0xB6, 0xFF, 0xF0, 0xFF, 0x80, 0x01, 0x80, 0xC0, 0xC0,
+ 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x03,
+ 0x00, 0x3C, 0x7E, 0xC6, 0xC6, 0xC7, 0xC7, 0xC7, 0xC6, 0xC6, 0x7E, 0x3C,
+ 0x18, 0x33, 0xE6, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xFF, 0xF8, 0x7C, 0xFE,
+ 0xC7, 0x07, 0x06, 0x06, 0x0C, 0x18, 0x70, 0xFF, 0xFF, 0x7C, 0xFE, 0xC7,
+ 0x07, 0x3E, 0x3E, 0x07, 0x03, 0xC7, 0xFE, 0x7C, 0x03, 0x03, 0x83, 0xC3,
+ 0x63, 0x31, 0x99, 0x8D, 0xFF, 0xFF, 0x81, 0x80, 0xC0, 0x7E, 0x7E, 0x60,
+ 0xFC, 0xFE, 0x47, 0x03, 0x03, 0xC7, 0xFE, 0x7C, 0x3E, 0x7F, 0xC3, 0xDC,
+ 0xFE, 0xC7, 0xC3, 0xC3, 0xC7, 0xFE, 0x7C, 0xFF, 0xFF, 0x06, 0x06, 0x0C,
+ 0x0C, 0x18, 0x18, 0x38, 0x30, 0x70, 0x7C, 0xFE, 0xC3, 0xC3, 0xFE, 0xFE,
+ 0xC7, 0xC3, 0xC3, 0xFE, 0x7C, 0x7C, 0xFE, 0xC7, 0xC3, 0xC3, 0xC3, 0xFE,
+ 0x36, 0x0C, 0x1C, 0x38, 0xFF, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x1F, 0xED,
+ 0x80, 0x00, 0x83, 0xC7, 0x8F, 0x0E, 0x03, 0xC0, 0x7C, 0x07, 0x00, 0x80,
+ 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0xC0, 0x78, 0x0F, 0x00, 0xF0,
+ 0x18, 0x7C, 0xF1, 0xE0, 0x80, 0x00, 0x7E, 0xFF, 0xC3, 0x03, 0x06, 0x0C,
+ 0x18, 0x00, 0x38, 0x38, 0x38, 0x1E, 0x3F, 0x98, 0x68, 0x34, 0xFA, 0x4F,
+ 0x26, 0x93, 0x4F, 0xA0, 0x18, 0x2F, 0xF3, 0xF0, 0x0C, 0x0E, 0x07, 0x83,
+ 0xC3, 0x61, 0xB8, 0xCC, 0xFE, 0x7F, 0x30, 0xF8, 0x60, 0xFE, 0xFE, 0xC7,
+ 0xC7, 0xFE, 0xFE, 0xC7, 0xC3, 0xC3, 0xFF, 0xFE, 0x7E, 0xFF, 0xC7, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC7, 0xFE, 0x7C, 0xFC, 0xFE, 0xC6, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xC6, 0xFE, 0xFC, 0xFF, 0xFF, 0xC0, 0xC0, 0xFF, 0xFF,
+ 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0x7E, 0xFF, 0xC7, 0xC0, 0xCF, 0xCF, 0xC3, 0xC3,
+ 0xC3, 0xFF, 0x7B, 0xC7, 0xC7, 0xC7, 0xC7, 0xFF, 0xFF, 0xC7, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xFF, 0xFC, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x19, 0xFF, 0xF8,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xC6, 0xFE, 0x7C, 0xC7,
+ 0xC6, 0xCC, 0xDC, 0xFC, 0xFC, 0xEE, 0xC6, 0xC6, 0xC7, 0xC3, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xE1, 0xF1, 0xFC,
+ 0xFE, 0xFF, 0xDF, 0x6F, 0xA7, 0xC3, 0xE1, 0xF0, 0xF8, 0x60, 0xC3, 0xE3,
+ 0xE3, 0xF3, 0xF3, 0xDB, 0xDF, 0xCF, 0xC7, 0xC7, 0xC3, 0x7E, 0xFE, 0xC7,
+ 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0x7E, 0xFE, 0xFF, 0xC3, 0xC3,
+ 0xC3, 0xC7, 0xFE, 0xFC, 0xC0, 0xC0, 0xC0, 0x7E, 0xFE, 0xC7, 0xC3, 0xC3,
+ 0xC3, 0xC3, 0xC3, 0xC7, 0xFE, 0x7E, 0x08, 0x0F, 0x07, 0xFE, 0xFF, 0xC3,
+ 0xC3, 0xC3, 0xFF, 0xFC, 0xCC, 0xCE, 0xC6, 0xC7, 0x3F, 0x3F, 0xD8, 0xEC,
+ 0x07, 0xC1, 0xF8, 0x0F, 0x03, 0x63, 0xBF, 0x8F, 0x80, 0xFF, 0xFF, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xC7, 0xC7, 0xC7, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xC7, 0xC7, 0xFE, 0x7E, 0xE1, 0xB1, 0xD8, 0xCE, 0x63,
+ 0x31, 0xB0, 0xD8, 0x3C, 0x1E, 0x0E, 0x07, 0x00, 0xC1, 0xE4, 0xF3, 0x79,
+ 0xBD, 0xDB, 0xED, 0xDE, 0xEF, 0x73, 0xB1, 0xD8, 0xC0, 0x73, 0x99, 0x8F,
+ 0xC3, 0xC1, 0xE0, 0xE0, 0x78, 0x6C, 0x77, 0x31, 0xF8, 0xE0, 0xE1, 0xB9,
+ 0x8D, 0xC7, 0xC1, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xFF,
+ 0xFC, 0x38, 0x61, 0xC7, 0x0C, 0x38, 0x61, 0xFF, 0xF8, 0xFF, 0xFC, 0x30,
+ 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x3F, 0xFC, 0xC0, 0x30,
+ 0x18, 0x06, 0x03, 0x00, 0xC0, 0x60, 0x18, 0x0C, 0x03, 0x01, 0x80, 0x60,
+ 0x30, 0x0C, 0x06, 0xFF, 0xFC, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
+ 0x38, 0x70, 0xE1, 0xC3, 0xFF, 0xFE, 0x1C, 0x0F, 0x0D, 0x86, 0x66, 0x37,
+ 0x0C, 0xFF, 0xFF, 0xC0, 0xE0, 0xC0, 0x7C, 0xFE, 0xC6, 0x3E, 0xF6, 0xC6,
+ 0xFF, 0x7F, 0xC0, 0xC0, 0xC0, 0xDE, 0xFE, 0xC7, 0xC7, 0xC7, 0xC7, 0xFE,
+ 0xDE, 0x7D, 0xFF, 0x1E, 0x0C, 0x18, 0xFF, 0xBE, 0x06, 0x0C, 0x1B, 0xFF,
+ 0xF8, 0xF1, 0xE3, 0xC7, 0xFD, 0xF8, 0x7D, 0xFF, 0x1F, 0xFF, 0xF8, 0x3F,
+ 0xBE, 0x1F, 0x1F, 0xCC, 0x1F, 0xEF, 0xF1, 0x80, 0xC0, 0x60, 0x30, 0x18,
+ 0x0C, 0x00, 0x03, 0x81, 0xCF, 0x8F, 0xE6, 0x3B, 0x1D, 0xFC, 0x3C, 0x7F,
+ 0x3F, 0xF0, 0x7F, 0xF7, 0xF8, 0xC1, 0x83, 0x06, 0xFF, 0xF8, 0xF1, 0xE3,
+ 0xC7, 0x8F, 0x18, 0x30, 0xC3, 0x3C, 0xF0, 0xC3, 0x0C, 0x33, 0xFF, 0xC0,
+ 0x0E, 0x1C, 0x19, 0xF3, 0xE0, 0xC1, 0x83, 0x06, 0x0C, 0x1E, 0x3F, 0xEF,
+ 0x80, 0xC0, 0xC0, 0xC0, 0xC7, 0xCE, 0xDC, 0xFC, 0xE6, 0xC6, 0xC7, 0xC3,
+ 0xF3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x33, 0xFF, 0xC0, 0xFB, 0xFF, 0xF3,
+ 0x79, 0xBC, 0xDE, 0x6F, 0x37, 0x9B, 0xDF, 0xFF, 0x1E, 0x3C, 0x78, 0xF1,
+ 0xE3, 0x7C, 0xFE, 0xC6, 0xC7, 0xC7, 0xC6, 0xFE, 0x7C, 0xDE, 0xFE, 0xC7,
+ 0xC7, 0xC7, 0xC7, 0xFE, 0xDE, 0xC0, 0xC0, 0xC0, 0x7F, 0xFF, 0x1E, 0x3C,
+ 0x78, 0xFF, 0xBF, 0x06, 0x0C, 0x18, 0xDE, 0xFF, 0xC3, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0x7D, 0xFF, 0x1B, 0xC0, 0xF8, 0xFF, 0xBE, 0x30, 0x18, 0x3F,
+ 0xDF, 0xE3, 0x01, 0x80, 0xC0, 0x63, 0x3F, 0x8F, 0x80, 0xC7, 0x8F, 0x1E,
+ 0x3C, 0x78, 0xFF, 0xBF, 0xE1, 0xB1, 0xDC, 0xC6, 0x63, 0x60, 0xF0, 0x70,
+ 0x38, 0xC1, 0xE4, 0xF3, 0x6F, 0xB7, 0x5B, 0xBD, 0xCC, 0xC6, 0x73, 0x99,
+ 0x87, 0x83, 0x81, 0xE1, 0xB1, 0xCD, 0xC3, 0xE1, 0xB1, 0x8C, 0xC6, 0xC1,
+ 0xE0, 0xE0, 0x70, 0x30, 0x38, 0x18, 0x18, 0x00, 0xFF, 0xFC, 0x30, 0xC3,
+ 0x0C, 0x3F, 0xFF, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x1C, 0x1C, 0x1C, 0xF8,
+ 0xF8, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xC0, 0xF8, 0xFC, 0x0C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18,
+ 0x18, 0x18, 0x1C, 0x0C, 0xFC, 0xF8, 0x78, 0xFF, 0xE1, 0xC0 };
+
+const GFXglyph nk57_monospace_no_bd7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 9, 0, 0 }, // 0x20 ' '
+ { 1, 3, 11, 9, 3, -10 }, // 0x21 '!'
+ { 6, 6, 5, 9, 2, -10 }, // 0x22 '"'
+ { 10, 9, 11, 9, 0, -10 }, // 0x23 '#'
+ { 23, 8, 14, 9, 1, -12 }, // 0x24 '$'
+ { 37, 9, 13, 9, 0, -11 }, // 0x25 '%'
+ { 52, 9, 11, 9, 0, -10 }, // 0x26 '&'
+ { 65, 2, 5, 9, 4, -10 }, // 0x27 '''
+ { 67, 7, 17, 9, 2, -13 }, // 0x28 '('
+ { 82, 6, 17, 9, 1, -13 }, // 0x29 ')'
+ { 95, 7, 8, 9, 1, -10 }, // 0x2A '*'
+ { 102, 9, 7, 9, 0, -8 }, // 0x2B '+'
+ { 110, 3, 5, 9, 3, -2 }, // 0x2C ','
+ { 112, 6, 2, 9, 2, -5 }, // 0x2D '-'
+ { 114, 3, 3, 9, 3, -2 }, // 0x2E '.'
+ { 116, 9, 15, 9, 0, -12 }, // 0x2F '/'
+ { 133, 8, 11, 9, 1, -10 }, // 0x30 '0'
+ { 144, 7, 11, 9, 1, -10 }, // 0x31 '1'
+ { 154, 8, 11, 9, 1, -10 }, // 0x32 '2'
+ { 165, 8, 11, 9, 1, -10 }, // 0x33 '3'
+ { 176, 9, 11, 9, 0, -10 }, // 0x34 '4'
+ { 189, 8, 11, 9, 1, -10 }, // 0x35 '5'
+ { 200, 8, 11, 9, 1, -10 }, // 0x36 '6'
+ { 211, 8, 11, 9, 1, -10 }, // 0x37 '7'
+ { 222, 8, 11, 9, 1, -10 }, // 0x38 '8'
+ { 233, 8, 11, 9, 1, -10 }, // 0x39 '9'
+ { 244, 3, 9, 9, 3, -8 }, // 0x3A ':'
+ { 248, 3, 11, 9, 3, -8 }, // 0x3B ';'
+ { 253, 9, 9, 9, 0, -9 }, // 0x3C '<'
+ { 264, 9, 6, 9, 0, -8 }, // 0x3D '='
+ { 271, 9, 9, 9, 0, -9 }, // 0x3E '>'
+ { 282, 8, 11, 9, 1, -10 }, // 0x3F '?'
+ { 293, 9, 13, 9, 0, -10 }, // 0x40 '@'
+ { 308, 9, 11, 9, 0, -10 }, // 0x41 'A'
+ { 321, 8, 11, 9, 1, -10 }, // 0x42 'B'
+ { 332, 8, 11, 9, 1, -10 }, // 0x43 'C'
+ { 343, 8, 11, 9, 1, -10 }, // 0x44 'D'
+ { 354, 8, 11, 9, 1, -10 }, // 0x45 'E'
+ { 365, 8, 11, 9, 1, -10 }, // 0x46 'F'
+ { 376, 8, 11, 9, 1, -10 }, // 0x47 'G'
+ { 387, 8, 11, 9, 1, -10 }, // 0x48 'H'
+ { 398, 7, 11, 9, 1, -10 }, // 0x49 'I'
+ { 408, 8, 11, 9, 1, -10 }, // 0x4A 'J'
+ { 419, 8, 11, 9, 1, -10 }, // 0x4B 'K'
+ { 430, 8, 11, 9, 1, -10 }, // 0x4C 'L'
+ { 441, 9, 11, 9, 0, -10 }, // 0x4D 'M'
+ { 454, 8, 11, 9, 1, -10 }, // 0x4E 'N'
+ { 465, 8, 11, 9, 1, -10 }, // 0x4F 'O'
+ { 476, 8, 11, 9, 1, -10 }, // 0x50 'P'
+ { 487, 8, 14, 9, 1, -10 }, // 0x51 'Q'
+ { 501, 8, 11, 9, 1, -10 }, // 0x52 'R'
+ { 512, 9, 11, 9, 0, -10 }, // 0x53 'S'
+ { 525, 8, 11, 9, 1, -10 }, // 0x54 'T'
+ { 536, 8, 11, 9, 1, -10 }, // 0x55 'U'
+ { 547, 9, 11, 9, 0, -10 }, // 0x56 'V'
+ { 560, 9, 11, 9, 0, -10 }, // 0x57 'W'
+ { 573, 9, 11, 9, 0, -10 }, // 0x58 'X'
+ { 586, 9, 11, 9, 0, -10 }, // 0x59 'Y'
+ { 599, 7, 11, 9, 1, -10 }, // 0x5A 'Z'
+ { 609, 6, 17, 9, 3, -13 }, // 0x5B '['
+ { 622, 9, 15, 9, 0, -12 }, // 0x5C '\'
+ { 639, 7, 17, 9, 0, -13 }, // 0x5D ']'
+ { 654, 9, 6, 9, 0, -10 }, // 0x5E '^'
+ { 661, 9, 2, 9, 0, 2 }, // 0x5F '_'
+ { 664, 5, 2, 9, 2, -10 }, // 0x60 '`'
+ { 666, 8, 8, 9, 1, -7 }, // 0x61 'a'
+ { 674, 8, 11, 9, 1, -10 }, // 0x62 'b'
+ { 685, 7, 8, 9, 1, -7 }, // 0x63 'c'
+ { 692, 7, 11, 9, 1, -10 }, // 0x64 'd'
+ { 702, 7, 8, 9, 1, -7 }, // 0x65 'e'
+ { 709, 9, 11, 9, 0, -10 }, // 0x66 'f'
+ { 722, 9, 13, 9, 0, -9 }, // 0x67 'g'
+ { 737, 7, 11, 9, 1, -10 }, // 0x68 'h'
+ { 747, 6, 11, 9, 2, -10 }, // 0x69 'i'
+ { 756, 7, 14, 9, 1, -10 }, // 0x6A 'j'
+ { 769, 8, 11, 9, 1, -10 }, // 0x6B 'k'
+ { 780, 6, 11, 9, 2, -10 }, // 0x6C 'l'
+ { 789, 9, 8, 9, 0, -7 }, // 0x6D 'm'
+ { 798, 7, 8, 9, 1, -7 }, // 0x6E 'n'
+ { 805, 8, 8, 9, 1, -7 }, // 0x6F 'o'
+ { 813, 8, 11, 9, 1, -7 }, // 0x70 'p'
+ { 824, 7, 11, 9, 1, -7 }, // 0x71 'q'
+ { 834, 8, 8, 9, 1, -7 }, // 0x72 'r'
+ { 842, 7, 8, 9, 1, -7 }, // 0x73 's'
+ { 849, 9, 10, 9, 0, -9 }, // 0x74 't'
+ { 861, 7, 8, 9, 1, -7 }, // 0x75 'u'
+ { 868, 9, 8, 9, 0, -7 }, // 0x76 'v'
+ { 877, 9, 8, 9, 0, -7 }, // 0x77 'w'
+ { 886, 9, 8, 9, 0, -7 }, // 0x78 'x'
+ { 895, 9, 11, 9, 0, -7 }, // 0x79 'y'
+ { 908, 7, 8, 9, 1, -7 }, // 0x7A 'z'
+ { 915, 8, 17, 9, 1, -13 }, // 0x7B '{'
+ { 932, 2, 17, 9, 4, -13 }, // 0x7C '|'
+ { 937, 8, 17, 9, 0, -13 }, // 0x7D '}'
+ { 954, 9, 3, 9, 0, -6 } }; // 0x7E '~'
+
+const GFXfont nk57_monospace_no_bd7pt7b PROGMEM = {
+ (uint8_t *)nk57_monospace_no_bd7pt7bBitmaps,
+ (GFXglyph *)nk57_monospace_no_bd7pt7bGlyphs,
+ 0x20, 0x7E, 16 };
+
+// Approx. 1630 bytes
+const uint8_t EuphemiaCAS7pt7bBitmaps[] PROGMEM = {
+ 0x00, 0xFF, 0x40, 0xB4, 0x11, 0x84, 0x41, 0x13, 0xFF, 0x11, 0x08, 0x42,
+ 0x10, 0x88, 0xFF, 0xC8, 0x82, 0x21, 0x88, 0x10, 0x79, 0x52, 0x85, 0x06,
+ 0x07, 0x0B, 0x12, 0x27, 0x5B, 0xE1, 0x00, 0x70, 0x51, 0x12, 0x24, 0x44,
+ 0x88, 0xA0, 0xEB, 0x82, 0x88, 0x51, 0x12, 0x24, 0x45, 0x87, 0x20, 0x00,
+ 0x30, 0x48, 0x48, 0x50, 0x20, 0xD0, 0x89, 0x8A, 0xC6, 0x7B, 0xC0, 0x29,
+ 0x49, 0x24, 0x89, 0x22, 0x91, 0x12, 0x49, 0x29, 0x48, 0xAB, 0x88, 0xEA,
+ 0x80, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 0x00, 0x58, 0xE0, 0x80, 0x01,
+ 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40,
+ 0x80, 0x79, 0x28, 0x61, 0x86, 0x18, 0x61, 0x49, 0xE0, 0x65, 0x08, 0x42,
+ 0x10, 0x84, 0x27, 0xC0, 0x7A, 0x10, 0x41, 0x08, 0x42, 0x10, 0x83, 0xF0,
+ 0x7A, 0x20, 0x42, 0x30, 0x30, 0x41, 0x8F, 0xE0, 0x04, 0x18, 0x51, 0x22,
+ 0x48, 0xBF, 0x82, 0x04, 0x08, 0xFA, 0x08, 0x3E, 0x8C, 0x10, 0x41, 0x8B,
+ 0xE0, 0x3D, 0x08, 0x3E, 0x8E, 0x18, 0x61, 0xCD, 0xE0, 0xFC, 0x10, 0x82,
+ 0x08, 0x41, 0x08, 0x21, 0x00, 0x7A, 0x18, 0x73, 0x31, 0x28, 0x61, 0xCD,
+ 0xE0, 0x7B, 0x38, 0x61, 0xC5, 0xF0, 0x43, 0x0B, 0xC0, 0x82, 0x40, 0x05,
+ 0x80, 0x08, 0x88, 0x88, 0x41, 0x04, 0x10, 0x40, 0xFE, 0x03, 0xF8, 0x86,
+ 0x18, 0x61, 0x8C, 0xCC, 0xC4, 0x00, 0xF4, 0xC2, 0x11, 0x91, 0x08, 0x02,
+ 0x00, 0x0F, 0x83, 0x04, 0x40, 0x24, 0x01, 0x8F, 0x99, 0x09, 0x90, 0x99,
+ 0x09, 0x99, 0xA4, 0xFE, 0x60, 0x03, 0x00, 0x0F, 0x00, 0x08, 0x18, 0x14,
+ 0x14, 0x24, 0x22, 0x7E, 0x43, 0x41, 0xC1, 0xFA, 0x18, 0x63, 0xF2, 0x38,
+ 0x61, 0x8F, 0xE0, 0x3C, 0x42, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x63,
+ 0x3C, 0xF9, 0x1A, 0x1C, 0x18, 0x30, 0x60, 0xC2, 0x8D, 0xF0, 0xFA, 0x08,
+ 0x20, 0xFA, 0x08, 0x20, 0x83, 0xF0, 0xFC, 0x21, 0x0F, 0xC2, 0x10, 0x84,
+ 0x00, 0x3C, 0x8F, 0x04, 0x08, 0x10, 0x60, 0xE1, 0x42, 0x7C, 0x83, 0x06,
+ 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x83, 0x04, 0xFF, 0xC0, 0x04, 0x10, 0x41,
+ 0x04, 0x10, 0x61, 0x45, 0xE0, 0x87, 0x12, 0x45, 0x0C, 0x18, 0x28, 0x48,
+ 0x89, 0x0C, 0x82, 0x08, 0x20, 0x82, 0x08, 0x20, 0x83, 0xF0, 0x80, 0xE0,
+ 0xF0, 0x78, 0x3A, 0x2D, 0x16, 0x53, 0x29, 0x94, 0xC4, 0x40, 0x81, 0xC1,
+ 0xA1, 0xB1, 0x91, 0x89, 0x8D, 0x85, 0x83, 0x83, 0x3E, 0x31, 0x90, 0x70,
+ 0x18, 0x0C, 0x06, 0x03, 0x82, 0x63, 0x1F, 0x00, 0xFA, 0x38, 0x61, 0x8F,
+ 0xC8, 0x20, 0x82, 0x00, 0x3E, 0x31, 0x90, 0x50, 0x18, 0x0C, 0x06, 0x03,
+ 0x83, 0x63, 0x1F, 0x01, 0x00, 0x40, 0x10, 0xF9, 0x1A, 0x14, 0x28, 0xDE,
+ 0x24, 0x44, 0x8D, 0x0C, 0x3C, 0x8D, 0x02, 0x03, 0x01, 0x80, 0x81, 0xC6,
+ 0xF8, 0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x7C, 0xC1, 0x43, 0x42, 0x62,
+ 0x26, 0x24, 0x34, 0x18, 0x18, 0x18, 0xC6, 0x34, 0x62, 0x46, 0x24, 0x62,
+ 0x69, 0x62, 0x94, 0x29, 0x42, 0x94, 0x30, 0xC1, 0x08, 0x43, 0x22, 0x24,
+ 0x1C, 0x08, 0x18, 0x34, 0x26, 0x42, 0xC1, 0x82, 0x89, 0x11, 0x43, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x7E, 0x08, 0x10, 0x41, 0x02, 0x08, 0x30, 0x41,
+ 0xFC, 0xEA, 0xAA, 0xAA, 0xC0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10,
+ 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0xD5, 0x55, 0x55, 0xC0, 0x08,
+ 0x18, 0x14, 0x22, 0x62, 0xC1, 0xFE, 0x5C, 0x80, 0x72, 0x20, 0x9E, 0x8A,
+ 0x2F, 0xC0, 0x82, 0x08, 0x3E, 0x8E, 0x18, 0x61, 0x8F, 0xE0, 0x39, 0x18,
+ 0x20, 0x81, 0x17, 0x80, 0x04, 0x10, 0x5F, 0x46, 0x18, 0x61, 0xC5, 0xF0,
+ 0x7A, 0x1F, 0xE0, 0x83, 0x17, 0x80, 0x3A, 0x11, 0xE4, 0x21, 0x08, 0x42,
+ 0x00, 0x7E, 0x28, 0xA2, 0x72, 0x07, 0xA2, 0x8B, 0xC0, 0x82, 0x08, 0x2E,
+ 0xC6, 0x18, 0x61, 0x86, 0x10, 0x9F, 0xC0, 0x20, 0x12, 0x49, 0x24, 0x9C,
+ 0x84, 0x21, 0x3B, 0x72, 0x94, 0x94, 0x40, 0xAA, 0xAA, 0xB0, 0xF7, 0x44,
+ 0x62, 0x31, 0x18, 0x8C, 0x46, 0x22, 0xBB, 0x18, 0x61, 0x86, 0x18, 0x40,
+ 0x7B, 0x38, 0x61, 0x87, 0x37, 0x80, 0xFA, 0x38, 0x61, 0x86, 0x3F, 0xA0,
+ 0x82, 0x00, 0x7F, 0x18, 0x61, 0x87, 0x17, 0xC1, 0x04, 0x10, 0xBC, 0x88,
+ 0x88, 0x80, 0x74, 0x60, 0xE0, 0xC5, 0xC0, 0x44, 0xF4, 0x44, 0x44, 0x70,
+ 0x86, 0x18, 0x61, 0x86, 0x17, 0xC0, 0x82, 0x89, 0x12, 0x22, 0x85, 0x04,
+ 0x00, 0x88, 0xA4, 0xD5, 0x4A, 0xA3, 0x51, 0x90, 0x88, 0xC5, 0x23, 0x04,
+ 0x31, 0x2C, 0x40, 0xC6, 0x89, 0x11, 0x42, 0x83, 0x04, 0x08, 0x21, 0xC0,
+ 0x7C, 0x31, 0x84, 0x21, 0x0F, 0xC0, 0x19, 0x08, 0x42, 0x33, 0x0C, 0x21,
+ 0x08, 0x41, 0x80, 0xFF, 0xF8, 0xC2, 0x22, 0x22, 0x12, 0x22, 0x22, 0xC0,
+ 0x71, 0xCE };
+
+const GFXglyph EuphemiaCAS7pt7bGlyphs[] PROGMEM = {
+ { 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
+ { 1, 1, 10, 3, 1, -9 }, // 0x21 '!'
+ { 3, 3, 2, 5, 1, -9 }, // 0x22 '"'
+ { 4, 10, 12, 12, 1, -10 }, // 0x23 '#'
+ { 19, 7, 13, 8, 0, -11 }, // 0x24 '$'
+ { 31, 11, 12, 13, 1, -10 }, // 0x25 '%'
+ { 48, 8, 10, 10, 1, -9 }, // 0x26 '&'
+ { 58, 1, 2, 3, 1, -9 }, // 0x27 '''
+ { 59, 3, 13, 4, 1, -11 }, // 0x28 '('
+ { 64, 3, 13, 4, 1, -11 }, // 0x29 ')'
+ { 69, 5, 5, 7, 1, -10 }, // 0x2A '*'
+ { 73, 7, 7, 8, 1, -7 }, // 0x2B '+'
+ { 80, 2, 3, 3, 0, 0 }, // 0x2C ','
+ { 81, 3, 1, 5, 1, -4 }, // 0x2D '-'
+ { 82, 1, 1, 3, 1, 0 }, // 0x2E '.'
+ { 83, 8, 14, 8, 0, -11 }, // 0x2F '/'
+ { 97, 6, 10, 8, 1, -9 }, // 0x30 '0'
+ { 105, 5, 10, 8, 2, -9 }, // 0x31 '1'
+ { 112, 6, 10, 8, 1, -9 }, // 0x32 '2'
+ { 120, 6, 10, 8, 1, -9 }, // 0x33 '3'
+ { 128, 7, 10, 8, 0, -9 }, // 0x34 '4'
+ { 137, 6, 10, 8, 1, -9 }, // 0x35 '5'
+ { 145, 6, 10, 8, 1, -9 }, // 0x36 '6'
+ { 153, 6, 10, 8, 1, -9 }, // 0x37 '7'
+ { 161, 6, 10, 8, 1, -9 }, // 0x38 '8'
+ { 169, 6, 10, 8, 1, -9 }, // 0x39 '9'
+ { 177, 1, 7, 3, 1, -6 }, // 0x3A ':'
+ { 178, 2, 9, 3, 0, -6 }, // 0x3B ';'
+ { 181, 5, 10, 7, 1, -9 }, // 0x3C '<'
+ { 188, 7, 3, 9, 1, -6 }, // 0x3D '='
+ { 191, 5, 10, 7, 1, -9 }, // 0x3E '>'
+ { 198, 5, 10, 7, 1, -9 }, // 0x3F '?'
+ { 205, 12, 13, 15, 1, -9 }, // 0x40 '@'
+ { 225, 8, 10, 9, 0, -9 }, // 0x41 'A'
+ { 235, 6, 10, 9, 1, -9 }, // 0x42 'B'
+ { 243, 8, 10, 9, 1, -9 }, // 0x43 'C'
+ { 253, 7, 10, 9, 1, -9 }, // 0x44 'D'
+ { 262, 6, 10, 8, 1, -9 }, // 0x45 'E'
+ { 270, 5, 10, 7, 1, -9 }, // 0x46 'F'
+ { 277, 7, 10, 9, 1, -9 }, // 0x47 'G'
+ { 286, 7, 10, 10, 1, -9 }, // 0x48 'H'
+ { 295, 1, 10, 3, 1, -9 }, // 0x49 'I'
+ { 297, 6, 10, 7, 0, -9 }, // 0x4A 'J'
+ { 305, 7, 10, 9, 1, -9 }, // 0x4B 'K'
+ { 314, 6, 10, 7, 1, -9 }, // 0x4C 'L'
+ { 322, 9, 10, 11, 1, -9 }, // 0x4D 'M'
+ { 334, 8, 10, 10, 1, -9 }, // 0x4E 'N'
+ { 344, 9, 10, 11, 1, -9 }, // 0x4F 'O'
+ { 356, 6, 10, 8, 1, -9 }, // 0x50 'P'
+ { 364, 9, 13, 11, 1, -9 }, // 0x51 'Q'
+ { 379, 7, 10, 8, 1, -9 }, // 0x52 'R'
+ { 388, 7, 10, 8, 0, -9 }, // 0x53 'S'
+ { 397, 7, 10, 8, 1, -9 }, // 0x54 'T'
+ { 406, 8, 10, 10, 1, -9 }, // 0x55 'U'
+ { 416, 8, 10, 8, 0, -9 }, // 0x56 'V'
+ { 426, 12, 10, 12, 0, -9 }, // 0x57 'W'
+ { 441, 8, 10, 9, 0, -9 }, // 0x58 'X'
+ { 451, 7, 10, 8, 0, -9 }, // 0x59 'Y'
+ { 460, 7, 10, 8, 0, -9 }, // 0x5A 'Z'
+ { 469, 2, 13, 4, 1, -11 }, // 0x5B '['
+ { 473, 8, 14, 9, 0, -11 }, // 0x5C '\'
+ { 487, 2, 13, 4, 1, -11 }, // 0x5D ']'
+ { 491, 8, 6, 9, 0, -10 }, // 0x5E '^'
+ { 497, 7, 1, 7, 0, 3 }, // 0x5F '_'
+ { 498, 3, 3, 0, -2, -10 }, // 0x60 '`'
+ { 500, 6, 7, 8, 1, -6 }, // 0x61 'a'
+ { 506, 6, 10, 8, 1, -9 }, // 0x62 'b'
+ { 514, 6, 7, 7, 1, -6 }, // 0x63 'c'
+ { 520, 6, 10, 8, 1, -9 }, // 0x64 'd'
+ { 528, 6, 7, 8, 1, -6 }, // 0x65 'e'
+ { 534, 5, 10, 4, 0, -9 }, // 0x66 'f'
+ { 541, 6, 10, 8, 1, -6 }, // 0x67 'g'
+ { 549, 6, 10, 8, 1, -9 }, // 0x68 'h'
+ { 557, 1, 10, 3, 1, -9 }, // 0x69 'i'
+ { 559, 3, 13, 3, -1, -9 }, // 0x6A 'j'
+ { 564, 5, 10, 7, 1, -9 }, // 0x6B 'k'
+ { 571, 2, 10, 3, 1, -9 }, // 0x6C 'l'
+ { 574, 9, 7, 11, 1, -6 }, // 0x6D 'm'
+ { 582, 6, 7, 8, 1, -6 }, // 0x6E 'n'
+ { 588, 6, 7, 8, 1, -6 }, // 0x6F 'o'
+ { 594, 6, 10, 8, 1, -6 }, // 0x70 'p'
+ { 602, 6, 10, 8, 1, -6 }, // 0x71 'q'
+ { 610, 4, 7, 5, 1, -6 }, // 0x72 'r'
+ { 614, 5, 7, 7, 1, -6 }, // 0x73 's'
+ { 619, 4, 9, 5, 0, -8 }, // 0x74 't'
+ { 624, 6, 7, 8, 1, -6 }, // 0x75 'u'
+ { 630, 7, 7, 7, 0, -6 }, // 0x76 'v'
+ { 637, 9, 7, 9, 0, -6 }, // 0x77 'w'
+ { 645, 6, 7, 6, 0, -6 }, // 0x78 'x'
+ { 651, 7, 10, 7, 0, -6 }, // 0x79 'y'
+ { 660, 6, 7, 7, 0, -6 }, // 0x7A 'z'
+ { 666, 5, 13, 5, 0, -10 }, // 0x7B '{'
+ { 675, 1, 13, 7, 3, -9 }, // 0x7C '|'
+ { 677, 4, 13, 5, 0, -10 }, // 0x7D '}'
+ { 684, 8, 2, 9, 0, -4 } }; // 0x7E '~'
+
+const GFXfont EuphemiaCAS7pt7b PROGMEM = {
+ (uint8_t *)EuphemiaCAS7pt7bBitmaps,
+ (GFXglyph *)EuphemiaCAS7pt7bGlyphs,
+ 0x20, 0x7E, 19 };
+
+// Approx. 1358 bytes
+
+
+// Approx. 1522 bytes
+
+#endif /* CUSTOM_FONTS_H_ */
--- /dev/null
+++ b/LEAF/Inc/debug.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : DEBUG.h
+ * Description : This file provides code for the configuration
+ * of the DEBUG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __debug_H
+#define __debug_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_DEBUG_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ debug_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/dma.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : dma.h
+ * Description : This file contains all the function prototypes for
+ * the dma.c file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __dma_H
+#define __dma_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* DMA memory to memory transfer handles -------------------------------------*/
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_DMA_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __dma_H */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/eeprom.h
@@ -1,0 +1,125 @@
+
+
+/**
+ ******************************************************************************
+ * @file EEPROM_Emulation/inc/eeprom.h
+ * @author MCD Application Team
+ * @brief This file contains all the functions prototypes for the EEPROM
+ * emulation firmware library.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __EEPROM_H
+#define __EEPROM_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "main.h"
+
+/* Exported constants --------------------------------------------------------*/
+/* EEPROM emulation firmware error codes */
+#define EE_OK (uint32_t)HAL_OK
+#define EE_ERROR (uint32_t)HAL_ERROR
+#define EE_BUSY (uint32_t)HAL_BUSY
+#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT
+
+
+#define FLASH_BASE_ADDR (uint32_t)(FLASH_BASE)
+#define FLASH_END_ADDR (uint32_t)(0x081FFFFF)
+
+/* Base address of the Flash sectors Bank 1 */
+#define ADDR_FLASH_SECTOR_0_BANK1 ((uint32_t)0x08000000) /* Base @ of Sector 0, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_1_BANK1 ((uint32_t)0x08020000) /* Base @ of Sector 1, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_2_BANK1 ((uint32_t)0x08040000) /* Base @ of Sector 2, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_3_BANK1 ((uint32_t)0x08060000) /* Base @ of Sector 3, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_4_BANK1 ((uint32_t)0x08080000) /* Base @ of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5_BANK1 ((uint32_t)0x080A0000) /* Base @ of Sector 5, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_6_BANK1 ((uint32_t)0x080C0000) /* Base @ of Sector 6, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_7_BANK1 ((uint32_t)0x080E0000) /* Base @ of Sector 7, 128 Kbytes */
+
+/* Base address of the Flash sectors Bank 2 */
+#define ADDR_FLASH_SECTOR_0_BANK2 ((uint32_t)0x08100000) /* Base @ of Sector 0, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_1_BANK2 ((uint32_t)0x08120000) /* Base @ of Sector 1, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_2_BANK2 ((uint32_t)0x08140000) /* Base @ of Sector 2, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_3_BANK2 ((uint32_t)0x08160000) /* Base @ of Sector 3, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_4_BANK2 ((uint32_t)0x08180000) /* Base @ of Sector 4, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_5_BANK2 ((uint32_t)0x081A0000) /* Base @ of Sector 5, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_6_BANK2 ((uint32_t)0x081C0000) /* Base @ of Sector 6, 128 Kbytes */
+#define ADDR_FLASH_SECTOR_7_BANK2 ((uint32_t)0x081E0000) /* Base @ of Sector 7, 128 Kbytes */
+
+
+/* Define the size of the sectors to be used */
+
+ #define PAGE_SIZE (uint32_t)0x20000 /* Page size = 128KByte */
+
+
+/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
+ be done by word */
+#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3
+
+/* EEPROM emulation start address in Flash */
+
+ #define EEPROM_START_ADDRESS ADDR_FLASH_SECTOR_6_BANK2 /* sector6 of bank 2 */
+
+
+/* Pages 0 and 1 base and end addresses */
+#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000))
+#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
+
+ #define PAGE0_ID FLASH_SECTOR_6
+
+
+#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + PAGE_SIZE))
+#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1)))
+
+ #define PAGE1_ID FLASH_SECTOR_7
+
+
+/* Used Flash pages for EEPROM emulation */
+#define PAGE0 ((uint16_t)0x0000)
+#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/
+
+/* No valid page define */
+#define NO_VALID_PAGE ((uint16_t)0x00AB)
+
+/* Page status definitions */
+#define ERASED ((uint16_t)0xFFFF) /* Page is empty */
+#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */
+#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */
+
+/* Valid pages in read and write defines */
+#define READ_FROM_VALID_PAGE ((uint8_t)0x00)
+#define WRITE_IN_VALID_PAGE ((uint8_t)0x01)
+
+/* Page full define */
+#define PAGE_FULL ((uint8_t)0x80)
+
+/* Variables' number */
+#define NB_OF_VAR ((uint8_t)0x03)
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+/* Virtual address defined by the user: 0xFFFF value is prohibited */
+extern uint16_t VirtAddVarTab[NB_OF_VAR];
+uint16_t EE_Init(void);
+uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
+uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
+
+#endif /* __EEPROM_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
--- /dev/null
+++ b/LEAF/Inc/fatfs.h
@@ -1,0 +1,49 @@
+/**
+ ******************************************************************************
+ * @file fatfs.h
+ * @brief Header for fatfs applications
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __fatfs_H
+#define __fatfs_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "ff.h"
+#include "ff_gen_drv.h"
+#include "sd_diskio.h" /* defines SD_Driver as external */
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern uint8_t retSD; /* Return value for SD */
+extern char SDPath[4]; /* SD logical drive path */
+extern FATFS SDFatFS; /* File system object for SD logical drive */
+extern FIL SDFile; /* File object for SD */
+
+void MX_FATFS_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+#ifdef __cplusplus
+}
+#endif
+#endif /*__fatfs_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/fatfs_platform.h
@@ -1,0 +1,26 @@
+/**
+ ******************************************************************************
+ * @file : fatfs_platform.h
+ * @brief : fatfs_platform header file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+/* Defines ------------------------------------------------------------------*/
+#define SD_PRESENT ((uint8_t)0x01) /* also in bsp_driver_sd.h */
+#define SD_NOT_PRESENT ((uint8_t)0x00) /* also in bsp_driver_sd.h */
+#define SD_DETECT_PIN GPIO_PIN_13
+#define SD_DETECT_GPIO_PORT GPIOC
+/* Prototypes ---------------------------------------------------------------*/
+uint8_t BSP_PlatformIsDetected(void);
--- /dev/null
+++ b/LEAF/Inc/ffconf.h
@@ -1,0 +1,269 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * FatFs - Generic FAT file system module R0.12c (C)ChaN, 2017
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+#ifndef _FFCONF
+#define _FFCONF 68300 /* Revision ID */
+
+/*-----------------------------------------------------------------------------/
+/ Additional user header to be used
+/-----------------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32h7xx_hal.h"
+#include "bsp_driver_sd.h"
+
+/*-----------------------------------------------------------------------------/
+/ Function Configurations
+/-----------------------------------------------------------------------------*/
+
+#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */
+/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
+/ Read-only configuration removes writing API functions, f_write(), f_sync(),
+/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
+/ and optional writing functions as well. */
+
+#define _FS_MINIMIZE 0 /* 0 to 3 */
+/* This option defines minimization level to remove some basic API functions.
+/
+/ 0: All basic functions are enabled.
+/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
+/ are removed.
+/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
+/ 3: f_lseek() function is removed in addition to 2. */
+
+#define _USE_STRFUNC 2 /* 0:Disable or 1-2:Enable */
+/* This option switches string functions, f_gets(), f_putc(), f_puts() and
+/ f_printf().
+/
+/ 0: Disable string functions.
+/ 1: Enable without LF-CRLF conversion.
+/ 2: Enable with LF-CRLF conversion. */
+
+#define _USE_FIND 0
+/* This option switches filtered directory read functions, f_findfirst() and
+/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
+
+#define _USE_MKFS 1
+/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
+
+#define _USE_FASTSEEK 1
+/* This option switches fast seek feature. (0:Disable or 1:Enable) */
+
+#define _USE_EXPAND 0
+/* This option switches f_expand function. (0:Disable or 1:Enable) */
+
+#define _USE_CHMOD 0
+/* This option switches attribute manipulation functions, f_chmod() and f_utime().
+/ (0:Disable or 1:Enable) Also _FS_READONLY needs to be 0 to enable this option. */
+
+#define _USE_LABEL 0
+/* This option switches volume label functions, f_getlabel() and f_setlabel().
+/ (0:Disable or 1:Enable) */
+
+#define _USE_FORWARD 0
+/* This option switches f_forward() function. (0:Disable or 1:Enable) */
+
+/*-----------------------------------------------------------------------------/
+/ Locale and Namespace Configurations
+/-----------------------------------------------------------------------------*/
+
+#define _CODE_PAGE 850
+/* This option specifies the OEM code page to be used on the target system.
+/ Incorrect setting of the code page can cause a file open failure.
+/
+/ 1 - ASCII (No extended character. Non-LFN cfg. only)
+/ 437 - U.S.
+/ 720 - Arabic
+/ 737 - Greek
+/ 771 - KBL
+/ 775 - Baltic
+/ 850 - Latin 1
+/ 852 - Latin 2
+/ 855 - Cyrillic
+/ 857 - Turkish
+/ 860 - Portuguese
+/ 861 - Icelandic
+/ 862 - Hebrew
+/ 863 - Canadian French
+/ 864 - Arabic
+/ 865 - Nordic
+/ 866 - Russian
+/ 869 - Greek 2
+/ 932 - Japanese (DBCS)
+/ 936 - Simplified Chinese (DBCS)
+/ 949 - Korean (DBCS)
+/ 950 - Traditional Chinese (DBCS)
+*/
+
+#define _USE_LFN 0 /* 0 to 3 */
+#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */
+/* The _USE_LFN switches the support of long file name (LFN).
+/
+/ 0: Disable support of LFN. _MAX_LFN has no effect.
+/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
+/ 2: Enable LFN with dynamic working buffer on the STACK.
+/ 3: Enable LFN with dynamic working buffer on the HEAP.
+/
+/ To enable the LFN, Unicode handling functions (option/unicode.c) must be added
+/ to the project. The working buffer occupies (_MAX_LFN + 1) * 2 bytes and
+/ additional 608 bytes at exFAT enabled. _MAX_LFN can be in range from 12 to 255.
+/ It should be set 255 to support full featured LFN operations.
+/ When use stack for the working buffer, take care on stack overflow. When use heap
+/ memory for the working buffer, memory management functions, ff_memalloc() and
+/ ff_memfree(), must be added to the project. */
+
+#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */
+/* This option switches character encoding on the API. (0:ANSI/OEM or 1:UTF-16)
+/ To use Unicode string for the path name, enable LFN and set _LFN_UNICODE = 1.
+/ This option also affects behavior of string I/O functions. */
+
+#define _STRF_ENCODE 3
+/* When _LFN_UNICODE == 1, this option selects the character encoding ON THE FILE to
+/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf().
+/
+/ 0: ANSI/OEM
+/ 1: UTF-16LE
+/ 2: UTF-16BE
+/ 3: UTF-8
+/
+/ This option has no effect when _LFN_UNICODE == 0. */
+
+#define _FS_RPATH 0 /* 0 to 2 */
+/* This option configures support of relative path.
+/
+/ 0: Disable relative path and remove related functions.
+/ 1: Enable relative path. f_chdir() and f_chdrive() are available.
+/ 2: f_getcwd() function is available in addition to 1.
+*/
+
+/*---------------------------------------------------------------------------/
+/ Drive/Volume Configurations
+/----------------------------------------------------------------------------*/
+
+#define _VOLUMES 1
+/* Number of volumes (logical drives) to be used. */
+
+/* USER CODE BEGIN Volumes */
+#define _STR_VOLUME_ID 0 /* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */
+#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"
+/* _STR_VOLUME_ID switches string support of volume ID.
+/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
+/ number in the path name. _VOLUME_STRS defines the drive ID strings for each
+/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for
+/ the drive ID strings are: A-Z and 0-9. */
+/* USER CODE END Volumes */
+
+#define _MULTI_PARTITION 0 /* 0:Single partition, 1:Multiple partition */
+/* This option switches support of multi-partition on a physical drive.
+/ By default (0), each logical drive number is bound to the same physical drive
+/ number and only an FAT volume found on the physical drive will be mounted.
+/ When multi-partition is enabled (1), each logical drive number can be bound to
+/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
+/ funciton will be available. */
+#define _MIN_SS 512 /* 512, 1024, 2048 or 4096 */
+#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */
+/* These options configure the range of sector size to be supported. (512, 1024,
+/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and
+/ harddisk. But a larger value may be required for on-board flash memory and some
+/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured
+/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the
+/ disk_ioctl() function. */
+
+#define _USE_TRIM 0
+/* This option switches support of ATA-TRIM. (0:Disable or 1:Enable)
+/ To enable Trim function, also CTRL_TRIM command should be implemented to the
+/ disk_ioctl() function. */
+
+#define _FS_NOFSINFO 0 /* 0,1,2 or 3 */
+/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
+/ option, and f_getfree() function at first time after volume mount will force
+/ a full FAT scan. Bit 1 controls the use of last allocated cluster number.
+/
+/ bit0=0: Use free cluster count in the FSINFO if available.
+/ bit0=1: Do not trust free cluster count in the FSINFO.
+/ bit1=0: Use last allocated cluster number in the FSINFO if available.
+/ bit1=1: Do not trust last allocated cluster number in the FSINFO.
+*/
+
+/*---------------------------------------------------------------------------/
+/ System Configurations
+/----------------------------------------------------------------------------*/
+
+#define _FS_TINY 0 /* 0:Normal or 1:Tiny */
+/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
+/ At the tiny configuration, size of file object (FIL) is reduced _MAX_SS bytes.
+/ Instead of private sector buffer eliminated from the file object, common sector
+/ buffer in the file system object (FATFS) is used for the file data transfer. */
+
+#define _FS_EXFAT 0
+/* This option switches support of exFAT file system. (0:Disable or 1:Enable)
+/ When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1)
+/ Note that enabling exFAT discards C89 compatibility. */
+
+#define _FS_NORTC 0
+#define _NORTC_MON 6
+#define _NORTC_MDAY 4
+#define _NORTC_YEAR 2015
+/* The option _FS_NORTC switches timestamp functiton. If the system does not have
+/ any RTC function or valid timestamp is not needed, set _FS_NORTC = 1 to disable
+/ the timestamp function. All objects modified by FatFs will have a fixed timestamp
+/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR in local time.
+/ To enable timestamp function (_FS_NORTC = 0), get_fattime() function need to be
+/ added to the project to get current time form real-time clock. _NORTC_MON,
+/ _NORTC_MDAY and _NORTC_YEAR have no effect.
+/ These options have no effect at read-only configuration (_FS_READONLY = 1). */
+
+#define _FS_LOCK 2 /* 0:Disable or >=1:Enable */
+/* The option _FS_LOCK switches file lock function to control duplicated file open
+/ and illegal operation to open objects. This option must be 0 when _FS_READONLY
+/ is 1.
+/
+/ 0: Disable file lock function. To avoid volume corruption, application program
+/ should avoid illegal open, remove and rename to the open objects.
+/ >0: Enable file lock function. The value defines how many files/sub-directories
+/ can be opened simultaneously under file lock control. Note that the file
+/ lock control is independent of re-entrancy. */
+
+#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */
+#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */
+#define _SYNC_t NULL
+/* The option _FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
+/ module itself. Note that regardless of this option, file access to different
+/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
+/ and f_fdisk() function, are always not re-entrant. Only file/directory access
+/ to the same volume is under control of this function.
+/
+/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
+/ 1: Enable re-entrancy. Also user provided synchronization handlers,
+/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
+/ function, must be added to the project. Samples are available in
+/ option/syscall.c.
+/
+/ The _FS_TIMEOUT defines timeout period in unit of time tick.
+/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
+/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be
+/ included somewhere in the scope of ff.h. */
+
+/* define the ff_malloc ff_free macros as standard malloc free */
+#if !defined(ff_malloc) && !defined(ff_free)
+#include <stdlib.h>
+#define ff_malloc malloc
+#define ff_free free
+#endif
+
+#endif /* _FFCONF */
--- /dev/null
+++ b/LEAF/Inc/fmc.h
@@ -1,0 +1,60 @@
+/**
+ ******************************************************************************
+ * File Name : FMC.h
+ * Description : This file provides code for the configuration
+ * of the FMC peripheral.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __FMC_H
+#define __FMC_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SDRAM_HandleTypeDef hsdram1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_FMC_Init(void);
+void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram);
+void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__FMC_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/gfx.h
@@ -1,0 +1,120 @@
+/*
+ * gfx.h
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+#ifndef GFX_H_
+#define GFX_H_
+
+
+#include "gfx_font.h"
+#include "ssd1306.h"
+
+typedef struct _GFX
+{
+ int16_t WIDTH;
+ int16_t HEIGHT;
+ uint16_t _width;
+ uint16_t _height;
+ uint16_t rotation;
+ uint16_t cursor_y;
+ uint16_t cursor_x;
+ uint16_t textsize;
+ uint16_t textcolor;
+ uint16_t textbgcolor;
+ uint16_t wrap;
+ uint16_t _cp437;
+ GFXfont *gfxFont;
+} GFX;
+
+void GFXinit(GFX* myGfx, int16_t w, int16_t h); // Constructor
+
+ // This MUST be defined by the subclass:
+void GFXdrawPixel(GFX* myGfx, int16_t x, int16_t y, uint16_t color);
+
+ // TRANSACTION API / CORE DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+void GFXstartWrite(GFX* myGfx);
+void GFXwritePixel(GFX* myGfx, int16_t x, int16_t y, uint16_t color);
+void GFXwriteFillRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+void GFXwriteFastVLine(GFX* myGfx, int16_t x, int16_t y, int16_t h, uint16_t color);
+void GFXwriteFastHLine(GFX* myGfx, int16_t x, int16_t y, int16_t w, uint16_t color);
+void GFXwriteLine(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
+void GFXendWrite(GFX* myGfx);
+
+ // CONTROL API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+void GFXsetRotation(GFX* myGfx, uint8_t r);
+void GFXinvertDisplay(GFX* myGfx, uint8_t i);
+
+ // BASIC DRAW API
+ // These MAY be overridden by the subclass to provide device-specific
+ // optimized code. Otherwise 'generic' versions are used.
+
+ // It's good to implement those, even if using transaction API
+void GFXdrawFastVLine(GFX* myGfx, int16_t x, int16_t y, int16_t h, uint16_t color);
+void GFXdrawFastHLine(GFX* myGfx, int16_t x, int16_t y, int16_t w, uint16_t color);
+void GFXfillRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+void GFXfillScreen(GFX* myGfx, uint16_t color);
+ // Optional and probably not necessary to change
+void GFXdrawLine(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
+void GFXdrawRect(GFX* myGfx, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
+
+ // These exist only with Adafruit_GFX (no subclass overrides)
+
+void GFXdrawCircle(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint16_t color);
+void GFXdrawCircleHelper(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ uint16_t color);
+void GFXfillCircle(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint16_t color);
+void GFXfillCircleHelper(GFX* myGfx, int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
+ int16_t delta, uint16_t color);
+void GFXdrawTriangle(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color);
+void GFXfillTriangle(GFX* myGfx, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ int16_t x2, int16_t y2, uint16_t color);
+void GFXdrawRoundRect(GFX* myGfx, int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color);
+void GFXfillRoundRect(GFX* myGfx, int16_t x0, int16_t y0, int16_t w, int16_t h,
+ int16_t radius, uint16_t color);
+void GFXdrawBitmap(GFX* myGfx, int16_t x, int16_t y, uint8_t *bitmap,
+ int16_t w, int16_t h, uint16_t color, uint16_t bg);
+void GFXdrawChar(GFX* myGfx, int16_t x, int16_t y, unsigned char c, uint16_t color,
+ uint16_t bg, uint8_t size);
+void GFXsetCursor(GFX* myGfx, int16_t x, int16_t y);
+void GFXsetTextColor(GFX* myGfx, uint16_t c, uint16_t bg);
+void GFXsetTextSize(GFX* myGfx, uint8_t s);
+void GFXsetTextWrap(GFX* myGfx, uint8_t w);
+void GFXcp437(GFX* myGfx, uint8_t x);
+void GFXsetFont(GFX* myGfx, const GFXfont *f);
+void GFXgetTextBounds(GFX* myGfx, char *string, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h);
+
+
+void GFXwrite(GFX* myGfx, uint8_t);
+
+
+ int16_t GFXheight(GFX* myGfx );
+ int16_t GFXwidth(GFX* myGfx );
+
+ uint8_t GFXgetRotation(GFX* myGfx );
+
+ // get current cursor position (get rotation safe maximum values, using: width() for x, height() for y)
+ int16_t GFXgetCursorX(GFX* myGfx);
+ int16_t GFXgetCursorY(GFX* myGfx );
+
+ void GFXcharBounds(GFX* myGfx, char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy);
+
+int OLEDparseInt(char* buffer, uint32_t myNumber, uint8_t numDigits);
+
+int OLEDparsePitch(char* buffer, float midi);
+
+int OLEDparsePitchClass(char* buffer, float midi);
+
+int OLEDparseFixedFloat(char* buffer, float input, uint8_t numDigits, uint8_t numDecimal);
+
+#endif /* GFX_H_ */
--- /dev/null
+++ b/LEAF/Inc/gfx_font.h
@@ -1,0 +1,24 @@
+// Font structures for newer Adafruit_GFX (1.1 and later).
+// Example fonts are included in 'Fonts' directory.
+// To use a font in your Arduino sketch, #include the corresponding .h
+// file and pass address of GFXfont struct to setFont(). Pass NULL to
+// revert to 'classic' fixed-space bitmap font.
+
+#ifndef _GFXFONT_H_
+#define _GFXFONT_H_
+
+typedef struct { // Data stored PER GLYPH
+ uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
+ uint8_t width, height; // Bitmap dimensions in pixels
+ uint8_t xAdvance; // Distance to advance cursor (x axis)
+ int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
+} GFXglyph;
+
+typedef struct { // Data stored for FONT AS A WHOLE:
+ uint8_t *bitmap; // Glyph bitmaps, concatenated
+ GFXglyph *glyph; // Glyph array
+ uint8_t first, last; // ASCII extents
+ uint8_t yAdvance; // Newline distance (y axis)
+} GFXfont;
+
+#endif // _GFXFONT_H_
--- /dev/null
+++ b/LEAF/Inc/gpio.h
@@ -1,0 +1,57 @@
+/**
+ ******************************************************************************
+ * File Name : gpio.h
+ * Description : This file contains all the functions prototypes for
+ * the gpio
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __gpio_H
+#define __gpio_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_GPIO_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ pinoutConfig_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/i2c.h
@@ -1,0 +1,60 @@
+/**
+ ******************************************************************************
+ * File Name : I2C.h
+ * Description : This file provides code for the configuration
+ * of the I2C instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __i2c_H
+#define __i2c_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern I2C_HandleTypeDef hi2c2;
+extern I2C_HandleTypeDef hi2c4;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_I2C2_Init(void);
+void MX_I2C4_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ i2c_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/LEAF/Inc/leaf-analysis.h
+++ /dev/null
@@ -1,258 +1,0 @@
-/*==============================================================================
-
- leaf-analysis.h
- Created: 25 Oct 2019 10:30:52am
- Author: Matthew Wang
-
- ==============================================================================*/
-
-#ifndef LEAF_ANALYSIS_H_INCLUDED
-#define LEAF_ANALYSIS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-#include "leaf-filters.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- /* Envelope Follower */
- typedef struct _tEnvelopeFollower
- {
- float y;
- float a_thresh;
- float d_coeff;
-
- } _tEnvelopeFollower;
-
- typedef _tEnvelopeFollower* tEnvelopeFollower;
-
- void tEnvelopeFollower_init (tEnvelopeFollower* const, float attackThreshold, float decayCoeff);
- void tEnvelopeFollower_free (tEnvelopeFollower* const);
- void tEnvelopeFollower_initToPool (tEnvelopeFollower* const, float attackThreshold, float decayCoeff, tMempool* const);
- void tEnvelopeFollower_freeFromPool (tEnvelopeFollower* const, tMempool* const);
-
- float tEnvelopeFollower_tick (tEnvelopeFollower* const, float x);
- int tEnvelopeFollower_decayCoeff (tEnvelopeFollower* const, float decayCoeff);
- int tEnvelopeFollower_attackThresh (tEnvelopeFollower* const, float attackThresh);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* PowerEnvelopeFollower */
- typedef struct _tPowerFollower {
- float factor, oneminusfactor;
- float curr;
-
- } _tPowerFollower;
-
- typedef _tPowerFollower* tPowerFollower;
-
- void tPowerFollower_init (tPowerFollower* const, float factor);
- void tPowerFollower_free (tPowerFollower* const);
- void tPowerFollower_initToPool (tPowerFollower* const, float factor, tMempool* const);
- void tPowerFollower_freeFromPool (tPowerFollower* const, tMempool* const);
-
- float tPowerFollower_tick (tPowerFollower* const, float input);
- float tPowerFollower_sample (tPowerFollower* const);
- int tPowerFollower_setFactor (tPowerFollower* const, float factor);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // ENV~ from PD, modified for LEAF
-#define MAXOVERLAP 32
-#define INITVSTAKEN 64
-#define ENV_WINDOW_SIZE 1024
-#define ENV_HOP_SIZE 256
-
- typedef struct _tEnvPD
- {
- float buf[ENV_WINDOW_SIZE + INITVSTAKEN];
- uint16_t x_phase; /* number of points since last output */
- uint16_t x_period; /* requested period of output */
- uint16_t x_realperiod; /* period rounded up to vecsize multiple */
- uint16_t x_npoints; /* analysis window size in samples */
- float x_result; /* result to output */
- float x_sumbuf[MAXOVERLAP]; /* summing buffer */
- float x_f;
- uint16_t windowSize, hopSize, blockSize;
- uint16_t x_allocforvs; /* extra buffer for DSP vector size */
- } _tEnvPD;
-
- typedef _tEnvPD* tEnvPD;
-
- void tEnvPD_init (tEnvPD* const, int windowSize, int hopSize, int blockSize);
- void tEnvPD_free (tEnvPD* const);
- void tEnvPD_initToPool (tEnvPD* const, int windowSize, int hopSize, int blockSize, tMempool* const);
- void tEnvPD_freeFromPool (tEnvPD* const, tMempool* const);
-
- float tEnvPD_tick (tEnvPD* const);
- void tEnvPD_processBlock (tEnvPD* const, float* in);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* tAttackDetection */
-#define DEFBLOCKSIZE 1024
-#define DEFTHRESHOLD 6
-#define DEFATTACK 10
-#define DEFRELEASE 10
-
- typedef struct _tAttackDetection
- {
- float env;
-
- //Attack & Release times in msec
- int atk;
- int rel;
-
- //Attack & Release coefficients based on times
- float atk_coeff;
- float rel_coeff;
-
- int blocksize;
- int samplerate;
-
- //RMS amplitude of previous block - used to decide if attack is present
- float prevAmp;
-
- float threshold;
- } _tAttackDetection;
-
- typedef _tAttackDetection* tAttackDetection;
-
- void tAttackDetection_init (tAttackDetection* const, int blocksize, int atk, int rel);
- void tAttackDetection_free (tAttackDetection* const);
- void tAttackDetection_initToPool (tAttackDetection* const, int blocksize, int atk, int rel, tMempool* const);
- void tAttackDetection_freeFromPool (tAttackDetection* const, tMempool* const);
-
- // set expected input blocksize
- void tAttackDetection_setBlocksize (tAttackDetection* const, int size);
-
- // change atkDetector sample rate
- void tAttackDetection_setSamplerate (tAttackDetection* const, int inRate);
-
- // set attack time and coeff
- void tAttackDetection_setAttack (tAttackDetection* const, int inAtk);
-
- // set release time and coeff
- void tAttackDetection_setRelease (tAttackDetection* const, int inRel);
-
- // set level above which values are identified as attacks
- void tAttackDetection_setThreshold (tAttackDetection* const, float thres);
-
- // find largest transient in input block, return index of attack
- int tAttackDetection_detect (tAttackDetection* const, float *in);
-
- //==============================================================================
-
- // tSNAC: period detector
- // from Katja Vetters http://www.katjaas.nl/helmholtz/helmholtz.html
-#define SNAC_FRAME_SIZE 1024 // default analysis framesize // should be the same as (or smaller than?) PS_FRAME_SIZE
-#define DEFOVERLAP 1 // default overlap
-#define DEFBIAS 0.2f // default bias
-#define DEFMINRMS 0.003f // default minimum RMS
-#define SEEK 0.85f // seek-length as ratio of framesize
-
- typedef struct _tSNAC
- {
- float* inputbuf;
- float* processbuf;
- float* spectrumbuf;
- float* biasbuf;
- uint16_t timeindex;
- uint16_t framesize;
- uint16_t overlap;
- uint16_t periodindex;
-
- float periodlength;
- float fidelity;
- float biasfactor;
- float minrms;
-
- } _tSNAC;
-
- typedef _tSNAC* tSNAC;
-
- void tSNAC_init (tSNAC* const, int overlaparg);
- void tSNAC_free (tSNAC* const);
- void tSNAC_initToPool (tSNAC* const, int overlaparg, tMempool* const);
- void tSNAC_freeFromPool (tSNAC* const, tMempool* const);
-
- void tSNAC_ioSamples (tSNAC *s, float *in, float *out, int size);
- void tSNAC_setOverlap (tSNAC *s, int lap);
- void tSNAC_setBias (tSNAC *s, float bias);
- void tSNAC_setMinRMS (tSNAC *s, float rms);
-
- /*To get freq, perform SAMPLE_RATE/snac_getperiod() */
- float tSNAC_getPeriod (tSNAC *s);
- float tSNAC_getFidelity (tSNAC *s);
-
-#define DEFPITCHRATIO 2.0f
-#define DEFTIMECONSTANT 100.0f
-#define DEFHOPSIZE 64
-#define DEFWINDOWSIZE 64
-#define FBA 20
-#define HPFREQ 40.0f
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
- // Period detection
- typedef struct _tPeriodDetection
- {
- tEnvPD env;
- tSNAC snac;
- float* inBuffer;
- float* outBuffer;
- int frameSize;
- int bufSize;
- int framesPerBuffer;
- int curBlock;
- int lastBlock;
- int i;
- int indexstore;
- int iLast;
- int index;
- float period;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float timeConstant;
- float radius;
- float max;
- float lastmax;
- float deltamax;
-
- float fidelityThreshold;
-
- } _tPeriodDetection;
-
- typedef _tPeriodDetection* tPeriodDetection;
-
- void tPeriodDetection_init (tPeriodDetection* const, float* in, float* out, int bufSize, int frameSize);
- void tPeriodDetection_free (tPeriodDetection* const);
- void tPeriodDetection_initToPool (tPeriodDetection* const, float* in, float* out, int bufSize, int frameSize, tMempool* const);
- void tPeriodDetection_freeFromPool (tPeriodDetection* const, tMempool* const);
-
- float tPeriodDetection_tick (tPeriodDetection* const, float sample);
- float tPeriodDetection_getPeriod (tPeriodDetection* const);
- void tPeriodDetection_setHopSize (tPeriodDetection* const, int hs);
- void tPeriodDetection_setWindowSize (tPeriodDetection* const, int ws);
- void tPeriodDetection_setFidelityThreshold(tPeriodDetection* const, float threshold);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_ANALYSIS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-delay.h
+++ /dev/null
@@ -1,221 +1,0 @@
-/*==============================================================================
-
- leaf-delay.h
- Created: 20 Jan 2017 12:01:24pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_DELAY_H_INCLUDED
-#define LEAF_DELAY_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-
- //==============================================================================
-
- /* Non-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t delay, maxDelay;
-
- } _tDelay;
-
- typedef _tDelay* tDelay;
-
- void tDelay_init (tDelay* const, uint32_t delay, uint32_t maxDelay);
- void tDelay_free (tDelay* const);
- void tDelay_initToPool (tDelay* const, uint32_t delay, uint32_t maxDelay, tMempool* const);
- void tDelay_freeFromPool (tDelay* const, tMempool* const);
-
- void tDelay_clear (tDelay* const);
- int tDelay_setDelay (tDelay* const, uint32_t delay);
- uint32_t tDelay_getDelay (tDelay* const);
- void tDelay_tapIn (tDelay* const, float in, uint32_t tapDelay);
- float tDelay_tapOut (tDelay* const, uint32_t tapDelay);
- float tDelay_addTo (tDelay* const, float value, uint32_t tapDelay);
- float tDelay_tick (tDelay* const, float sample);
- float tDelay_getLastOut (tDelay* const);
- float tDelay_getLastIn (tDelay* const);
-
- //==============================================================================
-
- /* Linearly-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tLinearDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha;
-
- } _tLinearDelay;
-
- typedef _tLinearDelay* tLinearDelay;
-
- void tLinearDelay_init (tLinearDelay* const, float delay, uint32_t maxDelay);
- void tLinearDelay_free (tLinearDelay* const);
- void tLinearDelay_initToPool (tLinearDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tLinearDelay_freeFromPool(tLinearDelay* const, tMempool* const);
- void tLinearDelay_clear (tLinearDelay* const dl);
- int tLinearDelay_setDelay (tLinearDelay* const, float delay);
- float tLinearDelay_getDelay (tLinearDelay* const);
- void tLinearDelay_tapIn (tLinearDelay* const, float in, uint32_t tapDelay);
- float tLinearDelay_tapOut (tLinearDelay* const, uint32_t tapDelay);
- float tLinearDelay_addTo (tLinearDelay* const, float value, uint32_t tapDelay);
- float tLinearDelay_tick (tLinearDelay* const, float sample);
- void tLinearDelay_tickIn (tLinearDelay* const, float input);
- float tLinearDelay_tickOut (tLinearDelay* const);
- float tLinearDelay_getLastOut (tLinearDelay* const);
- float tLinearDelay_getLastIn (tLinearDelay* const);
-
-
-
- //==============================================================================
-
- /* Hermite-interpolating delay, created by adapting STK linear delay with Hermite interpolation */
- typedef struct _tHermiteDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha;
-
- } _tHermiteDelay;
-
- typedef _tHermiteDelay* tHermiteDelay;
-
- void tHermiteDelay_init (tHermiteDelay* const dl, float delay, uint32_t maxDelay);
- void tHermiteDelay_free (tHermiteDelay* const dl);
- void tHermiteDelay_initToPool (tHermiteDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp);
- void tHermiteDelay_freeFromPool (tHermiteDelay* const dl, tMempool* const mp);
- void tHermiteDelay_clear (tHermiteDelay* const dl);
- float tHermiteDelay_tick (tHermiteDelay* const dl, float input);
- void tHermiteDelay_tickIn (tHermiteDelay* const dl, float input);
- float tHermiteDelay_tickOut (tHermiteDelay* const dl);
- int tHermiteDelay_setDelay (tHermiteDelay* const dl, float delay);
- float tHermiteDelay_tapOut (tHermiteDelay* const dl, uint32_t tapDelay);
- void tHermiteDelay_tapIn (tHermiteDelay* const dl, float value, uint32_t tapDelay);
- float tHermiteDelay_addTo (tHermiteDelay* const dl, float value, uint32_t tapDelay);
- float tHermiteDelay_getDelay (tHermiteDelay* const dl);
- float tHermiteDelay_getLastOut (tHermiteDelay* const dl);
- float tHermiteDelay_getLastIn (tHermiteDelay* const dl);
- void tHermiteDelay_setGain (tHermiteDelay* const dl, float gain);
- float tHermiteDelay_getGain (tHermiteDelay* const dl);
-
-
- //==============================================================================
-
- /* Allpass-interpolating delay, reimplemented from STK (Cook and Scavone). */
- typedef struct _tAllpassDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint, outPoint;
-
- uint32_t maxDelay;
-
- float delay;
-
- float alpha, omAlpha, coeff;
-
- float apInput;
-
- } _tAllpassDelay;
-
- typedef _tAllpassDelay* tAllpassDelay;
-
- void tAllpassDelay_init (tAllpassDelay* const, float delay, uint32_t maxDelay);
- void tAllpassDelay_free (tAllpassDelay* const);
- void tAllpassDelay_initToPool (tAllpassDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tAllpassDelay_freeFromPool(tAllpassDelay* const, tMempool* const);
-
- void tAllpassDelay_clear (tAllpassDelay* const);
- int tAllpassDelay_setDelay (tAllpassDelay* const, float delay);
- float tAllpassDelay_getDelay (tAllpassDelay* const);
- void tAllpassDelay_tapIn (tAllpassDelay* const, float in, uint32_t tapDelay);
- float tAllpassDelay_tapOut (tAllpassDelay* const, uint32_t tapDelay);
- float tAllpassDelay_addTo (tAllpassDelay* const, float value, uint32_t tapDelay);
- float tAllpassDelay_tick (tAllpassDelay* const, float sample);
- float tAllpassDelay_getLastOut (tAllpassDelay* const);
- float tAllpassDelay_getLastIn (tAllpassDelay* const);
-
- //==============================================================================
-
- /* Linear interpolating delay with fixed read and write pointers, variable rate. */
- typedef struct _tTapeDelay
- {
- float gain;
- float* buff;
-
- float lastOut, lastIn;
-
- uint32_t inPoint;
-
- uint32_t maxDelay;
-
- float delay, inc, idx;
-
- float apInput;
-
- } _tTapeDelay;
-
- typedef _tTapeDelay* tTapeDelay;
-
- void tTapeDelay_init (tTapeDelay* const, float delay, uint32_t maxDelay);
- void tTapeDelay_free (tTapeDelay* const);
- void tTapeDelay_initToPool (tTapeDelay* const, float delay, uint32_t maxDelay, tMempool* const);
- void tTapeDelay_freeFromPool(tTapeDelay* const, tMempool* const);
-
- void tTapeDelay_clear (tTapeDelay* const);
- void tTapeDelay_setDelay (tTapeDelay* const, float delay);
- float tTapeDelay_getDelay (tTapeDelay* const);
- void tTapeDelay_tapIn (tTapeDelay* const, float in, uint32_t tapDelay);
- float tTapeDelay_tapOut (tTapeDelay* const d, float tapDelay);
- float tTapeDelay_addTo (tTapeDelay* const, float value, uint32_t tapDelay);
- float tTapeDelay_tick (tTapeDelay* const, float sample);
- void tTapeDelay_incrementInPoint(tTapeDelay* const dl);
- float tTapeDelay_getLastOut (tTapeDelay* const);
- float tTapeDelay_getLastIn (tTapeDelay* const);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DELAY_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-distortion.h
+++ /dev/null
@@ -1,148 +1,0 @@
-/*==============================================================================
-
- leaf-distortion.h
- Created: 25 Oct 2019 10:23:28am
- Author: Matthew Wang
-
- ==============================================================================*/
-
-#ifndef LEAF_DISTORTION_H_INCLUDED
-#define LEAF_DISTORTION_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-
- //==============================================================================
-
- typedef struct _tSampleReducer
- {
- float invRatio;
- float hold;
- uint32_t count;
- } _tSampleReducer;
-
- typedef _tSampleReducer* tSampleReducer;
-
- void tSampleReducer_init (tSampleReducer* const);
- void tSampleReducer_free (tSampleReducer* const);
- void tSampleReducer_initToPool (tSampleReducer* const, tMempool* const);
- void tSampleReducer_freeFromPool (tSampleReducer* const, tMempool* const);
-
- float tSampleReducer_tick (tSampleReducer* const, float input);
-
- // sampling ratio
- void tSampleReducer_setRatio (tSampleReducer* const, float ratio);
-
- //==============================================================================
-
- typedef struct _tOversampler
- {
- int ratio;
- float* pCoeffs;
- float* upState;
- float* downState;
- int numTaps;
- int phaseLength;
- } _tOversampler;
-
- typedef _tOversampler* tOversampler;
-
- void tOversampler_init (tOversampler* const, int order, oBool extraQuality);
- void tOversampler_free (tOversampler* const);
- void tOversampler_initToPool (tOversampler* const, int order, oBool extraQuality, tMempool* const);
- void tOversampler_freeFromPool (tOversampler* const, tMempool* const);
-
- void tOversampler_upsample (tOversampler* const, float input, float* output);
- float tOversampler_downsample (tOversampler* const os, float* input);
- float tOversampler_tick (tOversampler* const, float input, float (*effectTick)(float));
- int tOversampler_getLatency (tOversampler* const os);
-
- //==============================================================================
-
- /* tLockhartWavefolder */
-
- typedef struct _tLockhartWavefolder
- {
- double Ln1;
- double Fn1;
- float xn1;
-
- double RL;
- double R;
- double VT;
- double Is;
-
- double a;
- double b;
- double d;
-
- // Antialiasing error threshold
- double thresh;
- double half_a;
- double longthing;
-
- } _tLockhartWavefolder;
-
- typedef _tLockhartWavefolder* tLockhartWavefolder;
-
- void tLockhartWavefolder_init (tLockhartWavefolder* const);
- void tLockhartWavefolder_free (tLockhartWavefolder* const);
- void tLockhartWavefolder_initToPool (tLockhartWavefolder* const, tMempool* const);
- void tLockhartWavefolder_freeFromPool (tLockhartWavefolder* const, tMempool* const);
-
- float tLockhartWavefolder_tick (tLockhartWavefolder* const, float samp);
-
- //==============================================================================
-
- typedef struct _tCrusher
- {
- float srr;
- float mult, div;
- float rnd;
-
- uint32_t op; //which bitwise operation (0-7)
-
- float gain;
- tSampleReducer sReducer;
-
- } _tCrusher;
-
- typedef _tCrusher* tCrusher;
-
- void tCrusher_init (tCrusher* const);
- void tCrusher_free (tCrusher* const);
- void tCrusher_initToPool (tCrusher* const, tMempool* const);
- void tCrusher_freeFromPool (tCrusher* const, tMempool* const);
-
- float tCrusher_tick (tCrusher* const, float input);
-
- // 0.0 - 1.0
- void tCrusher_setOperation (tCrusher* const, float op);
-
- // 0.0 - 1.0
- void tCrusher_setQuality (tCrusher* const, float val);
-
- // what division to round to
- void tCrusher_setRound (tCrusher* const, float rnd);
-
- // sampling ratio
- void tCrusher_setSamplingRatio (tCrusher* const, float ratio);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DISTORTION_H_INCLUDED
-
-//==============================================================================
-
-
--- a/LEAF/Inc/leaf-dynamics.h
+++ /dev/null
@@ -1,90 +1,0 @@
-/*==============================================================================
-
- leaf-dynamics.h
- Created: 30 Nov 2018 11:57:05am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_DYNAMICS_H_INCLUDED
-#define LEAF_DYNAMICS_H_INCLUDED
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-analysis.h"
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Compressor */
- typedef struct _tCompressor
- {
- float tauAttack, tauRelease;
- float T, R, W, M; // Threshold, compression Ratio, decibel Width of knee transition, decibel Make-up gain
-
- float x_G[2], y_G[2], x_T[2], y_T[2];
-
- oBool isActive;
-
- } _tCompressor;
-
- typedef _tCompressor* tCompressor;
-
- void tCompressor_init (tCompressor* const);
- void tCompressor_free (tCompressor* const);
- void tCompressor_initToPool (tCompressor* const, tMempool* const);
- void tCompressor_freeFromPool(tCompressor* const, tMempool* const);
-
- float tCompressor_tick (tCompressor* const, float input);
-
- ///
- /* Feedback leveller */
- // An auto VCA that you put into a feedback circuit to make it stay at the same level.
- // It can enforce level bidirectionally (amplifying and attenuating as needed) or
- // just attenutating. The former option allows for infinite sustain strings, for example, while
- // The latter option allows for decaying strings, which can never exceed
- // a specific level.
-
- typedef struct _tFeedbackLeveler {
- float targetLevel; // target power level
- float strength; // how strongly level difference affects the VCA
- int mode; // 0 for upwards limiting only, 1 for biderctional limiting
- float curr;
- tPowerFollower pwrFlw; // internal power follower needed for level tracking
-
- } _tFeedbackLeveler;
-
- typedef _tFeedbackLeveler* tFeedbackLeveler;
-
- void tFeedbackLeveler_init (tFeedbackLeveler* const, float targetLevel, float factor, float strength, int mode);
- void tFeedbackLeveler_free (tFeedbackLeveler* const);
- void tFeedbackLeveler_initToPool (tFeedbackLeveler* const, float targetLevel, float factor, float strength, int mode, tMempool* const);
- void tFeedbackLeveler_freeFromPool (tFeedbackLeveler* const, tMempool* const);
-
- float tFeedbackLeveler_tick (tFeedbackLeveler* const, float input);
- float tFeedbackLeveler_sample (tFeedbackLeveler* const);
- void tFeedbackLeveler_setTargetLevel (tFeedbackLeveler* const, float TargetLevel);
- void tFeedbackLeveler_setFactor (tFeedbackLeveler* const, float factor);
- void tFeedbackLeveler_setMode (tFeedbackLeveler* const, int mode); // 0 for upwards limiting only, 1 for biderctional limiting
- void tFeedbackLeveler_setStrength (tFeedbackLeveler* const, float strength);
-
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_DYNAMICS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-effects.h
+++ /dev/null
@@ -1,316 +1,0 @@
-/*==============================================================================
-
- leaf-effects.h
- Created: 20 Jan 2017 12:01:54pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_EFFECTS_H_INCLUDED
-#define LEAF_EFFECTS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-dynamics.h"
-#include "leaf-analysis.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- /* tTalkbox */
-#define NUM_TALKBOX_PARAM 4
-
- typedef struct _tTalkbox
- {
- float param[NUM_TALKBOX_PARAM];
-
- int bufsize;
- float* car0;
- float* car1;
- float* window;
- float* buf0;
- float* buf1;
-
- float emphasis;
- int32_t K, N, O, pos;
- float wet, dry, FX;
- float d0, d1, d2, d3, d4;
- float u0, u1, u2, u3, u4;
-
- } _tTalkbox;
-
- typedef _tTalkbox* tTalkbox;
-
- void tTalkbox_init (tTalkbox* const, int bufsize);
- void tTalkbox_free (tTalkbox* const);
- void tTalkbox_initToPool (tTalkbox* const, int bufsize, tMempool* const);
- void tTalkbox_freeFromPool (tTalkbox* const, tMempool* const);
-
- float tTalkbox_tick (tTalkbox* const, float synth, float voice);
- void tTalkbox_update (tTalkbox* const);
- void tTalkbox_suspend (tTalkbox* const);
- void tTalkbox_lpcDurbin (float *r, int p, float *k, float *g);
- void tTalkbox_lpc (float *buf, float *car, int32_t n, int32_t o);
- void tTalkbox_setQuality (tTalkbox* const, float quality);
-
- //==============================================================================
-
- /* tVocoder */
-#define NUM_VOCODER_PARAM 8
-#define NBANDS 16
-
- typedef struct _tVocoder
- {
- float param[NUM_VOCODER_PARAM];
-
- float gain; //output level
- float thru, high; //hf thru
- float kout; //downsampled output
- int32_t kval; //downsample counter
- int32_t nbnd; //number of bands
-
- //filter coeffs and buffers - seems it's faster to leave this global than make local copy
- float f[NBANDS][13]; //[0-8][0 1 2 | 0 1 2 3 | 0 1 2 3 | val rate]
-
- } _tVocoder;
-
- typedef _tVocoder* tVocoder;
-
- void tVocoder_init (tVocoder* const);
- void tVocoder_free (tVocoder* const);
- void tVocoder_initToPool (tVocoder* const, tMempool* const);
- void tVocoder_freeFromPool (tVocoder* const, tMempool* const);
-
- float tVocoder_tick (tVocoder* const, float synth, float voice);
- void tVocoder_update (tVocoder* const);
- void tVocoder_suspend (tVocoder* const);
-
- //==============================================================================
-
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* tSOLAD : pitch shifting algorithm that underlies tRetune etc */
- // from Katja Vetters http://www.katjaas.nl/pitchshiftlowlatency/pitchshiftlowlatency.html
-#define LOOPSIZE (2048*2) // (4096*2) // loop size must be power of two
-#define LOOPMASK (LOOPSIZE - 1)
-#define PITCHFACTORDEFAULT 1.0f
-#define INITPERIOD 64.0f
-#define MAXPERIOD (float)((LOOPSIZE - w->blocksize) * 0.8f)
-#define MINPERIOD 8.0f
-
- typedef struct _tSOLAD
- {
- uint16_t timeindex; // current reference time, write index
- uint16_t blocksize; // signal input / output block size
- float pitchfactor; // pitch factor between 0.25 and 4
- float readlag; // read pointer's lag behind write pointer
- float period; // period length in input signal
- float jump; // read pointer jump length and direction
- float xfadelength; // crossfade length expressed at input sample rate
- float xfadevalue; // crossfade phase and value
-
- float* delaybuf;
-
- } _tSOLAD;
-
- typedef _tSOLAD* tSOLAD;
-
- void tSOLAD_init (tSOLAD* const);
- void tSOLAD_free (tSOLAD* const);
- void tSOLAD_initToPool (tSOLAD* const, tMempool* const);
- void tSOLAD_freeFromPool (tSOLAD* const, tMempool* const);
-
- // send one block of input samples, receive one block of output samples
- void tSOLAD_ioSamples (tSOLAD *w, float* in, float* out, int blocksize);
- // set periodicity analysis data
- void tSOLAD_setPeriod (tSOLAD *w, float period);
- // set pitch factor between 0.25 and 4
- void tSOLAD_setPitchFactor (tSOLAD *w, float pitchfactor);
- // force readpointer lag
- void tSOLAD_setReadLag (tSOLAD *w, float readlag);
- // reset state variables
- void tSOLAD_resetState (tSOLAD *w);
-
- // Pitch shift
- typedef struct _tPitchShift
- {
- tSOLAD sola;
- tHighpass hp;
- tPeriodDetection* p;
-
- float* outBuffer;
- int frameSize;
- int bufSize;
-
- int framesPerBuffer;
- int curBlock;
- int lastBlock;
- int index;
-
- float pitchFactor;
- float timeConstant;
- float radius;
- } _tPitchShift;
-
- typedef _tPitchShift* tPitchShift;
-
- void tPitchShift_init (tPitchShift* const, tPeriodDetection* const, float* out, int bufSize);
- void tPitchShift_free (tPitchShift* const);
- void tPitchShift_initToPool (tPitchShift* const, tPeriodDetection* const, float* out, int bufSize, tMempool* const);
- void tPitchShift_freeFromPool (tPitchShift* const, tMempool* const);
-
- float tPitchShift_shift (tPitchShift* const);
- float tPitchShift_shiftToFunc (tPitchShift* const, float (*fun)(float));
- float tPitchShift_shiftToFreq (tPitchShift* const, float freq);
- void tPitchShift_setPitchFactor (tPitchShift* const, float pf);
-
- // Retune
- typedef struct _tRetune
- {
- tPeriodDetection pd;
- tPitchShift* ps;
-
- float* inBuffer;
- float** outBuffers;
- float* tickOutput;
- int frameSize;
- int bufSize;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float* pitchFactor;
- float timeConstant;
- float radius;
-
- float inputPeriod;
-
- int numVoices;
- } _tRetune;
-
- typedef _tRetune* tRetune;
-
- void tRetune_init (tRetune* const, int numVoices, int bufSize, int frameSize);
- void tRetune_free (tRetune* const);
- void tRetune_initToPool (tRetune* const, int numVoices, int bufSize, int frameSize, tMempool* const);
- void tRetune_freeFromPool (tRetune* const, tMempool* const);
-
- float* tRetune_tick (tRetune* const, float sample);
- void tRetune_setNumVoices (tRetune* const, int numVoices);
- void tRetune_setPitchFactors (tRetune* const, float pf);
- void tRetune_setPitchFactor (tRetune* const, float pf, int voice);
- void tRetune_setTimeConstant (tRetune* const, float tc);
- void tRetune_setHopSize (tRetune* const, int hs);
- void tRetune_setWindowSize (tRetune* const, int ws);
- void tRetune_setFidelityThreshold(tRetune* const, float threshold);
- float tRetune_getInputPeriod (tRetune* const);
- float tRetune_getInputFreq (tRetune* const);
-
- // Autotune
- typedef struct _tAutotune
- {
- tPeriodDetection pd;
- tPitchShift* ps;
-
- float* inBuffer;
- float** outBuffers;
- float* tickOutput;
- int frameSize;
- int bufSize;
-
- uint16_t hopSize;
- uint16_t windowSize;
- uint8_t fba;
-
- float* freq;
- float timeConstant;
- float radius;
-
- float inputPeriod;
-
- int numVoices;
- } _tAutotune;
-
- typedef _tAutotune* tAutotune;
-
- void tAutotune_init (tAutotune* const, int numVoices, int bufSize, int frameSize);
- void tAutotune_free (tAutotune* const);
- void tAutotune_initToPool (tAutotune* const, int numVoices, int bufSize, int frameSize, tMempool* const);
- void tAutotune_freeFromPool (tAutotune* const, tMempool* const);
-
- float* tAutotune_tick (tAutotune* const, float sample);
- void tAutotune_setNumVoices (tAutotune* const, int numVoices);
- void tAutotune_setFreqs (tAutotune* const, float f);
- void tAutotune_setFreq (tAutotune* const, float f, int voice);
- void tAutotune_setTimeConstant (tAutotune* const, float tc);
- void tAutotune_setHopSize (tAutotune* const, int hs);
- void tAutotune_setWindowSize (tAutotune* const, int ws);
- void tAutotune_setFidelityThreshold (tAutotune* const, float threshold);
- float tAutotune_getInputPeriod (tAutotune* const);
- float tAutotune_getInputFreq (tAutotune* const);
-
- //==============================================================================
-
-
- typedef struct _tFormantShifter
- {
- int ford;
- float falph;
- float flamb;
- float* fk;
- float* fb;
- float* fc;
- float* frb;
- float* frc;
- float* fsig;
- float* fsmooth;
- float fhp;
- float flp;
- float flpa;
- float* fbuff;
- float* ftvec;
- float fmute;
- float fmutealph;
- unsigned int cbi;
- float shiftFactor;
- float intensity, invIntensity;
- tHighpass hp;
- tHighpass hp2;
- tFeedbackLeveler fbl1;
- tFeedbackLeveler fbl2;
-
- } _tFormantShifter;
-
- typedef _tFormantShifter* tFormantShifter;
-
- void tFormantShifter_init (tFormantShifter* const, int order);
- void tFormantShifter_free (tFormantShifter* const);
- void tFormantShifter_initToPool (tFormantShifter* const, int order, tMempool* const);
- void tFormantShifter_freeFromPool (tFormantShifter* const, tMempool* const);
-
- float tFormantShifter_tick (tFormantShifter* const, float input);
- float tFormantShifter_remove (tFormantShifter* const, float input);
- float tFormantShifter_add (tFormantShifter* const, float input);
- void tFormantShifter_ioSamples (tFormantShifter* const, float* in, float* out, int size, float fwarp);
- void tFormantShifter_setShiftFactor (tFormantShifter* const, float shiftFactor);
- void tFormantShifter_setIntensity (tFormantShifter* const, float intensity);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_EFFECTS_H_INCLUDED
-
-//==============================================================================
--- a/LEAF/Inc/leaf-electrical.h
+++ /dev/null
@@ -1,95 +1,0 @@
-/*
- * leaf-electrical.h
- *
- * Created on: Sep 25, 2019
- * Author: jeffsnyder
- */
-
-#ifndef LEAF_INC_LEAF_ELECTRICAL_H_
-#define LEAF_INC_LEAF_ELECTRICAL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-
- //==============================================================================
-
- typedef enum WDFComponentType
- {
- SeriesAdaptor = 0,
- ParallelAdaptor,
- Resistor,
- Capacitor,
- Inductor,
- Inverter,
- ResistiveSource,
- IdealSource,
- Diode,
- DiodePair,
- RootNil,
- WDFComponentNil
- } WDFComponentType;
-
- typedef struct _tWDF _tWDF; // needed to allow tWDF pointers in struct
- typedef _tWDF* tWDF;
- struct _tWDF
- {
- WDFComponentType type;
- float port_resistance_up;
- float port_resistance_left;
- float port_resistance_right;
- float port_conductance_up;
- float port_conductance_left;
- float port_conductance_right;
- float incident_wave_up;
- float incident_wave_left;
- float incident_wave_right;
- float reflected_wave_up;
- float reflected_wave_left;
- float reflected_wave_right;
- float gamma_zero;
- float sample_rate;
- float value;
- tWDF* child_left;
- tWDF* child_right;
- float (*get_port_resistance)(tWDF* const);
- float (*get_reflected_wave_up)(tWDF* const, float);
- float (*get_reflected_wave_down)(tWDF* const, float, float);
- void (*set_incident_wave)(tWDF* const, float, float);
- };
-
- //WDF Linear Components
- void tWDF_init (tWDF* const, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR);
- void tWDF_free (tWDF* const);
- void tWDF_initToPool (tWDF* const, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR, tMempool* const);
- void tWDF_freeFromPool (tWDF* const, tMempool* const);
-
- float tWDF_tick (tWDF* const, float sample, tWDF* const outputPoint, uint8_t paramsChanged);
-
- void tWDF_setValue (tWDF* const, float value);
- void tWDF_setSampleRate (tWDF* const, float sample_rate);
- uint8_t tWDF_isLeaf (tWDF* const);
-
- float tWDF_getPortResistance (tWDF* const);
- float tWDF_getReflectedWaveUp (tWDF* const, float input); //for tree, only uses input for resistive source
- float tWDF_getReflectedWaveDown (tWDF* const, float input, float incident_wave); //for roots
- void tWDF_setIncidentWave (tWDF* const, float incident_wave, float input);
-
- float tWDF_getVoltage (tWDF* const);
- float tWDF_getCurrent (tWDF* const);
-
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* LEAF_INC_LEAF_ELECTRICAL_H_ */
-
--- a/LEAF/Inc/leaf-envelopes.h
+++ /dev/null
@@ -1,154 +1,0 @@
-/*
- ==============================================================================
-
- leaf-envelopes.h
- Created: 20 Jan 2017 12:02:17pm
- Author: Michael R Mulshine
-
- ==============================================================================
- */
-
-#ifndef LEAF_ENVELOPES_H_INCLUDED
-#define LEAF_ENVELOPES_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-filters.h"
-#include "leaf-delay.h"
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Attack-Decay envelope */
- typedef struct _tEnvelope {
-
- const float *exp_buff;
- const float *inc_buff;
- uint32_t buff_size;
-
- float next;
-
- float attackInc, decayInc, rampInc;
-
- oBool inAttack, inDecay, inRamp;
-
- oBool loop;
-
- float gain, rampPeak;
-
- float attackPhase, decayPhase, rampPhase;
-
- } _tEnvelope;
-
- typedef _tEnvelope* tEnvelope;
-
- void tEnvelope_init (tEnvelope* const, float attack, float decay, oBool loop);
- void tEnvelope_free (tEnvelope* const);
- void tEnvelope_initToPool (tEnvelope* const, float attack, float decay, oBool loop, tMempool* const);
- void tEnvelope_freeFromPool (tEnvelope* const, tMempool* const);
-
- float tEnvelope_tick (tEnvelope* const);
- void tEnvelope_setAttack (tEnvelope* const, float attack);
- void tEnvelope_setDecay (tEnvelope* const, float decay);
- void tEnvelope_loop (tEnvelope* const, oBool loop);
- void tEnvelope_on (tEnvelope* const, float velocity);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* ADSR */
- typedef struct _tADSR
- {
- const float *exp_buff;
- const float *inc_buff;
- uint32_t buff_size;
-
- float next;
-
- float attackInc, decayInc, releaseInc, rampInc;
-
- oBool inAttack, inDecay, inSustain, inRelease, inRamp;
-
- float sustain, gain, rampPeak, releasePeak;
-
- float attackPhase, decayPhase, releasePhase, rampPhase;
-
- } _tADSR;
-
- typedef _tADSR* tADSR;
-
- void tADSR_init (tADSR* const, float attack, float decay, float sustain, float release);
- void tADSR_free (tADSR* const);
- void tADSR_initToPool (tADSR* const, float attack, float decay, float sustain, float release, tMempool* const);
- void tADSR_freeFromPool (tADSR* const, tMempool* const);
-
- float tADSR_tick (tADSR* const);
- void tADSR_setAttack (tADSR* const, float attack);
- void tADSR_setDecay (tADSR* const, float decay);
- void tADSR_setSustain (tADSR* const, float sustain);
- void tADSR_setRelease (tADSR* const, float release);
- void tADSR_on (tADSR* const, float velocity);
- void tADSR_off (tADSR* const);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Ramp */
- typedef struct _tRamp {
- float inc;
- float inv_sr_ms;
- float minimum_time;
- float curr,dest;
- float time;
- int samples_per_tick;
-
- } _tRamp;
-
- typedef _tRamp* tRamp;
-
- void tRamp_init (tRamp* const, float time, int samplesPerTick);
- void tRamp_free (tRamp* const);
- void tRamp_initToPool (tRamp* const, float time, int samplesPerTick, tMempool* const);
- void tRamp_freeFromPool (tRamp* const, tMempool* const);
-
- float tRamp_tick (tRamp* const);
- float tRamp_sample (tRamp* const);
- void tRamp_setTime (tRamp* const, float time);
- void tRamp_setDest (tRamp* const, float dest);
- void tRamp_setVal (tRamp* const, float val);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Exponential Smoother */
- typedef struct _tExpSmooth {
- float factor, oneminusfactor;
- float curr,dest;
-
- } _tExpSmooth;
-
- typedef _tExpSmooth* tExpSmooth;
-
- void tExpSmooth_init (tExpSmooth* const, float val, float factor);
- void tExpSmooth_free (tExpSmooth* const);
- void tExpSmooth_initToPool (tExpSmooth* const, float val, float factor, tMempool* const);
- void tExpSmooth_freeFromPool (tExpSmooth* const, tMempool* const);
-
- float tExpSmooth_tick (tExpSmooth* const);
- float tExpSmooth_sample (tExpSmooth* const);
- void tExpSmooth_setFactor (tExpSmooth* const, float factor);
- void tExpSmooth_setDest (tExpSmooth* const, float dest);
- void tExpSmooth_setVal (tExpSmooth* const, float val);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_ENVELOPES_H_INCLUDED
-
-
-
--- a/LEAF/Inc/leaf-filters.h
+++ /dev/null
@@ -1,358 +1,0 @@
-/*==============================================================================
-
- leaf-filters.h
- Created: 20 Jan 2017 12:01:10pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_FILTERS_H_INCLUDED
-#define LEAF_FILTERS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-tables.h"
-
- //==============================================================================
-
- /* tAllpass: Schroeder allpass. Comb-filter with feedforward and feedback. */
- typedef struct _tAllpass
- {
- float gain;
-
- tLinearDelay delay;
-
- float lastOut;
-
- } _tAllpass;
-
- typedef _tAllpass* tAllpass;
-
- void tAllpass_init (tAllpass* const, float initDelay, uint32_t maxDelay);
- void tAllpass_free (tAllpass* const);
- void tAllpass_initToPool (tAllpass* const, float initDelay, uint32_t maxDelay, tMempool* const);
- void tAllpass_freeFromPool (tAllpass* const, tMempool* const);
-
- float tAllpass_tick (tAllpass* const, float input);
- void tAllpass_setGain (tAllpass* const, float gain);
- void tAllpass_setDelay (tAllpass* const, float delay);
-
-
- //==============================================================================
-
- /* tOnePole: OnePole filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tOnePole
- {
- float gain;
- float a0,a1;
- float b0,b1;
- float lastIn, lastOut;
-
-
- } _tOnePole;
-
- typedef _tOnePole* tOnePole;
-
- void tOnePole_init (tOnePole* const, float thePole);
- void tOnePole_free (tOnePole* const);
- void tOnePole_initToPool (tOnePole* const, float thePole, tMempool* const);
- void tOnePole_freeFromPool (tOnePole* const, tMempool* const);
-
- float tOnePole_tick (tOnePole* const, float input);
- void tOnePole_setB0 (tOnePole* const, float b0);
- void tOnePole_setA1 (tOnePole* const, float a1);
- void tOnePole_setPole (tOnePole* const, float thePole);
- void tOnePole_setFreq (tOnePole* const, float freq);
- void tOnePole_setCoefficients(tOnePole* const, float b0, float a1);
- void tOnePole_setGain (tOnePole* const, float gain);
-
- //==============================================================================
-
- /* TwoPole filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tTwoPole
- {
- float gain;
- float a0, a1, a2;
- float b0;
-
- float radius, frequency;
- oBool normalize;
-
- float lastOut[2];
-
- } _tTwoPole;
-
- typedef _tTwoPole* tTwoPole;
-
- void tTwoPole_init (tTwoPole* const);
- void tTwoPole_free (tTwoPole* const);
- void tTwoPole_initToPool (tTwoPole* const, tMempool* const);
- void tTwoPole_freeFromPool (tTwoPole* const, tMempool* const);
-
- float tTwoPole_tick (tTwoPole* const, float input);
- void tTwoPole_setB0 (tTwoPole* const, float b0);
- void tTwoPole_setA1 (tTwoPole* const, float a1);
- void tTwoPole_setA2 (tTwoPole* const, float a2);
- void tTwoPole_setResonance (tTwoPole* const, float freq, float radius, oBool normalize);
- void tTwoPole_setCoefficients(tTwoPole* const, float b0, float a1, float a2);
- void tTwoPole_setGain (tTwoPole* const, float gain);
-
- //==============================================================================
-
- /* OneZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tOneZero
- {
- float gain;
- float b0,b1;
- float lastIn, lastOut, frequency;
-
- } _tOneZero;
-
- typedef _tOneZero* tOneZero;
-
- void tOneZero_init (tOneZero* const, float theZero);
- void tOneZero_free (tOneZero* const);
- void tOneZero_initToPool (tOneZero* const, float theZero, tMempool* const);
- void tOneZero_freeFromPool (tOneZero* const, tMempool* const);
-
- float tOneZero_tick (tOneZero* const, float input);
- void tOneZero_setB0 (tOneZero* const, float b0);
- void tOneZero_setB1 (tOneZero* const, float b1);
- void tOneZero_setZero (tOneZero* const, float theZero);
- void tOneZero_setCoefficients(tOneZero* const, float b0, float b1);
- void tOneZero_setGain (tOneZero* const, float gain);
- float tOneZero_getPhaseDelay (tOneZero *f, float frequency );
-
- //==============================================================================
-
- /* TwoZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tTwoZero
- {
- float gain;
- float b0, b1, b2;
-
- float frequency, radius;
-
- float lastIn[2];
-
- } _tTwoZero;
-
- typedef _tTwoZero* tTwoZero;
-
- void tTwoZero_init (tTwoZero* const);
- void tTwoZero_free (tTwoZero* const);
- void tTwoZero_initToPool (tTwoZero* const, tMempool* const);
- void tTwoZero_freeFromPool (tTwoZero* const, tMempool* const);
-
- float tTwoZero_tick (tTwoZero* const, float input);
- void tTwoZero_setB0 (tTwoZero* const, float b0);
- void tTwoZero_setB1 (tTwoZero* const, float b1);
- void tTwoZero_setB2 (tTwoZero* const, float b2);
- void tTwoZero_setNotch (tTwoZero* const, float frequency, float radius);
- void tTwoZero_setCoefficients(tTwoZero* const, float b0, float b1, float b2);
- void tTwoZero_setGain (tTwoZero* const, float gain);
-
- //==============================================================================
-
- /* PoleZero filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tPoleZero
- {
- float gain;
- float a0,a1;
- float b0,b1;
-
- float lastIn, lastOut;
-
- } _tPoleZero;
-
- typedef _tPoleZero* tPoleZero;
-
- void tPoleZero_init (tPoleZero* const);
- void tPoleZero_free (tPoleZero* const);
- void tPoleZero_initToPool (tPoleZero* const, tMempool* const);
- void tPoleZero_freeFromPool (tPoleZero* const, tMempool* const);
-
- float tPoleZero_tick (tPoleZero* const, float input);
- void tPoleZero_setB0 (tPoleZero* const, float b0);
- void tPoleZero_setB1 (tPoleZero* const, float b1);
- void tPoleZero_setA1 (tPoleZero* const, float a1);
- void tPoleZero_setCoefficients (tPoleZero* const, float b0, float b1, float a1);
- void tPoleZero_setAllpass (tPoleZero* const, float coeff);
- void tPoleZero_setBlockZero (tPoleZero* const, float thePole);
- void tPoleZero_setGain (tPoleZero* const, float gain);
-
- //==============================================================================
-
- /* BiQuad filter, reimplemented from STK (Cook and Scavone). */
- typedef struct _tBiQuad
- {
- float gain;
- float a0, a1, a2;
- float b0, b1, b2;
-
- float lastIn[2];
- float lastOut[2];
-
- float frequency, radius;
- oBool normalize;
- } _tBiQuad;
-
- typedef _tBiQuad* tBiQuad;
-
- void tBiQuad_init (tBiQuad* const);
- void tBiQuad_free (tBiQuad* const);
- void tBiQuad_initToPool (tBiQuad* const, tMempool* const);
- void tBiQuad_freeFromPool (tBiQuad* const, tMempool* const);
-
- float tBiQuad_tick (tBiQuad* const, float input);
- void tBiQuad_setB0 (tBiQuad* const, float b0);
- void tBiQuad_setB1 (tBiQuad* const, float b1);
- void tBiQuad_setB2 (tBiQuad* const, float b2);
- void tBiQuad_setA1 (tBiQuad* const, float a1);
- void tBiQuad_setA2 (tBiQuad* const, float a2);
- void tBiQuad_setNotch (tBiQuad* const, float freq, float radius);
- void tBiQuad_setResonance (tBiQuad* const, float freq, float radius, oBool normalize);
- void tBiQuad_setCoefficients(tBiQuad* const, float b0, float b1, float b2, float a1, float a2);
- void tBiQuad_setGain (tBiQuad* const, float gain);
-
- //==============================================================================
-
- /* State Variable Filter, algorithm from Andy Simper. */
- typedef enum SVFType
- {
- SVFTypeHighpass = 0,
- SVFTypeLowpass,
- SVFTypeBandpass,
- SVFTypeNotch,
- SVFTypePeak,
- } SVFType;
-
- typedef struct _tSVF
- {
- SVFType type;
- float cutoff, Q;
- float ic1eq,ic2eq;
- float g,k,a1,a2,a3;
-
- } _tSVF;
-
- typedef _tSVF* tSVF;
-
- void tSVF_init (tSVF* const, SVFType type, float freq, float Q);
- void tSVF_free (tSVF* const);
- void tSVF_initToPool (tSVF* const, SVFType type, float freq, float Q, tMempool* const);
- void tSVF_freeFromPool (tSVF* const, tMempool* const);
-
- float tSVF_tick (tSVF* const, float v0);
- void tSVF_setFreq (tSVF* const, float freq);
- void tSVF_setQ (tSVF* const, float Q);
-
- //==============================================================================
-
- /* Efficient State Variable Filter for 14-bit control input, [0, 4096). */
- typedef struct _tEfficientSVF
- {
- SVFType type;
- float cutoff, Q;
- float ic1eq,ic2eq;
- float g,k,a1,a2,a3;
-
- } _tEfficientSVF;
-
- typedef _tEfficientSVF* tEfficientSVF;
-
- void tEfficientSVF_init (tEfficientSVF* const, SVFType type, uint16_t input, float Q);
- void tEfficientSVF_free (tEfficientSVF* const);
- void tEfficientSVF_initToPool (tEfficientSVF* const, SVFType type, uint16_t input, float Q, tMempool* const);
- void tEfficientSVF_freeFromPool (tEfficientSVF* const, tMempool* const);
-
- float tEfficientSVF_tick (tEfficientSVF* const, float v0);
- void tEfficientSVF_setFreq (tEfficientSVF* const, uint16_t controlFreq);
- void tEfficientSVF_setQ (tEfficientSVF* const, float Q);
-
- //==============================================================================
-
- /* Simple Highpass filter. */
- typedef struct _tHighpass
- {
- float xs, ys, R;
- float frequency;
-
- } _tHighpass;
-
- typedef _tHighpass* tHighpass;
-
- void tHighpass_init (tHighpass* const, float freq);
- void tHighpass_free (tHighpass* const);
- void tHighpass_initToPool (tHighpass* const, float freq, tMempool* const);
- void tHighpass_freeFromPool (tHighpass* const, tMempool* const);
-
- float tHighpass_tick (tHighpass* const, float x);
- void tHighpass_setFreq (tHighpass* const, float freq);
- float tHighpass_getFreq (tHighpass* const);
-
- //==============================================================================
-
- // Butterworth Filter
-#define NUM_SVF_BW 16
- typedef struct _tButterworth
- {
- float gain;
-
- int N;
-
- tSVF low[NUM_SVF_BW];
- tSVF high[NUM_SVF_BW];
-
- float f1,f2;
-
- } _tButterworth;
-
- typedef _tButterworth* tButterworth;
-
- void tButterworth_init (tButterworth* const, int N, float f1, float f2);
- void tButterworth_free (tButterworth* const);
- void tButterworth_initToPool (tButterworth* const, int N, float f1, float f2, tMempool* const);
- void tButterworth_freeFromPool (tButterworth* const, tMempool* const);
-
- float tButterworth_tick (tButterworth* const, float input);
- void tButterworth_setF1 (tButterworth* const, float in);
- void tButterworth_setF2 (tButterworth* const, float in);
- void tButterworth_setFreqs (tButterworth* const, float f1, float f2);
-
- //==============================================================================
-
- typedef struct _tFIR
- {
- float* past;
- float* coeff;
- int numTaps;
- } _tFIR;
-
- typedef _tFIR* tFIR;
-
- void tFIR_init (tFIR* const, float* coeffs, int numTaps);
- void tFIR_free (tFIR* const);
- void tFIR_initToPool (tFIR* const, float* coeffs, int numTaps, tMempool* const);
- void tFIR_freeFromPool (tFIR* const, tMempool* const);
-
- float tFIR_tick (tFIR* const, float input);
- void tFIR_coeffs (tFIR* const, float in);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_FILTERS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-global.h
+++ /dev/null
@@ -1,39 +1,0 @@
-/*
- ==============================================================================
-
- leaf-global.h
- Created: 24 Oct 2019 2:24:38pm
- Author: Matthew Wang
-
- ==============================================================================
- */
-
-#ifndef LEAF_GLOBAL_H_INCLUDED
-#define LEAF_GLOBAL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- typedef struct _LEAF
- {
- float sampleRate;
- float invSampleRate;
- int blockSize;
- float twoPiTimesInvSampleRate;
- float (*random)(void);
- int clearOnAllocation;
- } LEAF;
-
- extern LEAF leaf; // The global instance of LEAF.
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_GLOBAL_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-instruments.h
+++ /dev/null
@@ -1,201 +1,0 @@
-/*==============================================================================
-
- leaf-instruments.h
- Created: 30 Nov 2018 10:24:44am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_INSTRUMENTS_H_INCLUDED
-#define LEAF_INSTRUMENTS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-oscillators.h"
-#include "leaf-filters.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- // 808 Cowbell
- typedef struct _t808Cowbell {
-
- tSquare p[2];
- tNoise stick;
- tSVF bandpassOsc;
- tSVF bandpassStick;
- tEnvelope envGain;
- tEnvelope envStick;
- tEnvelope envFilter;
- tHighpass highpass;
- float oscMix;
- float filterCutoff;
- oBool useStick;
-
- } _t808Cowbell;
-
- typedef _t808Cowbell* t808Cowbell;
-
- void t808Cowbell_init (t808Cowbell* const, int useStick);
- void t808Cowbell_free (t808Cowbell* const);
- void t808Cowbell_initToPool (t808Cowbell* const, int useStick, tMempool* const);
- void t808Cowbell_freeFromPool (t808Cowbell* const, tMempool* const);
-
- float t808Cowbell_tick (t808Cowbell* const);
- void t808Cowbell_on (t808Cowbell* const, float vel);
- void t808Cowbell_setDecay (t808Cowbell* const, float decay);
- void t808Cowbell_setHighpassFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setBandpassFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setFreq (t808Cowbell* const, float freq);
- void t808Cowbell_setOscMix (t808Cowbell* const, float oscMix);
- void t808Cowbell_setStick (t808Cowbell* const, int useStick);
-
- //==============================================================================
-
- // 808 Hihat
- typedef struct _t808Hihat {
-
- // 6 Square waves
- tSquare p[6];
- tNoise n;
- tSVF bandpassOsc;
- tSVF bandpassStick;
- tEnvelope envGain;
- tEnvelope envStick;
- tEnvelope noiseFMGain;
- tHighpass highpass;
- tNoise stick;
-
- float freq;
- float stretch;
- float FM_amount;
- float oscNoiseMix;
-
- } _t808Hihat;
-
- typedef _t808Hihat* t808Hihat;
-
- void t808Hihat_init (t808Hihat* const);
- void t808Hihat_free (t808Hihat* const);
- void t808Hihat_initToPool (t808Hihat* const, tMempool* const);
- void t808Hihat_freeFromPool (t808Hihat* const, tMempool* const);
-
- float t808Hihat_tick (t808Hihat* const);
- void t808Hihat_on (t808Hihat* const, float vel);
- void t808Hihat_setOscNoiseMix (t808Hihat* const, float oscNoiseMix);
- void t808Hihat_setDecay (t808Hihat* const, float decay);
- void t808Hihat_setHighpassFreq (t808Hihat* const, float freq);
- void t808Hihat_setOscBandpassFreq (t808Hihat* const, float freq);
- void t808Hihat_setOscBandpassQ (t808Hihat* const hihat, float Q);
- void t808Hihat_setStickBandPassFreq (t808Hihat* const, float freq);
- void t808Hihat_setStickBandPassQ (t808Hihat* const hihat, float Q);
- void t808Hihat_setOscFreq (t808Hihat* const, float freq);
- void t808Hihat_setStretch (t808Hihat* const hihat, float stretch);
- void t808Hihat_setFM (t808Hihat* const hihat, float FM_amount);
-
- //==============================================================================
-
- // 808 Snare
- typedef struct _t808Snare {
-
- // Tone 1, Tone 2, Noise
- tTriangle tone[2]; // Tri (not yet antialiased or wavetabled)
- tNoise noiseOsc;
- tSVF toneLowpass[2];
- tSVF noiseLowpass; // Lowpass from SVF filter
- tEnvelope toneEnvOsc[2];
- tEnvelope toneEnvGain[2];
- tEnvelope noiseEnvGain;
- tEnvelope toneEnvFilter[2];
- tEnvelope noiseEnvFilter;
-
- float toneGain[2];
- float noiseGain;
-
- float toneNoiseMix;
-
- float tone1Freq, tone2Freq;
-
- float noiseFilterFreq;
-
- } _t808Snare;
-
- typedef _t808Snare* t808Snare;
-
- void t808Snare_init (t808Snare* const);
- void t808Snare_free (t808Snare* const);
- void t808Snare_initToPool (t808Snare* const, tMempool* const);
- void t808Snare_freeFromPool (t808Snare* const, tMempool* const);
-
- float t808Snare_tick (t808Snare* const);
- void t808Snare_on (t808Snare* const, float vel);
- void t808Snare_setTone1Freq (t808Snare* const, float freq);
- void t808Snare_setTone2Freq (t808Snare* const, float freq);
- void t808Snare_setTone1Decay (t808Snare* const, float decay);
- void t808Snare_setTone2Decay (t808Snare* const, float decay);
- void t808Snare_setNoiseDecay (t808Snare* const, float decay);
- void t808Snare_setToneNoiseMix (t808Snare* const, float toneNoiseMix);
- void t808Snare_setNoiseFilterFreq (t808Snare* const, float noiseFilterFreq);
- void t808Snare_setNoiseFilterQ (t808Snare* const, float noiseFilterQ);
-
- //==============================================================================
-
- // 808 Kick
- typedef struct _t808Kick {
-
-
- tCycle tone; // Tri
- tNoise noiseOsc;
- tSVF toneLowpass;
- tEnvelope toneEnvOscChirp;
- tEnvelope toneEnvOscSigh;
- tEnvelope toneEnvGain;
- tEnvelope noiseEnvGain;
- tEnvelope toneEnvFilter;
-
- float toneGain;
- float noiseGain;
-
- float toneInitialFreq;
- float sighAmountInHz;
- float chirpRatioMinusOne;
- float noiseFilterFreq;
-
- } _t808Kick;
-
- typedef _t808Kick* t808Kick;
-
- void t808Kick_init (t808Kick* const);
- void t808Kick_free (t808Kick* const);
- void t808Kick_initToPool (t808Kick* const, tMempool* const);
- void t808Kick_freeFromPool (t808Kick* const, tMempool* const);
-
- float t808Kick_tick (t808Kick* const);
- void t808Kick_on (t808Kick* const, float vel);
- void t808Kick_setToneFreq (t808Kick* const, float freq);
- void t808Kick_setToneDecay (t808Kick* const, float decay);
- void t808Kick_setNoiseDecay (t808Kick* const, float decay);
- void t808Kick_setSighAmount (t808Kick* const, float sigh);
- void t808Kick_setChirpAmount (t808Kick* const, float chirp);
- void t808Kick_setToneNoiseMix (t808Kick* const, float toneNoiseMix);
- void t808Kick_setNoiseFilterFreq (t808Kick* const, float noiseFilterFreq);
- void t808Kick_setNoiseFilterQ (t808Kick* const, float noiseFilterQ);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_INSTRUMENTS_H_INCLUDED
-
-//==============================================================================
-
-
-
--- a/LEAF/Inc/leaf-math.h
+++ /dev/null
@@ -1,179 +1,0 @@
-/*==============================================================================
-
- leaf-math.h
- Created: 22 Jan 2017 7:02:56pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_MATH_H_INCLUDED
-#define LEAF_MATH_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "leaf-global.h"
-#include "math.h"
-#include "stdint.h"
-#include "stdlib.h"
-
- //==============================================================================
-
- //==============================================================================
-
- typedef enum oBool
- {
- OTRUE = 1,
- OFALSE = 0
- }oBool;
-
- // Allows for bitwise operations on floats
- union unholy_t { /* a union between a float and an integer */
- float f;
- int i;
- };
-
-#define SQRT8 2.82842712475f
-#define WSCALE 1.30612244898f
-#define PI (3.14159265358979f)
-#define TWO_PI (2 * PI)
-
-#define VSF 1.0e-38f
-
-#define MAX_DELAY 8192
-#define INV_128 0.0078125f
-
-#define INV_20 0.05f
-#define INV_40 0.025f
-#define INV_80 0.0125f
-#define INV_160 0.00625f
-#define INV_320 0.003125f
-#define INV_640 0.0015625f
-#define INV_1280 0.00078125f
-#define INV_2560 0.000390625f
-#define INV_5120 0.0001953125f
-#define INV_10240 0.00009765625f
-#define INV_20480 0.000048828125f
-
-
-#define INV_TWELVE 0.0833333333f
-#define INV_440 0.0022727273f
-
-#define LOG2 0.3010299957f
-#define INV_LOG2 3.321928095f
-
-#define SOS_M 343.0f
-#define TWO_TO_5 32.0f
-#define INV_TWO_TO_5 0.03125f
-#define TWO_TO_7 128.f
-#define INV_TWO_TO_7 0.0078125f
-#define TWO_TO_8 256.f
-#define INV_TWO_TO_8 0.00390625f
-#define TWO_TO_9 512.f
-#define INV_TWO_TO_9 0.001953125f
-#define TWO_TO_10 1024.f
-#define INV_TWO_TO_10 0.0009765625f
-#define TWO_TO_11 2048.f
-#define INV_TWO_TO_11 0.00048828125f
-#define TWO_TO_12 4096.f
-#define INV_TWO_TO_12 0.00024414062f
-#define TWO_TO_15 32768.f
-#define TWO_TO_16 65536.f
-#define INV_TWO_TO_15 0.00003051757f
-#define INV_TWO_TO_16 0.00001525878f
-#define TWO_TO_16_MINUS_ONE 65535.0f
-#define TWO_TO_23 8388608.0f
-#define INV_TWO_TO_23 0.00000011920929f
-#define TWO_TO_31 2147483648.0f
-#define INV_TWO_TO_31 0.000000000465661f
-#define TWO_TO_32 4294967296.0f
-#define INV_TWO_TO_32 0.000000000232831f
-
-
-#define LOGTEN 2.302585092994
-
- // Jones shaper
- float LEAF_shaper (float input, float m_drive);
- float LEAF_reedTable (float input, float offset, float slope);
-
- float LEAF_reduct (float input, float ratio);
- float LEAF_round (float input, float rnd);
- float LEAF_bitwise_xor(float input, uint32_t op);
-
- float LEAF_reduct (float input, float ratio);
- float LEAF_round (float input, float rnd);
- float LEAF_bitwise_xor(float input, uint32_t op);
-
- float LEAF_clip (float min, float val, float max);
- int LEAF_clipInt (int min, int val, int max);
- float LEAF_softClip (float val, float thresh);
- oBool LEAF_isPrime (uint64_t number );
-
- float LEAF_midiToFrequency (float f);
- float LEAF_frequencyToMidi(float f);
-
- void LEAF_generate_sine (float* buffer, int size);
- void LEAF_generate_sawtooth (float* buffer, float basefreq, int size);
- void LEAF_generate_triangle (float* buffer, float basefreq, int size);
- void LEAF_generate_square (float* buffer, float basefreq, int size);
-
- // dope af
- float LEAF_chebyshevT(float in, int n);
- float LEAF_CompoundChebyshevT(float in, int n, float* amps);
-
- // Hermite interpolation
- float LEAF_interpolate_hermite (float A, float B, float C, float D, float t);
- float LEAF_interpolate_hermite_x(float yy0, float yy1, float yy2, float yy3, float xx);
- float LEAF_interpolation_linear (float A, float B, float t);
-
- float interpolate3max(float *buf, const int peakindex);
- float interpolate3phase(float *buf, const int peakindex);
-
- // alternative implementation for abs()
- // REQUIRES: 32 bit integers
- int fastabs_int(int in);
-
- // alternative implementation for abs()
- // REQUIRES: 32 bit floats
- float fastabsf(float f);
-
- float fastexp2f(float f);
-
-
- void LEAF_crossfade(float fade, float* volumes);
-
-
-
- float fast_mtof(float f);
-
- float fastexpf(float x);
-
- float fasterexpf(float x);
-
- float mtof(float f);
-
- float fast_mtof(float f);
-
- float faster_mtof(float f);
-
- float ftom(float f);
-
- float powtodb(float f);
-
- float rmstodb(float f);
-
- float dbtopow(float f);
-
- float dbtorms(float f);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MATH_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-mempool.h
+++ /dev/null
@@ -1,127 +1,0 @@
-/*==============================================================================
-
- In short, mpool is distributed under so called "BSD license",
-
- Copyright (c) 2009-2010 Tatsuhiko Kubo <cubicdaiya@gmail.com>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * 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.
-
- * Neither the name of the authors 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 COPYRIGHT HOLDERS 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 COPYRIGHT
- OWNER 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.
-
- written by C99 style
- ==============================================================================*/
-
-#ifndef LEAF_MPOOL_H_INCLUDED
-#define LEAF_MPOOL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-
- //==============================================================================
-
-#define MPOOL_ALIGN_SIZE (8)
-
- //#define size_t unsigned long
-
- /**
- * memory pool structure
- */
-
- // node of free list
- typedef struct mpool_node_t {
- void *pool; // memory pool field
- struct mpool_node_t *next; // next node pointer
- struct mpool_node_t *prev; // prev node pointer
- size_t size;
- } mpool_node_t;
-
- typedef struct mpool_t {
- void* mpool; // start of the mpool
- size_t usize; // used size of the pool
- size_t msize; // max size of the pool
- mpool_node_t* head; // first node of memory pool free list
- } mpool_t;
-
- void mpool_create (char* memory, size_t size, mpool_t* pool);
-
- void* mpool_alloc(size_t size, mpool_t* pool);
- void* mpool_calloc(size_t asize, mpool_t* pool);
-
- void mpool_free(void* ptr, mpool_t* pool);
-
- size_t mpool_get_size(mpool_t* pool);
- size_t mpool_get_used(mpool_t* pool);
-
- void leaf_pool_init(char* memory, size_t size);
-
- void* leaf_alloc(size_t size);
- void* leaf_calloc(size_t size);
-
- void leaf_free(void* ptr);
-
- size_t leaf_pool_get_size(void);
- size_t leaf_pool_get_used(void);
-
- void* leaf_pool_get_pool(void);
-
- void leaf_mempool_overrun(void);
-
- // User object for creating additional mempools
-
- typedef struct _tMempool
- {
- mpool_t pool;
- } _tMempool;
-
- typedef _tMempool* tMempool;
-
- void tMempool_init (tMempool* const, char* memory, size_t size);
- void tMempool_free (tMempool* const);
- void tMempool_initToPool (tMempool* const, char* memory, size_t size, tMempool* const);
- void tMempool_freeFromPool (tMempool* const, tMempool* const);
-
- //==============================================================================
-
- extern tMempool leaf_mempool;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MPOOL_H
-
-//==============================================================================
-
-
-
--- a/LEAF/Inc/leaf-midi.h
+++ /dev/null
@@ -1,133 +1,0 @@
-/*==============================================================================
-
- leaf-midi.h
- Created: 30 Nov 2018 11:29:26am
- Author: airship
-
- ==============================================================================*/
-
-#ifndef LEAF_MIDI_H_INCLUDED
-#define LEAF_MIDI_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-mempool.h"
-#include "leaf-math.h"
-#include "leaf-envelopes.h"
-
- //==============================================================================
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- // STACK implementation (fixed size)
-#define STACK_SIZE 128
- typedef struct _tStack
- {
- int data[STACK_SIZE];
- uint16_t pos;
- uint16_t size;
- uint16_t capacity;
- oBool ordered;
-
- } _tStack;
-
- typedef _tStack* tStack;
-
- void tStack_init (tStack* const);
- void tStack_free (tStack* const);
- void tStack_initToPool (tStack* const, tMempool* const);
- void tStack_freeFromPool (tStack* const, tMempool* const);
-
- void tStack_setCapacity (tStack* const, uint16_t cap);
- int tStack_addIfNotAlreadyThere (tStack* const, uint16_t item);
- void tStack_add (tStack* const, uint16_t item);
- int tStack_remove (tStack* const, uint16_t item);
- void tStack_clear (tStack* const);
- int tStack_first (tStack* const);
- int tStack_getSize (tStack* const);
- int tStack_contains (tStack* const, uint16_t item);
- int tStack_next (tStack* const);
- int tStack_get (tStack* const, int which);
-
- /* tPoly */
- typedef struct _tPoly
- {
- tStack stack;
- tStack orderStack;
-
- tRamp* ramps;
- float* rampVals;
- oBool* firstReceived;
- float glideTime;
- oBool pitchGlideIsActive;
-
- int numVoices;
- int maxNumVoices;
-
- //int voices[POLY_NUM_MAX_VOICES][2];
- int** voices;
-
- int notes[128][2];
-
- int CCs[128];
-
- uint8_t CCsRaw[128];
-
- int lastVoiceToChange;
-
- float pitchBend;
- tRamp pitchBendRamp;
-
- int currentNote;
- int currentVoice;
- int currentVelocity;
- int maxLength;
-
- } _tPoly;
-
- typedef _tPoly* tPoly;
-
- /* MPoly*/
- void tPoly_init (tPoly* const, int maxNumVoices);
- void tPoly_free (tPoly* const);
- void tPoly_initToPool (tPoly* const, int maxNumVoices, tMempool* const);
- void tPoly_freeFromPool (tPoly* const, tMempool* const);
-
- //ADDING A NOTE
- int tPoly_noteOn (tPoly* const, int note, uint8_t vel);
- int tPoly_noteOff (tPoly* const, uint8_t note);
- void tPoly_orderedAddToStack (tPoly* const, uint8_t noteVal);
- void tPoly_setNumVoices (tPoly* const, uint8_t numVoices);
-
- void tPoly_setPitchBend (tPoly* const, float pitchBend);
- void tPoly_setPitchGlideActive (tPoly* const, oBool isActive);
- void tPoly_setPitchGlideTime (tPoly* const, float t);
- void tPoly_setBendGlideTime (tPoly* const polyh, float t);
- void tPoly_setBendSamplesPerTick (tPoly* const polyh, float t);
- void tPoly_tickPitch (tPoly* const);
- void tPoly_tickPitchGlide (tPoly* const);
- void tPoly_tickPitchBend (tPoly* const);
-
- int tPoly_getNumVoices (tPoly* const);
- int tPoly_getNumActiveVoices (tPoly* const);
- float tPoly_getPitch (tPoly* const, uint8_t voice);
- int tPoly_getKey (tPoly* const, uint8_t voice);
- int tPoly_getVelocity (tPoly* const, uint8_t voice);
- int tPoly_isOn (tPoly* const, uint8_t voice);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_MIDI_H_INCLUDED
-
-//==============================================================================
-
-
--- a/LEAF/Inc/leaf-oscillators.h
+++ /dev/null
@@ -1,208 +1,0 @@
-/*==============================================================================
- leaf-oscillators.h
- Created: 20 Jan 2017 12:00:58pm
- Author: Michael R Mulshine
- ==============================================================================*/
-
-#ifndef LEAF_OSCILLATORS_H_INCLUDED
-#define LEAF_OSCILLATORS_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-filters.h"
-
- //==============================================================================
-
- /* tCycle: Cycle/Sine waveform. Wavetable synthesis.*/
- typedef struct _tCycle
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tCycle;
-
- typedef _tCycle* tCycle;
-
- void tCycle_init (tCycle* const);
- void tCycle_free (tCycle* const);
- void tCycle_initToPool (tCycle* const, tMempool* const);
- void tCycle_freeFromPool (tCycle* const, tMempool* const);
-
- float tCycle_tick (tCycle* const);
- int tCycle_setFreq (tCycle* const, float freq);
-
- //==============================================================================
-
- /* tTriangle: Anti-aliased Triangle waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tTriangle
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tTriangle;
-
- typedef _tTriangle* tTriangle;
-
- void tTriangle_init (tTriangle* const);
- void tTriangle_free (tTriangle* const);
- void tTriangle_initToPool (tTriangle* const, tMempool* const);
- void tTriangle_freeFromPool (tTriangle* const, tMempool* const);
-
- float tTriangle_tick (tTriangle* const);
- int tTriangle_setFreq (tTriangle* const, float freq);
-
- //==============================================================================
-
- /* tSquare: Anti-aliased Square waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tSquare
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tSquare;
-
- typedef _tSquare* tSquare;
-
- void tSquare_init (tSquare* const);
- void tSquare_free (tSquare* const);
- void tSquare_initToPool (tSquare* const, tMempool* const);
- void tSquare_freeFromPool(tSquare* const, tMempool* const);
-
- float tSquare_tick (tSquare* const);
- int tSquare_setFreq (tSquare* const, float freq);
-
- //==============================================================================
-
- /* tSawtooth: Anti-aliased Sawtooth waveform using wavetable interpolation. Wavetables constructed from sine components. */
- typedef struct _tSawtooth
- {
- // Underlying phasor
- float phase;
- float inc,freq;
-
- } _tSawtooth;
-
- typedef _tSawtooth* tSawtooth;
-
- void tSawtooth_init (tSawtooth* const);
- void tSawtooth_free (tSawtooth* const);
- void tSawtooth_initToPool (tSawtooth* const, tMempool* const);
- void tSawtooth_freeFromPool (tSawtooth* const, tMempool* const);
-
- float tSawtooth_tick (tSawtooth* const);
- int tSawtooth_setFreq (tSawtooth* const, float freq);
-
- //==============================================================================
-
- /* tPhasor: Aliasing phasor [0.0, 1.0) */
- typedef struct _tPhasor
- {
- float phase;
- float inc,freq;
-
- } _tPhasor;
-
- typedef _tPhasor* tPhasor;
-
- void tPhasor_init (tPhasor* const);
- void tPhasor_free (tPhasor* const);
- void tPhasor_initToPool (tPhasor* const, tMempool* const);
- void tPhasor_freeFromPool(tPhasor* const, tMempool* const);
-
- float tPhasor_tick (tPhasor* const);
- int tPhasor_setFreq (tPhasor* const, float freq);
-
- //==============================================================================
-
- /* tNoise. WhiteNoise, PinkNoise. */
- typedef enum NoiseType
- {
- WhiteNoise=0,
- PinkNoise,
- NoiseTypeNil,
- } NoiseType;
-
- typedef struct _tNoise
- {
- NoiseType type;
- float pinkb0, pinkb1, pinkb2;
- float(*rand)(void);
-
- } _tNoise;
-
- typedef _tNoise* tNoise;
-
- void tNoise_init (tNoise* const, NoiseType type);
- void tNoise_free (tNoise* const);
- void tNoise_initToPool (tNoise* const, NoiseType type, tMempool* const);
- void tNoise_freeFromPool (tNoise* const, tMempool* const);
-
- float tNoise_tick (tNoise* const);
-
- //==============================================================================
-
- /* tNeuron */
- typedef enum NeuronMode
- {
- NeuronNormal = 0,
- NeuronTanh,
- NeuronAaltoShaper,
- NeuronModeNil
- } NeuronMode;
-
- typedef struct _tNeuron
- {
- tPoleZero f;
-
- NeuronMode mode;
-
- float voltage, current;
- float timeStep;
-
- float alpha[3];
- float beta[3];
- float rate[3];
- float V[3];
- float P[3];
- float gK, gN, gL, C;
- } _tNeuron;
-
- typedef _tNeuron* tNeuron;
-
- void tNeuron_init (tNeuron* const);
- void tNeuron_free (tNeuron* const);
- void tNeuron_initToPool (tNeuron* const, tMempool* const);
- void tNeuron_freeFromPool(tNeuron* const, tMempool* const);
-
- void tNeuron_reset (tNeuron* const);
- float tNeuron_tick (tNeuron* const);
- void tNeuron_setMode (tNeuron* const, NeuronMode mode);
- void tNeuron_setCurrent (tNeuron* const, float current);
- void tNeuron_setK (tNeuron* const, float K);
- void tNeuron_setL (tNeuron* const, float L);
- void tNeuron_setN (tNeuron* const, float N);
- void tNeuron_setC (tNeuron* const, float C);
- void tNeuron_setV1 (tNeuron* const, float V1);
- void tNeuron_setV2 (tNeuron* const, float V2);
- void tNeuron_setV3 (tNeuron* const, float V3);
- void tNeuron_setTimeStep (tNeuron* const, float timestep);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_OSCILLATORS_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-physical.h
+++ /dev/null
@@ -1,251 +1,0 @@
-/*
- ==============================================================================
-
- leaf-physical.h
- Created: 30 Nov 2018 10:41:55am
- Author: airship
-
- ==============================================================================
- */
-
-#ifndef LEAF_PHYSICAL_H_INCLUDED
-#define LEAF_PHYSICAL_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-filters.h"
-#include "leaf-oscillators.h"
-#include "leaf-envelopes.h"
-#include "leaf-dynamics.h"
-
- //==============================================================================
-
- /* Karplus Strong model */
- typedef struct _tPluck
- {
- tAllpassDelay delayLine; // Allpass or Linear?? big difference...
- tOneZero loopFilter;
- tOnePole pickFilter;
- tNoise noise;
-
- float lastOut;
- float loopGain;
- float lastFreq;
-
- float sr;
-
- } _tPluck;
-
- typedef _tPluck* tPluck;
-
- void tPluck_init (tPluck* const, float lowestFrequency); //float delayBuff[DELAY_LENGTH]);
- void tPluck_free (tPluck* const);
- void tPluck_initToPool (tPluck* const, float lowestFrequency, tMempool* const);
- void tPluck_freeFromPool (tPluck* const, tMempool* const);
-
- float tPluck_tick (tPluck* const);
-
- // Pluck the string.
- void tPluck_pluck (tPluck* const, float amplitude);
-
- // Start a note with the given frequency and amplitude.;
- void tPluck_noteOn (tPluck* const, float frequency, float amplitude );
-
- // Stop a note with the given amplitude (speed of decay).
- void tPluck_noteOff (tPluck* const, float amplitude );
-
- // Set instrument parameters for a particular frequency.
- void tPluck_setFrequency (tPluck* const, float frequency );
-
- // Perform the control change specified by \e number and \e value (0.0 - 128.0).
- void tPluck_controlChange (tPluck* const, int number, float value);
-
- // tPluck Utilities.
- float tPluck_getLastOut (tPluck* const);
-
- //==============================================================================
-
- typedef enum SKControlType
- {
- SKPickPosition = 0,
- SKStringDamping,
- SKDetune,
- SKControlTypeNil
- } SKControlType;
-
- /* Stif Karplus Strong model */
- typedef struct _tKarplusStrong
- {
- tAllpassDelay delayLine;
- tLinearDelay combDelay;
- tOneZero filter;
- tNoise noise;
- tBiQuad biquad[4];
-
- uint32_t length;
- float loopGain;
- float baseLoopGain;
- float lastFrequency;
- float lastLength;
- float stretching;
- float pluckAmplitude;
- float pickupPosition;
-
- float lastOut;
-
- } _tKarplusStrong;
-
- typedef _tKarplusStrong* tKarplusStrong;
-
- void tKarplusStrong_init (tKarplusStrong* const, float lowestFrequency); // float delayBuff[2][DELAY_LENGTH]);
- void tKarplusStrong_free (tKarplusStrong* const);
- void tKarplusStrong_initToPool (tKarplusStrong* const, float lowestFrequency, tMempool* const);
- void tKarplusStrong_freeFromPool (tKarplusStrong* const, tMempool* const);
-
- float tKarplusStrong_tick (tKarplusStrong* const);
-
- // Pluck the string.
- void tKarplusStrong_pluck (tKarplusStrong* const, float amplitude);
-
- // Start a note with the given frequency and amplitude.;
- void tKarplusStrong_noteOn (tKarplusStrong* const, float frequency, float amplitude );
-
- // Stop a note with the given amplitude (speed of decay).
- void tKarplusStrong_noteOff (tKarplusStrong* const, float amplitude );
-
- // Set instrument parameters for a particular frequency.
- void tKarplusStrong_setFrequency (tKarplusStrong* const, float frequency );
-
- // Perform the control change specified by \e number and \e value (0.0 - 128.0).
- // Use SKPickPosition, SKStringDamping, or SKDetune for type.
- void tKarplusStrong_controlChange (tKarplusStrong* const, SKControlType type, float value);
-
- // Set the stretch "factor" of the string (0.0 - 1.0).
- void tKarplusStrong_setStretch (tKarplusStrong* const, float stretch );
-
- // Set the pluck or "excitation" position along the string (0.0 - 1.0).
- void tKarplusStrong_setPickupPosition (tKarplusStrong* const, float position );
-
- // Set the base loop gain.
- void tKarplusStrong_setBaseLoopGain (tKarplusStrong* const, float aGain );
-
- // tKarplusStrong utilities.
- float tKarplusStrong_getLastOut (tKarplusStrong* const);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Simple Living String */
- typedef struct _tSimpleLivingString {
- float freq, waveLengthInSamples; // the frequency of the string, determining delay length
- float dampFreq; // frequency for the bridge LP filter, in Hz
- float decay; // amplitude damping factor for the string (only active in mode 0)
- float levMode;
- float curr;
- tLinearDelay delayLine;
- tOnePole bridgeFilter;
- tHighpass DCblocker;
- tFeedbackLeveler fbLev;
- tExpSmooth wlSmooth;
- } _tSimpleLivingString;
-
- typedef _tSimpleLivingString* tSimpleLivingString;
-
- void tSimpleLivingString_init (tSimpleLivingString* const, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode);
- void tSimpleLivingString_free (tSimpleLivingString* const);
- void tSimpleLivingString_initToPool (tSimpleLivingString* const, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const);
- void tSimpleLivingString_freeFromPool (tSimpleLivingString* const, tMempool* const);
-
- float tSimpleLivingString_tick (tSimpleLivingString* const, float input);
- float tSimpleLivingString_sample (tSimpleLivingString* const);
- void tSimpleLivingString_setFreq (tSimpleLivingString* const, float freq);
- void tSimpleLivingString_setWaveLength (tSimpleLivingString* const, float waveLength); // in samples
- void tSimpleLivingString_setDampFreq (tSimpleLivingString* const, float dampFreq);
- void tSimpleLivingString_setDecay (tSimpleLivingString* const, float decay); // should be near 1.0
- void tSimpleLivingString_setTargetLev (tSimpleLivingString* const, float targetLev);
- void tSimpleLivingString_setLevSmoothFactor (tSimpleLivingString* const, float levSmoothFactor);
- void tSimpleLivingString_setLevStrength (tSimpleLivingString* const, float levStrength);
- void tSimpleLivingString_setLevMode (tSimpleLivingString* const, int levMode);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- /* Living String */
- typedef struct _tLivingString {
- float freq, waveLengthInSamples; // the frequency of the whole string, determining delay length
- float pickPos; // the pick position, dividing the string in two, in ratio
- float prepIndex; // the amount of pressure on the pickpoint of the string (near 0=soft obj, near 1=hard obj)
- float dampFreq; // frequency for the bridge LP filter, in Hz
- float decay; // amplitude damping factor for the string (only active in mode 0)
- float levMode;
- float curr;
- tLinearDelay delLF,delUF,delUB,delLB; // delay for lower/upper/forward/backward part of the waveguide model
- tOnePole bridgeFilter, nutFilter, prepFilterU, prepFilterL;
- tHighpass DCblockerL, DCblockerU;
- tFeedbackLeveler fbLevU, fbLevL;
- tExpSmooth wlSmooth, ppSmooth;
- } _tLivingString;
-
- typedef _tLivingString* tLivingString;
-
- void tLivingString_init (tLivingString* const, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode);
- void tLivingString_free (tLivingString* const);
- void tLivingString_initToPool (tLivingString* const, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const);
- void tLivingString_freeFromPool (tLivingString* const, tMempool* const);
-
- float tLivingString_tick (tLivingString* const, float input);
- float tLivingString_sample (tLivingString* const);
- void tLivingString_setFreq (tLivingString* const, float freq);
- void tLivingString_setWaveLength (tLivingString* const, float waveLength); // in samples
- void tLivingString_setPickPos (tLivingString* const, float pickPos);
- void tLivingString_setPrepIndex (tLivingString* const, float prepIndex);
- void tLivingString_setDampFreq (tLivingString* const, float dampFreq);
- void tLivingString_setDecay (tLivingString* const, float decay); // should be near 1.0
- void tLivingString_setTargetLev (tLivingString* const, float targetLev);
- void tLivingString_setLevSmoothFactor (tLivingString* const, float levSmoothFactor);
- void tLivingString_setLevStrength (tLivingString* const, float levStrength);
- void tLivingString_setLevMode (tLivingString* const, int levMode);
-
- // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
-
- //Reed Table - borrowed from STK
- typedef struct _tReedTable {
- float offset, slope;
- } _tReedTable;
-
- typedef _tReedTable* tReedTable;
-
- void tReedTable_init (tReedTable* const, float offset, float slope);
- void tReedTable_free (tReedTable* const);
- void tReedTable_initToPool (tReedTable* const, float offset, float slope, tMempool* const);
- void tReedTable_freeFromPool (tReedTable* const, tMempool* const);
-
- float tReedTable_tick (tReedTable* const, float input);
- float tReedTable_tanh_tick (tReedTable* const, float input); //tanh softclip version of reed table - replacing the hard clip in original stk code
- void tReedTable_setOffset (tReedTable* const, float offset);
- void tReedTable_setSlope (tReedTable* const, float slope);
-
- //==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_PHYSICAL_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-reverb.h
+++ /dev/null
@@ -1,167 +1,0 @@
-/*==============================================================================
-
- leaf-reverb.h
- Created: 20 Jan 2017 12:02:04pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#ifndef LEAF_REVERB_H_INCLUDED
-#define LEAF_REVERB_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-delay.h"
-#include "leaf-filters.h"
-#include "leaf-oscillators.h"
-
- //==============================================================================
-
- /* PRCReverb: Reverb, reimplemented from STK (Cook and Scavone). */
- typedef struct _tPRCReverb
- {
- float mix, t60;
-
- float inv_441;
-
- tDelay allpassDelays[2];
- tDelay combDelay;
- float allpassCoeff;
- float combCoeff;
-
- float lastIn, lastOut;
-
- } _tPRCReverb;
-
- typedef _tPRCReverb* tPRCReverb;
-
- void tPRCReverb_init (tPRCReverb* const, float t60);
- void tPRCReverb_free (tPRCReverb* const);
- void tPRCReverb_initToPool (tPRCReverb* const, float t60, tMempool* const);
- void tPRCReverb_freeFromPool (tPRCReverb* const, tMempool* const);
-
- void tPRCReverb_clear (tPRCReverb* const);
- float tPRCReverb_tick (tPRCReverb* const, float input);
-
- // Set reverb time in seconds.
- void tPRCReverb_setT60 (tPRCReverb* const, float t60);
-
- // Set mix between dry input and wet output signal.
- void tPRCReverb_setMix (tPRCReverb* const, float mix);
-
- //==============================================================================
-
- /* NReverb: Reverb, reimplemented from STK (Cook and Scavone). */
- typedef struct _tNReverb
- {
- float mix, t60;
-
- float inv_sr, inv_441;
-
- tLinearDelay allpassDelays[8];
- tLinearDelay combDelays[6];
- float allpassCoeff;
- float combCoeffs[6];
- float lowpassState;
-
- float lastIn, lastOut;
-
- } _tNReverb;
-
- typedef _tNReverb* tNReverb;
-
- void tNReverb_init (tNReverb* const, float t60);
- void tNReverb_free (tNReverb* const);
- void tNReverb_initToPool (tNReverb* const, float t60, tMempool* const);
- void tNReverb_freeFromPool (tNReverb* const, tMempool* const);
-
- void tNReverb_clear (tNReverb* const);
- float tNReverb_tick (tNReverb* const, float input);
- void tNReverb_tickStereo (tNReverb* const rev, float input, float* output);
-
- // Set reverb time in seconds.
- void tNReverb_setT60 (tNReverb* const, float t60);
-
- // Set mix between dry input and wet output signal.
- void tNReverb_setMix (tNReverb* const, float mix);
-
- //==============================================================================
-
- typedef struct _tDattorroReverb
- {
- float predelay;
- float input_filter;
- float feedback_filter;
- float feedback_gain;
- float mix;
- uint32_t frozen;
-
- float size, size_max, t;
-
- float f1_delay_2_last,
- f2_delay_2_last;
-
- float f1_last,
- f2_last;
-
- // INPUT
- tTapeDelay in_delay;
- tOnePole in_filter;
- tAllpass in_allpass[4];
-
- // FEEDBACK 1
- tAllpass f1_allpass;
- tTapeDelay f1_delay_1;
- tOnePole f1_filter;
- tTapeDelay f1_delay_2;
- tTapeDelay f1_delay_3;
- tHighpass f1_hp;
-
- tCycle f1_lfo;
-
- // FEEDBACK 2
- tAllpass f2_allpass;
- tTapeDelay f2_delay_1;
- tOnePole f2_filter;
- tTapeDelay f2_delay_2;
- tTapeDelay f2_delay_3;
- tHighpass f2_hp;
-
- tCycle f2_lfo;
-
- } _tDattorroReverb;
-
- typedef _tDattorroReverb* tDattorroReverb;
-
- void tDattorroReverb_init (tDattorroReverb* const);
- void tDattorroReverb_free (tDattorroReverb* const);
- void tDattorroReverb_initToPool (tDattorroReverb* const, tMempool* const);
- void tDattorroReverb_freeFromPool (tDattorroReverb* const, tMempool* const);
-
- void tDattorroReverb_clear (tDattorroReverb* const);
- float tDattorroReverb_tick (tDattorroReverb* const, float input);
- void tDattorroReverb_tickStereo (tDattorroReverb* const rev, float input, float* output);
- void tDattorroReverb_setMix (tDattorroReverb* const, float mix);
- void tDattorroReverb_setFreeze (tDattorroReverb* const rev, uint32_t freeze);
- void tDattorroReverb_setHP (tDattorroReverb* const, float freq);
- void tDattorroReverb_setSize (tDattorroReverb* const, float size);
- void tDattorroReverb_setInputDelay (tDattorroReverb* const, float preDelay);
- void tDattorroReverb_setInputFilter (tDattorroReverb* const, float freq);
- void tDattorroReverb_setFeedbackFilter (tDattorroReverb* const, float freq);
- void tDattorroReverb_setFeedbackGain (tDattorroReverb* const, float gain);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_REVERB_H_INCLUDED
-
-//==============================================================================
-
--- a/LEAF/Inc/leaf-sampling.h
+++ /dev/null
@@ -1,176 +1,0 @@
-/*==============================================================================
-
- leaf-sampling.h
- Created: 23 Jan 2019 11:22:09am
- Author: Mike Mulshine
-
- ==============================================================================*/
-
-
-#ifndef LEAF_SAMPLING_H_INCLUDED
-#define LEAF_SAMPLING_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- //==============================================================================
-
-#include "leaf-global.h"
-#include "leaf-math.h"
-#include "leaf-mempool.h"
-#include "leaf-envelopes.h"
-#include "leaf-mempool.h"
-#include "leaf-analysis.h"
-
- //==============================================================================
-
- typedef enum RecordMode
- {
- RecordOneShot = 0,
- RecordLoop,
- RecordModeNil
- } RecordMode;
-
- typedef struct _tBuffer
- {
- float* buff;
-
- uint32_t idx;
- uint32_t bufferLength;
- uint32_t recordedLength;
- RecordMode mode;
-
- int active;
-
- } _tBuffer;
-
- typedef _tBuffer* tBuffer;
-
- void tBuffer_init (tBuffer* const, uint32_t length);
- void tBuffer_free (tBuffer* const);
- void tBuffer_initToPool (tBuffer* const, uint32_t length, tMempool* const);
- void tBuffer_freeFromPool (tBuffer* const, tMempool* const);
-
- void tBuffer_tick (tBuffer* const, float sample);
-
- void tBuffer_read (tBuffer* const, float* buff, uint32_t len);
-
- float tBuffer_get (tBuffer* const, int idx);
-
- void tBuffer_record (tBuffer* const);
- void tBuffer_stop (tBuffer* const);
- int tBuffer_getRecordPosition (tBuffer* const);
-
- void tBuffer_setRecordMode (tBuffer* const, RecordMode mode);
-
- void tBuffer_clear (tBuffer* const);
-
- uint32_t tBuffer_getBufferLength (tBuffer* const);
- uint32_t tBuffer_getRecordedLength (tBuffer* const sb);
-
- //==============================================================================
-
- typedef enum PlayMode
- {
- PlayNormal,
- PlayLoop,
- PlayBackAndForth,
- PlayModeNil
- } PlayMode;
-
- typedef struct _tSampler
- {
- tBuffer samp;
-
- tRamp gain;
-
- float idx;
- float inc;
- float last;
- float iinc;
- int8_t dir;
- int8_t flip;
- int8_t bnf;
-
- int32_t start, targetstart;
- int32_t end, targetend;
-
- uint32_t len;
- uint32_t cfxlen;
- float numticks;
- PlayMode mode;
- int retrigger;
-
- int active;
-
- } _tSampler;
-
- typedef _tSampler* tSampler;
-
- void tSampler_init (tSampler* const, tBuffer* const);
- void tSampler_free (tSampler* const);
- void tSampler_initToPool (tSampler* const, tBuffer* const, tMempool* const);
- void tSampler_freeFromPool (tSampler* const, tMempool* const);
-
- float tSampler_tick (tSampler* const);
-
- void tSampler_setSample (tSampler* const, tBuffer* const);
-
- void tSampler_setMode (tSampler* const, PlayMode mode);
-
- void tSampler_play (tSampler* const);
- void tSampler_stop (tSampler* const);
-
- void tSampler_setStart (tSampler* const, int32_t start);
- void tSampler_setEnd (tSampler* const, int32_t end);
-
- static void handleStartEndChange (tSampler* const sp);
-
- void tSampler_setCrossfadeLength (tSampler* const sp, uint32_t length);
-
- void tSampler_setRate (tSampler* const, float rate);
-
- //==============================================================================
-
- typedef struct _tAutoSampler
- {
- tSampler sampler;
- tEnvelopeFollower ef;
- uint32_t windowSize;
- float threshold;
- float previousPower;
- uint32_t sampleCounter;
- uint32_t powerCounter;
- uint8_t sampleTriggered;
- } _tAutoSampler;
-
- typedef _tAutoSampler* tAutoSampler;
-
- void tAutoSampler_init (tAutoSampler* const, tBuffer* const);
- void tAutoSampler_free (tAutoSampler* const);
- void tAutoSampler_initToPool (tAutoSampler* const, tBuffer* const, tMempool* const);
- void tAutoSampler_freeFromPool (tAutoSampler* const, tMempool* const);
-
- float tAutoSampler_tick (tAutoSampler* const, float input);
-
- void tAutoSampler_setBuffer (tAutoSampler* const, tBuffer* const);
-
- void tAutoSampler_setMode (tAutoSampler* const, PlayMode mode);
-
- void tAutoSampler_play (tAutoSampler* const);
- void tAutoSampler_stop (tAutoSampler* const);
-
- void tAutoSampler_setThreshold (tAutoSampler* const, float thresh);
- void tAutoSampler_setWindowSize (tAutoSampler* const, uint32_t size);
- void tAutoSampler_setCrossfadeLength (tAutoSampler* const, uint32_t length);
-
- void tAutoSampler_setRate (tAutoSampler* const, float rate);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_SAMPLING_H_INCLUDED
-
-//==============================================================================
--- a/LEAF/Inc/leaf-tables.h
+++ /dev/null
@@ -1,100 +1,0 @@
-/*==============================================================================
-
- leaf-tables.h
- Created: 4 Dec 2016 9:42:41pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#ifndef LEAF_TABLES_H_INCLUDED
-#define LEAF_TABLES_H_INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//==============================================================================
-
-#include "leaf-math.h"
-
-//==============================================================================
-
-
-#define SINE_TABLE_SIZE 2048
-#define SAW_TABLE_SIZE 2048
-#define SQR_TABLE_SIZE 2048
-#define TRI_TABLE_SIZE 2048
-#define EXP_DECAY_TABLE_SIZE 65536
-#define ATTACK_DECAY_INC_TABLE_SIZE 65536
-#define TANH1_TABLE_SIZE 65536
-#define DECAY_COEFF_TABLE_SIZE 4096
-#define MTOF1_TABLE_SIZE 4096
-#define FILTERTAN_TABLE_SIZE 4096
-
-#define SHAPER1_TABLE_SIZE 65536
-extern const float shaper1[SHAPER1_TABLE_SIZE];
-
-#define COEFFS_SIZE 32
-extern const float* firCoeffs[COEFFS_SIZE];
-extern const float firNumTaps[COEFFS_SIZE];
-extern const float fir2XLow[32];
-extern const float fir4XLow[64];
-extern const float fir8XLow[64];
-extern const float fir16XLow[128];
-extern const float fir32XLow[256];
-extern const float fir64XLow[256];
-extern const float fir2XHigh[128];
-extern const float fir4XHigh[256];
-extern const float fir8XHigh[256];
-extern const float fir16XHigh[512];
-extern const float fir32XHigh[512];
-extern const float fir64XHigh[1024];
-
-typedef enum TableName
-{
- T20 = 0,
- T40,
- T80,
- T160,
- T320,
- T640,
- T1280,
- T2560,
- T5120,
- T10240,
- T20480,
- TableNameNil
-} TableName;
-
-// mtof lookup table based on input range [0.0,1.0) in 4096 increments - midi frequency values scaled between m25 and m134 (from the Snyderphonics DrumBox code)
-
-extern const float exp_decay[EXP_DECAY_TABLE_SIZE];
-extern const float attack_decay_inc[ATTACK_DECAY_INC_TABLE_SIZE];
-
-extern const float filtertan[FILTERTAN_TABLE_SIZE];
-
-extern const float mtof1[MTOF1_TABLE_SIZE];
-extern const float decayCoeffTable[DECAY_COEFF_TABLE_SIZE];
-
-extern const float tanh1[TANH1_TABLE_SIZE];
-
-//==============================================================================
-
-/* Sine wave table ripped from http://aquaticus.info/pwm-sine-wave. */
-extern const float sinewave[SINE_TABLE_SIZE];
-
-extern const float sawtooth[11][SAW_TABLE_SIZE];
-
-extern const float triangle[11][TRI_TABLE_SIZE];
-
-extern const float squarewave[11][SQR_TABLE_SIZE];
-
-//==============================================================================
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // LEAF_TABLES_H_INCLUDED
-
-//==============================================================================
--- /dev/null
+++ b/LEAF/Inc/main.h
@@ -1,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "stm32h7xx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+#define __ATTR_RAM_D1 __attribute__ ((section(".RAM_D1"))) __attribute__ ((aligned (32)))
+#define __ATTR_RAM_D2 __attribute__ ((section(".RAM_D2"))) __attribute__ ((aligned (32)))
+#define __ATTR_RAM_D3 __attribute__ ((section(".RAM_D3"))) __attribute__ ((aligned (32)))
+#define __ATTR_SDRAM __attribute__ ((section(".SDRAM"))) __attribute__ ((aligned (32)))
+
+#define STM32 // define this so that LEAF knows you are building for STM32
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+float randomNumber(void);
+static void HardFault_Handler(void) __attribute__ ((naked));
+void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress );
+void writeIntToFlash(uint32_t data, uint32_t location);
+uint32_t readIntFromFlash (uint32_t location);
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/oled.h
@@ -1,0 +1,90 @@
+/*
+ * oled.h
+ *
+ * Created on: Feb 05, 2020
+ * Author: Matthew Wang
+ */
+
+#ifndef OLED_H_
+#define OLED_H_
+
+extern char oled_buffer[32];
+
+typedef enum _OLEDLine
+{
+ FirstLine = 0,
+ SecondLine,
+ BothLines,
+ NilLine
+} OLEDLine;
+
+void OLED_init(I2C_HandleTypeDef* hi2c);
+
+void initUIFunctionPointers(void);
+
+void setLED_Edit(uint8_t onOff);
+
+void setLED_USB(uint8_t onOff);
+
+void setLED_1(uint8_t onOff);
+
+void setLED_2(uint8_t onOff);
+
+void setLED_A(uint8_t onOff);
+
+void setLED_B(uint8_t onOff);
+
+void setLED_C(uint8_t onOff);
+
+void setLED_leftout_clip(uint8_t onOff);
+
+void setLED_rightout_clip(uint8_t onOff);
+
+void setLED_leftin_clip(uint8_t onOff);
+
+void setLED_rightin_clip(uint8_t onOff);
+
+int getCursorX(void);
+
+void OLED_process(void);
+
+void OLED_writePreset(void);
+
+void OLED_writeEditScreen(void);
+
+void OLED_writeKnobParameter(uint8_t whichParam);
+
+void OLED_writeButtonAction(uint8_t whichButton, uint8_t whichAction);
+
+void OLED_writeTuning(void);
+
+void OLED_draw(void);
+
+void OLEDclear(void);
+
+void OLEDclearLine(OLEDLine line);
+
+void OLEDwriteString(char* myCharArray, uint8_t arrayLength, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteLine(char* myCharArray, uint8_t arrayLength, OLEDLine line);
+
+void OLEDwriteInt(uint32_t myNumber, uint8_t numDigits, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteIntLine(uint32_t myNumber, uint8_t numDigits, OLEDLine line);
+
+void OLEDwritePitch(float midi, uint8_t startCursor, OLEDLine line);
+
+void OLEDwritePitchClass(float midi, uint8_t startCursor, OLEDLine line);
+
+void OLEDwritePitchLine(float midi, OLEDLine line);
+
+void OLEDwriteFixedFloat(float input, uint8_t numDigits, uint8_t numDecimal, uint8_t startCursor, OLEDLine line);
+
+void OLEDwriteFixedFloatLine(float input, uint8_t numDigits, uint8_t numDecimal, OLEDLine line);
+
+void OLEDwriteFloat(float input, uint8_t startCursor, OLEDLine line);
+
+void OLEDdrawFloatArray(float* input, float min, float max, uint8_t size, uint8_t offset, uint8_t startCursor, OLEDLine line);
+
+#endif /* OLED_H_ */
+
--- /dev/null
+++ b/LEAF/Inc/rng.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : RNG.h
+ * Description : This file provides code for the configuration
+ * of the RNG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __rng_H
+#define __rng_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern RNG_HandleTypeDef hrng;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_RNG_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ rng_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sai.h
@@ -1,0 +1,59 @@
+/**
+ ******************************************************************************
+ * File Name : SAI.h
+ * Description : This file provides code for the configuration
+ * of the SAI instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sai_H
+#define __sai_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SAI_HandleTypeDef hsai_BlockA1;
+extern SAI_HandleTypeDef hsai_BlockB1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SAI1_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sai_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sd_diskio.h
@@ -1,0 +1,45 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file sd_diskio.h
+ * @brief Header for sd_diskio.c module
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Note: code generation based on sd_diskio_template.h */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __SD_DISKIO_H
+#define __SD_DISKIO_H
+
+/* USER CODE BEGIN firstSection */
+/* can be used to modify / undefine following code or add new definitions */
+/* USER CODE END firstSection */
+
+/* Includes ------------------------------------------------------------------*/
+#include "bsp_driver_sd.h"
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+extern const Diskio_drvTypeDef SD_Driver;
+
+/* USER CODE BEGIN lastSection */
+/* can be used to modify / undefine previous code or add new definitions */
+/* USER CODE END lastSection */
+
+#endif /* __SD_DISKIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
--- /dev/null
+++ b/LEAF/Inc/sdmmc.h
@@ -1,0 +1,58 @@
+/**
+ ******************************************************************************
+ * File Name : SDMMC.h
+ * Description : This file provides code for the configuration
+ * of the SDMMC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sdmmc_H
+#define __sdmmc_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern SD_HandleTypeDef hsd1;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SDMMC1_SD_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sdmmc_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sfx.h
@@ -1,0 +1,177 @@
+/*
+ * sfx.h
+ *
+ * Created on: Dec 23, 2019
+ * Author: josnyder
+ */
+#ifndef SFX_H_
+#define SFX_H_
+
+#include "audiostream.h"
+#include "ui.h"
+
+#define NUM_VOC_VOICES 8
+#define NUM_OSC_PER_VOICE 3
+#define NUM_VOC_OSC 1
+#define INV_NUM_VOC_VOICES 0.125
+#define INV_NUM_VOC_OSC 1
+#define NUM_AUTOTUNE 2
+#define NUM_RETUNE 1
+#define OVERSAMPLER_RATIO 8
+#define OVERSAMPLER_HQ FALSE
+
+extern float presetKnobValues[PresetNil][NUM_ADC_CHANNELS];
+extern uint8_t knobActive[NUM_ADC_CHANNELS];
+
+extern tPoly poly;
+extern tRamp polyRamp[NUM_VOC_VOICES];
+extern tSawtooth osc[NUM_VOC_VOICES * NUM_OSC_PER_VOICE];
+
+extern PlayMode samplerMode;
+extern float sampleLength;
+
+extern uint32_t freeze;
+
+void initGlobalSFXObjects();
+
+//1 vocoder internal poly
+extern uint8_t numVoices;
+extern uint8_t internalExternal;
+
+void SFXVocoderAlloc();
+void SFXVocoderFrame();
+void SFXVocoderTick(float audioIn);
+void SFXVocoderFree(void);
+
+//4 pitch shift
+void SFXPitchShiftAlloc();
+void SFXPitchShiftFrame();
+void SFXPitchShiftTick(float audioIn);
+void SFXPitchShiftFree(void);
+
+//5 neartune
+extern uint8_t autotuneChromatic;
+
+void SFXNeartuneAlloc();
+void SFXNeartuneFrame();
+void SFXNeartuneTick(float audioIn);
+void SFXNeartuneFree(void);
+
+//6 autotune
+void SFXAutotuneAlloc();
+void SFXAutotuneFrame();
+void SFXAutotuneTick(float audioIn);
+void SFXAutotuneFree(void);
+
+//7 sampler - button press
+extern uint8_t samplePlaying;
+
+void SFXSamplerBPAlloc();
+void SFXSamplerBPFrame();
+void SFXSamplerBPTick(float audioIn);
+void SFXSamplerBPFree(void);
+
+
+//8 sampler - auto ch1
+extern uint8_t triggerChannel;
+
+void SFXSamplerAutoAlloc();
+void SFXSamplerAutoFrame();
+void SFXSamplerAutoTick(float audioIn);
+void SFXSamplerAutoFree(void);
+
+//10 distortion tanh
+extern uint8_t distortionMode;
+
+void SFXDistortionAlloc();
+void SFXDistortionFrame();
+void SFXDistortionTick(float audioIn);
+void SFXDistortionFree(void);
+
+//12 distortion wave folder
+void SFXWaveFolderAlloc();
+void SFXWaveFolderFrame();
+void SFXWaveFolderTick(float audioIn);
+void SFXWaveFolderFree(void);
+
+
+//13 bitcrusher
+void SFXBitcrusherAlloc();
+void SFXBitcrusherFrame();
+void SFXBitcrusherTick(float audioIn);
+void SFXBitcrusherFree(void);
+
+
+//14 delay
+extern int delayShaper;
+
+void SFXDelayAlloc();
+void SFXDelayFrame();
+void SFXDelayTick(float audioIn);
+void SFXDelayFree(void);
+
+
+//15 reverb
+void SFXReverbAlloc();
+void SFXReverbFrame();
+void SFXReverbTick(float audioIn);
+void SFXReverbFree(void);
+
+//16 reverb2
+void SFXReverb2Alloc();
+void SFXReverb2Frame();
+void SFXReverb2Tick(float audioIn);
+void SFXReverb2Free(void);
+
+//17 living string
+void SFXLivingStringAlloc();
+void SFXLivingStringFrame();
+void SFXLivingStringTick(float audioIn);
+void SFXLivingStringFree(void);
+
+//17 living string
+void SFXLivingStringSynthAlloc();
+void SFXLivingStringSynthFrame();
+void SFXLivingStringSynthTick(float audioIn);
+void SFXLivingStringSynthFree(void);
+
+
+//17 living string
+void SFXClassicSynthAlloc();
+void SFXClassicSynthFrame();
+void SFXClassicSynthTick(float audioIn);
+void SFXClassicSynthFree(void);
+
+
+//17 living string
+void SFXRhodesAlloc();
+void SFXRhodesFrame();
+void SFXRhodesTick(float audioIn);
+void SFXRhodesFree(void);
+
+
+// MIDI FUNCTIONS
+void noteOn(int key, int velocity);
+void noteOff(int key, int velocity);
+void pitchBend(int data);
+void sustainOn(void);
+void sustainOff(void);
+void toggleBypass(void);
+void toggleSustain(void);
+
+void calculateFreq(int voice);
+
+float calculateTunedMidiNote(float tempNote);
+
+
+void calculateNoteArray(void);
+//void calculatePeriodArray(void);
+float nearestNote(float period);
+//float nearestPeriod(float period);
+
+void clearNotes(void);
+
+void ctrlInput(int ctrl, int value);
+
+
+#endif /* SFX_H_ */
--- /dev/null
+++ b/LEAF/Inc/ssd1306.h
@@ -1,0 +1,127 @@
+
+/*
+ * ssd1306.h
+ *
+ * Created on: Jul 6, 2018
+ * Author: jeffsnyder
+ */
+#include "stm32h7xx_hal.h"
+#include "main.h"
+
+#ifndef SSD1306_H_
+#define SSD1306_H_
+
+#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+
+#define BLACK 0
+#define WHITE 1
+#define INVERSE 2
+
+#define SSD1306_I2C_ADDRESS (0x3C<<1) // 011110+SA0+RW - 0x3C or 0x3D
+// Address for 128x32 is 0x3C
+// Address for 128x64 is 0x3D (default) or 0x3C (if SA0 is grounded)
+
+/*=========================================================================
+ SSD1306 Displays
+ -----------------------------------------------------------------------
+ The driver is used in multiple displays (128x64, 128x32, etc.).
+ Select the appropriate display below to create an appropriately
+ sized framebuffer, etc.
+
+ SSD1306_128_64 128x64 pixel display
+
+ SSD1306_128_32 128x32 pixel display
+
+ SSD1306_96_16
+
+ -----------------------------------------------------------------------*/
+// #define SSD1306_128_64
+ #define SSD1306_128_32
+// #define SSD1306_96_16
+/*=========================================================================*/
+
+#if defined SSD1306_128_64 && defined SSD1306_128_32
+ #error "Only one SSD1306 display can be specified at once in SSD1306.h"
+#endif
+#if !defined SSD1306_128_64 && !defined SSD1306_128_32 && !defined SSD1306_96_16
+ #error "At least one SSD1306 display must be specified in SSD1306.h"
+#endif
+
+#if defined SSD1306_128_64
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 64
+#endif
+#if defined SSD1306_128_32
+ #define SSD1306_LCDWIDTH 128
+ #define SSD1306_LCDHEIGHT 32
+#endif
+#if defined SSD1306_96_16
+ #define SSD1306_LCDWIDTH 96
+ #define SSD1306_LCDHEIGHT 16
+#endif
+
+#define SSD1306_SETCONTRAST 0x81
+#define SSD1306_DISPLAYALLON_RESUME 0xA4
+#define SSD1306_DISPLAYALLON 0xA5
+#define SSD1306_NORMALDISPLAY 0xA6
+#define SSD1306_INVERTDISPLAY 0xA7
+#define SSD1306_DISPLAYOFF 0xAE
+#define SSD1306_DISPLAYON 0xAF
+
+#define SSD1306_SETDISPLAYOFFSET 0xD3
+#define SSD1306_SETCOMPINS 0xDA
+
+#define SSD1306_SETVCOMDETECT 0xDB
+
+#define SSD1306_SETDISPLAYCLOCKDIV 0xD5
+#define SSD1306_SETPRECHARGE 0xD9
+
+#define SSD1306_SETMULTIPLEX 0xA8
+
+#define SSD1306_SETLOWCOLUMN 0x00
+#define SSD1306_SETHIGHCOLUMN 0x10
+
+#define SSD1306_SETSTARTLINE 0x40
+
+#define SSD1306_MEMORYMODE 0x20
+#define SSD1306_COLUMNADDR 0x21
+#define SSD1306_PAGEADDR 0x22
+
+#define SSD1306_COMSCANINC 0xC0
+#define SSD1306_COMSCANDEC 0xC8
+
+#define SSD1306_SEGREMAP 0xA0
+
+#define SSD1306_CHARGEPUMP 0x8D
+
+#define SSD1306_EXTERNALVCC 0x1
+#define SSD1306_SWITCHCAPVCC 0x2
+
+// Scrolling #defines
+#define SSD1306_ACTIVATE_SCROLL 0x2F
+#define SSD1306_DEACTIVATE_SCROLL 0x2E
+#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3
+#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
+#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
+#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
+#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A
+
+extern unsigned char buffer [];
+
+void ssd1306_begin(I2C_HandleTypeDef* hi2c, uint8_t vccstate, uint8_t i2caddr);
+void ssd1306_drawPixel(int16_t x, int16_t y, uint16_t color);
+void sdd1306_invertDisplay(uint8_t i);
+void ssd1306_command(uint8_t c);
+void ssd1306_dim(uint8_t dim);
+void ssd1306_display_full_buffer(void);
+void ssd1306_display(void);
+void ssd1306_write(uint8_t* data, uint16_t numBytes);
+void ssd1306_move(uint8_t row, uint8_t column);
+void ssd1306_move_raw(uint8_t row, uint8_t column);
+void ssd1306_home(void);
+
+
+
+
+
+#endif /* SSD1306_H_ */
--- /dev/null
+++ b/LEAF/Inc/stm32h7xx_hal_conf.h
@@ -1,0 +1,493 @@
+/**
+ ******************************************************************************
+ * @file stm32h7xx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7xx_HAL_CONF_H
+#define __STM32H7xx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+
+ #define HAL_ADC_MODULE_ENABLED
+/* #define HAL_FDCAN_MODULE_ENABLED */
+/* #define HAL_CEC_MODULE_ENABLED */
+/* #define HAL_COMP_MODULE_ENABLED */
+/* #define HAL_CRC_MODULE_ENABLED */
+/* #define HAL_CRYP_MODULE_ENABLED */
+/* #define HAL_DAC_MODULE_ENABLED */
+/* #define HAL_DCMI_MODULE_ENABLED */
+/* #define HAL_DMA2D_MODULE_ENABLED */
+/* #define HAL_ETH_MODULE_ENABLED */
+/* #define HAL_NAND_MODULE_ENABLED */
+/* #define HAL_NOR_MODULE_ENABLED */
+/* #define HAL_OTFDEC_MODULE_ENABLED */
+/* #define HAL_SRAM_MODULE_ENABLED */
+#define HAL_SDRAM_MODULE_ENABLED
+/* #define HAL_HASH_MODULE_ENABLED */
+/* #define HAL_HRTIM_MODULE_ENABLED */
+/* #define HAL_HSEM_MODULE_ENABLED */
+/* #define HAL_GFXMMU_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_OPAMP_MODULE_ENABLED */
+/* #define HAL_OSPI_MODULE_ENABLED */
+/* #define HAL_OSPI_MODULE_ENABLED */
+/* #define HAL_I2S_MODULE_ENABLED */
+/* #define HAL_SMBUS_MODULE_ENABLED */
+/* #define HAL_IWDG_MODULE_ENABLED */
+/* #define HAL_LPTIM_MODULE_ENABLED */
+/* #define HAL_LTDC_MODULE_ENABLED */
+/* #define HAL_QSPI_MODULE_ENABLED */
+#define HAL_RNG_MODULE_ENABLED
+/* #define HAL_RTC_MODULE_ENABLED */
+#define HAL_SAI_MODULE_ENABLED
+#define HAL_SD_MODULE_ENABLED
+/* #define HAL_MMC_MODULE_ENABLED */
+/* #define HAL_SPDIFRX_MODULE_ENABLED */
+/* #define HAL_SPI_MODULE_ENABLED */
+/* #define HAL_SWPMI_MODULE_ENABLED */
+#define HAL_TIM_MODULE_ENABLED
+/* #define HAL_UART_MODULE_ENABLED */
+/* #define HAL_USART_MODULE_ENABLED */
+/* #define HAL_IRDA_MODULE_ENABLED */
+/* #define HAL_SMARTCARD_MODULE_ENABLED */
+/* #define HAL_WWDG_MODULE_ENABLED */
+/* #define HAL_PCD_MODULE_ENABLED */
+#define HAL_HCD_MODULE_ENABLED
+/* #define HAL_DFSDM_MODULE_ENABLED */
+/* #define HAL_DSI_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_MDIOS_MODULE_ENABLED */
+/* #define HAL_PSSI_MODULE_ENABLED */
+/* #define HAL_DTS_MODULE_ENABLED */
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_MDMA_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal oscillator (CSI) default value.
+ * This value is the default CSI value after Reset.
+ */
+#if !defined (CSI_VALUE)
+ #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* CSI_VALUE */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for I2S peripheral
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
+ */
+#if !defined (EXTERNAL_CLOCK_VALUE)
+ #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External clock in Hz*/
+#endif /* EXTERNAL_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define USE_SD_TRANSCEIVER 1U /*!< use uSD Transceiver */
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */
+#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */
+#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */
+#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */
+#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */
+#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */
+#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */
+#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */
+#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */
+#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */
+#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */
+#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */
+#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */
+#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */
+#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */
+#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */
+#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U /* GFXMMU register callback disabled */
+#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */
+#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */
+#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */
+#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */
+#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U /* OSPI register callback disabled */
+#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */
+#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */
+#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */
+#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */
+#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */
+#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */
+
+/* ########################### Ethernet Configuration ######################### */
+#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */
+#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */
+
+#define ETH_MAC_ADDR0 ((uint8_t)0x02)
+#define ETH_MAC_ADDR1 ((uint8_t)0x00)
+#define ETH_MAC_ADDR2 ((uint8_t)0x00)
+#define ETH_MAC_ADDR3 ((uint8_t)0x00)
+#define ETH_MAC_ADDR4 ((uint8_t)0x00)
+#define ETH_MAC_ADDR5 ((uint8_t)0x00)
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32h7xx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32h7xx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_MDMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdma.h"
+#endif /* HAL_MDMA_MODULE_ENABLED */
+
+#ifdef HAL_HASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_hash.h"
+#endif /* HAL_HASH_MODULE_ENABLED */
+
+#ifdef HAL_DCMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dcmi.h"
+#endif /* HAL_DCMI_MODULE_ENABLED */
+
+#ifdef HAL_DMA2D_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma2d.h"
+#endif /* HAL_DMA2D_MODULE_ENABLED */
+
+#ifdef HAL_DSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dsi.h"
+#endif /* HAL_DSI_MODULE_ENABLED */
+
+#ifdef HAL_DFSDM_MODULE_ENABLED
+ #include "stm32h7xx_hal_dfsdm.h"
+#endif /* HAL_DFSDM_MODULE_ENABLED */
+
+#ifdef HAL_ETH_MODULE_ENABLED
+ #include "stm32h7xx_hal_eth.h"
+#endif /* HAL_ETH_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32h7xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32h7xx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32h7xx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_FDCAN_MODULE_ENABLED
+ #include "stm32h7xx_hal_fdcan.h"
+#endif /* HAL_FDCAN_MODULE_ENABLED */
+
+#ifdef HAL_CEC_MODULE_ENABLED
+ #include "stm32h7xx_hal_cec.h"
+#endif /* HAL_CEC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32h7xx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32h7xx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32h7xx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+ #include "stm32h7xx_hal_dac.h"
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GFXMMU_MODULE_ENABLED
+ #include "stm32h7xx_hal_gfxmmu.h"
+#endif /* HAL_GFXMMU_MODULE_ENABLED */
+
+#ifdef HAL_HRTIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hrtim.h"
+#endif /* HAL_HRTIM_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_SRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sram.h"
+#endif /* HAL_SRAM_MODULE_ENABLED */
+
+#ifdef HAL_NOR_MODULE_ENABLED
+ #include "stm32h7xx_hal_nor.h"
+#endif /* HAL_NOR_MODULE_ENABLED */
+
+#ifdef HAL_NAND_MODULE_ENABLED
+ #include "stm32h7xx_hal_nand.h"
+#endif /* HAL_NAND_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_JPEG_MODULE_ENABLED
+ #include "stm32h7xx_hal_jpeg.h"
+#endif /* HAL_JPEG_MODULE_ENABLED */
+
+#ifdef HAL_MDIOS_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdios.h"
+#endif /* HAL_MDIOS_MODULE_ENABLED */
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32h7xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+#include "stm32h7xx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_LTDC_MODULE_ENABLED
+#include "stm32h7xx_hal_ltdc.h"
+#endif /* HAL_LTDC_MODULE_ENABLED */
+
+#ifdef HAL_OPAMP_MODULE_ENABLED
+#include "stm32h7xx_hal_opamp.h"
+#endif /* HAL_OPAMP_MODULE_ENABLED */
+
+#ifdef HAL_OSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_ospi.h"
+#endif /* HAL_OSPI_MODULE_ENABLED */
+
+#ifdef HAL_OTFDEC_MODULE_ENABLED
+#include "stm32h7xx_hal_otfdec.h"
+#endif /* HAL_OTFDEC_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32h7xx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RAMECC_MODULE_ENABLED
+ #include "stm32h7xx_hal_ramecc.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32h7xx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32h7xx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32h7xx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SD_MODULE_ENABLED
+ #include "stm32h7xx_hal_sd.h"
+#endif /* HAL_SD_MODULE_ENABLED */
+
+#ifdef HAL_SDRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sdram.h"
+#endif /* HAL_SDRAM_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_SPDIFRX_MODULE_ENABLED
+ #include "stm32h7xx_hal_spdifrx.h"
+#endif /* HAL_SPDIFRX_MODULE_ENABLED */
+
+#ifdef HAL_SWPMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_swpmi.h"
+#endif /* HAL_SWPMI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32h7xx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32h7xx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32h7xx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32h7xx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32h7xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_HCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_hcd.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_PSSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_pssi.h"
+#endif /* HAL_PSSI_MODULE_ENABLED */
+
+#ifdef HAL_DTS_MODULE_ENABLED
+ #include "stm32h7xx_hal_dts.h"
+#endif /* HAL_DTS_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr: If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7xx_HAL_CONF_H */
+
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/stm32h7xx_it.h
@@ -1,0 +1,81 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7xx_IT_H
+#define __STM32H7xx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+void DMA1_Stream0_IRQHandler(void);
+void DMA1_Stream1_IRQHandler(void);
+void DMA1_Stream2_IRQHandler(void);
+void ADC_IRQHandler(void);
+void I2C4_EV_IRQHandler(void);
+void I2C4_ER_IRQHandler(void);
+void OTG_FS_EP1_OUT_IRQHandler(void);
+void OTG_FS_EP1_IN_IRQHandler(void);
+void OTG_FS_IRQHandler(void);
+void DMAMUX1_OVR_IRQHandler(void);
+void BDMA_Channel0_IRQHandler(void);
+void BDMA_Channel1_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7xx_IT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/sys.h
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * File Name : SYS.h
+ * Description : This file provides code for the configuration
+ * of the SYS instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __sys_H
+#define __sys_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_SYS_Init(void);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ sys_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/tim.h
@@ -1,0 +1,62 @@
+/**
+ ******************************************************************************
+ * File Name : TIM.h
+ * Description : This file provides code for the configuration
+ * of the TIM instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __tim_H
+#define __tim_H
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+extern TIM_HandleTypeDef htim3;
+extern TIM_HandleTypeDef htim4;
+
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+void MX_TIM3_Init(void);
+void MX_TIM4_Init(void);
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+
+/* USER CODE BEGIN Prototypes */
+
+/* USER CODE END Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*__ tim_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/tunings.h
@@ -1,0 +1,20 @@
+/*
+ * tunings.h
+ *
+ * Created on: Dec 18, 2019
+ * Author: josnyder
+ */
+
+#ifndef TUNINGS_H_
+#define TUNINGS_H_
+
+#define NUM_TUNINGS 66
+
+extern float centsDeviation[12];
+extern float tuningPresets[NUM_TUNINGS][12];
+extern uint32_t currentTuning;
+extern uint8_t keyCenter;
+extern char tuningNames[NUM_TUNINGS][6];
+
+
+#endif /* TUNINGS_H_ */
--- /dev/null
+++ b/LEAF/Inc/ui.h
@@ -1,0 +1,116 @@
+/*
+ * ui.h
+ *
+ * Created on: Aug 30, 2019
+ * Author: jeffsnyder
+ */
+#ifndef UI_H_
+#define UI_H_
+
+#define NUM_ADC_CHANNELS 6
+#define NUM_BUTTONS 10
+
+//PresetNil is used as a counter for the size of the enum
+typedef enum _VocodecPresetType
+{
+ Vocoder = 0,
+ Pitchshift,
+ AutotuneMono,
+ AutotunePoly,
+ SamplerButtonPress,
+ SamplerAutoGrab,
+ Distortion,
+ Wavefolder,
+ BitCrusher,
+ Delay,
+ Reverb,
+ Reverb2,
+ LivingString,
+ LivingStringSynth,
+ ClassicSynth,
+ Rhodes,
+ PresetNil
+} VocodecPresetType;
+
+typedef enum _VocodecButton
+{
+ ButtonEdit = 0,
+ ButtonLeft,
+ ButtonRight,
+ ButtonDown,
+ ButtonUp,
+ ButtonA,
+ ButtonB,
+ ButtonC,
+ ButtonD,
+ ButtonE,
+ ButtonNil
+} VocodecButton;
+
+typedef enum _ButtonAction
+{
+ ActionPress = 0,
+ ActionRelease,
+ ActionHoldInstant,
+ ActionHoldContinuous,
+ ActionNil
+} ButtonAction;
+
+extern uint16_t ADC_values[NUM_ADC_CHANNELS];
+
+extern uint8_t buttonValues[NUM_BUTTONS];
+//extern uint8_t buttonPressed[NUM_BUTTONS];
+//extern uint8_t buttonReleased[NUM_BUTTONS];
+
+extern int8_t writeKnobFlag;
+extern int8_t writeButtonFlag;
+extern int8_t writeActionFlag;
+
+extern float floatADCUI[NUM_ADC_CHANNELS];
+
+extern uint8_t currentPreset;
+extern uint8_t previousPreset;
+extern uint8_t loadingPreset;
+// Display values
+extern char* modeNames[PresetNil];
+extern char* modeNamesDetails[PresetNil];
+extern char* shortModeNames[PresetNil];
+extern char* paramNames[PresetNil][NUM_ADC_CHANNELS + NUM_BUTTONS];
+extern float knobParams[NUM_ADC_CHANNELS];
+extern int8_t cvAddParam;
+extern uint8_t buttonActionsSFX[NUM_BUTTONS][ActionNil];
+extern char* (*buttonActionFunctions[PresetNil])(VocodecButton, ButtonAction);
+
+void initModeNames(void);
+
+void buttonCheck(void);
+
+void adcCheck(void);
+
+void clearButtonActions(void);
+
+void changeTuning(void);
+
+void writeCurrentPresetToFlash(void);
+
+char* UIVocoderButtons(VocodecButton button, ButtonAction action);
+char* UIPitchShiftButtons(VocodecButton button, ButtonAction action);
+char* UINeartuneButtons(VocodecButton button, ButtonAction action);
+char* UIAutotuneButtons(VocodecButton button, ButtonAction action);
+char* UISamplerBPButtons(VocodecButton button, ButtonAction action);
+char* UISamplerAutoButtons(VocodecButton button, ButtonAction action);
+char* UIDistortionButtons(VocodecButton button, ButtonAction action);
+char* UIWaveFolderButtons(VocodecButton button, ButtonAction action);
+char* UIBitcrusherButtons(VocodecButton button, ButtonAction action);
+char* UIDelayButtons(VocodecButton button, ButtonAction action);
+char* UIReverbButtons(VocodecButton button, ButtonAction action);
+char* UIReverb2Buttons(VocodecButton button, ButtonAction action);
+char* UILivingStringButtons(VocodecButton button, ButtonAction action);
+char* UILivingStringSynthButtons(VocodecButton button, ButtonAction action);
+char* UIClassicSynthButtons(VocodecButton button, ButtonAction action);
+char* UIRhodesButtons(VocodecButton button, ButtonAction action);
+
+
+
+#endif /* UI_H_ */
+
--- /dev/null
+++ b/LEAF/Inc/usb_host.h
@@ -1,0 +1,94 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usb_host.h
+ * @version : v1.0_Cube
+ * @brief : Header for usb_host.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_HOST__H__
+#define __USB_HOST__H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx.h"
+#include "stm32h7xx_hal.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+/** @addtogroup USBH_OTG_DRIVER
+ * @{
+ */
+
+/** @defgroup USBH_HOST USBH_HOST
+ * @brief Host file for Usb otg low level driver.
+ * @{
+ */
+
+/** @defgroup USBH_HOST_Exported_Variables USBH_HOST_Exported_Variables
+ * @brief Public variables.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** Status of the application. */
+typedef enum {
+ APPLICATION_IDLE = 0,
+ APPLICATION_START,
+ APPLICATION_READY,
+ APPLICATION_DISCONNECT
+}ApplicationTypeDef;
+
+/** @defgroup USBH_HOST_Exported_FunctionsPrototype USBH_HOST_Exported_FunctionsPrototype
+ * @brief Declaration of public functions for Usb host.
+ * @{
+ */
+
+/* Exported functions -------------------------------------------------------*/
+
+/** @brief USB Host initialization function. */
+void MX_USB_HOST_Init(void);
+
+void MX_USB_HOST_Process(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USB_HOST__H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/usbh_MIDI.h
@@ -1,0 +1,211 @@
+/**
+ ******************************************************************************
+ * @file usbh_MIDI.h
+ * @author Xavier Halgand
+ * @version
+ * @date
+ * @brief This file contains all the prototypes for the usbh_MIDI.c
+ ******************************************************************************
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* Define to prevent recursive ----------------------------------------------*/
+#ifndef __USBH_MIDI_CORE_H
+#define __USBH_MIDI_CORE_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "usbh_core.h"
+//#include "stm32f7xx_nucleo_144.h"
+
+/*-------------------------------------------------------------------------------*/
+// buffer size (should be at least >= MIOS32_USB_MIDI_DESC_DATA_*_SIZE/4)
+#define USB_MIDI_RX_BUFFER_SIZE 64 // packages
+#define USB_MIDI_TX_BUFFER_SIZE 64 // packages
+
+// size of IN/OUT pipe
+#define USB_MIDI_DATA_IN_SIZE 64
+#define USB_MIDI_DATA_OUT_SIZE 64
+
+// endpoint assignments (don't change!)
+#define USB_MIDI_DATA_OUT_EP 0x02
+#define USB_MIDI_DATA_IN_EP 0x81
+/** @defgroup USBH_MIDI_CORE_Exported_Defines
+ * @{
+ */
+#define USB_AUDIO_CLASS 0x01
+#define USB_MIDISTREAMING_SubCLASS 0x03
+#define USB_MIDI_DESC_SIZE 9
+#define USBH_MIDI_CLASS &MIDI_Class
+
+/*-------------------------------------------------------------------------------*/
+
+extern USBH_ClassTypeDef MIDI_Class;
+
+/* -------------------- Exported_Types ------------------------------------------*/
+
+typedef enum {
+ NoteOff = 0x8,
+ NoteOn = 0x9,
+ PolyPressure = 0xa,
+ CC = 0xb,
+ ProgramChange = 0xc,
+ Aftertouch = 0xd,
+ PitchBend = 0xe
+} midi_event_t;
+
+
+typedef enum {
+ Chn1,
+ Chn2,
+ Chn3,
+ Chn4,
+ Chn5,
+ Chn6,
+ Chn7,
+ Chn8,
+ Chn9,
+ Chn10,
+ Chn11,
+ Chn12,
+ Chn13,
+ Chn14,
+ Chn15,
+ Chn16
+} midi_chn_t;
+
+#pragma anon_unions
+
+typedef union {
+ struct {
+ uint32_t ALL;
+ };
+ struct {
+ uint8_t cin_cable;
+ uint8_t evnt0;
+ uint8_t evnt1;
+ uint8_t evnt2;
+ };
+ struct {
+ uint8_t type:4;
+ uint8_t cable:4;
+ uint8_t chn:4; // mios32_midi_chn_t
+ uint8_t event:4; // mios32_midi_event_t
+ uint8_t value1;
+ uint8_t value2;
+ };
+
+ // C++ doesn't allow to redefine names in anonymous unions
+ // as a simple workaround, we rename these redundant names
+ struct {
+ uint8_t cin:4;
+ uint8_t dummy1_cable:4;
+ uint8_t dummy1_chn:4; // mios32_midi_chn_t
+ uint8_t dummy1_event:4; // mios32_midi_event_t
+ uint8_t note:8;
+ uint8_t velocity:8;
+ };
+ struct {
+ uint8_t dummy2_cin:4;
+ uint8_t dummy2_cable:4;
+ uint8_t dummy2_chn:4; // mios32_midi_chn_t
+ uint8_t dummy2_event:4; // mios32_midi_event_t
+ uint8_t cc_number:8;
+ uint8_t value:8;
+ };
+ struct {
+ uint8_t dummy3_cin:4;
+ uint8_t dummy3_cable:4;
+ uint8_t dummy3_chn:4; // mios32_midi_chn_t
+ uint8_t dummy3_event:4; // mios32_midi_event_t
+ uint8_t program_change:8;
+ uint8_t dummy3:8;
+ };
+} midi_package_t;
+
+/* States for MIDI State Machine */
+typedef enum
+{
+ MIDI_IDLE= 0,
+ MIDI_SEND_DATA,
+ MIDI_SEND_DATA_WAIT,
+ MIDI_RECEIVE_DATA,
+ MIDI_RECEIVE_DATA_WAIT,
+}
+MIDI_DataStateTypeDef;
+
+typedef enum
+{
+ MIDI_IDLE_STATE= 0,
+ MIDI_TRANSFER_DATA,
+ MIDI_ERROR_STATE,
+}
+MIDI_StateTypeDef;
+
+/* Structure for MIDI process */
+typedef struct _MIDI_Process
+{
+ MIDI_StateTypeDef state;
+ uint8_t InPipe;
+ uint8_t OutPipe;
+ uint8_t OutEp;
+ uint8_t InEp;
+ uint16_t OutEpSize;
+ uint16_t InEpSize;
+
+ uint8_t *pTxData;
+ uint8_t *pRxData;
+ uint16_t TxDataLength;
+ uint16_t RxDataLength;
+ MIDI_DataStateTypeDef data_tx_state;
+ MIDI_DataStateTypeDef data_rx_state;
+ uint8_t Rx_Poll;
+ //uint8_t buff[8];
+ //MIDI_DataItfTypedef DataItf;
+ //CDC_InterfaceDesc_Typedef CDC_Desc;
+}
+MIDI_HandleTypeDef;
+
+/*---------------------------Exported_FunctionsPrototype-------------------------------------*/
+
+USBH_StatusTypeDef USBH_MIDI_Transmit(USBH_HandleTypeDef *phost,
+ uint8_t *pbuff,
+ uint16_t length);
+
+USBH_StatusTypeDef USBH_MIDI_Receive(USBH_HandleTypeDef *phost,
+ uint8_t *pbuff,
+ uint16_t length);
+
+
+uint32_t USBH_MIDI_GetLastReceivedDataSize(USBH_HandleTypeDef *phost);
+
+USBH_StatusTypeDef USBH_MIDI_Stop(USBH_HandleTypeDef *phost);
+
+void USBH_MIDI_TransmitCallback(USBH_HandleTypeDef *phost);
+
+void USBH_MIDI_ReceiveCallback(USBH_HandleTypeDef *phost, uint32_t myLength);
+
+/*-------------------------------------------------------------------------------------------*/
+#endif /* __USBH_MIDI_CORE_H */
+
+
+/*****************************END OF FILE*************************************************************/
+
--- /dev/null
+++ b/LEAF/Inc/usbh_conf.h
@@ -1,0 +1,199 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usbh_conf.h
+ * @version : v1.0_Cube
+ * @brief : Header for usbh_conf.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USBH_CONF__H__
+#define __USBH_CONF__H__
+#ifdef __cplusplus
+ extern "C" {
+#endif
+/* Includes ------------------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "main.h"
+
+#include "stm32h7xx.h"
+#include "stm32h7xx_hal.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+/** @addtogroup STM32_USB_HOST_LIBRARY
+ * @{
+ */
+
+/** @defgroup USBH_CONF
+ * @brief usb host low level driver configuration file
+ * @{
+ */
+
+/** @defgroup USBH_CONF_Exported_Variables USBH_CONF_Exported_Variables
+ * @brief Public variables.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Defines USBH_CONF_Exported_Defines
+ * @brief Defines for configuration of the Usb host.
+ * @{
+ */
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_ENDPOINTS 2U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_INTERFACES 10U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_CONFIGURATION 10U
+
+/*---------- -----------*/
+#define USBH_KEEP_CFG_DESCRIPTOR 1U
+
+/*---------- -----------*/
+#define USBH_MAX_NUM_SUPPORTED_CLASS 1U
+
+/*---------- -----------*/
+#define USBH_MAX_SIZE_CONFIGURATION 256U
+
+/*---------- -----------*/
+#define USBH_MAX_DATA_BUFFER 512U
+
+/*---------- -----------*/
+#define USBH_DEBUG_LEVEL 0U
+
+/*---------- -----------*/
+#define USBH_USE_OS 0U
+
+
+
+
+/****************************************/
+/* #define for FS and HS identification */
+#define HOST_HS 0
+#define HOST_FS 1
+
+#if (USBH_USE_OS == 1)
+ #include "cmsis_os.h"
+ #define USBH_PROCESS_PRIO osPriorityNormal
+ #define USBH_PROCESS_STACK_SIZE ((uint16_t)0)
+#endif /* (USBH_USE_OS == 1) */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Macros USBH_CONF_Exported_Macros
+ * @brief Aliases.
+ * @{
+ */
+
+/* Memory management macros */
+
+/** Alias for memory allocation. */
+#define USBH_malloc malloc
+
+/** Alias for memory release. */
+#define USBH_free free
+
+/** Alias for memory set. */
+#define USBH_memset memset
+
+/** Alias for memory copy. */
+#define USBH_memcpy memcpy
+
+/* DEBUG macros */
+
+#if (USBH_DEBUG_LEVEL > 0U)
+#define USBH_UsrLog(...) do { \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_UsrLog(...) do {} while (0)
+#endif
+
+#if (USBH_DEBUG_LEVEL > 1U)
+
+#define USBH_ErrLog(...) do { \
+ printf("ERROR: ") ; \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_ErrLog(...) do {} while (0)
+#endif
+
+#if (USBH_DEBUG_LEVEL > 2U)
+#define USBH_DbgLog(...) do { \
+ printf("DEBUG : ") ; \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+} while (0)
+#else
+#define USBH_DbgLog(...) do {} while (0)
+#endif
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_Types USBH_CONF_Exported_Types
+ * @brief Types.
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USBH_CONF_Exported_FunctionsPrototype USBH_CONF_Exported_FunctionsPrototype
+ * @brief Declaration of public functions for Usb host.
+ * @{
+ */
+
+/* Exported functions -------------------------------------------------------*/
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USBH_CONF__H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Inc/usbh_platform.h
@@ -1,0 +1,44 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : usbh_platform.h
+ * @brief : Header for usbh_platform.c file.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USBH_PLATFORM_H__
+#define __USBH_PLATFORM_H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "usb_host.h"
+
+/* USER CODE BEGIN INCLUDE */
+
+/* USER CODE END INCLUDE */
+
+void MX_DriverVbusFS(uint8_t state);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __USBH_PLATFORM_H__ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
binary files a/LEAF/Src/.DS_Store /dev/null differ
--- /dev/null
+++ b/LEAF/Src/MIDI_application.c
@@ -1,0 +1,192 @@
+/*
+ * MIDI_application.c
+ *
+ * Created on: 6 d�c. 2014
+ * Author: Xavier Halgand
+ *
+ * Modified on: 9/12/16 by C.P. to handle the MIDI_IDLE state properly, and
+ * added required code to be compatible with "NucleoSynth"
+ *
+ * 11/8/17 by C.P.: Version 0.7.7 - Use for Casio CTK-6200 Keyboard
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "audiostream.h"
+#include "MIDI_application.h"
+#include "usbh_core.h"
+#include "usbh_MIDI.h"
+#include "usb_host.h"
+#include "sfx.h"
+
+MIDI_ApplicationTypeDef MIDI_Appli_state = MIDI_APPLICATION_READY;
+extern ApplicationTypeDef Appli_state;
+extern USBH_HandleTypeDef hUsbHostFS;
+uint8_t MIDI_RX_Buffer[RX_BUFF_SIZE]__ATTR_RAM_D2; // MIDI reception buffer
+
+uint8_t key, velocity, ctrl, data, sustainInverted;
+
+uint8_t CCs[128];
+/* Private define ------------------------------------------------------------*/
+
+/* Private function prototypes -----------------------------------------------*/
+
+
+
+
+/*-----------------------------------------------------------------------------*/
+/**
+ * @brief Main routine for MIDI application, looped in main.c
+ * @param None
+ * @retval none
+ */
+void MIDI_Application(void)
+{
+ if(Appli_state == APPLICATION_READY)
+ {
+ if(MIDI_Appli_state == MIDI_APPLICATION_READY)
+ {
+
+ USBH_MIDI_Receive(&hUsbHostFS, MIDI_RX_Buffer, RX_BUFF_SIZE); // just once at the beginning, start the first reception
+ MIDI_Appli_state = MIDI_APPLICATION_RUNNING;
+ }
+ }
+ if(Appli_state == APPLICATION_DISCONNECT)
+ {
+ MIDI_Appli_state = MIDI_APPLICATION_READY;
+ USBH_MIDI_Stop(&hUsbHostFS);
+ }
+}
+
+/*-----------------------------------------------------------------------------*/
+void ProcessReceivedMidiDatas(uint32_t myLength)
+{
+ uint16_t numberOfPackets;
+ uint8_t *ptr = MIDI_RX_Buffer;
+ midi_package_t pack;
+
+ numberOfPackets = myLength >> 2; //each USB midi package is 4 bytes long
+
+ if (numberOfPackets != 0)
+ {
+ while(numberOfPackets--)
+ {
+ pack.cin_cable = *ptr ; ptr++ ;
+ pack.evnt0 = *ptr ; ptr++ ;
+ pack.evnt1 = *ptr ; ptr++ ;
+ pack.evnt2 = *ptr ; ptr++ ;
+
+ // Handle MIDI messages
+ switch(pack.evnt0)
+ {
+ case (0x80): // Note Off
+ key = pack.evnt1;
+ velocity = pack.evnt2;
+
+ noteOff(key, velocity);
+
+ break;
+ case (0x90): // Note On
+ key = pack.evnt1;
+ velocity = pack.evnt2;
+
+ noteOn(key, velocity);
+
+ break;
+ case (0xA0):
+ break;
+ case (0xB0):
+ ctrl = pack.evnt1;
+ data = pack.evnt2;
+ CCs[ctrl] = data;
+ switch(ctrl)
+ {
+ case (0x01):
+ break;
+ case (0x02):
+ break;
+ case (0x03):
+ break;
+ case (0x04):
+ break;
+ case (0x0D):
+ break;
+ case (0x4B):
+ break;
+ case (0x4C):
+ break;
+ case (0x5C):
+ break;
+ case (0x5F):
+ break;
+ case (0x49):
+ break;
+ case (0x48):
+ break;
+ case (0x5B):
+ break;
+ case (0x5D):
+ break;
+ case (0x4A):
+ break;
+ case (0x47):
+ break;
+ case (0x05):
+ break;
+ case (0x54):
+ break;
+ case (0x10):
+ break;
+ case (0x11):
+ break;
+ case (0x12):
+ break;
+ case (0x07):
+ break;
+ case (0x13):
+ break;
+ case (0x14):
+ break;
+ case (64): // sustain
+ if (data)
+ {
+ if (sustainInverted) sustainOff();
+ else sustainOn();
+ }
+ else
+ {
+ if (sustainInverted) sustainOn();
+ else sustainOff();
+ }
+ break;
+ }
+
+
+ break;
+ case (0xC0): // Program Change
+ break;
+ case (0xD0): // Mono Aftertouch
+ break;
+ case (0xE0): // Pitch Bend
+ pitchBend((pack.evnt1) + (pack.evnt2 << 7));
+ break;
+ case (0xF0):
+ break;
+ }
+ }
+ }
+}
+
+
+
+/*-----------------------------------------------------------------------------*/
+/**
+ * @brief MIDI data receive callback.
+ * @param phost: Host handle
+ * @retval None
+ */
+void USBH_MIDI_ReceiveCallback(USBH_HandleTypeDef *phost, uint32_t myLength)
+{
+ ProcessReceivedMidiDatas(myLength);
+ USBH_MIDI_Receive(&hUsbHostFS, MIDI_RX_Buffer, RX_BUFF_SIZE); // start a new reception
+}
+
--- /dev/null
+++ b/LEAF/Src/adc.c
@@ -1,0 +1,239 @@
+/**
+ ******************************************************************************
+ * File Name : ADC.c
+ * Description : This file provides code for the configuration
+ * of the ADC instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "adc.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+ADC_HandleTypeDef hadc1;
+DMA_HandleTypeDef hdma_adc1;
+
+/* ADC1 init function */
+void MX_ADC1_Init(void)
+{
+ ADC_MultiModeTypeDef multimode = {0};
+ ADC_ChannelConfTypeDef sConfig = {0};
+
+ /** Common config
+ */
+ hadc1.Instance = ADC1;
+ hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
+ hadc1.Init.Resolution = ADC_RESOLUTION_16B;
+ hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
+ hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
+ hadc1.Init.LowPowerAutoWait = DISABLE;
+ hadc1.Init.ContinuousConvMode = ENABLE;
+ hadc1.Init.NbrOfConversion = 6;
+ hadc1.Init.DiscontinuousConvMode = DISABLE;
+ hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
+ hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+ hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
+ hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
+ hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
+ hadc1.Init.OversamplingMode = ENABLE;
+ hadc1.Init.Oversampling.Ratio = 64;
+ hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_6;
+ hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
+ hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
+ if (HAL_ADC_Init(&hadc1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure the ADC multi-mode
+ */
+ multimode.Mode = ADC_MODE_INDEPENDENT;
+ if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_7;
+ sConfig.Rank = ADC_REGULAR_RANK_1;
+ sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
+ sConfig.SingleDiff = ADC_SINGLE_ENDED;
+ sConfig.OffsetNumber = ADC_OFFSET_NONE;
+ sConfig.Offset = 0;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_19;
+ sConfig.Rank = ADC_REGULAR_RANK_2;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_14;
+ sConfig.Rank = ADC_REGULAR_RANK_3;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_16;
+ sConfig.Rank = ADC_REGULAR_RANK_4;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_15;
+ sConfig.Rank = ADC_REGULAR_RANK_5;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Regular Channel
+ */
+ sConfig.Channel = ADC_CHANNEL_8;
+ sConfig.Rank = ADC_REGULAR_RANK_6;
+ if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+
+void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ HAL_DMA_MuxSyncConfigTypeDef pSyncConfig= {0};
+ if(adcHandle->Instance==ADC1)
+ {
+ /* USER CODE BEGIN ADC1_MspInit 0 */
+
+ /* USER CODE END ADC1_MspInit 0 */
+ /* ADC1 clock enable */
+ __HAL_RCC_ADC12_CLK_ENABLE();
+
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**ADC1 GPIO Configuration
+ PC1 ------> ADC1_INP11
+ PA0 ------> ADC1_INP16
+ PA2 ------> ADC1_INP14
+ PA3 ------> ADC1_INP15
+ PA5 ------> ADC1_INP19
+ PA7 ------> ADC1_INP7
+ PC5 ------> ADC1_INP8
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_5;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5
+ |GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* ADC1 DMA Init */
+ /* ADC1 Init */
+ hdma_adc1.Instance = DMA1_Stream0;
+ hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
+ hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+ hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
+ hdma_adc1.Init.Mode = DMA_CIRCULAR;
+ hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
+ hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
+ hdma_adc1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_1QUARTERFULL;
+ hdma_adc1.Init.MemBurst = DMA_MBURST_SINGLE;
+ hdma_adc1.Init.PeriphBurst = DMA_PBURST_SINGLE;
+ if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_EXTI0;
+ pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_RISING;
+ pSyncConfig.SyncEnable = DISABLE;
+ pSyncConfig.EventEnable = ENABLE;
+ pSyncConfig.RequestNumber = 1;
+ if (HAL_DMAEx_ConfigMuxSync(&hdma_adc1, &pSyncConfig) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
+
+ /* ADC1 interrupt Init */
+ HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(ADC_IRQn);
+ /* USER CODE BEGIN ADC1_MspInit 1 */
+
+ /* USER CODE END ADC1_MspInit 1 */
+ }
+}
+
+void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
+{
+
+ if(adcHandle->Instance==ADC1)
+ {
+ /* USER CODE BEGIN ADC1_MspDeInit 0 */
+
+ /* USER CODE END ADC1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_ADC12_CLK_DISABLE();
+
+ /**ADC1 GPIO Configuration
+ PC1 ------> ADC1_INP11
+ PA0 ------> ADC1_INP16
+ PA2 ------> ADC1_INP14
+ PA3 ------> ADC1_INP15
+ PA5 ------> ADC1_INP19
+ PA7 ------> ADC1_INP7
+ PC5 ------> ADC1_INP8
+ */
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_5);
+
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5
+ |GPIO_PIN_7);
+
+ /* ADC1 DMA DeInit */
+ HAL_DMA_DeInit(adcHandle->DMA_Handle);
+
+ /* ADC1 interrupt Deinit */
+ HAL_NVIC_DisableIRQ(ADC_IRQn);
+ /* USER CODE BEGIN ADC1_MspDeInit 1 */
+
+ /* USER CODE END ADC1_MspDeInit 1 */
+ }
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/audiostream.c
@@ -1,0 +1,518 @@
+/*
+ * audiostream.c
+ *
+ * Created on: Aug 30, 2019
+ * Author: jeffsnyder
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "audiostream.h"
+#include "main.h"
+#include "leaf.h"
+#include "codec.h"
+#include "ui.h"
+#include "oled.h"
+#include "tunings.h"
+#include "i2c.h"
+#include "gpio.h"
+#include "sfx.h"
+#include "tim.h"
+
+//the audio buffers are put in the D2 RAM area because that is a memory location that the DMA has access to.
+int32_t audioOutBuffer[AUDIO_BUFFER_SIZE] __ATTR_RAM_D2;
+int32_t audioInBuffer[AUDIO_BUFFER_SIZE] __ATTR_RAM_D2;
+
+#define SMALL_MEM_SIZE 8192
+#define MED_MEM_SIZE 500000
+#define LARGE_MEM_SIZE 33554432 //32 MBytes - size of SDRAM IC
+char small_memory[SMALL_MEM_SIZE];
+char medium_memory[MED_MEM_SIZE]__ATTR_RAM_D1;
+char large_memory[LARGE_MEM_SIZE] __ATTR_SDRAM;
+
+#define DISPLAY_BLOCK_SIZE 512
+float audioDisplayBuffer[128];
+uint8_t displayBufferIndex = 0;
+float displayBlockVal = 0.0f;
+uint32_t displayBlockCount = 0;
+
+
+void audioFrame(uint16_t buffer_offset);
+float audioTickL(float audioIn);
+float audioTickR(float audioIn);
+void buttonCheck(void);
+
+HAL_StatusTypeDef transmit_status;
+HAL_StatusTypeDef receive_status;
+
+uint8_t codecReady = 0;
+
+uint16_t frameCounter = 0;
+
+tMempool smallPool;
+tMempool largePool;
+
+tRamp adc[6];
+
+tNoise myNoise;
+tCycle mySine[2];
+float smoothedADC[6];
+tEnvelopeFollower LED_envelope[4];
+
+uint32_t clipCounter[4] = {0,0,0,0};
+uint8_t clipped[4] = {0,0,0,0};
+
+
+float rightIn = 0.0f;
+float rightOut = 0.0f;
+float sample = 0.0f;
+
+
+
+// Vocoder
+float glideTimeVoc = 5.0f;
+
+// Formant
+float formantShiftFactor = -1.0f;
+float formantKnob = 0.0f;
+
+// PitchShift
+float pitchFactor = 2.0f;
+float formantWarp = 1.0f;
+float formantIntensity = 1.0f;
+
+// Autotune1
+
+// Autotune2
+float glideTimeAuto = 5.0f;
+
+// Sampler Button Press
+
+
+// Sampler Auto Grab
+
+
+
+
+
+
+BOOL frameCompleted = TRUE;
+
+BOOL bufferCleared = TRUE;
+
+int numBuffersToClearOnLoad = 2;
+int numBuffersCleared = 0;
+
+/**********************************************/
+
+void (*allocFunctions[PresetNil])(void);
+void (*frameFunctions[PresetNil])(void);
+void (*tickFunctions[PresetNil])(float);
+void (*freeFunctions[PresetNil])(void);
+
+void audioInit(I2C_HandleTypeDef* hi2c, SAI_HandleTypeDef* hsaiOut, SAI_HandleTypeDef* hsaiIn)
+{
+ // Initialize LEAF.
+
+ LEAF_init(SAMPLE_RATE, AUDIO_FRAME_SIZE, medium_memory, MED_MEM_SIZE, &randomNumber);
+
+ tMempool_init (&smallPool, small_memory, SMALL_MEM_SIZE);
+ tMempool_init (&largePool, large_memory, LARGE_MEM_SIZE);
+
+ initFunctionPointers();
+
+ //ramps to smooth the knobs
+ for (int i = 0; i < 6; i++)
+ {
+ tRamp_init(&adc[i],19.0f, 1); //set all ramps for knobs to be 9ms ramp time and let the init function know they will be ticked every sample
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ tEnvelopeFollower_init(&LED_envelope[i], 0.02f, .9995f);
+ }
+
+ initGlobalSFXObjects();
+
+// allocFunctions[currentPreset]();
+
+ loadingPreset = 1;
+ previousPreset = PresetNil;
+
+ HAL_Delay(10);
+
+ for (int i = 0; i < AUDIO_BUFFER_SIZE; i++)
+ {
+ audioOutBuffer[i] = 0;
+ }
+
+ HAL_Delay(1);
+
+ // set up the I2S driver to send audio data to the codec (and retrieve input as well)
+ transmit_status = HAL_SAI_Transmit_DMA(hsaiOut, (uint8_t *)&audioOutBuffer[0], AUDIO_BUFFER_SIZE);
+ receive_status = HAL_SAI_Receive_DMA(hsaiIn, (uint8_t *)&audioInBuffer[0], AUDIO_BUFFER_SIZE);
+
+ // with the CS4271 codec IC, the SAI Transmit and Receive must be happening before the chip will respond to
+ // I2C setup messages (it seems to use the masterclock input as it's own internal clock for i2c data, etc)
+ // so while we used to set up codec before starting SAI, now we need to set up codec afterwards, and set a flag to make sure it's ready
+
+ //now to send all the necessary messages to the codec
+ AudioCodec_init(hi2c);
+ HAL_Delay(1);
+
+ //now reconfigue so buttons C and E can be used (they were also connected to I2C for codec setup)
+ HAL_I2C_MspDeInit(hi2c);
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ //PB10, PB11 ------> buttons C and E
+ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+}
+
+void audioFrame(uint16_t buffer_offset)
+{
+ frameCompleted = FALSE;
+
+ int i;
+ int32_t current_sample;
+
+ buttonCheck();
+ adcCheck();
+
+ if (!loadingPreset)
+ {
+ frameFunctions[currentPreset]();
+ }
+
+ //if the codec isn't ready, keep the buffer as all zeros
+ //otherwise, start computing audio!
+
+ bufferCleared = TRUE;
+
+ if (codecReady)
+ {
+ for (i = 0; i < (HALF_BUFFER_SIZE); i++)
+ {
+ if ((i & 1) == 0)
+ {
+ current_sample = (int32_t)(audioTickR((float) (audioInBuffer[buffer_offset + i] << 8) * INV_TWO_TO_31) * TWO_TO_23);
+ }
+ else
+ {
+ current_sample = (int32_t)(audioTickL((float) (audioInBuffer[buffer_offset + i] << 8) * INV_TWO_TO_31) * TWO_TO_23);
+ }
+
+ audioOutBuffer[buffer_offset + i] = current_sample;
+ }
+
+ }
+
+ if (bufferCleared)
+ {
+ numBuffersCleared++;
+ if (numBuffersCleared >= numBuffersToClearOnLoad)
+ {
+ numBuffersCleared = numBuffersToClearOnLoad;
+ if (loadingPreset)
+ {
+ if (previousPreset != PresetNil)
+ {
+ // do this if you want to save knob values when changing off a preset
+// for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+// {
+// presetKnobValues[previousPreset][i] = smoothedADC[i];
+// }
+ freeFunctions[previousPreset]();
+ }
+ else
+ {
+ leaf.clearOnAllocation = 1;
+ }
+ setLED_A(0);
+ setLED_B(0);
+ setLED_1(0);
+ allocFunctions[currentPreset]();
+ for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+ {
+ knobActive[i] = 0;
+ floatADCUI[i] = -1.0f;
+ tRamp_setVal(&adc[i], presetKnobValues[currentPreset][i]);
+ tRamp_setDest(&adc[i], presetKnobValues[currentPreset][i]);
+ smoothedADC[i] = presetKnobValues[currentPreset][i];
+ }
+ leaf.clearOnAllocation = 0;
+ loadingPreset = 0;
+ }
+ }
+ }
+ else numBuffersCleared = 0;
+
+ frameCompleted = TRUE;
+
+ OLED_process(); // process what to write to the screen but don't actually draw
+}
+
+
+
+
+float audioTickL(float audioIn)
+{
+ sample = 0.0f;
+
+ for (int i = 0; i < NUM_ADC_CHANNELS; i++)
+ {
+ smoothedADC[i] = tRamp_tick(&adc[i]);
+ }
+
+ if (loadingPreset) return sample;
+
+ bufferCleared = FALSE;
+
+ tickFunctions[currentPreset](audioIn);
+/*
+ displayBlockVal += fabsf(sample);
+ displayBlockCount++;
+ if (displayBlockCount >= DISPLAY_BLOCK_SIZE)
+ {
+ displayBlockVal *= INV_TWO_TO_9;
+ audioDisplayBuffer[displayBufferIndex] = displayBlockVal;
+ displayBlockVal = 0.0f;
+ displayBlockCount = 0;
+ displayBufferIndex++;
+ if (displayBufferIndex >= 128) displayBufferIndex = 0;
+ }
+ */
+
+ if ((audioIn >= 0.999999f) || (audioIn <= -0.999999f))
+ {
+ setLED_leftin_clip(1);
+ clipCounter[0] = 10000;
+ clipped[0] = 1;
+ }
+ if ((clipCounter[0] > 0) && (clipped[0] == 1))
+ {
+ clipCounter[0]--;
+ }
+ else if ((clipCounter[0] == 0) && (clipped[0] == 1))
+ {
+ setLED_leftin_clip(0);
+ clipped[0] = 0;
+ }
+
+ float current_env = tEnvelopeFollower_tick(&LED_envelope[0], audioIn);
+ uint16_t audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, audioLEDLevel);
+
+
+ current_env = tEnvelopeFollower_tick(&LED_envelope[1], sample);
+ audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 15);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, audioLEDLevel);
+
+
+
+ if ((sample >= 0.999999f) || (sample <= -0.999999f))
+ {
+ setLED_leftout_clip(1);
+ clipCounter[2] = 10000;
+ clipped[2] = 1;
+ }
+ if ((clipCounter[2] > 0) && (clipped[2] == 1))
+ {
+ clipCounter[2]--;
+ }
+ else if ((clipCounter[2] == 0) && (clipped[2] == 1))
+ {
+ setLED_leftout_clip(0);
+ clipped[2] = 0;
+ }
+
+ return sample;
+}
+
+
+
+float audioTickR(float audioIn)
+{
+ rightIn = audioIn;
+
+
+ if ((rightIn >= 0.999999f) || (rightIn <= -0.999999f))
+ {
+ setLED_rightin_clip(1);
+ clipCounter[1] = 10000;
+ clipped[1] = 1;
+ }
+ if ((clipCounter[1] > 0) && (clipped[1] == 1))
+ {
+ clipCounter[1]--;
+ }
+ else if ((clipCounter[1] == 0) && (clipped[1] == 1))
+ {
+ setLED_rightin_clip(0);
+ clipped[1] = 0;
+ }
+
+
+
+ if ((rightOut >= 0.999999f) || (rightOut <= -0.999999f))
+ {
+ setLED_rightout_clip(1);
+ clipCounter[3] = 10000;
+ clipped[3] = 1;
+ }
+ if ((clipCounter[3] > 0) && (clipped[3] == 1))
+ {
+ clipCounter[3]--;
+ }
+ else if ((clipCounter[3] == 0) && (clipped[3] == 1))
+ {
+ setLED_rightout_clip(0);
+ clipped[3] = 0;
+ }
+
+
+ float current_env = tEnvelopeFollower_tick(&LED_envelope[2], rightIn);
+ uint16_t audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, audioLEDLevel);
+
+
+ current_env = tEnvelopeFollower_tick(&LED_envelope[3], rightOut);
+ audioLEDLevel = LEAF_clip(0, (current_env * 32.0f), 16);
+ __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, audioLEDLevel);
+
+
+ return rightOut;
+}
+
+void initFunctionPointers(void)
+{
+ allocFunctions[Vocoder] = SFXVocoderAlloc;
+ frameFunctions[Vocoder] = SFXVocoderFrame;
+ tickFunctions[Vocoder] = SFXVocoderTick;
+ freeFunctions[Vocoder] = SFXVocoderFree;
+
+ allocFunctions[Pitchshift] = SFXPitchShiftAlloc;
+ frameFunctions[Pitchshift] = SFXPitchShiftFrame;
+ tickFunctions[Pitchshift] = SFXPitchShiftTick;
+ freeFunctions[Pitchshift] = SFXPitchShiftFree;
+
+ allocFunctions[AutotuneMono] = SFXNeartuneAlloc;
+ frameFunctions[AutotuneMono] = SFXNeartuneFrame;
+ tickFunctions[AutotuneMono] = SFXNeartuneTick;
+ freeFunctions[AutotuneMono] = SFXNeartuneFree;
+
+ allocFunctions[AutotunePoly] = SFXAutotuneAlloc;
+ frameFunctions[AutotunePoly] = SFXAutotuneFrame;
+ tickFunctions[AutotunePoly] = SFXAutotuneTick;
+ freeFunctions[AutotunePoly] = SFXAutotuneFree;
+
+ allocFunctions[SamplerButtonPress] = SFXSamplerBPAlloc;
+ frameFunctions[SamplerButtonPress] = SFXSamplerBPFrame;
+ tickFunctions[SamplerButtonPress] = SFXSamplerBPTick;
+ freeFunctions[SamplerButtonPress] = SFXSamplerBPFree;
+
+ allocFunctions[SamplerAutoGrab] = SFXSamplerAutoAlloc;
+ frameFunctions[SamplerAutoGrab] = SFXSamplerAutoFrame;
+ tickFunctions[SamplerAutoGrab] = SFXSamplerAutoTick;
+ freeFunctions[SamplerAutoGrab] = SFXSamplerAutoFree;
+
+ allocFunctions[Distortion] = SFXDistortionAlloc;
+ frameFunctions[Distortion] = SFXDistortionFrame;
+ tickFunctions[Distortion] = SFXDistortionTick;
+ freeFunctions[Distortion] = SFXDistortionFree;
+
+ allocFunctions[Wavefolder] = SFXWaveFolderAlloc;
+ frameFunctions[Wavefolder] = SFXWaveFolderFrame;
+ tickFunctions[Wavefolder] = SFXWaveFolderTick;
+ freeFunctions[Wavefolder] = SFXWaveFolderFree;
+
+ allocFunctions[BitCrusher] = SFXBitcrusherAlloc;
+ frameFunctions[BitCrusher] = SFXBitcrusherFrame;
+ tickFunctions[BitCrusher] = SFXBitcrusherTick;
+ freeFunctions[BitCrusher] = SFXBitcrusherFree;
+
+ allocFunctions[Delay] = SFXDelayAlloc;
+ frameFunctions[Delay] = SFXDelayFrame;
+ tickFunctions[Delay] = SFXDelayTick;
+ freeFunctions[Delay] = SFXDelayFree;
+
+ allocFunctions[Reverb] = SFXReverbAlloc;
+ frameFunctions[Reverb] = SFXReverbFrame;
+ tickFunctions[Reverb] = SFXReverbTick;
+ freeFunctions[Reverb] = SFXReverbFree;
+
+ allocFunctions[Reverb2] = SFXReverb2Alloc;
+ frameFunctions[Reverb2] = SFXReverb2Frame;
+ tickFunctions[Reverb2] = SFXReverb2Tick;
+ freeFunctions[Reverb2] = SFXReverb2Free;
+
+ allocFunctions[LivingString] = SFXLivingStringAlloc;
+ frameFunctions[LivingString] = SFXLivingStringFrame;
+ tickFunctions[LivingString] = SFXLivingStringTick;
+ freeFunctions[LivingString] = SFXLivingStringFree;
+
+ allocFunctions[LivingStringSynth] = SFXLivingStringSynthAlloc;
+ frameFunctions[LivingStringSynth] = SFXLivingStringSynthFrame;
+ tickFunctions[LivingStringSynth] = SFXLivingStringSynthTick;
+ freeFunctions[LivingStringSynth] = SFXLivingStringSynthFree;
+
+ allocFunctions[ClassicSynth] = SFXClassicSynthAlloc;
+ frameFunctions[ClassicSynth] = SFXClassicSynthFrame;
+ tickFunctions[ClassicSynth] = SFXClassicSynthTick;
+ freeFunctions[ClassicSynth] = SFXClassicSynthFree;
+
+ allocFunctions[Rhodes] = SFXRhodesAlloc;
+ frameFunctions[Rhodes] = SFXRhodesFrame;
+ tickFunctions[Rhodes] = SFXRhodesTick;
+ freeFunctions[Rhodes] = SFXRhodesFree;
+}
+
+
+
+void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+}
+
+
+void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+
+ audioFrame(HALF_BUFFER_SIZE);
+}
+
+void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
+{
+ if (!frameCompleted)
+ {
+ setLED_C(1);
+ }
+
+ audioFrame(0);
+}
--- /dev/null
+++ b/LEAF/Src/bdma.c
@@ -1,0 +1,66 @@
+/**
+ ******************************************************************************
+ * File Name : dma.c
+ * Description : This file provides code for the configuration
+ * of all the requested memory to memory DMA transfers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "bdma.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure DMA */
+/*----------------------------------------------------------------------------*/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/**
+ * Enable DMA controller clock
+ */
+void MX_BDMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_BDMA_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* BDMA_Channel0_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(BDMA_Channel0_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(BDMA_Channel0_IRQn);
+ /* BDMA_Channel1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(BDMA_Channel1_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(BDMA_Channel1_IRQn);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/bsp_driver_sd.c
@@ -1,0 +1,307 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file bsp_driver_sd.c for H7 (based on stm32h743i_eval_sd.c)
+ * @brief This file includes a generic uSD card driver.
+ * To be completed by the user according to the board used for the project.
+ * @note Functions generated as weak: they can be overriden by
+ * - code in user files
+ * - or BSP code from the FW pack files
+ * if such files are added to the generated project (by the user).
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* USER CODE BEGIN FirstSection */
+/* can be used to modify / undefine following code or add new definitions */
+/* USER CODE END FirstSection */
+/* Includes ------------------------------------------------------------------*/
+#include "bsp_driver_sd.h"
+
+/* Extern variables ---------------------------------------------------------*/
+
+extern SD_HandleTypeDef hsd1;
+
+/* USER CODE BEGIN BeforeInitSection */
+/* can be used to modify / undefine following code or add code */
+/* USER CODE END BeforeInitSection */
+/**
+ * @brief Initializes the SD card device.
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_Init(void)
+{
+ uint8_t sd_state = MSD_OK;
+ /* Check if the SD card is plugged in the slot */
+ if (BSP_SD_IsDetected() != SD_PRESENT)
+ {
+ return MSD_ERROR_SD_NOT_PRESENT;
+ }
+ /* HAL SD initialization */
+ sd_state = HAL_SD_Init(&hsd1);
+ /* Configure SD Bus width (4 bits mode selected) */
+ if (sd_state == MSD_OK)
+ {
+ /* Enable wide operation */
+ if (HAL_SD_ConfigWideBusOperation(&hsd1, SDMMC_BUS_WIDE_4B) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+ }
+
+ return sd_state;
+}
+/* USER CODE BEGIN AfterInitSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END AfterInitSection */
+
+/* USER CODE BEGIN InterruptMode */
+/**
+ * @brief Configures Interrupt mode for SD detection pin.
+ * @retval Returns 0
+ */
+__weak uint8_t BSP_SD_ITConfig(void)
+{
+ /* Code to be updated by the user or replaced by one from the FW pack (in a stmxxxx_sd.c file) */
+
+ return (uint8_t)0;
+}
+
+/* USER CODE END InterruptMode */
+
+/* USER CODE BEGIN BeforeReadBlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeReadBlocksSection */
+/**
+ * @brief Reads block(s) from a specified address in an SD card, in polling mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param ReadAddr: Address from where data is to be read
+ * @param NumOfBlocks: Number of SD blocks to read
+ * @param Timeout: Timeout for read operation
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_ReadBlocks(&hsd1, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeWriteBlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeWriteBlocksSection */
+/**
+ * @brief Writes block(s) to a specified address in an SD card, in polling mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param WriteAddr: Address from where data is to be written
+ * @param NumOfBlocks: Number of SD blocks to write
+ * @param Timeout: Timeout for write operation
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_WriteBlocks(&hsd1, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeReadDMABlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeReadDMABlocksSection */
+/**
+ * @brief Reads block(s) from a specified address in an SD card, in DMA mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param ReadAddr: Address from where data is to be read
+ * @param NumOfBlocks: Number of SD blocks to read
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)
+{
+ uint8_t sd_state = MSD_OK;
+
+ /* Read block(s) in DMA transfer mode */
+ if (HAL_SD_ReadBlocks_DMA(&hsd1, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeWriteDMABlocksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeWriteDMABlocksSection */
+/**
+ * @brief Writes block(s) to a specified address in an SD card, in DMA mode.
+ * @param pData: Pointer to the buffer that will contain the data to transmit
+ * @param WriteAddr: Address from where data is to be written
+ * @param NumOfBlocks: Number of SD blocks to write
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)
+{
+ uint8_t sd_state = MSD_OK;
+
+ /* Write block(s) in DMA transfer mode */
+ if (HAL_SD_WriteBlocks_DMA(&hsd1, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeEraseSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeEraseSection */
+/**
+ * @brief Erases the specified memory area of the given SD card.
+ * @param StartAddr: Start byte address
+ * @param EndAddr: End byte address
+ * @retval SD status
+ */
+__weak uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr)
+{
+ uint8_t sd_state = MSD_OK;
+
+ if (HAL_SD_Erase(&hsd1, StartAddr, EndAddr) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ return sd_state;
+}
+
+/* USER CODE BEGIN BeforeGetCardStateSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeGetCardStateSection */
+
+/**
+ * @brief Gets the current SD card data status.
+ * @param None
+ * @retval Data transfer state.
+ * This value can be one of the following values:
+ * @arg SD_TRANSFER_OK: No data transfer is acting
+ * @arg SD_TRANSFER_BUSY: Data transfer is acting
+ */
+__weak uint8_t BSP_SD_GetCardState(void)
+{
+ return ((HAL_SD_GetCardState(&hsd1) == HAL_SD_CARD_TRANSFER ) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY);
+}
+
+/**
+ * @brief Get SD information about specific SD card.
+ * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure
+ * @retval None
+ */
+__weak void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypeDef *CardInfo)
+{
+ /* Get SD card Information */
+ HAL_SD_GetCardInfo(&hsd1, CardInfo);
+}
+
+/* USER CODE BEGIN BeforeCallBacksSection */
+/* can be used to modify previous code / undefine following code / add code */
+/* USER CODE END BeforeCallBacksSection */
+/**
+ * @brief SD Abort callbacks
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_AbortCallback();
+}
+
+/**
+ * @brief Tx Transfer completed callback
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_WriteCpltCallback();
+}
+
+/**
+ * @brief Rx Transfer completed callback
+ * @param hsd: SD handle
+ * @retval None
+ */
+__weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_ReadCpltCallback();
+}
+
+/* USER CODE BEGIN CallBacksSection_C */
+/**
+ * @brief BSP SD Abort callback
+ * @retval None
+ */
+__weak void BSP_SD_AbortCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Tx Transfer completed callback
+ * @retval None
+ */
+__weak void BSP_SD_WriteCpltCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Rx Transfer completed callback
+ * @retval None
+ */
+__weak void BSP_SD_ReadCpltCallback(void)
+{
+
+}
+/* USER CODE END CallBacksSection_C */
+
+/**
+ * @brief Detects if SD card is correctly plugged in the memory slot or not.
+ * @param None
+ * @retval Returns if SD is detected or not
+ */
+__weak uint8_t BSP_SD_IsDetected(void)
+{
+ __IO uint8_t status = SD_PRESENT;
+
+ if (BSP_PlatformIsDetected() == 0x0)
+ {
+ status = SD_NOT_PRESENT;
+ }
+
+ return status;
+}
+
+/* USER CODE BEGIN AdditionalCode */
+/* user code can be inserted here */
+/* USER CODE END AdditionalCode */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/codec.c
@@ -1,0 +1,125 @@
+#include "codec.h"
+#include "main.h"
+#include "gpio.h"
+#include "audiostream.h"
+
+uint16_t i2cDataSize = 2;
+uint8_t myI2cData[2] = {0,0};
+uint32_t I2Ctimeout = 2000;
+
+//Settings for CS4271
+// translated from the datasheet by JS
+
+// 01h mode control 1
+//
+// M1 M0 ratio1 ratio0 m/s dac_dif2 dac_dif1 dac_dif0 // unsure if setting bit selects master means 1
+// for 48k == 0 1 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of 256X master clock)
+// == 0x41
+// for 96k == 1 0 0 0 0 0 0 1 ( ratio bit chosen as 0 0 based on assumption of <= 256X master clock)
+// == 0x81
+// for 192k == 1 1 1 0 0 0 0 1 ( ratio bit chosen as 1 0 based on assumption of 256X master clock, choose 0 0 (full word would be 0xc1 instead of 0xe1) instead if using something like 64X)
+// == 0xe1
+
+// 02h DAC control
+// AMUTE, FILT_SEL, DEM1, DEM0, RMP_UP, RMP_DN, INV_A, INV_B
+// 0 0 0 0 1 1 0 0
+// == 0x0c if you want a slow ramp up when the part turns on
+// == 0x00 if you want quick start up (which may click)
+
+// 03h dac volume and mixing
+// (NA) B=A soft zerocross ATAPI3 ATAPI2 ATAPI1 ATAPI0 (B=A makes channel volumes not independent)
+// 0 1 1 1 1 0 0 1 (the last four bits set channel L to go to output A and channel R to go to output B, but this is easily changed with mixing or reversal)
+// == 0x79
+//or without soft ramp for any programmed volume changes // == 0x39
+
+// 04h Volume A
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+//or 0x14 for -20db
+
+// 05h Volume B
+// MUTE vol6 vol5 vol4 vol3 vol2 vol1 vol0
+// 0 0 0 0 0 0 0 0
+// == 0x00
+//or 0x14 for -20db
+
+// 06h ADC control
+// (NA) (NA) Dither16 ADC_DIF MUTEA MUTEB HPFDisableA HPFDisableB
+// 0 0 0 1 0 0 0 0
+// ==0x10
+
+// 07h mode control 2
+// (NA) (NA) (NA) LOOP MUTECA=B FREEZE CPEN PDN
+// for power down version == 0 0 0 0 0 0 1 1
+// == 0x03
+// to send dry ADC input into DAC (it seems this will mute the normal DAC output) == 0 0 0 1 0 0 1 0
+// == 0x12
+// for normal operation == 0 0 0 0 0 0 1 0
+// == 0x02
+
+HAL_StatusTypeDef testVal;
+
+
+volatile int blankCount = 0;
+uint16_t addressCounter = 0;
+
+
+void AudioCodec_init(I2C_HandleTypeDef* hi2c) {
+
+ //pull codec reset pin high to start codec working
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
+
+ HAL_Delay(2);
+ //enable control port and put part in power-down mode while loading registers
+ myI2cData[0] = 0x07;
+ myI2cData[1] = 0x03;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+ //HAL_Delay(2);
+
+ myI2cData[0] = 0x01;
+ myI2cData[1] = 0x41;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x02;
+ myI2cData[1] = 0x00;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x03;
+ myI2cData[1] = 0x79;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x04;
+ myI2cData[1] = 0x01;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x05;
+ myI2cData[1] = 0x01;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ myI2cData[0] = 0x06;
+ myI2cData[1] = 0x10;
+ testVal = HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+ //HAL_Delay(1); // might not be necessary
+
+ //turn off power down bit to start things cookin'
+ myI2cData[0] = 0x07;
+ myI2cData[1] = 0x02;
+ HAL_I2C_Master_Transmit(hi2c, CODEC_I2C_ADDRESS, myI2cData, i2cDataSize, I2Ctimeout);
+
+
+ //HAL_Delay(1); // might not be necessary
+ codecReady = 1;
+
+}
--- /dev/null
+++ b/LEAF/Src/debug.c
@@ -1,0 +1,37 @@
+/**
+ ******************************************************************************
+ * File Name : DEBUG.c
+ * Description : This file provides code for the configuration
+ * of the DEBUG instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "debug.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* DEBUG init function */
+void MX_DEBUG_Init(void)
+{
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/dma.c
@@ -1,0 +1,72 @@
+/**
+ ******************************************************************************
+ * File Name : dma.c
+ * Description : This file provides code for the configuration
+ * of all the requested memory to memory DMA transfers.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "dma.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure DMA */
+/*----------------------------------------------------------------------------*/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/**
+ * Enable DMA controller clock
+ */
+void MX_DMA_Init(void)
+{
+
+ /* DMA controller clock enable */
+ __HAL_RCC_DMA1_CLK_ENABLE();
+
+ /* DMA interrupt init */
+ /* DMA1_Stream0_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
+ /* DMA1_Stream1_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 2, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
+ /* DMA1_Stream2_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 2, 0);
+ HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
+ /* DMAMUX1_OVR_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMAMUX1_OVR_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMAMUX1_OVR_IRQn);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/eeprom.c
@@ -1,0 +1,718 @@
+
+
+/** @addtogroup EEPROM_Emulation
+ * @{
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "eeprom.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+
+/* Global variable used to store variable value in read sequence */
+uint16_t DataVar = 0;
+
+/* Virtual address defined by the user: 0xFFFF value is prohibited */
+
+uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};
+uint32_t Address = 0;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+static HAL_StatusTypeDef EE_Format(void);
+static uint16_t EE_FindValidPage(uint8_t Operation);
+static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
+static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
+static uint16_t EE_VerifyPageFullyErased(uint32_t Address);
+
+/**
+ * @brief Restore the pages to a known good state in case of page's status
+ * corruption after a power loss.
+ * @param None.
+ * @retval - Flash error code: on write Flash error
+ * - FLASH_COMPLETE: on success
+ */
+
+uint16_t EE_Init(void)
+{
+ uint16_t PageStatus0 = 6, PageStatus1 = 6;
+ uint16_t VarIdx = 0;
+ uint16_t EepromStatus = 0, ReadStatus = 0;
+ int16_t x = -1;
+ HAL_StatusTypeDef FlashStatus;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+
+ /* Get Page0 status */
+ PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
+ /* Get Page1 status */
+ PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
+
+ pEraseInit.TypeErase = TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Check for invalid header states and repair if necessary */
+ switch (PageStatus0)
+ {
+ case ERASED:
+ if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */
+ {
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */
+ {
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ /* Mark Page1 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE1_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ break;
+
+ case RECEIVE_DATA:
+ if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */
+ {
+ /* Transfer data from Page1 to Page0 */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
+ {
+ x = VarIdx;
+ }
+ if (VarIdx != x)
+ {
+ /* Read the last variables' updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the Page0 */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+ /* Mark Page0 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */
+ {
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_1 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ /* Mark Page0 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS, ((uint32_t)valid));
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else /* Invalid state -> format eeprom */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ break;
+
+ case VALID_PAGE:
+ if (PageStatus1 == VALID_PAGE) /* Invalid state -> format eeprom */
+ {
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ else if (PageStatus1 == ERASED) /* Page0 valid, Page1 erased */
+ {
+ pEraseInit.Sector = PAGE1_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ else /* Page0 valid, Page1 receive */
+ {
+ /* Transfer data from Page0 to Page1 */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
+ {
+ x = VarIdx;
+ }
+ if (VarIdx != x)
+ {
+ /* Read the last variables' updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the Page1 */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+ /* Mark Page1 as valid */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE1_BASE_ADDRESS, ((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+ }
+ break;
+
+ default: /* Any other state -> format eeprom */
+ /* Erase both Page0 and Page1 and set Page0 as valid page */
+ FlashStatus = EE_Format();
+ /* If erase/program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ break;
+ }
+
+ return HAL_OK;
+}
+
+/**
+ * @brief Verify if specified page is fully erased.
+ * @param Address: page address
+ * This parameter can be one of the following values:
+ * @arg PAGE0_BASE_ADDRESS: Page0 base address
+ * @arg PAGE1_BASE_ADDRESS: Page1 base address
+ * @retval page fully erased status:
+ * - 0: if Page not erased
+ * - 1: if Page erased
+ */
+uint16_t EE_VerifyPageFullyErased(uint32_t Address)
+{
+ uint32_t ReadStatus = 1;
+ uint16_t AddressValue = 0x5555;
+
+ /* Check each active page address starting from end */
+ while (Address <= PAGE0_END_ADDRESS)
+ {
+ /* Get the current location content to be compared with virtual address */
+ AddressValue = (*(__IO uint16_t*)Address);
+
+ /* Compare the read address with the virtual address */
+ if (AddressValue != ERASED)
+ {
+
+ /* In case variable value is read, reset ReadStatus flag */
+ ReadStatus = 0;
+
+ break;
+ }
+ /* Next address location */
+ Address = Address + 4;
+ }
+
+ /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */
+ return ReadStatus;
+}
+
+/**
+ * @brief Returns the last stored variable data, if found, which correspond to
+ * the passed virtual address
+ * @param VirtAddress: Variable virtual address
+ * @param Data: Global variable contains the read variable value
+ * @retval Success or error status:
+ * - 0: if variable was found
+ * - 1: if the variable was not found
+ * - NO_VALID_PAGE: if no valid page was found.
+ */
+uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
+{
+ uint16_t ValidPage = PAGE0;
+ uint16_t AddressValue = 0x5555, ReadStatus = 1;
+ uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS;
+
+ /* Get active Page for read operation */
+ ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
+
+ /* Check if there is no valid page */
+ if (ValidPage == NO_VALID_PAGE)
+ {
+ return NO_VALID_PAGE;
+ }
+
+ /* Get the valid Page start Address */
+ PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
+
+ /* Get the valid Page end Address */
+ Address = (uint32_t)((EEPROM_START_ADDRESS - 32) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
+
+ /* Check each active page address starting from end */
+ while (Address > (PageStartAddress + 32))
+ {
+ /* Get the current location content to be compared with virtual address */
+ AddressValue = (*(__IO uint16_t*)Address);
+
+ /* Compare the read address with the virtual address */
+ if (AddressValue == VirtAddress)
+ {
+ /* Get content of Address-2 which is variable value */
+ *Data = (*(__IO uint16_t*)(Address - 32));
+
+ /* In case variable value is read, reset ReadStatus flag */
+ ReadStatus = 0;
+
+ break;
+ }
+ else
+ {
+ /* Next address location */
+ Address = Address - 32;
+ }
+ }
+
+ /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */
+ return ReadStatus;
+}
+
+/**
+ * @brief Writes/upadtes variable data in EEPROM.
+ * @param VirtAddress: Variable virtual address
+ * @param Data: 16 bit data to be written
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
+{
+ uint16_t Status = 0;
+
+ /* Write the variable virtual address and value in the EEPROM */
+ Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
+
+ /* In case the EEPROM active page is full */
+ if (Status == PAGE_FULL)
+ {
+ /* Perform Page transfer */
+ Status = EE_PageTransfer(VirtAddress, Data);
+ }
+
+ /* Return last operation status */
+ return Status;
+}
+
+/**
+ * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE
+ * @param None
+ * @retval Status of the last operation (Flash write or erase) done during
+ * EEPROM formating
+ */
+static HAL_StatusTypeDef EE_Format(void)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+
+ pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = PAGE0_ID;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Erase Page0 */
+ if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+
+ /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, PAGE0_BASE_ADDRESS,((uint32_t)valid));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ pEraseInit.Sector = PAGE1_ID;
+ /* Erase Page1 */
+ if(!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS))
+ {
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ }
+
+ return HAL_OK;
+}
+
+/**
+ * @brief Find valid Page for write or read operation
+ * @param Operation: operation to achieve on the valid page.
+ * This parameter can be one of the following values:
+ * @arg READ_FROM_VALID_PAGE: read operation from valid page
+ * @arg WRITE_IN_VALID_PAGE: write operation from valid page
+ * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case
+ * of no valid page was found
+ */
+static uint16_t EE_FindValidPage(uint8_t Operation)
+{
+ uint16_t PageStatus0 = 6, PageStatus1 = 6;
+
+ /* Get Page0 actual status */
+ PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
+
+ /* Get Page1 actual status */
+ PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
+
+ /* Write or read operation */
+ switch (Operation)
+ {
+ case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */
+ if (PageStatus1 == VALID_PAGE)
+ {
+ /* Page0 receiving data */
+ if (PageStatus0 == RECEIVE_DATA)
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ else
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ }
+ else if (PageStatus0 == VALID_PAGE)
+ {
+ /* Page1 receiving data */
+ if (PageStatus1 == RECEIVE_DATA)
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ else
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ }
+ else
+ {
+ return NO_VALID_PAGE; /* No valid Page */
+ }
+
+ case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */
+ if (PageStatus0 == VALID_PAGE)
+ {
+ return PAGE0; /* Page0 valid */
+ }
+ else if (PageStatus1 == VALID_PAGE)
+ {
+ return PAGE1; /* Page1 valid */
+ }
+ else
+ {
+ return NO_VALID_PAGE ; /* No valid Page */
+ }
+
+ default:
+ return PAGE0; /* Page0 valid */
+ }
+}
+
+/**
+ * @brief Verify if active page is full and Writes variable in EEPROM.
+ * @param VirtAddress: 16 bit virtual address of the variable
+ * @param Data: 16 bit data to be written as variable value
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint16_t ValidPage = PAGE0;
+ uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE;
+
+ uint32_t data32[8] = {Data};
+ uint32_t VirtAddress1[8] = {VirtAddress};
+ /* Get valid Page for write operation */
+ ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
+
+ /* Check if there is no valid page */
+ if (ValidPage == NO_VALID_PAGE)
+ {
+ return NO_VALID_PAGE;
+ }
+
+ /* Get the valid Page start Address */
+ Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
+
+ /* Get the valid Page end Address */
+ PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE));
+
+ /* Check each active page address starting from begining */
+ while (Address < PageEndAddress)
+ {
+ /* Verify if Address and Address+2 contents are 0xFFFFFFFF */
+ if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
+ {
+ /* Set variable data */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address, ((uint32_t)data32));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+ /* Set variable virtual address */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, Address + 32, ((uint32_t)VirtAddress1));
+
+ /* Return program operation status */
+ return FlashStatus;
+ }
+ else
+ {
+ /* Next address location */
+ Address = Address + 64;
+ }
+ }
+
+ /* Return PAGE_FULL in case the valid page is full */
+ return PAGE_FULL;
+}
+
+/**
+ * @brief Transfers last updated variables data from the full Page to
+ * an empty one.
+ * @param VirtAddress: 16 bit virtual address of the variable
+ * @param Data: 16 bit data to be written as variable value
+ * @retval Success or error status:
+ * - FLASH_COMPLETE: on success
+ * - PAGE_FULL: if valid page is full
+ * - NO_VALID_PAGE: if no valid page was found
+ * - Flash error code: on write Flash error
+ */
+static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
+{
+ HAL_StatusTypeDef FlashStatus = HAL_OK;
+ uint32_t NewPageAddress = EEPROM_START_ADDRESS;
+ uint16_t OldPageId=0;
+ uint16_t ValidPage = PAGE0, VarIdx = 0;
+ uint16_t EepromStatus = 0, ReadStatus = 0;
+ uint32_t SectorError = 0;
+ FLASH_EraseInitTypeDef pEraseInit;
+ uint32_t valid[8] = {0x0000};
+ uint32_t receive[8] = {0xEEEE};
+ /* Get active Page for read operation */
+ ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
+
+ if (ValidPage == PAGE1) /* Page1 valid */
+ {
+ /* New page address where variable will be moved to */
+ NewPageAddress = PAGE0_BASE_ADDRESS;
+
+ /* Old page ID where variable will be taken from */
+ OldPageId = PAGE1_ID;
+ }
+ else if (ValidPage == PAGE0) /* Page0 valid */
+ {
+ /* New page address where variable will be moved to */
+ NewPageAddress = PAGE1_BASE_ADDRESS;
+
+ /* Old page ID where variable will be taken from */
+ OldPageId = PAGE0_ID;
+ }
+ else
+ {
+ return NO_VALID_PAGE; /* No valid Page */
+ }
+
+ /* Set the new Page status to RECEIVE_DATA status */
+
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, NewPageAddress, ((uint32_t)receive));
+
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Write the variable passed as parameter in the new active page */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+
+ /* Transfer process: transfer variables from old to the new active page */
+ for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++)
+ {
+ if (VirtAddVarTab[VarIdx] != VirtAddress) /* Check each variable except the one passed as parameter */
+ {
+ /* Read the other last variable updates */
+ ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
+ /* In case variable corresponding to the virtual address was found */
+ if (ReadStatus != 0x1)
+ {
+ /* Transfer the variable to the new active page */
+ EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
+ /* If program operation was failed, a Flash error code is returned */
+ if (EepromStatus != HAL_OK)
+ {
+ return EepromStatus;
+ }
+ }
+ }
+ }
+
+ HAL_FLASH_Unlock();
+
+ /* Clear pending flags (if any) */
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
+ FLASH_FLAG_PGSERR | FLASH_FLAG_WRPERR);
+
+ pEraseInit.TypeErase = TYPEERASE_SECTORS;
+ pEraseInit.Banks = FLASH_BANK_2 ;
+ pEraseInit.Sector = OldPageId;
+ pEraseInit.NbSectors = 1;
+ pEraseInit.VoltageRange = VOLTAGE_RANGE;
+
+ /* Erase the old Page: Set old Page status to ERASED status */
+ FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError);
+ /* If erase operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Set new Page status to VALID_PAGE status */
+ FlashStatus = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, NewPageAddress, ((uint32_t)valid));
+ /* If program operation was failed, a Flash error code is returned */
+ if (FlashStatus != HAL_OK)
+ {
+ return FlashStatus;
+ }
+
+ /* Return last operation flash status */
+ return FlashStatus;
+}
--- /dev/null
+++ b/LEAF/Src/fatfs.c
@@ -1,0 +1,56 @@
+/**
+ ******************************************************************************
+ * @file fatfs.c
+ * @brief Code for fatfs applications
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+#include "fatfs.h"
+
+uint8_t retSD; /* Return value for SD */
+char SDPath[4]; /* SD logical drive path */
+FATFS SDFatFS; /* File system object for SD logical drive */
+FIL SDFile; /* File object for SD */
+
+/* USER CODE BEGIN Variables */
+
+/* USER CODE END Variables */
+
+void MX_FATFS_Init(void)
+{
+ /*## FatFS: Link the SD driver ###########################*/
+ retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
+
+ /* USER CODE BEGIN Init */
+ /* additional user code for init */
+ /* USER CODE END Init */
+}
+
+/**
+ * @brief Gets Time from RTC
+ * @param None
+ * @retval Time in DWORD
+ */
+DWORD get_fattime(void)
+{
+ /* USER CODE BEGIN get_fattime */
+ return 0;
+ /* USER CODE END get_fattime */
+}
+
+/* USER CODE BEGIN Application */
+
+/* USER CODE END Application */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/fatfs_platform.c
@@ -1,0 +1,31 @@
+/**
+ ******************************************************************************
+ * @file : fatfs_platform.c
+ * @brief : fatfs_platform source file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+*/
+#include "fatfs_platform.h"
+
+uint8_t BSP_PlatformIsDetected(void) {
+ uint8_t status = SD_PRESENT;
+ /* Check SD card detect pin */
+ if(HAL_GPIO_ReadPin(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) != GPIO_PIN_RESET)
+ {
+ status = SD_NOT_PRESENT;
+ }
+ /* USER CODE BEGIN 1 */
+ /* user code can be inserted here */
+ /* USER CODE END 1 */
+ return status;
+}
--- /dev/null
+++ b/LEAF/Src/fmc.c
@@ -1,0 +1,281 @@
+/**
+ ******************************************************************************
+ * File Name : FMC.c
+ * Description : This file provides code for the configuration
+ * of the FMC peripheral.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "fmc.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+SDRAM_HandleTypeDef hsdram1;
+
+/* FMC initialization function */
+void MX_FMC_Init(void)
+{
+ FMC_SDRAM_TimingTypeDef SdramTiming = {0};
+
+ /** Perform the SDRAM1 memory initialization sequence
+ */
+ hsdram1.Instance = FMC_SDRAM_DEVICE;
+ /* hsdram1.Init */
+ hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
+ hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
+ hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
+ hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
+ hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
+ hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
+ hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
+ hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
+ hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
+ hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
+ /* SdramTiming */
+ SdramTiming.LoadToActiveDelay = 2;
+ SdramTiming.ExitSelfRefreshDelay = 6;
+ SdramTiming.SelfRefreshTime = 4;
+ SdramTiming.RowCycleDelay = 6;
+ SdramTiming.WriteRecoveryTime = 2;
+ SdramTiming.RPDelay = 2;
+ SdramTiming.RCDDelay = 2;
+
+ if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
+ {
+ Error_Handler( );
+ }
+
+ HAL_SetFMCMemorySwappingConfig(FMC_SWAPBMAP_SDRAM_SRAM);
+
+}
+
+static uint32_t FMC_Initialized = 0;
+
+static void HAL_FMC_MspInit(void){
+ /* USER CODE BEGIN FMC_MspInit 0 */
+
+ /* USER CODE END FMC_MspInit 0 */
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if (FMC_Initialized) {
+ return;
+ }
+ FMC_Initialized = 1;
+
+ /* Peripheral clock enable */
+ __HAL_RCC_FMC_CLK_ENABLE();
+
+ /** FMC GPIO Configuration
+ PF0 ------> FMC_A0
+ PF1 ------> FMC_A1
+ PF2 ------> FMC_A2
+ PF3 ------> FMC_A3
+ PF4 ------> FMC_A4
+ PF5 ------> FMC_A5
+ PC0 ------> FMC_SDNWE
+ PC2_C ------> FMC_SDNE0
+ PC3_C ------> FMC_SDCKE0
+ PF11 ------> FMC_SDNRAS
+ PF12 ------> FMC_A6
+ PF13 ------> FMC_A7
+ PF14 ------> FMC_A8
+ PF15 ------> FMC_A9
+ PG0 ------> FMC_A10
+ PG1 ------> FMC_A11
+ PE7 ------> FMC_D4
+ PE8 ------> FMC_D5
+ PE9 ------> FMC_D6
+ PE10 ------> FMC_D7
+ PE11 ------> FMC_D8
+ PE12 ------> FMC_D9
+ PE13 ------> FMC_D10
+ PE14 ------> FMC_D11
+ PE15 ------> FMC_D12
+ PD8 ------> FMC_D13
+ PD9 ------> FMC_D14
+ PD10 ------> FMC_D15
+ PD14 ------> FMC_D0
+ PD15 ------> FMC_D1
+ PG2 ------> FMC_A12
+ PG4 ------> FMC_BA0
+ PG5 ------> FMC_BA1
+ PG8 ------> FMC_SDCLK
+ PD0 ------> FMC_D2
+ PD1 ------> FMC_D3
+ PG15 ------> FMC_SDNCAS
+ PE0 ------> FMC_NBL0
+ PE1 ------> FMC_NBL1
+ */
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
+ |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
+ |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
+ |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+ /* GPIO_InitStruct */
+ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /* USER CODE BEGIN FMC_MspInit 1 */
+
+ /* USER CODE END FMC_MspInit 1 */
+}
+
+void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* sdramHandle){
+ /* USER CODE BEGIN SDRAM_MspInit 0 */
+
+ /* USER CODE END SDRAM_MspInit 0 */
+ HAL_FMC_MspInit();
+ /* USER CODE BEGIN SDRAM_MspInit 1 */
+
+ /* USER CODE END SDRAM_MspInit 1 */
+}
+
+static uint32_t FMC_DeInitialized = 0;
+
+static void HAL_FMC_MspDeInit(void){
+ /* USER CODE BEGIN FMC_MspDeInit 0 */
+
+ /* USER CODE END FMC_MspDeInit 0 */
+ if (FMC_DeInitialized) {
+ return;
+ }
+ FMC_DeInitialized = 1;
+ /* Peripheral clock enable */
+ __HAL_RCC_FMC_CLK_DISABLE();
+
+ /** FMC GPIO Configuration
+ PF0 ------> FMC_A0
+ PF1 ------> FMC_A1
+ PF2 ------> FMC_A2
+ PF3 ------> FMC_A3
+ PF4 ------> FMC_A4
+ PF5 ------> FMC_A5
+ PC0 ------> FMC_SDNWE
+ PC2_C ------> FMC_SDNE0
+ PC3_C ------> FMC_SDCKE0
+ PF11 ------> FMC_SDNRAS
+ PF12 ------> FMC_A6
+ PF13 ------> FMC_A7
+ PF14 ------> FMC_A8
+ PF15 ------> FMC_A9
+ PG0 ------> FMC_A10
+ PG1 ------> FMC_A11
+ PE7 ------> FMC_D4
+ PE8 ------> FMC_D5
+ PE9 ------> FMC_D6
+ PE10 ------> FMC_D7
+ PE11 ------> FMC_D8
+ PE12 ------> FMC_D9
+ PE13 ------> FMC_D10
+ PE14 ------> FMC_D11
+ PE15 ------> FMC_D12
+ PD8 ------> FMC_D13
+ PD9 ------> FMC_D14
+ PD10 ------> FMC_D15
+ PD14 ------> FMC_D0
+ PD15 ------> FMC_D1
+ PG2 ------> FMC_A12
+ PG4 ------> FMC_BA0
+ PG5 ------> FMC_BA1
+ PG8 ------> FMC_SDCLK
+ PD0 ------> FMC_D2
+ PD1 ------> FMC_D3
+ PG15 ------> FMC_SDNCAS
+ PE0 ------> FMC_NBL0
+ PE1 ------> FMC_NBL1
+ */
+
+ HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
+ |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
+
+ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3);
+
+ HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
+ |GPIO_PIN_5|GPIO_PIN_8|GPIO_PIN_15);
+
+ HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
+ |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
+
+ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
+ |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
+
+ /* USER CODE BEGIN FMC_MspDeInit 1 */
+
+ /* USER CODE END FMC_MspDeInit 1 */
+}
+
+void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* sdramHandle){
+ /* USER CODE BEGIN SDRAM_MspDeInit 0 */
+
+ /* USER CODE END SDRAM_MspDeInit 0 */
+ HAL_FMC_MspDeInit();
+ /* USER CODE BEGIN SDRAM_MspDeInit 1 */
+
+ /* USER CODE END SDRAM_MspDeInit 1 */
+}
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/gfx.c
@@ -1,0 +1,983 @@
+/*
+ * gfx.c
+ * a C port of the Adafruit GFX library
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+
+/*
+This is the core graphics library for all our displays, providing a common
+set of graphics primitives (points, lines, circles, etc.). It needs to be
+paired with a hardware-specific library for each display device we carry
+(to handle the lower-level functions).
+
+Adafruit invests time and resources providing this open source code, please
+support Adafruit & open-source hardware by purchasing products from Adafruit!
+
+Copyright (c) 2013 Adafruit Industries. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+- 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.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+ */
+#include "stm32h7xx_hal.h"
+#include "gfx.h"
+#include "gfx_font.c"
+#include "main.h"
+
+// Many (but maybe not all) non-AVR board installs define macros
+// for compatibility with existing PROGMEM-reading AVR code.
+// Do our own checks and defines here for good measure...
+
+#ifndef pgm_read_byte
+ #define pgm_read_byte(addr) (*(const unsigned char *)(addr))
+#endif
+#ifndef pgm_read_word
+ #define pgm_read_word(addr) (*(const unsigned short *)(addr))
+#endif
+#ifndef pgm_read_dword
+ #define pgm_read_dword(addr) (*(const unsigned long *)(addr))
+#endif
+
+// Pointers are a peculiar case...typically 16-bit on AVR boards,
+// 32 bits elsewhere. Try to accommodate both...
+
+
+ #define pgm_read_pointer(addr) ((void *)pgm_read_dword(addr))
+
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef _swap_int16_t
+#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
+#endif
+
+void GFXinit(GFX* myGfx, int16_t w, int16_t h)
+{
+ myGfx->WIDTH = w;
+ myGfx->HEIGHT = h;
+ myGfx->_width = w;
+ myGfx->_height = h;
+ myGfx->rotation = 0;
+ myGfx->cursor_y = 0;
+ myGfx->cursor_x = 0;
+ myGfx->textsize = 1;
+ myGfx->textcolor = 0xFFFF;
+ myGfx->textbgcolor = 0xFFFF;
+ myGfx->wrap = 1;
+ myGfx->_cp437 = 0;
+ myGfx->gfxFont = NULL;
+}
+
+// Bresenham's algorithm - thx wikpedia
+void GFXwriteLine(GFX* myGFX, int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ uint16_t color) {
+ int16_t steep = abs(y1 - y0) > abs(x1 - x0);
+ if (steep) {
+ _swap_int16_t(x0, y0);
+ _swap_int16_t(x1, y1);
+ }
+
+ if (x0 > x1) {
+ _swap_int16_t(x0, x1);
+ _swap_int16_t(y0, y1);
+ }
+
+ int16_t dx, dy;
+ dx = x1 - x0;
+ dy = abs(y1 - y0);
+
+ int16_t err = dx / 2;
+ int16_t ystep;
+
+ if (y0 < y1) {
+ ystep = 1;
+ } else {
+ ystep = -1;
+ }
+
+ for (; x0<=x1; x0++) {
+ if (steep) {
+ GFXwritePixel(myGFX, y0, x0, color);
+ } else {
+ GFXwritePixel(myGFX, x0, y0, color);
+ }
+ err -= dy;
+ if (err < 0) {
+ y0 += ystep;
+ err += dx;
+ }
+ }
+}
+
+void GFXstartWrite(GFX* myGFX){
+ // Overwrite in subclasses if desired!
+}
+
+// the most basic function, set a single pixel
+void GFXdrawPixel(GFX* myGFX, int16_t x, int16_t y, uint16_t color) {
+ if ((x < 0) || (x >= myGFX->_width) || (y < 0) || (y >= myGFX->_height))
+ return;
+
+ // check rotation, move pixel around if necessary
+ switch (GFXgetRotation(myGFX)) {
+ case 1:
+ _swap_int16_t(x, y);
+ x = myGFX->WIDTH - x - 1;
+ break;
+ case 2:
+ x = myGFX->WIDTH - x - 1;
+ y = myGFX->HEIGHT - y - 1;
+ break;
+ case 3:
+ _swap_int16_t(x, y);
+ y = myGFX->HEIGHT - y - 1;
+ break;
+ }
+
+ // x is which column
+ switch (color)
+ {
+ case WHITE: buffer[x+ (y/8)*myGFX->WIDTH] |= (1 << (y&7)); break;
+ case BLACK: buffer[x+ (y/8)*myGFX->WIDTH] &= ~(1 << (y&7)); break;
+ case INVERSE: buffer[x+ (y/8)*myGFX->WIDTH] ^= (1 << (y&7)); break;
+ }
+
+}
+
+void GFXwritePixel(GFX* myGFX,int16_t x, int16_t y, uint16_t color){
+ // Overwrite in subclasses if startWrite is defined!
+ GFXdrawPixel(myGFX, x, y, color);
+}
+
+// (x,y) is topmost point; if unsure, calling function
+// should sort endpoints or call writeLine() instead
+void GFXwriteFastVLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Can be just writeLine(x, y, x, y+h-1, color);
+ // or writeFillRect(x, y, 1, h, color);
+ GFXdrawFastVLine(myGFX, x, y, h, color);
+}
+
+// (x,y) is leftmost point; if unsure, calling function
+// should sort endpoints or call writeLine() instead
+void GFXwriteFastHLine(GFX* myGFX, int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ // Overwrite in subclasses if startWrite is defined!
+ // Example: writeLine(x, y, x+w-1, y, color);
+ // or writeFillRect(x, y, w, 1, color);
+ GFXdrawFastHLine(myGFX,x, y, w, color);
+}
+
+void GFXwriteFillRect(GFX* myGFX,int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ // Overwrite in subclasses if desired!
+ GFXfillRect(myGFX,x,y,w,h,color);
+}
+
+void GFXendWrite(GFX* myGFX){
+ // Overwrite in subclasses if startWrite is defined!
+}
+
+// (x,y) is topmost point; if unsure, calling function
+// should sort endpoints or call drawLine() instead
+void GFXdrawFastVLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t h, uint16_t color) {
+ // Update in subclasses if desired!
+ GFXwriteLine(myGFX,x, y, x, y+h-1, color);
+}
+
+// (x,y) is leftmost point; if unsure, calling function
+// should sort endpoints or call drawLine() instead
+void GFXdrawFastHLine(GFX* myGFX,int16_t x, int16_t y,
+ int16_t w, uint16_t color) {
+ // Update in subclasses if desired!
+ GFXwriteLine(myGFX,x, y, x+w-1, y, color);
+}
+
+void GFXfillRect(GFX* myGFX,int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+ // Update in subclasses if desired!
+ for (int16_t i=x; i<x+w; i++) {
+ GFXwriteFastVLine(myGFX,i, y, h, color);
+ }
+}
+
+void GFXfillScreen(GFX* myGFX,uint16_t color) {
+ // Update in subclasses if desired!
+ GFXfillRect(myGFX,0, 0, myGFX->_width, myGFX->_height, color);
+}
+
+void GFXdrawLine(GFX* myGFX,int16_t x0, int16_t y0, int16_t x1, int16_t y1,
+ uint16_t color) {
+ // Update in subclasses if desired!
+ if(x0 == x1){
+ if(y0 > y1) _swap_int16_t(y0, y1);
+ GFXdrawFastVLine(myGFX,x0, y0, y1 - y0 + 1, color);
+ } else if(y0 == y1){
+ if(x0 > x1) _swap_int16_t(x0, x1);
+ GFXdrawFastHLine(myGFX,x0, y0, x1 - x0 + 1, color);
+ } else {
+ GFXwriteLine(myGFX,x0, y0, x1, y1, color);
+ }
+}
+
+// Draw a circle outline
+void GFXdrawCircle(GFX* myGFX,int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ GFXwritePixel(myGFX,x0 , y0+r, color);
+ GFXwritePixel(myGFX,x0 , y0-r, color);
+ GFXwritePixel(myGFX,x0+r, y0 , color);
+ GFXwritePixel(myGFX,x0-r, y0 , color);
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ GFXwritePixel(myGFX,x0 + x, y0 + y, color);
+ GFXwritePixel(myGFX,x0 - x, y0 + y, color);
+ GFXwritePixel(myGFX,x0 + x, y0 - y, color);
+ GFXwritePixel(myGFX,x0 - x, y0 - y, color);
+ GFXwritePixel(myGFX,x0 + y, y0 + x, color);
+ GFXwritePixel(myGFX,x0 - y, y0 + x, color);
+ GFXwritePixel(myGFX,x0 + y, y0 - x, color);
+ GFXwritePixel(myGFX,x0 - y, y0 - x, color);
+ }
+
+}
+
+void GFXdrawCircleHelper(GFX* myGFX,int16_t x0, int16_t y0,
+ int16_t r, uint8_t cornername, uint16_t color) {
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+ if (cornername & 0x4) {
+ GFXwritePixel(myGFX, x0 + x, y0 + y, color);
+ GFXwritePixel(myGFX, x0 + y, y0 + x, color);
+ }
+ if (cornername & 0x2) {
+ GFXwritePixel(myGFX, x0 + x, y0 - y, color);
+ GFXwritePixel(myGFX, x0 + y, y0 - x, color);
+ }
+ if (cornername & 0x8) {
+ GFXwritePixel(myGFX, x0 - y, y0 + x, color);
+ GFXwritePixel(myGFX, x0 - x, y0 + y, color);
+ }
+ if (cornername & 0x1) {
+ GFXwritePixel(myGFX, x0 - y, y0 - x, color);
+ GFXwritePixel(myGFX, x0 - x, y0 - y, color);
+ }
+ }
+}
+
+void GFXfillCircle(GFX* myGFX, int16_t x0, int16_t y0, int16_t r,
+ uint16_t color) {
+
+ GFXwriteFastVLine(myGFX, x0, y0-r, 2*r+1, color);
+ GFXfillCircleHelper(myGFX, x0, y0, r, 3, 0, color);
+
+}
+
+// Used to do circles and roundrects
+void GFXfillCircleHelper(GFX* myGFX, int16_t x0, int16_t y0, int16_t r,
+ uint8_t cornername, int16_t delta, uint16_t color) {
+
+ int16_t f = 1 - r;
+ int16_t ddF_x = 1;
+ int16_t ddF_y = -2 * r;
+ int16_t x = 0;
+ int16_t y = r;
+
+ while (x<y) {
+ if (f >= 0) {
+ y--;
+ ddF_y += 2;
+ f += ddF_y;
+ }
+ x++;
+ ddF_x += 2;
+ f += ddF_x;
+
+ if (cornername & 0x1) {
+ GFXwriteFastVLine(myGFX, x0+x, y0-y, 2*y+1+delta, color);
+ GFXwriteFastVLine(myGFX, x0+y, y0-x, 2*x+1+delta, color);
+ }
+ if (cornername & 0x2) {
+ GFXwriteFastVLine(myGFX, x0-x, y0-y, 2*y+1+delta, color);
+ GFXwriteFastVLine(myGFX, x0-y, y0-x, 2*x+1+delta, color);
+ }
+ }
+}
+
+// Draw a rectangle
+void GFXdrawRect(GFX* myGFX, int16_t x, int16_t y, int16_t w, int16_t h,
+ uint16_t color) {
+
+ GFXwriteFastHLine(myGFX, x, y, w, color);
+ GFXwriteFastHLine(myGFX, x, y+h-1, w, color);
+ GFXwriteFastVLine(myGFX, x, y, h, color);
+ GFXwriteFastVLine(myGFX, x+w-1, y, h, color);
+
+}
+
+// Draw a rounded rectangle
+void GFXdrawRoundRect(GFX* myGFX, int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ GFXwriteFastHLine(myGFX, x+r , y , w-2*r, color); // Top
+ GFXwriteFastHLine(myGFX, x+r , y+h-1, w-2*r, color); // Bottom
+ GFXwriteFastVLine(myGFX, x , y+r , h-2*r, color); // Left
+ GFXwriteFastVLine(myGFX, x+w-1, y+r , h-2*r, color); // Right
+ // draw four corners
+ GFXdrawCircleHelper(myGFX, x+r , y+r , r, 1, color);
+ GFXdrawCircleHelper(myGFX, x+w-r-1, y+r , r, 2, color);
+ GFXdrawCircleHelper(myGFX, x+w-r-1, y+h-r-1, r, 4, color);
+ GFXdrawCircleHelper(myGFX, x+r , y+h-r-1, r, 8, color);
+
+}
+
+// Fill a rounded rectangle
+void GFXfillRoundRect(GFX* myGFX, int16_t x, int16_t y, int16_t w,
+ int16_t h, int16_t r, uint16_t color) {
+ // smarter version
+ GFXwriteFillRect(myGFX, x+r, y, w-2*r, h, color);
+ // draw four corners
+ GFXfillCircleHelper(myGFX, x+w-r-1, y+r, r, 1, h-2*r-1, color);
+ GFXfillCircleHelper(myGFX, x+r , y+r, r, 2, h-2*r-1, color);
+
+}
+
+// Draw a triangle
+void GFXdrawTriangle(GFX* myGFX, int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+ GFXdrawLine(myGFX, x0, y0, x1, y1, color);
+ GFXdrawLine(myGFX, x1, y1, x2, y2, color);
+ GFXdrawLine(myGFX, x2, y2, x0, y0, color);
+}
+
+// Fill a triangle
+void GFXfillTriangle(GFX* myGFX, int16_t x0, int16_t y0,
+ int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) {
+
+ int16_t a, b, y, last;
+
+ // Sort coordinates by Y order (y2 >= y1 >= y0)
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+ if (y1 > y2) {
+ _swap_int16_t(y2, y1); _swap_int16_t(x2, x1);
+ }
+ if (y0 > y1) {
+ _swap_int16_t(y0, y1); _swap_int16_t(x0, x1);
+ }
+
+
+ if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing
+ a = b = x0;
+ if(x1 < a) a = x1;
+ else if(x1 > b) b = x1;
+ if(x2 < a) a = x2;
+ else if(x2 > b) b = x2;
+ GFXwriteFastHLine(myGFX, a, y0, b-a+1, color);
+
+ return;
+ }
+
+ int16_t
+ dx01 = x1 - x0,
+ dy01 = y1 - y0,
+ dx02 = x2 - x0,
+ dy02 = y2 - y0,
+ dx12 = x2 - x1,
+ dy12 = y2 - y1;
+ int32_t
+ sa = 0,
+ sb = 0;
+
+ // For upper part of triangle, find scanline crossings for segments
+ // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
+ // is included here (and second loop will be skipped, avoiding a /0
+ // error there), otherwise scanline y1 is skipped here and handled
+ // in the second loop...which also avoids a /0 error here if y0=y1
+ // (flat-topped triangle).
+ if(y1 == y2) last = y1; // Include y1 scanline
+ else last = y1-1; // Skip it
+
+ for(y=y0; y<=last; y++) {
+ a = x0 + sa / dy01;
+ b = x0 + sb / dy02;
+ sa += dx01;
+ sb += dx02;
+ /* longhand:
+ a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ GFXwriteFastHLine(myGFX,a, y, b-a+1, color);
+ }
+
+ // For lower part of triangle, find scanline crossings for segments
+ // 0-2 and 1-2. This loop is skipped if y1=y2.
+ sa = dx12 * (y - y1);
+ sb = dx02 * (y - y0);
+ for(; y<=y2; y++) {
+ a = x1 + sa / dy12;
+ b = x0 + sb / dy02;
+ sa += dx12;
+ sb += dx02;
+ /* longhand:
+ a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
+ b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
+ */
+ if(a > b) _swap_int16_t(a,b);
+ GFXwriteFastHLine(myGFX, a, y, b-a+1, color);
+ }
+
+}
+
+// BITMAP / XBITMAP / GRAYSCALE / RGB BITMAP FUNCTIONS ---------------------
+
+
+
+// Draw a RAM-resident 1-bit image at the specified (x,y) position,
+// using the specified foreground (for set bits) and background (unset
+// bits) colors.
+void GFXdrawBitmap(GFX* myGFX, int16_t x, int16_t y,
+ uint8_t *bitmap, int16_t w, int16_t h, uint16_t color, uint16_t bg) {
+
+ int16_t byteWidth = (w + 7) / 8; // Bitmap scanline pad = whole byte
+ uint8_t byte = 0;
+
+ startWrite();
+ for(int16_t j=0; j<h; j++, y++) {
+ for(int16_t i=0; i<w; i++ ) {
+ if(i & 7) byte <<= 1;
+ else byte = bitmap[j * byteWidth + i / 8];
+ GFXwritePixel(myGFX, x+i, y, (byte & 0x80) ? color : bg);
+ }
+ }
+ endWrite();
+}
+
+
+
+// TEXT- AND CHARACTER-HANDLING FUNCTIONS ----------------------------------
+
+// Draw a character
+void GFXdrawChar(GFX* myGFX, int16_t x, int16_t y, unsigned char c,
+ uint16_t color, uint16_t bg, uint8_t size) {
+
+ if(!myGFX->gfxFont) { // 'Classic' built-in font
+
+ if((x >= myGFX->_width) || // Clip right
+ (y >= myGFX->_height) || // Clip bottom
+ ((x + 6 * size - 1) < 0) || // Clip left
+ ((y + 8 * size - 1) < 0)) // Clip top
+ return;
+
+ if(!myGFX->_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior
+
+
+ for(int8_t i=0; i<5; i++ ) { // Char bitmap = 5 columns
+ uint8_t line = pgm_read_byte(&standardGFXfont[c * 5 + i]);
+ for(int8_t j=0; j<8; j++, line >>= 1) {
+ if(line & 1) {
+ if(size == 1)
+ GFXwritePixel(myGFX, x+i, y+j, color);
+ else
+ GFXwriteFillRect(myGFX, x+i*size, y+j*size, size, size, color);
+ } else if(bg != color) {
+ if(size == 1)
+ GFXwritePixel(myGFX, x+i, y+j, bg);
+ else
+ GFXwriteFillRect(myGFX, x+i*size, y+j*size, size, size, bg);
+ }
+ }
+ }
+ if(bg != color) { // If opaque, draw vertical line for last column
+ if(size == 1) GFXwriteFastVLine(myGFX, x+5, y, 8, bg);
+ else GFXwriteFillRect(myGFX, x+5*size, y, size, 8*size, bg);
+ }
+
+
+ } else { // Custom font
+
+ // Character is assumed previously filtered by write() to eliminate
+ // newlines, returns, non-printable characters, etc. Calling
+ // drawChar() directly with 'bad' characters of font may cause mayhem!
+
+ c -= (uint8_t)pgm_read_byte(&myGFX->gfxFont->first);
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(&myGFX->gfxFont->glyph))[c]);
+ uint8_t *bitmap = (uint8_t *)pgm_read_pointer(&myGFX->gfxFont->bitmap);
+
+ uint16_t bo = pgm_read_word(&glyph->bitmapOffset);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ uint8_t xx, yy, bits = 0, bit = 0;
+ int16_t xo16 = 0, yo16 = 0;
+
+ if(size > 1) {
+ xo16 = xo;
+ yo16 = yo;
+ }
+
+ // Todo: Add character clipping here
+
+ // NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS.
+ // THIS IS ON PURPOSE AND BY DESIGN. The background color feature
+ // has typically been used with the 'classic' font to overwrite old
+ // screen contents with new data. This ONLY works because the
+ // characters are a uniform size; it's not a sensible thing to do with
+ // proportionally-spaced fonts with glyphs of varying sizes (and that
+ // may overlap). To replace previously-drawn text when using a custom
+ // font, use the getTextBounds() function to determine the smallest
+ // rectangle encompassing a string, erase the area with fillRect(),
+ // then draw new text. This WILL infortunately 'blink' the text, but
+ // is unavoidable. Drawing 'background' pixels will NOT fix this,
+ // only creates a new set of problems. Have an idea to work around
+ // this (a canvas object type for MCUs that can afford the RAM and
+ // displays supporting setAddrWindow() and pushColors()), but haven't
+ // implemented this yet.
+
+
+ for(yy=0; yy<h; yy++) {
+ for(xx=0; xx<w; xx++) {
+ if(!(bit++ & 7)) {
+ bits = pgm_read_byte(&bitmap[bo++]);
+ }
+ if(bits & 0x80) {
+ if(size == 1) {
+ GFXwritePixel(myGFX, x+xo+xx, y+yo+yy, color);
+ } else {
+ GFXwriteFillRect(myGFX, x+(xo16+xx)*size, y+(yo16+yy)*size,
+ size, size, color);
+ }
+ }
+ bits <<= 1;
+ }
+ }
+
+
+ } // End classic vs custom font
+}
+
+
+void GFXwrite(GFX* myGFX, uint8_t c) {
+
+ if(!myGFX->gfxFont) { // 'Classic' built-in font
+
+ if(c == '\n') { // Newline?
+ myGFX->cursor_x = 0; // Reset x to zero,
+ myGFX->cursor_y += myGFX->textsize * 8; // advance y one line
+ } else if(c != '\r') { // Ignore carriage returns
+ if(myGFX->wrap && ((myGFX->cursor_x + myGFX->textsize * 6) > myGFX->_width)) { // Off right?
+ myGFX->cursor_x = 0; // Reset x to zero,
+ myGFX->cursor_y += myGFX->textsize * 8; // advance y one line
+ }
+ GFXdrawChar(myGFX, myGFX->cursor_x, myGFX->cursor_y, c, myGFX->textcolor, myGFX->textbgcolor, myGFX->textsize);
+ myGFX->cursor_x += myGFX->textsize * 6; // Advance x one char
+ }
+
+ } else { // Custom font
+
+ if(c == '\n') {
+ myGFX->cursor_x = 0;
+ myGFX->cursor_y += (int16_t)myGFX->textsize *
+ (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ } else if(c != '\r') {
+ uint8_t first = pgm_read_byte(&myGFX->gfxFont->first);
+ if((c >= first) && (c <= (uint8_t)pgm_read_byte(&myGFX->gfxFont->last))) {
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &myGFX->gfxFont->glyph))[c - first]);
+ uint8_t w = pgm_read_byte(&glyph->width),
+ h = pgm_read_byte(&glyph->height);
+ if((w > 0) && (h > 0)) { // Is there an associated bitmap?
+ int16_t xo = (int8_t)pgm_read_byte(&glyph->xOffset); // sic
+ if(myGFX->wrap && ((myGFX->cursor_x + myGFX->textsize * (xo + w)) > myGFX->_width)) {
+ myGFX->cursor_x = 0;
+ myGFX->cursor_y += (int16_t)myGFX->textsize *
+ (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ }
+ GFXdrawChar(myGFX, myGFX->cursor_x, myGFX->cursor_y, c, myGFX->textcolor, myGFX->textbgcolor, myGFX->textsize);
+ }
+ myGFX->cursor_x += (uint8_t)pgm_read_byte(&glyph->xAdvance) * (int16_t)myGFX->textsize;
+ }
+ }
+
+ }
+
+}
+
+void GFXsetCursor(GFX* myGFX, int16_t x, int16_t y) {
+ myGFX->cursor_x = x;
+ myGFX->cursor_y = y;
+}
+
+int16_t GFXgetCursorX(GFX* myGFX)
+{
+ return myGFX->cursor_x;
+}
+
+int16_t GFXgetCursorY(GFX* myGFX)
+{
+ return myGFX->cursor_y;
+}
+
+void GFXsetTextSize(GFX* myGFX, uint8_t s) {
+ myGFX->textsize = (s > 0) ? s : 1;
+}
+
+void GFXsetTextColor(GFX* myGFX, uint16_t c, uint16_t b) {
+ myGFX->textcolor = c;
+ myGFX->textbgcolor = b;
+}
+
+void GFXsetTextWrap(GFX* myGFX, uint8_t w) {
+ myGFX->wrap = w;
+}
+
+uint8_t GFXgetRotation(GFX* myGFX) {
+ return myGFX->rotation;
+}
+
+void GFXsetRotation(GFX* myGFX, uint8_t x) {
+ myGFX->rotation = (x & 3);
+ switch(myGFX->rotation) {
+ case 0:
+ case 2:
+ myGFX->_width = myGFX->WIDTH;
+ myGFX->_height = myGFX->HEIGHT;
+ break;
+ case 1:
+ case 3:
+ myGFX->_width = myGFX->HEIGHT;
+ myGFX->_height = myGFX->WIDTH;
+ break;
+ }
+}
+
+// Enable (or disable) Code Page 437-compatible charset.
+// There was an error in glcdfont.c for the longest time -- one character
+// (#176, the 'light shade' block) was missing -- this threw off the index
+// of every character that followed it. But a TON of code has been written
+// with the erroneous character indices. By default, the library uses the
+// original 'wrong' behavior and old sketches will still work. Pass 'true'
+// to this function to use correct CP437 character values in your code.
+void GFXcp437(GFX* myGFX, uint8_t x) {
+ myGFX->_cp437 = x;
+}
+
+void GFXsetFont(GFX* myGFX, const GFXfont *f) {
+ if(f) { // Font struct pointer passed in?
+ if(!myGFX->gfxFont) { // And no current font struct?
+ // Switching from classic to new font behavior.
+ // Move cursor pos down 6 pixels so it's on baseline.
+ myGFX->cursor_y += 6;
+ }
+ } else if(myGFX->gfxFont) { // NULL passed. Current font struct defined?
+ // Switching from new to classic font behavior.
+ // Move cursor pos up 6 pixels so it's at top-left of char.
+ myGFX->cursor_y -= 6;
+ }
+ myGFX->gfxFont = (GFXfont *)f;
+}
+
+// Broke this out as it's used by both the PROGMEM- and RAM-resident
+// getTextBounds() functions.
+void GFXcharBounds(GFX* myGFX, char c, int16_t *x, int16_t *y,
+ int16_t *minx, int16_t *miny, int16_t *maxx, int16_t *maxy) {
+
+ if(myGFX->gfxFont) {
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += myGFX->textsize * (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ } else if(c != '\r') { // Not a carriage return; is normal char
+ uint8_t first = pgm_read_byte(&myGFX->gfxFont->first),
+ last = pgm_read_byte(&myGFX->gfxFont->last);
+ if((c >= first) && (c <= last)) { // Char present in this font?
+ GFXglyph *glyph = &(((GFXglyph *)pgm_read_pointer(
+ &myGFX->gfxFont->glyph))[c - first]);
+ uint8_t gw = pgm_read_byte(&glyph->width),
+ gh = pgm_read_byte(&glyph->height),
+ xa = pgm_read_byte(&glyph->xAdvance);
+ int8_t xo = pgm_read_byte(&glyph->xOffset),
+ yo = pgm_read_byte(&glyph->yOffset);
+ if(myGFX->wrap && ((*x+(((int16_t)xo+gw)*myGFX->textsize)) > myGFX->_width)) {
+ *x = 0; // Reset x to zero, advance y by one line
+ *y += myGFX->textsize * (uint8_t)pgm_read_byte(&myGFX->gfxFont->yAdvance);
+ }
+ int16_t ts = (int16_t)myGFX->textsize,
+ x1 = *x + xo * ts,
+ y1 = *y + yo * ts,
+ x2 = x1 + gw * ts - 1,
+ y2 = y1 + gh * ts - 1;
+ if(x1 < *minx) *minx = x1;
+ if(y1 < *miny) *miny = y1;
+ if(x2 > *maxx) *maxx = x2;
+ if(y2 > *maxy) *maxy = y2;
+ *x += xa * ts;
+ }
+ }
+
+ } else { // Default font
+
+ if(c == '\n') { // Newline?
+ *x = 0; // Reset x to zero,
+ *y += myGFX->textsize * 8; // advance y one line
+ // min/max x/y unchaged -- that waits for next 'normal' character
+ } else if(c != '\r') { // Normal char; ignore carriage returns
+ if(myGFX->wrap && ((*x + myGFX->textsize * 6) > myGFX->_width)) { // Off right?
+ *x = 0; // Reset x to zero,
+ *y += myGFX->textsize * 8; // advance y one line
+ }
+ int x2 = *x + myGFX->textsize * 6 - 1, // Lower-right pixel of char
+ y2 = *y + myGFX->textsize * 8 - 1;
+ if(x2 > *maxx) *maxx = x2; // Track max x, y
+ if(y2 > *maxy) *maxy = y2;
+ if(*x < *minx) *minx = *x; // Track min x, y
+ if(*y < *miny) *miny = *y;
+ *x += myGFX->textsize * 6; // Advance x one char
+ }
+ }
+}
+
+// Pass string and a cursor position, returns UL corner and W,H.
+void GFXgetTextBounds(GFX* myGFX, char *str, int16_t x, int16_t y,
+ int16_t *x1, int16_t *y1, uint16_t *w, uint16_t *h) {
+ uint8_t c; // Current character
+
+ *x1 = x;
+ *y1 = y;
+ *w = *h = 0;
+
+ int16_t minx = myGFX->_width, miny = myGFX->_height, maxx = -1, maxy = -1;
+
+ while((c = *str++))
+ GFXcharBounds(myGFX, c, &x, &y, &minx, &miny, &maxx, &maxy);
+
+ if(maxx >= minx) {
+ *x1 = minx;
+ *w = maxx - minx + 1;
+ }
+ if(maxy >= miny) {
+ *y1 = miny;
+ *h = maxy - miny + 1;
+ }
+}
+
+
+
+// Return the size of the display (per current rotation)
+int16_t GFXwidth(GFX* myGFX ) {
+ return myGFX->_width;
+}
+
+int16_t GFXheight(GFX* myGFX) {
+ return myGFX->_height;
+}
+
+void GFXinvertDisplay(GFX* myGFX, uint8_t i) {
+ // Do nothing, must be subclassed if supported by hardware
+}
+
+uint8_t pitches[24] =
+{
+ 'C', ' ',
+ 'C', '#',
+ 'D', ' ',
+ 'D', '#',
+ 'E', ' ',
+ 'F', ' ',
+ 'F', '#',
+ 'G', ' ',
+ 'G', '#',
+ 'A', ' ',
+ 'A', '#',
+ 'B', ' '
+};
+
+int OLEDparseInt(char* buffer, uint32_t myNumber, uint8_t numDigits)
+{
+ for (int i = 0; i < numDigits; i++)
+ {
+ int whichPlace = (uint32_t)(powf(10.0f,(numDigits - 1) - i));
+ int thisDigit = (myNumber / whichPlace);
+ buffer[i] = thisDigit + 48;
+ myNumber -= thisDigit * whichPlace;
+ }
+
+ return numDigits;
+}
+
+int OLEDparsePitch(char* buffer, float midi)
+{
+ int pclass, octave, note, neg = 0; float offset;
+
+ note = (int)midi;
+ offset = midi - note;
+
+ if ((midi + 0.5f) > (note+1))
+ {
+ note += 1;
+ offset = (1.0f - offset) + 0.01f;
+ neg = 1;
+ }
+
+ pclass = (note % 12);
+ octave = (int)(note / 12) - 1;
+
+ int idx = 0;
+
+ buffer[idx++] = pitches[pclass*2];
+ buffer[idx++] = pitches[pclass*2+1];
+
+ OLEDparseInt(&buffer[idx++], octave, 1);
+
+ buffer[idx++] = ' ';
+
+ if (neg == 1)
+ buffer[idx++] = '-';
+ else
+ buffer[idx++] = '+';
+
+ OLEDparseInt(&buffer[idx], (uint32_t) (offset * 100.0f), 2);
+
+ return idx+2;
+}
+
+int OLEDparsePitchClass(char* buffer, float midi)
+{
+ int pclass, note;
+ float offset;
+
+ note = (int)midi;
+ offset = midi - note;
+
+ if ((midi + 0.5f) > (note+1))
+ {
+ note += 1;
+ offset = (1.0f - offset) + 0.01f;
+ }
+
+ pclass = (note % 12);
+
+ int idx = 0;
+
+ buffer[idx++] = pitches[pclass*2];
+ buffer[idx++] = pitches[pclass*2+1];
+
+ return idx;
+}
+
+int OLEDparseFixedFloat(char* buffer, float input, uint8_t numDigits, uint8_t numDecimal)
+{
+ float power = powf(10.0f, numDecimal);
+ float f = ((float)(int)(input * power + 0.5f)) / power;
+
+ int nonzeroHasHappened = 0, decimalHasHappened = 0;
+
+ int myNumber = (int)(f * power);
+
+ int idx = 0, i = 0;
+
+ if (myNumber < 0)
+ {
+ myNumber *= -1;
+ buffer[idx++] = '-';
+ i++;
+ }
+
+ while (i < numDigits)
+ {
+ if ((decimalHasHappened == 0) && ((numDigits-i) == numDecimal))
+ {
+ if (nonzeroHasHappened == 0)
+ {
+ idx++; //get past the negative if there is one - this is hacky should figure out how to do it right
+ buffer[idx-1] = '0';
+ nonzeroHasHappened = 1;
+ }
+
+ buffer[idx++] = '.';
+ decimalHasHappened = 1;
+ }
+ else
+ {
+
+ int whichPlace = (uint32_t) powf(10.0f,(numDigits - 1 - i));
+ int thisDigit = (myNumber / whichPlace);
+
+ if (nonzeroHasHappened == 0)
+ {
+ if (thisDigit > 0)
+ {
+ buffer[idx++] = thisDigit + 48;
+ nonzeroHasHappened = 1;
+ }
+ else
+ {
+ buffer[idx++] = ' ';
+ }
+ }
+ else
+ {
+ buffer[idx++] = thisDigit + 48;
+ }
+
+ myNumber -= thisDigit * whichPlace;
+
+ i++;
+ }
+ }
+
+ return idx;
+}
--- /dev/null
+++ b/LEAF/Src/gfx_font.c
@@ -1,0 +1,281 @@
+/*
+ * gfx_font.c
+ *
+ * Created on: Jul 8, 2018
+ * Author: jeffsnyder
+ */
+
+
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#ifndef FONT5X7_H
+#define FONT5X7_H
+
+
+ #define PROGMEM
+
+
+// Standard ASCII 5x7 font
+
+static const unsigned char standardGFXfont[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
+ 0x00, 0x18, 0x3C, 0x18, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
+ 0x00, 0x18, 0x24, 0x18, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E,
+ 0x26, 0x29, 0x79, 0x29, 0x26,
+ 0x40, 0x7F, 0x05, 0x05, 0x07,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F,
+ 0x14, 0x22, 0x7F, 0x22, 0x14,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F,
+ 0x00, 0x66, 0x89, 0x95, 0x6A,
+ 0x60, 0x60, 0x60, 0x60, 0x60,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94,
+ 0x08, 0x04, 0x7E, 0x04, 0x08,
+ 0x10, 0x20, 0x7E, 0x20, 0x10,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08,
+ 0x1E, 0x10, 0x10, 0x10, 0x10,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
+ 0x30, 0x38, 0x3E, 0x38, 0x30,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12,
+ 0x23, 0x13, 0x08, 0x64, 0x62,
+ 0x36, 0x49, 0x56, 0x20, 0x50,
+ 0x00, 0x08, 0x07, 0x03, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
+ 0x08, 0x08, 0x3E, 0x08, 0x08,
+ 0x00, 0x80, 0x70, 0x30, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x00, 0x00, 0x60, 0x60, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E,
+ 0x00, 0x42, 0x7F, 0x40, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46,
+ 0x21, 0x41, 0x49, 0x4D, 0x33,
+ 0x18, 0x14, 0x12, 0x7F, 0x10,
+ 0x27, 0x45, 0x45, 0x45, 0x39,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31,
+ 0x41, 0x21, 0x11, 0x09, 0x07,
+ 0x36, 0x49, 0x49, 0x49, 0x36,
+ 0x46, 0x49, 0x49, 0x29, 0x1E,
+ 0x00, 0x00, 0x14, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x00, 0x41, 0x22, 0x14, 0x08,
+ 0x02, 0x01, 0x59, 0x09, 0x06,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C,
+ 0x7F, 0x49, 0x49, 0x49, 0x36,
+ 0x3E, 0x41, 0x41, 0x41, 0x22,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x49, 0x49, 0x49, 0x41,
+ 0x7F, 0x09, 0x09, 0x09, 0x01,
+ 0x3E, 0x41, 0x41, 0x51, 0x73,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F,
+ 0x00, 0x41, 0x7F, 0x41, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01,
+ 0x7F, 0x08, 0x14, 0x22, 0x41,
+ 0x7F, 0x40, 0x40, 0x40, 0x40,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E,
+ 0x7F, 0x09, 0x09, 0x09, 0x06,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E,
+ 0x7F, 0x09, 0x19, 0x29, 0x46,
+ 0x26, 0x49, 0x49, 0x49, 0x32,
+ 0x03, 0x01, 0x7F, 0x01, 0x03,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F,
+ 0x63, 0x14, 0x08, 0x14, 0x63,
+ 0x03, 0x04, 0x78, 0x04, 0x03,
+ 0x61, 0x59, 0x49, 0x4D, 0x43,
+ 0x00, 0x7F, 0x41, 0x41, 0x41,
+ 0x02, 0x04, 0x08, 0x10, 0x20,
+ 0x00, 0x41, 0x41, 0x41, 0x7F,
+ 0x04, 0x02, 0x01, 0x02, 0x04,
+ 0x40, 0x40, 0x40, 0x40, 0x40,
+ 0x00, 0x03, 0x07, 0x08, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40,
+ 0x7F, 0x28, 0x44, 0x44, 0x38,
+ 0x38, 0x44, 0x44, 0x44, 0x28,
+ 0x38, 0x44, 0x44, 0x28, 0x7F,
+ 0x38, 0x54, 0x54, 0x54, 0x18,
+ 0x00, 0x08, 0x7E, 0x09, 0x02,
+ 0x18, 0xA4, 0xA4, 0x9C, 0x78,
+ 0x7F, 0x08, 0x04, 0x04, 0x78,
+ 0x00, 0x44, 0x7D, 0x40, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78,
+ 0x7C, 0x08, 0x04, 0x04, 0x78,
+ 0x38, 0x44, 0x44, 0x44, 0x38,
+ 0xFC, 0x18, 0x24, 0x24, 0x18,
+ 0x18, 0x24, 0x24, 0x18, 0xFC,
+ 0x7C, 0x08, 0x04, 0x04, 0x08,
+ 0x48, 0x54, 0x54, 0x54, 0x24,
+ 0x04, 0x04, 0x3F, 0x44, 0x24,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C,
+ 0x44, 0x28, 0x10, 0x28, 0x44,
+ 0x4C, 0x90, 0x90, 0x90, 0x7C,
+ 0x44, 0x64, 0x54, 0x4C, 0x44,
+ 0x00, 0x08, 0x36, 0x41, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C,
+ 0x1E, 0xA1, 0xA1, 0x61, 0x12,
+ 0x3A, 0x40, 0x40, 0x20, 0x7A,
+ 0x38, 0x54, 0x54, 0x55, 0x59,
+ 0x21, 0x55, 0x55, 0x79, 0x41,
+ 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
+ 0x21, 0x55, 0x54, 0x78, 0x40,
+ 0x20, 0x54, 0x55, 0x79, 0x40,
+ 0x0C, 0x1E, 0x52, 0x72, 0x12,
+ 0x39, 0x55, 0x55, 0x55, 0x59,
+ 0x39, 0x54, 0x54, 0x54, 0x59,
+ 0x39, 0x55, 0x54, 0x54, 0x58,
+ 0x00, 0x00, 0x45, 0x7C, 0x41,
+ 0x00, 0x02, 0x45, 0x7D, 0x42,
+ 0x00, 0x01, 0x45, 0x7C, 0x40,
+ 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
+ 0xF0, 0x28, 0x25, 0x28, 0xF0,
+ 0x7C, 0x54, 0x55, 0x45, 0x00,
+ 0x20, 0x54, 0x54, 0x7C, 0x54,
+ 0x7C, 0x0A, 0x09, 0x7F, 0x49,
+ 0x32, 0x49, 0x49, 0x49, 0x32,
+ 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
+ 0x32, 0x4A, 0x48, 0x48, 0x30,
+ 0x3A, 0x41, 0x41, 0x21, 0x7A,
+ 0x3A, 0x42, 0x40, 0x20, 0x78,
+ 0x00, 0x9D, 0xA0, 0xA0, 0x7D,
+ 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
+ 0x3D, 0x40, 0x40, 0x40, 0x3D,
+ 0x3C, 0x24, 0xFF, 0x24, 0x24,
+ 0x48, 0x7E, 0x49, 0x43, 0x66,
+ 0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
+ 0xFF, 0x09, 0x29, 0xF6, 0x20,
+ 0xC0, 0x88, 0x7E, 0x09, 0x03,
+ 0x20, 0x54, 0x54, 0x79, 0x41,
+ 0x00, 0x00, 0x44, 0x7D, 0x41,
+ 0x30, 0x48, 0x48, 0x4A, 0x32,
+ 0x38, 0x40, 0x40, 0x22, 0x7A,
+ 0x00, 0x7A, 0x0A, 0x0A, 0x72,
+ 0x7D, 0x0D, 0x19, 0x31, 0x7D,
+ 0x26, 0x29, 0x29, 0x2F, 0x28,
+ 0x26, 0x29, 0x29, 0x29, 0x26,
+ 0x30, 0x48, 0x4D, 0x40, 0x20,
+ 0x38, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x38,
+ 0x2F, 0x10, 0xC8, 0xAC, 0xBA,
+ 0x2F, 0x10, 0x28, 0x34, 0xFA,
+ 0x00, 0x00, 0x7B, 0x00, 0x00,
+ 0x08, 0x14, 0x2A, 0x14, 0x22,
+ 0x22, 0x14, 0x2A, 0x14, 0x08,
+ 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
+ 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
+ 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
+ 0x00, 0x00, 0x00, 0xFF, 0x00,
+ 0x10, 0x10, 0x10, 0xFF, 0x00,
+ 0x14, 0x14, 0x14, 0xFF, 0x00,
+ 0x10, 0x10, 0xFF, 0x00, 0xFF,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x14, 0x14, 0x14, 0xFC, 0x00,
+ 0x14, 0x14, 0xF7, 0x00, 0xFF,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x14, 0x14, 0xF4, 0x04, 0xFC,
+ 0x14, 0x14, 0x17, 0x10, 0x1F,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0x1F, 0x00,
+ 0x10, 0x10, 0x10, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0x1F, 0x10,
+ 0x10, 0x10, 0x10, 0xF0, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0xFF, 0x10,
+ 0x00, 0x00, 0x00, 0xFF, 0x14,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF,
+ 0x00, 0x00, 0x1F, 0x10, 0x17,
+ 0x00, 0x00, 0xFC, 0x04, 0xF4,
+ 0x14, 0x14, 0x17, 0x10, 0x17,
+ 0x14, 0x14, 0xF4, 0x04, 0xF4,
+ 0x00, 0x00, 0xFF, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x14, 0x14,
+ 0x14, 0x14, 0xF7, 0x00, 0xF7,
+ 0x14, 0x14, 0x14, 0x17, 0x14,
+ 0x10, 0x10, 0x1F, 0x10, 0x1F,
+ 0x14, 0x14, 0x14, 0xF4, 0x14,
+ 0x10, 0x10, 0xF0, 0x10, 0xF0,
+ 0x00, 0x00, 0x1F, 0x10, 0x1F,
+ 0x00, 0x00, 0x00, 0x1F, 0x14,
+ 0x00, 0x00, 0x00, 0xFC, 0x14,
+ 0x00, 0x00, 0xF0, 0x10, 0xF0,
+ 0x10, 0x10, 0xFF, 0x10, 0xFF,
+ 0x14, 0x14, 0x14, 0xFF, 0x14,
+ 0x10, 0x10, 0x10, 0x1F, 0x00,
+ 0x00, 0x00, 0x00, 0xF0, 0x10,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0xFF,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0x38, 0x44, 0x44, 0x38, 0x44,
+ 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
+ 0x7E, 0x02, 0x02, 0x06, 0x06,
+ 0x02, 0x7E, 0x02, 0x7E, 0x02,
+ 0x63, 0x55, 0x49, 0x41, 0x63,
+ 0x38, 0x44, 0x44, 0x3C, 0x04,
+ 0x40, 0x7E, 0x20, 0x1E, 0x20,
+ 0x06, 0x02, 0x7E, 0x02, 0x02,
+ 0x99, 0xA5, 0xE7, 0xA5, 0x99,
+ 0x1C, 0x2A, 0x49, 0x2A, 0x1C,
+ 0x4C, 0x72, 0x01, 0x72, 0x4C,
+ 0x30, 0x4A, 0x4D, 0x4D, 0x30,
+ 0x30, 0x48, 0x78, 0x48, 0x30,
+ 0xBC, 0x62, 0x5A, 0x46, 0x3D,
+ 0x3E, 0x49, 0x49, 0x49, 0x00,
+ 0x7E, 0x01, 0x01, 0x01, 0x7E,
+ 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
+ 0x44, 0x44, 0x5F, 0x44, 0x44,
+ 0x40, 0x51, 0x4A, 0x44, 0x40,
+ 0x40, 0x44, 0x4A, 0x51, 0x40,
+ 0x00, 0x00, 0xFF, 0x01, 0x03,
+ 0xE0, 0x80, 0xFF, 0x00, 0x00,
+ 0x08, 0x08, 0x6B, 0x6B, 0x08,
+ 0x36, 0x12, 0x36, 0x24, 0x36,
+ 0x06, 0x0F, 0x09, 0x0F, 0x06,
+ 0x00, 0x00, 0x18, 0x18, 0x00,
+ 0x00, 0x00, 0x10, 0x10, 0x00,
+ 0x30, 0x40, 0xFF, 0x01, 0x01,
+ 0x00, 0x1F, 0x01, 0x01, 0x1E,
+ 0x00, 0x19, 0x1D, 0x17, 0x12,
+ 0x00, 0x3C, 0x3C, 0x3C, 0x3C,
+ 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP
+};
+
+
+#endif // FONT5X7_H
--- /dev/null
+++ b/LEAF/Src/gpio.c
@@ -1,0 +1,176 @@
+/**
+ ******************************************************************************
+ * File Name : gpio.c
+ * Description : This file provides code for the configuration
+ * of all used GPIO pins.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "gpio.h"
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/*----------------------------------------------------------------------------*/
+/* Configure GPIO */
+/*----------------------------------------------------------------------------*/
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/** Configure pins
+ PH0-OSC_IN (PH0) ------> RCC_OSC_IN
+ PH1-OSC_OUT (PH1) ------> RCC_OSC_OUT
+ PA13 (JTMS/SWDIO) ------> DEBUG_JTMS-SWDIO
+ PA14 (JTCK/SWCLK) ------> DEBUG_JTCK-SWCLK
+ PB3 (JTDO/TRACESWO) ------> DEBUG_JTDO-SWO
+*/
+void MX_GPIO_Init(void)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9
+ |GPIO_PIN_10, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_4, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin : PC13 */
+ GPIO_InitStruct.Pin = GPIO_PIN_13;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PC14 PC4 PC6 PC7 */
+ GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : PC15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : PF6 */
+ GPIO_InitStruct.Pin = GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PF7 PF8 PF9 PF10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PA1 PA15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PA4 PA6 PA8 PA9
+ PA10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9
+ |GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB0 PB4 */
+ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_4;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB1 PB12 PB13 PB14
+ PB15 */
+ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
+ |GPIO_PIN_15;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PB2 PB9 */
+ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_9;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PD11 PD7 */
+ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_7;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG3 PG9 PG13 PG14 */
+ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_9|GPIO_PIN_13|GPIO_PIN_14;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG6 PG7 PG10 */
+ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PD3 PD4 PD5 PD6 */
+ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
+ GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : PG11 PG12 */
+ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+}
+
+/* USER CODE BEGIN 2 */
+
+/* USER CODE END 2 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null
+++ b/LEAF/Src/i2c.c
@@ -1,0 +1,242 @@
+/**
+ ******************************************************************************
+ * File Name : I2C.c
+ * Description : This file provides code for the configuration
+ * of the I2C instances.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© Copyright (c) 2020 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "i2c.h"
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+I2C_HandleTypeDef hi2c2;
+I2C_HandleTypeDef hi2c4;
+DMA_HandleTypeDef hdma_i2c4_rx;
+DMA_HandleTypeDef hdma_i2c4_tx;
+
+/* I2C2 init function */
+void MX_I2C2_Init(void)
+{
+
+ hi2c2.Instance = I2C2;
+ hi2c2.Init.Timing = 0x505097F4;
+ hi2c2.Init.OwnAddress1 = 0;
+ hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ hi2c2.Init.OwnAddress2 = 0;
+ hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ if (HAL_I2C_Init(&hi2c2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+/* I2C4 init function */
+void MX_I2C4_Init(void)
+{
+
+ hi2c4.Instance = I2C4;
+ hi2c4.Init.Timing = 0x307075B1;
+ hi2c4.Init.OwnAddress1 = 0;
+ hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ hi2c4.Init.OwnAddress2 = 0;
+ hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ if (HAL_I2C_Init(&hi2c4) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c4, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c4, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+}
+
+void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
+{
+
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(i2cHandle->Instance==I2C2)
+ {
+ /* USER CODE BEGIN I2C2_MspInit 0 */
+
+ /* USER CODE END I2C2_MspInit 0 */
+
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**I2C2 GPIO Configuration
+ PB10 ------> I2C2_SCL
+ PB11 ------> I2C2_SDA
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+ /* I2C2 clock enable */
+ __HAL_RCC_I2C2_CLK_ENABLE();
+ /* USER CODE BEGIN I2C2_MspInit 1 */
+
+ /* USER CODE END I2C2_MspInit 1 */
+ }
+ else if(i2cHandle->Instance==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspInit 0 */
+
+ /* USER CODE END I2C4_MspInit 0 */
+
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ /**I2C4 GPIO Configuration
+ PD12 ------> I2C4_SCL
+ PD13 ------> I2C4_SDA
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+ GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /* I2C4 clock enable */
+ __HAL_RCC_I2C4_CLK_ENABLE();
+
+ /* I2C4 DMA Init */
+ /* I2C4_RX Init */
+ hdma_i2c4_rx.Instance = BDMA_Channel0;
+ hdma_i2c4_rx.Init.Request = BDMA_REQUEST_I2C4_RX;
+ hdma_i2c4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_i2c4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c4_rx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c4_rx.Init.Mode = DMA_NORMAL;
+ hdma_i2c4_rx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_i2c4_rx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(i2cHandle,hdmarx,hdma_i2c4_rx);
+
+ /* I2C4_TX Init */
+ hdma_i2c4_tx.Instance = BDMA_Channel1;
+ hdma_i2c4_tx.Init.Request = BDMA_REQUEST_I2C4_TX;
+ hdma_i2c4_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_i2c4_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2c4_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2c4_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_i2c4_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_i2c4_tx.Init.Mode = DMA_NORMAL;
+ hdma_i2c4_tx.Init.Priority = DMA_PRIORITY_LOW;
+ if (HAL_DMA_Init(&hdma_i2c4_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(i2cHandle,hdmatx,hdma_i2c4_tx);
+
+ /* I2C4 interrupt Init */
+ HAL_NVIC_SetPriority(I2C4_EV_IRQn, 6, 0);
+ HAL_NVIC_EnableIRQ(I2C4_EV_IRQn);
+ HAL_NVIC_SetPriority(I2C4_ER_IRQn, 6, 0);
+ HAL_NVIC_EnableIRQ(I2C4_ER_IRQn);
+ /* USER CODE BEGIN I2C4_MspInit 1 */
+
+ /* USER CODE END I2C4_MspInit 1 */
+ }
+}
+
+void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
+{
+
+ if(i2cHandle->Instance==I2C2)
+ {
+ /* USER CODE BEGIN I2C2_MspDeInit 0 */
+
+ /* USER CODE END I2C2_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_I2C2_CLK_DISABLE();
+
+ /**I2C2 GPIO Configuration
+ PB10 ------> I2C2_SCL
+ PB11 ------> I2C2_SDA
+ */
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);
+
+ /* USER CODE BEGIN I2C2_MspDeInit 1 */
+
+ /* USER CODE END I2C2_MspDeInit 1 */
+ }
+ else if(i2cHandle->Instance==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspDeInit 0 */
+
+ /* USER CODE END I2C4_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_I2C4_CLK_DISABLE();
+
+ /**I2C4 GPIO Configuration
+ PD12 ------> I2C4_SCL
+ PD13 ------> I2C4_SDA
+ */
+ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_12|GPIO_PIN_13);
+
+ /* I2C4 DMA DeInit */
+ HAL_DMA_DeInit(i2cHandle->hdmarx);
+ HAL_DMA_DeInit(i2cHandle->hdmatx);
+
+ /* I2C4 interrupt Deinit */
+ HAL_NVIC_DisableIRQ(I2C4_EV_IRQn);
+ HAL_NVIC_DisableIRQ(I2C4_ER_IRQn);
+ /* USER CODE BEGIN I2C4_MspDeInit 1 */
+
+ /* USER CODE END I2C4_MspDeInit 1 */
+ }
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/LEAF/Src/leaf-analysis.c
+++ /dev/null
@@ -1,946 +1,0 @@
-/*==============================================================================
-
- leaf-analysis.c
- Created: 30 Nov 2018 11:56:49am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-analysis.h"
-#include "..\Externals\d_fft_mayer.h"
-
-#else
-
-#include "../Inc/leaf-analysis.h"
-#include "../Externals/d_fft_mayer.h"
-
-#endif
-
-//===========================================================================
-/* Envelope Follower */
-//===========================================================================
-
-void tEnvelopeFollower_init(tEnvelopeFollower* const ef, float attackThreshold, float decayCoeff)
-{
- _tEnvelopeFollower* e = *ef = (_tEnvelopeFollower*) leaf_alloc(sizeof(_tEnvelopeFollower));
-
- e->y = 0.0f;
- e->a_thresh = attackThreshold;
- e->d_coeff = decayCoeff;
-}
-
-void tEnvelopeFollower_free(tEnvelopeFollower* const ef)
-{
- _tEnvelopeFollower* e = *ef;
-
- leaf_free(e);
-}
-
-void tEnvelopeFollower_initToPool (tEnvelopeFollower* const ef, float attackThreshold, float decayCoeff, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelopeFollower* e = *ef = (_tEnvelopeFollower*) mpool_alloc(sizeof(_tEnvelopeFollower), &m->pool);
-
- e->y = 0.0f;
- e->a_thresh = attackThreshold;
- e->d_coeff = decayCoeff;
-}
-
-void tEnvelopeFollower_freeFromPool (tEnvelopeFollower* const ef, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelopeFollower* e = *ef;
-
- mpool_free(e, &m->pool);
-}
-
-float tEnvelopeFollower_tick(tEnvelopeFollower* const ef, float x)
-{
- _tEnvelopeFollower* e = *ef;
-
- if (x < 0.0f ) x = -x; /* Absolute value. */
-
- if ((x >= e->y) && (x > e->a_thresh)) e->y = x; /* If we hit a peak, ride the peak to the top. */
- else e->y = e->y * e->d_coeff; /* Else, exponential decay of output. */
-
- //ef->y = envelope_pow[(uint16_t)(ef->y * (float)UINT16_MAX)] * ef->d_coeff; //not quite the right behavior - too much loss of precision?
- //ef->y = powf(ef->y, 1.000009f) * ef->d_coeff; // too expensive
-
- if( e->y < VSF) e->y = 0.0f;
-
- return e->y;
-}
-
-int tEnvelopeFollower_decayCoeff(tEnvelopeFollower* const ef, float decayCoeff)
-{
- _tEnvelopeFollower* e = *ef;
- return e->d_coeff = decayCoeff;
-}
-
-int tEnvelopeFollower_attackThresh(tEnvelopeFollower* const ef, float attackThresh)
-{
- _tEnvelopeFollower* e = *ef;
- return e->a_thresh = attackThresh;
-}
-
-
-//===========================================================================
-/* Power Follower */
-//===========================================================================
-void tPowerFollower_init(tPowerFollower* const pf, float factor)
-{
- _tPowerFollower* p = *pf = (_tPowerFollower*) leaf_alloc(sizeof(_tPowerFollower));
-
- p->curr=0.0f;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
-}
-
-void tPowerFollower_free(tPowerFollower* const pf)
-{
- _tPowerFollower* p = *pf;
-
- leaf_free(p);
-}
-
-void tPowerFollower_initToPool (tPowerFollower* const pf, float factor, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPowerFollower* p = *pf = (_tPowerFollower*) mpool_alloc(sizeof(_tPowerFollower), &m->pool);
-
- p->curr=0.0f;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
-}
-
-void tPowerFollower_freeFromPool (tPowerFollower* const pf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPowerFollower* p = *pf;
-
- mpool_free(p, &m->pool);
-}
-
-int tPowerFollower_setFactor(tPowerFollower* const pf, float factor)
-{
- _tPowerFollower* p = *pf;
-
- if (factor<0) factor=0;
- if (factor>1) factor=1;
- p->factor=factor;
- p->oneminusfactor=1.0f-factor;
- return 0;
-}
-
-float tPowerFollower_tick(tPowerFollower* const pf, float input)
-{
- _tPowerFollower* p = *pf;
- p->curr = p->factor*input*input+p->oneminusfactor*p->curr;
- return p->curr;
-}
-
-float tPowerFollower_sample(tPowerFollower* const pf)
-{
- _tPowerFollower* p = *pf;
- return p->curr;
-}
-
-
-
-
-//===========================================================================
-/* ---------------- env~ - simple envelope follower. ----------------- */
-//===========================================================================
-
-void tEnvPD_init(tEnvPD* const xpd, int ws, int hs, int bs)
-{
- _tEnvPD* x = *xpd = (_tEnvPD*) leaf_calloc(sizeof(_tEnvPD));
-
- int period = hs, npoints = ws;
-
- int i;
-
- if (npoints < 1) npoints = 1024;
- if (period < 1) period = npoints/2;
- if (period < npoints / MAXOVERLAP + 1)
- period = npoints / MAXOVERLAP + 1;
-
- x->x_npoints = npoints;
- x->x_phase = 0;
- x->x_period = period;
-
- x->windowSize = npoints;
- x->hopSize = period;
- x->blockSize = bs;
-
- for (i = 0; i < MAXOVERLAP; i++) x->x_sumbuf[i] = 0.0f;
- for (i = 0; i < npoints; i++)
- x->buf[i] = (1.0f - cosf((TWO_PI * i) / npoints))/npoints;
- for (; i < npoints+INITVSTAKEN; i++) x->buf[i] = 0.0f;
-
- x->x_f = 0.0f;
-
- x->x_allocforvs = INITVSTAKEN;
-
- // ~ ~ ~ dsp ~ ~ ~
- if (x->x_period % x->blockSize)
- {
- x->x_realperiod = x->x_period + x->blockSize - (x->x_period % x->blockSize);
- }
- else
- {
- x->x_realperiod = x->x_period;
- }
- // ~ ~ ~ ~ ~ ~ ~ ~
-}
-
-void tEnvPD_free (tEnvPD* const xpd)
-{
- _tEnvPD* x = *xpd;
-
- leaf_free(x);
-}
-
-void tEnvPD_initToPool (tEnvPD* const xpd, int ws, int hs, int bs, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvPD* x = *xpd = (_tEnvPD*) mpool_calloc(sizeof(_tEnvPD), &m->pool);
-
- int period = hs, npoints = ws;
-
- int i;
-
- if (npoints < 1) npoints = 1024;
- if (period < 1) period = npoints/2;
- if (period < npoints / MAXOVERLAP + 1)
- period = npoints / MAXOVERLAP + 1;
-
- x->x_npoints = npoints;
- x->x_phase = 0;
- x->x_period = period;
-
- x->windowSize = npoints;
- x->hopSize = period;
- x->blockSize = bs;
-
- for (i = 0; i < MAXOVERLAP; i++) x->x_sumbuf[i] = 0;
- for (i = 0; i < npoints; i++)
- x->buf[i] = (1.0f - cosf((2 * PI * i) / npoints))/npoints;
- for (; i < npoints+INITVSTAKEN; i++) x->buf[i] = 0;
-
- x->x_f = 0;
-
- x->x_allocforvs = INITVSTAKEN;
-
- // ~ ~ ~ dsp ~ ~ ~
- if (x->x_period % x->blockSize)
- {
- x->x_realperiod = x->x_period + x->blockSize - (x->x_period % x->blockSize);
- }
- else
- {
- x->x_realperiod = x->x_period;
- }
- // ~ ~ ~ ~ ~ ~ ~ ~
-}
-
-void tEnvPD_freeFromPool (tEnvPD* const xpd, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvPD* x = *xpd;
-
- mpool_free(x, &m->pool);
-}
-
-float tEnvPD_tick (tEnvPD* const xpd)
-{
- _tEnvPD* x = *xpd;
- return powtodb(x->x_result);
-}
-
-void tEnvPD_processBlock(tEnvPD* const xpd, float* in)
-{
- _tEnvPD* x = *xpd;
-
- int n = x->blockSize;
-
- int count;
- t_sample *sump;
- in += n;
- for (count = x->x_phase, sump = x->x_sumbuf;
- count < x->x_npoints; count += x->x_realperiod, sump++)
- {
- t_sample *hp = x->buf + count;
- t_sample *fp = in;
- t_sample sum = *sump;
- int i;
-
- for (i = 0; i < n; i++)
- {
- fp--;
- sum += *hp++ * (*fp * *fp);
- }
- *sump = sum;
- }
- sump[0] = 0;
- x->x_phase -= n;
- if (x->x_phase < 0)
- {
- x->x_result = x->x_sumbuf[0];
- for (count = x->x_realperiod, sump = x->x_sumbuf;
- count < x->x_npoints; count += x->x_realperiod, sump++)
- sump[0] = sump[1];
- sump[0] = 0;
- x->x_phase = x->x_realperiod - n;
- }
-}
-
-//===========================================================================
-// ATTACKDETECTION
-//===========================================================================
-/********Private function prototypes**********/
-static void atkdtk_init(tAttackDetection* const a, int blocksize, int atk, int rel);
-static void atkdtk_envelope(tAttackDetection* const a, float *in);
-
-/********Constructor/Destructor***************/
-
-void tAttackDetection_init(tAttackDetection* const ad, int blocksize, int atk, int rel)
-{
- *ad = (_tAttackDetection*) leaf_alloc(sizeof(_tAttackDetection));
-
- atkdtk_init(ad, blocksize, atk, rel);
-}
-
-void tAttackDetection_free(tAttackDetection* const ad)
-{
- _tAttackDetection* a = *ad;
-
- leaf_free(a);
-}
-
-void tAttackDetection_initToPool (tAttackDetection* const ad, int blocksize, int atk, int rel, tMempool* const mp)
-{
- _tMempool* m = *mp;
- *ad = (_tAttackDetection*) mpool_alloc(sizeof(_tAttackDetection), &m->pool);
-
- atkdtk_init(ad, blocksize, atk, rel);
-}
-
-void tAttackDetection_freeFromPool (tAttackDetection* const ad, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAttackDetection* a = *ad;
-
- mpool_free(a, &m->pool);
-}
-
-/*******Public Functions***********/
-
-
-void tAttackDetection_setBlocksize(tAttackDetection* const ad, int size)
-{
- _tAttackDetection* a = *ad;
-
- if(!((size==64)|(size==128)|(size==256)|(size==512)|(size==1024)|(size==2048)))
- size = DEFBLOCKSIZE;
- a->blocksize = size;
-
- return;
-
-}
-
-void tAttackDetection_setSamplerate(tAttackDetection* const ad, int inRate)
-{
- _tAttackDetection* a = *ad;
-
- a->samplerate = inRate;
-
- //Reset atk and rel to recalculate coeff
- tAttackDetection_setAttack(ad, a->atk);
- tAttackDetection_setRelease(ad, a->rel);
-}
-
-void tAttackDetection_setThreshold(tAttackDetection* const ad, float thres)
-{
- _tAttackDetection* a = *ad;
- a->threshold = thres;
-}
-
-void tAttackDetection_setAttack(tAttackDetection* const ad, int inAtk)
-{
- _tAttackDetection* a = *ad;
- a->atk = inAtk;
- a->atk_coeff = pow(0.01, 1.0/(a->atk * a->samplerate * 0.001));
-}
-
-void tAttackDetection_setRelease(tAttackDetection* const ad, int inRel)
-{
- _tAttackDetection* a = *ad;
- a->rel = inRel;
- a->rel_coeff = pow(0.01, 1.0/(a->rel * a->samplerate * 0.001));
-}
-
-
-int tAttackDetection_detect(tAttackDetection* const ad, float *in)
-{
- _tAttackDetection* a = *ad;
-
- int result;
-
- atkdtk_envelope(ad, in);
-
- if(a->env >= a->prevAmp*2) //2 times greater = 6dB increase
- result = 1;
- else
- result = 0;
-
- a->prevAmp = a->env;
-
- return result;
-}
-
-/*******Private Functions**********/
-
-static void atkdtk_init(tAttackDetection* const ad, int blocksize, int atk, int rel)
-{
- _tAttackDetection* a = *ad;
-
- a->env = 0;
- a->blocksize = blocksize;
- a->threshold = DEFTHRESHOLD;
- a->samplerate = leaf.sampleRate;
- a->prevAmp = 0;
-
- a->env = 0;
-
- tAttackDetection_setAttack(ad, atk);
- tAttackDetection_setRelease(ad, rel);
-}
-
-static void atkdtk_envelope(tAttackDetection* const ad, float *in)
-{
- _tAttackDetection* a = *ad;
-
- int i = 0;
- float tmp;
- for(i = 0; i < a->blocksize; ++i){
- tmp = fastabsf(in[i]);
-
- if(tmp > a->env)
- a->env = a->atk_coeff * (a->env - tmp) + tmp;
- else
- a->env = a->rel_coeff * (a->env - tmp) + tmp;
- }
-
-}
-
-//===========================================================================
-// SNAC
-//===========================================================================
-/******************************************************************************/
-/***************************** private procedures *****************************/
-/******************************************************************************/
-
-#define REALFFT mayer_realfft
-#define REALIFFT mayer_realifft
-
-static void snac_analyzeframe(tSNAC* const s);
-static void snac_autocorrelation(tSNAC* const s);
-static void snac_normalize(tSNAC* const s);
-static void snac_pickpeak(tSNAC* const s);
-static void snac_periodandfidelity(tSNAC* const s);
-static void snac_biasbuf(tSNAC* const s);
-static float snac_spectralpeak(tSNAC* const s, float periodlength);
-
-
-/******************************************************************************/
-/******************************** constructor, destructor *********************/
-/******************************************************************************/
-
-
-void tSNAC_init(tSNAC* const snac, int overlaparg)
-{
- _tSNAC* s = *snac = (_tSNAC*) leaf_calloc(sizeof(_tSNAC));
-
- s->biasfactor = DEFBIAS;
- s->timeindex = 0;
- s->periodindex = 0;
- s->periodlength = 0.;
- s->fidelity = 0.;
- s->minrms = DEFMINRMS;
- s->framesize = SNAC_FRAME_SIZE;
-
- s->inputbuf = (float*) leaf_calloc(sizeof(float) * SNAC_FRAME_SIZE);
- s->processbuf = (float*) leaf_calloc(sizeof(float) * (SNAC_FRAME_SIZE * 2));
- s->spectrumbuf = (float*) leaf_calloc(sizeof(float) * (SNAC_FRAME_SIZE / 2));
- s->biasbuf = (float*) leaf_calloc(sizeof(float) * SNAC_FRAME_SIZE);
-
- snac_biasbuf(snac);
- tSNAC_setOverlap(snac, overlaparg);
-}
-
-void tSNAC_free(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- leaf_free(s->inputbuf);
- leaf_free(s->processbuf);
- leaf_free(s->spectrumbuf);
- leaf_free(s->biasbuf);
- leaf_free(s);
-}
-
-void tSNAC_initToPool (tSNAC* const snac, int overlaparg, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSNAC* s = *snac = (_tSNAC*) mpool_alloc(sizeof(_tSNAC), &m->pool);
-
- s->biasfactor = DEFBIAS;
- s->timeindex = 0;
- s->periodindex = 0;
- s->periodlength = 0.;
- s->fidelity = 0.;
- s->minrms = DEFMINRMS;
- s->framesize = SNAC_FRAME_SIZE;
-
- s->inputbuf = (float*) mpool_calloc(sizeof(float) * SNAC_FRAME_SIZE, &m->pool);
- s->processbuf = (float*) mpool_calloc(sizeof(float) * (SNAC_FRAME_SIZE * 2), &m->pool);
- s->spectrumbuf = (float*) mpool_calloc(sizeof(float) * (SNAC_FRAME_SIZE / 2), &m->pool);
- s->biasbuf = (float*) mpool_calloc(sizeof(float) * SNAC_FRAME_SIZE, &m->pool);
-
- snac_biasbuf(snac);
- tSNAC_setOverlap(snac, overlaparg);
-}
-
-void tSNAC_freeFromPool (tSNAC* const snac, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSNAC* s = *snac;
-
- mpool_free(s->inputbuf, &m->pool);
- mpool_free(s->processbuf, &m->pool);
- mpool_free(s->spectrumbuf, &m->pool);
- mpool_free(s->biasbuf, &m->pool);
- mpool_free(s, &m->pool);
-}
-
-/******************************************************************************/
-/************************** public access functions****************************/
-/******************************************************************************/
-
-
-void tSNAC_ioSamples(tSNAC* const snac, float *in, float *out, int size)
-{
- _tSNAC* s = *snac;
-
- int timeindex = s->timeindex;
- int mask = s->framesize - 1;
- int outindex = 0;
- float *inputbuf = s->inputbuf;
- float *processbuf = s->processbuf;
-
- // call analysis function when it is time
- if(!(timeindex & (s->framesize / s->overlap - 1))) snac_analyzeframe(snac);
-
- while(size--)
- {
- inputbuf[timeindex] = *in++;
- out[outindex++] = processbuf[timeindex++];
- timeindex &= mask;
- }
- s->timeindex = timeindex;
-}
-
-void tSNAC_setOverlap(tSNAC* const snac, int lap)
-{
- _tSNAC* s = *snac;
- if(!((lap==1)|(lap==2)|(lap==4)|(lap==8))) lap = DEFOVERLAP;
- s->overlap = lap;
-}
-
-
-void tSNAC_setBias(tSNAC* const snac, float bias)
-{
- _tSNAC* s = *snac;
- if(bias > 1.) bias = 1.;
- if(bias < 0.) bias = 0.;
- s->biasfactor = bias;
- snac_biasbuf(snac);
- return;
-}
-
-
-void tSNAC_setMinRMS(tSNAC* const snac, float rms)
-{
- _tSNAC* s = *snac;
- if(rms > 1.) rms = 1.;
- if(rms < 0.) rms = 0.;
- s->minrms = rms;
- return;
-}
-
-
-float tSNAC_getPeriod(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
- return(s->periodlength);
-}
-
-
-float tSNAC_getFidelity(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
- return(s->fidelity);
-}
-
-
-/******************************************************************************/
-/***************************** private procedures *****************************/
-/******************************************************************************/
-
-
-// main analysis function
-static void snac_analyzeframe(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n, tindex = s->timeindex;
- int framesize = s->framesize;
- int mask = framesize - 1;
- float norm = 1. / sqrt((float)(framesize * 2));
-
- float *inputbuf = s->inputbuf;
- float *processbuf = s->processbuf;
-
- // copy input to processing buffers
- for(n=0; n<framesize; n++)
- {
- processbuf[n] = inputbuf[tindex] * norm;
- tindex++;
- tindex &= mask;
- }
-
- // zeropadding
- for(n=framesize; n<(framesize<<1); n++) processbuf[n] = 0.;
-
- // call analysis procedures
- snac_autocorrelation(snac);
- snac_normalize(snac);
- snac_pickpeak(snac);
- snac_periodandfidelity(snac);
-}
-
-
-static void snac_autocorrelation(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n, m;
- int framesize = s->framesize;
- int fftsize = framesize * 2;
- float *processbuf = s->processbuf;
- float *spectrumbuf = s->spectrumbuf;
-
- REALFFT(fftsize, processbuf);
-
- // compute power spectrum
- processbuf[0] *= processbuf[0]; // DC
- processbuf[framesize] *= processbuf[framesize]; // Nyquist
-
- for(n=1; n<framesize; n++)
- {
- processbuf[n] = processbuf[n] * processbuf[n]
- + processbuf[fftsize-n] * processbuf[fftsize-n]; // imag coefficients appear reversed
- processbuf[fftsize-n] = 0.;
- }
-
- // store power spectrum up to SR/4 for possible later use
- for(m=0; m<(framesize>>1); m++)
- {
- spectrumbuf[m] = processbuf[m];
- }
-
- // transform power spectrum to autocorrelation function
- REALIFFT(fftsize, processbuf);
- return;
-}
-
-
-static void snac_normalize(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int framesize = s->framesize;
- int framesizeplustimeindex = s->framesize + s->timeindex;
- int timeindexminusone = s->timeindex - 1;
- int n, m;
- int mask = framesize - 1;
- int seek = framesize * SEEK;
- float *inputbuf = s->inputbuf;
- float *processbuf= s->processbuf;
- float signal1, signal2;
-
- // minimum RMS implemented as minimum autocorrelation at index 0
- // functionally equivalent to white noise floor
- float rms = s->minrms / sqrt(1.0f / (float)framesize);
- float minrzero = rms * rms;
- float rzero = processbuf[0];
- if(rzero < minrzero) rzero = minrzero;
- double normintegral = (double)rzero * 2.;
-
- // normalize biased autocorrelation function
- // inputbuf is circular buffer: timeindex may be non-zero when overlap > 1
- processbuf[0] = 1;
- for(n=1, m=s->timeindex+1; n<seek; n++, m++)
- {
- signal1 = inputbuf[(n + timeindexminusone)&mask];
- signal2 = inputbuf[(framesizeplustimeindex - n)&mask];
- normintegral -= (double)(signal1 * signal1 + signal2 * signal2);
- processbuf[n] /= (float)normintegral * 0.5f;
- }
-
- // flush instable function tail
- for(n = seek; n<framesize; n++) processbuf[n] = 0.;
- return;
-}
-
-
-static void snac_periodandfidelity(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- float periodlength;
-
- if(s->periodindex)
- {
- periodlength = (float)s->periodindex +
- interpolate3phase(s->processbuf, s->periodindex);
- if(periodlength < 8) periodlength = snac_spectralpeak(snac, periodlength);
- s->periodlength = periodlength;
- s->fidelity = interpolate3max(s->processbuf, s->periodindex);
- }
- return;
-}
-
-// select the peak which most probably represents period length
-static void snac_pickpeak(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n, peakindex=0;
- int seek = s->framesize * SEEK;
- float *processbuf= s->processbuf;
- float maxvalue = 0.;
- float biasedpeak;
- float *biasbuf = s->biasbuf;
-
- // skip main lobe
- for(n=1; n<seek; n++)
- {
- if(processbuf[n] < 0.) break;
- }
-
- // find interpolated / biased maximum in SNAC function
- // interpolation finds the 'real maximum'
- // biasing favours the first candidate
- for(; n<seek-1; n++)
- {
- if(processbuf[n] >= processbuf[n-1])
- {
- if(processbuf[n] > processbuf[n+1]) // we have a local peak
- {
- biasedpeak = interpolate3max(processbuf, n) * biasbuf[n];
-
- if(biasedpeak > maxvalue)
- {
- maxvalue = biasedpeak;
- peakindex = n;
- }
- }
- }
- }
- s->periodindex = peakindex;
- return;
-}
-
-
-// verify period length via frequency domain (up till SR/4)
-// frequency domain is more precise than lag domain for period lengths < 8
-// argument 'periodlength' is initial estimation from autocorrelation
-static float snac_spectralpeak(tSNAC* const snac, float periodlength)
-{
- _tSNAC* s = *snac;
-
- if(periodlength < 4.0f) return periodlength;
-
- float max = 0.;
- int n, startbin, stopbin, peakbin = 0;
- int spectrumsize = s->framesize>>1;
- float *spectrumbuf = s->spectrumbuf;
- float peaklocation = (float)(s->framesize * 2.0f) / periodlength;
-
- startbin = (int)(peaklocation * 0.8f + 0.5f);
- if(startbin < 1) startbin = 1;
- stopbin = (int)(peaklocation * 1.25f + 0.5f);
- if(stopbin >= spectrumsize - 1) stopbin = spectrumsize - 1;
-
- for(n=startbin; n<stopbin; n++)
- {
- if(spectrumbuf[n] >= spectrumbuf[n-1])
- {
- if(spectrumbuf[n] > spectrumbuf[n+1])
- {
- if(spectrumbuf[n] > max)
- {
- max = spectrumbuf[n];
- peakbin = n;
- }
- }
- }
- }
-
- // calculate amplitudes in peak region
- for(n=(peakbin-1); n<(peakbin+2); n++)
- {
- spectrumbuf[n] = sqrtf(spectrumbuf[n]);
- }
-
- peaklocation = (float)peakbin + interpolate3phase(spectrumbuf, peakbin);
- periodlength = (float)(s->framesize * 2.0f) / peaklocation;
-
- return periodlength;
-}
-
-
-// modified logarithmic bias function
-static void snac_biasbuf(tSNAC* const snac)
-{
- _tSNAC* s = *snac;
-
- int n;
- int maxperiod = (int)(s->framesize * (float)SEEK);
- float bias = s->biasfactor / logf((float)(maxperiod - 4));
- float *biasbuf = s->biasbuf;
-
- for(n=0; n<5; n++) // periods < 5 samples can't be tracked
- {
- biasbuf[n] = 0.0f;
- }
-
- for(n=5; n<maxperiod; n++)
- {
- biasbuf[n] = 1.0f - (float)logf(n - 4) * bias;
- }
-}
-
-//===========================================================================
-// PERIODDETECTION
-//===========================================================================
-void tPeriodDetection_init (tPeriodDetection* const pd, float* in, float* out, int bufSize, int frameSize)
-{
- tPeriodDetection_initToPool(pd, in, out, bufSize, frameSize, &leaf_mempool);
-}
-
-void tPeriodDetection_free (tPeriodDetection* const pd)
-{
- tPeriodDetection_freeFromPool(pd, &leaf_mempool);
-}
-
-void tPeriodDetection_initToPool (tPeriodDetection* const pd, float* in, float* out, int bufSize, int frameSize, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPeriodDetection* p = *pd = (_tPeriodDetection*) mpool_calloc(sizeof(_tPeriodDetection), &m->pool);
-
- p->inBuffer = in;
- p->outBuffer = out;
- p->bufSize = bufSize;
- p->frameSize = frameSize;
- p->framesPerBuffer = p->bufSize / p->frameSize;
- p->curBlock = 1;
- p->lastBlock = 0;
- p->index = 0;
-
- p->hopSize = DEFHOPSIZE;
- p->windowSize = DEFWINDOWSIZE;
- p->fba = FBA;
-
- tEnvPD_initToPool(&p->env, p->windowSize, p->hopSize, p->frameSize, mp);
-
- tSNAC_initToPool(&p->snac, DEFOVERLAP, mp);
-
- p->timeConstant = DEFTIMECONSTANT;
- p->radius = expf(-1000.0f * p->hopSize * leaf.invSampleRate / p->timeConstant);
- p->fidelityThreshold = 0.95;
-}
-
-void tPeriodDetection_freeFromPool (tPeriodDetection* const pd, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPeriodDetection* p = *pd;
-
- tEnvPD_freeFromPool(&p->env, mp);
- tSNAC_freeFromPool(&p->snac, mp);
- mpool_free(p, &m->pool);
-}
-
-float tPeriodDetection_tick (tPeriodDetection* pd, float sample)
-{
- _tPeriodDetection* p = *pd;
-
- int i, iLast;
-
- i = (p->curBlock*p->frameSize);
- iLast = (p->lastBlock*p->frameSize)+p->index;
-
- p->i = i;
- p->iLast = iLast;
-
- p->inBuffer[i+p->index] = sample;
-
- p->index++;
- p->indexstore = p->index;
- if (p->index >= p->frameSize)
- {
- p->index = 0;
-
- tEnvPD_processBlock(&p->env, &(p->inBuffer[i]));
-
- tSNAC_ioSamples(&p->snac, &(p->inBuffer[i]), &(p->outBuffer[i]), p->frameSize);
- float fidelity = tSNAC_getFidelity(&p->snac);
- // Fidelity threshold recommended by Katja Vetters is 0.95 for most instruments/voices http://www.katjaas.nl/helmholtz/helmholtz.html
- if (fidelity > p->fidelityThreshold) p->period = tSNAC_getPeriod(&p->snac);
-
- p->curBlock++;
- if (p->curBlock >= p->framesPerBuffer) p->curBlock = 0;
- p->lastBlock++;
- if (p->lastBlock >= p->framesPerBuffer) p->lastBlock = 0;
- }
-
- return p->period;
-}
-
-float tPeriodDetection_getPeriod(tPeriodDetection* pd)
-{
- _tPeriodDetection* p = *pd;
- return p->period;
-}
-
-void tPeriodDetection_setHopSize(tPeriodDetection* pd, int hs)
-{
- _tPeriodDetection* p = *pd;
- p->hopSize = hs;
-}
-
-void tPeriodDetection_setWindowSize(tPeriodDetection* pd, int ws)
-{
- _tPeriodDetection* p = *pd;
- p->windowSize = ws;
-}
-
-void tPeriodDetection_setFidelityThreshold(tPeriodDetection* pd, float threshold)
-{
- _tPeriodDetection* p = *pd;
- p->fidelityThreshold = threshold;
-}
--- a/LEAF/Src/leaf-delay.c
+++ /dev/null
@@ -1,928 +1,0 @@
-/*==============================================================================
-
- leaf-delay.c
- Created: 20 Jan 2017 12:01:24pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-delay.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-delay.h"
-#include "../leaf.h"
-
-#endif
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Delay ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tDelay_init (tDelay* const dl, uint32_t delay, uint32_t maxDelay)
-{
- tDelay_initToPool(dl, delay, maxDelay, &leaf_mempool);
-}
-
-void tDelay_free(tDelay* const dl)
-{
- tDelay_freeFromPool(dl, &leaf_mempool);
-}
-
-void tDelay_initToPool (tDelay* const dl, uint32_t delay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tDelay* d = *dl = (_tDelay*) mpool_alloc(sizeof(_tDelay), &m->pool);
-
- d->maxDelay = maxDelay;
-
- d->delay = delay;
-
- d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, &m->pool);
-
- d->inPoint = 0;
- d->outPoint = 0;
-
- d->lastIn = 0.0f;
- d->lastOut = 0.0f;
-
- d->gain = 1.0f;
-
- tDelay_setDelay(dl, d->delay);
-}
-
-void tDelay_freeFromPool (tDelay* const dl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tDelay* d = *dl;
-
- mpool_free(d->buff, &m->pool);
- mpool_free(d, &m->pool);
-}
-
-void tDelay_clear(tDelay* const dl)
-{
- _tDelay* d = *dl;
- for (int i = 0; i < d->maxDelay; i++)
- {
- d->buff[i] = 0;
- }
-}
-
-float tDelay_tick (tDelay* const dl, float input)
-{
- _tDelay* d = *dl;
-
- // Input
- d->lastIn = input;
- d->buff[d->inPoint] = input * d->gain;
- if (++(d->inPoint) == d->maxDelay) d->inPoint = 0;
-
- // Output
- d->lastOut = d->buff[d->outPoint];
- if (++(d->outPoint) == d->maxDelay) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-int tDelay_setDelay (tDelay* const dl, uint32_t delay)
-{
- _tDelay* d = *dl;
-
- d->delay = LEAF_clip(0.0f, delay, d->maxDelay);
-
- // read chases write
- if ( d->inPoint >= delay ) d->outPoint = d->inPoint - d->delay;
- else d->outPoint = d->maxDelay + d->inPoint - d->delay;
-
- return 0;
-}
-
-float tDelay_tapOut (tDelay* const dl, uint32_t tapDelay)
-{
- _tDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return d->buff[tap];
-
-}
-
-void tDelay_tapIn (tDelay* const dl, float value, uint32_t tapDelay)
-{
- _tDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- d->buff[tap] = value;
-}
-
-float tDelay_addTo (tDelay* const dl, float value, uint32_t tapDelay)
-{
- _tDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return (d->buff[tap] += value);
-}
-
-uint32_t tDelay_getDelay (tDelay* const dl)
-{
- _tDelay* d = *dl;
- return d->delay;
-}
-
-float tDelay_getLastOut (tDelay* const dl)
-{
- _tDelay* d = *dl;
- return d->lastOut;
-}
-
-float tDelay_getLastIn (tDelay* const dl)
-{
- _tDelay* d = *dl;
- return d->lastIn;
-}
-
-void tDelay_setGain (tDelay* const dl, float gain)
-{
- _tDelay* d = *dl;
- if (gain < 0.0f) d->gain = 0.0f;
- else d->gain = gain;
-}
-
-float tDelay_getGain (tDelay* const dl)
-{
- _tDelay* d = *dl;
- return d->gain;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ LinearDelay ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tLinearDelay_init (tLinearDelay* const dl, float delay, uint32_t maxDelay)
-{
- tLinearDelay_initToPool(dl, delay, maxDelay, &leaf_mempool);
-}
-
-void tLinearDelay_free(tLinearDelay* const dl)
-{
- tLinearDelay_freeFromPool(dl, &leaf_mempool);
-}
-
-void tLinearDelay_initToPool (tLinearDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLinearDelay* d = *dl = (_tLinearDelay*) mpool_alloc(sizeof(_tLinearDelay), &m->pool);
-
- d->maxDelay = maxDelay;
-
- if (delay > maxDelay) d->delay = maxDelay;
- else if (delay < 0.0f) d->delay = 0.0f;
- else d->delay = delay;
-
- d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, &m->pool);
-
- d->gain = 1.0f;
-
- d->lastIn = 0.0f;
- d->lastOut = 0.0f;
-
- d->inPoint = 0;
- d->outPoint = 0;
-
- tLinearDelay_setDelay(dl, d->delay);
-}
-
-void tLinearDelay_freeFromPool(tLinearDelay* const dl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLinearDelay* d = *dl;
-
- mpool_free(d->buff, &m->pool);
- mpool_free(d, &m->pool);
-}
-
-void tLinearDelay_clear(tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
- for (int i = 0; i < d->maxDelay; i++)
- {
- d->buff[i] = 0;
- }
-}
-
-float tLinearDelay_tick (tLinearDelay* const dl, float input)
-{
- _tLinearDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-
- uint32_t idx = (uint32_t) d->outPoint;
- // First 1/2 of interpolation
- d->lastOut = d->buff[idx] * d->omAlpha;
- // Second 1/2 of interpolation
- if ((idx + 1) < d->maxDelay)
- d->lastOut += d->buff[idx+1] * d->alpha;
- else
- d->lastOut += d->buff[0] * d->alpha;
-
- // Increment output pointer modulo length
- if ( (++d->outPoint) >= d->maxDelay ) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-void tLinearDelay_tickIn (tLinearDelay* const dl, float input)
-{
- _tLinearDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-}
-
-float tLinearDelay_tickOut (tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
-
- uint32_t idx = (uint32_t) d->outPoint;
- // First 1/2 of interpolation
- d->lastOut = d->buff[idx] * d->omAlpha;
- // Second 1/2 of interpolation
- if ((idx + 1) < d->maxDelay)
- d->lastOut += d->buff[idx+1] * d->alpha;
- else
- d->lastOut += d->buff[0] * d->alpha;
-
- // Increment output pointer modulo length
- if ( (++d->outPoint) >= d->maxDelay ) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-int tLinearDelay_setDelay (tLinearDelay* const dl, float delay)
-{
- _tLinearDelay* d = *dl;
-
- d->delay = LEAF_clip(0.0f, delay, d->maxDelay);
-
- float outPointer = d->inPoint - d->delay;
-
- while ( outPointer < 0 )
- outPointer += d->maxDelay; // modulo maximum length
-
- d->outPoint = (uint32_t) outPointer; // integer part
-
- d->alpha = outPointer - d->outPoint; // fractional part
- d->omAlpha = 1.0f - d->alpha;
-
- if ( d->outPoint == d->maxDelay ) d->outPoint = 0;
-
- return 0;
-}
-
-float tLinearDelay_tapOut (tLinearDelay* const dl, uint32_t tapDelay)
-{
- _tLinearDelay* d = *dl;
-
- uint32_t tap = d->inPoint - tapDelay - 1;
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return d->buff[tap];
-}
-
-void tLinearDelay_tapIn (tLinearDelay* const dl, float value, uint32_t tapDelay)
-{
- _tLinearDelay* d = *dl;
-
- uint32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- d->buff[tap] = value;
-}
-
-float tLinearDelay_addTo (tLinearDelay* const dl, float value, uint32_t tapDelay)
-{
- _tLinearDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return (d->buff[tap] += value);
-}
-
-float tLinearDelay_getDelay (tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
- return d->delay;
-}
-
-float tLinearDelay_getLastOut (tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
- return d->lastOut;
-}
-
-float tLinearDelay_getLastIn (tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
- return d->lastIn;
-}
-
-void tLinearDelay_setGain (tLinearDelay* const dl, float gain)
-{
- _tLinearDelay* d = *dl;
- if (gain < 0.0f) d->gain = 0.0f;
- else d->gain = gain;
-}
-
-float tLinearDelay_getGain (tLinearDelay* const dl)
-{
- _tLinearDelay* d = *dl;
- return d->gain;
-}
-
-
-
-
-
-/// Hermite Interpolated Delay
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ LinearDelay ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tHermiteDelay_init (tHermiteDelay* const dl, float delay, uint32_t maxDelay)
-{
- tHermiteDelay_initToPool(dl, delay, maxDelay, &leaf_mempool);
-}
-
-void tHermiteDelay_free(tHermiteDelay* const dl)
-{
- tHermiteDelay_freeFromPool(dl, &leaf_mempool);
-}
-
-void tHermiteDelay_initToPool (tHermiteDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tHermiteDelay* d = *dl = (_tHermiteDelay*) mpool_alloc(sizeof(_tHermiteDelay), &m->pool);
-
- d->maxDelay = maxDelay;
-
- if (delay > maxDelay) d->delay = maxDelay;
- else if (delay < 0.0f) d->delay = 0.0f;
- else d->delay = delay;
-
- d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, &m->pool);
-
- d->gain = 1.0f;
-
- d->lastIn = 0.0f;
- d->lastOut = 0.0f;
-
- d->inPoint = 0;
- d->outPoint = 0;
-
- tHermiteDelay_setDelay(dl, d->delay);
-}
-
-void tHermiteDelay_freeFromPool(tHermiteDelay* const dl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tHermiteDelay* d = *dl;
-
- mpool_free(d->buff, &m->pool);
- mpool_free(d, &m->pool);
-}
-
-
-void tHermiteDelay_clear(tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
- for (int i = 0; i < d->maxDelay; i++)
- {
- d->buff[i] = 0;
- }
-}
-
-float tHermiteDelay_tick (tHermiteDelay* const dl, float input)
-{
- _tHermiteDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-
-
- uint32_t idx = (uint32_t) d->outPoint;
- d->lastOut = LEAF_interpolate_hermite (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay],
- d->buff[idx],
- d->buff[(idx + 1) % d->maxDelay],
- d->buff[(idx + 2) % d->maxDelay],
- d->alpha);
-
- // Increment output pointer modulo length
- if ( (++d->outPoint) >= d->maxDelay ) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-void tHermiteDelay_tickIn (tHermiteDelay* const dl, float input)
-{
- _tHermiteDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-}
-
-float tHermiteDelay_tickOut (tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
-
- uint32_t idx = (uint32_t) d->outPoint;
-
-
-
- d->lastOut = LEAF_interpolate_hermite (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay],
- d->buff[idx],
- d->buff[(idx + 1) % d->maxDelay],
- d->buff[(idx + 2) % d->maxDelay],
- d->alpha);
-
- // Increment output pointer modulo length
- if ( (++d->outPoint) >= d->maxDelay ) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-int tHermiteDelay_setDelay (tHermiteDelay* const dl, float delay)
-{
- _tHermiteDelay* d = *dl;
-
- d->delay = LEAF_clip(0.0f, delay, d->maxDelay);
-
- float outPointer = d->inPoint - d->delay;
-
- while ( outPointer < 0 )
- outPointer += d->maxDelay; // modulo maximum length
-
- d->outPoint = (uint32_t) outPointer; // integer part
-
- d->alpha = outPointer - d->outPoint; // fractional part
- d->omAlpha = 1.0f - d->alpha;
-
- if ( d->outPoint == d->maxDelay ) d->outPoint = 0;
-
- return 0;
-}
-
-float tHermiteDelay_tapOut (tHermiteDelay* const dl, uint32_t tapDelay)
-{
- _tHermiteDelay* d = *dl;
-
- uint32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return d->buff[tap];
-
-}
-
-void tHermiteDelay_tapIn (tHermiteDelay* const dl, float value, uint32_t tapDelay)
-{
- _tHermiteDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- d->buff[tap] = value;
-}
-
-float tHermiteDelay_addTo (tHermiteDelay* const dl, float value, uint32_t tapDelay)
-{
- _tHermiteDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return (d->buff[tap] += value);
-}
-
-float tHermiteDelay_getDelay (tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
- return d->delay;
-}
-
-float tHermiteDelay_getLastOut (tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
- return d->lastOut;
-}
-
-float tHermiteDelay_getLastIn (tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
- return d->lastIn;
-}
-
-void tHermiteDelay_setGain (tHermiteDelay* const dl, float gain)
-{
- _tHermiteDelay* d = *dl;
- if (gain < 0.0f) d->gain = 0.0f;
- else d->gain = gain;
-}
-
-float tHermiteDelay_getGain (tHermiteDelay* const dl)
-{
- _tHermiteDelay* d = *dl;
- return d->gain;
-}
-
-
-
-
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ AllpassDelay ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tAllpassDelay_init (tAllpassDelay* const dl, float delay, uint32_t maxDelay)
-{
- tAllpassDelay_initToPool(dl, delay, maxDelay, &leaf_mempool);
-}
-
-void tAllpassDelay_free(tAllpassDelay* const dl)
-{
- tAllpassDelay_freeFromPool(dl, &leaf_mempool);
-}
-
-void tAllpassDelay_initToPool (tAllpassDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAllpassDelay* d = *dl = (_tAllpassDelay*) mpool_alloc(sizeof(_tAllpassDelay), &m->pool);
-
- d->maxDelay = maxDelay;
-
- if (delay > maxDelay) d->delay = maxDelay;
- else if (delay < 0.0f) d->delay = 0.0f;
- else d->delay = delay;
-
- d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, &m->pool);
-
- d->gain = 1.0f;
-
- d->lastIn = 0.0f;
- d->lastOut = 0.0f;
-
- d->inPoint = 0;
- d->outPoint = 0;
-
- tAllpassDelay_setDelay(dl, d->delay);
-
- d->apInput = 0.0f;
-}
-
-void tAllpassDelay_freeFromPool(tAllpassDelay* const dl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAllpassDelay* d = *dl;
-
- mpool_free(d->buff, &m->pool);
- mpool_free(d, &m->pool);
-}
-
-void tAllpassDelay_clear(tAllpassDelay* const dl)
-{
- _tAllpassDelay* d = *dl;
- for (int i = 0; i < d->maxDelay; i++)
- {
- d->buff[i] = 0;
- }
-}
-
-float tAllpassDelay_tick (tAllpassDelay* const dl, float input)
-{
- _tAllpassDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if ( ++(d->inPoint) >= d->maxDelay ) d->inPoint = 0;
-
- // Do allpass interpolation delay.
- float out = d->lastOut * -d->coeff;
- out += d->apInput + ( d->coeff * d->buff[d->outPoint] );
- d->lastOut = out;
-
- // Save allpass input
- d->apInput = d->buff[d->outPoint];
-
- // Increment output pointer modulo length.
- if (++(d->outPoint) >= d->maxDelay ) d->outPoint = 0;
-
- return d->lastOut;
-}
-
-int tAllpassDelay_setDelay (tAllpassDelay* const dl, float delay)
-{
- _tAllpassDelay* d = *dl;
-
- d->delay = LEAF_clip(0.5f, delay, d->maxDelay);
-
- // outPoint chases inPoint
- float outPointer = (float)d->inPoint - d->delay + 1.0f;
-
- while ( outPointer < 0 ) outPointer += d->maxDelay; // mod max length
-
- d->outPoint = (uint32_t) outPointer; // integer part
-
- if ( d->outPoint >= d->maxDelay ) d->outPoint = 0;
-
- d->alpha = 1.0f + (float)d->outPoint - outPointer; // fractional part
-
- if ( d->alpha < 0.5f )
- {
- // The optimal range for alpha is about 0.5 - 1.5 in order to
- // achieve the flattest phase delay response.
-
- d->outPoint += 1;
-
- if ( d->outPoint >= d->maxDelay ) d->outPoint -= d->maxDelay;
-
- d->alpha += 1.0f;
- }
-
- d->coeff = (1.0f - d->alpha) / (1.0f + d->alpha); // coefficient for allpass
-
- return 0;
-}
-
-float tAllpassDelay_tapOut (tAllpassDelay* const dl, uint32_t tapDelay)
-{
- _tAllpassDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return d->buff[tap];
-
-}
-
-void tAllpassDelay_tapIn (tAllpassDelay* const dl, float value, uint32_t tapDelay)
-{
- _tAllpassDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- d->buff[tap] = value;
-}
-
-float tAllpassDelay_addTo (tAllpassDelay* const dl, float value, uint32_t tapDelay)
-{
- _tAllpassDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return (d->buff[tap] += value);
-}
-
-float tAllpassDelay_getDelay (tAllpassDelay* const dl)
-{
- _tAllpassDelay* d = *dl;
- return d->delay;
-}
-
-float tAllpassDelay_getLastOut (tAllpassDelay* const dl)
-{
- _tAllpassDelay* d = *dl;
- return d->lastOut;
-}
-
-float tAllpassDelay_getLastIn (tAllpassDelay* const dl)
-{
- _tAllpassDelay* d = *dl;
- return d->lastIn;
-}
-
-void tAllpassDelay_setGain (tAllpassDelay* const dl, float gain)
-{
- _tAllpassDelay* d = *dl;
- if (gain < 0.0f) d->gain = 0.0f;
- else d->gain = gain;
-}
-
-float tAllpassDelay_getGain (tAllpassDelay* const dl)
-{
- _tAllpassDelay* d = *dl;
- return d->gain;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ TapeDelay ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tTapeDelay_init (tTapeDelay* const dl, float delay, uint32_t maxDelay)
-{
- tTapeDelay_initToPool(dl, delay, maxDelay, &leaf_mempool);
-}
-
-void tTapeDelay_free(tTapeDelay* const dl)
-{
- tTapeDelay_freeFromPool(dl, &leaf_mempool);
-}
-
-void tTapeDelay_initToPool (tTapeDelay* const dl, float delay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTapeDelay* d = *dl = (_tTapeDelay*) mpool_alloc(sizeof(_tTapeDelay), &m->pool);
-
- d->maxDelay = maxDelay;
-
- d->buff = (float*) mpool_alloc(sizeof(float) * maxDelay, &m->pool);
-
- d->gain = 1.0f;
-
- d->lastIn = 0.0f;
- d->lastOut = 0.0f;
-
- d->idx = 0.0f;
- d->inc = 1.0f;
- d->inPoint = 0;
-
- tTapeDelay_setDelay(dl, delay);
-}
-
-void tTapeDelay_freeFromPool(tTapeDelay* const dl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTapeDelay* d = *dl;
-
- mpool_free(d->buff, &m->pool);
- mpool_free(d, &m->pool);
-}
-
-void tTapeDelay_clear(tTapeDelay* const dl)
-{
- _tTapeDelay* d = *dl;
- for (int i = 0; i < d->maxDelay; i++)
- {
- d->buff[i] = 0;
- }
-}
-
-//#define SMOOTH_FACTOR 10.f
-
-float tTapeDelay_tick (tTapeDelay* const dl, float input)
-{
- _tTapeDelay* d = *dl;
-
- d->buff[d->inPoint] = input * d->gain;
-
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-
- int idx = (int) d->idx;
- float alpha = d->idx - idx;
-
- d->lastOut = LEAF_interpolate_hermite_x (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay],
- d->buff[idx],
- d->buff[(idx + 1) % d->maxDelay],
- d->buff[(idx + 2) % d->maxDelay],
- alpha);
-
- float diff = (d->inPoint - d->idx);
- while (diff < 0.f) diff += d->maxDelay;
-
- d->inc = 1.0f + (diff - d->delay) / d->delay; //* SMOOTH_FACTOR;
-
- d->idx += d->inc;
-
- if (d->idx >= d->maxDelay) d->idx = 0.0f;
-
- if (d->lastOut)
- return d->lastOut;
- return 0.0f;
-}
-
-void tTapeDelay_incrementInPoint(tTapeDelay* const dl)
-{
- _tTapeDelay* d = *dl;
- // Increment input pointer modulo length.
- if (++(d->inPoint) == d->maxDelay ) d->inPoint = 0;
-}
-
-
-void tTapeDelay_setRate(tTapeDelay* const dl, float rate)
-{
- _tTapeDelay* d = *dl;
- d->inc = rate;
-}
-
-void tTapeDelay_setDelay (tTapeDelay* const dl, float delay)
-{
- _tTapeDelay* d = *dl;
- d->delay = LEAF_clip(1.f, delay, d->maxDelay);
-}
-
-float tTapeDelay_tapOut (tTapeDelay* const dl, float tapDelay)
-{
- _tTapeDelay* d = *dl;
-
- float tap = (float) d->inPoint - tapDelay - 1.f;
-
- // Check for wraparound.
- while ( tap < 0.f ) tap += (float)d->maxDelay;
-
- int idx = (int) tap;
-
- float alpha = tap - idx;
-
- float samp = LEAF_interpolate_hermite_x (d->buff[((idx - 1) + d->maxDelay) % d->maxDelay],
- d->buff[idx],
- d->buff[(idx + 1) % d->maxDelay],
- d->buff[(idx + 2) % d->maxDelay],
- alpha);
-
- return samp;
-
-}
-
-void tTapeDelay_tapIn (tTapeDelay* const dl, float value, uint32_t tapDelay)
-{
- _tTapeDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- d->buff[tap] = value;
-}
-
-float tTapeDelay_addTo (tTapeDelay* const dl, float value, uint32_t tapDelay)
-{
- _tTapeDelay* d = *dl;
-
- int32_t tap = d->inPoint - tapDelay - 1;
-
- // Check for wraparound.
- while ( tap < 0 ) tap += d->maxDelay;
-
- return (d->buff[tap] += value);
-}
-
-float tTapeDelay_getDelay (tTapeDelay *dl)
-{
- _tTapeDelay* d = *dl;
- return d->delay;
-}
-
-float tTapeDelay_getLastOut (tTapeDelay* const dl)
-{
- _tTapeDelay* d = *dl;
- return d->lastOut;
-}
-
-float tTapeDelay_getLastIn (tTapeDelay* const dl)
-{
- _tTapeDelay* d = *dl;
- return d->lastIn;
-}
-
-void tTapeDelay_setGain (tTapeDelay* const dl, float gain)
-{
- _tTapeDelay* d = *dl;
- if (gain < 0.0f) d->gain = 0.0f;
- else d->gain = gain;
-}
-
-float tTapeDelay_getGain (tTapeDelay* const dl)
-{
- _tTapeDelay* d = *dl;
- return d->gain;
-}
-
--- a/LEAF/Src/leaf-distortion.c
+++ /dev/null
@@ -1,587 +1,0 @@
-//
-// leaf-distortion.c
-// LEAF
-//
-// Created by Jeff Snyder, Matthew Wang, Michael Mulshine, and Joshua Becker
-// Copyright © 2019 Princeton University. All rights reserved.
-//
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-distortion.h"
-#include "..\Inc\leaf-tables.h"
-#else
-
-
-#include "../Inc/leaf-distortion.h"
-#include "../Inc/leaf-tables.h"
-
-//testing
-//#include "gpio.h"
-
-#endif
-
-//============================================================================================================
-// Sample-Rate reducer
-//============================================================================================================
-
-
-void tSampleReducer_init(tSampleReducer* const sr)
-{
- _tSampleReducer* s = *sr = (_tSampleReducer*) leaf_alloc(sizeof(_tSampleReducer));
-
- s->invRatio = 1.0f;
- s->hold = 0.0f;
- s->count = 0;
-}
-
-void tSampleReducer_free (tSampleReducer* const sr)
-{
- _tSampleReducer* s = *sr;
-
- leaf_free(s);
-}
-
-void tSampleReducer_initToPool (tSampleReducer* const sr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSampleReducer* s = *sr = (_tSampleReducer*) mpool_alloc(sizeof(_tSampleReducer), &m->pool);
-
- s->invRatio = 1.0f;
- s->hold = 0.0f;
- s->count = 0;
-}
-
-void tSampleReducer_freeFromPool (tSampleReducer* const sr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSampleReducer* s = *sr;
-
- mpool_free(s, &m->pool);
-}
-
-float tSampleReducer_tick(tSampleReducer* const sr, float input)
-{
- _tSampleReducer* s = *sr;
- if (s->count > s->invRatio)
- {
- s->hold = input;
- s->count = 0;
- }
-
- s->count++;
- return s->hold;
-}
-
-
-void tSampleReducer_setRatio(tSampleReducer* const sr, float ratio)
-{
- _tSampleReducer* s = *sr;
- if ((ratio <= 1.0f) && (ratio >= 0.0f))
- s->invRatio = 1.0f / ratio;
-
-}
-
-//============================================================================================================
-// Oversampler
-//============================================================================================================
-// Latency is equal to the phase length (numTaps / ratio)
-void tOversampler_init(tOversampler* const osr, int ratio, oBool extraQuality)
-{
- _tOversampler* os = *osr = (_tOversampler*) leaf_alloc(sizeof(_tOversampler));
-
- uint8_t offset = 0;
- if (extraQuality) offset = 6;
- if (ratio == 2 || ratio == 4 ||
- ratio == 8 || ratio == 16 ||
- ratio == 32 || ratio == 64) {
- os->ratio = ratio;
- int idx = (int)(log2f(os->ratio))-1+offset;
- os->numTaps = firNumTaps[idx];
- os->phaseLength = os->numTaps / os->ratio;
- os->pCoeffs = (float*) firCoeffs[idx];
- os->upState = leaf_alloc(sizeof(float) * os->numTaps * 2);
- os->downState = leaf_alloc(sizeof(float) * os->numTaps * 2);
- }
-}
-
-void tOversampler_free(tOversampler* const osr)
-{
- _tOversampler* os = *osr;
-
- leaf_free(os->upState);
- leaf_free(os->downState);
- leaf_free(os);
-}
-
-void tOversampler_initToPool (tOversampler* const osr, int ratio, oBool extraQuality, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOversampler* os = *osr = (_tOversampler*) mpool_alloc(sizeof(_tOversampler), &m->pool);
-
- uint8_t offset = 0;
- if (extraQuality) offset = 6;
- if (ratio == 2 || ratio == 4 ||
- ratio == 8 || ratio == 16 ||
- ratio == 32 || ratio == 64) {
- os->ratio = ratio;
- int idx = (int)(log2f(os->ratio))-1+offset;
- os->numTaps = firNumTaps[idx];
- os->phaseLength = os->numTaps / os->ratio;
- os->pCoeffs = (float*) firCoeffs[idx];
- os->upState = mpool_alloc(sizeof(float) * os->numTaps * 2, &m->pool);
- os->downState = mpool_alloc(sizeof(float) * os->numTaps * 2, &m->pool);
- }
-}
-
-void tOversampler_freeFromPool (tOversampler* const osr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOversampler* os = *osr;
-
- mpool_free(os->upState, &m->pool);
- mpool_free(os->downState, &m->pool);
- mpool_free(os, &m->pool);
-}
-
-float tOversampler_tick(tOversampler* const osr, float input, float (*effectTick)(float))
-{
- _tOversampler* os = *osr;
-
- float buf[os->ratio];
-
- tOversampler_upsample(osr, input, buf);
-
- for (int i = 0; i < os->ratio; ++i) {
- buf[i] = effectTick(buf[i]);
- }
-
- return tOversampler_downsample(osr, buf);
-}
-
-// From CMSIS DSP Library
-void tOversampler_upsample(tOversampler* const osr, float input, float* output)
-{
- _tOversampler* os = *osr;
-
- float *pState = os->upState; /* State pointer */
- float *pCoeffs = os->pCoeffs; /* Coefficient pointer */
- float *pStateCur;
- float *ptr1; /* Temporary pointer for state buffer */
- float *ptr2; /* Temporary pointer for coefficient buffer */
- float sum0; /* Accumulators */
- uint32_t i, tapCnt; /* Loop counters */
- uint32_t phaseLen = os->phaseLength; /* Length of each polyphase filter component */
- uint32_t j;
-
- /* os->pState buffer contains previous frame (phaseLen - 1) samples */
- /* pStateCur points to the location where the new input data should be written */
- pStateCur = os->upState + (phaseLen - 1U);
-
- /* Copy new input sample into the state buffer */
- *pStateCur = input;
-
- /* Address modifier index of coefficient buffer */
- j = 1U;
-
- /* Loop over the Interpolation factor. */
- i = os->ratio;
-
- while (i > 0U)
- {
- /* Set accumulator to zero */
- sum0 = 0.0f;
-
- /* Initialize state pointer */
- ptr1 = pState;
-
- /* Initialize coefficient pointer */
- ptr2 = pCoeffs + (os->ratio - j);
-
- /* Loop over the polyPhase length.
- Repeat until we've computed numTaps-(4*os->L) coefficients. */
-
- /* Initialize tapCnt with number of samples */
- tapCnt = phaseLen;
-
- while (tapCnt > 0U)
- {
- /* Perform the multiply-accumulate */
- sum0 += *ptr1++ * *ptr2;
-
- /* Upsampling is done by stuffing L-1 zeros between each sample.
- * So instead of multiplying zeros with coefficients,
- * Increment the coefficient pointer by interpolation factor times. */
- ptr2 += os->ratio;
-
- /* Decrement loop counter */
- tapCnt--;
- }
-
- /* The result is in the accumulator, store in the destination buffer. */
- *output++ = sum0 * os->ratio;
-
- /* Increment the address modifier index of coefficient buffer */
- j++;
-
- /* Decrement the loop counter */
- i--;
- }
-
- /* Advance the state pointer by 1
- * to process the next group of interpolation factor number samples */
- pState = pState + 1;
-
- /* Processing is complete.
- Now copy the last phaseLen - 1 samples to the satrt of the state buffer.
- This prepares the state buffer for the next function call. */
-
- /* Points to the start of the state buffer */
- pStateCur = os->upState;
-
- /* Initialize tapCnt with number of samples */
- tapCnt = (phaseLen - 1U);
-
- /* Copy data */
- while (tapCnt > 0U)
- {
- *pStateCur++ = *pState++;
-
- /* Decrement loop counter */
- tapCnt--;
- }
-}
-
-// From CMSIS DSP Library
-float tOversampler_downsample(tOversampler *const osr, float* input)
-{
- _tOversampler* os = *osr;
-
- float *pState = os->downState; /* State pointer */
- float *pCoeffs = os->pCoeffs; /* Coefficient pointer */
- float *pStateCur; /* Points to the current sample of the state */
- float *px0; /* Temporary pointer for state buffer */
- float *pb; /* Temporary pointer for coefficient buffer */
- float x0, c0; /* Temporary variables to hold state and coefficient values */
- float acc0; /* Accumulator */
- uint32_t numTaps = os->numTaps; /* Number of filter coefficients in the filter */
- uint32_t i, tapCnt;
- float output;
-
- /* os->pState buffer contains previous frame (numTaps - 1) samples */
- /* pStateCur points to the location where the new input data should be written */
- pStateCur = os->downState + (numTaps - 1U);
-
- /* Copy decimation factor number of new input samples into the state buffer */
- i = os->ratio;
-
- do
- {
- *pStateCur++ = *input++;
-
- } while (--i);
-
- /* Set accumulator to zero */
- acc0 = 0.0f;
-
- /* Initialize state pointer */
- px0 = pState;
-
- /* Initialize coeff pointer */
- pb = pCoeffs;
-
- /* Initialize tapCnt with number of taps */
- tapCnt = numTaps;
-
- while (tapCnt > 0U)
- {
- /* Read coefficients */
- c0 = *pb++;
-
- /* Fetch 1 state variable */
- x0 = *px0++;
-
- /* Perform the multiply-accumulate */
- acc0 += x0 * c0;
-
- /* Decrement loop counter */
- tapCnt--;
- }
-
- /* Advance the state pointer by the decimation factor
- * to process the next group of decimation factor number samples */
- pState = pState + os->ratio;
-
- /* The result is in the accumulator, store in the destination buffer. */
- output = acc0;
-
- /* Processing is complete.
- Now copy the last numTaps - 1 samples to the start of the state buffer.
- This prepares the state buffer for the next function call. */
-
- /* Points to the start of the state buffer */
- pStateCur = os->downState;
-
- /* Initialize tapCnt with number of taps */
- tapCnt = (numTaps - 1U);
-
- /* Copy data */
- while (tapCnt > 0U)
- {
- *pStateCur++ = *pState++;
-
- /* Decrement loop counter */
- tapCnt--;
- }
-
- return output;
-}
-
-int tOversampler_getLatency(tOversampler* const osr)
-{
- _tOversampler* os = *osr;
- return os->phaseLength;
-}
-
-//============================================================================================================
-// WAVEFOLDER
-//============================================================================================================
-
-
-//from the paper: Virtual Analog Model of the Lockhart Wavefolder
-//by Fabián Esqueda, Henri Pöntynen, Julian D. Parker and Stefan Bilbao
-
-void tLockhartWavefolder_init(tLockhartWavefolder* const wf)
-{
- _tLockhartWavefolder* w = *wf = (_tLockhartWavefolder*) leaf_alloc(sizeof(_tLockhartWavefolder));
-
- w->Ln1 = 0.0;
- w->Fn1 = 0.0;
- w->xn1 = 0.0f;
-
- w->RL = 7.5e3;
- w->R = 15e3;
- w->VT = 26e-3;
- w->Is = 10e-16;
-
- w->a = 2.0*w->RL/w->R;
- w->b = (w->R+2.0*w->RL)/(w->VT*w->R);
- w->d = (w->RL*w->Is)/w->VT;
- w->half_a = 0.5 * w->a;
- w->longthing = (0.5*w->VT/w->b);
-
-
- // Antialiasing error threshold
- w->thresh = 10e-10;
-}
-
-void tLockhartWavefolder_free(tLockhartWavefolder* const wf)
-{
- _tLockhartWavefolder* w = *wf;
-
- leaf_free(w);
-}
-
-void tLockhartWavefolder_initToPool (tLockhartWavefolder* const wf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLockhartWavefolder* w = *wf = (_tLockhartWavefolder*) mpool_alloc(sizeof(_tLockhartWavefolder), &m->pool);
-
- w->Ln1 = 0.0;
- w->Fn1 = 0.0;
- w->xn1 = 0.0f;
-
- w->RL = 7.5e3;
- w->R = 15e3;
- w->VT = 26e-3;
- w->Is = 10e-16;
-
- w->a = 2.0*w->RL/w->R;
- w->b = (w->R+2.0*w->RL)/(w->VT*w->R);
- w->d = (w->RL*w->Is)/w->VT;
- w->half_a = 0.5 * w->a;
- w->longthing = (0.5*w->VT/w->b);
-
-
- // Antialiasing error threshold
- w->thresh = 10e-10;
-}
-
-void tLockhartWavefolder_freeFromPool (tLockhartWavefolder* const wf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLockhartWavefolder* w = *wf;
-
- mpool_free(w, &m->pool);
-}
-
-double tLockhartWavefolderLambert(double x, double ln)
-{
- double thresh, w, expw, p, r, s, err;
- // Error threshold
- thresh = 10e-12;
- // Initial guess (use previous value)
- w = ln;
-
- // Haley's method (Sec. 4.2 of the paper)
- for(int i=0; i<1000; i+=1) {
-
- expw = exp(w);
-
- p = w*expw - x;
- r = (w+1.0)*expw;
- s = (w+2.0)/(2.0*(w+1.0));
- err = (p/(r-(p*s)));
-
- if (fabs(err)<thresh) {
-
- break;
- }
-
- w = w - err;
- if (i == 999)
- {
- //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, GPIO_PIN_SET);
- }
-
- }
- return w;
-}
-
-float tLockhartWavefolder_tick(tLockhartWavefolder* const wf, float samp)
-{
- _tLockhartWavefolder* w = *wf;
-
- float out = 0.0f;
-
- // Compute Antiderivative
- int l = (samp > 0.0f) - (samp < 0.0f);
- double u = w->d*exp(l*w->b*samp);
- double Ln = tLockhartWavefolderLambert(u,w->Ln1);
- double Fn = w->longthing*(Ln*(Ln + 2.0)) - w->half_a*samp*samp;
-
- // Check for ill-conditioning
- if (fabs(samp-w->xn1)<w->thresh) {
-
- // Compute Averaged Wavefolder Output
- float xn = 0.5f*(samp+w->xn1);
- u = w->d*exp(l*w->b*xn);
- Ln = tLockhartWavefolderLambert(u,w->Ln1);
- out = (float) (l*w->VT*Ln - w->a*xn);
-
- }
- else {
-
- // Apply AA Form
- out = (float) ((Fn-w->Fn1)/(samp-w->xn1));
- }
-
- // Update States
- w->Ln1 = Ln;
- w->Fn1 = Fn;
- w->xn1 = samp;
-
- return out;
-}
-
-//============================================================================================================
-// CRUSHER
-//============================================================================================================
-#define SCALAR 5000.f
-
-void tCrusher_init (tCrusher* const cr)
-{
- _tCrusher* c = *cr = (_tCrusher*) leaf_alloc(sizeof(_tCrusher));
-
- c->op = 4;
- c->div = SCALAR;
- c->rnd = 0.25f;
- c->srr = 0.25f;
- tSampleReducer_init(&c->sReducer);
- c->gain = (c->div / SCALAR) * 0.7f + 0.3f;
-}
-
-void tCrusher_free (tCrusher* const cr)
-{
- _tCrusher* c = *cr;
- tSampleReducer_free(&c->sReducer);
- leaf_free(c);
-}
-
-void tCrusher_initToPool (tCrusher* const cr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCrusher* c = *cr = (_tCrusher*) mpool_alloc(sizeof(_tCrusher), &m->pool);
-
- c->op = 4;
- c->div = SCALAR;
- c->rnd = 0.25f;
- c->srr = 0.25f;
- tSampleReducer_initToPool(&c->sReducer, mp);
- c->gain = (c->div / SCALAR) * 0.7f + 0.3f;
-}
-
-void tCrusher_freeFromPool (tCrusher* const cr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCrusher* c = *cr;
- tSampleReducer_freeFromPool(&c->sReducer, mp);
- mpool_free(c, &m->pool);
-}
-
-float tCrusher_tick (tCrusher* const cr, float input)
-{
- _tCrusher* c = *cr;
-
- float sample = input;
-
- sample *= SCALAR; // SCALAR is 5000 by default
-
- sample = (int32_t) sample;
-
- sample /= c->div;
-
- sample = LEAF_bitwise_xor(sample, c->op << 23);
-
- sample = LEAF_clip(-1.f, sample, 1.f);
-
- sample = LEAF_round(sample, c->rnd);
-
- sample = tSampleReducer_tick(&c->sReducer, sample);
-
- return sample * c->gain;
-
-}
-
-void tCrusher_setOperation (tCrusher* const cr, float op)
-{
- _tCrusher* c = *cr;
- c->op = (uint32_t) (op * 8.0f);
-}
-
-// 0.0 - 1.0
-void tCrusher_setQuality (tCrusher* const cr, float val)
-{
- _tCrusher* c = *cr;
-
- val = LEAF_clip(0.0f, val, 1.0f);
-
- c->div = 0.01f + val * SCALAR;
-
- c->gain = (c->div / SCALAR) * 0.7f + 0.3f;
-}
-
-// what decimal to round to
-void tCrusher_setRound (tCrusher* const cr, float rnd)
-{
- _tCrusher* c = *cr;
- c->rnd = fabsf(rnd);
-}
-
-void tCrusher_setSamplingRatio (tCrusher* const cr, float ratio)
-{
- _tCrusher* c = *cr;
- c->srr = ratio;
- tSampleReducer_setRatio(&c->sReducer, ratio);
-
-}
--- a/LEAF/Src/leaf-dynamics.c
+++ /dev/null
@@ -1,221 +1,0 @@
-/*==============================================================================
-
- leaf-dynamics.c
- Created: 30 Nov 2018 11:56:49am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-dynamics.h"
-
-#else
-
-#include "../Inc/leaf-dynamics.h"
-
-#endif
-
-//==============================================================================
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Compressor ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-
-/*
- tCompressor* tCompressorInit(int tauAttack, int tauRelease)
- {
- tCompressor* c = &leaf.tCompressorRegistry[leaf.registryIndex[T_COMPRESSOR]++];
-
- c->tauAttack = tauAttack;
- c->tauRelease = tauRelease;
-
- c->x_G[0] = 0.0f, c->x_G[1] = 0.0f,
- c->y_G[0] = 0.0f, c->y_G[1] = 0.0f,
- c->x_T[0] = 0.0f, c->x_T[1] = 0.0f,
- c->y_T[0] = 0.0f, c->y_T[1] = 0.0f;
-
- c->T = 0.0f; // Threshold
- c->R = 1.0f; // compression Ratio
- c->M = 0.0f; // decibel Make-up gain
- c->W = 0.0f; // decibel Width of knee transition
-
- return c;
- }
- */
-void tCompressor_init(tCompressor* const comp)
-{
- _tCompressor* c = *comp = (_tCompressor*) leaf_alloc(sizeof(_tCompressor));
-
- c->tauAttack = 100;
- c->tauRelease = 100;
-
- c->isActive = OFALSE;
-
- c->T = 0.0f; // Threshold
- c->R = 0.5f; // compression Ratio
- c->M = 3.0f; // decibel Width of knee transition
- c->W = 1.0f; // decibel Make-up gain
-}
-
-void tCompressor_free(tCompressor* const comp)
-{
- _tCompressor* c = *comp;
-
- leaf_free(c);
-}
-
-void tCompressor_initToPool (tCompressor* const comp, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCompressor* c = *comp = (_tCompressor*) mpool_alloc(sizeof(_tCompressor), &m->pool);
-
- c->tauAttack = 100;
- c->tauRelease = 100;
-
- c->isActive = OFALSE;
-
- c->T = 0.0f; // Threshold
- c->R = 0.5f; // compression Ratio
- c->M = 3.0f; // decibel Width of knee transition
- c->W = 1.0f; // decibel Make-up gain
-}
-
-void tCompressor_freeFromPool(tCompressor* const comp, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCompressor* c = *comp;
-
- mpool_free(c, &m->pool);
-}
-
-float tCompressor_tick(tCompressor* const comp, float in)
-{
- _tCompressor* c = *comp;
-
- float slope, overshoot;
- float alphaAtt, alphaRel;
-
- float in_db = 20.0f * log10f( fmaxf( fabsf( in), 0.000001f)), out_db = 0.0f;
-
- c->y_T[1] = c->y_T[0];
-
- slope = c->R - 1.0f; // feed-forward topology; was 1/C->R - 1
-
- overshoot = in_db - c->T;
-
-
- if (overshoot <= -(c->W * 0.5f))
- {
- out_db = in_db;
- c->isActive = OFALSE;
- }
- else if ((overshoot > -(c->W * 0.5f)) && (overshoot < (c->W * 0.5f)))
- {
- out_db = in_db + slope * (powf((overshoot + c->W*0.5f),2) / (2.0f * c->W)); // .^ 2 ???
- c->isActive = OTRUE;
- }
- else if (overshoot >= (c->W * 0.5f))
- {
- out_db = in_db + slope * overshoot;
- c->isActive = OTRUE;
- }
-
-
-
- c->x_T[0] = out_db - in_db;
-
- alphaAtt = expf(-1.0f/(0.001f * c->tauAttack * leaf.sampleRate));
- alphaRel = expf(-1.0f/(0.001f * c->tauRelease * leaf.sampleRate));
-
- if (c->x_T[0] > c->y_T[1])
- c->y_T[0] = alphaAtt * c->y_T[1] + (1-alphaAtt) * c->x_T[0];
- else
- c->y_T[0] = alphaRel * c->y_T[1] + (1-alphaRel) * c->x_T[0];
-
- float attenuation = powf(10.0f, ((c->M - c->y_T[0])/20.0f));
-
- return attenuation * in;
-}
-
-/* Feedback Leveler */
-
-void tFeedbackLeveler_init(tFeedbackLeveler* const fb, float targetLevel, float factor, float strength, int mode)
-{
- _tFeedbackLeveler* p = *fb = (_tFeedbackLeveler*) leaf_alloc(sizeof(_tFeedbackLeveler));
-
- p->curr=0.0f;
- p->targetLevel=targetLevel;
- tPowerFollower_init(&p->pwrFlw,factor);
- p->mode=mode;
- p->strength=strength;
-}
-
-void tFeedbackLeveler_free(tFeedbackLeveler* const fb)
-{
- _tFeedbackLeveler* p = *fb;
-
- tPowerFollower_free(&p->pwrFlw);
- leaf_free(p);
-}
-
-void tFeedbackLeveler_initToPool (tFeedbackLeveler* const fb, float targetLevel, float factor, float strength, int mode, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFeedbackLeveler* p = *fb = (_tFeedbackLeveler*) mpool_alloc(sizeof(_tFeedbackLeveler), &m->pool);
-
- p->curr=0.0f;
- p->targetLevel=targetLevel;
- tPowerFollower_initToPool(&p->pwrFlw,factor, mp);
- p->mode=mode;
- p->strength=strength;
-}
-
-void tFeedbackLeveler_freeFromPool (tFeedbackLeveler* const fb, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFeedbackLeveler* p = *fb;
-
- tPowerFollower_freeFromPool(&p->pwrFlw, mp);
- mpool_free(p, &m->pool);
-}
-
-void tFeedbackLeveler_setStrength(tFeedbackLeveler* const fb, float strength)
-{ // strength is how strongly level diff is affecting the amp ratio
- // try 0.125 for a start
- _tFeedbackLeveler* p = *fb;
- p->strength=strength;
-}
-
-void tFeedbackLeveler_setFactor(tFeedbackLeveler* const fb, float factor)
-{
- _tFeedbackLeveler* p = *fb;
- tPowerFollower_setFactor(&p->pwrFlw,factor);
-}
-
-void tFeedbackLeveler_setMode(tFeedbackLeveler* const fb, int mode)
-{ // 0 for decaying with upwards lev limiting, 1 for constrained absolute level (also downwards limiting)
- _tFeedbackLeveler* p = *fb;
- p->mode=mode;
-}
-
-float tFeedbackLeveler_tick(tFeedbackLeveler* const fb, float input)
-{
- _tFeedbackLeveler* p = *fb;
- float levdiff=(tPowerFollower_tick(&p->pwrFlw, input)-p->targetLevel);
- if (p->mode==0 && levdiff<0.0f) levdiff=0.0f;
- p->curr=input*(1.0f-p->strength*levdiff);
- return p->curr;
-}
-
-float tFeedbackLeveler_sample(tFeedbackLeveler* const fb)
-{
- _tFeedbackLeveler* p = *fb;
- return p->curr;
-}
-
-
-void tFeedbackLeveler_setTargetLevel (tFeedbackLeveler* const fb, float TargetLevel)
-{
- _tFeedbackLeveler* p = *fb;
- p->targetLevel=TargetLevel;
-}
-
--- a/LEAF/Src/leaf-effects.c
+++ /dev/null
@@ -1,1676 +1,0 @@
-/*==============================================================================
-
- leaf-vocoder.c
- Created: 20 Jan 2017 12:01:54pm
- Author: Michael R Mulshine
-
- ==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-effects.c"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-effects.h"
-#include "../leaf.h"
-
-#endif
-
-
-
-//============================================================================================================
-// TALKBOX
-//============================================================================================================
-
-void tTalkbox_init(tTalkbox* const voc, int bufsize)
-{
-
- _tTalkbox* v = *voc = (_tTalkbox*) leaf_alloc(sizeof(_tTalkbox));
-
- v->param[0] = 0.5f; //wet
- v->param[1] = 0.0f; //dry
- v->param[2] = 0; // Swap
- v->param[3] = 1.0f; //quality
-
- v->bufsize = bufsize;
-
- v->car0 = (float*) leaf_alloc(sizeof(float) * v->bufsize);
- v->car1 = (float*) leaf_alloc(sizeof(float) * v->bufsize);
- v->window = (float*) leaf_alloc(sizeof(float) * v->bufsize);
- v->buf0 = (float*) leaf_alloc(sizeof(float) * v->bufsize);
- v->buf1 = (float*) leaf_alloc(sizeof(float) * v->bufsize);
-
- tTalkbox_update(voc);
- tTalkbox_suspend(voc);
-}
-
-void tTalkbox_free(tTalkbox* const voc)
-{
- _tTalkbox* v = *voc;
-
- leaf_free(v->buf1);
- leaf_free(v->buf0);
- leaf_free(v->window);
- leaf_free(v->car1);
- leaf_free(v->car0);
-
- leaf_free(v);
-}
-
-void tTalkbox_initToPool (tTalkbox* const voc, int bufsize, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTalkbox* v = *voc = (_tTalkbox*) mpool_alloc(sizeof(_tTalkbox), &m->pool);
-
- v->param[0] = 0.5f; //wet
- v->param[1] = 0.0f; //dry
- v->param[2] = 0; // Swap
- v->param[3] = 1.0f; //quality
-
- v->bufsize = bufsize;
-
- v->car0 = (float*) mpool_alloc(sizeof(float) * v->bufsize, &m->pool);
- v->car1 = (float*) mpool_alloc(sizeof(float) * v->bufsize, &m->pool);
- v->window = (float*) mpool_alloc(sizeof(float) * v->bufsize, &m->pool);
- v->buf0 = (float*) mpool_alloc(sizeof(float) * v->bufsize, &m->pool);
- v->buf1 = (float*) mpool_alloc(sizeof(float) * v->bufsize, &m->pool);
-
- tTalkbox_update(voc);
- tTalkbox_suspend(voc);
-}
-
-void tTalkbox_freeFromPool (tTalkbox* const voc, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTalkbox* v = *voc;
-
- mpool_free(v->buf1, &m->pool);
- mpool_free(v->buf0, &m->pool);
- mpool_free(v->window, &m->pool);
- mpool_free(v->car1, &m->pool);
- mpool_free(v->car0, &m->pool);
-
- mpool_free(v, &m->pool);
-}
-
-void tTalkbox_update(tTalkbox* const voc) ///update internal parameters...
-{
- _tTalkbox* v = *voc;
-
- float fs = leaf.sampleRate;
- if(fs < 8000.0f) fs = 8000.0f;
- if(fs > 96000.0f) fs = 96000.0f;
-
- int32_t n = (int32_t)(0.01633f * fs);
- if(n > v->bufsize) n = v->bufsize;
-
- //O = (VstInt32)(0.0005f * fs);
- v->O = (int32_t)((0.0001f + 0.0004f * v->param[3]) * fs);
-
- if(n != v->N) //recalc hanning window
- {
- v->N = n;
- float dp = TWO_PI / v->N;
- float p = 0.0f;
- for(n=0; n<v->N; n++)
- {
- v->window[n] = 0.5f - 0.5f * cosf(p);
- p += dp;
- }
- }
- v->wet = 0.5f * v->param[0] * v->param[0];
- v->dry = 2.0f * v->param[1] * v->param[1];
-}
-
-void tTalkbox_suspend(tTalkbox* const voc) ///clear any buffers...
-{
- _tTalkbox* v = *voc;
-
- v->pos = v->K = 0;
- v->emphasis = 0.0f;
- v->FX = 0;
-
- v->u0 = v->u1 = v->u2 = v->u3 = v->u4 = 0.0f;
- v->d0 = v->d1 = v->d2 = v->d3 = v->d4 = 0.0f;
-
- for (int32_t i = 0; i < v->bufsize; i++)
- {
- v->buf0[i] = 0;
- v->buf1[i] = 0;
- v->car0[i] = 0;
- v->car1[i] = 0;
- }
-}
-
-
-#define ORD_MAX 100 // Was 50. Increasing this gets rid of glitchiness, lowering it breaks it; not sure how it affects performance
-void tTalkbox_lpc(float *buf, float *car, int32_t n, int32_t o)
-{
- float z[ORD_MAX], r[ORD_MAX], k[ORD_MAX], G, x;
- int32_t i, j, nn=n;
-
- for(j=0; j<=o; j++, nn--) //buf[] is already emphasized and windowed
- {
- z[j] = r[j] = 0.0f;
- for(i=0; i<nn; i++) r[j] += buf[i] * buf[i+j]; //autocorrelation
- }
- r[0] *= 1.001f; //stability fix
-
- float min = 0.00001f;
- if(r[0] < min) { for(i=0; i<n; i++) buf[i] = 0.0f; return; }
-
- tTalkbox_lpcDurbin(r, o, k, &G); //calc reflection coeffs
-
- for(i=0; i<=o; i++)
- {
- if(k[i] > 0.995f) k[i] = 0.995f; else if(k[i] < -0.995f) k[i] = -.995f;
- }
-
- for(i=0; i<n; i++)
- {
- x = G * car[i];
- for(j=o; j>0; j--) //lattice filter
- {
- x -= k[j] * z[j-1];
- z[j] = z[j-1] + k[j] * x;
- }
- buf[i] = z[0] = x; //output buf[] will be windowed elsewhere
- }
-}
-
-
-void tTalkbox_lpcDurbin(float *r, int p, float *k, float *g)
-{
- int i, j;
- float a[ORD_MAX], at[ORD_MAX], e=r[0];
-
- for(i=0; i<=p; i++) a[i] = at[i] = 0.0f; //probably don't need to clear at[] or k[]
-
- for(i=1; i<=p; i++)
- {
- k[i] = -r[i];
-
- for(j=1; j<i; j++)
- {
- at[j] = a[j];
- k[i] -= a[j] * r[i-j];
- }
- if(fabs(e) < 1.0e-20f) { e = 0.0f; break; }
- k[i] /= e; // This might be costing us
-
- a[i] = k[i];
- for(j=1; j<i; j++) a[j] = at[j] + k[i] * at[i-j];
-
- e *= 1.0f - k[i] * k[i];
- }
-
- if(e < 1.0e-20f) e = 0.0f;
- *g = sqrtf(e);
-}
-
-float tTalkbox_tick(tTalkbox* const voc, float synth, float voice)
-{
- _tTalkbox* v = *voc;
-
- int32_t p0=v->pos, p1 = (v->pos + v->N/2) % v->N;
- float e=v->emphasis, w, o, x, dr, fx=v->FX;
- float p, q, h0=0.3f, h1=0.77f;
-
- o = voice;
- x = synth;
-
- dr = o;
-
- p = v->d0 + h0 * x; v->d0 = v->d1; v->d1 = x - h0 * p;
- q = v->d2 + h1 * v->d4; v->d2 = v->d3; v->d3 = v->d4 - h1 * q;
- v->d4 = x;
- x = p + q;
-
- if(v->K++)
- {
- v->K = 0;
-
- v->car0[p0] = v->car1[p1] = x; //carrier input
-
- x = o - e; e = o; //6dB/oct pre-emphasis
-
- w = v->window[p0]; fx = v->buf0[p0] * w; v->buf0[p0] = x * w; //50% overlapping hanning windows
- if(++p0 >= v->N) { tTalkbox_lpc(v->buf0, v->car0, v->N, v->O); p0 = 0; }
-
- w = 1.0f - w; fx += v->buf1[p1] * w; v->buf1[p1] = x * w;
- if(++p1 >= v->N) { tTalkbox_lpc(v->buf1, v->car1, v->N, v->O); p1 = 0; }
- }
-
- p = v->u0 + h0 * fx; v->u0 = v->u1; v->u1 = fx - h0 * p;
- q = v->u2 + h1 * v->u4; v->u2 = v->u3; v->u3 = v->u4 - h1 * q;
- v->u4 = fx;
- x = p + q;
-
- o = x;
-
- v->emphasis = e;
- v->pos = p0;
- v->FX = fx;
-
-
- return o;
-}
-
-void tTalkbox_setQuality(tTalkbox* const voc, float quality)
-{
- _tTalkbox* v = *voc;
-
- v->param[3] = quality;
- v->O = (int32_t)((0.0001f + 0.0004f * v->param[3]) * leaf.sampleRate);
-}
-
-
-//============================================================================================================
-// VOCODER
-//============================================================================================================
-
-void tVocoder_init (tVocoder* const voc)
-{
- _tVocoder* v = *voc = (_tVocoder*) leaf_alloc(sizeof(_tVocoder));
-
- v->param[0] = 0.33f; //input select
- v->param[1] = 0.50f; //output dB
- v->param[2] = 0.40f; //hi thru
- v->param[3] = 0.40f; //hi band
- v->param[4] = 0.16f; //envelope
- v->param[5] = 0.55f; //filter q
- v->param[6] = 0.6667f;//freq range
- v->param[7] = 0.33f; //num bands
-
- tVocoder_update(voc);
-}
-
-void tVocoder_free (tVocoder* const voc)
-{
- _tVocoder* v = *voc;
-
- leaf_free(v);
-}
-
-void tVocoder_initToPool (tVocoder* const voc, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tVocoder* v = *voc = (_tVocoder*) mpool_alloc(sizeof(_tVocoder), &m->pool);
-
- v->param[0] = 0.33f; //input select
- v->param[1] = 0.50f; //output dB
- v->param[2] = 0.40f; //hi thru
- v->param[3] = 0.40f; //hi band
- v->param[4] = 0.16f; //envelope
- v->param[5] = 0.55f; //filter q
- v->param[6] = 0.6667f;//freq range
- v->param[7] = 0.33f; //num bands
-
- tVocoder_update(voc);
-}
-
-void tVocoder_freeFromPool (tVocoder* const voc, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tVocoder* v = *voc;
-
- mpool_free(v, &m->pool);
-}
-
-void tVocoder_update (tVocoder* const voc)
-{
- _tVocoder* v = *voc;
-
- float tpofs = 6.2831853f * leaf.invSampleRate;
-
- float rr, th, re;
-
- float sh;
-
- int32_t i;
-
- v->gain = (float)pow(10.0f, 2.0f * v->param[1] - 3.0f * v->param[5] - 2.0f);
-
- v->thru = (float)pow(10.0f, 0.5f + 2.0f * v->param[1]);
- v->high = v->param[3] * v->param[3] * v->param[3] * v->thru;
- v->thru *= v->param[2] * v->param[2] * v->param[2];
-
- if(v->param[7]<0.5f)
- {
- v->nbnd=8;
- re=0.003f;
- v->f[1][2] = 3000.0f;
- v->f[2][2] = 2200.0f;
- v->f[3][2] = 1500.0f;
- v->f[4][2] = 1080.0f;
- v->f[5][2] = 700.0f;
- v->f[6][2] = 390.0f;
- v->f[7][2] = 190.0f;
- }
- else
- {
- v->nbnd=16;
- re=0.0015f;
- v->f[ 1][2] = 5000.0f; //+1000
- v->f[ 2][2] = 4000.0f; //+750
- v->f[ 3][2] = 3250.0f; //+500
- v->f[ 4][2] = 2750.0f; //+450
- v->f[ 5][2] = 2300.0f; //+300
- v->f[ 6][2] = 2000.0f; //+250
- v->f[ 7][2] = 1750.0f; //+250
- v->f[ 8][2] = 1500.0f; //+250
- v->f[ 9][2] = 1250.0f; //+250
- v->f[10][2] = 1000.0f; //+250
- v->f[11][2] = 750.0f; //+210
- v->f[12][2] = 540.0f; //+190
- v->f[13][2] = 350.0f; //+155
- v->f[14][2] = 195.0f; //+100
- v->f[15][2] = 95.0f;
- }
-
- if(v->param[4]<0.05f) //freeze
- {
- for(i=0;i<v->nbnd;i++) v->f[i][12]=0.0f;
- }
- else
- {
- v->f[0][12] = (float)pow(10.0, -1.7 - 2.7f * v->param[4]); //envelope speed
-
- rr = 0.022f / (float)v->nbnd; //minimum proportional to frequency to stop distortion
- for(i=1;i<v->nbnd;i++)
- {
- v->f[i][12] = (float)(0.025 - rr * (double)i);
- if(v->f[0][12] < v->f[i][12]) v->f[i][12] = v->f[0][12];
- }
- v->f[0][12] = 0.5f * v->f[0][12]; //only top band is at full rate
- }
-
- rr = 1.0 - pow(10.0f, -1.0f - 1.2f * v->param[5]);
- sh = (float)pow(2.0f, 3.0f * v->param[6] - 1.0f); //filter bank range shift
-
- for(i=1;i<v->nbnd;i++)
- {
- v->f[i][2] *= sh;
- th = acos((2.0 * rr * cos(tpofs * v->f[i][2])) / (1.0 + rr * rr));
- v->f[i][0] = (float)(2.0 * rr * cos(th)); //a0
- v->f[i][1] = (float)(-rr * rr); //a1
- //was .98
- v->f[i][2] *= 0.96f; //shift 2nd stage slightly to stop high resonance peaks
- th = acos((2.0 * rr * cos(tpofs * v->f[i][2])) / (1.0 + rr * rr));
- v->f[i][2] = (float)(2.0 * rr * cos(th));
- }
-}
-
-float tVocoder_tick (tVocoder* const voc, float synth, float voice)
-{
- _tVocoder* v = *voc;
-
- float a, b, o=0.0f, aa, bb, oo = v->kout, g = v->gain, ht = v->thru, hh = v->high, tmp;
- uint32_t i, k = v->kval, nb = v->nbnd;
-
- a = voice; //speech
- b = synth; //synth
-
- tmp = a - v->f[0][7]; //integrate modulator for HF band and filter bank pre-emphasis
- v->f[0][7] = a;
- a = tmp;
-
- if(tmp<0.0f) tmp = -tmp;
- v->f[0][11] -= v->f[0][12] * (v->f[0][11] - tmp); //high band envelope
- o = v->f[0][11] * (ht * a + hh * (b - v->f[0][3])); //high band + high thru
-
- v->f[0][3] = b; //integrate carrier for HF band
-
- if(++k & 0x1) //this block runs at half sample rate
- {
- oo = 0.0f;
- aa = a + v->f[0][9] - v->f[0][8] - v->f[0][8]; //apply zeros here instead of in each reson
- v->f[0][9] = v->f[0][8]; v->f[0][8] = a;
- bb = b + v->f[0][5] - v->f[0][4] - v->f[0][4];
- v->f[0][5] = v->f[0][4]; v->f[0][4] = b;
-
- for(i=1; i<nb; i++) //filter bank: 4th-order band pass
- {
- tmp = v->f[i][0] * v->f[i][3] + v->f[i][1] * v->f[i][4] + bb;
- v->f[i][4] = v->f[i][3];
- v->f[i][3] = tmp;
- tmp += v->f[i][2] * v->f[i][5] + v->f[i][1] * v->f[i][6];
- v->f[i][6] = v->f[i][5];
- v->f[i][5] = tmp;
-
- tmp = v->f[i][0] * v->f[i][7] + v->f[i][1] * v->f[i][8] + aa;
- v->f[i][8] = v->f[i][7];
- v->f[i][7] = tmp;
- tmp += v->f[i][2] * v->f[i][9] + v->f[i][1] * v->f[i][10];
- v->f[i][10] = v->f[i][9];
- v->f[i][9] = tmp;
-
- if(tmp<0.0f) tmp = -tmp;
- v->f[i][11] -= v->f[i][12] * (v->f[i][11] - tmp);
- oo += v->f[i][5] * v->f[i][11];
- }
- }
- o += oo * g; //effect of interpolating back up to Fs would be minimal (aliasing >16kHz)
-
- v->kout = oo;
- v->kval = k & 0x1;
- if(fabs(v->f[0][11])<1.0e-10) v->f[0][11] = 0.0f; //catch HF envelope denormal
-
- for(i=1;i<nb;i++)
- if(fabs(v->f[i][3])<1.0e-10 || fabs(v->f[i][7])<1.0e-10)
- for(k=3; k<12; k++) v->f[i][k] = 0.0f; //catch reson & envelope denormals
-
- if(fabs(o)>10.0f) tVocoder_suspend(voc); //catch instability
-
- return o;
-
-}
-
-void tVocoder_suspend (tVocoder* const voc)
-{
- _tVocoder* v = *voc;
-
- int32_t i, j;
-
- for(i=0; i<v->nbnd; i++) for(j=3; j<12; j++) v->f[i][j] = 0.0f; //zero band filters and envelopes
- v->kout = 0.0f;
- v->kval = 0;
-}
-
-//============================================================================================================
-// SOLAD
-//============================================================================================================
-/******************************************************************************/
-/***************** static function declarations *******************************/
-/******************************************************************************/
-
-static void solad_init(_tSOLAD *w);
-static inline float read_sample(_tSOLAD *w, float floatindex);
-static void pitchdown(_tSOLAD *w, float *out);
-static void pitchup(_tSOLAD *w, float *out);
-
-/******************************************************************************/
-/***************** public access functions ************************************/
-/******************************************************************************/
-
-// init
-void tSOLAD_init(tSOLAD* const wp)
-{
- _tSOLAD* w = *wp = (_tSOLAD*) leaf_calloc(sizeof(_tSOLAD));
-
- w->pitchfactor = 1.;
- w->delaybuf = (float*) leaf_calloc(sizeof(float) * (LOOPSIZE+16));
-
- solad_init(w);
-}
-
-void tSOLAD_free(tSOLAD* const wp)
-{
- _tSOLAD* w = *wp;
-
- leaf_free(w->delaybuf);
- leaf_free(w);
-}
-
-void tSOLAD_initToPool (tSOLAD* const wp, tMempool* const mp)
-{
- _tMempool* m = *mp;
-
- _tSOLAD* w = *wp = (_tSOLAD*) mpool_calloc(sizeof(_tSOLAD), &m->pool);
-
- w->pitchfactor = 1.;
- w->delaybuf = (float*) mpool_calloc(sizeof(float) * (LOOPSIZE+16), &m->pool);
-
- solad_init(w);
-}
-
-void tSOLAD_freeFromPool (tSOLAD* const wp, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSOLAD* w = *wp;
-
- mpool_free(w->delaybuf, &m->pool);
- mpool_free(w, &m->pool);
-}
-
-// send one block of input samples, receive one block of output samples
-void tSOLAD_ioSamples(tSOLAD* const wp, float* in, float* out, int blocksize)
-{
- _tSOLAD* w = *wp;
-
- int i = w->timeindex;
- int n = w->blocksize = blocksize;
-
- if(!i) w->delaybuf[LOOPSIZE] = in[0]; // copy one sample for interpolation
- while(n--) w->delaybuf[i++] = *in++; // copy one input block to delay buffer
-
- if(w->pitchfactor > 1) pitchup(w, out);
- else pitchdown(w, out);
-
- w->timeindex += blocksize;
- w->timeindex &= LOOPMASK;
-}
-
-// set periodicity analysis data
-void tSOLAD_setPeriod(tSOLAD* const wp, float period)
-{
- _tSOLAD* w = *wp;
-
- if(period > MAXPERIOD) period = MAXPERIOD;
- if(period > MINPERIOD) w->period = period; // ignore period when too small
-}
-
-// set pitch factor between 0.25 and 4
-void tSOLAD_setPitchFactor(tSOLAD* const wp, float pitchfactor)
-{
- _tSOLAD* w = *wp;
-
- if (pitchfactor <= 0.0f) return;
- w->pitchfactor = pitchfactor;
-}
-
-// force readpointer lag
-void tSOLAD_setReadLag(tSOLAD* const wp, float readlag)
-{
- _tSOLAD* w = *wp;
-
- if(readlag < 0) readlag = 0;
- if(readlag < w->readlag) // do not jump backward, only forward
- {
- w->jump = w->readlag - readlag;
- w->readlag = readlag;
- w->xfadelength = readlag;
- w->xfadevalue = 1;
- }
-}
-
-// reset state variables
-void tSOLAD_resetState(tSOLAD* const wp)
-{
- _tSOLAD* w = *wp;
-
- int n = LOOPSIZE + 1;
- float *buf = w->delaybuf;
-
- while(n--) *buf++ = 0;
- solad_init(w);
-}
-
-/******************************************************************************/
-/******************** private procedures **************************************/
-/******************************************************************************/
-
-/*
- Function pitchdown() is called to read samples from the delay buffer when pitch
- factor is between 0.25 and 1. The read pointer lags behind because of the slowed
- down speed, and it must jump forward towards the write pointer soon as there is
- sufficient space to jump. That is, if there is at least one period of the input
- signal between read pointer and write pointer. When short periods follow up on
- long periods, the read pointer may have space to jump over more than one period
- lenghts. Jump length must be [periodlength ^ 2] in any case.
-
- A linear crossfade function joins the jump-from point with the jump-to point.
- The crossfade must be completed before another read pointer jump is allowed.
- Length of the crossfade function is stored as a number of samples in terms of
- the input sample rate. This length is dynamically translated
- to a crossfade length expressed in output reading rate, according to pitch
- factor which can change before the crossfade is completed. Crossfade length does
- not cover an invariable length in periods for all pitch transposition factors.
- For pitch factors from 0.5 till 1, crossfade length is stretched in the
- output just as much as the signal itself, as crossfade speed is set to equal
- pitch factor. For pitch factors below 0.5, the read pointer wants to jump
- forward before one period is read, therefore the crossfade length as expressed
- in output periods must be shorter. Crossfade speed is set to [1 - pitchfactor]
- for those cases. Pitch factor 0.5 is the natural switch point between crossfade
- speeds [pitchfactor] and [1 - pitchfactor] because 0.5 == 1 - 0.5. The crossfade
- speed modification for pitch factors below 0.5 also means that much of the
- original signal content will be skipped.
- */
-
-
-static void pitchdown(_tSOLAD* const w, float *out)
-{
- int n = w->blocksize;
- float refindex = (float)(w->timeindex + LOOPSIZE); // no negative values!
- float pitchfactor = w->pitchfactor;
- float period = w->period;
- float readlag = w->readlag;
- float readlagstep = 1 - pitchfactor;
- float jump = w->jump;
- float xfadevalue = w->xfadevalue;
- float xfadelength = w->xfadelength;
- float xfadespeed, xfadestep, readindex, outputsample;
-
- if(pitchfactor > 0.5) xfadespeed = pitchfactor;
- else xfadespeed = 1 - pitchfactor;
- xfadestep = xfadespeed / xfadelength;
-
- while(n--)
- {
- if(readlag > period) // check if read pointer may jump forward...
- {
- if(xfadevalue <= 0) // ...but do not interrupt crossfade
- {
- jump = period; // jump forward
- while((jump * 2) < readlag) jump *= 2; // use available space
- readlag -= jump; // reduce read pointer lag
- xfadevalue = 1; // start crossfade
- xfadelength = period - 1;
- xfadestep = xfadespeed / xfadelength;
- }
- }
-
- readindex = refindex - readlag;
- outputsample = read_sample(w, readindex);
-
- if(xfadevalue > 0)
- {
- outputsample *= (1 - xfadevalue); // fadein
- outputsample += read_sample(w, readindex - jump) * xfadevalue; // fadeout
- xfadevalue -= xfadestep;
- }
-
- *out++ = outputsample;
- refindex += 1;
- readlag += readlagstep;
- }
-
- w->jump = jump; // state variables
- w->readlag = readlag;
- w->xfadevalue = xfadevalue;
- w->xfadelength = xfadelength;
-}
-
-
-/*
- Function pitchup() for pitch factors above 1 is more complicated than
- pitchdown(). The read pointer increments faster than the write pointer and a
- backward jump must happen in time, reckoning with the crossfade region. The read
- pointer backward jump length is always one period. In order to minimize the area
- of signal duplicates, crossfade length is aimed at [period / pitchfactor].
- This leads to a crossfade speed of [pitchfactor * pitchfactor].
-
- Some samples for the fade out (but not all of them) must already be in the
- buffer, otherwise we will run out of input samples before the crossfade is
- completed. The ratio of past samples and future samples for a crossfade of any
- length is as follows:
-
- past samples: xfadelength * (1 - 1 / pitchfactor)
- future samples: xfadelength * (1 / pitchfactor)
-
- For example in the case of pitch factor 1.5 this would be:
-
- past samples: xfadelength * (1 - 1 / 1.5) = xfadelength * 1 / 3
- future samples: xfadelength * (1 / 1.5) = xfadelength * 2 / 3
-
- In the case of pitch factor 4 this would be:
-
- past samples: xfadelength * (1 - 1 / 4) = xfadelength * 3 / 4
- future samples: xfadelength * (1 / 4) = xfadelength * 1 / 4
-
- The read pointer lag must therefore preserve a minimum dependent on pitch
- factor. The minimum is called 'limit' here:
-
- limit = period * (pitchfactor - 1) / pitchfactor * pitchfactor
-
- Components of this expression are combined to reuse them in operations, while
- (pitchfactor - 1) is changed to (pitchfactor - 0.99) to avoid numerical
- resolution issues for pitch factors slightly above 1:
-
- xfadespeed = pitchfactor * pitchfactor
- limitfactor = (pitchfactor - 0.99) / xfadespeed
- limit = period * limitfactor
-
- When read lag is smaller than this limit, the read pointer must preferably
- jump backward, unless a previous crossfade is not yet completed. Crossfades must
- preferably be completed, unless the read pointer lag becomes smaller than zero.
- With fluctuating period lengths and pitch factors, the readpointer lag limit may
- change from one input block to the next in such a way that the actual lag is
- suddenly much smaller than the limit, and the intended crossfade length can not
- be applied. Therefore the crossfade length is simply calculated from the
- available amount of samples for all cases, like so:
-
- xfadelength = readlag / limitfactor
-
- For most occurrences, this will amount to a crossfade length reduced to
- [period / pitchfactor] in the output for pitch factors above 1, while in some
- cases it will be considerably shorter. Fortunately, an incidental aberration of
- the intended crossfade length hardly ever creates an audible artifact. The
- reason to specify preferred crossfade length according to pitch factor is to
- minimize the impression of echoes without sacrificing too much of the signal
- content. The readpointer jump length remains one period in any case.
-
- Sometimes, the input signal periodicity may decrease substantially between one
- signal block and the next. In such cases it may be possible for the read pointer
- to jump forward and reduce latency. For every signal block, a check on this
- possibility is done. A previous crossfade must be completed before a forward
- jump is allowed.
- */
-static void pitchup(_tSOLAD* const w, float *out)
-{
- int n = w->blocksize;
- float refindex = (float)(w->timeindex + LOOPSIZE); // no negative values
- float pitchfactor = w->pitchfactor;
- float period = w->period;
- float readlag = w->readlag;
- float jump = w->jump;
- float xfadevalue = w->xfadevalue;
- float xfadelength = w->xfadelength;
-
- float readlagstep = pitchfactor - 1;
- float xfadespeed = pitchfactor * pitchfactor;
- float xfadestep = xfadespeed / xfadelength;
- float limitfactor = (pitchfactor - (float)0.99) / xfadespeed;
- float limit = period * limitfactor;
- float readindex, outputsample;
-
- if((readlag > (period + 2 * limit)) & (xfadevalue < 0))
- {
- jump = period; // jump forward
- while((jump * 2) < (readlag - 2 * limit)) jump *= 2; // use available space
- readlag -= jump; // reduce read pointer lag
- xfadevalue = 1; // start crossfade
- xfadelength = period - 1;
- xfadestep = xfadespeed / xfadelength;
- }
-
- while(n--)
- {
- if(readlag < limit) // check if read pointer should jump backward...
- {
- if((xfadevalue < 0) | (readlag < 0)) // ...but try not to interrupt crossfade
- {
- xfadelength = readlag / limitfactor;
- if(xfadelength < 1) xfadelength = 1;
- xfadestep = xfadespeed / xfadelength;
-
- jump = -period; // jump backward
- readlag += period; // increase read pointer lag
- xfadevalue = 1; // start crossfade
- }
- }
-
- readindex = refindex - readlag;
- outputsample = read_sample(w, readindex);
-
- if(xfadevalue > 0)
- {
- outputsample *= (1 - xfadevalue);
- outputsample += read_sample(w, readindex - jump) * xfadevalue;
- xfadevalue -= xfadestep;
- }
-
- *out++ = outputsample;
- refindex += 1;
- readlag -= readlagstep;
- }
-
- w->readlag = readlag; // state variables
- w->jump = jump;
- w->xfadelength = xfadelength;
- w->xfadevalue = xfadevalue;
-}
-
-// read one sample from delay buffer, with linear interpolation
-static inline float read_sample(_tSOLAD* const w, float floatindex)
-{
- int index = (int)floatindex;
- float fraction = floatindex - (float)index;
- float *buf = w->delaybuf;
- index &= LOOPMASK;
-
- return (buf[index] + (fraction * (buf[index+1] - buf[index])));
-}
-
-static void solad_init(_tSOLAD* const w)
-{
- w->timeindex = 0;
- w->xfadevalue = -1;
- w->period = INITPERIOD;
- w->readlag = INITPERIOD;
- w->blocksize = INITPERIOD;
-}
-
-//============================================================================================================
-// PITCHSHIFT
-//============================================================================================================
-
-static int pitchshift_attackdetect(_tPitchShift* ps)
-{
- float envout;
-
- _tPeriodDetection* p = *ps->p;
-
- envout = tEnvPD_tick(&p->env);
-
- if (envout >= 1.0f)
- {
- p->lastmax = p->max;
- if (envout > p->max)
- {
- p->max = envout;
- }
- else
- {
- p->deltamax = envout - p->max;
- p->max = p->max * ps->radius;
- }
- p->deltamax = p->max - p->lastmax;
- }
-
- p->fba = p->fba ? (p->fba - 1) : 0;
-
- return (p->fba == 0 && (p->max > 60 && p->deltamax > 6)) ? 1 : 0;
-}
-
-void tPitchShift_init (tPitchShift* const psr, tPeriodDetection* pd, float* out, int bufSize)
-{
- _tPitchShift* ps = *psr = (_tPitchShift*) leaf_calloc(sizeof(_tPitchShift));
- _tPeriodDetection* p = *pd;
-
- ps->p = pd;
-
- ps->outBuffer = out;
- ps->bufSize = bufSize;
- ps->frameSize = p->frameSize;
- ps->framesPerBuffer = ps->bufSize / ps->frameSize;
- ps->curBlock = 1;
- ps->lastBlock = 0;
- ps->index = 0;
- ps->pitchFactor = 1.0f;
-
- tSOLAD_init(&ps->sola);
-
- tHighpass_init(&ps->hp, HPFREQ);
-
- tSOLAD_setPitchFactor(&ps->sola, DEFPITCHRATIO);
-}
-
-void tPitchShift_free(tPitchShift* const psr)
-{
- _tPitchShift* ps = *psr;
-
- tSOLAD_free(&ps->sola);
- tHighpass_free(&ps->hp);
- leaf_free(ps);
-}
-
-void tPitchShift_initToPool (tPitchShift* const psr, tPeriodDetection* const pd, float* out, int bufSize, tMempool* const mp)
-{
- _tMempool* m = *mp;
-
- _tPitchShift* ps = *psr = (_tPitchShift*) mpool_calloc(sizeof(_tPitchShift), &m->pool);
-
- _tPeriodDetection* p = *pd;
-
- ps->p = pd;
-
- ps->outBuffer = out;
- ps->bufSize = bufSize;
- ps->frameSize = p->frameSize;
- ps->framesPerBuffer = ps->bufSize / ps->frameSize;
- ps->curBlock = 1;
- ps->lastBlock = 0;
- ps->index = 0;
- ps->pitchFactor = 1.0f;
-
- tSOLAD_initToPool(&ps->sola, mp);
-
- tHighpass_initToPool(&ps->hp, HPFREQ, mp);
-
- tSOLAD_setPitchFactor(&ps->sola, DEFPITCHRATIO);
-}
-
-void tPitchShift_freeFromPool (tPitchShift* const psr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPitchShift* ps = *psr;
-
- tSOLAD_freeFromPool(&ps->sola, mp);
- tHighpass_freeFromPool(&ps->hp, mp);
- mpool_free(ps, &m->pool);
-}
-
-void tPitchShift_setPitchFactor(tPitchShift* psr, float pf)
-{
- _tPitchShift* ps = *psr;
-
- ps->pitchFactor = pf;
-}
-
-float tPitchShift_shift (tPitchShift* psr)
-{
- _tPitchShift* ps = *psr;
- _tPeriodDetection* p = *ps->p;
-
- float period, out;
- int i, iLast;
-
- i = p->i;
- iLast = p->iLast;
-
- out = tHighpass_tick(&ps->hp, ps->outBuffer[iLast]);
-
- if (p->indexstore >= ps->frameSize)
- {
- period = tPeriodDetection_getPeriod(&p);
-
- if(pitchshift_attackdetect(ps) == 1)
- {
- p->fba = 5;
- tSOLAD_setReadLag(&ps->sola, p->windowSize);
- }
-
- tSOLAD_setPeriod(&ps->sola, period);
- tSOLAD_setPitchFactor(&ps->sola, ps->pitchFactor);
-
- tSOLAD_ioSamples(&ps->sola, &(p->inBuffer[i]), &(ps->outBuffer[i]), ps->frameSize);
- }
-
- return out;
-}
-
-float tPitchShift_shiftToFreq (tPitchShift* psr, float freq)
-{
- _tPitchShift* ps = *psr;
- _tPeriodDetection* p = *ps->p;
-
- float period, out;
- int i, iLast;
-
- i = p->i;
- iLast = p->iLast;
-
- out = tHighpass_tick(&ps->hp, ps->outBuffer[iLast]);
-
- if (p->indexstore >= ps->frameSize)
- {
- period = tPeriodDetection_getPeriod(&p);
-
- if(pitchshift_attackdetect(ps) == 1)
- {
- p->fba = 5;
- tSOLAD_setReadLag(&ps->sola, p->windowSize);
- }
-
- tSOLAD_setPeriod(&ps->sola, period);
-
- if (period != 0) ps->pitchFactor = period*freq*leaf.invSampleRate;
- else ps->pitchFactor = 1.0f;
-
- tSOLAD_setPitchFactor(&ps->sola, ps->pitchFactor);
-
- tSOLAD_ioSamples(&ps->sola, &(p->inBuffer[i]), &(ps->outBuffer[i]), ps->frameSize);
- }
- return out;
-}
-
-float tPitchShift_shiftToFunc (tPitchShift* psr, float (*fun)(float))
-{
- _tPitchShift* ps = *psr;
- _tPeriodDetection* p = *ps->p;
-
- float period, out;
- int i, iLast;
-
- i = p->i;
- iLast = p->iLast;
-
- out = tHighpass_tick(&ps->hp, ps->outBuffer[iLast]);
-
- if (p->indexstore >= ps->frameSize)
- {
- period = tPeriodDetection_getPeriod(&p);
-
- if(pitchshift_attackdetect(ps) == 1)
- {
- p->fba = 5;
- tSOLAD_setReadLag(&ps->sola, p->windowSize);
- }
-
- tSOLAD_setPeriod(&ps->sola, period);
-
- ps->pitchFactor = period/fun(period);
- tSOLAD_setPitchFactor(&ps->sola, ps->pitchFactor);
-
- tSOLAD_ioSamples(&ps->sola, &(p->inBuffer[i]), &(ps->outBuffer[i]), ps->frameSize);
-
- ps->curBlock++;
- if (ps->curBlock >= p->framesPerBuffer) ps->curBlock = 0;
- ps->lastBlock++;
- if (ps->lastBlock >= ps->framesPerBuffer) ps->lastBlock = 0;
- }
-
- return out;
-}
-
-//============================================================================================================
-// RETUNE
-//============================================================================================================
-
-void tRetune_init(tRetune* const rt, int numVoices, int bufSize, int frameSize)
-{
- tRetune_initToPool(rt, numVoices, bufSize, frameSize, &leaf_mempool);
-}
-
-void tRetune_free(tRetune* const rt)
-{
- tRetune_freeFromPool(rt, &leaf_mempool);
-}
-
-void tRetune_initToPool (tRetune* const rt, int numVoices, int bufSize, int frameSize, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tRetune* r = *rt = (_tRetune*) mpool_alloc(sizeof(_tRetune), &m->pool);
-
- r->bufSize = bufSize;
- r->frameSize = frameSize;
- r->numVoices = numVoices;
-
- r->inBuffer = (float*) mpool_calloc(sizeof(float) * r->bufSize, &m->pool);
- r->outBuffers = (float**) mpool_calloc(sizeof(float*) * r->numVoices, &m->pool);
-
- r->hopSize = DEFHOPSIZE;
- r->windowSize = DEFWINDOWSIZE;
- r->fba = FBA;
- tRetune_setTimeConstant(rt, DEFTIMECONSTANT);
-
- r->inputPeriod = 0.0f;
-
- r->ps = (tPitchShift*) mpool_calloc(sizeof(tPitchShift) * r->numVoices, &m->pool);
- r->pitchFactor = (float*) mpool_calloc(sizeof(float) * r->numVoices, &m->pool);
- r->tickOutput = (float*) mpool_calloc(sizeof(float) * r->numVoices, &m->pool);
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->outBuffers[i] = (float*) mpool_calloc(sizeof(float) * r->bufSize, &m->pool);
- }
-
- tPeriodDetection_initToPool(&r->pd, r->inBuffer, r->outBuffers[0], r->bufSize, r->frameSize, mp);
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_initToPool(&r->ps[i], &r->pd, r->outBuffers[i], r->bufSize, mp);
- }
-}
-
-void tRetune_freeFromPool (tRetune* const rt, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tRetune* r = *rt;
-
- tPeriodDetection_freeFromPool(&r->pd, mp);
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_freeFromPool(&r->ps[i], mp);
- mpool_free(r->outBuffers[i], &m->pool);
- }
- mpool_free(r->tickOutput, &m->pool);
- mpool_free(r->pitchFactor, &m->pool);
- mpool_free(r->ps, &m->pool);
- mpool_free(r->inBuffer, &m->pool);
- mpool_free(r->outBuffers, &m->pool);
- mpool_free(r, &m->pool);
-}
-
-float* tRetune_tick(tRetune* const rt, float sample)
-{
- _tRetune* r = *rt;
-
- r->inputPeriod = tPeriodDetection_tick(&r->pd, sample);
-
- for (int v = 0; v < r->numVoices; ++v)
- {
- r->tickOutput[v] = tPitchShift_shift(&r->ps[v]);
- }
-
- return r->tickOutput;
-}
-
-void tRetune_setNumVoices(tRetune* const rt, int numVoices)
-{
- _tRetune* r = *rt;
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_free(&r->ps[i]);
- leaf_free(r->outBuffers[i]);
- }
- leaf_free(r->tickOutput);
- leaf_free(r->pitchFactor);
- leaf_free(r->ps);
- leaf_free(r->outBuffers);
-
- r->numVoices = numVoices;
-
- r->outBuffers = (float**) leaf_alloc(sizeof(float*) * r->numVoices);
- r->ps = (tPitchShift*) leaf_alloc(sizeof(tPitchShift) * r->numVoices);
- r->pitchFactor = (float*) leaf_alloc(sizeof(float) * r->numVoices);
- r->tickOutput = (float*) leaf_alloc(sizeof(float) * r->numVoices);
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->outBuffers[i] = (float*) leaf_alloc(sizeof(float) * r->bufSize);
- tPitchShift_init(&r->ps[i], &r->pd, r->outBuffers[i], r->bufSize);
- }
-}
-
-void tRetune_setPitchFactors(tRetune* const rt, float pf)
-{
- _tRetune* r = *rt;
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->pitchFactor[i] = pf;
- tPitchShift_setPitchFactor(&r->ps[i], r->pitchFactor[i]);
- }
-}
-
-void tRetune_setPitchFactor(tRetune* const rt, float pf, int voice)
-{
- _tRetune* r = *rt;
-
- r->pitchFactor[voice] = pf;
- tPitchShift_setPitchFactor(&r->ps[voice], r->pitchFactor[voice]);
-}
-
-void tRetune_setTimeConstant(tRetune* const rt, float tc)
-{
- _tRetune* r = *rt;
-
- r->timeConstant = tc;
- r->radius = expf(-1000.0f * r->hopSize * leaf.invSampleRate / r->timeConstant);
-}
-
-void tRetune_setHopSize(tRetune* const rt, int hs)
-{
- _tRetune* r = *rt;
-
- r->hopSize = hs;
- tPeriodDetection_setHopSize(&r->pd, r->hopSize);
-}
-
-void tRetune_setWindowSize(tRetune* const rt, int ws)
-{
- _tRetune* r = *rt;
-
- r->windowSize = ws;
- tPeriodDetection_setWindowSize(&r->pd, r->windowSize);
-}
-
-void tRetune_setFidelityThreshold(tRetune* const rt, float threshold)
-{
- _tRetune* r = *rt;
-
- tPeriodDetection_setFidelityThreshold(&r->pd, threshold);
-}
-
-float tRetune_getInputPeriod(tRetune* const rt)
-{
- _tRetune* r = *rt;
-
- return r->inputPeriod;
-}
-
-float tRetune_getInputFreq(tRetune* const rt)
-{
- _tRetune* r = *rt;
-
- return 1.0f/r->inputPeriod;
-}
-
-//============================================================================================================
-// AUTOTUNE
-//============================================================================================================
-
-void tAutotune_init(tAutotune* const rt, int numVoices, int bufSize, int frameSize)
-{
- tAutotune_initToPool(rt, numVoices, bufSize, frameSize, &leaf_mempool);
-}
-
-void tAutotune_free(tAutotune* const rt)
-{
- tAutotune_freeFromPool(rt, &leaf_mempool);
-}
-
-void tAutotune_initToPool (tAutotune* const rt, int numVoices, int bufSize, int frameSize, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAutotune* r = *rt = (_tAutotune*) mpool_alloc(sizeof(_tAutotune), &m->pool);
-
- r->bufSize = bufSize;
- r->frameSize = frameSize;
- r->numVoices = numVoices;
-
- r->inBuffer = (float*) mpool_alloc(sizeof(float) * r->bufSize, &m->pool);
- r->outBuffers = (float**) mpool_alloc(sizeof(float*) * r->numVoices, &m->pool);
-
- r->hopSize = DEFHOPSIZE;
- r->windowSize = DEFWINDOWSIZE;
- r->fba = FBA;
- tAutotune_setTimeConstant(rt, DEFTIMECONSTANT);
-
- r->ps = (tPitchShift*) mpool_alloc(sizeof(tPitchShift) * r->numVoices, &m->pool);
- r->freq = (float*) mpool_alloc(sizeof(float) * r->numVoices, &m->pool);
- r->tickOutput = (float*) mpool_alloc(sizeof(float) * r->numVoices, &m->pool);
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->outBuffers[i] = (float*) mpool_alloc(sizeof(float) * r->bufSize, &m->pool);
- }
-
- tPeriodDetection_initToPool(&r->pd, r->inBuffer, r->outBuffers[0], r->bufSize, r->frameSize, mp);
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_initToPool(&r->ps[i], &r->pd, r->outBuffers[i], r->bufSize, mp);
- }
-
- r->inputPeriod = 0.0f;
-}
-
-void tAutotune_freeFromPool (tAutotune* const rt, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAutotune* r = *rt;
-
- tPeriodDetection_freeFromPool(&r->pd, mp);
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_freeFromPool(&r->ps[i], mp);
- mpool_free(r->outBuffers[i], &m->pool);
- }
- mpool_free(r->tickOutput, &m->pool);
- mpool_free(r->freq, &m->pool);
- mpool_free(r->ps, &m->pool);
- mpool_free(r->inBuffer, &m->pool);
- mpool_free(r->outBuffers, &m->pool);
- mpool_free(r, &m->pool);
-}
-
-float* tAutotune_tick(tAutotune* const rt, float sample)
-{
- _tAutotune* r = *rt;
-
- float tempPeriod = tPeriodDetection_tick(&r->pd, sample);
- if (tempPeriod < 1000.0f) //to avoid trying to follow consonants JS
- {
- r->inputPeriod = tempPeriod;
- }
-
- for (int v = 0; v < r->numVoices; ++v)
- {
- r->tickOutput[v] = tPitchShift_shiftToFreq(&r->ps[v], r->freq[v]);
- }
-
- return r->tickOutput;
-}
-
-void tAutotune_setNumVoices(tAutotune* const rt, int numVoices)
-{
- _tAutotune* r = *rt;
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- tPitchShift_free(&r->ps[i]);
- leaf_free(r->outBuffers[i]);
- }
- leaf_free(r->tickOutput);
- leaf_free(r->freq);
- leaf_free(r->ps);
- leaf_free(r->outBuffers);
-
- r->numVoices = numVoices;
-
- r->outBuffers = (float**) leaf_alloc(sizeof(float*) * r->numVoices);
- r->ps = (tPitchShift*) leaf_alloc(sizeof(tPitchShift) * r->numVoices);
- r->freq = (float*) leaf_alloc(sizeof(float) * r->numVoices);
- r->tickOutput = (float*) leaf_alloc(sizeof(float) * r->numVoices);
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->outBuffers[i] = (float*) leaf_alloc(sizeof(float) * r->bufSize);
- tPitchShift_init(&r->ps[i], &r->pd, r->outBuffers[i], r->bufSize);
- }
-}
-
-void tAutotune_setFreqs(tAutotune* const rt, float f)
-{
- _tAutotune* r = *rt;
-
- for (int i = 0; i < r->numVoices; ++i)
- {
- r->freq[i] = f;
- }
-}
-
-void tAutotune_setFreq(tAutotune* const rt, float f, int voice)
-{
- _tAutotune* r = *rt;
-
- r->freq[voice] = f;
-}
-
-void tAutotune_setTimeConstant(tAutotune* const rt, float tc)
-{
- _tAutotune* r = *rt;
-
- r->timeConstant = tc;
- r->radius = expf(-1000.0f * r->hopSize * leaf.invSampleRate / r->timeConstant);
-}
-
-void tAutotune_setHopSize(tAutotune* const rt, int hs)
-{
- _tAutotune* r = *rt;
-
- r->hopSize = hs;
- tPeriodDetection_setHopSize(&r->pd, r->hopSize);
-}
-
-void tAutotune_setWindowSize(tAutotune* const rt, int ws)
-{
- _tAutotune* r = *rt;
-
- r->windowSize = ws;
- tPeriodDetection_setWindowSize(&r->pd, r->windowSize);
-}
-
-void tAutotune_setFidelityThreshold(tAutotune* const rt, float threshold)
-{
- _tAutotune* r = *rt;
-
- tPeriodDetection_setFidelityThreshold(&r->pd, threshold);
-}
-
-float tAutotune_getInputPeriod(tAutotune* const rt)
-{
- _tAutotune* r = *rt;
-
- return r->inputPeriod;
-}
-
-float tAutotune_getInputFreq(tAutotune* const rt)
-{
- _tAutotune* r = *rt;
-
- return 1.0f/r->inputPeriod;
-}
-
-//============================================================================================================
-// FORMANTSHIFTER
-//============================================================================================================
-// algorithm from Tom Baran's autotalent code.
-
-void tFormantShifter_init(tFormantShifter* const fsr, int order)
-{
- _tFormantShifter* fs = *fsr = (_tFormantShifter*) leaf_alloc(sizeof(_tFormantShifter));
-
- fs->ford = order;
- fs->fk = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->fb = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->fc = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->frb = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->frc = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->fsig = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->fsmooth = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->ftvec = (float*) leaf_calloc(sizeof(float) * fs->ford);
- fs->fbuff = (float*) leaf_calloc(sizeof(float*) * fs->ford);
-
- fs->falph = powf(0.001f, 40.0f * leaf.invSampleRate);
- fs->flamb = -(0.8517f*sqrtf(atanf(0.06583f*leaf.sampleRate))-0.1916f);
- fs->fhp = 0.0f;
- fs->flp = 0.0f;
- fs->flpa = powf(0.001f, 10.0f * leaf.invSampleRate);
- fs->fmute = 1.0f;
- fs->fmutealph = powf(0.001f, 0.5f * leaf.invSampleRate);
- fs->cbi = 0;
- fs->intensity = 1.0f;
- fs->invIntensity = 1.0f;
- tHighpass_init(&fs->hp, 10.0f);
- tHighpass_init(&fs->hp2, 10.0f);
- tFeedbackLeveler_init(&fs->fbl1, 0.99f, 0.005f, 0.125f, 0);
- tFeedbackLeveler_init(&fs->fbl2, 0.99f, 0.005f, 0.125f, 0);
-}
-
-void tFormantShifter_free(tFormantShifter* const fsr)
-{
- _tFormantShifter* fs = *fsr;
-
- leaf_free(fs->fk);
- leaf_free(fs->fb);
- leaf_free(fs->fc);
- leaf_free(fs->frb);
- leaf_free(fs->frc);
- leaf_free(fs->fsig);
- leaf_free(fs->fsmooth);
- leaf_free(fs->ftvec);
- leaf_free(fs->fbuff);
- tHighpass_free(&fs->hp);
- tHighpass_free(&fs->hp2);
- tFeedbackLeveler_free(&fs->fbl1);
- tFeedbackLeveler_free(&fs->fbl2);
- leaf_free(fs);
-}
-
-void tFormantShifter_initToPool (tFormantShifter* const fsr, int order, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFormantShifter* fs = *fsr = (_tFormantShifter*) mpool_alloc(sizeof(_tFormantShifter), &m->pool);
-
- fs->ford = order;
- fs->fk = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->fb = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->fc = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->frb = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->frc = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->fsig = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->fsmooth = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
- fs->ftvec = (float*) mpool_calloc(sizeof(float) * fs->ford, &m->pool);
-
- fs->fbuff = (float*) mpool_calloc(sizeof(float*) * fs->ford, &m->pool);
-
-
- fs->falph = powf(0.001f, 10.0f * leaf.invSampleRate);
- fs->flamb = -(0.8517f*sqrtf(atanf(0.06583f*leaf.sampleRate))-0.1916f);
- fs->fhp = 0.0f;
- fs->flp = 0.0f;
- fs->flpa = powf(0.001f, 10.0f * leaf.invSampleRate);
- fs->fmute = 1.0f;
- fs->fmutealph = powf(0.001f, 1.0f * leaf.invSampleRate);
- fs->cbi = 0;
- fs->intensity = 1.0f;
- fs->invIntensity = 1.0f;
- tHighpass_initToPool(&fs->hp, 20.0f, mp);
- tHighpass_initToPool(&fs->hp2, 20.0f, mp);
- tFeedbackLeveler_initToPool(&fs->fbl1, 0.8f, .005f, 0.125, 1, mp);
- tFeedbackLeveler_initToPool(&fs->fbl2, 0.8f, .005f, 0.125, 1, mp);
-}
-
-void tFormantShifter_freeFromPool (tFormantShifter* const fsr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFormantShifter* fs = *fsr;
-
- mpool_free(fs->fk, &m->pool);
- mpool_free(fs->fb, &m->pool);
- mpool_free(fs->fc, &m->pool);
- mpool_free(fs->frb, &m->pool);
- mpool_free(fs->frc, &m->pool);
- mpool_free(fs->fsig, &m->pool);
- mpool_free(fs->fsmooth, &m->pool);
- mpool_free(fs->ftvec, &m->pool);
- mpool_free(fs->fbuff, &m->pool);
- tHighpass_freeFromPool(&fs->hp, mp);
- tHighpass_freeFromPool(&fs->hp2, mp);
- tFeedbackLeveler_freeFromPool(&fs->fbl1, mp);
- tFeedbackLeveler_freeFromPool(&fs->fbl2, mp);
- mpool_free(fs, &m->pool);
-}
-
-float tFormantShifter_tick(tFormantShifter* const fsr, float in)
-{
- return tFormantShifter_add(fsr, tFormantShifter_remove(fsr, in));
-}
-
-float tFormantShifter_remove(tFormantShifter* const fsr, float in)
-{
- _tFormantShifter* fs = *fsr;
- in = tFeedbackLeveler_tick(&fs->fbl1, in);
- in = tHighpass_tick(&fs->hp, in * fs->intensity);
-
-
- float fa, fb, fc, foma, falph, ford, flamb, tf, fk;
-
- ford = fs->ford;
- falph = fs->falph;
- foma = (1.0f - falph);
- flamb = fs->flamb;
-
- tf = in;
-
- fa = tf - fs->fhp;
- fs->fhp = tf;
- fb = fa;
- for(int i = 0; i < ford; i++)
- {
- fs->fsig[i] = fa*fa*foma + fs->fsig[i]*falph;
- fc = (fb - fs->fc[i])*flamb + fs->fb[i];
- fs->fc[i] = fc;
- fs->fb[i] = fb;
- fk = fa*fc*foma + fs->fk[i]*falph;
- fs->fk[i] = fk;
- tf = fk/(fs->fsig[i] + 0.000001f);
- tf = tf*foma + fs->fsmooth[i]*falph;
- fs->fsmooth[i] = tf;
- fs->fbuff[i] = tf;
- fb = fc - tf*fa;
- fa = fa - tf*fc;
- }
-
- //return fa * 0.1f;
- return fa;
-}
-
-float tFormantShifter_add(tFormantShifter* const fsr, float in)
-{
- _tFormantShifter* fs = *fsr;
-
- float fa, fb, fc, ford, flpa, flamb, tf, tf2, f0resp, f1resp, frlamb;
- ford = fs->ford;
-
- flpa = fs->flpa;
- flamb = fs->flamb;
- tf = fs->shiftFactor * (1.0f+flamb)/(1.0f-flamb);
- frlamb = (tf-1.0f)/(tf+1.0f);
-
- tf2 = in;
- fa = 0.0f;
- fb = fa;
- for (int i=0; i<ford; i++)
- {
- fc = (fb-fs->frc[i])*frlamb + fs->frb[i];
- tf = fs->fbuff[i];
- fb = fc - tf*fa;
- fs->ftvec[i] = tf*fc;
- fa = fa - fs->ftvec[i];
- }
- tf = -fa;
- for (int i=ford-1; i>=0; i--)
- {
- tf = tf + fs->ftvec[i];
- }
- f0resp = tf;
-
- // second time: compute 1-response
- fa = 1.0f;
- fb = fa;
- for (int i=0; i<ford; i++)
- {
- fc = (fb-fs->frc[i])*frlamb + fs->frb[i];
- tf = fs->fbuff[i];
- fb = fc - tf*fa;
- fs->ftvec[i] = tf*fc;
- fa = fa - fs->ftvec[i];
- }
- tf = -fa;
- for (int i=ford-1; i>=0; i--)
- {
- tf = tf + fs->ftvec[i];
- }
- f1resp = tf;
-
- // now solve equations for output, based on 0-response and 1-response
- tf = 2.0f*tf2;
- tf2 = tf;
- tf = (1.0f - f1resp + f0resp);
- if (tf!=0.0f)
- {
- tf2 = (tf2 + f0resp) / tf;
- }
- else
- {
- tf2 = 0.0f;
- }
-
- // third time: update delay registers
- fa = tf2;
- fb = fa;
- for (int i=0; i<ford; i++)
- {
- fc = (fb-fs->frc[i])*frlamb + fs->frb[i];
- fs->frc[i] = fc;
- fs->frb[i] = fb;
- tf = fs->fbuff[i];
- fb = fc - tf*fa;
- fa = fa - tf*fc;
- }
- tf = tf2;
- tf = tf + flpa * fs->flp; // lowpass post-emphasis filter
- fs->flp = tf;
-
- // Bring up the gain slowly when formant correction goes from disabled
- // to enabled, while things stabilize.
- if (fs->fmute>0.5f)
- {
- tf = tf*(fs->fmute - 0.5f)*2.0f;
- }
- else
- {
- tf = 0.0f;
- }
- tf2 = fs->fmutealph;
- fs->fmute = (1.0f-tf2) + tf2*fs->fmute;
- // now tf is signal output
- // ...and we're done messing with formants
- //tf = tFeedbackLeveler_tick(&fs->fbl2, tf);
- tf = tHighpass_tick(&fs->hp2, tanhf(tf));
-
- return tf * fs->invIntensity;
-}
-
-// 1.0f is no change, 2.0f is an octave up, 0.5f is an octave down
-void tFormantShifter_setShiftFactor(tFormantShifter* const fsr, float shiftFactor)
-{
- _tFormantShifter* fs = *fsr;
- fs->shiftFactor = shiftFactor;
-}
-
-void tFormantShifter_setIntensity(tFormantShifter* const fsr, float intensity)
-{
- _tFormantShifter* fs = *fsr;
-
-
-
- fs->intensity = LEAF_clip(1.0f, intensity, 100.0f);
-
- // tFeedbackLeveler_setTargetLevel(&fs->fbl1, fs->intensity);
- //tFeedbackLeveler_setTargetLevel(&fs->fbl2, fs->intensity);
- //make sure you don't divide by zero, doofies
- if (fs->intensity != 0.0f)
- {
- fs->invIntensity = 1.0f/fs->intensity;
- }
- else
- {
- fs->invIntensity = 1.0f;
- }
-
-}
--- a/LEAF/Src/leaf-electrical.c
+++ /dev/null
@@ -1,551 +1,0 @@
-/*
- * leaf-electrical.c
- *
- * Created on: Sep 25, 2019
- * Author: jeffsnyder
- */
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-electrical.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-electrical.h"
-#include "../leaf.h"
-
-#endif
-
-//==============================================================================
-
-static float get_port_resistance_for_resistor(tWDF* const r);
-static float get_port_resistance_for_capacitor(tWDF* const r);
-static float get_port_resistance_for_inductor(tWDF* const r);
-static float get_port_resistance_for_resistive(tWDF* const r);
-static float get_port_resistance_for_inverter(tWDF* const r);
-static float get_port_resistance_for_series(tWDF* const r);
-static float get_port_resistance_for_parallel(tWDF* const r);
-static float get_port_resistance_for_root(tWDF* const r);
-
-static void set_incident_wave_for_leaf(tWDF* const r, float incident_wave, float input);
-static void set_incident_wave_for_leaf_inverted(tWDF* const r, float incident_wave, float input);
-static void set_incident_wave_for_inverter(tWDF* const r, float incident_wave, float input);
-static void set_incident_wave_for_series(tWDF* const r, float incident_wave, float input);
-static void set_incident_wave_for_parallel(tWDF* const r, float incident_wave, float input);
-
-static float get_reflected_wave_for_resistor(tWDF* const r, float input);
-static float get_reflected_wave_for_capacitor(tWDF* const r, float input);
-static float get_reflected_wave_for_resistive(tWDF* const r, float input);
-static float get_reflected_wave_for_inverter(tWDF* const r, float input);
-static float get_reflected_wave_for_series(tWDF* const r, float input);
-static float get_reflected_wave_for_parallel(tWDF* const r, float input);
-
-static float get_reflected_wave_for_ideal(tWDF* const n, float input, float incident_wave);
-static float get_reflected_wave_for_diode(tWDF* const n, float input, float incident_wave);
-static float get_reflected_wave_for_diode_pair(tWDF* const n, float input, float incident_wave);
-
-static void wdf_init(tWDF* const wdf, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR)
-{
- _tWDF* r = *wdf;
-
- r->type = type;
- r->child_left = rL;
- r->child_right = rR;
- r->incident_wave_up = 0.0f;
- r->incident_wave_left = 0.0f;
- r->incident_wave_right = 0.0f;
- r->reflected_wave_up = 0.0f;
- r->reflected_wave_left = 0.0f;
- r->reflected_wave_right = 0.0f;
- r->sample_rate = leaf.sampleRate;
- r->value = value;
-
- tWDF* child;
- if (r->child_left != NULL) child = r->child_left;
- else child = r->child_right;
-
- if (r->type == Resistor)
- {
- r->port_resistance_up = r->value;
- r->port_conductance_up = 1.0f / r->value;
-
- r->get_port_resistance = &get_port_resistance_for_resistor;
- r->get_reflected_wave_up = &get_reflected_wave_for_resistor;
- r->set_incident_wave = &set_incident_wave_for_leaf;
- }
- else if (r->type == Capacitor)
- {
- r->port_conductance_up = r->sample_rate * 2.0f * r->value;
- r->port_resistance_up = 1.0f / r->port_conductance_up; //based on trapezoidal discretization
-
- r->get_port_resistance = &get_port_resistance_for_capacitor;
- r->get_reflected_wave_up = &get_reflected_wave_for_capacitor;
- r->set_incident_wave = &set_incident_wave_for_leaf;
- }
- else if (r->type == Inductor)
- {
- r->port_resistance_up = r->sample_rate * 2.0f * r->value; //based on trapezoidal discretization
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_port_resistance = &get_port_resistance_for_inductor;
- r->get_reflected_wave_up = &get_reflected_wave_for_capacitor; // same as capacitor
- r->set_incident_wave = &set_incident_wave_for_leaf_inverted;
- }
- else if (r->type == ResistiveSource)
- {
- r->port_resistance_up = r->value;
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_port_resistance = &get_port_resistance_for_resistive;
- r->get_reflected_wave_up = &get_reflected_wave_for_resistive;
- r->set_incident_wave = &set_incident_wave_for_leaf;
- }
- else if (r->type == Inverter)
- {
- r->port_resistance_up = tWDF_getPortResistance(r->child_left);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_port_resistance = &get_port_resistance_for_inverter;
- r->get_reflected_wave_up = &get_reflected_wave_for_inverter;
- r->set_incident_wave = &set_incident_wave_for_inverter;
- }
- else if (r->type == SeriesAdaptor)
- {
- r->port_resistance_left = tWDF_getPortResistance(r->child_left);
- r->port_resistance_right = tWDF_getPortResistance(r->child_right);
- r->port_resistance_up = r->port_resistance_left + r->port_resistance_right;
- r->port_conductance_up = 1.0f / r->port_resistance_up;
- r->port_conductance_left = 1.0f / r->port_resistance_left;
- r->port_conductance_right = 1.0f / r->port_resistance_right;
- r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left);
-
- r->get_port_resistance = &get_port_resistance_for_series;
- r->get_reflected_wave_up = &get_reflected_wave_for_series;
- r->set_incident_wave = &set_incident_wave_for_series;
- }
- else if (r->type == ParallelAdaptor)
- {
- r->port_resistance_left = tWDF_getPortResistance(r->child_left);
- r->port_resistance_right = tWDF_getPortResistance(r->child_right);
- r->port_resistance_up = (r->port_resistance_left * r->port_resistance_right) / (r->port_resistance_left + r->port_resistance_right);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
- r->port_conductance_left = 1.0f / r->port_resistance_left;
- r->port_conductance_right = 1.0f / r->port_resistance_right;
- r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left);
-
- r->get_port_resistance = &get_port_resistance_for_parallel;
- r->get_reflected_wave_up = &get_reflected_wave_for_parallel;
- r->set_incident_wave = &set_incident_wave_for_parallel;
- }
- else if (r->type == IdealSource)
- {
- r->port_resistance_up = tWDF_getPortResistance(child);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_reflected_wave_down = &get_reflected_wave_for_ideal;
- r->get_port_resistance = &get_port_resistance_for_root;
- }
- else if (r->type == Diode)
- {
- r->port_resistance_up = tWDF_getPortResistance(child);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_reflected_wave_down = &get_reflected_wave_for_diode;
- r->get_port_resistance = &get_port_resistance_for_root;
- }
- else if (r->type == DiodePair)
- {
- r->port_resistance_up = tWDF_getPortResistance(child);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- r->get_reflected_wave_down = &get_reflected_wave_for_diode_pair;
- r->get_port_resistance = &get_port_resistance_for_root;
- }
-}
-//WDF
-void tWDF_init(tWDF* const wdf, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR)
-{
- *wdf = (_tWDF*) leaf_alloc(sizeof(_tWDF));
-
- wdf_init(wdf, type, value, rL, rR);
-}
-
-void tWDF_free(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- leaf_free(r);
-}
-
-void tWDF_initToPool (tWDF* const wdf, WDFComponentType type, float value, tWDF* const rL, tWDF* const rR, tMempool* const mp)
-{
- _tMempool* m = *mp;
- *wdf = (_tWDF*) mpool_alloc(sizeof(_tWDF), &m->pool);
-
- wdf_init(wdf, type, value, rL, rR);
-}
-
-void tWDF_freeFromPool (tWDF* const wdf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tWDF* r = *wdf;
-
- mpool_free(r, &m->pool);
-}
-
-float tWDF_tick(tWDF* const wdf, float sample, tWDF* const outputPoint, uint8_t paramsChanged)
-{
- _tWDF* r = *wdf;
-
- tWDF* child;
- if (r->child_left != NULL) child = r->child_left;
- else child = r->child_right;
-
- //step 0 : update port resistances if something changed
- if (paramsChanged) tWDF_getPortResistance(wdf);
-
- //step 1 : set inputs to what they should be
- float input = sample;
-
- //step 2 : scan the waves up the tree
- r->incident_wave_up = tWDF_getReflectedWaveUp(child, input);
-
- //step 3 : do root scattering computation
- r->reflected_wave_up = tWDF_getReflectedWaveDown(wdf, input, r->incident_wave_up);
-
- //step 4 : propogate waves down the tree
- tWDF_setIncidentWave(child, r->reflected_wave_up, input);
-
- //step 5 : grab whatever voltages or currents we want as outputs
- return tWDF_getVoltage(outputPoint);
-}
-
-void tWDF_setValue(tWDF* const wdf, float value)
-{
- _tWDF* r = *wdf;
- r->value = value;
-}
-
-void tWDF_setSampleRate(tWDF* const wdf, float sample_rate)
-{
- _tWDF* r = *wdf;
- r->sample_rate = sample_rate;
-}
-
-uint8_t tWDF_isLeaf(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
- if (r->child_left == NULL && r->child_right == NULL) return 1;
- return 0;
-}
-
-float tWDF_getPortResistance(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
- return r->get_port_resistance(wdf);
-}
-
-void tWDF_setIncidentWave(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
- r->set_incident_wave(wdf, incident_wave, input);
-}
-
-float tWDF_getReflectedWaveUp(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- return r->get_reflected_wave_up(wdf, input);
-}
-
-float tWDF_getReflectedWaveDown(tWDF* const wdf, float input, float incident_wave)
-{
- _tWDF* r = *wdf;
- return r->get_reflected_wave_down(wdf, input, incident_wave);
-}
-
-float tWDF_getVoltage(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
- return ((r->incident_wave_up * 0.5f) + (r->reflected_wave_up * 0.5f));
-}
-
-float tWDF_getCurrent(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
- return (((r->incident_wave_up * 0.5f) - (r->reflected_wave_up * 0.5f)) * r->port_conductance_up);
-}
-
-//============ Static Functions to be Pointed To ====================
-//===================================================================
-//============ Get and Calculate Port Resistances ===================
-
-static float get_port_resistance_for_resistor(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_up = r->value;
- r->port_conductance_up = 1.0f / r->value;
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_capacitor(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_conductance_up = r->sample_rate * 2.0f * r->value; //based on trapezoidal discretization
- r->port_resistance_up = (1.0f / r->port_conductance_up);
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_inductor(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_up = r->sample_rate * 2.0f * r->value; //based on trapezoidal discretization
- r->port_conductance_up = (1.0f / r->port_resistance_up);
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_resistive(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_up = r->value;
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_inverter(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_up = tWDF_getPortResistance(r->child_left);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_series(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_left = tWDF_getPortResistance(r->child_left);
- r->port_resistance_right = tWDF_getPortResistance(r->child_right);
- r->port_resistance_up = r->port_resistance_left + r->port_resistance_right;
- r->port_conductance_up = 1.0f / r->port_resistance_up;
- r->port_conductance_left = 1.0f / r->port_resistance_left;
- r->port_conductance_right = 1.0f / r->port_resistance_right;
- r->gamma_zero = 1.0f / (r->port_resistance_right + r->port_resistance_left);
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_parallel(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- r->port_resistance_left = tWDF_getPortResistance(r->child_left);
- r->port_resistance_right = tWDF_getPortResistance(r->child_right);
- r->port_resistance_up = (r->port_resistance_left * r->port_resistance_right) / (r->port_resistance_left + r->port_resistance_right);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
- r->port_conductance_left = 1.0f / r->port_resistance_left;
- r->port_conductance_right = 1.0f / r->port_resistance_right;
- r->gamma_zero = 1.0f / (r->port_conductance_right + r->port_conductance_left);
-
- return r->port_resistance_up;
-}
-
-static float get_port_resistance_for_root(tWDF* const wdf)
-{
- _tWDF* r = *wdf;
-
- tWDF* child;
- if (r->child_left != NULL) child = r->child_left;
- else child = r->child_right;
-
- r->port_resistance_up = tWDF_getPortResistance(child);
- r->port_conductance_up = 1.0f / r->port_resistance_up;
-
- return r->port_resistance_up;
-}
-
-//===================================================================
-//================ Set Incident Waves ===============================
-
-static void set_incident_wave_for_leaf(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
- r->incident_wave_up = incident_wave;
-}
-
-static void set_incident_wave_for_leaf_inverted(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
- r->incident_wave_up = -1.0f * incident_wave;
-}
-
-static void set_incident_wave_for_inverter(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
- r->incident_wave_up = incident_wave;
- tWDF_setIncidentWave(r->child_left, -1.0f * incident_wave, input);
-}
-
-static void set_incident_wave_for_series(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
-
- r->incident_wave_up = incident_wave;
- float gamma_left = r->port_resistance_left * r->gamma_zero;
- float gamma_right = r->port_resistance_right * r->gamma_zero;
- float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);
- float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);
-// downPorts[0]->b = yl * ( downPorts[0]->a * ((1.0 / yl) - 1) - downPorts[1]->a - descendingWave );
-// downPorts[1]->b = yr * ( downPorts[1]->a * ((1.0 / yr) - 1) - downPorts[0]->a - descendingWave );
- tWDF_setIncidentWave(r->child_left, (-1.0f * gamma_left * incident_wave) + (gamma_right * left_wave) - (gamma_left * right_wave), input);
- tWDF_setIncidentWave(r->child_right, (-1.0f * gamma_right * incident_wave) + (gamma_left * right_wave) - (gamma_right * left_wave), input);
- // From rt-wdf
-// tWDF_setIncidentWave(r->child_left, gamma_left * (left_wave * ((1.0f / gamma_left) - 1.0f) - right_wave - incident_wave));
-// tWDF_setIncidentWave(r->child_right, gamma_right * (right_wave * ((1.0f / gamma_right) - 1.0f) - left_wave - incident_wave));
-
-}
-
-static void set_incident_wave_for_parallel(tWDF* const wdf, float incident_wave, float input)
-{
- _tWDF* r = *wdf;
-
- r->incident_wave_up = incident_wave;
- float gamma_left = r->port_conductance_left * r->gamma_zero;
- float gamma_right = r->port_conductance_right * r->gamma_zero;
- float left_wave = tWDF_getReflectedWaveUp(r->child_left, input);
- float right_wave = tWDF_getReflectedWaveUp(r->child_right, input);
-// downPorts[0]->b = ( ( dl - 1 ) * downPorts[0]->a + dr * downPorts[1]->a + du * descendingWave );
-// downPorts[1]->b = ( dl * downPorts[0]->a + ( dr - 1 ) * downPorts[1]->a + du * descendingWave );
- tWDF_setIncidentWave(r->child_left, (gamma_left - 1.0f) * left_wave + gamma_right * right_wave + incident_wave, input);
- tWDF_setIncidentWave(r->child_right, gamma_left * left_wave + (gamma_right - 1.0f) * right_wave + incident_wave, input);
-}
-
-//===================================================================
-//================ Get Reflected Waves ==============================
-
-static float get_reflected_wave_for_resistor(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- r->reflected_wave_up = 0.0f;
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_capacitor(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- r->reflected_wave_up = r->incident_wave_up;
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_resistive(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- r->reflected_wave_up = input;
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_inverter(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- r->reflected_wave_up = -1.0f * tWDF_getReflectedWaveUp(r->child_left, input);
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_series(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
- //-( downPorts[0]->a + downPorts[1]->a );
- r->reflected_wave_up = (-1.0f * (tWDF_getReflectedWaveUp(r->child_left, input) + tWDF_getReflectedWaveUp(r->child_right, input)));
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_parallel(tWDF* const wdf, float input)
-{
- _tWDF* r = *wdf;
-
- float gamma_left = r->port_conductance_left * r->gamma_zero;
- float gamma_right = r->port_conductance_right * r->gamma_zero;
- //return ( dl * downPorts[0]->a + dr * downPorts[1]->a );
- r->reflected_wave_up = (gamma_left * tWDF_getReflectedWaveUp(r->child_left, input) + gamma_right * tWDF_getReflectedWaveUp(r->child_right, input));
- return r->reflected_wave_up;
-}
-
-static float get_reflected_wave_for_ideal(tWDF* const wdf, float input, float incident_wave)
-{
- return (2.0f * input) - incident_wave;
-}
-
-#define l2A 0.1640425613334452f
-#define l2B -1.098865286222744f
-#define l2Y 3.148297929334117f
-#define l2K -2.213475204444817f
-static float log2Approximation(float x)
-{
- return (l2A * x*x*x) + (l2B * x*x) + (l2Y * x) + l2K;
-}
-
-#define wX1 -3.684303659906469f
-#define wX2 1.972967391708859f
-#define wA 9.451797158780131e-3f
-#define wB 0.1126446405111627f
-#define wY 0.4451353886588814f
-#define wK 0.5836596684310648f
-static float wrightOmega3(float x)
-{
- if (x <= wX1)
- {
- return 0;
- }
- else if (x < wX2)
- {
- return (wA * x*x*x) + (wB * x*x) + (wY * x) + wK;
- }
- else
- {
- return x - logf(x);
- }
-}
-
-static float wrightOmegaApproximation(float x)
-{
- float w3 = wrightOmega3(x);
- return w3 - ((w3 - expf(x - w3)) / (w3 + 1.0f));
-}
-
-static float lambertW(float a, float r, float I, float iVT)
-{
- return wrightOmegaApproximation(((a + r*I) * iVT) + log((r * I) * iVT));
-}
-
-#define Is_DIODE 2.52e-9f
-#define VT_DIODE 0.02585f
-static float get_reflected_wave_for_diode(tWDF* const wdf, float input, float incident_wave)
-{
- _tWDF* n = *wdf;
-
- float a = incident_wave;
- float r = n->port_resistance_up;
- return a + 2.0f*r*Is_DIODE - 2.0f*VT_DIODE*lambertW(a, r, Is_DIODE, 1.0f/VT_DIODE);
-}
-
-static float get_reflected_wave_for_diode_pair(tWDF* const wdf, float input, float incident_wave)
-{
- _tWDF* n = *wdf;
-
- float a = incident_wave;
- float sgn = 0.0f;
- if (a > 0.0f) sgn = 1.0f;
- else if (a < 0.0f) sgn = -1.0f;
- float r = n->port_resistance_up;
- return a + 2 * sgn * (r*Is_DIODE - VT_DIODE*lambertW(sgn*a, r, Is_DIODE, 1.0f/VT_DIODE));
-}
--- a/LEAF/Src/leaf-envelopes.c
+++ /dev/null
@@ -1,760 +1,0 @@
-/*
- ==============================================================================
-
- leaf-envelopes.c
- Created: 20 Jan 2017 12:02:17pm
- Author: Michael R Mulshine
-
- ==============================================================================
-*/
-
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-envelopes.h"
-#include "..\Inc\leaf-tables.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-envelopes.h"
-#include "../Inc/leaf-tables.h"
-#include "../leaf.h"
-
-#endif
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Envelope ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tEnvelope_init(tEnvelope* const envlp, float attack, float decay, oBool loop)
-{
- _tEnvelope* env = *envlp = (_tEnvelope*) leaf_alloc(sizeof(_tEnvelope));
-
- env->exp_buff = exp_decay;
- env->inc_buff = attack_decay_inc;
- env->buff_size = sizeof(exp_decay);
-
- env->loop = loop;
-
- if (attack > 8192.0f)
- attack = 8192.0f;
- if (attack < 0.0f)
- attack = 0.0f;
-
- if (decay > 8192.0f)
- decay = 8192.0f;
- if (decay < 0.0f)
- decay = 0.0f;
-
- int16_t attackIndex = ((int16_t)(attack * 8.0f))-1;
- int16_t decayIndex = ((int16_t)(decay * 8.0f))-1;
- int16_t rampIndex = ((int16_t)(2.0f * 8.0f))-1;
-
- if (attackIndex < 0)
- attackIndex = 0;
- if (decayIndex < 0)
- decayIndex = 0;
- if (rampIndex < 0)
- rampIndex = 0;
-
- env->inRamp = OFALSE;
- env->inAttack = OFALSE;
- env->inDecay = OFALSE;
-
- env->attackInc = env->inc_buff[attackIndex];
- env->decayInc = env->inc_buff[decayIndex];
- env->rampInc = env->inc_buff[rampIndex];
-}
-
-void tEnvelope_free(tEnvelope* const envlp)
-{
- _tEnvelope* env = *envlp;
- leaf_free(env);
-}
-
-void tEnvelope_initToPool (tEnvelope* const envlp, float attack, float decay, oBool loop, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelope* env = *envlp = (_tEnvelope*) mpool_alloc(sizeof(_tEnvelope), &m->pool);
-
- env->exp_buff = exp_decay;
- env->inc_buff = attack_decay_inc;
- env->buff_size = sizeof(exp_decay);
-
- env->loop = loop;
-
- if (attack > 8192.0f)
- attack = 8192.0f;
- if (attack < 0.0f)
- attack = 0.0f;
-
- if (decay > 8192.0f)
- decay = 8192.0f;
- if (decay < 0.0f)
- decay = 0.0f;
-
- int16_t attackIndex = ((int16_t)(attack * 8.0f))-1;
- int16_t decayIndex = ((int16_t)(decay * 8.0f))-1;
- int16_t rampIndex = ((int16_t)(2.0f * 8.0f))-1;
-
- if (attackIndex < 0)
- attackIndex = 0;
- if (decayIndex < 0)
- decayIndex = 0;
- if (rampIndex < 0)
- rampIndex = 0;
-
- env->inRamp = OFALSE;
- env->inAttack = OFALSE;
- env->inDecay = OFALSE;
-
- env->attackInc = env->inc_buff[attackIndex];
- env->decayInc = env->inc_buff[decayIndex];
- env->rampInc = env->inc_buff[rampIndex];
-}
-
-void tEnvelope_freeFromPool (tEnvelope* const envlp, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEnvelope* env = *envlp;
- mpool_free(env, &m->pool);
-}
-
-void tEnvelope_setAttack(tEnvelope* const envlp, float attack)
-{
- _tEnvelope* env = *envlp;
-
- int32_t attackIndex;
-
- if (attack < 0.0f) {
- attackIndex = 0.0f;
- } else if (attack < 8192.0f) {
- attackIndex = ((int32_t)(attack * 8.0f))-1;
- } else {
- attackIndex = ((int32_t)(8192.0f * 8.0f))-1;
- }
-
- env->attackInc = env->inc_buff[attackIndex];
-}
-
-void tEnvelope_setDecay(tEnvelope* const envlp, float decay)
-{
- _tEnvelope* env = *envlp;
-
- int32_t decayIndex;
-
- if (decay < 0.0f) {
- decayIndex = 0.0f;
- } else if (decay < 8192.0f) {
- decayIndex = ((int32_t)(decay * 8.0f)) - 1;
- } else {
- decayIndex = ((int32_t)(8192.0f * 8.0f)) - 1;
- }
-
- env->decayInc = env->inc_buff[decayIndex];
-}
-
-void tEnvelope_loop(tEnvelope* const envlp, oBool loop)
-{
- _tEnvelope* env = *envlp;
- env->loop = loop;
-}
-
-
-void tEnvelope_on(tEnvelope* const envlp, float velocity)
-{
- _tEnvelope* env = *envlp;
-
- if (env->inAttack || env->inDecay) // In case envelope retriggered while it is still happening.
- {
- env->rampPhase = 0;
- env->inRamp = OTRUE;
- env->rampPeak = env->next;
- }
- else // Normal start.
- {
- env->inAttack = OTRUE;
- }
-
-
- env->attackPhase = 0;
- env->decayPhase = 0;
- env->inDecay = OFALSE;
- env->gain = velocity;
-}
-
-float tEnvelope_tick(tEnvelope* const envlp)
-{
- _tEnvelope* env = *envlp;
-
- if (env->inRamp)
- {
- if (env->rampPhase > UINT16_MAX)
- {
- env->inRamp = OFALSE;
- env->inAttack = OTRUE;
- env->next = 0.0f;
- }
- else
- {
- env->next = env->rampPeak * env->exp_buff[(uint32_t)env->rampPhase];
- }
-
- env->rampPhase += env->rampInc;
- }
-
- if (env->inAttack)
- {
-
- // If attack done, time to turn around.
- if (env->attackPhase > UINT16_MAX)
- {
- env->inDecay = OTRUE;
- env->inAttack = OFALSE;
- env->next = env->gain * 1.0f;
- }
- else
- {
- // do interpolation !
- env->next = env->gain * env->exp_buff[UINT16_MAX - (uint32_t)env->attackPhase]; // inverted and backwards to get proper rising exponential shape/perception
- }
-
- // Increment envelope attack.
- env->attackPhase += env->attackInc;
-
- }
-
- if (env->inDecay)
- {
-
- // If decay done, finish.
- if (env->decayPhase >= UINT16_MAX)
- {
- env->inDecay = OFALSE;
-
- if (env->loop)
- {
- env->attackPhase = 0;
- env->decayPhase = 0;
- env->inAttack = OTRUE;
- }
- else
- {
- env->next = 0.0f;
- }
-
- } else {
-
- env->next = env->gain * (env->exp_buff[(uint32_t)env->decayPhase]); // do interpolation !
- }
-
- // Increment envelope decay;
- env->decayPhase += env->decayInc;
- }
-
- return env->next;
-}
-
-/* ADSR */
-void tADSR_init(tADSR* const adsrenv, float attack, float decay, float sustain, float release)
-{
- _tADSR* adsr = *adsrenv = (_tADSR*) leaf_alloc(sizeof(_tADSR));
-
- adsr->exp_buff = exp_decay;
- adsr->inc_buff = attack_decay_inc;
- adsr->buff_size = sizeof(exp_decay);
-
- if (attack > 8192.0f)
- attack = 8192.0f;
- if (attack < 0.0f)
- attack = 0.0f;
-
- if (decay > 8192.0f)
- decay = 8192.0f;
- if (decay < 0.0f)
- decay = 0.0f;
-
- if (sustain > 1.0f)
- sustain = 1.0f;
- if (sustain < 0.0f)
- sustain = 0.0f;
-
- if (release > 8192.0f)
- release = 8192.0f;
- if (release < 0.0f)
- release = 0.0f;
-
- int16_t attackIndex = ((int16_t)(attack * 8.0f))-1;
- int16_t decayIndex = ((int16_t)(decay * 8.0f))-1;
- int16_t releaseIndex = ((int16_t)(release * 8.0f))-1;
- int16_t rampIndex = ((int16_t)(2.0f * 8.0f))-1;
-
- if (attackIndex < 0)
- attackIndex = 0;
- if (decayIndex < 0)
- decayIndex = 0;
- if (releaseIndex < 0)
- releaseIndex = 0;
- if (rampIndex < 0)
- rampIndex = 0;
-
- adsr->inRamp = OFALSE;
- adsr->inAttack = OFALSE;
- adsr->inDecay = OFALSE;
- adsr->inSustain = OFALSE;
- adsr->inRelease = OFALSE;
-
- adsr->sustain = sustain;
-
- adsr->attackInc = adsr->inc_buff[attackIndex];
- adsr->decayInc = adsr->inc_buff[decayIndex];
- adsr->releaseInc = adsr->inc_buff[releaseIndex];
- adsr->rampInc = adsr->inc_buff[rampIndex];
-}
-
-void tADSR_free(tADSR* const adsrenv)
-{
- _tADSR* adsr = *adsrenv;
-
- leaf_free(adsr);
-}
-
-void tADSR_initToPool (tADSR* const adsrenv, float attack, float decay, float sustain, float release, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tADSR* adsr = *adsrenv = (_tADSR*) mpool_alloc(sizeof(_tADSR), &m->pool);
-
- adsr->exp_buff = exp_decay;
- adsr->inc_buff = attack_decay_inc;
- adsr->buff_size = sizeof(exp_decay);
-
- if (attack > 8192.0f)
- attack = 8192.0f;
- if (attack < 0.0f)
- attack = 0.0f;
-
- if (decay > 8192.0f)
- decay = 8192.0f;
- if (decay < 0.0f)
- decay = 0.0f;
-
- if (sustain > 1.0f)
- sustain = 1.0f;
- if (sustain < 0.0f)
- sustain = 0.0f;
-
- if (release > 8192.0f)
- release = 8192.0f;
- if (release < 0.0f)
- release = 0.0f;
-
- int16_t attackIndex = ((int16_t)(attack * 8.0f))-1;
- int16_t decayIndex = ((int16_t)(decay * 8.0f))-1;
- int16_t releaseIndex = ((int16_t)(release * 8.0f))-1;
- int16_t rampIndex = ((int16_t)(2.0f * 8.0f))-1;
-
- if (attackIndex < 0)
- attackIndex = 0;
- if (decayIndex < 0)
- decayIndex = 0;
- if (releaseIndex < 0)
- releaseIndex = 0;
- if (rampIndex < 0)
- rampIndex = 0;
-
- adsr->inRamp = OFALSE;
- adsr->inAttack = OFALSE;
- adsr->inDecay = OFALSE;
- adsr->inSustain = OFALSE;
- adsr->inRelease = OFALSE;
-
- adsr->sustain = sustain;
-
- adsr->attackInc = adsr->inc_buff[attackIndex];
- adsr->decayInc = adsr->inc_buff[decayIndex];
- adsr->releaseInc = adsr->inc_buff[releaseIndex];
- adsr->rampInc = adsr->inc_buff[rampIndex];
-}
-
-void tADSR_freeFromPool (tADSR* const adsrenv, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tADSR* adsr = *adsrenv;
-
- mpool_free(adsr, &m->pool);
-}
-
-void tADSR_setAttack(tADSR* const adsrenv, float attack)
-{
- _tADSR* adsr = *adsrenv;
-
- int32_t attackIndex;
-
- if (attack < 0.0f) {
- attackIndex = 0.0f;
- } else if (attack < 8192.0f) {
- attackIndex = ((int32_t)(attack * 8.0f))-1;
- } else {
- attackIndex = ((int32_t)(8192.0f * 8.0f))-1;
- }
-
- adsr->attackInc = adsr->inc_buff[attackIndex];
-}
-
-void tADSR_setDecay(tADSR* const adsrenv, float decay)
-{
- _tADSR* adsr = *adsrenv;
-
- int32_t decayIndex;
-
- if (decay < 0.0f) {
- decayIndex = 0.0f;
- } else if (decay < 8192.0f) {
- decayIndex = ((int32_t)(decay * 8.0f)) - 1;
- } else {
- decayIndex = ((int32_t)(8192.0f * 8.0f)) - 1;
- }
-
- adsr->decayInc = adsr->inc_buff[decayIndex];
-}
-
-void tADSR_setSustain(tADSR* const adsrenv, float sustain)
-{
- _tADSR* adsr = *adsrenv;
-
- if (sustain > 1.0f) adsr->sustain = 1.0f;
- else if (sustain < 0.0f) adsr->sustain = 0.0f;
- else adsr->sustain = sustain;
-}
-
-void tADSR_setRelease(tADSR* const adsrenv, float release)
-{
- _tADSR* adsr = *adsrenv;
-
- int32_t releaseIndex;
-
- if (release < 0.0f) {
- releaseIndex = 0.0f;
- } else if (release < 8192.0f) {
- releaseIndex = ((int32_t)(release * 8.0f)) - 1;
- } else {
- releaseIndex = ((int32_t)(8192.0f * 8.0f)) - 1;
- }
-
- adsr->releaseInc = adsr->inc_buff[releaseIndex];
-}
-
-void tADSR_on(tADSR* const adsrenv, float velocity)
-{
- _tADSR* adsr = *adsrenv;
-
- if ((adsr->inAttack || adsr->inDecay) || (adsr->inSustain || adsr->inRelease)) // In case ADSR retriggered while it is still happening.
- {
- adsr->rampPhase = 0;
- adsr->inRamp = OTRUE;
- adsr->rampPeak = adsr->next;
- }
- else // Normal start.
- {
- adsr->inAttack = OTRUE;
- }
-
- adsr->attackPhase = 0;
- adsr->decayPhase = 0;
- adsr->releasePhase = 0;
- adsr->inDecay = OFALSE;
- adsr->inSustain = OFALSE;
- adsr->inRelease = OFALSE;
- adsr->gain = velocity;
-}
-
-void tADSR_off(tADSR* const adsrenv)
-{
- _tADSR* adsr = *adsrenv;
-
- if (adsr->inRelease) return;
-
- adsr->inAttack = OFALSE;
- adsr->inDecay = OFALSE;
- adsr->inSustain = OFALSE;
- adsr->inRelease = OTRUE;
-
- adsr->releasePeak = adsr->next;
-}
-
-float tADSR_tick(tADSR* const adsrenv)
-{
- _tADSR* adsr = *adsrenv;
-
- if (adsr->inRamp)
- {
- if (adsr->rampPhase > UINT16_MAX)
- {
- adsr->inRamp = OFALSE;
- adsr->inAttack = OTRUE;
- adsr->next = 0.0f;
- }
- else
- {
- adsr->next = adsr->rampPeak * adsr->exp_buff[(uint32_t)adsr->rampPhase];
- }
-
- adsr->rampPhase += adsr->rampInc;
- }
-
- if (adsr->inAttack)
- {
-
- // If attack done, time to turn around.
- if (adsr->attackPhase > UINT16_MAX)
- {
- adsr->inDecay = OTRUE;
- adsr->inAttack = OFALSE;
- adsr->next = adsr->gain * 1.0f;
- }
- else
- {
- // do interpolation !
- adsr->next = adsr->gain * adsr->exp_buff[UINT16_MAX - (uint32_t)adsr->attackPhase]; // inverted and backwards to get proper rising exponential shape/perception
- }
-
- // Increment ADSR attack.
- adsr->attackPhase += adsr->attackInc;
-
- }
-
- if (adsr->inDecay)
- {
-
- // If decay done, sustain.
- if (adsr->decayPhase >= UINT16_MAX)
- {
- adsr->inDecay = OFALSE;
- adsr->inSustain = OTRUE;
- adsr->next = adsr->gain * adsr->sustain;
- }
-
- else
- {
- adsr->next = adsr->gain * (adsr->sustain + ((adsr->exp_buff[(uint32_t)adsr->decayPhase]) * (1 - adsr->sustain))); // do interpolation !
- }
-
- // Increment ADSR decay.
- adsr->decayPhase += adsr->decayInc;
- }
-
- if (adsr->inRelease)
- {
- // If release done, finish.
- if (adsr->releasePhase >= UINT16_MAX)
- {
- adsr->inRelease = OFALSE;
- adsr->next = 0.0f;
- }
- else {
-
- adsr->next = adsr->releasePeak * (adsr->exp_buff[(uint32_t)adsr->releasePhase]); // do interpolation !
- }
-
- // Increment envelope release;
- adsr->releasePhase += adsr->releaseInc;
- }
-
- return adsr->next;
-}
-
-/* Ramp */
-void tRamp_init(tRamp* const r, float time, int samples_per_tick)
-{
- _tRamp* ramp = *r = (_tRamp*) leaf_alloc(sizeof(_tRamp));
-
- ramp->inv_sr_ms = 1.0f/(leaf.sampleRate*0.001f);
- ramp->minimum_time = ramp->inv_sr_ms * samples_per_tick;
- ramp->curr = 0.0f;
- ramp->dest = 0.0f;
-
- if (time < ramp->minimum_time)
- {
- ramp->time = ramp->minimum_time;
- }
- else
- {
- ramp->time = time;
- }
-
- ramp->samples_per_tick = samples_per_tick;
- ramp->inc = ((ramp->dest - ramp->curr) / ramp->time * ramp->inv_sr_ms) * (float)ramp->samples_per_tick;
-}
-
-void tRamp_free(tRamp* const r)
-{
- _tRamp* ramp = *r;
-
- leaf_free(ramp);
-}
-
-void tRamp_initToPool (tRamp* const r, float time, int samples_per_tick, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tRamp* ramp = *r = (_tRamp*) mpool_alloc(sizeof(_tRamp), &m->pool);
-
- ramp->inv_sr_ms = 1.0f/(leaf.sampleRate*0.001f);
- ramp->minimum_time = ramp->inv_sr_ms * samples_per_tick;
- ramp->curr = 0.0f;
- ramp->dest = 0.0f;
-
- if (time < ramp->minimum_time)
- {
- ramp->time = ramp->minimum_time;
- }
- else
- {
- ramp->time = time;
- }
-
- ramp->samples_per_tick = samples_per_tick;
- ramp->inc = ((ramp->dest - ramp->curr) / ramp->time * ramp->inv_sr_ms) * (float)ramp->samples_per_tick;
-}
-
-void tRamp_freeFromPool (tRamp* const r, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tRamp* ramp = *r;
-
- mpool_free(ramp, &m->pool);
-}
-
-void tRamp_setTime(tRamp* const ramp, float time)
-{
- _tRamp* r = *ramp;
-
- if (time < r->minimum_time)
- {
- r->time = r->minimum_time;
- }
- else
- {
- r->time = time;
- }
- r->inc = ((r->dest-r->curr)/r->time * r->inv_sr_ms) * ((float)r->samples_per_tick);
-}
-
-void tRamp_setDest(tRamp* const ramp, float dest)
-{
- _tRamp* r = *ramp;
- r->dest = dest;
- r->inc = ((r->dest-r->curr)/r->time * r->inv_sr_ms) * ((float)r->samples_per_tick);
-}
-
-void tRamp_setVal(tRamp* const ramp, float val)
-{
- _tRamp* r = *ramp;
- r->curr = val;
- r->inc = ((r->dest-r->curr)/r->time * r->inv_sr_ms) * ((float)r->samples_per_tick);
-}
-
-float tRamp_tick(tRamp* const ramp)
-{
- _tRamp* r = *ramp;
-
- r->curr += r->inc;
-
- if (((r->curr >= r->dest) && (r->inc >= 0.0f)) || ((r->curr <= r->dest) && (r->inc < 0.0f)))
- {
- r->inc = 0.0f;
- r->curr=r->dest;
- }
-
- return r->curr;
-}
-
-float tRamp_sample(tRamp* const ramp)
-{
- _tRamp* r = *ramp;
- return r->curr;
-}
-
-void tRampSampleRateChanged(tRamp* const ramp)
-{
- _tRamp* r = *ramp;
- r->inv_sr_ms = 1.0f / (leaf.sampleRate * 0.001f);
- r->inc = ((r->dest-r->curr)/r->time * r->inv_sr_ms)*((float)r->samples_per_tick);
-}
-
-
-/* Exponential Smoother */
-void tExpSmooth_init(tExpSmooth* const expsmooth, float val, float factor)
-{ // factor is usually a value between 0 and 0.1. Lower value is slower. 0.01 for example gives you a smoothing time of about 10ms
- _tExpSmooth* smooth = *expsmooth = (_tExpSmooth*) leaf_alloc(sizeof(_tExpSmooth));
-
- smooth->curr=val;
- smooth->dest=val;
- if (factor<0) factor=0;
- if (factor>1) factor=1;
- smooth->factor=factor;
- smooth->oneminusfactor=1.0f-factor;
-}
-
-void tExpSmooth_free(tExpSmooth* const expsmooth)
-{
- _tExpSmooth* smooth = *expsmooth;
-
- leaf_free(smooth);
-}
-
-void tExpSmooth_initToPool (tExpSmooth* const expsmooth, float val, float factor, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tExpSmooth* smooth = *expsmooth = (_tExpSmooth*) mpool_alloc(sizeof(_tExpSmooth), &m->pool);
-
- smooth->curr=val;
- smooth->dest=val;
- if (factor<0) factor=0;
- if (factor>1) factor=1;
- smooth->factor=factor;
- smooth->oneminusfactor=1.0f-factor;
-}
-
-void tExpSmooth_freeFromPool (tExpSmooth* const expsmooth, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tExpSmooth* smooth = *expsmooth;
-
- mpool_free(smooth, &m->pool);
-}
-
-void tExpSmooth_setFactor(tExpSmooth* const expsmooth, float factor)
-{ // factor is usually a value between 0 and 0.1. Lower value is slower. 0.01 for example gives you a smoothing time of about 10ms
- _tExpSmooth* smooth = *expsmooth;
-
- if (factor<0)
- factor=0;
- else
- if (factor>1) factor=1;
- smooth->factor=factor;
- smooth->oneminusfactor=1.0f-factor;
-}
-
-void tExpSmooth_setDest(tExpSmooth* const expsmooth, float dest)
-{
- _tExpSmooth* smooth = *expsmooth;
- smooth->dest=dest;
-}
-
-void tExpSmooth_setVal(tExpSmooth* const expsmooth, float val)
-{
- _tExpSmooth* smooth = *expsmooth;
- smooth->curr=val;
-}
-
-float tExpSmooth_tick(tExpSmooth* const expsmooth)
-{
- _tExpSmooth* smooth = *expsmooth;
- smooth->curr = smooth->factor*smooth->dest+smooth->oneminusfactor*smooth->curr;
- return smooth->curr;
-}
-
-float tExpSmooth_sample(tExpSmooth* const expsmooth)
-{
- _tExpSmooth* smooth = *expsmooth;
- return smooth->curr;
-}
-
--- a/LEAF/Src/leaf-filters.c
+++ /dev/null
@@ -1,1243 +1,0 @@
-/*==============================================================================
-
- leaf-filter.c
- Created: 20 Jan 2017 12:01:10pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-filters.h"
-#include "..\Inc\leaf-tables.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-filters.h"
-#include "../Inc/leaf-tables.h"
-#include "../leaf.h"
-
-#endif
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ OnePole Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tAllpass_init(tAllpass* const ft, float initDelay, uint32_t maxDelay)
-{
- _tAllpass* f = *ft = (_tAllpass*) leaf_alloc(sizeof(_tAllpass));
-
- f->gain = 0.7f;
-
- f->lastOut = 0.0f;
-
- tLinearDelay_init(&f->delay, initDelay, maxDelay);
-}
-
-void tAllpass_free(tAllpass* const ft)
-{
- _tAllpass* f = *ft;
-
- tLinearDelay_free(&f->delay);
- leaf_free(f);
-}
-
-void tAllpass_initToPool (tAllpass* const ft, float initDelay, uint32_t maxDelay, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAllpass* f = *ft = (_tAllpass*) mpool_alloc(sizeof(_tAllpass), &m->pool);
-
- f->gain = 0.7f;
-
- f->lastOut = 0.0f;
-
- tLinearDelay_initToPool(&f->delay, initDelay, maxDelay, mp);
-}
-
-void tAllpass_freeFromPool (tAllpass* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAllpass* f = *ft;
-
- tLinearDelay_freeFromPool(&f->delay, mp);
- mpool_free(f, &m->pool);
-}
-
-void tAllpass_setDelay(tAllpass* const ft, float delay)
-{
- _tAllpass* f = *ft;
-
- tLinearDelay_setDelay(&f->delay, delay);
-}
-
-void tAllpass_setGain(tAllpass* const ft, float gain)
-{
- _tAllpass* f = *ft;
-
- f->gain = gain;
-}
-
-float tAllpass_tick(tAllpass* const ft, float input)
-{
- _tAllpass* f = *ft;
-
- float s1 = (-f->gain) * f->lastOut + input;
-
- float s2 = tLinearDelay_tick(&f->delay, s1) + (f->gain) * input;
-
- f->lastOut = s2;
-
- return f->lastOut;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ OnePole Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tOnePole_init(tOnePole* const ft, float freq)
-{
- _tOnePole* f = *ft = (_tOnePole*) leaf_alloc(sizeof(_tOnePole));
-
- f->gain = 1.0f;
- f->a0 = 1.0;
-
- tOnePole_setFreq(ft, freq);
-
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
-}
-
-void tOnePole_free(tOnePole* const ft)
-{
- _tOnePole* f = *ft;
-
- leaf_free(f);
-}
-
-void tOnePole_initToPool (tOnePole* const ft, float freq, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOnePole* f = *ft = (_tOnePole*) mpool_alloc(sizeof(_tOnePole), &m->pool);
-
- f->gain = 1.0f;
- f->a0 = 1.0;
-
- tOnePole_setFreq(ft, freq);
-
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
-}
-
-void tOnePole_freeFromPool (tOnePole* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOnePole* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-void tOnePole_setB0(tOnePole* const ft, float b0)
-{
- _tOnePole* f = *ft;
- f->b0 = b0;
-}
-
-void tOnePole_setA1(tOnePole* const ft, float a1)
-{
- _tOnePole* f = *ft;
- if (a1 >= 1.0f) a1 = 0.999999f;
- f->a1 = a1;
-}
-
-void tOnePole_setPole(tOnePole* const ft, float thePole)
-{
- _tOnePole* f = *ft;
-
- if (thePole >= 1.0f) thePole = 0.999999f;
-
- // Normalize coefficients for peak unity gain.
- if (thePole > 0.0f) f->b0 = (1.0f - thePole);
- else f->b0 = (1.0f + thePole);
-
- f->a1 = -thePole;
-}
-
-void tOnePole_setFreq (tOnePole* const ft, float freq)
-{
- _tOnePole* f = *ft;
- f->b0 = freq * leaf.twoPiTimesInvSampleRate;
- f->b0 = LEAF_clip(0.0f, f->b0, 1.0f);
- f->a1 = 1.0f - f->b0;
-}
-
-void tOnePole_setCoefficients(tOnePole* const ft, float b0, float a1)
-{
- _tOnePole* f = *ft;
- if (a1 >= 1.0f) a1 = 0.999999f;
- f->b0 = b0;
- f->a1 = a1;
-}
-
-void tOnePole_setGain(tOnePole* const ft, float gain)
-{
- _tOnePole* f = *ft;
- f->gain = gain;
-}
-
-float tOnePole_tick(tOnePole* const ft, float input)
-{
- _tOnePole* f = *ft;
-
- float in = input * f->gain;
- float out = (f->b0 * in) + (f->a1 * f->lastOut);
-
- f->lastIn = in;
- f->lastOut = out;
-
- return out;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ TwoPole Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tTwoPole_init(tTwoPole* const ft)
-{
- _tTwoPole* f = *ft = (_tTwoPole*) leaf_alloc(sizeof(_tTwoPole));
-
- f->gain = 1.0f;
- f->a0 = 1.0;
- f->b0 = 1.0;
-
- f->lastOut[0] = 0.0f;
- f->lastOut[1] = 0.0f;
-}
-
-void tTwoPole_free(tTwoPole* const ft)
-{
- _tTwoPole* f = *ft;
-
- leaf_free(f);
-}
-
-void tTwoPole_initToPool (tTwoPole* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTwoPole* f = *ft = (_tTwoPole*) mpool_alloc(sizeof(_tTwoPole), &m->pool);
-
- f->gain = 1.0f;
- f->a0 = 1.0;
- f->b0 = 1.0;
-
- f->lastOut[0] = 0.0f;
- f->lastOut[1] = 0.0f;
-}
-
-void tTwoPole_freeFromPool (tTwoPole* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTwoPole* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-float tTwoPole_tick(tTwoPole* const ft, float input)
-{
- _tTwoPole* f = *ft;
-
- float in = input * f->gain;
- float out = (f->b0 * in) - (f->a1 * f->lastOut[0]) - (f->a2 * f->lastOut[1]);
-
- f->lastOut[1] = f->lastOut[0];
- f->lastOut[0] = out;
-
- return out;
-}
-
-void tTwoPole_setB0(tTwoPole* const ft, float b0)
-{
- _tTwoPole* f = *ft;
- f->b0 = b0;
-}
-
-void tTwoPole_setA1(tTwoPole* const ft, float a1)
-{
- _tTwoPole* f = *ft;
- f->a1 = a1;
-}
-
-void tTwoPole_setA2(tTwoPole* const ft, float a2)
-{
- _tTwoPole* f = *ft;
- f->a2 = a2;
-}
-
-
-void tTwoPole_setResonance(tTwoPole* const ft, float frequency, float radius, oBool normalize)
-{
- _tTwoPole* f = *ft;
-
- if (frequency < 0.0f) frequency = 0.0f;
- if (frequency > (leaf.sampleRate * 0.49f)) frequency = leaf.sampleRate * 0.49f;
- if (radius < 0.0f) radius = 0.0f;
- if (radius >= 1.0f) radius = 0.999999f;
-
- f->radius = radius;
- f->frequency = frequency;
- f->normalize = normalize;
-
- f->a2 = radius * radius;
- f->a1 = -2.0f * radius * cosf(frequency * leaf.twoPiTimesInvSampleRate);
-
- if ( normalize )
- {
- // Normalize the filter gain ... not terribly efficient.
- float real = 1 - radius + (f->a2 - radius) * cosf(2 * frequency * leaf.twoPiTimesInvSampleRate);
- float imag = (f->a2 - radius) * sinf(2 * frequency * leaf.twoPiTimesInvSampleRate);
- f->b0 = sqrtf( powf(real, 2) + powf(imag, 2) );
- }
-}
-
-void tTwoPole_setCoefficients(tTwoPole* const ft, float b0, float a1, float a2)
-{
- _tTwoPole* f = *ft;
- f->b0 = b0;
- f->a1 = a1;
- f->a2 = a2;
-}
-
-void tTwoPole_setGain(tTwoPole* const ft, float gain)
-{
- _tTwoPole* f = *ft;
- f->gain = gain;
-}
-
-void tTwoPoleSampleRateChanged (tTwoPole* const ft)
-{
- _tTwoPole* f = *ft;
-
- f->a2 = f->radius * f->radius;
- f->a1 = -2.0f * f->radius * cosf(f->frequency * leaf.twoPiTimesInvSampleRate);
-
- if ( f->normalize )
- {
- // Normalize the filter gain ... not terribly efficient.
- float real = 1 - f->radius + (f->a2 - f->radius) * cosf(2 * f->frequency * leaf.twoPiTimesInvSampleRate);
- float imag = (f->a2 - f->radius) * sinf(2 * f->frequency * leaf.twoPiTimesInvSampleRate);
- f->b0 = sqrtf( powf(real, 2) + powf(imag, 2) );
- }
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ OneZero Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tOneZero_init(tOneZero* const ft, float theZero)
-{
- _tOneZero* f = *ft = (_tOneZero*) leaf_alloc(sizeof(_tOneZero));
-
- f->gain = 1.0f;
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
- tOneZero_setZero(ft, theZero);
-}
-
-void tOneZero_free(tOneZero* const ft)
-{
- _tOneZero* f = *ft;
-
- leaf_free(f);
-}
-
-void tOneZero_initToPool (tOneZero* const ft, float theZero, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOneZero* f = *ft = (_tOneZero*) mpool_alloc(sizeof(_tOneZero), &m->pool);
-
- f->gain = 1.0f;
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
- tOneZero_setZero(ft, theZero);
-}
-
-void tOneZero_freeFromPool (tOneZero* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tOneZero* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-float tOneZero_tick(tOneZero* const ft, float input)
-{
- _tOneZero* f = *ft;
-
- float in = input * f->gain;
- float out = f->b1 * f->lastIn + f->b0 * in;
-
- f->lastIn = in;
-
- return out;
-}
-
-void tOneZero_setZero(tOneZero* const ft, float theZero)
-{
- _tOneZero* f = *ft;
-
- if (theZero > 0.0f) f->b0 = 1.0f / (1.0f + theZero);
- else f->b0 = 1.0f / (1.0f - theZero);
-
- f->b1 = -theZero * f->b0;
-
-}
-
-void tOneZero_setB0(tOneZero* const ft, float b0)
-{
- _tOneZero* f = *ft;
-
- f->b0 = b0;
-}
-
-void tOneZero_setB1(tOneZero* const ft, float b1)
-{
- _tOneZero* f = *ft;
- f->b1 = b1;
-}
-
-void tOneZero_setCoefficients(tOneZero* const ft, float b0, float b1)
-{
- _tOneZero* f = *ft;
- f->b0 = b0;
- f->b1 = b1;
-}
-
-void tOneZero_setGain(tOneZero *ft, float gain)
-{
- _tOneZero* f = *ft;
- f->gain = gain;
-}
-
-float tOneZero_getPhaseDelay(tOneZero* const ft, float frequency )
-{
- _tOneZero* f = *ft;
-
- if ( frequency <= 0.0f) frequency = 0.05f;
-
- f->frequency = frequency;
-
- float omegaT = 2 * PI * frequency * leaf.invSampleRate;
- float real = 0.0, imag = 0.0;
-
- real += f->b0;
-
- real += f->b1 * cosf(omegaT);
- imag -= f->b1 * sinf(omegaT);
-
- real *= f->gain;
- imag *= f->gain;
-
- float phase = atan2f( imag, real );
-
- real = 0.0; imag = 0.0;
-
- phase -= atan2f( imag, real );
-
- phase = fmodf( -phase, 2 * PI );
-
- return phase / omegaT;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ TwoZero Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tTwoZero_init(tTwoZero* const ft)
-{
- _tTwoZero* f = *ft = (_tTwoZero*) leaf_alloc(sizeof(_tTwoZero));
-
- f->gain = 1.0f;
- f->lastIn[0] = 0.0f;
- f->lastIn[1] = 0.0f;
-}
-
-void tTwoZero_free(tTwoZero* const ft)
-{
- _tTwoZero* f = *ft;
-
- leaf_free(f);
-}
-
-void tTwoZero_initToPool (tTwoZero* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTwoZero* f = *ft = (_tTwoZero*) mpool_alloc(sizeof(_tTwoZero), &m->pool);
-
- f->gain = 1.0f;
- f->lastIn[0] = 0.0f;
- f->lastIn[1] = 0.0f;
-}
-
-void tTwoZero_freeFromPool (tTwoZero* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTwoZero* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-float tTwoZero_tick(tTwoZero* const ft, float input)
-{
- _tTwoZero* f = *ft;
-
- float in = input * f->gain;
- float out = f->b2 * f->lastIn[1] + f->b1 * f->lastIn[0] + f->b0 * in;
-
- f->lastIn[1] = f->lastIn[0];
- f->lastIn[0] = in;
-
- return out;
-}
-
-void tTwoZero_setNotch(tTwoZero* const ft, float freq, float radius)
-{
- _tTwoZero* f = *ft;
-
- // Should also deal with frequency being > half sample rate / nyquist. See STK
- if (freq < 0.0f) freq = 0.0f;
- if (radius < 0.0f) radius = 0.0f;
-
- f->frequency = freq;
- f->radius = radius;
-
- f->b2 = radius * radius;
- f->b1 = -2.0f * radius * cosf(freq * leaf.twoPiTimesInvSampleRate); // OPTIMIZE with LOOKUP or APPROXIMATION
-
- // Normalize the filter gain. From STK.
- if ( f->b1 > 0.0f ) // Maximum at z = 0.
- f->b0 = 1.0f / ( 1.0f + f->b1 + f->b2 );
- else // Maximum at z = -1.
- f->b0 = 1.0f / ( 1.0f - f->b1 + f->b2 );
- f->b1 *= f->b0;
- f->b2 *= f->b0;
-
-}
-
-void tTwoZero_setB0(tTwoZero* const ft, float b0)
-{
- _tTwoZero* f = *ft;
- f->b0 = b0;
-}
-
-void tTwoZero_setB1(tTwoZero* const ft, float b1)
-{
- _tTwoZero* f = *ft;
- f->b1 = b1;
-}
-
-void tTwoZero_setCoefficients(tTwoZero* const ft, float b0, float b1, float b2)
-{
- _tTwoZero* f = *ft;
- f->b0 = b0;
- f->b1 = b1;
- f->b2 = b2;
-}
-
-void tTwoZero_setGain(tTwoZero* const ft, float gain)
-{
- _tTwoZero* f = *ft;
- f->gain = gain;
-}
-
-void tTwoZeroSampleRateChanged(tTwoZero* const ft)
-{
- _tTwoZero* f = *ft;
-
- tTwoZero_setNotch(ft, f->frequency, f->radius);
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ PoleZero Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tPoleZero_init(tPoleZero* const pzf)
-{
- _tPoleZero* f = *pzf = (_tPoleZero*) leaf_alloc(sizeof(_tPoleZero));
-
- f->gain = 1.0f;
- f->b0 = 1.0;
- f->a0 = 1.0;
-
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
-}
-
-void tPoleZero_free(tPoleZero* const pzf)
-{
- _tPoleZero* f = *pzf;
-
- leaf_free(f);
-}
-
-void tPoleZero_initToPool (tPoleZero* const pzf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPoleZero* f = *pzf = (_tPoleZero*) mpool_alloc(sizeof(_tPoleZero), &m->pool);
-
- f->gain = 1.0f;
- f->b0 = 1.0;
- f->a0 = 1.0;
-
- f->lastIn = 0.0f;
- f->lastOut = 0.0f;
-}
-
-void tPoleZero_freeFromPool (tPoleZero* const pzf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPoleZero* f = *pzf;
-
- mpool_free(f, &m->pool);
-}
-
-void tPoleZero_setB0(tPoleZero* const pzf, float b0)
-{
- _tPoleZero* f = *pzf;
- f->b0 = b0;
-}
-
-void tPoleZero_setB1(tPoleZero* const pzf, float b1)
-{
- _tPoleZero* f = *pzf;
- f->b1 = b1;
-}
-
-void tPoleZero_setA1(tPoleZero* const pzf, float a1)
-{
- _tPoleZero* f = *pzf;
-
- if (a1 >= 1.0f) // a1 should be less than 1.0
- {
- a1 = 0.999999f;
- }
-
- f->a1 = a1;
-}
-
-void tPoleZero_setCoefficients(tPoleZero* const pzf, float b0, float b1, float a1)
-{
- _tPoleZero* f = *pzf;
-
- if (a1 >= 1.0f) // a1 should be less than 1.0
- {
- a1 = 0.999999f;
- }
-
- f->b0 = b0;
- f->b1 = b1;
- f->a1 = a1;
-}
-
-void tPoleZero_setAllpass(tPoleZero* const pzf, float coeff)
-{
- _tPoleZero* f = *pzf;
-
- if (coeff >= 1.0f) // allpass coefficient >= 1.0 makes filter unstable
- {
- coeff = 0.999999f;
- }
-
- f->b0 = coeff;
- f->b1 = 1.0f;
- f->a0 = 1.0f;
- f->a1 = coeff;
-}
-
-void tPoleZero_setBlockZero(tPoleZero* const pzf, float thePole)
-{
- _tPoleZero* f = *pzf;
-
- if (thePole >= 1.0f) // allpass coefficient >= 1.0 makes filter unstable
- {
- thePole = 0.999999f;
- }
-
- f->b0 = 1.0f;
- f->b1 = -1.0f;
- f->a0 = 1.0f;
- f->a1 = -thePole;
-}
-
-void tPoleZero_setGain(tPoleZero* const pzf, float gain)
-{
- _tPoleZero* f = *pzf;
- f->gain = gain;
-}
-
-float tPoleZero_tick(tPoleZero* const pzf, float input)
-{
- _tPoleZero* f = *pzf;
-
- float in = input * f->gain;
- float out = (f->b0 * in) + (f->b1 * f->lastIn) - (f->a1 * f->lastOut);
-
- f->lastIn = in;
- f->lastOut = out;
-
- return out;
-}
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ BiQuad Filter ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tBiQuad_init(tBiQuad* const ft)
-{
- _tBiQuad* f = *ft = (_tBiQuad*) leaf_alloc(sizeof(_tBiQuad));
-
- f->gain = 1.0f;
-
- f->b0 = 0.0f;
- f->a0 = 0.0f;
-
- f->lastIn[0] = 0.0f;
- f->lastIn[1] = 0.0f;
- f->lastOut[0] = 0.0f;
- f->lastOut[1] = 0.0f;
-}
-
-void tBiQuad_free(tBiQuad* const ft)
-{
- _tBiQuad* f = *ft;
-
- leaf_free(f);
-}
-
-void tBiQuad_initToPool (tBiQuad* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tBiQuad* f = *ft = (_tBiQuad*) mpool_alloc(sizeof(_tBiQuad), &m->pool);
-
- f->gain = 1.0f;
-
- f->b0 = 0.0f;
- f->a0 = 0.0f;
-
- f->lastIn[0] = 0.0f;
- f->lastIn[1] = 0.0f;
- f->lastOut[0] = 0.0f;
- f->lastOut[1] = 0.0f;
-}
-
-void tBiQuad_freeFromPool (tBiQuad* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tBiQuad* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-float tBiQuad_tick(tBiQuad* const ft, float input)
-{
- _tBiQuad* f = *ft;
-
- float in = input * f->gain;
- float out = f->b0 * in + f->b1 * f->lastIn[0] + f->b2 * f->lastIn[1];
- out -= f->a2 * f->lastOut[1] + f->a1 * f->lastOut[0];
-
- f->lastIn[1] = f->lastIn[0];
- f->lastIn[0] = in;
-
- f->lastOut[1] = f->lastOut[0];
- f->lastOut[0] = out;
-
- return out;
-}
-
-void tBiQuad_setResonance(tBiQuad* const ft, float freq, float radius, oBool normalize)
-{
- _tBiQuad* f = *ft;
-
- if (freq < 0.0f) freq = 0.0f;
- if (freq > (leaf.sampleRate * 0.49f)) freq = leaf.sampleRate * 0.49f;
- if (radius < 0.0f) radius = 0.0f;
- if (radius >= 1.0f) radius = 1.0f;
-
- f->frequency = freq;
- f->radius = radius;
- f->normalize = normalize;
-
- f->a2 = radius * radius;
- f->a1 = -2.0f * radius * cosf(freq * leaf.twoPiTimesInvSampleRate);
-
- if (normalize)
- {
- f->b0 = 0.5f - 0.5f * f->a2;
- f->b1 = 0.0f;
- f->b2 = -f->b0;
- }
-}
-
-void tBiQuad_setNotch(tBiQuad* const ft, float freq, float radius)
-{
- _tBiQuad* f = *ft;
-
- if (freq < 0.0f) freq = 0.0f;
- if (freq > (leaf.sampleRate * 0.49f)) freq = leaf.sampleRate * 0.49f;
- if (radius < 0.0f) radius = 0.0f;
-
- f->b2 = radius * radius;
- f->b1 = -2.0f * radius * cosf(freq * leaf.twoPiTimesInvSampleRate); // OPTIMIZE with LOOKUP or APPROXIMATION
-
- // Does not attempt to normalize filter gain.
-}
-
-void tBiQuad_setEqualGainZeros(tBiQuad* const ft)
-{
- _tBiQuad* f = *ft;
- f->b0 = 1.0f;
- f->b1 = 0.0f;
- f->b2 = -1.0f;
-}
-
-void tBiQuad_setB0(tBiQuad* const ft, float b0)
-{
- _tBiQuad* f = *ft;
- f->b0 = b0;
-}
-
-void tBiQuad_setB1(tBiQuad* const ft, float b1)
-{
- _tBiQuad* f = *ft;
- f->b1 = b1;
-}
-
-void tBiQuad_setB2(tBiQuad* const ft, float b2)
-{
- _tBiQuad* f = *ft;
- f->b2 = b2;
-}
-
-void tBiQuad_setA1(tBiQuad* const ft, float a1)
-{
- _tBiQuad* f = *ft;
- f->a1 = a1;
-}
-
-void tBiQuad_setA2(tBiQuad* const ft, float a2)
-{
- _tBiQuad* f = *ft;
- f->a2 = a2;
-}
-
-void tBiQuad_setCoefficients(tBiQuad* const ft, float b0, float b1, float b2, float a1, float a2)
-{
- _tBiQuad* f = *ft;
- f->b0 = b0;
- f->b1 = b1;
- f->b2 = b2;
- f->a1 = a1;
- f->a2 = a2;
-}
-
-void tBiQuad_setGain(tBiQuad* const ft, float gain)
-{
- _tBiQuad* f = *ft;
- f->gain = gain;
-}
-
-void tBiQuadSampleRateChanged(tBiQuad* const ft)
-{
- _tBiQuad* f = *ft;
- f->a2 = f->radius * f->radius;
- f->a1 = -2.0f * f->radius * cosf(f->frequency * leaf.twoPiTimesInvSampleRate);
-
- if (f->normalize)
- {
- f->b0 = 0.5f - 0.5f * f->a2;
- f->b1 = 0.0f;
- f->b2 = -f->b0;
- }
-}
-
-// Less efficient, more accurate version of SVF, in which cutoff frequency is taken as floating point Hz value and tanf
-// is calculated when frequency changes.
-void tSVF_init(tSVF* const svff, SVFType type, float freq, float Q)
-{
- _tSVF* svf = *svff = (_tSVF*) leaf_alloc(sizeof(_tSVF));
-
- svf->type = type;
-
- svf->ic1eq = 0;
- svf->ic2eq = 0;
-
- svf->g = tanf(PI * freq * leaf.invSampleRate);
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g*svf->a1;
- svf->a3 = svf->g*svf->a2;
-}
-
-void tSVF_free(tSVF* const svff)
-{
- _tSVF* svf = *svff;
-
- leaf_free(svf);
-}
-
-void tSVF_initToPool (tSVF* const svff, SVFType type, float freq, float Q, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSVF* svf = *svff = (_tSVF*) mpool_alloc(sizeof(_tSVF), &m->pool);
-
- svf->type = type;
-
- svf->ic1eq = 0;
- svf->ic2eq = 0;
-
- svf->g = tanf(PI * freq * leaf.invSampleRate);
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g*svf->a1;
- svf->a3 = svf->g*svf->a2;
-}
-
-void tSVF_freeFromPool (tSVF* const svff, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSVF* svf = *svff;
-
- mpool_free(svf, &m->pool);
-}
-
-float tSVF_tick(tSVF* const svff, float v0)
-{
- _tSVF* svf = *svff;
-
- float v1,v2,v3;
- v3 = v0 - svf->ic2eq;
- v1 = (svf->a1 * svf->ic1eq) + (svf->a2 * v3);
- v2 = svf->ic2eq + (svf->a2 * svf->ic1eq) + (svf->a3 * v3);
- svf->ic1eq = (2.0f * v1) - svf->ic1eq;
- svf->ic2eq = (2.0f * v2) - svf->ic2eq;
-
- if (svf->type == SVFTypeLowpass) return v2;
- else if (svf->type == SVFTypeBandpass) return v1;
- else if (svf->type == SVFTypeHighpass) return v0 - (svf->k * v1) - v2;
- else if (svf->type == SVFTypeNotch) return v0 - (svf->k * v1);
- else if (svf->type == SVFTypePeak) return v0 - (svf->k * v1) - (2.0f * v2);
- else return 0.0f;
-
-}
-
-void tSVF_setFreq(tSVF* const svff, float freq)
-{
- _tSVF* svf = *svff;
-
- svf->g = tanf(PI * freq * leaf.invSampleRate);
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g * svf->a1;
- svf->a3 = svf->g * svf->a2;
-}
-
-void tSVF_setQ(tSVF* const svff, float Q)
-{
- _tSVF* svf = *svff;
-
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g * svf->a1;
- svf->a3 = svf->g * svf->a2;
-}
-
-// Efficient version of tSVF where frequency is set based on 12-bit integer input for lookup in tanh wavetable.
-void tEfficientSVF_init(tEfficientSVF* const svff, SVFType type, uint16_t input, float Q)
-{
- _tEfficientSVF* svf = *svff = (_tEfficientSVF*) leaf_alloc(sizeof(_tEfficientSVF));
-
- svf->type = type;
-
- svf->ic1eq = 0;
- svf->ic2eq = 0;
-
- svf->g = filtertan[input];
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f+svf->g*(svf->g+svf->k));
- svf->a2 = svf->g*svf->a1;
- svf->a3 = svf->g*svf->a2;
-}
-
-void tEfficientSVF_free(tEfficientSVF* const svff)
-{
- _tEfficientSVF* svf = *svff;
-
- leaf_free(svf);
-}
-
-void tEfficientSVF_initToPool (tEfficientSVF* const svff, SVFType type, uint16_t input, float Q, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEfficientSVF* svf = *svff = (_tEfficientSVF*) mpool_alloc(sizeof(_tEfficientSVF), &m->pool);
-
- svf->type = type;
-
- svf->ic1eq = 0;
- svf->ic2eq = 0;
-
- svf->g = filtertan[input];
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f+svf->g*(svf->g+svf->k));
- svf->a2 = svf->g*svf->a1;
- svf->a3 = svf->g*svf->a2;
-}
-
-void tEfficientSVF_freeFromPool (tEfficientSVF* const svff, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tEfficientSVF* svf = *svff;
-
- mpool_free(svf, &m->pool);
-}
-
-float tEfficientSVF_tick(tEfficientSVF* const svff, float v0)
-{
- _tEfficientSVF* svf = *svff;
-
- float v1,v2,v3;
- v3 = v0 - svf->ic2eq;
- v1 = (svf->a1 * svf->ic1eq) + (svf->a2 * v3);
- v2 = svf->ic2eq + (svf->a2 * svf->ic1eq) + (svf->a3 * v3);
- svf->ic1eq = (2.0f * v1) - svf->ic1eq;
- svf->ic2eq = (2.0f * v2) - svf->ic2eq;
-
- if (svf->type == SVFTypeLowpass) return v2;
- else if (svf->type == SVFTypeBandpass) return v1;
- else if (svf->type == SVFTypeHighpass) return v0 - (svf->k * v1) - v2;
- else if (svf->type == SVFTypeNotch) return v0 - (svf->k * v1);
- else if (svf->type == SVFTypePeak) return v0 - (svf->k * v1) - (2.0f * v2);
- else return 0.0f;
-
-}
-
-void tEfficientSVF_setFreq(tEfficientSVF* const svff, uint16_t input)
-{
- _tEfficientSVF* svf = *svff;
-
- svf->g = filtertan[input];
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g * svf->a1;
- svf->a3 = svf->g * svf->a2;
-}
-
-void tEfficientSVF_setQ(tEfficientSVF* const svff, float Q)
-{
- _tEfficientSVF* svf = *svff;
-
- svf->k = 1.0f/Q;
- svf->a1 = 1.0f/(1.0f + svf->g * (svf->g + svf->k));
- svf->a2 = svf->g * svf->a1;
- svf->a3 = svf->g * svf->a2;
-}
-
-/* Highpass */
-void tHighpass_init(tHighpass* const ft, float freq)
-{
- _tHighpass* f = *ft = (_tHighpass*) leaf_alloc(sizeof(_tHighpass));
-
- f->R = (1.0f - (freq * leaf.twoPiTimesInvSampleRate));
- f->ys = 0.0f;
- f->xs = 0.0f;
-
- f->frequency = freq;
-}
-
-void tHighpass_free(tHighpass* const ft)
-{
- _tHighpass* f = *ft;
-
- leaf_free(f);
-}
-
-void tHighpass_initToPool (tHighpass* const ft, float freq, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tHighpass* f = *ft = (_tHighpass*) mpool_calloc(sizeof(_tHighpass), &m->pool);
-
- f->R = (1.0f - (freq * leaf.twoPiTimesInvSampleRate));
- f->ys = 0.0f;
- f->xs = 0.0f;
-
- f->frequency = freq;
-}
-
-void tHighpass_freeFromPool (tHighpass* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tHighpass* f = *ft;
-
- mpool_free(f, &m->pool);
-}
-
-void tHighpass_setFreq(tHighpass* const ft, float freq)
-{
- _tHighpass* f = *ft;
- f->frequency = freq;
- f->R = (1.0f - (freq * leaf.twoPiTimesInvSampleRate));
-
-}
-
-float tHighpass_getFreq(tHighpass* const ft)
-{
- _tHighpass* f = *ft;
- return f->frequency;
-}
-
-// From JOS DC Blocker
-float tHighpass_tick(tHighpass* const ft, float x)
-{
- _tHighpass* f = *ft;
- f->ys = x - f->xs + f->R * f->ys;
- f->xs = x;
- return f->ys;
-}
-
-void tHighpassSampleRateChanged(tHighpass* const ft)
-{
- _tHighpass* f = *ft;
- f->R = (1.0f-((f->frequency * 2.0f * 3.14f) * leaf.invSampleRate));
-}
-
-void tButterworth_init(tButterworth* const ft, int N, float f1, float f2)
-{
- _tButterworth* f = *ft = (_tButterworth*) leaf_alloc(sizeof(_tButterworth));
-
- f->f1 = f1;
- f->f2 = f2;
- f->gain = 1.0f;
-
- f->N = N;
-
- if (f->N > NUM_SVF_BW) f->N = NUM_SVF_BW;
-
- for(int i = 0; i < N/2; ++i)
- {
- tSVF_init(&f->low[i], SVFTypeHighpass, f1, 0.5f/cosf((1.0f+2.0f*i)*PI/(2*N)));
- tSVF_init(&f->high[i], SVFTypeLowpass, f2, 0.5f/cosf((1.0f+2.0f*i)*PI/(2*N)));
- }
-}
-
-void tButterworth_free(tButterworth* const ft)
-{
- _tButterworth* f = *ft;
-
- for(int i = 0; i < f->N/2; ++i)
- {
- tSVF_free(&f->low[i]);
- tSVF_free(&f->high[i]);
- }
-
- leaf_free(f);
-}
-
-void tButterworth_initToPool (tButterworth* const ft, int N, float f1, float f2, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tButterworth* f = *ft = (_tButterworth*) mpool_alloc(sizeof(_tButterworth), &m->pool);
-
- f->f1 = f1;
- f->f2 = f2;
- f->gain = 1.0f;
-
- f->N = N;
-
- if (f->N > NUM_SVF_BW) f->N = NUM_SVF_BW;
-
- for(int i = 0; i < N/2; ++i)
- {
- tSVF_initToPool(&f->low[i], SVFTypeHighpass, f1, 0.5f/cosf((1.0f+2.0f*i)*PI/(2*N)), mp);
- tSVF_initToPool(&f->high[i], SVFTypeLowpass, f2, 0.5f/cosf((1.0f+2.0f*i)*PI/(2*N)), mp);
- }
-}
-
-void tButterworth_freeFromPool (tButterworth* const ft, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tButterworth* f = *ft;
-
- for(int i = 0; i < f->N/2; ++i)
- {
- tSVF_freeFromPool(&f->low[i], mp);
- tSVF_freeFromPool(&f->high[i], mp);
- }
-
- mpool_free(f, &m->pool);
-}
-
-float tButterworth_tick(tButterworth* const ft, float samp)
-{
- _tButterworth* f = *ft;
-
- for(int i = 0; i < ((f->N)/2); ++i)
- {
- samp = tSVF_tick(&f->low[i],samp);
- samp = tSVF_tick(&f->high[i],samp);
- }
- return samp;
-}
-
-void tButterworth_setF1(tButterworth* const ft, float f1)
-{
- _tButterworth* f = *ft;
-
- f->f1 = f1;
- for(int i = 0; i < ((f->N)/2); ++i) tSVF_setFreq(&f->low[i], f1);
-}
-
-void tButterworth_setF2(tButterworth* const ft, float f2)
-{
- _tButterworth* f = *ft;
-
- f->f2 = f2;
- for(int i = 0; i < ((f->N)/2); ++i) tSVF_setFreq(&f->high[i], f2);
-}
-
-void tButterworth_setFreqs(tButterworth* const ft, float f1, float f2)
-{
- _tButterworth* f = *ft;
-
- f->f1 = f1;
- f->f2 = f2;
- for(int i = 0; i < ((f->N)/2); ++i)
- {
- tSVF_setFreq(&f->low[i], f1);
- tSVF_setFreq(&f->high[i], f2);
- }
-}
-
-void tFIR_init(tFIR* const firf, float* coeffs, int numTaps)
-{
- _tFIR* fir = *firf = (_tFIR*) leaf_alloc(sizeof(_tFIR));
-
- fir->numTaps = numTaps;
- fir->coeff = coeffs;
- fir->past = (float*)leaf_alloc(sizeof(float) * fir->numTaps);
- for (int i = 0; i < fir->numTaps; ++i) fir->past[i] = 0.0f;
-}
-
-void tFIR_free(tFIR* const firf)
-{
- _tFIR* fir = *firf;
-
- leaf_free(fir->past);
- leaf_free(fir);
-}
-
-void tFIR_initToPool (tFIR* const firf, float* coeffs, int numTaps, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFIR* fir = *firf = (_tFIR*) mpool_alloc(sizeof(_tFIR), &m->pool);
-
- fir->numTaps = numTaps;
- fir->coeff = coeffs;
- fir->past = (float*) mpool_alloc(sizeof(float) * fir->numTaps, &m->pool);
- for (int i = 0; i < fir->numTaps; ++i) fir->past[i] = 0.0f;
-}
-
-void tFIR_freeFromPool (tFIR* const firf, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tFIR* fir = *firf;
-
- mpool_free(fir->past, &m->pool);
- mpool_free(fir, &m->pool);
-}
-
-float tFIR_tick(tFIR* const firf, float input)
-{
- _tFIR* fir = *firf;
-
- fir->past[0] = input;
- float y = 0.0f;
- for (int i = 0; i < fir->numTaps; ++i) y += fir->past[i]*fir->coeff[i];
- for (int i = fir->numTaps-1; i > 0; --i) fir->past[i] = fir->past[i-1];
- return y;
-}
--- a/LEAF/Src/leaf-instruments.c
+++ /dev/null
@@ -1,706 +1,0 @@
-/*==============================================================================
-
- leaf-instruments.c
- Created: 30 Nov 2018 10:24:21am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-instruments.h"
-
-#else
-
-#include "../Inc/leaf-instruments.h"
-
-#endif
-
-// ----------------- COWBELL ----------------------------//
-
-void t808Cowbell_init(t808Cowbell* const cowbellInst, int useStick)
-{
- _t808Cowbell* cowbell = *cowbellInst = (_t808Cowbell*) leaf_alloc(sizeof(_t808Cowbell));
-
- tSquare_init(&cowbell->p[0]);
- tSquare_setFreq(&cowbell->p[0], 540.0f);
-
- tSquare_init(&cowbell->p[1]);
- tSquare_setFreq(&cowbell->p[1], 1.48148f * 540.0f);
-
- cowbell->oscMix = 0.5f;
-
- tSVF_init(&cowbell->bandpassOsc, SVFTypeBandpass, 2500, 1.0f);
-
- tSVF_init(&cowbell->bandpassStick, SVFTypeBandpass, 1800, 1.0f);
-
- tEnvelope_init(&cowbell->envGain, 5.0f, 100.0f, OFALSE);
-
- tEnvelope_init(&cowbell->envFilter, 5.0, 100.0f, OFALSE);
-
- tHighpass_init(&cowbell->highpass, 1000.0f);
-
- tNoise_init(&cowbell->stick, WhiteNoise);
-
- tEnvelope_init(&cowbell->envStick, 5.0f, 5.0f, 0);
-
- cowbell->useStick = useStick;
-}
-
-void t808Cowebell_free(t808Cowbell* const cowbellInst)
-{
- _t808Cowbell* cowbell = *cowbellInst;
-
- tSquare_free(&cowbell->p[0]);
- tSquare_free(&cowbell->p[1]);
- tSVF_free(&cowbell->bandpassOsc);
- tSVF_free(&cowbell->bandpassStick);
- tEnvelope_free(&cowbell->envGain);
- tEnvelope_free(&cowbell->envFilter);
- tHighpass_free(&cowbell->highpass);
- tNoise_free(&cowbell->stick);
- tEnvelope_free(&cowbell->envStick);
- leaf_free(cowbell);
-}
-
-void t808Cowbell_initToPool (t808Cowbell* const cowbellInst, int useStick, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Cowbell* cowbell = *cowbellInst = (_t808Cowbell*) mpool_alloc(sizeof(_t808Cowbell), &m->pool);
-
- tSquare_initToPool(&cowbell->p[0], mp);
- tSquare_setFreq(&cowbell->p[0], 540.0f);
-
- tSquare_initToPool(&cowbell->p[1], mp);
- tSquare_setFreq(&cowbell->p[1], 1.48148f * 540.0f);
-
- cowbell->oscMix = 0.5f;
-
- tSVF_initToPool(&cowbell->bandpassOsc, SVFTypeBandpass, 2500, 1.0f, mp);
-
- tSVF_initToPool(&cowbell->bandpassStick, SVFTypeBandpass, 1800, 1.0f, mp);
-
- tEnvelope_initToPool(&cowbell->envGain, 5.0f, 100.0f, OFALSE, mp);
-
- tEnvelope_initToPool(&cowbell->envFilter, 5.0, 100.0f, OFALSE, mp);
-
- tHighpass_initToPool(&cowbell->highpass, 1000.0f, mp);
-
- tNoise_initToPool(&cowbell->stick, WhiteNoise, mp);
-
- tEnvelope_initToPool(&cowbell->envStick, 5.0f, 5.0f, 0, mp);
-
- cowbell->useStick = useStick;
-}
-
-void t808Cowbell_freeFromPool (t808Cowbell* const cowbellInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Cowbell* cowbell = *cowbellInst;
-
- tSquare_freeFromPool(&cowbell->p[0], mp);
- tSquare_freeFromPool(&cowbell->p[1], mp);
- tSVF_freeFromPool(&cowbell->bandpassOsc, mp);
- tSVF_freeFromPool(&cowbell->bandpassStick, mp);
- tEnvelope_freeFromPool(&cowbell->envGain, mp);
- tEnvelope_freeFromPool(&cowbell->envFilter, mp);
- tHighpass_freeFromPool(&cowbell->highpass, mp);
- tNoise_freeFromPool(&cowbell->stick, mp);
- tEnvelope_freeFromPool(&cowbell->envStick, mp);
- mpool_free(cowbell, &m->pool);
-}
-
-void t808Cowbell_on(t808Cowbell* const cowbellInst, float vel)
-{
- _t808Cowbell* cowbell = *cowbellInst;
-
- tEnvelope_on(&cowbell->envGain, vel);
-
- if (cowbell->useStick)
- tEnvelope_on(&cowbell->envStick,vel);
-}
-
-float t808Cowbell_tick(t808Cowbell* const cowbellInst)
-{
- _t808Cowbell* cowbell = *cowbellInst;
-
- float sample = 0.0f;
-
- // Mix oscillators.
- sample = (cowbell->oscMix * tSquare_tick(&cowbell->p[0])) + ((1.0f-cowbell->oscMix) * tSquare_tick(&cowbell->p[1]));
-
- // Filter dive and filter.
- tSVF_setFreq(&cowbell->bandpassOsc, cowbell->filterCutoff + 1000.0f * tEnvelope_tick(&cowbell->envFilter));
- sample = tSVF_tick(&cowbell->bandpassOsc,sample);
-
- sample *= (0.9f * tEnvelope_tick(&cowbell->envGain));
-
- if (cowbell->useStick)
- sample += (0.1f * tEnvelope_tick(&cowbell->envStick) * tSVF_tick(&cowbell->bandpassStick, tNoise_tick(&cowbell->stick)));
-
-
- sample = tHighpass_tick(&cowbell->highpass, sample);
-
- return sample;
-}
-
-void t808Cowbell_setDecay(t808Cowbell* const cowbellInst, float decay)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- tEnvelope_setDecay(&cowbell->envGain,decay);
-}
-
-void t808Cowbell_setHighpassFreq(t808Cowbell *cowbellInst, float freq)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- tHighpass_setFreq(&cowbell->highpass,freq);
-}
-
-void t808Cowbell_setBandpassFreq(t808Cowbell* const cowbellInst, float freq)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- cowbell->filterCutoff = freq;
-}
-
-void t808Cowbell_setFreq(t808Cowbell* const cowbellInst, float freq)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- tSquare_setFreq(&cowbell->p[0],freq);
- tSquare_setFreq(&cowbell->p[1],1.48148f*freq);
-}
-
-void t808Cowbell_setOscMix(t808Cowbell* const cowbellInst, float oscMix)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- cowbell->oscMix = oscMix;
-}
-
-void t808Cowbell_setStick(t808Cowbell* const cowbellInst, int useStick)
-{
- _t808Cowbell* cowbell = *cowbellInst;
- cowbell->useStick = useStick;
-}
-
-// ----------------- HIHAT ----------------------------//
-
-void t808Hihat_init(t808Hihat* const hihatInst)
-{
- _t808Hihat* hihat = *hihatInst = (_t808Hihat*) leaf_alloc(sizeof(_t808Hihat));
-
- for (int i = 0; i < 6; i++)
- {
- tSquare_init(&hihat->p[i]);
- }
-
- tNoise_init(&hihat->stick, PinkNoise);
- tNoise_init(&hihat->n, WhiteNoise);
-
- // need to fix SVF to be generic
- tSVF_init(&hihat->bandpassStick, SVFTypeBandpass,2500.0f,1.2f);
- tSVF_init(&hihat->bandpassOsc, SVFTypeBandpass,3500.0f,0.3f);
-
- tEnvelope_init(&hihat->envGain, 0.0f, 50.0f, OFALSE);
- tEnvelope_init(&hihat->envStick, 0.0f, 7.0f, OFALSE);
-
-
- tHighpass_init(&hihat->highpass, 7000.0f);
-
- hihat->freq = 40.0f;
- hihat->stretch = 0.0f;
-
- tSquare_setFreq(&hihat->p[0], 2.0f * hihat->freq);
- tSquare_setFreq(&hihat->p[1], 3.00f * hihat->freq);
- tSquare_setFreq(&hihat->p[2], 4.16f * hihat->freq);
- tSquare_setFreq(&hihat->p[3], 5.43f * hihat->freq);
- tSquare_setFreq(&hihat->p[4], 6.79f * hihat->freq);
- tSquare_setFreq(&hihat->p[5], 8.21f * hihat->freq);
-}
-
-void t808Hihat_free(t808Hihat* const hihatInst)
-{
- _t808Hihat* hihat = *hihatInst;
-
- for (int i = 0; i < 6; i++)
- {
- tSquare_free(&hihat->p[i]);
- }
-
- tNoise_free(&hihat->stick);
- tNoise_free(&hihat->n);
-
- // need to fix SVF to be generic
- tSVF_free(&hihat->bandpassStick);
- tSVF_free(&hihat->bandpassOsc);
- tEnvelope_free(&hihat->envGain);
- tEnvelope_free(&hihat->envStick);
-
- tHighpass_free(&hihat->highpass);
-
- leaf_free(hihat);
-}
-
-void t808Hihat_initToPool (t808Hihat* const hihatInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Hihat* hihat = *hihatInst = (_t808Hihat*) mpool_alloc(sizeof(_t808Hihat), &m->pool);
-
- for (int i = 0; i < 6; i++)
- {
- tSquare_initToPool(&hihat->p[i], mp);
- }
-
- tNoise_initToPool(&hihat->stick, PinkNoise, mp);
- tNoise_initToPool(&hihat->n, WhiteNoise, mp);
-
- // need to fix SVF to be generic
- tSVF_initToPool(&hihat->bandpassStick, SVFTypeBandpass,2500.0f,1.2f, mp);
- tSVF_initToPool(&hihat->bandpassOsc, SVFTypeBandpass,3500.0f,0.3f, mp);
-
- tEnvelope_initToPool(&hihat->envGain, 0.0f, 50.0f, OFALSE, mp);
- tEnvelope_initToPool(&hihat->envStick, 0.0f, 7.0f, OFALSE, mp);
-
-
- tHighpass_initToPool(&hihat->highpass, 7000.0f, mp);
-
- hihat->freq = 40.0f;
- hihat->stretch = 0.0f;
-
- tSquare_setFreq(&hihat->p[0], 2.0f * hihat->freq);
- tSquare_setFreq(&hihat->p[1], 3.00f * hihat->freq);
- tSquare_setFreq(&hihat->p[2], 4.16f * hihat->freq);
- tSquare_setFreq(&hihat->p[3], 5.43f * hihat->freq);
- tSquare_setFreq(&hihat->p[4], 6.79f * hihat->freq);
- tSquare_setFreq(&hihat->p[5], 8.21f * hihat->freq);
-}
-
-void t808Hihat_freeFromPool (t808Hihat* const hihatInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Hihat* hihat = *hihatInst;
-
- for (int i = 0; i < 6; i++)
- {
- tSquare_freeFromPool(&hihat->p[i], mp);
- }
-
- tNoise_freeFromPool(&hihat->stick, mp);
- tNoise_freeFromPool(&hihat->n, mp);
-
- // need to fix SVF to be generic
- tSVF_freeFromPool(&hihat->bandpassStick, mp);
- tSVF_freeFromPool(&hihat->bandpassOsc, mp);
- tEnvelope_freeFromPool(&hihat->envGain, mp);
- tEnvelope_freeFromPool(&hihat->envStick, mp);
-
- tHighpass_freeFromPool(&hihat->highpass, mp);
-
- mpool_free(hihat, &m->pool);
-}
-
-void t808Hihat_on(t808Hihat* const hihatInst, float vel)
-{
- _t808Hihat* hihat = *hihatInst;
- tEnvelope_on(&hihat->envGain, vel);
- tEnvelope_on(&hihat->envStick, vel);
-}
-
-void t808Hihat_setOscNoiseMix(t808Hihat* const hihatInst, float oscNoiseMix)
-{
- _t808Hihat* hihat = *hihatInst;
- hihat->oscNoiseMix = oscNoiseMix;
-}
-
-float t808Hihat_tick(t808Hihat* const hihatInst)
-{
- _t808Hihat* hihat = *hihatInst;
-
- float sample = 0.0f;
- float gainScale = 0.1666f;
-
- float myNoise = tNoise_tick(&hihat->n);
-
- tSquare_setFreq(&hihat->p[0], ((2.0f + hihat->stretch) * hihat->freq));
- tSquare_setFreq(&hihat->p[1], ((3.00f + hihat->stretch) * hihat->freq));
- tSquare_setFreq(&hihat->p[2], ((4.16f + hihat->stretch) * hihat->freq));
- tSquare_setFreq(&hihat->p[3], ((5.43f + hihat->stretch) * hihat->freq));
- tSquare_setFreq(&hihat->p[4], ((6.79f + hihat->stretch) * hihat->freq));
- tSquare_setFreq(&hihat->p[5], ((8.21f + hihat->stretch) * hihat->freq));
-
- for (int i = 0; i < 6; i++)
- {
- sample += tSquare_tick(&hihat->p[i]);
- }
-
- sample *= gainScale;
-
- sample = (hihat->oscNoiseMix * sample) + ((1.0f-hihat->oscNoiseMix) * myNoise);
-
- sample = tSVF_tick(&hihat->bandpassOsc, sample);
-
- float myGain = tEnvelope_tick(&hihat->envGain);
- sample *= (myGain*myGain);//square the output gain envelope
- sample = tHighpass_tick(&hihat->highpass, sample);
- sample += ((0.5f * tEnvelope_tick(&hihat->envStick)) * tSVF_tick(&hihat->bandpassStick, tNoise_tick(&hihat->stick)));
- sample = tanhf(sample * 2.0f);
-
- return sample;
-}
-
-void t808Hihat_setDecay(t808Hihat* const hihatInst, float decay)
-{
- _t808Hihat* hihat = *hihatInst;
- tEnvelope_setDecay(&hihat->envGain,decay);
-}
-
-void t808Hihat_setHighpassFreq(t808Hihat* const hihatInst, float freq)
-{
- _t808Hihat* hihat = *hihatInst;
- tHighpass_setFreq(&hihat->highpass,freq);
-}
-
-void t808Hihat_setStretch(t808Hihat* const hihatInst, float stretch)
-{
- _t808Hihat* hihat = *hihatInst;
- hihat->stretch = stretch;
-}
-
-void t808Hihat_setFM(t808Hihat* const hihatInst, float FM_amount)
-{
- _t808Hihat* hihat = *hihatInst;
- hihat->FM_amount = FM_amount;
-}
-
-void t808Hihat_setOscBandpassFreq(t808Hihat* const hihatInst, float freq)
-{
- _t808Hihat* hihat = *hihatInst;
- tSVF_setFreq(&hihat->bandpassOsc,freq);
-}
-
-void t808Hihat_setOscBandpassQ(t808Hihat* const hihatInst, float Q)
-{
- _t808Hihat* hihat = *hihatInst;
- tSVF_setQ(&hihat->bandpassOsc,Q);
-}
-
-void t808Hihat_setStickBandPassFreq(t808Hihat* const hihatInst, float freq)
-{
- _t808Hihat* hihat = *hihatInst;
- tSVF_setFreq(&hihat->bandpassStick,freq);
-}
-
-void t808Hihat_setStickBandPassQ(t808Hihat* const hihatInst, float Q)
-{
- _t808Hihat* hihat = *hihatInst;
- tSVF_setQ(&hihat->bandpassStick,Q);
-}
-
-void t808Hihat_setOscFreq(t808Hihat* const hihatInst, float freq)
-{
- _t808Hihat* hihat = *hihatInst;
- hihat->freq = freq;
-}
-
-// ----------------- SNARE ----------------------------//
-
-void t808Snare_init(t808Snare* const snareInst)
-{
- _t808Snare* snare = *snareInst = (_t808Snare*) leaf_alloc(sizeof(_t808Snare));
-
- float ratio[2] = {1.0, 1.5};
- for (int i = 0; i < 2; i++)
- {
- tTriangle_init(&snare->tone[i]);
-
- tTriangle_setFreq(&snare->tone[i], ratio[i] * 400.0f);
- tSVF_init(&snare->toneLowpass[i], SVFTypeLowpass, 4000, 1.0f);
- tEnvelope_init(&snare->toneEnvOsc[i], 0.0f, 50.0f, OFALSE);
- tEnvelope_init(&snare->toneEnvGain[i], 1.0f, 150.0f, OFALSE);
- tEnvelope_init(&snare->toneEnvFilter[i], 1.0f, 2000.0f, OFALSE);
-
- snare->toneGain[i] = 0.5f;
- }
-
- snare->tone1Freq = ratio[0] * 100.0f;
- snare->tone2Freq = ratio[1] * 100.0f;
- snare->noiseFilterFreq = 3000.0f;
- tNoise_init(&snare->noiseOsc, WhiteNoise);
- tSVF_init(&snare->noiseLowpass, SVFTypeLowpass, 12000.0f, 0.8f);
- tEnvelope_init(&snare->noiseEnvGain, 0.0f, 100.0f, OFALSE);
- tEnvelope_init(&snare->noiseEnvFilter, 0.0f, 1000.0f, OFALSE);
- snare->noiseGain = 1.0f;
-}
-
-void t808Snare_free (t808Snare* const snareInst)
-{
- _t808Snare* snare = *snareInst;
-
- for (int i = 0; i < 2; i++)
- {
- tTriangle_free(&snare->tone[i]);
- tSVF_free(&snare->toneLowpass[i]);
- tEnvelope_free(&snare->toneEnvOsc[i]);
- tEnvelope_free(&snare->toneEnvGain[i]);
- tEnvelope_free(&snare->toneEnvFilter[i]);
- }
-
- tNoise_free(&snare->noiseOsc);
- tSVF_free(&snare->noiseLowpass);
- tEnvelope_free(&snare->noiseEnvGain);
- tEnvelope_free(&snare->noiseEnvFilter);
-
- leaf_free(snare);
-}
-
-void t808Snare_initToPool (t808Snare* const snareInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Snare* snare = *snareInst = (_t808Snare*) mpool_alloc(sizeof(_t808Snare), &m->pool);
-
- float ratio[2] = {1.0, 1.5};
- for (int i = 0; i < 2; i++)
- {
- tTriangle_initToPool(&snare->tone[i], mp);
-
- tTriangle_setFreq(&snare->tone[i], ratio[i] * 400.0f);
- tSVF_initToPool(&snare->toneLowpass[i], SVFTypeLowpass, 4000, 1.0f, mp);
- tEnvelope_initToPool(&snare->toneEnvOsc[i], 0.0f, 50.0f, OFALSE, mp);
- tEnvelope_initToPool(&snare->toneEnvGain[i], 1.0f, 150.0f, OFALSE, mp);
- tEnvelope_initToPool(&snare->toneEnvFilter[i], 1.0f, 2000.0f, OFALSE, mp);
-
- snare->toneGain[i] = 0.5f;
- }
-
- snare->tone1Freq = ratio[0] * 100.0f;
- snare->tone2Freq = ratio[1] * 100.0f;
- snare->noiseFilterFreq = 3000.0f;
- tNoise_initToPool(&snare->noiseOsc, WhiteNoise, mp);
- tSVF_initToPool(&snare->noiseLowpass, SVFTypeLowpass, 12000.0f, 0.8f, mp);
- tEnvelope_initToPool(&snare->noiseEnvGain, 0.0f, 100.0f, OFALSE, mp);
- tEnvelope_initToPool(&snare->noiseEnvFilter, 0.0f, 1000.0f, OFALSE, mp);
- snare->noiseGain = 1.0f;
-}
-
-void t808Snare_freeFromPool (t808Snare* const snareInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Snare* snare = *snareInst;
-
- for (int i = 0; i < 2; i++)
- {
- tTriangle_freeFromPool(&snare->tone[i], mp);
- tSVF_freeFromPool(&snare->toneLowpass[i], mp);
- tEnvelope_freeFromPool(&snare->toneEnvOsc[i], mp);
- tEnvelope_freeFromPool(&snare->toneEnvGain[i], mp);
- tEnvelope_freeFromPool(&snare->toneEnvFilter[i], mp);
- }
-
- tNoise_freeFromPool(&snare->noiseOsc, mp);
- tSVF_freeFromPool(&snare->noiseLowpass, mp);
- tEnvelope_freeFromPool(&snare->noiseEnvGain, mp);
- tEnvelope_freeFromPool(&snare->noiseEnvFilter, mp);
-
- mpool_free(snare, &m->pool);
-}
-
-void t808Snare_on(t808Snare* const snareInst, float vel)
-{
- _t808Snare* snare = *snareInst;
-
- for (int i = 0; i < 2; i++)
- {
- tEnvelope_on(&snare->toneEnvOsc[i], vel);
- tEnvelope_on(&snare->toneEnvGain[i], vel);
- tEnvelope_on(&snare->toneEnvFilter[i], vel);
- }
-
- tEnvelope_on(&snare->noiseEnvGain, vel);
- tEnvelope_on(&snare->noiseEnvFilter, vel);
-}
-
-void t808Snare_setTone1Freq(t808Snare* const snareInst, float freq)
-{
- _t808Snare* snare = *snareInst;
- snare->tone1Freq = freq;
- tTriangle_setFreq(&snare->tone[0], freq);
-}
-
-void t808Snare_setTone2Freq(t808Snare* const snareInst, float freq)
-{
- _t808Snare* snare = *snareInst;
- snare->tone2Freq = freq;
- tTriangle_setFreq(&snare->tone[1],freq);
-}
-
-void t808Snare_setTone1Decay(t808Snare* const snareInst, float decay)
-{
- _t808Snare* snare = *snareInst;
- tEnvelope_setDecay(&snare->toneEnvGain[0],decay);
-}
-
-void t808Snare_setTone2Decay(t808Snare* const snareInst, float decay)
-{
- _t808Snare* snare = *snareInst;
- tEnvelope_setDecay(&snare->toneEnvGain[1],decay);
-}
-
-void t808Snare_setNoiseDecay(t808Snare* const snareInst, float decay)
-{
- _t808Snare* snare = *snareInst;
- tEnvelope_setDecay(&snare->noiseEnvGain,decay);
-}
-
-void t808Snare_setToneNoiseMix(t808Snare* const snareInst, float toneNoiseMix)
-{
- _t808Snare* snare = *snareInst;
- snare->toneNoiseMix = toneNoiseMix;
-}
-
-void t808Snare_setNoiseFilterFreq(t808Snare* const snareInst, float noiseFilterFreq)
-{
- _t808Snare* snare = *snareInst;
- snare->noiseFilterFreq = noiseFilterFreq;
-}
-
-void t808Snare_setNoiseFilterQ(t808Snare* const snareInst, float noiseFilterQ)
-{
- _t808Snare* snare = *snareInst;
- tSVF_setQ(&snare->noiseLowpass, noiseFilterQ);
-}
-
-static float tone[2];
-
-float t808Snare_tick(t808Snare* const snareInst)
-{
- _t808Snare* snare = *snareInst;
-
- for (int i = 0; i < 2; i++)
- {
- tTriangle_setFreq(&snare->tone[i], snare->tone1Freq + (20.0f * tEnvelope_tick(&snare->toneEnvOsc[i])));
- tone[i] = tTriangle_tick(&snare->tone[i]);
-
- tSVF_setFreq(&snare->toneLowpass[i], 2000.0f + (500.0f * tEnvelope_tick(&snare->toneEnvFilter[i])));
- tone[i] = tSVF_tick(&snare->toneLowpass[i], tone[i]) * tEnvelope_tick(&snare->toneEnvGain[i]);
- }
-
- float noise = tNoise_tick(&snare->noiseOsc);
- tSVF_setFreq(&snare->noiseLowpass, snare->noiseFilterFreq + (1000.0f * tEnvelope_tick(&snare->noiseEnvFilter)));
- noise = tSVF_tick(&snare->noiseLowpass, noise) * tEnvelope_tick(&snare->noiseEnvGain);
-
- float sample = (snare->toneNoiseMix)*(tone[0] * snare->toneGain[0] + tone[1] * snare->toneGain[1]) + (1.0f-snare->toneNoiseMix) * (noise * snare->noiseGain);
- sample = tanhf(sample * 2.0f);
- return sample;
-}
-
-// ----------------- KICK ----------------------------//
-
-void t808Kick_init (t808Kick* const kickInst)
-{
- _t808Kick* kick = *kickInst = (_t808Kick*) leaf_alloc(sizeof(_t808Kick));
-
- tCycle_init(&kick->tone);
- kick->toneInitialFreq = 40.0f;
- kick->sighAmountInHz = 7.0f;
- kick->chirpRatioMinusOne = 3.3f;
- tCycle_setFreq(&kick->tone, 50.0f);
- tSVF_init(&kick->toneLowpass, SVFTypeLowpass, 2000.0f, 0.5f);
- tEnvelope_init(&kick->toneEnvOscChirp, 0.0f, 20.0f, OFALSE);
- tEnvelope_init(&kick->toneEnvOscSigh, 0.0f, 2500.0f, OFALSE);
- tEnvelope_init(&kick->toneEnvGain, 0.0f, 800.0f, OFALSE);
- tNoise_init(&kick->noiseOsc, PinkNoise);
- tEnvelope_init(&kick->noiseEnvGain, 0.0f, 1.0f, OFALSE);
- kick->noiseGain = 0.3f;
-}
-
-void t808Kick_free (t808Kick* const kickInst)
-{
- _t808Kick* kick = *kickInst;
-
- tCycle_free(&kick->tone);
- tSVF_free(&kick->toneLowpass);
- tEnvelope_free(&kick->toneEnvOscChirp);
- tEnvelope_free(&kick->toneEnvOscSigh);
- tEnvelope_free(&kick->toneEnvGain);
- tNoise_free(&kick->noiseOsc);
- tEnvelope_free(&kick->noiseEnvGain);
-
- leaf_free(kick);
-}
-
-void t808Kick_initToPool (t808Kick* const kickInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Kick* kick = *kickInst = (_t808Kick*) mpool_alloc(sizeof(_t808Kick), &m->pool);
-
- tCycle_initToPool(&kick->tone, mp);
- kick->toneInitialFreq = 40.0f;
- kick->sighAmountInHz = 7.0f;
- kick->chirpRatioMinusOne = 3.3f;
- tCycle_setFreq(&kick->tone, 50.0f);
- tSVF_initToPool(&kick->toneLowpass, SVFTypeLowpass, 2000.0f, 0.5f, mp);
- tEnvelope_initToPool(&kick->toneEnvOscChirp, 0.0f, 20.0f, OFALSE, mp);
- tEnvelope_initToPool(&kick->toneEnvOscSigh, 0.0f, 2500.0f, OFALSE, mp);
- tEnvelope_initToPool(&kick->toneEnvGain, 0.0f, 800.0f, OFALSE, mp);
- tNoise_initToPool(&kick->noiseOsc, PinkNoise, mp);
- tEnvelope_initToPool(&kick->noiseEnvGain, 0.0f, 1.0f, OFALSE, mp);
- kick->noiseGain = 0.3f;
-}
-
-void t808Kick_freeFromPool (t808Kick* const kickInst, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _t808Kick* kick = *kickInst;
-
- tCycle_freeFromPool(&kick->tone, mp);
- tSVF_freeFromPool(&kick->toneLowpass, mp);
- tEnvelope_freeFromPool(&kick->toneEnvOscChirp, mp);
- tEnvelope_freeFromPool(&kick->toneEnvOscSigh, mp);
- tEnvelope_freeFromPool(&kick->toneEnvGain, mp);
- tNoise_freeFromPool(&kick->noiseOsc, mp);
- tEnvelope_freeFromPool(&kick->noiseEnvGain, mp);
-
- mpool_free(kick, &m->pool);
-}
-
-float t808Kick_tick (t808Kick* const kickInst)
-{
- _t808Kick* kick = *kickInst;
-
- tCycle_setFreq(&kick->tone, (kick->toneInitialFreq * (1.0f + (kick->chirpRatioMinusOne * tEnvelope_tick(&kick->toneEnvOscChirp)))) + (kick->sighAmountInHz * tEnvelope_tick(&kick->toneEnvOscSigh)));
- float sample = tCycle_tick(&kick->tone) * tEnvelope_tick(&kick->toneEnvGain);
- sample+= tNoise_tick(&kick->noiseOsc) * tEnvelope_tick(&kick->noiseEnvGain);
- //add distortion here
- sample = tSVF_tick(&kick->toneLowpass, sample);
- return sample;
-}
-
-void t808Kick_on (t808Kick* const kickInst, float vel)
-{
- _t808Kick* kick = *kickInst;
- tEnvelope_on(&kick->toneEnvOscChirp, vel);
- tEnvelope_on(&kick->toneEnvOscSigh, vel);
- tEnvelope_on(&kick->toneEnvGain, vel);
- tEnvelope_on(&kick->noiseEnvGain, vel);
-
-}
-void t808Kick_setToneFreq (t808Kick* const kickInst, float freq)
-{
- _t808Kick* kick = *kickInst;
- kick->toneInitialFreq = freq;
-
-}
-
-void t808Kick_setToneDecay (t808Kick* const kickInst, float decay)
-{
- _t808Kick* kick = *kickInst;
- tEnvelope_setDecay(&kick->toneEnvGain,decay);
- tEnvelope_setDecay(&kick->toneEnvGain,decay * 3.0f);
-}
-
-void t808Kick_setNoiseDecay (t808Kick* const kickInst, float decay);
-void t808Kick_setSighAmount (t808Kick* const kickInst, float sigh);
-void t808Kick_setChirpAmount (t808Kick* const kickInst, float chirp);
-void t808Kick_setToneNoiseMix (t808Kick* const kickInst, float toneNoiseMix);
-void t808Kick_setNoiseFilterFreq (t808Kick* const kickInst, float noiseFilterFreq);
-void t808Kick_setNoiseFilterQ (t808Kick* const kickInst, float noiseFilterQ);
-
-
--- a/LEAF/Src/leaf-math.c
+++ /dev/null
@@ -1,485 +1,0 @@
-/*==============================================================================
-
- leaf-math.c
- Created: 22 Jan 2017 7:02:56pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-math.h"
-#include "..\Inc\leaf-tables.h"
-
-#else
-
-#include "../Inc/leaf-math.h"
-#include "../Inc/leaf-tables.h"
-
-#endif
-
-// The C-embedded Audio Library.
-#define TWO_TO_16 65536.f
-
-#define EXPONENTIAL_TABLE_SIZE 65536
-
-float interpolate3max(float *buf, const int peakindex)
-{
- float a = buf[peakindex-1];
- float b = buf[peakindex];
- float c = buf[peakindex+1];
- float realpeak;
-
- realpeak = b + (float)0.125 * (c - a) * (c - a) / ((float)2. * b - a - c);
-
- return(realpeak);
-}
-
-float interpolate3phase(float *buf, const int peakindex)
-{
- float a = buf[peakindex-1];
- float b = buf[peakindex];
- float c = buf[peakindex+1];
- float fraction;
-
- fraction = ((float)0.5 * (c - a)) / ((float)2. * b - a - c);
-
- return(fraction);
-}
-
-// alternative implementation for abs()
-// REQUIRES: 32 bit integers
-int fastabs_int(int in){
- unsigned int r;
- int const mask = in >> 31;
-
- r = (in ^ mask) - mask;
-
- return (r);
-}
-
-// alternative implementation for abs()
-// REQUIRES: 32 bit floats
-float fastabsf(float f)
-{
- union
- {
- float f;
- unsigned int ui;
- }alias;
-
- alias.f = f;
- alias.ui &= 0x7fffffff;
- return alias.f;
-}
-
-
-float fastexpf(float x) {
- x = 1.0f + (x * 0.0009765625f);
- x *= x; x *= x; x *= x; x *= x;
- x *= x; x *= x; x *= x; x *= x;
- x *= x; x *= x;
- return x;
-}
-
-float fasterexpf(float x) {
- x = 1.0 + (x * 0.00390625f);
- x *= x; x *= x; x *= x; x *= x;
- x *= x; x *= x; x *= x; x *= x;
- return x;
-}
-
-// fast floating-point exp2 function taken from Robert Bristow Johnson's
-// post in the music-dsp list on Date: Tue, 02 Sep 2014 16:50:11 -0400
-float fastexp2f(float x)
-{
- if (x >= -127.0)
- {
- register float accumulator, xPower;
- register union {float f; int32_t i;} xBits;
-
- xBits.i = (int32_t)(x + 4096.0f) - 4096L; /* integer part */
- x -= (float)(xBits.i); /* fractional part */
-
- accumulator = 1.0f + 0.69303212081966f*x;
- xPower = x*x;
- accumulator += 0.24137976293709f*xPower;
- xPower *= x;
- accumulator += 0.05203236900844f*xPower;
- xPower *= x;
- accumulator += 0.01355574723481f*xPower;
-
- xBits.i += 127; /* bias integer part */
- xBits.i<<= 23; /* move biased int part into exponent bits */
-
- return accumulator * xBits.f;
- }
- else
- {
- return 0.0f;
- }
-}
-
-
-/*
-you pass in a float array to get back two indexes representing the volumes of the left (index 0) and right (index 1) channels
-when t is -1, volumes[0] = 0, volumes[1] = 1
-when t = 0, volumes[0] = 0.707, volumes[1] = 0.707 (equal-power cross fade)
-when t = 1, volumes[0] = 1, volumes[1] = 0
-*/
-
-void LEAF_crossfade(float fade, float* volumes) {
- volumes[0] = sqrtf(0.5f * (1.0f + fade));
- volumes[1] = sqrtf(0.5f * (1.0f - fade));
-}
-
-// dope af
-float LEAF_chebyshevT(float in, int n){
- if (n == 0) return 1;
- else if (n == 1) return in;
- else return 2.0f * in * LEAF_chebyshevT(in, n-1) - LEAF_chebyshevT(in, n-2);
-}
-
-#if !(_WIN32 || _WIN64)
-float LEAF_CompoundChebyshevT(float in, int n, float* amps){
- float T[n+1];
- T[0] = 1.0f;
- T[1] = in;
- for (int i = 2; i <= n; ++i)
- T[i] = 2*in*T[i-1] - T[i-2];
- float out = 0;
- float amp = 0;
- for (int i = 0; i < n; ++i){
- out += amps[i]*T[i+1];
- amp += amps[i];
- }
- return out / amp ;
-}
-#endif
-
-float LEAF_frequencyToMidi(float f)
-{
- return (69.0f + 12.0f * log2(f * INV_440));
-}
-
-// Jones shaper
-float LEAF_shaper(float input, float m_drive)
-{
- float fx = input * 2.0f; // prescale
- float w, c, xc, xc2, xc4;
-
- xc = LEAF_clip(-SQRT8, fx, SQRT8);
- xc2 = xc*xc;
- c = 0.5f*fx*(3.0f - (xc2));
- xc4 = xc2 * xc2;
- w = (1.0f - xc2*0.25f + xc4*0.015625f) * WSCALE;
- float shaperOut = w*(c+ 0.05f*xc2)*(m_drive + 0.75f);
- shaperOut *= 0.5f; // post_scale
- return shaperOut;
-}
-
-// round input to nearest rnd
-float LEAF_round (float input, float rnd)
-{
- rnd = fabsf(rnd);
-
- if (rnd <= 0.0000001f) return input;
-
- float scale = 1.f / rnd;
-
- return roundf(input * scale) / scale;
-}
-
-union unholy_t unholy;
-
-float LEAF_bitwise_xor(float input, uint32_t op)
-{
- unholy.f = input;
- unholy.i = (unholy.i ^ op);
-
- return unholy.f;
-}
-
-float LEAF_reedTable(float input, float offset, float slope)
-{
- float output = offset + (slope * input);
- if ( output > 1.0f) output = 1.0f;
- if ( output < -1.0f) output = -1.0f;
- return output;
-}
-
-float LEAF_softClip(float val, float thresh)
-{
- float x;
-
- if(val > thresh)
- {
- x = thresh / val;
- return (1.0f - x) * (1.0f - thresh) + thresh;
- }
- else if(val < -thresh)
- {
- x = -thresh / val;
- return -((1.0f - x) * (1.0f - thresh) + thresh);
- }
- else
- {
- return val;
- }
-}
-
-float LEAF_clip(float min, float val, float max)
- {
-
- if (val < min) {
- return min;
- } else if (val > max) {
- return max;
- } else {
- return val;
- }
-}
-
-int LEAF_clipInt(int min, int val, int max)
-{
- if (val < min) {
- return min;
- } else if (val > max) {
- return max;
- } else {
- return val;
- }
-}
-
-oBool LEAF_isPrime(uint64_t number )
-{
- if ( number == 2 ) return OTRUE;
- if ( number & 1 ) {
- for ( int i=3; i<(int)sqrt((double)number)+1; i+=2 )
- if ( (number % i) == 0 ) return OFALSE;
- return OTRUE; // prime
- }
- else return OFALSE; // even
-}
-
-// Adapted from MusicDSP: http://www.musicdsp.org/showone.php?id=238
-float LEAF_tanh(float x)
-{
-
- if( x < -3.0f )
- return -1.0f;
- else if( x > 3.0f )
- return 1.0f;
- else
- return x * ( 27.0f + x * x ) / ( 27.0f + 9.0f * x * x );
-}
-
-
-void LEAF_generate_sine(float* buffer, int size)
-{
- float phase;
- for (int i = 0; i < size; i++)
- {
- phase = (float) i / (float) size;
- buffer[i] = sinf(phase * TWO_PI);
- }
-}
-
-void LEAF_generate_sawtooth(float* buffer, float basefreq, int size)
-{
- int harmonic = 1;
- float phase = 0.0f;
- float freq = harmonic * basefreq;
- float amp;
-
- while (freq < (leaf.sampleRate * 0.5))
- {
- amp = 1.0f / harmonic;
- for (int i = 0; i < size; i++)
- {
- phase = (float) i / (float) size;
- buffer[i] += (amp * sinf(harmonic * phase * TWO_PI));
- }
-
- harmonic++;
- freq = harmonic * basefreq;
- }
-}
-
-
-void LEAF_generate_triangle(float* buffer, float basefreq, int size)
-{
- int harmonic = 1;
- float phase = 0.0f;
- float freq = harmonic * basefreq;
- float amp = 1.0f;
-
- int count = 0;
- float mult = 1.0f;
-
- while (freq < (leaf.sampleRate * 0.5))
- {
- amp = 1.0f / (float)(harmonic * harmonic);
-
- if (count % 2) mult = -1.0f;
- else mult = 1.0f;
-
- for (int i = 0; i < size; i++)
- {
- phase = (float) i / (float) size;
- buffer[i] += (mult * amp * sinf(harmonic * phase * TWO_PI));
- }
-
- count++;
- harmonic += 2;
- freq = harmonic * basefreq;
- }
-}
-
-void LEAF_generate_square(float* buffer, float basefreq, int size)
-{
- int harmonic = 1;
- float phase = 0.0f;
- float freq = harmonic * basefreq;
- float amp = 1.0f;
-
- while (freq < (leaf.sampleRate * 0.5))
- {
- amp = 1.0f / (float)(harmonic);
-
- for (int i = 0; i < size; i++)
- {
- phase = (float) i / (float) size;
- buffer[i] += (amp * sinf(harmonic * phase * TWO_PI));
- }
-
- harmonic += 2;
- freq = harmonic * basefreq;
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// name: mtof()
-// desc: midi to freq, from PD source
-//-----------------------------------------------------------------------------
-float LEAF_midiToFrequency(float f)
-{
- if( f <= -1500.0f ) return (0);
- else if( f > 1499.0f ) return (LEAF_midiToFrequency(1499.0f));
- else return ( powf(2.0f, (f - 69.0f) * 0.083333333333333f) * 440.0f );
-}
-
-
-// alpha, [0.0, 1.0]
-float LEAF_interpolate_hermite (float A, float B, float C, float D, float alpha)
-{
- alpha = LEAF_clip(0.0f, alpha, 1.0f);
-
- float a = -A*0.5f + (3.0f*B)*0.5f - (3.0f*C)*0.5f + D*0.5f;
- float b = A - (5.0f*B)*0.5f + 2.0f*C - D * 0.5f;
- float c = -A*0.5f + C*0.5f;
- float d = B;
-
- return a*alpha*alpha*alpha + b*alpha*alpha + c*alpha + d;
-}
-
-
-// from http://www.musicdsp.org/archive.php?classid=5#93
-//xx is alpha (fractional part of sample value)
-//grabbed this from Tom Erbe's Delay pd code
-float LEAF_interpolate_hermite_x(float yy0, float yy1, float yy2, float yy3, float xx)
-{
- // 4-point, 3rd-order Hermite (x-form)
- float c0 = yy1;
- float c1 = 0.5f * (yy2 - yy0);
- float y0my1 = yy0 - yy1;
- float c3 = (yy1 - yy2) + 0.5f * (yy3 - y0my1 - yy2);
- float c2 = y0my1 + c1 - c3;
-
- return ((c3 * xx + c2) * xx + c1) * xx + c0;
-}
-
-// alpha, [0.0, 1.0]
-float LEAF_interpolation_linear (float A, float B, float alpha)
-{
- alpha = LEAF_clip(0.0f, alpha, 1.0f);
-
- float omAlpha = 1.0f - alpha;
-
- // First 1/2 of interpolation
- float out = A * omAlpha;
-
- out += B * alpha;
-
- return out;
-}
-
-#define LOGTEN 2.302585092994
-
-float mtof(float f)
-{
- if (f <= -1500.0f) return(0);
- else if (f > 1499.0f) return(mtof(1499.0f));
- else return (8.17579891564f * expf(0.0577622650f * f));
-}
-
-float fast_mtof(float f)
-{
- return (8.17579891564f * fastexpf(0.0577622650f * f));
-}
-
-float faster_mtof(float f)
-{
- return (8.17579891564f * fastexpf(0.0577622650f * f));
-}
-
-float ftom(float f)
-{
- return (f > 0 ? 17.3123405046f * logf(.12231220585f * f) : -1500.0f);
-}
-
-float powtodb(float f)
-{
- if (f <= 0) return (0);
- else
- {
- float val = 100 + 10.f/LOGTEN * logf(f);
- return (val < 0 ? 0 : val);
- }
-}
-
-float rmstodb(float f)
-{
- if (f <= 0) return (0);
- else
- {
- float val = 100 + 20.f/LOGTEN * log(f);
- return (val < 0 ? 0 : val);
- }
-}
-
-float dbtopow(float f)
-{
- if (f <= 0)
- return(0);
- else
- {
- if (f > 870.0f)
- f = 870.0f;
- return (expf((LOGTEN * 0.1f) * (f-100.0f)));
- }
-}
-
-float dbtorms(float f)
-{
- if (f <= 0)
- return(0);
- else
- {
- if (f > 485.0f)
- f = 485.0f;
- }
- return (expf((LOGTEN * 0.05f) * (f-100.0f)));
-}
-
--- a/LEAF/Src/leaf-mempool.c
+++ /dev/null
@@ -1,397 +1,0 @@
-
-/** mpool source significantly modified by Mike Mulshine, Jeff Snyder, et al., Princeton University Music Department **/
-
-/**
- In short, mpool is distributed under so called "BSD license",
-
- Copyright (c) 2009-2010 Tatsuhiko Kubo <cubicdaiya@gmail.com>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * 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.
-
- * Neither the name of the authors 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 COPYRIGHT HOLDERS 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 COPYRIGHT
- OWNER 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.
- */
-
-/* written with C99 style */
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-mempool.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-mempool.h"
-#include "../leaf.h"
-
-#endif
-
-_tMempool leaf_pool;
-tMempool leaf_mempool;
-size_t header_size;
-
-
-/**
- * private function
- */
-static inline size_t mpool_align(size_t size);
-static inline mpool_node_t* create_node(void* block_location, mpool_node_t* next, mpool_node_t* prev, size_t size);
-static inline void delink_node(mpool_node_t* node);
-
-/**
- * create memory pool
- */
-void mpool_create (char* memory, size_t size, mpool_t* pool)
-{
- header_size = mpool_align(sizeof(mpool_node_t));
-
- pool->mpool = (void*)memory;
- pool->usize = 0;
- pool->msize = size;
-
- pool->head = create_node(pool->mpool, NULL, NULL, pool->msize-header_size);
-
- for (int i = 0; i < pool->head->size; i++)
- {
- memory[i+header_size]=0;
- }
-}
-
-void leaf_pool_init(char* memory, size_t size)
-{
- mpool_create(memory, size, &leaf_pool.pool);
-
- leaf_mempool = &leaf_pool;
-}
-
-/**
- * allocate memory from memory pool
- */
-void* mpool_alloc(size_t asize, mpool_t* pool)
-{
- // If the head is NULL, the mempool is full
- if (pool->head == NULL) return NULL;
-
- // Should we alloc the first block large enough or check all blocks and pick the one closest in size?
- size_t size_to_alloc = mpool_align(asize);
- mpool_node_t* node_to_alloc = pool->head;
-
- // Traverse the free list for a large enough block
- while (node_to_alloc->size < size_to_alloc)
- {
- node_to_alloc = node_to_alloc->next;
-
- // If we reach the end of the free list, there
- // are no blocks large enough, return NULL
- if (node_to_alloc == NULL) return NULL;
- }
-
- // Create a new node after the node to be allocated if there is enough space
- mpool_node_t* new_node;
- size_t leftover = node_to_alloc->size - size_to_alloc;
- node_to_alloc->size = size_to_alloc;
- if (leftover > header_size)
- {
- long offset = (char*) node_to_alloc - (char*) pool->mpool;
- offset += header_size + node_to_alloc->size;
- new_node = create_node(&pool->mpool[offset],
- node_to_alloc->next,
- node_to_alloc->prev,
- leftover - header_size);
- }
- else
- {
- // Add any leftover space to the allocated node to avoid fragmentation
- node_to_alloc->size += leftover;
-
- new_node = node_to_alloc->next;
- }
-
- // Update the head if we are allocating the first node of the free list
- // The head will be NULL if there is no space left
- if (pool->head == node_to_alloc)
- {
- pool->head = new_node;
- }
-
- // Remove the allocated node from the free list
- delink_node(node_to_alloc);
-
- pool->usize += header_size + node_to_alloc->size;
-
- if (leaf.clearOnAllocation > 0)
- {
- char* new_pool = (char*)node_to_alloc->pool;
- for (int i = 0; i < node_to_alloc->size; i++) new_pool[i] = 0;
- }
-
- // Return the pool of the allocated node;
- return node_to_alloc->pool;
-}
-
-
-/**
- * allocate memory from memory pool and also clear that memory to be blank
- */
-void* mpool_calloc(size_t asize, mpool_t* pool)
-{
- // If the head is NULL, the mempool is full
- if (pool->head == NULL) return NULL;
-
- // Should we alloc the first block large enough or check all blocks and pick the one closest in size?
- size_t size_to_alloc = mpool_align(asize);
- mpool_node_t* node_to_alloc = pool->head;
-
- // Traverse the free list for a large enough block
- while (node_to_alloc->size < size_to_alloc)
- {
- node_to_alloc = node_to_alloc->next;
-
- // If we reach the end of the free list, there
- // are no blocks large enough, return NULL
- if (node_to_alloc == NULL) return NULL;
- }
-
- // Create a new node after the node to be allocated if there is enough space
- mpool_node_t* new_node;
- size_t leftover = node_to_alloc->size - size_to_alloc;
- node_to_alloc->size = size_to_alloc;
- if (leftover > header_size)
- {
- long offset = (char*) node_to_alloc - (char*) pool->mpool;
- offset += header_size + node_to_alloc->size;
- new_node = create_node(&pool->mpool[offset],
- node_to_alloc->next,
- node_to_alloc->prev,
- leftover - header_size);
- }
- else
- {
- // Add any leftover space to the allocated node to avoid fragmentation
- node_to_alloc->size += leftover;
-
- new_node = node_to_alloc->next;
- }
-
- // Update the head if we are allocating the first node of the free list
- // The head will be NULL if there is no space left
- if (pool->head == node_to_alloc)
- {
- pool->head = new_node;
- }
-
- // Remove the allocated node from the free list
- delink_node(node_to_alloc);
-
- pool->usize += header_size + node_to_alloc->size;
- // Format the new pool
- char* new_pool = (char*)node_to_alloc->pool;
- for (int i = 0; i < node_to_alloc->size; i++) new_pool[i] = 0;
- // Return the pool of the allocated node;
- return node_to_alloc->pool;
-}
-
-void* leaf_alloc(size_t size)
-{
- //printf("alloc %i\n", size);
- void* block = mpool_alloc(size, &leaf_pool.pool);
-
- if (block == NULL) leaf_mempool_overrun();
-
- return block;
-}
-
-void* leaf_calloc(size_t size)
-{
- //printf("alloc %i\n", size);
- void* block = mpool_calloc(size, &leaf_pool.pool);
-
- if (block == NULL) leaf_mempool_overrun();
-
-
- return block;
-}
-
-void mpool_free(void* ptr, mpool_t* pool)
-{
- //if (ptr < pool->mpool || ptr >= pool->mpool + pool->msize)
- // Get the node at the freed space
- mpool_node_t* freed_node = (mpool_node_t*) (ptr - header_size);
-
- pool->usize -= header_size + freed_node->size;
-
- // Check each node in the list against the newly freed one to see if it's adjacent in memory
- mpool_node_t* other_node = pool->head;
- mpool_node_t* next_node;
- while (other_node != NULL)
- {
- next_node = other_node->next;
- // Check if a node is directly after the freed node
- if ((long) freed_node + (header_size + freed_node->size) == (long) other_node)
- {
- // Increase freed node's size
- freed_node->size += header_size + other_node->size;
- // If we are merging with the head, move the head forward
- if (other_node == pool->head) pool->head = pool->head->next;
- // Delink the merged node
- delink_node(other_node);
- }
-
- // Check if a node is directly before the freed node
- else if ((long) other_node + (header_size + other_node->size) == (long) freed_node)
- {
- // Increase the merging node's size
- other_node->size += header_size + freed_node->size;
-
- if (other_node != pool->head)
- {
- // Delink the merging node
- delink_node(other_node);
- // Attach the merging node to the head
- other_node->next = pool->head;
- // Merge
- freed_node = other_node;
- }
- else
- {
- // If we are merging with the head, move the head forward
- pool->head = pool->head->next;
- // Merge
- freed_node = other_node;
- }
- }
-
- other_node = next_node;
- }
-
- // Ensure the freed node is attached to the head
- freed_node->next = pool->head;
- if (pool->head != NULL) pool->head->prev = freed_node;
- pool->head = freed_node;
-
- // Format the freed pool
- // char* freed_pool = (char*)freed_node->pool;
- // for (int i = 0; i < freed_node->size; i++) freed_pool[i] = 0;
-}
-
-void leaf_free(void* ptr)
-{
- mpool_free(ptr, &leaf_pool.pool);
-}
-
-size_t mpool_get_size(mpool_t* pool)
-{
- return pool->msize;
-}
-
-size_t mpool_get_used(mpool_t* pool)
-{
- return pool->usize;
-}
-
-size_t leaf_pool_get_size(void)
-{
- return mpool_get_size(&leaf_pool.pool);
-}
-
-size_t leaf_pool_get_used(void)
-{
- return mpool_get_used(&leaf_pool.pool);
-}
-
-void* leaf_pool_get_pool(void)
-{
- float* buff = (float*)leaf_pool.pool.mpool;
-
- return buff;
-}
-
-/**
- * align byte boundary
- */
-static inline size_t mpool_align(size_t size) {
- return (size + (MPOOL_ALIGN_SIZE - 1)) & ~(MPOOL_ALIGN_SIZE - 1);
-}
-
-static inline mpool_node_t* create_node(void* block_location, mpool_node_t* next, mpool_node_t* prev, size_t size)
-{
- mpool_node_t* node = (mpool_node_t*)block_location;
- node->pool = block_location + header_size;
- node->next = next;
- node->prev = prev;
- node->size = size;
-
- return node;
-}
-
-static inline void delink_node(mpool_node_t* node)
-{
- // If there is a node after the node to remove
- if (node->next != NULL)
- {
- // Close the link
- node->next->prev = node->prev;
- }
- // If there is a node before the node to remove
- if (node->prev != NULL)
- {
- // Close the link
- node->prev->next = node->next;
- }
-
- node->next = NULL;
- node->prev = NULL;
-}
-
-void leaf_mempool_overrun(void)
-{
- //TODO: we should set up some kind of leaf_error method that reaches user space to notify library users of things that failed.
-}
-
-void tMempool_init(tMempool* const mp, char* memory, size_t size)
-{
- tMempool_initToPool(mp, memory, size, &leaf_mempool);
-}
-
-void tMempool_free(tMempool* const mp)
-{
- tMempool_freeFromPool(mp, &leaf_mempool);
-}
-
-void tMempool_initToPool (tMempool* const mp, char* memory, size_t size, tMempool* const mem)
-{
- _tMempool* mm = *mem;
- _tMempool* m = *mp = (_tMempool*) mpool_alloc(sizeof(_tMempool), &mm->pool);
-
- mpool_create (memory, size, &m->pool);
-}
-
-void tMempool_freeFromPool (tMempool* const mp, tMempool* const mem)
-{
- _tMempool* mm = *mem;
- _tMempool* m = *mp;
-
- mpool_free(m, &mm->pool);
-}
--- a/LEAF/Src/leaf-midi.c
+++ /dev/null
@@ -1,681 +1,0 @@
-/*==============================================================================
-
- leaf-midi.c
- Created: 30 Nov 2018 11:29:16am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-midi.h"
-
-#else
-
-#include "../Inc/leaf-midi.h"
-
-#endif
-
-//====================================================================================
-/* Stack */
-//====================================================================================
-
-void tStack_init(tStack* const stack)
-{
- _tStack* ns = *stack = (_tStack*) leaf_alloc(sizeof(_tStack));
-
- ns->ordered = OFALSE;
- ns->size = 0;
- ns->pos = 0;
- ns->capacity = STACK_SIZE;
-
- for (int i = 0; i < STACK_SIZE; i++) ns->data[i] = -1;
-}
-
-void tStack_free(tStack* const stack)
-{
- _tStack* ns = *stack;
-
- leaf_free(ns);
-}
-
-void tStack_initToPool (tStack* const stack, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tStack* ns = *stack = (_tStack*) mpool_alloc(sizeof(_tStack), &m->pool);
-
- ns->ordered = OFALSE;
- ns->size = 0;
- ns->pos = 0;
- ns->capacity = STACK_SIZE;
-
- for (int i = 0; i < STACK_SIZE; i++) ns->data[i] = -1;
-}
-
-void tStack_freeFromPool (tStack* const stack, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tStack* ns = *stack;
-
- mpool_free(ns, &m->pool);
-}
-
-// If stack contains note, returns index. Else returns -1;
-int tStack_contains(tStack* const stack, uint16_t noteVal)
-{
- _tStack* ns = *stack;
- for (int i = 0; i < ns->size; i++)
- {
- if (ns->data[i] == noteVal) return i;
- }
- return -1;
-}
-
-void tStack_add(tStack* const stack, uint16_t noteVal)
-{
- _tStack* ns = *stack;
-
- uint8_t j;
-
- int whereToInsert = 0;
- if (ns->ordered)
- {
- for (j = 0; j < ns->size; j++)
- {
- if (noteVal > ns->data[j])
- {
- if ((noteVal < ns->data[j+1]) || (ns->data[j+1] == -1))
- {
- whereToInsert = j+1;
- break;
- }
- }
- }
- }
-
- //first move notes that are already in the stack one position to the right
- for (j = ns->size; j > whereToInsert; j--)
- {
- ns->data[j] = ns->data[(j - 1)];
- }
-
- //then, insert the new note into the front of the stack
- ns->data[whereToInsert] = noteVal;
-
- ns->size++;
-}
-
-int tStack_addIfNotAlreadyThere(tStack* const stack, uint16_t noteVal)
-{
- _tStack* ns = *stack;
-
- uint8_t j;
-
- int added = 0;
-
- if (tStack_contains(stack, noteVal) == -1)
- {
- int whereToInsert = 0;
- if (ns->ordered)
- {
- for (j = 0; j < ns->size; j++)
- {
- if (noteVal > ns->data[j])
- {
- if ((noteVal < ns->data[j+1]) || (ns->data[j+1] == -1))
- {
- whereToInsert = j+1;
- break;
- }
- }
- }
- }
-
- //first move notes that are already in the stack one position to the right
- for (j = ns->size; j > whereToInsert; j--)
- {
- ns->data[j] = ns->data[(j - 1)];
- }
-
- //then, insert the new note into the front of the stack
- ns->data[whereToInsert] = noteVal;
-
- ns->size++;
-
- added = 1;
- }
-
- return added;
-}
-
-// Remove noteVal. return 1 if removed, 0 if not
-int tStack_remove(tStack* const stack, uint16_t noteVal)
-{
- _tStack* ns = *stack;
-
- uint8_t k;
- int foundIndex = tStack_contains(stack, noteVal);
- int removed = 0;
-
- if (foundIndex >= 0)
- {
- for (k = 0; k < (ns->size - foundIndex); k++)
- {
- if ((k+foundIndex) >= (ns->capacity - 1))
- {
- ns->data[k + foundIndex] = -1;
- }
- else
- {
- ns->data[k + foundIndex] = ns->data[k + foundIndex + 1];
- if ((k + foundIndex) == (ns->size - 1))
- {
- ns->data[k + foundIndex + 1] = -1;
- }
- }
-
- }
- // in case it got put on the stack multiple times
- foundIndex--;
- ns->size--;
- removed = 1;
- }
-
- return removed;
-}
-
-// Doesn't change size of data types
-void tStack_setCapacity(tStack* const stack, uint16_t cap)
-{
- _tStack* ns = *stack;
-
- if (cap <= 0)
- ns->capacity = 1;
- else if (cap <= STACK_SIZE)
- ns->capacity = cap;
- else
- ns->capacity = STACK_SIZE;
-
- for (int i = cap; i < STACK_SIZE; i++)
- {
- if ((int)ns->data[i] != -1)
- {
- ns->data[i] = -1;
- ns->size -= 1;
- }
- }
-
- if (ns->pos >= cap)
- {
- ns->pos = 0;
- }
-}
-
-int tStack_getSize(tStack* const stack)
-{
- _tStack* ns = *stack;
-
- return ns->size;
-}
-
-void tStack_clear(tStack* const stack)
-{
- _tStack* ns = *stack;
-
- for (int i = 0; i < STACK_SIZE; i++)
- {
- ns->data[i] = -1;
- }
- ns->pos = 0;
- ns->size = 0;
-}
-
-// Next item in order of addition to stack. Return 0-31 if there is a next item to move to. Returns -1 otherwise.
-int tStack_next(tStack* const stack)
-{
- _tStack* ns = *stack;
-
- int step = 0;
- if (ns->size != 0) // if there is at least one note in the stack
- {
- if (ns->pos > 0) // if you're not at the most recent note (first one), then go backward in the array (moving from earliest to latest)
- {
- ns->pos--;
- }
- else
- {
- ns->pos = (ns->size - 1); // if you are the most recent note, go back to the earliest note in the array
- }
-
- step = ns->data[ns->pos];
- return step;
- }
- else
- {
- return -1;
- }
-}
-
-int tStack_get(tStack* const stack, int which)
-{
- _tStack* ns = *stack;
- return ns->data[which];
-}
-
-int tStack_first(tStack* const stack)
-{
- _tStack* ns = *stack;
- return ns->data[0];
-}
-
-
-// POLY
-void tPoly_init(tPoly* const polyh, int maxNumVoices)
-{
- _tPoly* poly = *polyh = (_tPoly*) leaf_alloc(sizeof(_tPoly));
-
- poly->numVoices = maxNumVoices;
- poly->maxNumVoices = maxNumVoices;
- poly->lastVoiceToChange = 0;
-
- // Arp mode stuff
- poly->currentVoice = 0;
- poly->maxLength = 128;
- poly->currentNote = -1;
-
- //default learned CCs and notes are just the CCs 1-128 - notes are skipped
- for (int i = 0; i < 128; i++)
- {
- poly->notes[i][0] = 0;
- poly->notes[i][1] = -1;
- }
-
- poly->glideTime = 5.0f;
-
- poly->ramps = (tRamp*) leaf_alloc(sizeof(tRamp) * poly->maxNumVoices);
- poly->rampVals = (float*) leaf_alloc(sizeof(float) * poly->maxNumVoices);
- poly->firstReceived = (oBool*) leaf_alloc(sizeof(oBool) * poly->maxNumVoices);
- poly->voices = (int**) leaf_alloc(sizeof(int*) * poly->maxNumVoices);
-
- for (int i = 0; i < poly->maxNumVoices; ++i)
- {
- poly->voices[i] = (int*) leaf_alloc(sizeof(int) * 2);
- poly->voices[i][0] = -1;
- poly->firstReceived[i] = OFALSE;
-
- tRamp_init(&poly->ramps[i], poly->glideTime, 1);
- }
-
- poly->pitchBend = 0.0f;
-
- tRamp_init(&poly->pitchBendRamp, 1.0f, 1);
- tStack_init(&poly->stack);
- tStack_init(&poly->orderStack);
-
- poly->pitchGlideIsActive = OFALSE;
-}
-
-void tPoly_free(tPoly* const polyh)
-{
- _tPoly* poly = *polyh;
-
- for (int i = 0; i < poly->maxNumVoices; i++)
- {
- tRamp_free(&poly->ramps[i]);
- leaf_free(poly->voices[i]);
- }
- tRamp_free(&poly->pitchBendRamp);
- tStack_free(&poly->stack);
- tStack_free(&poly->orderStack);
-
- leaf_free(poly->voices);
- leaf_free(poly->ramps);
- leaf_free(poly->rampVals);
- leaf_free(poly->firstReceived);
-
- leaf_free(poly);
-}
-
-void tPoly_initToPool (tPoly* const polyh, int maxNumVoices, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPoly* poly = *polyh = (_tPoly*) mpool_alloc(sizeof(_tPoly), &m->pool);
-
- poly->numVoices = maxNumVoices;
- poly->maxNumVoices = maxNumVoices;
- poly->lastVoiceToChange = 0;
-
- // Arp mode stuff
- poly->currentVoice = 0;
- poly->maxLength = 128;
- poly->currentNote = -1;
-
- //default learned CCs and notes are just the CCs 1-128 - notes are skipped
- for (int i = 0; i < 128; i++)
- {
- poly->notes[i][0] = 0;
- poly->notes[i][1] = -1;
- }
-
- poly->glideTime = 5.0f;
-
- poly->ramps = (tRamp*) mpool_alloc(sizeof(tRamp) * poly->maxNumVoices, &m->pool);
- poly->rampVals = (float*) mpool_alloc(sizeof(float) * poly->maxNumVoices, &m->pool);
- poly->firstReceived = (oBool*) mpool_alloc(sizeof(oBool) * poly->maxNumVoices, &m->pool);
- poly->voices = (int**) mpool_alloc(sizeof(int*) * poly->maxNumVoices, &m->pool);
-
- for (int i = 0; i < poly->maxNumVoices; ++i)
- {
- poly->voices[i] = (int*) mpool_alloc(sizeof(int) * 2, &m->pool);
- poly->voices[i][0] = -1;
- poly->firstReceived[i] = OFALSE;
-
- tRamp_initToPool(&poly->ramps[i], poly->glideTime, 1, mp);
- }
-
- poly->pitchBend = 0.0f;
-
- tRamp_initToPool(&poly->pitchBendRamp, 1.0f, 1, mp);
- tStack_initToPool(&poly->stack, mp);
- tStack_initToPool(&poly->orderStack, mp);
-
- poly->pitchGlideIsActive = OFALSE;
-}
-
-void tPoly_freeFromPool (tPoly* const polyh, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPoly* poly = *polyh;
-
- for (int i = 0; i < poly->maxNumVoices; i++)
- {
- tRamp_freeFromPool(&poly->ramps[i], mp);
- mpool_free(poly->voices[i], &m->pool);
- }
- tRamp_freeFromPool(&poly->pitchBendRamp, mp);
- tStack_freeFromPool(&poly->stack, mp);
- tStack_freeFromPool(&poly->orderStack, mp);
-
- mpool_free(poly->voices, &m->pool);
- mpool_free(poly->ramps, &m->pool);
- mpool_free(poly->rampVals, &m->pool);
- mpool_free(poly->firstReceived, &m->pool);
-
- mpool_free(poly, &m->pool);
-}
-
-void tPoly_tickPitch(tPoly* polyh)
-{
- tPoly_tickPitchGlide(polyh);
- tPoly_tickPitchBend(polyh);
-}
-
-void tPoly_tickPitchGlide(tPoly* polyh)
-{
- _tPoly* poly = *polyh;
- for (int i = 0; i < poly->maxNumVoices; ++i)
- {
- tRamp_tick(&poly->ramps[i]);
- }
-}
-
-void tPoly_tickPitchBend(tPoly* polyh)
-{
- _tPoly* poly = *polyh;
- tRamp_tick(&poly->pitchBendRamp);
-}
-
-void tPoly_setPitchBend(tPoly* const polyh, float pitchBend)
-{
- _tPoly* poly = *polyh;
- poly->pitchBend = pitchBend;
- tRamp_setDest(&poly->pitchBendRamp, poly->pitchBend);
-}
-
-int tPoly_noteOn(tPoly* const polyh, int note, uint8_t vel)
-{
- _tPoly* poly = *polyh;
-
- // if not in keymap or already on stack, dont do anything. else, add that note.
- if (tStack_contains(&poly->stack, note) >= 0) return -1;
- else
- {
- tPoly_orderedAddToStack(polyh, note);
- tStack_add(&poly->stack, note);
-
- int alteredVoice = -1;
- oBool found = OFALSE;
- for (int i = 0; i < poly->numVoices; i++)
- {
- if (poly->voices[i][0] < 0) // if inactive voice, give this note to voice
- {
- if (!poly->firstReceived[i] || !poly->pitchGlideIsActive)
- {
- tRamp_setVal(&poly->ramps[i], note);
- poly->firstReceived[i] = OTRUE;
- }
-
- found = OTRUE;
-
- poly->voices[i][0] = note;
- poly->voices[i][1] = vel;
- poly->lastVoiceToChange = i;
- poly->notes[note][0] = vel;
- poly->notes[note][1] = i;
-
- tRamp_setDest(&poly->ramps[i], poly->voices[i][0]);
-
- alteredVoice = i;
- break;
- }
- }
-
- if (!found) //steal
- {
- int whichVoice, whichNote;
- for (int j = tStack_getSize(&poly->stack) - 1; j >= 0; j--)
- {
- whichNote = tStack_get(&poly->stack, j);
- whichVoice = poly->notes[whichNote][1];
- if (whichVoice >= 0)
- {
- poly->lastVoiceToChange = whichVoice;
- int oldNote = poly->voices[whichVoice][0];
- poly->voices[whichVoice][0] = note;
- poly->voices[whichVoice][1] = vel;
- poly->notes[oldNote][1] = -1; //mark the stolen voice as inactive (in the second dimension of the notes array)
- poly->notes[note][0] = vel;
- poly->notes[note][1] = whichVoice;
-
- if (poly->pitchGlideIsActive)
- {
- tRamp_setTime(&poly->ramps[whichVoice], poly->glideTime);
- }
- else
- {
- tRamp_setVal(&poly->ramps[whichVoice], note);
- }
- tRamp_setDest(&poly->ramps[whichVoice], poly->voices[whichVoice][0]);
-
- alteredVoice = whichVoice;
-
- break;
- }
- }
- }
- return alteredVoice;
- }
-}
-
-
-int16_t noteToTest = -1;
-
-int tPoly_noteOff(tPoly* const polyh, uint8_t note)
-{
- _tPoly* poly = *polyh;
-
- tStack_remove(&poly->stack, note);
- tStack_remove(&poly->orderStack, note);
- poly->notes[note][0] = 0;
- poly->notes[note][1] = -1;
-
- int deactivatedVoice = -1;
- for (int i = 0; i < poly->maxNumVoices; i++)
- {
- if (poly->voices[i][0] == note)
- {
- poly->voices[i][0] = -1;
- poly->voices[i][1] = 0;
- poly->lastVoiceToChange = i;
- deactivatedVoice = i;
- break;
- }
- }
- /*
- //monophonic handling
- if ((poly->numVoices == 1) && (tStack_getSize(poly->stack) > 0))
- {
- int oldNote = tStack_first(poly->stack);
- poly->voices[0][0] = oldNote;
- poly->voices[0][1] = poly->notes[oldNote][0];
- poly->lastVoiceToChange = 0;
- }
- */
-
- //grab old notes off the stack if there are notes waiting to replace the free voice
- if (deactivatedVoice >= 0)
- {
- for (int j = 0; j < tStack_getSize(&poly->stack); ++j)
- {
- noteToTest = tStack_get(&poly->stack, j);
-
- if (poly->notes[noteToTest][1] < 0) //if there is a stolen note waiting (marked inactive but on the stack)
- {
- poly->voices[deactivatedVoice][0] = noteToTest; //set the newly free voice to use the old stolen note
- if (poly->pitchGlideIsActive)
- {
- tRamp_setTime(&poly->ramps[deactivatedVoice], poly->glideTime);
- }
- else
- {
- tRamp_setVal(&poly->ramps[deactivatedVoice], noteToTest);
- }
- tRamp_setDest(&poly->ramps[deactivatedVoice], poly->voices[deactivatedVoice][0]);
- poly->voices[deactivatedVoice][1] = poly->notes[noteToTest][0]; // set the velocity of the voice to be the velocity of that note
- poly->notes[noteToTest][1] = deactivatedVoice; //mark that it is no longer stolen and is now active
- return -1;
- }
- }
- }
- return deactivatedVoice;
-}
-
-void tPoly_orderedAddToStack(tPoly* const polyh, uint8_t noteVal)
-{
- _tPoly* poly = *polyh;
-
- uint8_t j;
- int myPitch, thisPitch, nextPitch;
-
- tStack ns = poly->orderStack;
-
- int whereToInsert = 0;
-
- for (j = 0; j < ns->size; j++)
- {
- myPitch = noteVal;
- thisPitch = ns->data[j];
- nextPitch = ns->data[j+1];
-
- if (myPitch > thisPitch)
- {
- if ((myPitch < nextPitch) || (nextPitch == -1))
- {
- whereToInsert = j+1;
- break;
- }
- }
- }
-
- //first move notes that are already in the stack one position to the right
- for (j = ns->size; j > whereToInsert; j--)
- {
- ns->data[j] = ns->data[(j - 1)];
- }
-
- //then, insert the new note into the front of the stack
- ns->data[whereToInsert] = noteVal;
-
- ns->size++;
-
-}
-
-void tPoly_setNumVoices(tPoly* const polyh, uint8_t numVoices)
-{
- _tPoly* poly = *polyh;
- poly->numVoices = (numVoices > poly->maxNumVoices) ? poly->maxNumVoices : numVoices;
-}
-
-void tPoly_setPitchGlideActive(tPoly* const polyh, oBool isActive)
-{
- _tPoly* poly = *polyh;
- poly->pitchGlideIsActive = isActive;
-}
-
-void tPoly_setPitchGlideTime(tPoly* const polyh, float t)
-{
- _tPoly* poly = *polyh;
- poly->glideTime = t;
- for (int i = 0; i < poly->maxNumVoices; ++i)
- {
- tRamp_setTime(&poly->ramps[i], poly->glideTime);
- }
-}
-
-void tPoly_setBendGlideTime(tPoly* const polyh, float t)
-{
- _tPoly* poly = *polyh;
- tRamp_setTime(&poly->pitchBendRamp, t);
-}
-
-void tPoly_setBendSamplesPerTick(tPoly* const polyh, float t)
-{
- _tPoly* poly = *polyh;
- poly->pitchBendRamp->samples_per_tick = t;
-}
-
-int tPoly_getNumVoices(tPoly* const polyh)
-{
- _tPoly* poly = *polyh;
- return poly->numVoices;
-}
-
-int tPoly_getNumActiveVoices(tPoly* const polyh)
-{
- _tPoly* poly = *polyh;
- return tStack_getSize(&poly->stack);
-}
-
-float tPoly_getPitch(tPoly* const polyh, uint8_t voice)
-{
- _tPoly* poly = *polyh;
- return tRamp_sample(&poly->ramps[voice]) + tRamp_sample(&poly->pitchBendRamp);
-}
-
-int tPoly_getKey(tPoly* const polyh, uint8_t voice)
-{
- _tPoly* poly = *polyh;
- return poly->voices[voice][0];
-}
-
-int tPoly_getVelocity(tPoly* const polyh, uint8_t voice)
-{
- _tPoly* poly = *polyh;
- return poly->voices[voice][1];
-}
-
-int tPoly_isOn(tPoly* const polyh, uint8_t voice)
-{
- _tPoly* poly = *polyh;
- return (poly->voices[voice][0] > 0) ? 1 : 0;
-}
--- a/LEAF/Src/leaf-oscillators.c
+++ /dev/null
@@ -1,863 +1,0 @@
-/*==============================================================================
- leaf-oscillators.c
- Created: 20 Jan 2017 12:00:58pm
- Author: Michael R Mulshine
- ==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-tables.h"
-#include "..\Inc\leaf-oscillators.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-tables.h"
-#include "../Inc/leaf-oscillators.h"
-#include "../leaf.h"
-
-#endif
-
-// Cycle
-void tCycle_init(tCycle* const cy)
-{
- _tCycle* c = *cy = (_tCycle*) leaf_alloc(sizeof(_tCycle));
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-
-}
-
-void tCycle_free(tCycle* const cy)
-{
- _tCycle* c = *cy;
-
- leaf_free(c);
-}
-
-void tCycle_initToPool (tCycle* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCycle* c = *cy = (_tCycle*) mpool_alloc(sizeof(_tCycle), &m->pool);
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-
-}
-
-void tCycle_freeFromPool (tCycle* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tCycle* c = *cy;
-
- mpool_free(c, &m->pool);
-}
-
-int tCycle_setFreq(tCycle* const cy, float freq)
-{
- _tCycle* c = *cy;
-
- c->freq = freq;
- c->inc = freq * leaf.invSampleRate;
-
- return 0;
-}
-
-//need to check bounds and wrap table properly to allow through-zero FM
-float tCycle_tick(tCycle* const cy)
-{
- _tCycle* c = *cy;
- float temp;;
- int intPart;;
- float fracPart;
- float samp0;
- float samp1;
-
- // Phasor increment
- c->phase += c->inc;
- while (c->phase >= 1.0f) c->phase -= 1.0f;
- while (c->phase <= 0.0f) c->phase += 1.0f;
-
- // Wavetable synthesis
-
- temp = SINE_TABLE_SIZE * c->phase;
- intPart = (int)temp;
- fracPart = temp - (float)intPart;
- samp0 = sinewave[intPart];
- if (++intPart >= SINE_TABLE_SIZE) intPart = 0;
- samp1 = sinewave[intPart];
-
- return (samp0 + (samp1 - samp0) * fracPart);
-
-}
-
-void tCycleSampleRateChanged (tCycle* const cy)
-{
- _tCycle* c = *cy;
-
- c->inc = c->freq * leaf.invSampleRate;
-}
-
-//========================================================================
-/* Triangle */
-void tTriangle_init(tTriangle* const cy)
-{
- _tTriangle* c = *cy = (_tTriangle*) leaf_alloc(sizeof(_tTriangle));
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tTriangle_free(tTriangle* const cy)
-{
- _tTriangle* c = *cy;
-
- leaf_free(c);
-}
-
-void tTriangle_initToPool (tTriangle* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTriangle* c = *cy = (_tTriangle*) mpool_alloc(sizeof(_tTriangle), &m->pool);
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tTriangle_freeFromPool (tTriangle* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tTriangle* c = *cy;
-
- mpool_free(c, &m->pool);
-}
-
-int tTriangle_setFreq(tTriangle* const cy, float freq)
-{
- _tTriangle* c = *cy;
-
- if (freq < 0.0f) freq = 0.0f;
-
- c->freq = freq;
- c->inc = freq * leaf.invSampleRate;
-
- return 0;
-}
-
-
-float tTriangle_tick(tTriangle* const cy)
-{
- _tTriangle* c = *cy;
-
- // Phasor increment
- c->phase += c->inc;
- while (c->phase >= 1.0f) c->phase -= 1.0f;
-
- float out = 0.0f;
- float w;
-
- int idx = (int)(c->phase * TRI_TABLE_SIZE);
-
- // Wavetable synthesis
-
- if (c->freq <= 20.0f)
- {
- out = triangle[T20][idx];
- }
- else if (c->freq <= 40.0f)
- {
- w = ((40.0f - c->freq) * INV_20);
- out = (triangle[T20][idx] * w) + (triangle[T40][idx] * (1.0f - w));
- }
- else if (c->freq <= 80.0f)
- {
- w = ((80.0f - c->freq) * INV_40);
- out = (triangle[T40][idx] * w) + (triangle[T80][idx] * (1.0f - w));
- }
- else if (c->freq <= 160.0f)
- {
- w = ((160.0f - c->freq) * INV_80);
- out = (triangle[T80][idx] * w) + (triangle[T160][idx] * (1.0f - w));
- }
- else if (c->freq <= 320.0f)
- {
- w = ((320.0f - c->freq) * INV_160);
- out = (triangle[T160][idx] * w) + (triangle[T320][idx] * (1.0f - w));
- }
- else if (c->freq <= 640.0f)
- {
- w = ((640.0f - c->freq) * INV_320);
- out = (triangle[T320][idx] * w) + (triangle[T640][idx] * (1.0f - w));
- }
- else if (c->freq <= 1280.0f)
- {
- w = ((1280.0f - c->freq) * INV_640);
- out = (triangle[T640][idx] * w) + (triangle[T1280][idx] * (1.0f - w));
- }
- else if (c->freq <= 2560.0f)
- {
- w = ((2560.0f - c->freq) * INV_1280);
- out = (triangle[T1280][idx] * w) + (triangle[T2560][idx] * (1.0f - w));
- }
- else if (c->freq <= 5120.0f)
- {
- w = ((5120.0f - c->freq) * INV_2560);
- out = (triangle[T2560][idx] * w) + (triangle[T5120][idx] * (1.0f - w));
- }
- else if (c->freq <= 10240.0f)
- {
- w = ((10240.0f - c->freq) * INV_5120);
- out = (triangle[T5120][idx] * w) + (triangle[T10240][idx] * (1.0f - w));
- }
- else if (c->freq <= 20480.0f)
- {
- w = ((20480.0f - c->freq) * INV_10240);
- out = (triangle[T10240][idx] * w) + (triangle[T20480][idx] * (1.0f - w));
- }
- else
- {
- out = triangle[T20480][idx];
- }
-
- return out;
-}
-
-void tTriangleSampleRateChanged (tTriangle* const cy)
-{
- _tTriangle* c = *cy;
-
- c->inc = c->freq * leaf.invSampleRate;
-}
-
-//========================================================================
-/* Square */
-void tSquare_init(tSquare* const cy)
-{
- _tSquare* c = *cy = (_tSquare*) leaf_alloc(sizeof(_tSquare));
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tSquare_free(tSquare* const cy)
-{
- _tSquare* c = *cy;
-
- leaf_free(c);
-}
-
-void tSquare_initToPool (tSquare* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSquare* c = *cy = (_tSquare*) mpool_alloc(sizeof(_tSquare), &m->pool);
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tSquare_freeFromPool(tSquare* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSquare* c = *cy;
-
- mpool_free(c, &m->pool);
-}
-
-int tSquare_setFreq(tSquare* const cy, float freq)
-{
- _tSquare* c = *cy;
-
- if (freq < 0.0f) freq = 0.0f;
-
- c->freq = freq;
- c->inc = freq * leaf.invSampleRate;
-
- return 0;
-}
-
-float tSquare_tick(tSquare* const cy)
-{
- _tSquare* c = *cy;
-
- // Phasor increment
- c->phase += c->inc;
- while (c->phase >= 1.0f) c->phase -= 1.0f;
-
- float out = 0.0f;
- float w = 0.0f;
- int idx = (int)(c->phase * TRI_TABLE_SIZE);
-
- // Wavetable synthesis
-
- if (c->freq <= 20.0f)
- {
- out = squarewave[T20][idx];
- }
- else if (c->freq <= 40.0f)
- {
- w = ((40.0f - c->freq) * INV_20);
- out = (squarewave[T20][idx] * w) + (squarewave[T40][idx] * (1.0f - w));
- }
- else if (c->freq <= 80.0f)
- {
- w = ((80.0f - c->freq) * INV_40);
- out = (squarewave[T40][idx] * w) + (squarewave[T80][idx] * (1.0f - w));
- }
- else if (c->freq <= 160.0f)
- {
- w = ((160.0f - c->freq) * INV_80);
- out = (squarewave[T80][idx] * w) + (squarewave[T160][idx] * (1.0f - w));
- }
- else if (c->freq <= 320.0f)
- {
- w = ((320.0f - c->freq) * INV_160);
- out = (squarewave[T160][idx] * w) + (squarewave[T320][idx] * (1.0f - w));
- }
- else if (c->freq <= 640.0f)
- {
- w = ((640.0f - c->freq) * INV_320);
- out = (squarewave[T320][idx] * w) + (squarewave[T640][idx] * (1.0f - w));
- }
- else if (c->freq <= 1280.0f)
- {
- w = ((1280.0f - c->freq) * INV_640);
- out = (squarewave[T640][idx] * w) + (squarewave[T1280][idx] * (1.0f - w));
- }
- else if (c->freq <= 2560.0f)
- {
- w = ((2560.0f - c->freq) * INV_1280);
- out = (squarewave[T1280][idx] * w) + (squarewave[T2560][idx] * (1.0f - w));
- }
- else if (c->freq <= 5120.0f)
- {
- w = ((5120.0f - c->freq) * INV_2560);
- out = (squarewave[T2560][idx] * w) + (squarewave[T5120][idx] * (1.0f - w));
- }
- else if (c->freq <= 10240.0f)
- {
- w = ((10240.0f - c->freq) * INV_5120);
- out = (squarewave[T5120][idx] * w) + (squarewave[T10240][idx] * (1.0f - w));
- }
- else if (c->freq <= 20480.0f)
- {
- w = ((20480.0f - c->freq) * INV_10240);
- out = (squarewave[T10240][idx] * w) + (squarewave[T20480][idx] * (1.0f - w));
- }
- else
- {
- out = squarewave[T20480][idx];
- }
-
- return out;
-}
-
-void tSquareSampleRateChanged (tSquare* const cy)
-{
- _tSquare* c = *cy;
-
- c->inc = c->freq * leaf.invSampleRate;
-}
-
-//=====================================================================
-// Sawtooth
-void tSawtooth_init(tSawtooth* const cy)
-{
- _tSawtooth* c = *cy = (_tSawtooth*) leaf_alloc(sizeof(_tSawtooth));
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tSawtooth_free(tSawtooth* const cy)
-{
- _tSawtooth* c = *cy;
-
- leaf_free(c);
-}
-
-void tSawtooth_initToPool (tSawtooth* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSawtooth* c = *cy = (_tSawtooth*) mpool_alloc(sizeof(_tSawtooth), &m->pool);
-
- c->inc = 0.0f;
- c->phase = 0.0f;
-}
-
-void tSawtooth_freeFromPool (tSawtooth* const cy, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSawtooth* c = *cy;
-
- mpool_free(c, &m->pool);
-}
-
-int tSawtooth_setFreq(tSawtooth* const cy, float freq)
-{
- _tSawtooth* c = *cy;
-
- if (freq < 0.0f) freq = 0.0f;
-
- c->freq = freq;
- c->inc = freq * leaf.invSampleRate;
-
- return 0;
-}
-
-float tSawtooth_tick(tSawtooth* const cy)
-{
- _tSawtooth* c = *cy;
-
- // Phasor increment
- c->phase += c->inc;
- while (c->phase >= 1.0f) c->phase -= 1.0f;
-
- float out = 0.0f;
- float w;
-
- int idx = (int)(c->phase * TRI_TABLE_SIZE);
-
- // Wavetable synthesis
-
- if (c->freq <= 20.0f)
- {
- out = sawtooth[T20][idx];
- }
- else if (c->freq <= 40.0f)
- {
- w = ((40.0f - c->freq) * INV_20);
- out = (sawtooth[T20][idx] * w) + (sawtooth[T40][idx] * (1.0f - w));
- }
- else if (c->freq <= 80.0f)
- {
- w = ((80.0f - c->freq) * INV_40);
- out = (sawtooth[T40][idx] * w) + (sawtooth[T80][idx] * (1.0f - w));
- }
- else if (c->freq <= 160.0f)
- {
- w = ((160.0f - c->freq) * INV_80);
- out = (sawtooth[T80][idx] * w) + (sawtooth[T160][idx] * (1.0f - w));
- }
- else if (c->freq <= 320.0f)
- {
- w = ((320.0f - c->freq) * INV_160);
- out = (sawtooth[T160][idx] * w) + (sawtooth[T320][idx] * (1.0f - w));
- }
- else if (c->freq <= 640.0f)
- {
- w = ((640.0f - c->freq) * INV_320);
- out = (sawtooth[T320][idx] * w) + (sawtooth[T640][idx] * (1.0f - w));
- }
- else if (c->freq <= 1280.0f)
- {
- w = ((1280.0f - c->freq) * INV_640);
- out = (sawtooth[T640][idx] * w) + (sawtooth[T1280][idx] * (1.0f - w));
- }
- else if (c->freq <= 2560.0f)
- {
- w = ((2560.0f - c->freq) * INV_1280);
- out = (sawtooth[T1280][idx] * w) + (sawtooth[T2560][idx] * (1.0f - w));
- }
- else if (c->freq <= 5120.0f)
- {
- w = ((5120.0f - c->freq) * INV_2560);
- out = (sawtooth[T2560][idx] * w) + (sawtooth[T5120][idx] * (1.0f - w));
- }
- else if (c->freq <= 10240.0f)
- {
- w = ((10240.0f - c->freq) * INV_5120);
- out = (sawtooth[T5120][idx] * w) + (sawtooth[T10240][idx] * (1.0f - w));
- }
- else if (c->freq <= 20480.0f)
- {
- w = ((20480.0f - c->freq) * INV_10240);
- out = (sawtooth[T10240][idx] * w) + (sawtooth[T20480][idx] * (1.0f - w));
- }
- else
- {
- out = sawtooth[T20480][idx];
- }
-
- return out;
-}
-
-void tSawtoothSampleRateChanged (tSawtooth* const cy)
-{
- _tSawtooth* c = *cy;
-
- c->inc = c->freq * leaf.invSampleRate;
-}
-
-//========================================================================
-/* Phasor */
-void tPhasorSampleRateChanged (tPhasor* const ph)
-{
- _tPhasor* p = *ph;
-
- p->inc = p->freq * leaf.invSampleRate;
-};
-
-void tPhasor_init(tPhasor* const ph)
-{
- _tPhasor* p = *ph = (_tPhasor*) leaf_alloc(sizeof(_tPhasor));
-
- p->phase = 0.0f;
- p->inc = 0.0f;
-}
-
-void tPhasor_free(tPhasor* const ph)
-{
- _tPhasor* p = *ph;
-
- leaf_free(p);
-}
-
-void tPhasor_initToPool (tPhasor* const ph, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPhasor* p = *ph = (_tPhasor*) mpool_alloc(sizeof(_tPhasor), &m->pool);
-
- p->phase = 0.0f;
- p->inc = 0.0f;
-}
-
-void tPhasor_freeFromPool(tPhasor* const ph, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPhasor* p = *ph;
-
- mpool_free(p, &m->pool);
-}
-
-int tPhasor_setFreq(tPhasor* const ph, float freq)
-{
- _tPhasor* p = *ph;
-
- if (freq < 0.0f) freq = 0.0f;
-
- p->freq = freq;
- p->inc = freq * leaf.invSampleRate;
-
- return 0;
-}
-
-float tPhasor_tick(tPhasor* const ph)
-{
- _tPhasor* p = *ph;
-
- p->phase += p->inc;
-
- if (p->phase >= 1.0f) p->phase -= 1.0f;
-
- return p->phase;
-}
-
-/* Noise */
-void tNoise_init(tNoise* const ns, NoiseType type)
-{
- _tNoise* n = *ns = (_tNoise*) leaf_alloc(sizeof(_tNoise));
-
- n->type = type;
- n->rand = leaf.random;
-}
-
-void tNoise_free(tNoise* const ns)
-{
- _tNoise* n = *ns;
-
- leaf_free(n);
-}
-
-void tNoise_initToPool (tNoise* const ns, NoiseType type, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNoise* n = *ns = (_tNoise*) mpool_alloc(sizeof(_tNoise), &m->pool);
-
- n->type = type;
- n->rand = leaf.random;
-}
-
-void tNoise_freeFromPool (tNoise* const ns, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNoise* n = *ns;
-
- mpool_free(n, &m->pool);
-}
-
-float tNoise_tick(tNoise* const ns)
-{
- _tNoise* n = *ns;
-
- float rand = (n->rand() * 2.0f) - 1.0f;
-
- if (n->type == PinkNoise)
- {
- float tmp;
- n->pinkb0 = 0.99765f * n->pinkb0 + rand * 0.0990460f;
- n->pinkb1 = 0.96300f * n->pinkb1 + rand * 0.2965164f;
- n->pinkb2 = 0.57000f * n->pinkb2 + rand * 1.0526913f;
- tmp = n->pinkb0 + n->pinkb1 + n->pinkb2 + rand * 0.1848f;
- return (tmp * 0.05f);
- }
- else // WhiteNoise
- {
- return rand;
- }
-}
-
-//=================================================================================
-/* Neuron */
-
-void tNeuronSampleRateChanged(tNeuron* nr)
-{
-
-}
-
-void tNeuron_init(tNeuron* const nr)
-{
- _tNeuron* n = *nr = (_tNeuron*) leaf_alloc(sizeof(_tNeuron));
-
- tPoleZero_init(&n->f);
-
- tPoleZero_setBlockZero(&n->f, 0.99f);
-
- n->timeStep = 1.0f / 50.0f;
-
- n->current = 0.0f; // 100.0f for sound
- n->voltage = 0.0f;
-
- n->mode = NeuronNormal;
-
- n->P[0] = 0.0f;
- n->P[1] = 0.0f;
- n->P[2] = 1.0f;
-
- n->V[0] = -12.0f;
- n->V[1] = 115.0f;
- n->V[2] = 10.613f;
-
- n->gK = 36.0f;
- n->gN = 120.0f;
- n->gL = 0.3f;
- n->C = 1.0f;
-
- n->rate[2] = n->gL/n->C;
-}
-
-void tNeuron_free(tNeuron* const nr)
-{
- _tNeuron* n = *nr;
-
- tPoleZero_free(&n->f);
- leaf_free(n);
-}
-
-void tNeuron_initToPool (tNeuron* const nr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNeuron* n = *nr = (_tNeuron*) mpool_alloc(sizeof(_tNeuron), &m->pool);
-
- tPoleZero_initToPool(&n->f, mp);
-
- tPoleZero_setBlockZero(&n->f, 0.99f);
-
- n->timeStep = 1.0f / 50.0f;
-
- n->current = 0.0f; // 100.0f for sound
- n->voltage = 0.0f;
-
- n->mode = NeuronNormal;
-
- n->P[0] = 0.0f;
- n->P[1] = 0.0f;
- n->P[2] = 1.0f;
-
- n->V[0] = -12.0f;
- n->V[1] = 115.0f;
- n->V[2] = 10.613f;
-
- n->gK = 36.0f;
- n->gN = 120.0f;
- n->gL = 0.3f;
- n->C = 1.0f;
-
- n->rate[2] = n->gL/n->C;
-}
-
-void tNeuron_freeFromPool(tNeuron* const nr, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNeuron* n = *nr;
-
- tPoleZero_free(&n->f);
- mpool_free(n, &m->pool);
-}
-
-void tNeuron_reset(tNeuron* const nr)
-{
- _tNeuron* n = *nr;
-
- tPoleZero_setBlockZero(&n->f, 0.99f);
-
- n->timeStep = 1.0f / 50.0f;
-
- n->current = 0.0f; // 100.0f for sound
- n->voltage = 0.0f;
-
- n->mode = NeuronNormal;
-
- n->P[0] = 0.0f;
- n->P[1] = 0.0f;
- n->P[2] = 1.0f;
-
- n->V[0] = -12.0f;
- n->V[1] = 115.0f;
- n->V[2] = 10.613f;
-
- n->gK = 36.0f;
- n->gN = 120.0f;
- n->gL = 0.3f;
- n->C = 1.0f;
-
- n->rate[2] = n->gL/n->C;
-}
-
-void tNeuron_setV1(tNeuron* const nr, float V1)
-{
- _tNeuron* n = *nr;
- n->V[0] = V1;
-}
-
-
-void tNeuron_setV2(tNeuron* const nr, float V2)
-{
- _tNeuron* n = *nr;
- n->V[1] = V2;
-}
-
-void tNeuron_setV3(tNeuron* const nr, float V3)
-{
- _tNeuron* n = *nr;
- n->V[2] = V3;
-}
-
-void tNeuron_setTimeStep(tNeuron* const nr, float timeStep)
-{
- _tNeuron* n = *nr;
- n->timeStep = timeStep;
-}
-
-void tNeuron_setK(tNeuron* const nr, float K)
-{
- _tNeuron* n = *nr;
- n->gK = K;
-}
-
-void tNeuron_setL(tNeuron* const nr, float L)
-{
- _tNeuron* n = *nr;
- n->gL = L;
- n->rate[2] = n->gL/n->C;
-}
-
-void tNeuron_setN(tNeuron* const nr, float N)
-{
- _tNeuron* n = *nr;
- n->gN = N;
-}
-
-void tNeuron_setC(tNeuron* const nr, float C)
-{
- _tNeuron* n = *nr;
- n->C = C;
- n->rate[2] = n->gL/n->C;
-}
-
-float tNeuron_tick(tNeuron* const nr)
-{
- _tNeuron* n = *nr;
-
- float output = 0.0f;
- float voltage = n->voltage;
-
- n->alpha[0] = (0.01f * (10.0f - voltage)) / (expf((10.0f - voltage)/10.0f) - 1.0f);
- n->alpha[1] = (0.1f * (25.0f-voltage)) / (expf((25.0f-voltage)/10.0f) - 1.0f);
- n->alpha[2] = (0.07f * expf((-1.0f * voltage)/20.0f));
-
- n->beta[0] = (0.125f * expf((-1.0f* voltage)/80.0f));
- n->beta[1] = (4.0f * expf((-1.0f * voltage)/18.0f));
- n->beta[2] = (1.0f / (expf((30.0f-voltage)/10.0f) + 1.0f));
-
- for (int i = 0; i < 3; i++)
- {
- n->P[i] = (n->alpha[i] * n->timeStep) + ((1.0f - ((n->alpha[i] + n->beta[i]) * n->timeStep)) * n->P[i]);
-
- if (n->P[i] > 1.0f) n->P[i] = 0.0f;
- else if (n->P[i] < -1.0f) n->P[i] = 0.0f;
- }
- // rate[0]= k ; rate[1] = Na ; rate[2] = l
- n->rate[0] = ((n->gK * powf(n->P[0], 4.0f)) / n->C);
- n->rate[1] = ((n->gN * powf(n->P[1], 3.0f) * n->P[2]) / n->C);
-
- //calculate the final membrane voltage based on the computed variables
- n->voltage = voltage +
- (n->timeStep * n->current / n->C) -
- (n->timeStep * ( n->rate[0] * (voltage - n->V[0]) + n->rate[1] * (voltage - n->V[1]) + n->rate[2] * (voltage - n->V[2])));
-
- if (n->mode == NeuronTanh)
- {
- n->voltage = 100.0f * tanhf(0.01f * n->voltage);
- }
- else if (n->mode == NeuronAaltoShaper)
- {
- float shapeVoltage = 0.01f * n->voltage;
-
- float w, c, xc, xc2, xc4;
-
- float sqrt8 = 2.82842712475f;
-
- float wscale = 1.30612244898f;
- float m_drive = 1.0f;
-
- xc = LEAF_clip(-sqrt8, shapeVoltage, sqrt8);
-
- xc2 = xc*xc;
-
- c = 0.5f * shapeVoltage * (3.0f - (xc2));
-
- xc4 = xc2 * xc2;
-
- w = (1.0f - xc2 * 0.25f + xc4 * 0.015625f) * wscale;
-
- shapeVoltage = w * (c + 0.05f * xc2) * (m_drive + 0.75f);
-
- n->voltage = 100.0f * shapeVoltage;
- }
-
-
- if (n->voltage > 100.0f) n->voltage = 100.0f;
- else if (n->voltage < -100.) n->voltage = -100.0f;
-
- //(inputCurrent + (voltage - ((voltage * timeStep) / timeConstant)) + P[0] + P[1] + P[2]) => voltage;
- // now we should have a result
- //set the output voltage to the "step" ugen, which controls the DAC.
- output = n->voltage * 0.01f; // volts
-
- output = tPoleZero_tick(&n->f, output);
-
- return output;
-
-}
-
-void tNeuron_setMode (tNeuron* const nr, NeuronMode mode)
-{
- _tNeuron* n = *nr;
- n->mode = mode;
-}
-
-void tNeuron_setCurrent (tNeuron* const nr, float current)
-{
- _tNeuron* n = *nr;
- n->current = current;
-}
--- a/LEAF/Src/leaf-physical.c
+++ /dev/null
@@ -1,747 +1,0 @@
-/*==============================================================================
-
- leaf-string.c
- Created: 30 Nov 2018 10:41:42am
- Author: airship
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-physical.h"
-
-#else
-
-#include "../Inc/leaf-physical.h"
-
-#endif
-
-/* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ tPluck ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
-void tPluck_init (tPluck* const pl, float lowestFrequency)
-{
- tPluck_initToPool(pl, lowestFrequency, &leaf_mempool);
-}
-
-void tPluck_free (tPluck* const pl)
-{
- tPluck_freeFromPool(pl, &leaf_mempool);
-}
-
-void tPluck_initToPool (tPluck* const pl, float lowestFrequency, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPluck* p = *pl = (_tPluck*) mpool_alloc(sizeof(_tPluck), &m->pool);
-
- if ( lowestFrequency <= 0.0f ) lowestFrequency = 10.0f;
-
- tNoise_initToPool(&p->noise, WhiteNoise, mp);
-
- tOnePole_initToPool(&p->pickFilter, 0.0f, mp);
-
- tOneZero_initToPool(&p->loopFilter, 0.0f, mp);
-
- tAllpassDelay_initToPool(&p->delayLine, 0.0f, leaf.sampleRate * 2, mp);
- tAllpassDelay_clear(&p->delayLine);
-
- tPluck_setFrequency(pl, 220.0f);
-}
-
-void tPluck_freeFromPool (tPluck* const pl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPluck* p = *pl;
-
- tNoise_freeFromPool(&p->noise, mp);
- tOnePole_freeFromPool(&p->pickFilter, mp);
- tOneZero_freeFromPool(&p->loopFilter, mp);
- tAllpassDelay_freeFromPool(&p->delayLine, mp);
-
- mpool_free(p, &m->pool);
-}
-
-float tPluck_getLastOut (tPluck* const pl)
-{
- _tPluck* p = *pl;
- return p->lastOut;
-}
-
-float tPluck_tick (tPluck* const pl)
-{
- _tPluck* p = *pl;
- return (p->lastOut = 3.0f * tAllpassDelay_tick(&p->delayLine, tOneZero_tick(&p->loopFilter, tAllpassDelay_getLastOut(&p->delayLine) * p->loopGain ) ));
-}
-
-void tPluck_pluck (tPluck* const pl, float amplitude)
-{
- _tPluck* p = *pl;
-
- if ( amplitude < 0.0f) amplitude = 0.0f;
- else if (amplitude > 1.0f) amplitude = 1.0f;
-
- tOnePole_setPole(&p->pickFilter, 0.999f - (amplitude * 0.15f));
- tOnePole_setGain(&p->pickFilter, amplitude * 0.5f );
-
- // Fill delay with noise additively with current contents.
- for ( uint32_t i = 0; i < (uint32_t)tAllpassDelay_getDelay(&p->delayLine); i++ )
- tAllpassDelay_tick(&p->delayLine, 0.6f * tAllpassDelay_getLastOut(&p->delayLine) + tOnePole_tick(&p->pickFilter, tNoise_tick(&p->noise) ) );
-}
-
-// Start a note with the given frequency and amplitude.;
-void tPluck_noteOn (tPluck* const pl, float frequency, float amplitude )
-{
- _tPluck* p = *pl;
- p->lastFreq = frequency;
- tPluck_setFrequency( pl, frequency );
- tPluck_pluck( pl, amplitude );
-}
-
-// Stop a note with the given amplitude (speed of decay).
-void tPluck_noteOff (tPluck* const pl, float amplitude )
-{
- _tPluck* p = *pl;
-
- if ( amplitude < 0.0f) amplitude = 0.0f;
- else if (amplitude > 1.0f) amplitude = 1.0f;
-
- p->loopGain = 1.0f - amplitude;
-}
-
-// Set instrument parameters for a particular frequency.
-void tPluck_setFrequency (tPluck* const pl, float frequency )
-{
- _tPluck* p = *pl;
-
- if ( frequency <= 0.0f ) frequency = 0.001f;
-
- // Delay = length - filter delay.
- float delay = ( leaf.sampleRate / frequency ) - tOneZero_getPhaseDelay(&p->loopFilter, frequency );
-
- tAllpassDelay_setDelay(&p->delayLine, delay );
-
- p->loopGain = 0.99f + (frequency * 0.000005f);
-
- if ( p->loopGain >= 0.999f ) p->loopGain = 0.999f;
-
-}
-
-// Perform the control change specified by \e number and \e value (0.0 - 128.0).
-void tPluck_controlChange (tPluck* const pl, int number, float value)
-{
- return;
-}
-
-void tPluckSampleRateChanged(tPluck* const pl)
-{
- _tPluck* p = *pl;
- tPluck_setFrequency(pl, p->lastFreq);
-}
-
-/* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ tKarplusStrong ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
-void tKarplusStrong_init (tKarplusStrong* const pl, float lowestFrequency)
-{
- tKarplusStrong_initToPool(pl, lowestFrequency, &leaf_mempool);
-}
-
-void tKarplusStrong_free (tKarplusStrong* const pl)
-{
- tKarplusStrong_freeFromPool(pl, &leaf_mempool);
-}
-
-void tKarplusStrong_initToPool (tKarplusStrong* const pl, float lowestFrequency, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tKarplusStrong* p = *pl = (_tKarplusStrong*) mpool_alloc(sizeof(_tKarplusStrong), &m->pool);
-
- if ( lowestFrequency <= 0.0f ) lowestFrequency = 8.0f;
-
- tAllpassDelay_initToPool(&p->delayLine, 0.0f, leaf.sampleRate * 2, mp);
- tAllpassDelay_clear(&p->delayLine);
-
- tLinearDelay_initToPool(&p->combDelay, 0.0f, leaf.sampleRate * 2, mp);
- tLinearDelay_clear(&p->combDelay);
-
- tOneZero_initToPool(&p->filter, 0.0f, mp);
-
- tNoise_initToPool(&p->noise, WhiteNoise, mp);
-
- for (int i = 0; i < 4; i++)
- {
- tBiQuad_initToPool(&p->biquad[i], mp);
- }
-
- p->pluckAmplitude = 0.3f;
- p->pickupPosition = 0.4f;
-
- p->stretching = 0.9999f;
- p->baseLoopGain = 0.995f;
- p->loopGain = 0.999f;
-
- tKarplusStrong_setFrequency( pl, 220.0f );
-}
-
-void tKarplusStrong_freeFromPool (tKarplusStrong* const pl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tKarplusStrong* p = *pl;
-
- tAllpassDelay_freeFromPool(&p->delayLine, mp);
- tLinearDelay_freeFromPool(&p->combDelay, mp);
- tOneZero_freeFromPool(&p->filter, mp);
- tNoise_freeFromPool(&p->noise, mp);
-
- for (int i = 0; i < 4; i++)
- {
- tBiQuad_freeFromPool(&p->biquad[i], mp);
- }
-
- mpool_free(p, &m->pool);
-}
-
-float tKarplusStrong_getLastOut (tKarplusStrong* const pl)
-{
- _tKarplusStrong* p = *pl;
- return p->lastOut;
-}
-
-float tKarplusStrong_tick (tKarplusStrong* const pl)
-{
- _tKarplusStrong* p = *pl;
-
- float temp = tAllpassDelay_getLastOut(&p->delayLine) * p->loopGain;
-
- // Calculate allpass stretching.
- for (int i=0; i<4; i++) temp = tBiQuad_tick(&p->biquad[i],temp);
-
- // Moving average filter.
- temp = tOneZero_tick(&p->filter, temp);
-
- float out = tAllpassDelay_tick(&p->delayLine, temp);
- out = out - tLinearDelay_tick(&p->combDelay, out);
- p->lastOut = out;
-
- return p->lastOut;
-}
-
-void tKarplusStrong_pluck (tKarplusStrong* const pl, float amplitude)
-{
- _tKarplusStrong* p = *pl;
-
- if ( amplitude < 0.0f) amplitude = 0.0f;
- else if (amplitude > 1.0f) amplitude = 1.0f;
-
- p->pluckAmplitude = amplitude;
-
- for ( uint32_t i=0; i < (uint32_t)tAllpassDelay_getDelay(&p->delayLine); i++ )
- {
- // Fill delay with noise additively with current contents.
- tAllpassDelay_tick(&p->delayLine, (tAllpassDelay_getLastOut(&p->delayLine) * 0.6f) + 0.4f * tNoise_tick(&p->noise) * p->pluckAmplitude );
- //delayLine_.tick( combDelay_.tick((delayLine_.lastOut() * 0.6) + 0.4 * noise->tick() * pluckAmplitude_) );
- }
-}
-
-// Start a note with the given frequency and amplitude.;
-void tKarplusStrong_noteOn (tKarplusStrong* const pl, float frequency, float amplitude )
-{
- tKarplusStrong_setFrequency( pl, frequency );
- tKarplusStrong_pluck( pl, amplitude );
-}
-
-// Stop a note with the given amplitude (speed of decay).
-void tKarplusStrong_noteOff (tKarplusStrong* const pl, float amplitude )
-{
- _tKarplusStrong* p = *pl;
-
- if ( amplitude < 0.0f) amplitude = 0.0f;
- else if (amplitude > 1.0f) amplitude = 1.0f;
-
- p->loopGain = 1.0f - amplitude;
-}
-
-// Set instrument parameters for a particular frequency.
-void tKarplusStrong_setFrequency (tKarplusStrong* const pl, float frequency )
-{
- _tKarplusStrong* p = *pl;
-
- if ( frequency <= 0.0f ) frequency = 0.001f;
-
- p->lastFrequency = frequency;
- p->lastLength = leaf.sampleRate / p->lastFrequency;
- float delay = p->lastLength - 0.5f;
- tAllpassDelay_setDelay(&p->delayLine, delay);
-
- // MAYBE MODIFY LOOP GAINS
- p->loopGain = p->baseLoopGain + (frequency * 0.000005f);
- if (p->loopGain >= 1.0f) p->loopGain = 0.99999f;
-
- tKarplusStrong_setStretch(pl, p->stretching);
-
- tLinearDelay_setDelay(&p->combDelay, 0.5f * p->pickupPosition * p->lastLength );
-
-}
-
-// Set the stretch "factor" of the string (0.0 - 1.0).
-void tKarplusStrong_setStretch (tKarplusStrong* const pl, float stretch )
-{
- _tKarplusStrong* p = *pl;
-
- p->stretching = stretch;
- float coefficient;
- float freq = p->lastFrequency * 2.0f;
- float dFreq = ( (0.5f * leaf.sampleRate) - freq ) * 0.25f;
- float temp = 0.5f + (stretch * 0.5f);
- if ( temp > 0.9999f ) temp = 0.9999f;
-
- for ( int i=0; i<4; i++ )
- {
- coefficient = temp * temp;
- tBiQuad_setA2(&p->biquad[i], coefficient);
- tBiQuad_setB0(&p->biquad[i], coefficient);
- tBiQuad_setB2(&p->biquad[i], 1.0f);
-
- coefficient = -2.0f * temp * cos(TWO_PI * freq / leaf.sampleRate);
- tBiQuad_setA1(&p->biquad[i], coefficient);
- tBiQuad_setB1(&p->biquad[i], coefficient);
-
- freq += dFreq;
- }
-}
-
-// Set the pluck or "excitation" position along the string (0.0 - 1.0).
-void tKarplusStrong_setPickupPosition (tKarplusStrong* const pl, float position )
-{
- _tKarplusStrong* p = *pl;
-
- if (position < 0.0f) p->pickupPosition = 0.0f;
- else if (position <= 1.0f) p->pickupPosition = position;
- else p->pickupPosition = 1.0f;
-
- tLinearDelay_setDelay(&p->combDelay, 0.5f * p->pickupPosition * p->lastLength);
-}
-
-// Set the base loop gain.
-void tKarplusStrong_setBaseLoopGain (tKarplusStrong* const pl, float aGain )
-{
- _tKarplusStrong* p = *pl;
-
- p->baseLoopGain = aGain;
- p->loopGain = p->baseLoopGain + (p->lastFrequency * 0.000005f);
- if ( p->loopGain > 0.99999f ) p->loopGain = 0.99999f;
-}
-
-// Perform the control change specified by \e number and \e value (0.0 - 128.0).
-void tKarplusStrong_controlChange (tKarplusStrong* const pl, SKControlType type, float value)
-{
- if ( value < 0.0f ) value = 0.0f;
- else if (value > 128.0f) value = 128.0f;
-
- float normalizedValue = value * INV_128;
-
- if (type == SKPickPosition) // 4
- tKarplusStrong_setPickupPosition( pl, normalizedValue );
- else if (type == SKStringDamping) // 11
- tKarplusStrong_setBaseLoopGain( pl, 0.97f + (normalizedValue * 0.03f) );
- else if (type == SKDetune) // 1
- tKarplusStrong_setStretch( pl, 0.91f + (0.09f * (1.0f - normalizedValue)) );
-}
-
-void tKarplusStrongSampleRateChanged (tKarplusStrong* const pl)
-{
- _tKarplusStrong* p = *pl;
-
- tKarplusStrong_setFrequency(pl, p->lastFrequency);
- tKarplusStrong_setStretch(pl, p->stretching);
-}
-
-/* Simple Living String*/
-
-void tSimpleLivingString_init(tSimpleLivingString* const pl, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode)
-{
- tSimpleLivingString_initToPool(pl, freq, dampFreq, decay, targetLev, levSmoothFactor, levStrength, levMode, &leaf_mempool);
-}
-
-void tSimpleLivingString_free(tSimpleLivingString* const pl)
-{
- tSimpleLivingString_freeFromPool(pl, &leaf_mempool);
-}
-
-void tSimpleLivingString_initToPool (tSimpleLivingString* const pl, float freq, float dampFreq,
- float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSimpleLivingString* p = *pl = (_tSimpleLivingString*) mpool_alloc(sizeof(_tSimpleLivingString), &m->pool);
-
- p->curr=0.0f;
- tExpSmooth_initToPool(&p->wlSmooth, leaf.sampleRate/freq, 0.01, mp); // smoother for string wavelength (not freq, to avoid expensive divisions)
- tSimpleLivingString_setFreq(pl, freq);
- tLinearDelay_initToPool(&p->delayLine,p->waveLengthInSamples, 2400, mp);
- tLinearDelay_clear(&p->delayLine);
- tOnePole_initToPool(&p->bridgeFilter, dampFreq, mp);
- tHighpass_initToPool(&p->DCblocker,13, mp);
- p->decay=decay;
- tFeedbackLeveler_initToPool(&p->fbLev, targetLev, levSmoothFactor, levStrength, levMode, mp);
- p->levMode=levMode;
-}
-
-void tSimpleLivingString_freeFromPool (tSimpleLivingString* const pl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSimpleLivingString* p = *pl;
-
- tExpSmooth_freeFromPool(&p->wlSmooth, mp);
- tLinearDelay_freeFromPool(&p->delayLine, mp);
- tOnePole_freeFromPool(&p->bridgeFilter, mp);
- tHighpass_freeFromPool(&p->DCblocker, mp);
- tFeedbackLeveler_freeFromPool(&p->fbLev, mp);
-
- mpool_free(p, &m->pool);
-}
-
-void tSimpleLivingString_setFreq(tSimpleLivingString* const pl, float freq)
-{
- _tSimpleLivingString* p = *pl;
-
- if (freq<20) freq=20;
- else if (freq>10000) freq=10000;
- p->waveLengthInSamples = leaf.sampleRate/freq;
- tExpSmooth_setDest(&p->wlSmooth, p->waveLengthInSamples);
-}
-
-void tSimpleLivingString_setWaveLength(tSimpleLivingString* const pl, float waveLength)
-{
- _tSimpleLivingString* p = *pl;
-
- if (waveLength<4.8) waveLength=4.8;
- else if (waveLength>2400) waveLength=2400;
- p->waveLengthInSamples = waveLength;
- tExpSmooth_setDest(&p->wlSmooth, p->waveLengthInSamples);
-}
-
-void tSimpleLivingString_setDampFreq(tSimpleLivingString* const pl, float dampFreq)
-{
- _tSimpleLivingString* p = *pl;
- tOnePole_setFreq(&p->bridgeFilter, dampFreq);
-}
-
-void tSimpleLivingString_setDecay(tSimpleLivingString* const pl, float decay)
-{
- _tSimpleLivingString* p = *pl;
- p->decay=decay;
-}
-
-void tSimpleLivingString_setTargetLev(tSimpleLivingString* const pl, float targetLev)
-{
- _tSimpleLivingString* p = *pl;
- tFeedbackLeveler_setTargetLevel(&p->fbLev, targetLev);
-}
-
-void tSimpleLivingString_setLevSmoothFactor(tSimpleLivingString* const pl, float levSmoothFactor)
-{
- _tSimpleLivingString* p = *pl;
- tFeedbackLeveler_setFactor(&p->fbLev, levSmoothFactor);
-}
-
-void tSimpleLivingString_setLevStrength(tSimpleLivingString* const pl, float levStrength)
-{
- _tSimpleLivingString* p = *pl;
- tFeedbackLeveler_setStrength(&p->fbLev, levStrength);
-}
-
-void tSimpleLivingString_setLevMode(tSimpleLivingString* const pl, int levMode)
-{
- _tSimpleLivingString* p = *pl;
- tFeedbackLeveler_setMode(&p->fbLev, levMode);
- p->levMode=levMode;
-}
-
-float tSimpleLivingString_tick(tSimpleLivingString* const pl, float input)
-{
- _tSimpleLivingString* p = *pl;
-
- float stringOut=tOnePole_tick(&p->bridgeFilter,tLinearDelay_tickOut(&p->delayLine));
- float stringInput=tHighpass_tick(&p->DCblocker, tFeedbackLeveler_tick(&p->fbLev, (p->levMode==0?p->decay*stringOut:stringOut)+input));
- tLinearDelay_tickIn(&p->delayLine, stringInput);
- tLinearDelay_setDelay(&p->delayLine, tExpSmooth_tick(&p->wlSmooth));
- p->curr = stringOut;
- return p->curr;
-}
-
-float tSimpleLivingString_sample(tSimpleLivingString* const pl)
-{
- _tSimpleLivingString* p = *pl;
- return p->curr;
-}
-
-/* Living String*/
-
-void tLivingString_init(tLivingString* const pl, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode)
-{
- tLivingString_initToPool(pl, freq, pickPos, prepIndex, dampFreq, decay, targetLev, levSmoothFactor, levStrength, levMode, &leaf_mempool);
-}
-
-void tLivingString_free(tLivingString* const pl)
-{
- tLivingString_freeFromPool(pl, &leaf_mempool);
-}
-
-void tLivingString_initToPool (tLivingString* const pl, float freq, float pickPos, float prepIndex,
- float dampFreq, float decay, float targetLev, float levSmoothFactor,
- float levStrength, int levMode, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLivingString* p = *pl = (_tLivingString*) mpool_alloc(sizeof(_tLivingString), &m->pool);
-
- p->curr=0.0f;
- tExpSmooth_initToPool(&p->wlSmooth, leaf.sampleRate/freq, 0.01, mp); // smoother for string wavelength (not freq, to avoid expensive divisions)
- tLivingString_setFreq(pl, freq);
- p->freq = freq;
- tExpSmooth_initToPool(&p->ppSmooth, pickPos, 0.01, mp); // smoother for pick position
- tLivingString_setPickPos(pl, pickPos);
- p->prepIndex=prepIndex;
- tLinearDelay_initToPool(&p->delLF,p->waveLengthInSamples, 2400, mp);
- tLinearDelay_initToPool(&p->delUF,p->waveLengthInSamples, 2400, mp);
- tLinearDelay_initToPool(&p->delUB,p->waveLengthInSamples, 2400, mp);
- tLinearDelay_initToPool(&p->delLB,p->waveLengthInSamples, 2400, mp);
- tLinearDelay_clear(&p->delLF);
- tLinearDelay_clear(&p->delUF);
- tLinearDelay_clear(&p->delUB);
- tLinearDelay_clear(&p->delLB);
- p->dampFreq = dampFreq;
- tOnePole_initToPool(&p->bridgeFilter, dampFreq, mp);
- tOnePole_initToPool(&p->nutFilter, dampFreq, mp);
- tOnePole_initToPool(&p->prepFilterU, dampFreq, mp);
- tOnePole_initToPool(&p->prepFilterL, dampFreq, mp);
- tHighpass_initToPool(&p->DCblockerU,13, mp);
- tHighpass_initToPool(&p->DCblockerL,13, mp);
- p->decay=decay;
- p->prepIndex = prepIndex;
- tFeedbackLeveler_initToPool(&p->fbLevU, targetLev, levSmoothFactor, levStrength, levMode, mp);
- tFeedbackLeveler_initToPool(&p->fbLevL, targetLev, levSmoothFactor, levStrength, levMode, mp);
- p->levMode=levMode;
-}
-
-void tLivingString_freeFromPool (tLivingString* const pl, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tLivingString* p = *pl;
-
- tExpSmooth_freeFromPool(&p->wlSmooth, mp);
- tExpSmooth_freeFromPool(&p->ppSmooth, mp);
- tLinearDelay_freeFromPool(&p->delLF, mp);
- tLinearDelay_freeFromPool(&p->delUF, mp);
- tLinearDelay_freeFromPool(&p->delUB, mp);
- tLinearDelay_freeFromPool(&p->delLB, mp);
- tOnePole_freeFromPool(&p->bridgeFilter, mp);
- tOnePole_freeFromPool(&p->nutFilter, mp);
- tOnePole_freeFromPool(&p->prepFilterU, mp);
- tOnePole_freeFromPool(&p->prepFilterL, mp);
- tHighpass_freeFromPool(&p->DCblockerU, mp);
- tHighpass_freeFromPool(&p->DCblockerL, mp);
- tFeedbackLeveler_freeFromPool(&p->fbLevU, mp);
- tFeedbackLeveler_freeFromPool(&p->fbLevL, mp);
-
- mpool_free(p, &m->pool);
-}
-
-void tLivingString_setFreq(tLivingString* const pl, float freq)
-{ // NOTE: It is faster to set wavelength in samples directly
- _tLivingString* p = *pl;
- if (freq<20) freq=20;
- else if (freq>10000) freq=10000;
- p->waveLengthInSamples = leaf.sampleRate/freq;
- tExpSmooth_setDest(&p->wlSmooth, p->waveLengthInSamples);
-}
-
-void tLivingString_setWaveLength(tLivingString* const pl, float waveLength)
-{
- _tLivingString* p = *pl;
- if (waveLength<4.8) waveLength=4.8;
- else if (waveLength>2400) waveLength=2400;
- p->waveLengthInSamples = waveLength;
- tExpSmooth_setDest(&p->wlSmooth, p->waveLengthInSamples);
-}
-
-void tLivingString_setPickPos(tLivingString* const pl, float pickPos)
-{ // between 0 and 1
- _tLivingString* p = *pl;
- if (pickPos<0.f) pickPos=0.f;
- else if (pickPos>1.f) pickPos=1.f;
- p->pickPos = pickPos;
- tExpSmooth_setDest(&p->ppSmooth, p->pickPos);
-}
-
-void tLivingString_setPrepIndex(tLivingString* const pl, float prepIndex)
-{ // between 0 and 1
- _tLivingString* p = *pl;
- if (prepIndex<0.f) prepIndex=0.f;
- else if (prepIndex>1.f) prepIndex=1.f;
- p->prepIndex = prepIndex;
-}
-
-void tLivingString_setDampFreq(tLivingString* const pl, float dampFreq)
-{
- _tLivingString* p = *pl;
- tOnePole_setFreq(&p->bridgeFilter, dampFreq);
- tOnePole_setFreq(&p->nutFilter, dampFreq);
- tOnePole_setFreq(&p->prepFilterU, dampFreq);
- tOnePole_setFreq(&p->prepFilterL, dampFreq);
-}
-
-void tLivingString_setDecay(tLivingString* const pl, float decay)
-{
- _tLivingString* p = *pl;
- p->decay=decay;
-}
-
-void tLivingString_setTargetLev(tLivingString* const pl, float targetLev)
-{
- _tLivingString* p = *pl;
- tFeedbackLeveler_setTargetLevel(&p->fbLevU, targetLev);
- tFeedbackLeveler_setTargetLevel(&p->fbLevL, targetLev);
-}
-
-void tLivingString_setLevSmoothFactor(tLivingString* const pl, float levSmoothFactor)
-{
- _tLivingString* p = *pl;
- tFeedbackLeveler_setFactor(&p->fbLevU, levSmoothFactor);
- tFeedbackLeveler_setFactor(&p->fbLevL, levSmoothFactor);
-}
-
-void tLivingString_setLevStrength(tLivingString* const pl, float levStrength)
-{
- _tLivingString* p = *pl;
- tFeedbackLeveler_setStrength(&p->fbLevU, levStrength);
- tFeedbackLeveler_setStrength(&p->fbLevL, levStrength);
-}
-
-void tLivingString_setLevMode(tLivingString* const pl, int levMode)
-{
- _tLivingString* p = *pl;
- tFeedbackLeveler_setMode(&p->fbLevU, levMode);
- tFeedbackLeveler_setMode(&p->fbLevL, levMode);
- p->levMode=levMode;
-}
-
-float tLivingString_tick(tLivingString* const pl, float input)
-{
- _tLivingString* p = *pl;
-
- // from pickPos upwards=forwards
- float fromLF=tLinearDelay_tickOut(&p->delLF);
- float fromUF=tLinearDelay_tickOut(&p->delUF);
- float fromUB=tLinearDelay_tickOut(&p->delUB);
- float fromLB=tLinearDelay_tickOut(&p->delLB);
- // into upper half of string, from nut, going backwards
- float fromNut=-tFeedbackLeveler_tick(&p->fbLevU, (p->levMode==0?p->decay:1)*tHighpass_tick(&p->DCblockerU, tOnePole_tick(&p->nutFilter, fromUF)));
- tLinearDelay_tickIn(&p->delUB, fromNut);
- // into lower half of string, from pickpoint, going backwards
- float fromLowerPrep=-tOnePole_tick(&p->prepFilterL, fromLF);
- float intoLower=p->prepIndex*fromLowerPrep+(1.0f - p->prepIndex)*fromUB+input;
- tLinearDelay_tickIn(&p->delLB, intoLower);
- // into lower half of string, from bridge
- float fromBridge=-tFeedbackLeveler_tick(&p->fbLevL, (p->levMode==0?p->decay:1.0f)*tHighpass_tick(&p->DCblockerL, tOnePole_tick(&p->bridgeFilter, fromLB)));
- tLinearDelay_tickIn(&p->delLF, fromBridge);
- // into upper half of string, from pickpoint, going forwards/upwards
- float fromUpperPrep=-tOnePole_tick(&p->prepFilterU, fromUB);
- float intoUpper=p->prepIndex*fromUpperPrep+(1.0f - p->prepIndex)*fromLF+input;
- tLinearDelay_tickIn(&p->delUF, intoUpper);
- // update all delay lengths
- float pickP=tExpSmooth_tick(&p->ppSmooth);
- float wLen=tExpSmooth_tick(&p->wlSmooth);
- float lowLen=pickP*wLen;
- float upLen=(1.0f-pickP)*wLen;
- tLinearDelay_setDelay(&p->delLF, lowLen);
- tLinearDelay_setDelay(&p->delLB, lowLen);
- tLinearDelay_setDelay(&p->delUF, upLen);
- tLinearDelay_setDelay(&p->delUB, upLen);
- p->curr = fromBridge;
- return p->curr;
-}
-
-float tLivingString_sample(tLivingString* const pl)
-{
- _tLivingString* p = *pl;
- return p->curr;
-}
-
-///Reed Table model
-//default values from STK are 0.6 offset and -0.8 slope
-
-void tReedTable_init (tReedTable* const pm, float offset, float slope)
-{
- _tReedTable* p = *pm = (_tReedTable*) leaf_alloc(sizeof(_tReedTable));
-
- p->offset = offset;
- p->slope = slope;
-}
-
-void tReedTable_free (tReedTable* const pm)
-{
- _tReedTable* p = *pm;
-
- leaf_free(p);
-}
-
-void tReedTable_initToPool (tReedTable* const pm, float offset, float slope, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tReedTable* p = *pm = (_tReedTable*) mpool_alloc(sizeof(_tReedTable), &m->pool);
-
- p->offset = offset;
- p->slope = slope;
-}
-
-void tReedTable_freeFromPool (tReedTable* const pm, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tReedTable* p = *pm;
-
- mpool_free(p, &m->pool);
-}
-
-float tReedTable_tick (tReedTable* const pm, float input)
-{
- _tReedTable* p = *pm;
-
- // The input is differential pressure across the reed.
- float output = p->offset + (p->slope * input);
-
- // If output is > 1, the reed has slammed shut and the
- // reflection function value saturates at 1.0.
- if ( output > 1.0f) output = 1.0f;
-
- // This is nearly impossible in a physical system, but
- // a reflection function value of -1.0 corresponds to
- // an open end (and no discontinuity in bore profile).
- if ( output < -1.0f) output = -1.0f;
-
- return output;
-}
-
-float tReedTable_tanh_tick (tReedTable* const pm, float input)
-{
- _tReedTable* p = *pm;
-
- // The input is differential pressure across the reed.
- float output = p->offset + (p->slope * input);
-
- // If output is > 1, the reed has slammed shut and the
- // reflection function value saturates at 1.0.
- return tanhf(output);
-}
-
-void tReedTable_setOffset (tReedTable* const pm, float offset)
-{
- _tReedTable* p = *pm;
- p->offset = offset;
-}
-
-void tReedTable_setSlope (tReedTable* const pm, float slope)
-{
- _tReedTable* p = *pm;
- p->slope = slope;
-}
--- a/LEAF/Src/leaf-reverb.c
+++ /dev/null
@@ -1,925 +1,0 @@
-/*==============================================================================
-
- leaf-reverb.c
- Created: 20 Jan 2017 12:02:04pm
- Author: Michael R Mulshine
-
-==============================================================================*/
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-reverb.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-reverb.h"
-#include "../leaf.h"
-
-#endif
-
-// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ PRCReverb ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ //
-void tPRCReverb_init(tPRCReverb* const rev, float t60)
-{
- _tPRCReverb* r = *rev = (_tPRCReverb*) leaf_alloc(sizeof(_tPRCReverb));
-
- if (t60 <= 0.0f) t60 = 0.001f;
-
- r->inv_441 = 1.0f/44100.0f;
-
- int lengths[4] = { 341, 613, 1557, 2137 }; // Delay lengths for 44100 Hz sample rate.
- double scaler = leaf.sampleRate * r->inv_441;
-
- int delay, i;
- if (scaler != 1.0f)
- {
- for (i=0; i<4; i++)
- {
- delay = (int) scaler * lengths[i];
-
- if ( (delay & 1) == 0) delay++;
-
- while ( !LEAF_isPrime(delay) ) delay += 2;
-
- lengths[i] = delay;
- }
- }
-
- tDelay_init(&r->allpassDelays[0], lengths[0], lengths[0] * 2);
- tDelay_init(&r->allpassDelays[1], lengths[1], lengths[1] * 2);
- tDelay_init(&r->combDelay, lengths[2], lengths[2] * 2);
-
- tPRCReverb_setT60(rev, t60);
-
- r->allpassCoeff = 0.7f;
- r->mix = 0.5f;
-}
-
-void tPRCReverb_free(tPRCReverb* const rev)
-{
- _tPRCReverb* r = *rev;
-
- tDelay_free(&r->allpassDelays[0]);
- tDelay_free(&r->allpassDelays[1]);
- tDelay_free(&r->combDelay);
- leaf_free(r);
-}
-
-void tPRCReverb_initToPool (tPRCReverb* const rev, float t60, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPRCReverb* r = *rev = (_tPRCReverb*) mpool_alloc(sizeof(_tPRCReverb), &m->pool);
-
- if (t60 <= 0.0f) t60 = 0.001f;
-
- r->inv_441 = 1.0f/44100.0f;
-
- int lengths[4] = { 341, 613, 1557, 2137 }; // Delay lengths for 44100 Hz sample rate.
- double scaler = leaf.sampleRate * r->inv_441;
-
- int delay, i;
- if (scaler != 1.0f)
- {
- for (i=0; i<4; i++)
- {
- delay = (int) scaler * lengths[i];
-
- if ( (delay & 1) == 0) delay++;
-
- while ( !LEAF_isPrime(delay) ) delay += 2;
-
- lengths[i] = delay;
- }
- }
-
- tDelay_initToPool(&r->allpassDelays[0], lengths[0], lengths[0] * 2, mp);
- tDelay_initToPool(&r->allpassDelays[1], lengths[1], lengths[1] * 2, mp);
- tDelay_initToPool(&r->combDelay, lengths[2], lengths[2] * 2, mp);
-
- tPRCReverb_setT60(rev, t60);
-
- r->allpassCoeff = 0.7f;
- r->mix = 0.5f;
-}
-
-void tPRCReverb_freeFromPool (tPRCReverb* const rev, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tPRCReverb* r = *rev;
-
- tDelay_freeFromPool(&r->allpassDelays[0], mp);
- tDelay_freeFromPool(&r->allpassDelays[1], mp);
- tDelay_freeFromPool(&r->combDelay, mp);
- mpool_free(r, &m->pool);
-}
-
-void tPRCRevert_clear(tPRCReverb* const rev)
-{
- _tPRCReverb* r = *rev;
-
- tDelay_clear(&r->allpassDelays[0]);
- tDelay_clear(&r->allpassDelays[1]);
- tDelay_clear(&r->combDelay);
-}
-
-void tPRCReverb_setT60(tPRCReverb* const rev, float t60)
-{
- _tPRCReverb* r = *rev;
-
- if ( t60 <= 0.0f ) t60 = 0.001f;
-
- r->t60 = t60;
-
- r->combCoeff = pow(10.0f, (-3.0f * tDelay_getDelay(&r->combDelay) * leaf.invSampleRate / t60 ));
-
-}
-
-void tPRCReverb_setMix(tPRCReverb* const rev, float mix)
-{
- _tPRCReverb* r = *rev;
- r->mix = mix;
-}
-
-float tPRCReverb_tick(tPRCReverb* const rev, float input)
-{
- _tPRCReverb* r = *rev;
-
- float temp, temp0, temp1, temp2;
- float out;
-
- r->lastIn = input;
-
- temp = tDelay_getLastOut(&r->allpassDelays[0]);
- temp0 = r->allpassCoeff * temp;
- temp0 += input;
- tDelay_tick(&r->allpassDelays[0], temp0);
- temp0 = -( r->allpassCoeff * temp0) + temp;
-
- temp = tDelay_getLastOut(&r->allpassDelays[1]);
- temp1 = r->allpassCoeff * temp;
- temp1 += temp0;
- tDelay_tick(&r->allpassDelays[1], temp1);
- temp1 = -(r->allpassCoeff * temp1) + temp;
-
- temp2 = temp1 + ( r->combCoeff * tDelay_getLastOut(&r->combDelay));
-
- out = r->mix * tDelay_tick(&r->combDelay, temp2);
-
- temp = (1.0f - r->mix) * input;
-
- out += temp;
-
- r->lastOut = out;
-
- return out;
-}
-
-void tPRCReverbSampleRateChanged (tPRCReverb* const rev)
-{
- _tPRCReverb* r = *rev;
- r->combCoeff = pow(10.0f, (-3.0f * tDelay_getDelay(&r->combDelay) * leaf.invSampleRate / r->t60 ));
-}
-
-/* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ NReverb ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
-void tNReverb_init(tNReverb* const rev, float t60)
-{
- _tNReverb* r = *rev = (_tNReverb*) leaf_alloc(sizeof(_tNReverb));
-
- if (t60 <= 0.0f) t60 = 0.001f;
-
- r->inv_441 = 1.0f/44100.0f;
-
- int lengths[15] = {1433, 1601, 1867, 2053, 2251, 2399, 347, 113, 37, 59, 53, 43, 37, 29, 19}; // Delay lengths for 44100 Hz sample rate.
- double scaler = leaf.sampleRate / 25641.0f;
-
- int delay, i;
-
- for (i=0; i < 15; i++)
- {
- delay = (int) scaler * lengths[i];
- if ( (delay & 1) == 0)
- delay++;
- while ( !LEAF_isPrime(delay) )
- delay += 2;
- lengths[i] = delay;
- }
-
- for ( i=0; i<6; i++ )
- {
- tLinearDelay_init(&r->combDelays[i], lengths[i], lengths[i] * 2.0f);
- tLinearDelay_clear(&r->combDelays[i]);
- r->combCoeffs[i] = pow(10.0, (-3 * lengths[i] * leaf.invSampleRate / t60));
- }
-
- for ( i=0; i<8; i++ )
- {
- tLinearDelay_init(&r->allpassDelays[i], lengths[i+6], lengths[i+6] * 2.0f);
- tLinearDelay_clear(&r->allpassDelays[i]);
- }
-
-
- tNReverb_setT60(rev, t60);
- r->allpassCoeff = 0.7f;
- r->mix = 0.3f;
-}
-
-void tNReverb_free(tNReverb* const rev)
-{
- _tNReverb* r = *rev;
-
- for (int i = 0; i < 6; i++)
- {
- tLinearDelay_free(&r->combDelays[i]);
- }
-
- for (int i = 0; i < 8; i++)
- {
- tLinearDelay_free(&r->allpassDelays[i]);
- }
-
- leaf_free(r);
-}
-
-void tNReverb_initToPool (tNReverb* const rev, float t60, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNReverb* r = *rev = (_tNReverb*) mpool_alloc(sizeof(_tNReverb), &m->pool);
-
- if (t60 <= 0.0f) t60 = 0.001f;
-
- r->inv_441 = 1.0f/44100.0f;
-
- int lengths[15] = {1433, 1601, 1867, 2053, 2251, 2399, 347, 113, 37, 59, 53, 43, 37, 29, 19}; // Delay lengths for 44100 Hz sample rate.
- double scaler = leaf.sampleRate / 25641.0f;
-
- int delay, i;
-
- for (i=0; i < 15; i++)
- {
- delay = (int) scaler * lengths[i];
- if ( (delay & 1) == 0)
- delay++;
- while ( !LEAF_isPrime(delay) )
- delay += 2;
- lengths[i] = delay;
- }
-
- for ( i=0; i<6; i++ )
- {
- tLinearDelay_initToPool(&r->combDelays[i], lengths[i], lengths[i] * 2.0f, mp);
- r->combCoeffs[i] = pow(10.0, (-3 * lengths[i] * leaf.invSampleRate / t60));
- }
-
- for ( i=0; i<8; i++ )
- {
- tLinearDelay_initToPool(&r->allpassDelays[i], lengths[i+6], lengths[i+6] * 2.0f, mp);
- }
-
-
- tNReverb_setT60(rev, t60);
- r->allpassCoeff = 0.7f;
- r->mix = 0.3f;
-}
-
-void tNReverb_freeFromPool (tNReverb* const rev, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tNReverb* r = *rev;
-
- for (int i = 0; i < 6; i++)
- {
- tLinearDelay_freeFromPool(&r->combDelays[i], mp);
- }
-
- for (int i = 0; i < 8; i++)
- {
- tLinearDelay_freeFromPool(&r->allpassDelays[i], mp);
- }
-
- mpool_free(r, &m->pool);
-}
-
-void tNReverb_setT60(tNReverb* const rev, float t60)
-{
- _tNReverb* r = *rev;
-
- if (t60 <= 0.0f) t60 = 0.001f;
-
- r->t60 = t60;
-
- for (int i=0; i<6; i++) r->combCoeffs[i] = pow(10.0, (-3.0 * tLinearDelay_getDelay(&r->combDelays[i]) * leaf.invSampleRate / t60 ));
-
-}
-
-void tNReverb_setMix(tNReverb* const rev, float mix)
-{
- _tNReverb* r = *rev;
- r->mix = mix;
-}
-
-void tNReverb_clear (tNReverb* const rev)
-{
- _tNReverb* r = *rev;
-
- for (int i = 0; i < 6; i++)
- {
- tLinearDelay_clear(&r->combDelays[i]);
- }
-
- for (int i = 0; i < 8; i++)
- {
- tLinearDelay_clear(&r->allpassDelays[i]);
- }
-}
-
-float tNReverb_tick(tNReverb* const rev, float input)
-{
- _tNReverb* r = *rev;
- r->lastIn = input;
-
- float temp, temp0, temp1, temp2, out;
- int i;
-
- temp0 = 0.0;
- for ( i=0; i<6; i++ )
- {
- temp = input + (r->combCoeffs[i] * tLinearDelay_getLastOut(&r->combDelays[i]));
- temp0 += tLinearDelay_tick(&r->combDelays[i],temp);
- }
-
- for ( i=0; i<3; i++ )
- {
- temp = tLinearDelay_getLastOut(&r->allpassDelays[i]);
- temp1 = r->allpassCoeff * temp;
- temp1 += temp0;
- tLinearDelay_tick(&r->allpassDelays[i], temp1);
- temp0 = -(r->allpassCoeff * temp1) + temp;
- }
-
- // One-pole lowpass filter.
- r->lowpassState = 0.7f * r->lowpassState + 0.3f * temp0;
-
- temp = tLinearDelay_getLastOut(&r->allpassDelays[3]);
- temp1 = r->allpassCoeff * temp;
- temp1 += r->lowpassState;
- tLinearDelay_tick(&r->allpassDelays[3], temp1 );
- temp1 = -(r->allpassCoeff * temp1) + temp;
-
- temp = tLinearDelay_getLastOut(&r->allpassDelays[4]);
- temp2 = r->allpassCoeff * temp;
- temp2 += temp1;
- tLinearDelay_tick(&r->allpassDelays[4], temp2 );
- out = -( r->allpassCoeff * temp2 ) + temp ;
-
- //the other channel in stereo version below
-/*
- temp = tLinearDelay_getLastOut(&r->allpassDelays[5]);
- temp3 = r->allpassCoeff * temp;
- temp3 += temp1;
- tLinearDelay_tick(&r->allpassDelays[5], temp3 );
- out = r->mix *( - ( r->allpassCoeff * temp3 ) + temp );
-*/
-
- temp = ( 1.0f - r->mix ) * input;
-
- out += temp;
-
- r->lastOut = out;
-
- return out;
-}
-
-void tNReverb_tickStereo(tNReverb* const rev, float input, float* output)
-{
- _tNReverb* r = *rev;
- r->lastIn = input;
-
- float temp, temp0, temp1, temp2, temp3, out;
- int i;
-
- temp0 = 0.0;
- for ( i=0; i<6; i++ )
- {
- temp = input + (r->combCoeffs[i] * tLinearDelay_getLastOut(&r->combDelays[i]));
- temp0 += tLinearDelay_tick(&r->combDelays[i],temp);
- }
-
- for ( i=0; i<3; i++ )
- {
- temp = tLinearDelay_getLastOut(&r->allpassDelays[i]);
- temp1 = r->allpassCoeff * temp;
- temp1 += temp0;
- tLinearDelay_tick(&r->allpassDelays[i], temp1);
- temp0 = -(r->allpassCoeff * temp1) + temp;
- }
-
- // One-pole lowpass filter.
- r->lowpassState = 0.7f * r->lowpassState + 0.3f * temp0;
-
- temp = tLinearDelay_getLastOut(&r->allpassDelays[3]);
- temp1 = r->allpassCoeff * temp;
- temp1 += r->lowpassState;
- tLinearDelay_tick(&r->allpassDelays[3], temp1 );
- temp1 = -(r->allpassCoeff * temp1) + temp;
-
- float drymix = ( 1.0f - r->mix ) * input;
-
- temp = tLinearDelay_getLastOut(&r->allpassDelays[4]);
- temp2 = r->allpassCoeff * temp;
- temp2 += temp1;
- tLinearDelay_tick(&r->allpassDelays[4], temp2 );
- output[0] = -( r->allpassCoeff * temp2 ) + temp + drymix;
- out = output[0];
-
-
- temp = tLinearDelay_getLastOut(&r->allpassDelays[5]);
- temp3 = r->allpassCoeff * temp;
- temp3 += temp1;
- tLinearDelay_tick(&r->allpassDelays[5], temp3 );
- output[1] = r->mix *( - ( r->allpassCoeff * temp3 ) + temp + drymix);
-
- r->lastOut = out;
-}
-
-void tNReverbSampleRateChanged (tNReverb* const rev)
-{
- _tNReverb* r = *rev;
- for (int i=0; i<6; i++) r->combCoeffs[i] = pow(10.0, (-3.0 * tLinearDelay_getDelay(&r->combDelays[i]) * leaf.invSampleRate / r->t60 ));
-}
-
-// ======================================DATTORRO=========================================
-
-#define SAMP(in) (in*r->t)
-
-float in_allpass_delays[4] = { 4.771f, 3.595f, 12.73f, 9.307f };
-float in_allpass_gains[4] = { 0.75f, 0.75f, 0.625f, 0.625f };
-
-
-void tDattorroReverb_init (tDattorroReverb* const rev)
-{
- tDattorroReverb_initToPool(rev, &leaf_mempool);
-}
-
-void tDattorroReverb_free (tDattorroReverb* const rev)
-{
- tDattorroReverb_freeFromPool(rev, &leaf_mempool);
-}
-
-void tDattorroReverb_initToPool (tDattorroReverb* const rev, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tDattorroReverb* r = *rev = (_tDattorroReverb*) mpool_alloc(sizeof(_tDattorroReverb), &m->pool);
-
- r->size_max = 2.0f;
- r->size = 1.f;
- r->t = r->size * leaf.sampleRate * 0.001f;
- r->frozen = 0;
- // INPUT
- tTapeDelay_initToPool(&r->in_delay, 0.f, SAMP(200.f), mp);
- tOnePole_initToPool(&r->in_filter, 1.f, mp);
-
- for (int i = 0; i < 4; i++)
- {
- tAllpass_initToPool(&r->in_allpass[i], SAMP(in_allpass_delays[i]), SAMP(20.f), mp); // * r->size_max
- tAllpass_setGain(&r->in_allpass[i], in_allpass_gains[i]);
- }
-
- // FEEDBACK 1
- tAllpass_initToPool(&r->f1_allpass, SAMP(30.51f), SAMP(100.f), mp); // * r->size_max
- tAllpass_setGain(&r->f1_allpass, 0.7f);
-
- tTapeDelay_initToPool(&r->f1_delay_1, SAMP(141.69f), SAMP(200.0f) * r->size_max + 1, mp);
- tTapeDelay_initToPool(&r->f1_delay_2, SAMP(89.24f), SAMP(100.0f) * r->size_max + 1, mp);
- tTapeDelay_initToPool(&r->f1_delay_3, SAMP(125.f), SAMP(200.0f) * r->size_max + 1, mp);
-
- tOnePole_initToPool(&r->f1_filter, 1.f, mp);
-
- tHighpass_initToPool(&r->f1_hp, 20.f, mp);
-
- tCycle_initToPool(&r->f1_lfo, mp);
- tCycle_setFreq(&r->f1_lfo, 0.1f);
-
- // FEEDBACK 2
- tAllpass_initToPool(&r->f2_allpass, SAMP(22.58f), SAMP(100.f), mp); // * r->size_max
- tAllpass_setGain(&r->f2_allpass, 0.7f);
-
- tTapeDelay_initToPool(&r->f2_delay_1, SAMP(149.62f), SAMP(200.f) * r->size_max + 1, mp);
- tTapeDelay_initToPool(&r->f2_delay_2, SAMP(60.48f), SAMP(100.f) * r->size_max + 1, mp);
- tTapeDelay_initToPool(&r->f2_delay_3, SAMP(106.28f), SAMP(200.f) * r->size_max + 1, mp);
-
- tOnePole_initToPool(&r->f2_filter, 1.f, mp);
-
- tHighpass_initToPool(&r->f2_hp, 20.f, mp);
-
- tCycle_initToPool(&r->f2_lfo, mp);
- tCycle_setFreq(&r->f2_lfo, 0.07f);
-
-
- // PARAMETERS
- tDattorroReverb_setMix(rev, 0.5f);
-
- tDattorroReverb_setInputDelay(rev, 0.f);
-
- tDattorroReverb_setInputFilter(rev, 10000.f);
-
- tDattorroReverb_setFeedbackFilter(rev, 5000.f);
-
- tDattorroReverb_setFeedbackGain(rev, 0.4f);
-}
-
-void tDattorroReverb_freeFromPool (tDattorroReverb* const rev, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tDattorroReverb* r = *rev;
-
- // INPUT
- tTapeDelay_freeFromPool(&r->in_delay, mp);
- tOnePole_freeFromPool(&r->in_filter, mp);
-
- for (int i = 0; i < 4; i++)
- {
- tAllpass_freeFromPool(&r->in_allpass[i], mp);
- }
-
- // FEEDBACK 1
- tAllpass_freeFromPool(&r->f1_allpass, mp);
-
- tTapeDelay_freeFromPool(&r->f1_delay_1, mp);
- tTapeDelay_freeFromPool(&r->f1_delay_2, mp);
- tTapeDelay_freeFromPool(&r->f1_delay_3, mp);
-
- tOnePole_freeFromPool(&r->f1_filter, mp);
-
- tHighpass_freeFromPool(&r->f1_hp, mp);
-
- tCycle_freeFromPool(&r->f1_lfo, mp);
-
- // FEEDBACK 2
- tAllpass_freeFromPool(&r->f2_allpass, mp);
-
- tTapeDelay_freeFromPool(&r->f2_delay_1, mp);
- tTapeDelay_freeFromPool(&r->f2_delay_2, mp);
- tTapeDelay_freeFromPool(&r->f2_delay_3, mp);
-
- tOnePole_freeFromPool(&r->f2_filter, mp);
-
- tHighpass_freeFromPool(&r->f2_hp, mp);
-
- tCycle_freeFromPool(&r->f2_lfo, mp);
-
- mpool_free(r, &m->pool);
-}
-
-void tDattorroReverb_clear (tDattorroReverb* const rev)
-{
- _tDattorroReverb* r = *rev;
-
- tTapeDelay_clear(&r->in_delay);
- tTapeDelay_clear(&r->f1_delay_1);
- tTapeDelay_clear(&r->f1_delay_2);
- tTapeDelay_clear(&r->f1_delay_3);
- tTapeDelay_clear(&r->f2_delay_1);
- tTapeDelay_clear(&r->f2_delay_2);
- tTapeDelay_clear(&r->f2_delay_3);
-}
-
-float tDattorroReverb_tick (tDattorroReverb* const rev, float input)
-{
- _tDattorroReverb* r = *rev;
-
-
- float in_sample, f1_sample,f1_delay_2_sample, f2_sample, f2_delay_2_sample;
-
- if (r->frozen)
- {
- input = 0.0f;
- //r->f1_last = 0.0f;
- //r->f2_last = 0.0f;
- }
- // INPUT
- in_sample = tTapeDelay_tick(&r->in_delay, input);
-
- in_sample = tOnePole_tick(&r->in_filter, in_sample);
-
- for (int i = 0; i < 4; i++)
- {
- in_sample = tAllpass_tick(&r->in_allpass[i], in_sample);
- }
-
- // FEEDBACK 1
- f1_sample = in_sample + r->f2_last; // + f2_last_out;
-
- tAllpass_setDelay(&r->f1_allpass, SAMP(30.51f) + tCycle_tick(&r->f1_lfo) * SAMP(4.0f));
-
- f1_sample = tAllpass_tick(&r->f1_allpass, f1_sample);
-
- f1_sample = tTapeDelay_tick(&r->f1_delay_1, f1_sample);
-
- f1_sample = tOnePole_tick(&r->f1_filter, f1_sample);
-
- f1_sample = f1_sample + r->f1_delay_2_last * 0.5f;
-
- f1_delay_2_sample = tTapeDelay_tick(&r->f1_delay_2, f1_sample * 0.5f);
-
- r->f1_delay_2_last = f1_delay_2_sample;
-
- f1_sample = r->f1_delay_2_last + f1_sample;
-
- f1_sample = tHighpass_tick(&r->f1_hp, f1_sample);
-
- f1_sample *= r->feedback_gain;
-
- r->f1_last = tTapeDelay_tick(&r->f1_delay_3, f1_sample);
-
- // FEEDBACK 2
- f2_sample = in_sample + r->f1_last;
-
- tAllpass_setDelay(&r->f2_allpass, SAMP(22.58f) + tCycle_tick(&r->f2_lfo) * SAMP(4.0f));
-
- f2_sample = tAllpass_tick(&r->f2_allpass, f2_sample);
-
- f2_sample = tTapeDelay_tick(&r->f2_delay_1, f2_sample);
-
- f2_sample = tOnePole_tick(&r->f2_filter, f2_sample);
-
- f2_sample = f2_sample + r->f2_delay_2_last * 0.5f;
-
- f2_delay_2_sample = tTapeDelay_tick(&r->f2_delay_2, f2_sample * 0.5f);
-
- r->f2_delay_2_last = f2_delay_2_sample;
-
- f2_sample = r->f2_delay_2_last + f2_sample;
-
- f2_sample = tHighpass_tick(&r->f2_hp, f2_sample);
-
- f2_sample *= r->feedback_gain;
-
- r->f2_last = tTapeDelay_tick(&r->f2_delay_3, f2_sample);
-
- // TAP OUT 1
- f1_sample = tTapeDelay_tapOut(&r->f1_delay_1, SAMP(8.9f)) +
- tTapeDelay_tapOut(&r->f1_delay_1, SAMP(99.8f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f1_delay_2, SAMP(64.2f));
-
- f1_sample += tTapeDelay_tapOut(&r->f1_delay_3, SAMP(67.f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_1, SAMP(66.8f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_2, SAMP(6.3f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_3, SAMP(35.8f));
-
- f1_sample *= 0.14f;
-
- // TAP OUT 2
- f2_sample = tTapeDelay_tapOut(&r->f2_delay_1, SAMP(11.8f)) +
- tTapeDelay_tapOut(&r->f2_delay_1, SAMP(121.7f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f2_delay_2, SAMP(6.3f));
-
- f2_sample += tTapeDelay_tapOut(&r->f2_delay_3, SAMP(89.7f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_1, SAMP(70.8f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_2, SAMP(11.2f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_3, SAMP(4.1f));
-
- f2_sample *= 0.14f;
-
- float sample = (f1_sample + f2_sample) * 0.5f;
-
- return (input * (1.0f - r->mix) + sample * r->mix);
-}
-
-void tDattorroReverb_tickStereo (tDattorroReverb* const rev, float input, float* output)
-{
- _tDattorroReverb* r = *rev;
- float in_sample, f1_sample,f1_delay_2_sample, f2_sample, f2_delay_2_sample;
-
- if (r->frozen)
- {
- input = 0.0f;
- //r->f1_last = 0.0f;
- //r->f2_last = 0.0f;
- }
- // INPUT
- in_sample = tTapeDelay_tick(&r->in_delay, input);
-
- in_sample = tOnePole_tick(&r->in_filter, in_sample);
-
- for (int i = 0; i < 4; i++)
- {
- in_sample = tAllpass_tick(&r->in_allpass[i], in_sample);
- }
-
-
- // FEEDBACK 1
- f1_sample = in_sample + r->f2_last; // + f2_last_out;
-
- tAllpass_setDelay(&r->f1_allpass, SAMP(30.51f) + tCycle_tick(&r->f1_lfo) * SAMP(4.0f));
-
- f1_sample = tAllpass_tick(&r->f1_allpass, f1_sample);
-
- f1_sample = tTapeDelay_tick(&r->f1_delay_1, f1_sample);
-
- f1_sample = tOnePole_tick(&r->f1_filter, f1_sample);
-
- f1_sample = f1_sample + r->f1_delay_2_last * 0.5f;
-
- f1_delay_2_sample = tTapeDelay_tick(&r->f1_delay_2, f1_sample * 0.5f);
-
- r->f1_delay_2_last = f1_delay_2_sample;
-
- f1_sample = r->f1_delay_2_last + f1_sample;
-
- f1_sample = tHighpass_tick(&r->f1_hp, f1_sample);
-
- f1_sample *= r->feedback_gain;
-
- if (r->frozen)
- {
- f1_sample = 0.0f;
- }
-
- r->f1_last = tTapeDelay_tick(&r->f1_delay_3, f1_sample);
-
- // FEEDBACK 2
- f2_sample = in_sample + r->f1_last;
-
- tAllpass_setDelay(&r->f2_allpass, SAMP(22.58f) + tCycle_tick(&r->f2_lfo) * SAMP(4.0f));
-
- f2_sample = tAllpass_tick(&r->f2_allpass, f2_sample);
-
- f2_sample = tTapeDelay_tick(&r->f2_delay_1, f2_sample);
-
- f2_sample = tOnePole_tick(&r->f2_filter, f2_sample);
-
- f2_sample = f2_sample + r->f2_delay_2_last * 0.5f;
-
- f2_delay_2_sample = tTapeDelay_tick(&r->f2_delay_2, f2_sample * 0.5f);
-
- r->f2_delay_2_last = f2_delay_2_sample;
-
- f2_sample = r->f2_delay_2_last + f2_sample;
-
- f2_sample = tHighpass_tick(&r->f2_hp, f2_sample);
-
- f2_sample *= r->feedback_gain;
-
- if (r->frozen)
- {
- f2_sample = 0.0f;
- }
- r->f2_last = tTapeDelay_tick(&r->f2_delay_3, f2_sample);
-
-
-
- // TAP OUT 1
- f1_sample = tTapeDelay_tapOut(&r->f1_delay_1, SAMP(8.9f)) +
- tTapeDelay_tapOut(&r->f1_delay_1, SAMP(99.8f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f1_delay_2, SAMP(64.2f));
-
- f1_sample += tTapeDelay_tapOut(&r->f1_delay_3, SAMP(67.f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_1, SAMP(66.8f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_2, SAMP(6.3f));
-
- f1_sample -= tTapeDelay_tapOut(&r->f2_delay_3, SAMP(35.8f));
-
- f1_sample *= 0.14f;
-
- // TAP OUT 2
- f2_sample = tTapeDelay_tapOut(&r->f2_delay_1, SAMP(11.8f)) +
- tTapeDelay_tapOut(&r->f2_delay_1, SAMP(121.7f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f2_delay_2, SAMP(6.3f));
-
- f2_sample += tTapeDelay_tapOut(&r->f2_delay_3, SAMP(89.7f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_1, SAMP(70.8f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_2, SAMP(11.2f));
-
- f2_sample -= tTapeDelay_tapOut(&r->f1_delay_3, SAMP(4.1f));
-
- f2_sample *= 0.14f;
-
- output[0] = input * (1.0f - r->mix) + f1_sample * r->mix;
- output[1] = input * (1.0f - r->mix) + f2_sample * r->mix;
-
-}
-
-void tDattorroReverb_setMix (tDattorroReverb* const rev, float mix)
-{
- _tDattorroReverb* r = *rev;
- r->mix = LEAF_clip(0.0f, mix, 1.0f);
-}
-
-void tDattorroReverb_setFreeze (tDattorroReverb* const rev, uint32_t freeze)
-{
- _tDattorroReverb* r = *rev;
- r->frozen = freeze;
- if (freeze)
- {
- tAllpass_setGain(&r->f2_allpass, 1.0f);
- tAllpass_setGain(&r->f1_allpass, 1.0f);
- for (int i = 0; i < 4; i++)
- {
-
- //tAllpass_setGain(&r->in_allpass[i], 1.0f);
- }
- tCycle_setFreq(&r->f1_lfo, 0.0f);
- tCycle_setFreq(&r->f2_lfo, 0.0f);
- }
- else
- {
- tAllpass_setGain(&r->f2_allpass, 0.7f);
- tAllpass_setGain(&r->f1_allpass, 0.7f);
- for (int i = 0; i < 4; i++)
- {
- //tAllpass_setGain(&r->in_allpass[i], in_allpass_gains[i]);
- }
- tCycle_setFreq(&r->f1_lfo, 0.1f);
- tCycle_setFreq(&r->f2_lfo, 0.07f);
- }
-}
-
-
-void tDattorroReverb_setHP (tDattorroReverb* const rev, float freq)
-{
- _tDattorroReverb* r = *rev;
- float newFreq = LEAF_clip(20.0f, freq, 20000.0f);
- tHighpass_setFreq(&r->f1_hp, newFreq);
- tHighpass_setFreq(&r->f2_hp, newFreq);
-}
-
-
-void tDattorroReverb_setSize (tDattorroReverb* const rev, float size)
-{
- _tDattorroReverb* r = *rev;
-
- r->size = LEAF_clip(0.01f, size*r->size_max, r->size_max);
- r->t = r->size * leaf.sampleRate * 0.001f;
-
- /*
- for (int i = 0; i < 4; i++)
- {
- tAllpass_setDelay(&r->in_allpass[i], SAMP(in_allpass_delays[i]));
- }
- */
-
- // FEEDBACK 1
- //tAllpass_setDelay(&r->f1_allpass, SAMP(30.51f));
-
- tTapeDelay_setDelay(&r->f1_delay_1, SAMP(141.69f));
- tTapeDelay_setDelay(&r->f1_delay_2, SAMP(89.24f));
- tTapeDelay_setDelay(&r->f1_delay_3, SAMP(125.f));
-
- // maybe change rate of SINE LFO's when size changes?
- //tCycle_setFreq(&r->f2_lfo, 0.07f * size * r->size_max);
-
- // FEEDBACK 2
- //tAllpass_setDelay(&r->f2_allpass, SAMP(22.58f));
-
- tTapeDelay_setDelay(&r->f2_delay_1, SAMP(149.62f));
- tTapeDelay_setDelay(&r->f2_delay_2, SAMP(60.48f));
- tTapeDelay_setDelay(&r->f2_delay_3, SAMP(106.28f));
-}
-
-void tDattorroReverb_setInputDelay (tDattorroReverb* const rev, float preDelay)
-{
- _tDattorroReverb* r = *rev;
-
- r->predelay = LEAF_clip(0.0f, preDelay, 200.0f);
-
- tTapeDelay_setDelay(&r->in_delay, SAMP(r->predelay));
-}
-
-void tDattorroReverb_setInputFilter (tDattorroReverb* const rev, float freq)
-{
- _tDattorroReverb* r = *rev;
-
- r->input_filter = LEAF_clip(0.0f, freq, 20000.0f);
-
- tOnePole_setFreq(&r->in_filter, r->input_filter);
-}
-
-void tDattorroReverb_setFeedbackFilter (tDattorroReverb* const rev, float freq)
-{
- _tDattorroReverb* r = *rev;
-
- r->feedback_filter = LEAF_clip(0.0f, freq, 20000.0f);
-
- tOnePole_setFreq(&r->f1_filter, r->feedback_filter);
- tOnePole_setFreq(&r->f2_filter, r->feedback_filter);
-}
-
-void tDattorroReverb_setFeedbackGain (tDattorroReverb* const rev, float gain)
-{
- _tDattorroReverb* r = *rev;
- r->feedback_gain = gain;
-}
--- a/LEAF/Src/leaf-sampling.c
+++ /dev/null
@@ -1,834 +1,0 @@
-/*
- ==============================================================================
-
- leaf-sampling.c
- Created: 20 Jan 2017 12:02:17pm
- Author: Michael R Mulshine
-
- ==============================================================================
- */
-
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-sampling.h"
-#include "..\leaf.h"
-
-#else
-
-#include "../Inc/leaf-sampling.h"
-#include "../leaf.h"
-
-
-#endif
-
-//==============================================================================
-
-void tBuffer_init (tBuffer* const sb, uint32_t length)
-{
- tBuffer_initToPool(sb, length, &leaf_mempool);
-}
-
-void tBuffer_free (tBuffer* const sb)
-{
- tBuffer_freeFromPool(sb, &leaf_mempool);
-}
-
-void tBuffer_initToPool (tBuffer* const sb, uint32_t length, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tBuffer* s = *sb = (_tBuffer*) mpool_alloc(sizeof(_tBuffer), &m->pool);
-
- s->buff = (float*) mpool_alloc( sizeof(float) * length, &m->pool);
-
- s->bufferLength = length;
- s->recordedLength = 0;
- s->active = 0;
- s->idx = 0;
- s->mode = RecordOneShot;
-}
-
-void tBuffer_freeFromPool (tBuffer* const sb, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tBuffer* s = *sb;
-
- mpool_free(s->buff, &m->pool);
- mpool_free(s, &m->pool);
-}
-
-void tBuffer_tick (tBuffer* const sb, float sample)
-{
- _tBuffer* s = *sb;
-
- if (s->active == 1)
- {
- s->buff[s->idx] = sample;
-
- s->idx += 1;
-
- if (s->idx >= s->bufferLength)
- {
- if (s->mode == RecordOneShot)
- {
- tBuffer_stop(sb);
- }
- else if (s->mode == RecordLoop)
- {
- s->idx = 0;
- }
- }
- }
-}
-
-void tBuffer_read(tBuffer* const sb, float* buff, uint32_t len)
-{
- _tBuffer* s = *sb;
- for (int i = 0; i < s->bufferLength; i++)
- {
- if (i < len) s->buff[i] = buff[i];
- else s->buff[i] = 0.f;
- }
- s->recordedLength = len;
-}
-
-float tBuffer_get (tBuffer* const sb, int idx)
-{
- _tBuffer* s = *sb;
- if ((idx < 0) || (idx >= s->bufferLength)) return 0.f;
- return s->buff[idx];
-}
-
-void tBuffer_record(tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- s->active = 1;
- s->idx = 0;
-}
-
-void tBuffer_stop(tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- s->active = 0;
- s->recordedLength = s->idx;
-}
-
-int tBuffer_getRecordPosition(tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- return s->idx;
-}
-
-void tBuffer_setRecordMode (tBuffer* const sb, RecordMode mode)
-{
- _tBuffer* s = *sb;
- s->mode = mode;
-}
-
-void tBuffer_clear (tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- for (int i = 0; i < s->bufferLength; i++)
- {
- s->buff[i] = 0.f;
- }
-}
-
-uint32_t tBuffer_getBufferLength(tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- return s->bufferLength;
-}
-
-uint32_t tBuffer_getRecordedLength(tBuffer* const sb)
-{
- _tBuffer* s = *sb;
- return s->recordedLength;
-}
-
-//================================tSampler=====================================
-
-static void handleStartEndChange(tSampler* const sp);
-
-static void attemptStartEndChange(tSampler* const sp);
-
-void tSampler_init(tSampler* const sp, tBuffer* const b)
-{
- tSampler_initToPool(sp, b, &leaf_mempool);
-}
-
-void tSampler_free (tSampler* const sp)
-{
- tSampler_freeFromPool(sp, &leaf_mempool);
-}
-
-void tSampler_initToPool(tSampler* const sp, tBuffer* const b, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSampler* p = *sp = (_tSampler*) mpool_alloc(sizeof(_tSampler), &m->pool);
- _tBuffer* s = *b;
-
- p->samp = s;
-
- p->active = 0;
-
- p->start = 0;
- p->end = p->samp->bufferLength - 1;
-
- p->len = p->end - p->start;
-
- p->idx = 0.f;
- p->inc = 1.f;
- p->iinc = 1.f;
-
- p->dir = 1;
- p->flip = 1;
- p->bnf = 1;
-
- p->mode = PlayNormal;
-
- p->cfxlen = 500; // default 300 sample crossfade
-
- tRamp_initToPool(&p->gain, 7.0f, 1, mp);
- tRamp_setVal(&p->gain, 0.f);
-
- p->targetstart = -1;
- p->targetend = -1;
-}
-
-void tSampler_freeFromPool (tSampler* const sp, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tSampler* p = *sp;
- tRamp_freeFromPool(&p->gain, mp);
-
- mpool_free(p, &m->pool);
-}
-
-void tSampler_setSample (tSampler* const sp, tBuffer* const b)
-{
- _tSampler* p = *sp;
- _tBuffer* s = *b;
-
- p->samp = s;
-
- p->start = 0;
- p->end = p->samp->bufferLength - 1;
-
- p->len = p->end - p->start;
-
- p->idx = 0.f;
-}
-
-volatile uint32_t errorState = 0;
-
-float tSampler_tick (tSampler* const sp)
-{
- _tSampler* p = *sp;
-
- if (p->active == 0) return 0.f;
-
- if ((p->inc == 0.0f) || (p->len == 0))
- {
- return p->last;
- }
-
- attemptStartEndChange(sp);
-
- float sample = 0.f;
- float cfxsample = 0.f;
- float numticks;
- float g1 = 1.f, g2 = 0.f;
-
- float* buff = p->samp->buff;
-
-
-
- int idx, revidx;
- float alpha, revalpha;
-
- int32_t start = p->start;
- int32_t end = p->end;
- if (p->flip < 0)
- {
- start = p->end;
- end = p->start;
- }
-
-
-
- int dir = p->bnf * p->dir * p->flip;
- idx = (int) p->idx;
- alpha = p->idx - idx;
-
- revidx = idx + 1;// we think this is because flooring on int works different when reading backwards
- revalpha = 1.f - alpha;
-
-
-
-
-
- uint32_t cfxlen = p->cfxlen;
- if (p->len < cfxlen) cfxlen = p->len * 0.25f;//p->len;
-
- int length = p->samp->recordedLength;
-
- if (dir > 0)
- { // num samples (hopping the increment size) to end of loop
- numticks = (end-idx) * p->iinc;
- }
- else
- {
- numticks = (revidx-start) * p->iinc;
- }
-
- // Check dir (direction) to interpolate properly
- if (dir > 0)
- {
- // FORWARD NORMAL SAMPLE
- int i1 = ((idx-1) < 0) ? 0 : idx-1;
- int i3 = ((idx+1) >= length) ? (idx) : (idx+1);
- int i4 = ((idx+2) >= length) ? (length-1) : (idx+2);
-
- sample = LEAF_interpolate_hermite_x (buff[i1],
- buff[idx],
- buff[i3],
- buff[i4],
- alpha);
-
- if (cfxlen > 0)// necessary to avoid divide by zero, also a waste of computation otherwise
- {
-
- if (p->mode == PlayLoop)
- {
-
-
-
- if (numticks <= (float) cfxlen)
- {
- // CROSSFADE SAMPLE
- int cdx = start - (numticks * p->inc);
- if (cdx < 1)
- {
- cdx = -cdx;
-
- i1 = ((cdx+1) >= length) ? (length-1) : cdx+1;
- i3 = ((cdx-1) < 0) ? cdx : (cdx-1);
- i4 = ((cdx-2) < 0) ? 0 : (cdx-2);
-
- cfxsample = LEAF_interpolate_hermite_x (buff[i1],
- buff[cdx],
- buff[i3],
- buff[i4],
- revalpha);
- }
- else
- {
- i1 = ((cdx-1) < 0) ? 0 : cdx-1;
- i3 = ((cdx+1) >= length) ? (cdx) : (cdx+1);
- i4 = ((cdx+2) >= length) ? (length-1) : (cdx+2);
-
- cfxsample = LEAF_interpolate_hermite_x (buff[i1],
- buff[cdx],
- buff[i3],
- buff[i4],
- alpha);
- }
-
- g2 = (float) (cfxlen - numticks) / (float) cfxlen;
-
- }
-
- }
- }
- else
- {
- g2 = 0.0f;
- }
-
- }
- else
- {
- // REVERSE
- int i1 = ((revidx+1) >= length) ? (length-1) : revidx+1;
- int i3 = ((revidx-1) < 0) ? revidx : (revidx-1);
- int i4 = ((revidx-2) < 0) ? 0 : (revidx-2);
-
- sample = LEAF_interpolate_hermite_x (buff[i1],
- buff[revidx],
- buff[i3],
- buff[i4],
- revalpha);
-
-
-
- if (cfxlen > 0)// necessary to avoid divide by zero, also a waste of computation otherwise
- {
-
- if (p->mode == PlayLoop)
- {
- if (numticks <= (float) cfxlen)
- {
- // CROSSFADE SAMPLE
- int cdx = end + (numticks * p->inc);
- if (cdx > length - 2)
- {
-
- //the problem with the click is here --- at some point it crosses this threshold and jumps from a point near the boundary to a point far away from the boundary - that's not correct
- ///// ooooops
-
- cdx = end - (numticks * p->inc);
-
- i1 = ((cdx-1) < 0) ? 0 : cdx-1;
- i3 = ((cdx+1) >= length) ? (cdx) : (cdx+1);
- i4 = ((cdx+2) >= length) ? (length-1) : (cdx+2);
-
- cfxsample = LEAF_interpolate_hermite_x (buff[i1],
- buff[cdx],
- buff[i3],
- buff[i4],
- revalpha);
- }
- else
- {
- i1 = ((cdx+1) >= length) ? (length-1) : cdx+1;
- i3 = ((cdx-1) < 0) ? cdx : (cdx-1);
- i4 = ((cdx-2) < 0) ? 0 : (cdx-2);
-
- cfxsample = LEAF_interpolate_hermite_x (buff[i1],
- buff[cdx],
- buff[i3],
- buff[i4],
- alpha);
- }
- g2 = (float) (cfxlen - numticks) / (float) cfxlen;
- }
-
- }
- }
- else
- {
- g2 = 0.0f;
- }
-
- }
-
-
-
- float inc = fmod(p->inc, p->len);
- p->idx += (dir * inc);
-
- //handle start and end cases for looping and back and forth modes
- if (p->mode == PlayLoop)
- {
-
- while((int)p->idx < start)
- {
- p->idx += (float)(p->len);
- }
- while((int)p->idx > end)
- {
-
- p->idx -= (float)(p->len);
- }
- }
- else // == PlayBackAndForth
- {
- if (p->idx < start)
- {
- p->bnf = -p->bnf;
- p->idx = start + 1;
- }
- else if (p->idx > end)
- {
- p->bnf = -p->bnf;
- p->idx = end - 1;
- }
- }
-
-
- //handle very short fade out for end of one-shot normal playback
- if (p->mode == PlayNormal)
- {
- if (numticks < (0.007f * leaf.sampleRate))
- {
- tRamp_setDest(&p->gain, 0.f);
- p->active = -1;
- }
- }
-
- g1 = 1.f - g2;
-
- sample = sample * g1 + cfxsample * g2;
-
- sample = sample * tRamp_tick(&p->gain);
-
- if (p->active < 0)
- {
- if (tRamp_sample(&p->gain) <= 0.00001f)
- {
- if (p->retrigger == 1)
- {
- p->active = 1;
- p->retrigger = 0;
- tRamp_setDest(&p->gain, 1.f);
-
- if (p->dir > 0)
- {
- if (p->flip > 0) p->idx = p->start;
- else p->idx = p->end;
- }
- else
- {
- if (p->flip > 0) p->idx = p->end;
- else p->idx = p->start;
- }
- }
- else
- {
- p->active = 0;
- }
-
- }
- }
-
- if (fabsf(sample-p->last) > 0.1f)
- {
- errorState = 1;
- }
-
- p->last = sample;
-
-
- return p->last;
-}
-
-void tSampler_setMode (tSampler* const sp, PlayMode mode)
-{
- _tSampler* p = *sp;
- p->mode = mode;
-}
-
-void tSampler_setCrossfadeLength (tSampler* const sp, uint32_t length)
-{
- _tSampler* p = *sp;
-
- uint32_t cfxlen = LEAF_clip(0, length, 1000);
-
- if (cfxlen > (p->len * 0.25f)) cfxlen = p->len * 0.25f;
-
- p->cfxlen = cfxlen;
-}
-
-void tSampler_play (tSampler* const sp)
-{
- _tSampler* p = *sp;
-
- if (p->active != 0)
- {
- p->active = -1;
- p->retrigger = 1;
-
- tRamp_setDest(&p->gain, 0.f);
- }
- else
- {
- p->active = 1;
- p->retrigger = 0;
-
- tRamp_setDest(&p->gain, 1.f);
-
- if (p->dir > 0)
- {
- if (p->flip > 0) p->idx = p->start;
- else p->idx = p->end;
- }
- else
- {
- if (p->flip > 0) p->idx = p->end;
- else p->idx = p->start;
- }
- handleStartEndChange(&p);
- }
-}
-
-void tSampler_stop (tSampler* const sp)
-{
- _tSampler* p = *sp;
-
- p->active = -1;
-
- tRamp_setDest(&p->gain, 0.f);
-}
-
-static void handleStartEndChange(tSampler* const sp)
-{
- _tSampler* p = *sp;
-
- p->len = abs(p->end - p->start);
-
- if (p->len < (p->cfxlen * 0.25f)) p->cfxlen = p->len * 0.25f;
-
- if (p->start > p->end)
- {
- p->flip = -1;
- }
- else
- {
- p->flip = 1;
- }
-}
-
-static void attemptStartEndChange(tSampler* const sp)
-{
- _tSampler* p = *sp;
-
- // Try to update start/end if needed
- if (p->targetstart >= 0)
- {
- tSampler_setStart(sp, p->targetstart);
- }
- if (p->targetend >= 0)
- {
- tSampler_setEnd(sp, p->targetend);
- }
-}
-
-void tSampler_setStart (tSampler* const sp, int32_t start)
-{
- _tSampler* p = *sp;
-
- int tempflip;
- if (start == p->end)
- {
- return;
- }
- // if (p->active)
- {
-
- if (start > p->end)
- {
- tempflip = -1;
- }
- else
- {
- tempflip = 1;
- }
-
- int dir = p->bnf * p->dir * tempflip;
- uint32_t cfxlen = (p->len < p->cfxlen) ? 0 : p->cfxlen;
- if ((tempflip > 0) && (dir > 0)) // start is start and we're playing forward
- {
- if (((start > p->idx) || (p->end-p->idx <= cfxlen)) && (start > p->end))// start given is after current index or we're in a crossfade
- {
- p->targetstart = start;
- return;
- }
- }
- else if ((tempflip < 0) && (dir < 0)) // start is end and we're playing in reverse
- {
- if (((start < p->idx) || (p->idx-p->end <= cfxlen)) && (start < p->end))// start given is before current index or we're in a crossfade
- {
- p->targetstart = start;
- return;
- }
- }
- }
-
- p->start = LEAF_clipInt(0, start, p->samp->recordedLength - 1);
- handleStartEndChange(sp);
- p->targetstart = -1;
-
-}
-
-void tSampler_setEnd (tSampler* const sp, int32_t end)
-{
- _tSampler* p = *sp;
-
- int tempflip;
-
- if (end == p->start)
- {
- return;
- }
- //if (p->active)
- {
-
-
- if (p->start > end)
- {
- tempflip = -1;
- }
- else
- {
- tempflip = 1;
- }
- int dir = p->bnf * p->dir * tempflip;
- uint32_t cfxlen = (p->len < p->cfxlen) ? 0 : p->cfxlen;
- if (tempflip > 0 && dir < 0) // end is end and we're playing in reverse
- {
- if (((end < p->idx) || (p->idx-p->start <= cfxlen)) && (end < p->start)) // end given is before current index or we're in a crossfade
- {
- p->targetend = end;
- return;
- }
- }
- else if (tempflip < 0 && dir > 0) // end is start and we're playing forward
- {
- if (((end > p->idx) || (p->start-p->idx <= cfxlen)) && (end > p->start)) // end given is after current index or we're in a crossfade
- {
- p->targetend = end;
- return;
- }
- }
- }
- p->end = LEAF_clipInt(0, end, (p->samp->recordedLength - 1));
- handleStartEndChange(sp);
- p->targetend = -1;
-}
-
-void tSampler_setRate (tSampler* const sp, float rate)
-{
- _tSampler* p = *sp;
-
- if (rate < 0.f)
- {
- rate = -rate;
- p->dir = -1;
- }
- else
- {
- p->dir = 1;
- }
-
- p->inc = rate;
- p->iinc = 1.f / p->inc;
-}
-
-//==============================================================================
-
-void tAutoSampler_init (tAutoSampler* const as, tBuffer* const b)
-{
- tAutoSampler_initToPool(as, b, &leaf_mempool);
-}
-
-void tAutoSampler_free (tAutoSampler* const as)
-{
- tAutoSampler_freeFromPool(as, &leaf_mempool);
-}
-
-void tAutoSampler_initToPool (tAutoSampler* const as, tBuffer* const b, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAutoSampler* a = *as = (_tAutoSampler*) mpool_alloc(sizeof(_tAutoSampler), &m->pool);
-
- tBuffer_setRecordMode(b, RecordOneShot);
- tSampler_initToPool(&a->sampler, b, mp);
- tSampler_setMode(&a->sampler, PlayLoop);
- tEnvelopeFollower_initToPool(&a->ef, 0.05f, 0.9999f, mp);
-}
-
-void tAutoSampler_freeFromPool (tAutoSampler* const as, tMempool* const mp)
-{
- _tMempool* m = *mp;
- _tAutoSampler* a = *as;
-
- tEnvelopeFollower_freeFromPool(&a->ef, mp);
- tSampler_freeFromPool(&a->sampler, mp);
-
- mpool_free(a, &m->pool);
-}
-
-float tAutoSampler_tick (tAutoSampler* const as, float input)
-{
- _tAutoSampler* a = *as;
- float currentPower = tEnvelopeFollower_tick(&a->ef, input);
-
- if ((currentPower > (a->threshold)) &&
- (currentPower > a->previousPower + 0.001f) &&
- (a->sampleTriggered == 0) &&
- (a->sampleCounter == 0))
- {
- a->sampleTriggered = 1;
- tBuffer_record(&a->sampler->samp);
- a->sampler->samp->recordedLength = a->sampler->samp->bufferLength;
- a->sampleCounter = a->windowSize + 24;//arbitrary extra time to avoid resampling while playing previous sample - better solution would be alternating buffers and crossfading
- a->powerCounter = 1000;
- }
-
- if (a->sampleCounter > 0)
- {
- a->sampleCounter--;
- }
-
-
- tSampler_setEnd(&a->sampler, a->windowSize);
- tBuffer_tick(&a->sampler->samp, input);
- //on it's way down
- if (currentPower <= a->previousPower)
- {
- if (a->powerCounter > 0)
- {
- a->powerCounter--;
- }
- else if (a->sampleTriggered == 1)
- {
- a->sampleTriggered = 0;
- }
- }
-
- a->previousPower = currentPower;
-
- return tSampler_tick(&a->sampler);
-}
-
-void tAutoSampler_setBuffer (tAutoSampler* const as, tBuffer* const b)
-{
- _tAutoSampler* a = *as;
- tBuffer_setRecordMode(b, RecordOneShot);
- if (a->windowSize > tBuffer_getBufferLength(b))
- a->windowSize = tBuffer_getBufferLength(b);
- tSampler_setSample(&a->sampler, b);
-}
-
-void tAutoSampler_setMode (tAutoSampler* const as, PlayMode mode)
-{
- _tAutoSampler* a = *as;
- tSampler_setMode(&a->sampler, mode);
-}
-
-void tAutoSampler_play (tAutoSampler* const as)
-{
- _tAutoSampler* a = *as;
- tSampler_play(&a->sampler);
-}
-void tAutoSampler_stop (tAutoSampler* const as)
-{
- _tAutoSampler* a = *as;
- tSampler_stop(&a->sampler);
-}
-
-void tAutoSampler_setThreshold (tAutoSampler* const as, float thresh)
-{
- _tAutoSampler* a = *as;
- a->threshold = thresh;
-}
-
-void tAutoSampler_setWindowSize (tAutoSampler* const as, uint32_t size)
-{
- _tAutoSampler* a = *as;
- if (size > tBuffer_getBufferLength(&a->sampler->samp))
- a->windowSize = tBuffer_getBufferLength(&a->sampler->samp);
- else a->windowSize = size;
-}
-
-void tAutoSampler_setCrossfadeLength (tAutoSampler* const as, uint32_t length)
-{
- _tAutoSampler* a = *as;
- tSampler_setCrossfadeLength(&a->sampler, length);
-}
-
-void tAutoSampler_setRate (tAutoSampler* const as, float rate)
-{
- ;
-}
--- a/LEAF/Src/leaf-tables.c
+++ /dev/null
@@ -1,14042 +1,0 @@
-/* sine wave table ripped from http://aquaticus.info/pwm-sine-wave */
-
-#if _WIN32 || _WIN64
-
-#include "..\Inc\leaf-tables.h"
-#include "..\Inc\leaf-global.h"
-#else
-
-#include "../Inc/leaf-tables.h"
-#include "../Inc/leaf-global.h"
-
-#endif
-
-
-#include "stdlib.h"
-
-const float fir2XLow[32] = { 0.001067048115027622, -0.004557728776555209, -0.016711590887520535, -0.021065500881657994, -0.003828695019946828, 0.01865935152799254, 0.012036365576553658, -0.02064070362810112, -0.02682399333687091, 0.017862623081258543, 0.0492716766870816, -0.004310232755957251, -0.08571879958189704, -0.03828300159135686, 0.18420501161808442, 0.4054061613074031, 0.4054061613074031, 0.18420501161808442, -0.03828300159135686, -0.08571879958189704, -0.004310232755957251, 0.0492716766870816, 0.017862623081258543, -0.02682399333687091, -0.02064070362810112, 0.012036365576553658, 0.01865935152799254, -0.003828695019946828, -0.021065500881657994, -0.016711590887520535, -0.004557728776555209, 0.001067048115027622
-
-};
-const float fir4XLow[64] = { 0.0006952369848543607, -0.0021602595656775407, -0.005046940892783684, -0.009045400833780066, -0.01291169046367334, -0.015115999752735221, -0.014305643164290147, -0.009951858009311934, -0.0028258377448417927, 0.004999374847547033, 0.010750729432710248, 0.012011264580991868, 0.007846433846826574, -0.0005004296670167205, -0.009772888585453377, -0.015810363406761653, -0.01525350231205246, -0.007226084282741553, 0.005835838890105145, 0.018676910759237414, 0.025091142837250335, 0.02056199072613674, 0.004658087892329196, -0.017877850338462058, -0.03800800914197999, -0.04518029996599868, -0.031146769751981856, 0.006553281738260734, 0.06282284508297871, 0.1257919544316159, 0.18007204974638935, 0.21145499612282317, 0.21145499612282317, 0.18007204974638935, 0.1257919544316159, 0.06282284508297871, 0.006553281738260734, -0.031146769751981856, -0.04518029996599868, -0.03800800914197999, -0.017877850338462058, 0.004658087892329196, 0.02056199072613674, 0.025091142837250335, 0.018676910759237414, 0.005835838890105145, -0.007226084282741553, -0.01525350231205246, -0.015810363406761653, -0.009772888585453377, -0.0005004296670167205, 0.007846433846826574, 0.012011264580991868, 0.010750729432710248, 0.004999374847547033, -0.0028258377448417927, -0.009951858009311934, -0.014305643164290147, -0.015115999752735221, -0.01291169046367334, -0.009045400833780066, -0.005046940892783684, -0.0021602595656775407, 0.0006952369848543607
-};
-const float fir8XLow[64] = { 0.0006754949160790157, 0.0002779478357299437, 0.00016529299248029802, -0.00013134896547707938, -0.0006717131404275674, -0.0015110701381990592, -0.002691718323402088, -0.004233151560515273, -0.006122759810873029, -0.008309678451155357, -0.010700324896169348, -0.013154262594364387, -0.015486775440587882, -0.01748014690133886, -0.018887653514132675, -0.019456772349369558, -0.01894272181784527, -0.017131243827335194, -0.013858969256894846, -0.009032963777720983, -0.0026459262830678125, 0.00521276165394513, 0.01435273458276724, 0.024486845310977834, 0.03524172116254876, 0.04617574968276393, 0.05680505888194891, 0.06663123541320262, 0.07517390607705798, 0.08200222626654773, 0.0867639105153248, 0.08920930675382921, 0.08920930675382921, 0.0867639105153248, 0.08200222626654773, 0.07517390607705798, 0.06663123541320262, 0.05680505888194891, 0.04617574968276393, 0.03524172116254876, 0.024486845310977834, 0.01435273458276724, 0.00521276165394513, -0.0026459262830678125, -0.009032963777720983, -0.013858969256894846, -0.017131243827335194, -0.01894272181784527, -0.019456772349369558, -0.018887653514132675, -0.01748014690133886, -0.015486775440587882, -0.013154262594364387, -0.010700324896169348, -0.008309678451155357, -0.006122759810873029, -0.004233151560515273, -0.002691718323402088, -0.0015110701381990592, -0.0006717131404275674, -0.00013134896547707938, 0.00016529299248029802, 0.0002779478357299437, 0.0006754949160790157
-};
-const float fir16XLow[128] = { 0.0046126349429950276, 0.002418251320043122, 0.002998396982119693, 0.0036278090719021024, 0.0042975430005925104, 0.004996222179947315, 0.005711926725799716, 0.00643079625328543, 0.007135468516004265, 0.007808520869830334, 0.008432568881455365, 0.008987453845736109, 0.00945525638237626, 0.009815890031354925, 0.01005214318250272, 0.0101471696783731, 0.010086582032584102, 0.009858344528406827, 0.009453351108896472, 0.00886647074448095, 0.008096771309653635, 0.00714751717242796, 0.006026566967445846, 0.004745997071949807, 0.0033222377606249025, 0.0017766711441555428, 0.00013504407845816216, -0.0015717347700967995, -0.0033094088955885038, -0.005040712758495562, -0.0067262136355625045, -0.00832548062138737, -0.009796853749250854, -0.011097728611024173, -0.012187337326564303, -0.013023698103098556, -0.013573509920266506, -0.013801755448129987, -0.013685636499932173, -0.0132011750541409, -0.012328290422335804, -0.011059565013468301, -0.009397775060844537, -0.007349071952063118, -0.004920665178899413, -0.002134336426912994, 0.0009664872092121234, 0.00436478920287496, 0.008003553325930378, 0.011839210717492617, 0.015814297525442545, 0.01987142580304551, 0.023948983229671674, 0.0279823843957138, 0.03190689232743185, 0.03565816745288488, 0.03917373689862927, 0.042395392373465575, 0.04526788671987817, 0.0477424527036618, 0.04977580760639264, 0.051332653704811104, 0.05238580079738586, 0.05291690409987073, 0.05291690409987073, 0.05238580079738586, 0.051332653704811104, 0.04977580760639264, 0.0477424527036618, 0.04526788671987817, 0.042395392373465575, 0.03917373689862927, 0.03565816745288488, 0.03190689232743185, 0.0279823843957138, 0.023948983229671674, 0.01987142580304551, 0.015814297525442545, 0.011839210717492617, 0.008003553325930378, 0.00436478920287496, 0.0009664872092121234, -0.002134336426912994, -0.004920665178899413, -0.007349071952063118, -0.009397775060844537, -0.011059565013468301, -0.012328290422335804, -0.0132011750541409, -0.013685636499932173, -0.013801755448129987, -0.013573509920266506, -0.013023698103098556, -0.012187337326564303, -0.011097728611024173, -0.009796853749250854, -0.00832548062138737, -0.0067262136355625045, -0.005040712758495562, -0.0033094088955885038, -0.0015717347700967995, 0.00013504407845816216, 0.0017766711441555428, 0.0033222377606249025, 0.004745997071949807, 0.006026566967445846, 0.00714751717242796, 0.008096771309653635, 0.00886647074448095, 0.009453351108896472, 0.009858344528406827, 0.010086582032584102, 0.0101471696783731, 0.01005214318250272, 0.009815890031354925, 0.00945525638237626, 0.008987453845736109, 0.008432568881455365, 0.007808520869830334, 0.007135468516004265, 0.00643079625328543, 0.005711926725799716, 0.004996222179947315, 0.0042975430005925104, 0.0036278090719021024, 0.002998396982119693, 0.002418251320043122, 0.0046126349429950276
-};
-
-const float fir32XLow[256] = { 0.003135815035675548, 0.0008156232239328851, 0.000917068197598276, 0.0010233321389754753, 0.001134110218761504, 0.0012491667970169805, 0.0013680375075057851, 0.001490070275243389, 0.0016147643011084855, 0.0017417157238882276, 0.0018700914504121836, 0.0019991579415749683, 0.002128471863076254, 0.0022567566738769186, 0.002383672659264704, 0.002508166194956474, 0.002629506399721181, 0.0027467683378931368, 0.0028590361951993043, 0.0029653540222406116, 0.0030647286416823558, 0.00315623470697179, 0.003238837936508139, 0.0033114996375323753, 0.003373275427426179, 0.003423120728613286, 0.0034602078573979502, 0.00348370126489233, 0.0034928589363555137, 0.003487024926580723, 0.00346544617544127, 0.0034275901596743786, 0.003372744288160786, 0.003300374368830668, 0.0032100011629779615, 0.0031011259873207366, 0.0029734835473811155, 0.002826966057696581, 0.002661647372342504, 0.002477856491791658, 0.0022758592957851788, 0.002056324802981239, 0.0018188203182857804, 0.0015643564184398945, 0.0012926118931092972, 0.0010045690459120843, 0.0007018867678747181, 0.0003860391202902529, 0.00005849980158161824, -0.0002799696936324717, -0.0006296005356373679, -0.0009895247437558183, -0.0013546785675169304, -0.0017195561866995873, -0.0020963876502479964, -0.002468260301862593, -0.0028417218921490055, -0.0032120394918615683, -0.0035773608021516137, -0.003935505336691309, -0.004284369920502227, -0.004621670593236145, -0.004945031807804129, -0.005252279037886353, -0.005541035510098375, -0.0058089264241534076, -0.006054095814242929, -0.006274068947767563, -0.00646696244866887, -0.0066305675756926155, -0.006762900683506128, -0.0068620368760529005, -0.006926182735003765, -0.0069537046122919695, -0.006943019919480639, -0.006892771889917669, -0.006801741377343995, -0.006668838708546407, -0.006493264006045824, -0.006274267867821416, -0.006011320357808483, -0.0057040303527059145, -0.0053521596030233955, -0.004955865565614219, -0.0045153171035821945, -0.004031251472901679, -0.0035043462024212605, -0.002935495552851842, -0.0023258420785969196, -0.0016765768456949962, -0.0009892344368254917, -0.0002656979807816483, 0.0004919846584003508, 0.0012815018066687268, 0.0021009777555761797, 0.002947120990883713, 0.003818897132096946, 0.004711821532573362, 0.005623441877750917, 0.0065507318610126455, 0.00749007256295643, 0.008438601047417412, 0.009393231377415961, 0.010349728929990198, 0.011304034683748016, 0.012253787036798792, 0.0131957325172224, 0.014123534046112132, 0.015037407721547907, 0.015930638333497147, 0.016801083762848282, 0.017644931748342123, 0.018458926379618365, 0.019239740862760844, 0.0199842074278331, 0.02068926196032209, 0.021351902836904902, 0.021969538576994418, 0.022539688024890127, 0.02305979792910538, 0.023527892067270753, 0.023941757493848588, 0.02429975740762361, 0.024600378168866704, 0.02484241441905009, 0.025024893038415853, 0.025146995906550493, 0.025208214258904054, 0.025208214258904054, 0.025146995906550493, 0.025024893038415853, 0.02484241441905009, 0.024600378168866704, 0.02429975740762361, 0.023941757493848588, 0.023527892067270753, 0.02305979792910538, 0.022539688024890127, 0.021969538576994418, 0.021351902836904902, 0.02068926196032209, 0.0199842074278331, 0.019239740862760844, 0.018458926379618365, 0.017644931748342123, 0.016801083762848282, 0.015930638333497147, 0.015037407721547907, 0.014123534046112132, 0.0131957325172224, 0.012253787036798792, 0.011304034683748016, 0.010349728929990198, 0.009393231377415961, 0.008438601047417412, 0.00749007256295643, 0.0065507318610126455, 0.005623441877750917, 0.004711821532573362, 0.00381889
\ No newline at end of file
-};
-const float fir64XLow[256] = { -0.007573012406345277, 0.00024079274850113426, 0.00024263723882202515, 0.0002481761013286244, 0.0002570861260137623, 0.0002699368701027846, 0.0002857208679875607, 0.00030498547559247845, 0.0003276748319944884, 0.0003537347795633787, 0.0003828493219762104, 0.00041517688767673063, 0.00045068714217736007, 0.0004893648798719514, 0.0005311398297784606, 0.0005760959724897604, 0.0006241866818625697, 0.00067534060229161, 0.0007295120216703175, 0.0007867375202056556, 0.00084702149975344, 0.0009103261049980538, 0.000976697360607544, 0.001046184181770156, 0.0011188000414977899, 0.0011944092399743605, 0.0012730564419046215, 0.0013547197757430203, 0.0014394035452673572, 0.0015269066196715306, 0.0016175658016292192, 0.0017113538530254156, 0.0018082288964809644, 0.0019074086707092258, 0.0020102102191501834, 0.002115750178775707, 0.0022249923434846707, 0.002324224442263978, 0.0024546715656463027, 0.0025707750602413674, 0.0026886907797787993, 0.0028092893752555753, 0.0029332425986383416, 0.003059760096689252, 0.0031892620828723227, 0.0033216131163189126, 0.00345667963318062, 0.003594116005810746, 0.00373401564369845, 0.003876285696289593, 0.004020837780560375, 0.004167535061341574, 0.004316384032044447, 0.004467271202856345, 0.004620059305184111, 0.00477464934326076, 0.004931017978539705, 0.005089107569792517, 0.005248795189805357, 0.005410043882397958, 0.00557279812512997, 0.005736960631925176, 0.005902264421456515, 0.006068673112862706, 0.006236075536115428, 0.006404404103216645, 0.006573347381526989, 0.006743241263261084, 0.006913918086775748, 0.007085185727911214, 0.007255841416075524, 0.007427788300814843, 0.007599440425756014, 0.007771491831017079, 0.007940210385740073, 0.008115982431613405, 0.008286230477311076, 0.008455728261315427, 0.008624828065636171, 0.0087938382520137, 0.008961934603559608, 0.009129309914478244, 0.009295705048569773, 0.009460895719293651, 0.009624512383898252, 0.009786590519239425, 0.009946995212091796, 0.010105592312872629, 0.010262212502414601, 0.010416818688520148, 0.010569268906811192, 0.010719396502249774, 0.010867082742078902, 0.011012274230511132, 0.011154883295408143, 0.01129473907939671, 0.011431766458575066, 0.011565861880187342, 0.011696890630696698, 0.011824548066976817, 0.011948823922340134, 0.012069629781346847, 0.012186937947306629, 0.012300432892104241, 0.01241055721228422, 0.012517086983512674, 0.012619772868365714, 0.01271694508250919, 0.012811738843612799, 0.012901614577029171, 0.012987520090940792, 0.013067705672196494, 0.013146659639966262, 0.013218602399208508, 0.013285987093409357, 0.013349032229359648, 0.013407929990549725, 0.013461999810303231, 0.013511437444384976, 0.013556082697096088, 0.013595835757053917, 0.013630499982440026, 0.01366023670087255, 0.013685042776887582, 0.013704903172994373, 0.013719772986706352, 0.013729721512429531, 0.01373472352074017, 0.01373472352074017, 0.013729721512429531, 0.013719772986706352, 0.013704903172994373, 0.013685042776887582, 0.01366023670087255, 0.013630499982440026, 0.013595835757053917, 0.013556082697096088, 0.013511437444384976, 0.013461999810303231, 0.013407929990549725, 0.013349032229359648, 0.013285987093409357, 0.013218602399208508, 0.013146659639966262, 0.013067705672196494, 0.012987520090940792, 0.012901614577029171, 0.012811738843612799, 0.01271694508250919, 0.012619772868365714, 0.012517086983512674, 0.01241055721228422, 0.012300432892104241, 0.012186937947306629, 0.012069629781346847, 0.011948823922340134, 0.011824548066976817, 0.011696890630696698, 0.011565861880187342, 0.011431766458575066, 0.01129473907939671, 0.01115488
\ No newline at end of file
-};
-
-const float fir2XHigh[128] = { -2.84059575423864e-7, -0.00000136947295895967, -0.00000213110629785921, 5.807441351521463e-7, 0.000005239591854415941, 0.0000017841093721093506, -0.000011653029986124283, -0.000012481751035611902, 0.000014692437654954816, 0.00003091988960026406, -0.000011636477685383897, -0.00006163665493961978, -0.00001118322316939516, 0.0000961395818492714, 0.00006083206665324362, -0.00012648324239817438, -0.0001504708418330321, 0.00012753607518766694, 0.00027753923597010266, -0.00007473591299809917, -0.0004344444061086839, -0.00006832501012358436, 0.0005862297350582802, 0.00032465365599127654, -0.0006850628390191059, -0.0007096577214822187, 0.0006552234666252462, 0.0012010034203710784, -0.00041922406056782083, -0.0017446179378994388, -0.00010392099105524336, 0.002230631291161319, 0.0009594567093737222, -0.0025128059157130817, -0.002149706133662562, 0.0024038381899768617, 0.0035931253272614688, -0.0017176062590590708, -0.005125004981810711, 0.0002868765073834209, 0.006475023818177746, 0.001977797493927114, -0.007294746305130189, -0.005063375113227534, 0.007166496494812792, 0.008801581540883702, -0.005659099397006974, -0.012862366201787455, 0.00235384598511852, 0.016726921191779598, 0.0031052434033518096, -0.01970178000552065, -0.011028401875416302, 0.020882193937533836, 0.021743369519245558, -0.019061942568474207, -0.03589474387520175, 0.012292311428695956, 0.05536768370150782, 0.0038607600693388554, -0.08741418160721261, -0.046877671142694095, 0.18124004024261609, 0.41210996873316647, 0.41210996873316647, 0.18124004024261609, -0.046877671142694095, -0.08741418160721261, 0.0038607600693388554, 0.05536768370150782, 0.012292311428695956, -0.03589474387520175, -0.019061942568474207, 0.021743369519245558, 0.020882193937533836, -0.011028401875416302, -0.01970178000552065, 0.0031052434033518096, 0.016726921191779598, 0.00235384598511852, -0.012862366201787455, -0.005659099397006974, 0.008801581540883702, 0.007166496494812792, -0.005063375113227534, -0.007294746305130189, 0.001977797493927114, 0.006475023818177746, 0.0002868765073834209, -0.005125004981810711, -0.0017176062590590708, 0.0035931253272614688, 0.0024038381899768617, -0.002149706133662562, -0.0025128059157130817, 0.0009594567093737222, 0.002230631291161319, -0.00010392099105524336, -0.0017446179378994388, -0.00041922406056782083, 0.0012010034203710784, 0.0006552234666252462, -0.0007096577214822187, -0.0006850628390191059, 0.00032465365599127654, 0.0005862297350582802, -0.00006832501012358436, -0.0004344444061086839, -0.00007473591299809917, 0.00027753923597010266, 0.00012753607518766694, -0.0001504708418330321, -0.00012648324239817438, 0.00006083206665324362, 0.0000961395818492714, -0.00001118322316939516, -0.00006163665493961978, -0.000011636477685383897, 0.00003091988960026406, 0.000014692437654954816, -0.000012481751035611902, -0.000011653029986124283, 0.0000017841093721093506, 0.000005239591854415941, 5.807441351521463e-7, -0.00000213110629785921, -0.00000136947295895967, -2.84059575423864e-7
-};
-const float fir4XHigh[256] = { -0.000005005316694254475, -0.000010486216859223391, -0.000020341389435584184, -0.000028297461945285203, -0.00003403970018224806, -0.00003356141383522181, -0.000028580071407296435, -0.000021726870316473222, -0.000018929805847104457, -0.000024937785475375726, -0.00004148092321827023, -0.00006494904958257674, -0.00008704299086494871, -0.00009817726370665003, -0.00009207287115371104, -0.000070350790919461, -0.000043204247279965386, -0.000026338754429996997, -0.00003337527183661095, -0.00006864404983689099, -0.00012208654155480072, -0.00017229784061896603, -0.00019443471041769651, -0.0001738448733058993, -0.00011458014625437172, -0.00004241909459592675, 0.000005858218684625342, -0.000001824861163195929, -0.00007376494795165521, -0.0001870435534541462, -0.00029242213522170924, -0.00033660459070401045, -0.00028781004597914193, -0.00015737268974254042, 2.4069038430437714e-7, 0.00010675981100488967, 0.00009819903503597289, -0.000041503003504151876, -0.00026298229853436046, -0.0004679330143401381, -0.000550680089032831, -0.00045235278384860993, -0.0001968527747134386, 0.00010787721721971545, 0.00031390651451180623, 0.0003015617300329922, 0.00004577001768172358, -0.0003593242009009715, -0.0007303801286775824, -0.0008768456304295432, -0.0006955854650565154, -0.00023554905807185743, 0.00030790928383371996, 0.0006717577010285365, 0.0006504775398685704, 0.00020580176646200433, -0.0004919858457618222, -0.0011250441730682327, -0.001368894036877941, -0.0010555177901930952, -0.00027554321698262794, 0.0006358082850902164, 0.0012391753523202087, 0.0011981314765901019, 0.0004602570434921762, -0.0006853292543951153, -0.0017133793271509106, -0.0020995520812018714, -0.0015812527530506791, -0.00031822317984990035, 0.0011425257824338887, 0.0020968295391595774, 0.0020180799074488486, 0.000837174097496827, -0.0009743823002432432, -0.0025836938014065975, -0.00317200799245191, -0.0023436048910665127, -0.0003642960983689493, 0.0019025392919524162, 0.0033649169125380706, 0.003219398725098763, 0.0013786588356217962, -0.001415068708295585, -0.003874469283244301, -0.004750945120551563, -0.0034548726172607498, -0.0004124431830693066, 0.003046185830666762, 0.005254266475282044, 0.004999101428335298, 0.002164099554982996, -0.0021053850268023615, -0.005843180111542266, -0.0071497618238720055, -0.0051353491910507984, -0.0004583930086451031, 0.004842595616255233, 0.008213402548972962, 0.00778770755309392, 0.003376641721920036, -0.003263596560752136, -0.00908888688929085, -0.011124936147882954, -0.007935453568187856, -0.0004986705357686102, 0.007998600315936934, 0.013466881500422878, 0.012810645017913123, 0.0055655403444453775, -0.00554207852540761, -0.015510462180576574, -0.019193722858760427, -0.013786276388279539, -0.0005292356782833587, 0.01526523041211863, 0.026109899142542758, 0.02555053211054643, 0.011414259133477645, -0.01233979307221452, -0.036160130412882435, -0.04790631293501779, -0.03735668670551693, -0.0005458966005379449, 0.0578178869957579, 0.12496957303698586, 0.18372600900451644, 0.21795911568314993, 0.21795911568314993, 0.18372600900451644, 0.12496957303698586, 0.0578178869957579, -0.0005458966005379449, -0.03735668670551693, -0.04790631293501779, -0.036160130412882435, -0.01233979307221452, 0.011414259133477645, 0.02555053211054643, 0.026109899142542758, 0.01526523041211863, -0.0005292356782833587, -0.013786276388279539, -0.019193722858760427, -0.015510462180576574, -0.00554207852540761, 0.0055655403444453775, 0.012810645017913123, 0.013466881500422878, 0.007998600315936934, -0.0004986705357686102, -0.007935453568187856, -0.011124936147882954, -0.0090888868892
\ No newline at end of file
-};
-const float fir8XHigh[256] = { 0.00003151783634577697, 0.00009875809063575779, 0.00011952623149469952, 0.00019849261073490482, 0.0002696485066015727, 0.0003584099608999308, 0.00044625388761023913, 0.0005319258847527823, 0.0006044238440905041, 0.0006561179367621888, 0.0006780841482803052, 0.0006636425833116022, 0.0006082918945412483, 0.0005111129662557197, 0.00037520607336543075, 0.00020804636935322743, 0.000021269501878054377, -0.00017002451555728345, -0.00034851615605358005, -0.0004962768841556523, -0.0005966792410792791, -0.0006363992327126103, -0.0006072812580573203, -0.0005078006712943802, -0.00034391453642163835, -0.0001291740152058233, 0.00011608199926386939, 0.0003663883172395964, 0.0005935643814352129, 0.0007697197860148682, 0.0008705060394986916, 0.0008782421413312541, 0.0007845404678866458, 0.0005921472961030223, 0.0003155390021514345, -0.00001975662025403667, -0.0003792242746719516, -0.0007226903878816747, -0.0010085916592065419, -0.0011987843551975912, -0.0012633390417589486, -0.0011847927602402282, -0.0009612078105002279, -0.000607656728473499, -0.00015580100244720835, 0.0003485912201162041, 0.0008499567444557006, 0.0012888238057625968, 0.0016085750487669262, 0.0017624573232133487, 0.0017198572703654494, 0.0014712649629561752, 0.0010309092850789008, 0.0004369297346610886, -0.0002514846038907312, -0.0009595058667715721, -0.0016045955886596882, -0.002105611566700304, -0.002392827139552557, -0.0024168530933362325, -0.00215621955374809, -0.0016217376891380843, -0.0008577023023227786, 0.00006118480472750677, 0.0010364584424907685, 0.001956049351551786, 0.002706696800527712, 0.00318733017834542, 0.003322096376141488, 0.0030709922507173265, 0.0024373280210738995, 0.0014701293295941087, 0.0002616176696267551, -0.0010608870493178752, -0.002347699681593795, -0.0034429894732297774, -0.004203029219555798, -0.00451398893736866, -0.004307677839041472, -0.0035726927213363046, -0.0023597776381211666, -0.0007800969761600126, 0.00100380173046076, 0.0027935634872831047, 0.0043761562977185555, 0.005547954061740437, 0.006139532362567163, 0.006038187372164252, 0.005205193104614497, 0.003685832364921369, 0.001610065959141185, -0.000816509624547802, -0.003331179568244694, -0.005640769473740277, -0.007453565321222198, -0.008513609412918493, -0.008633348531283494, -0.0077207439401804495, -0.005797651634024999, -0.003006470630061831, 0.00039645931697321107, 0.004060688288708085, 0.007573881722373314, 0.010503477916637444, 0.012443852783009171, 0.013064660267980682, 0.012154652149365373, 0.009656403107118496, 0.005687627159122434, 0.000545686660735971, -0.0053060804504155646, -0.011269885881064536, -0.016661104177372186, -0.02076782817847515, -0.022917127850131423, -0.022542073972735464, -0.01924294503235089, -0.012836088871532723, -0.0033855865368634104, 0.008786222880026725, 0.023111259021133423, 0.038810833745067747, 0.05495087979175688, 0.0705128544598909, 0.08447430461530625, 0.0958915908436123, 0.10397774191970133, 0.10816816138474043, 0.10816816138474043, 0.10397774191970133, 0.0958915908436123, 0.08447430461530625, 0.0705128544598909, 0.05495087979175688, 0.038810833745067747, 0.023111259021133423, 0.008786222880026725, -0.0033855865368634104, -0.012836088871532723, -0.01924294503235089, -0.022542073972735464, -0.022917127850131423, -0.02076782817847515, -0.016661104177372186, -0.011269885881064536, -0.0053060804504155646, 0.000545686660735971, 0.005687627159122434, 0.009656403107118496, 0.012154652149365373, 0.013064660267980682, 0.012443852783009171, 0.010503477916637444, 0.007573881722373314, 0.004060688288708085, 0.00039645931697321107, -0.003006470630061831,
\ No newline at end of file
-};
-const float fir16XHigh[512] = { -0.00004017374344384353, -0.00003227078919691645, -0.000044582740239682106, -0.000059425359817699515, -0.00007697752128893082, -0.00009737601811785888, -0.0001207053885646365, -0.0001469875004658367, -0.00017617089070723918, -0.00020812277783425573, -0.00024262055862920822, -0.0002793450290387454, -0.00031787504789909166, -0.0003576848687093178, -0.00039814402944626006, -0.0004385193477821247, -0.0004779801054675081, -0.0005156064224889276, -0.0005503998661674507, -0.0005812986840141297, -0.0006071960902571958, -0.0006269579055230081, -0.0006394482697590037, -0.0006435494696099878, -0.0006381976745823161, -0.0006223990810339609, -0.0005952724709135361, -0.0005560644539084499, -0.0005041884015231086, -0.00043924670962451254, -0.0003610522906867853, -0.00026965679983683306, -0.0001653614058088566, -0.00004873297752271577, 0.00007938716594862651, 0.0002178851248768366, 0.0003653745221459382, 0.0005202048736767491, 0.0006804822788501571, 0.000844091795557933, 0.0010087245432410705, 0.001171916285444633, 0.0013310914106543618, 0.0014836070887652329, 0.0016268044135357975, 0.0017580661564216042, 0.0018748692581644735, 0.0019748436871571654, 0.002055827323171664, 0.0021159244704237914, 0.002153555697975211, 0.002167506085967786, 0.0021569688626138744, 0.0021215783384772617, 0.002061435847387089, 0.0019771222276341416, 0.0018697088674027409, 0.0017407508215061904, 0.0015922694449783334, 0.0014267282165683897, 0.0012469961488860717, 0.001056296589672521, 0.0008581466323761644, 0.0006562897137528959, 0.0004546180492460159, 0.00025709020784146465, 0.00006764748603812152, -0.00010987539810307727, -0.00027183788464963423, -0.0004148795460643277, -0.0005360117384990369, -0.0006326924816840852, -0.0007028976477190042, -0.0007451789241688792, -0.0007587025992854616, -0.00074329154026803, -0.00069943732077003, -0.0006283153390612298, -0.0005317674541381928, -0.0004122736350806254, -0.0002728965175373041, -0.00011721898154916056, 0.000050727732077616854, 0.00022654511040849531, 0.0004055654685261572, 0.0005829725151929097, 0.0007539299891718014, 0.0009136968081628693, 0.001057727366040496, 0.0011817838315511687, 0.0012820768752281682, 0.0013553936088779655, 0.0013991567634035874, 0.0014114626691980761, 0.0013911994521601603, 0.001338158623469115, 0.0012529312652788224, 0.0011368782078168052, 0.0009924227419316402, 0.0008225367782712132, 0.0006311126153653432, 0.000422596130820185, 0.00020202566973633374, -0.000025140126274052846, -0.00025314012889659734, -0.00047605825978268214, -0.0006879757889763613, -0.0008831265836660278, -0.001056052961049124, -0.0012017570118505278, -0.0013158443800074546, -0.0013946550179738235, -0.00143537714856422, -0.0014361430413177665, -0.0013961025273104373, -0.0013154698934900741, -0.0011955448624625515, -0.001038705445344848, -0.000848370211905452, -0.0006289357238567322, -0.00038567726087640876, -0.00012464084542349136, 0.00014751424024790855, 0.00042365555592108265, 0.000696381707633601, 0.0009581911739190034, 0.0012016945125591883, 0.0014198129038021875, 0.0016059677163340854, 0.0017542822302381216, 0.0018597489437935104, 0.0019183843680031518, 0.001927370582069373, 0.0018851569558006424, 0.0017915316423764106, 0.0016476681649469273, 0.001456129721890939, 0.0012208322294896099, 0.0009469770920907817, 0.0006409478559993642, 0.0003101659717946291, -0.00003708137047780295, -0.0003918367361265021, -0.0007446984520565823, -0.0010860619549777095, -0.0014063764577860907, -0.001696397687712767, -0.0019474488265779002, -0.002151669227747982, -0.002302249012563522, -0.0023936395957784356, -0.0024217386080201218, -0.0023840464641522
\ No newline at end of file
-};
-
-const float fir32XHigh[512] = { 0.00001695726883388158, 0.000007675466747345142, 0.000009369969074343828, 0.000011279085806814155, 0.000013415806582636418, 0.00001579269222570207, 0.000018421887123570193, 0.00002131472780344219, 0.000024481596821410856, 0.000027931521966672674, 0.00003167253546774698, 0.00003571156802204514, 0.00004005385180859527, 0.00004470260388316558, 0.00004965901316017587, 0.00005492204008152043, 0.00006048845305842843, 0.00006635289665744708, 0.00007250665288501187, 0.0000789384885513108, 0.00008563367774264342, 0.00009257537368625661, 0.00009974252621593992, 0.00010711124658254552, 0.00011465337570751053, 0.00012233800287448705, 0.0001301305708291957, 0.00013799197926318244, 0.00014587929227876596, 0.00015374657372226684, 0.000161543746522965, 0.0001692168951984779, 0.00017670780599526637, 0.0001839550739841348, 0.00019089427588832468, 0.00019745677767765902, 0.00020357062514912954, 0.00020916210971675997, 0.0002141545274069432, 0.00021846768000518762, 0.00022202071352577454, 0.00022473075934779818, 0.00022651220405928228, 0.00022728022159501112, 0.0002269491553453425, 0.00022543136577234978, 0.00022264296187547415, 0.0002184968451898252, 0.00021291103136150344, 0.00020580302601570826, 0.00019709428929377538, 0.00018670887176183611, 0.00017457550213741742, 0.00016062706678436397, 0.0001448013951907719, 0.0001270421247034733, 0.00010729940118257597, 0.00008553038364340326, 0.00006169965119086659, 0.00003577991793585758, 0.000007752990690551504, -0.000022389783957090243, -0.00005464753929697829, -0.00008900834335751579, -0.0001254499161703673, -0.00016393632811230729, -0.0002044234554405178, -0.00024684930385593585, -0.000291146274450184, -0.0003372278537321366, -0.00038499799259658716, -0.00043434821843157495, -0.0004851539797413716, -0.000537279458928773, -0.0005905762825387684, -0.0006448805823763886, -0.0007000164290861944, -0.0007557967574505448, -0.0008120214850938284, -0.0008684784362018723, -0.000924945795118327, -0.0009811922513964621, -0.0010369764412132298, -0.0010920476659586364, -0.0011461469777671403, -0.0011990092591572569, -0.0012503626824092186, -0.001299930348337511, -0.0013474327014007098, -0.0013925895075579725, -0.0014351200205514354, -0.0014747442974922531, -0.0015111829899403478, -0.0015441601544571469, -0.0015734040663474662, -0.0015986504297413274, -0.0016196438588602622, -0.0016361410571864347, -0.0016479110521030553, -0.0016547353303458935, -0.0016564077630374632, -0.0016527363435263026, -0.0016435483225404998, -0.0016286956518505767, -0.0016080553748913375, -0.0015815237521207347, -0.0015490117157615478, -0.0015104528831698094, -0.001465823165002548, -0.0014151394219170251, -0.001358416974565312, -0.0012956736049528927, -0.0012270686956067616, -0.001152656073186285, -0.0010726190880063075, -0.0009871267066080157, -0.0008963952696138223, -0.0008006703533508123, -0.0007002299686741377, -0.0005953836139186328, -0.0004864723381871633, -0.0003738679720682553, -0.00025797228061734796, -0.00013921599931306062, -0.000018057446410729332, 0.00010501885598494471, 0.00022950336047164354, 0.00035486342787289485, 0.00048054572124056215, 0.0006059774135387564, 0.0007305691337782367, 0.0008537161333655127, 0.0009748030963864794, 0.0010932046990955392, 0.0012082904750566619, 0.0013194249851955161, 0.0014259733376771368, 0.001527303743896754, 0.0016227897956312704, 0.001711814456379326, 0.0017937737205012431, 0.0018680795987737412, 0.0019341641568400244, 0.0019914815935822066, 0.002039512595508008, 0.0020777684004774366, 0.002105792845115274, 0.002123165845077641, 0.0021295078285898787, 0.002124481676328226, 0.0021077949476114846, 0.0020792
\ No newline at end of file
-};
-const float fir64XHigh[1024] = { 0.000022913289467138396, 0.0000053659189590266235, 0.0000059874129268137184, 0.000006651966903409214, 0.000007360859185648702, 0.000008116254962232182, 0.000008919034969234169, 0.000009771649771624484, 0.00001067513223630924, 0.000011631201209261511, 0.000012641797347255405, 0.00001370786337628007, 0.000014831347439124435, 0.00001601386713533323, 0.00001725659281802051, 0.000018561209740219567, 0.00001992924403854817, 0.00002136207377464052, 0.000022860960742170415, 0.00002442737159197627, 0.000026062787460182665, 0.00002776823090942686, 0.00002954497152514943, 0.000031394387750225555, 0.0000333174817796639, 0.00003531515315607694, 0.000037388352711032095, 0.00003953809180607858, 0.000041765124869157065, 0.00004406996003435772, 0.00004645314118637872, 0.00004891512239763599, 0.000051456283434024254, 0.000054076836400090634, 0.00005677675565218903, 0.00005955600371707976, 0.00006241451652786996, 0.0000653520878490535, 0.00006836828400903681, 0.00007146257248874113, 0.00007463447593939765, 0.00007788334878376474, 0.00008120828768996651, 0.00008460822180317937, 0.00008808197111592392, 0.00009162826246394013, 0.00009524561718379787, 0.0000989323217880672, 0.00010268641529207459, 0.00010650572670297642, 0.00011038797758602729, 0.00011433071893118852, 0.00011833127277888537, 0.0001223867211507117, 0.0001264939791526471, 0.0001306498943438022, 0.00013485120459499745, 0.0001390945080465441, 0.0001433761787732808, 0.0001476923508970611, 0.0001520390228045441, 0.00015641203030453322, 0.0001608069510673283, 0.00016521898552431528, 0.0001696430686231646, 0.0001740740165774301, 0.00017850636200629103, 0.0001829343448175031, 0.00018735205242694257, 0.000191753562437378, 0.00019613295450734188, 0.00020048414321002534, 0.00020480094575553342, 0.00020907706346541747, 0.00021330607883745088, 0.00021748145118260308, 0.00022159611743123445, 0.0002256425365807074, 0.0002296129456080256, 0.00023349938436811445, 0.00023729369397980805, 0.00024098757818162363, 0.0002445732198467269, 0.00024804316088030066, 0.00025138980120093706, 0.00025460575109546185, 0.00025768336513093236, 0.000260614166491108, 0.00026338871874574443, 0.000265996883919168, 0.00026842872851524756, 0.0002706745796903796, 0.00027272653793114146, 0.0002745790007011535, 0.0002762259706331217, 0.0002776600678298683, 0.0002788693645809233, 0.0002798371088712506, 0.0002805501390130166, 0.0002810071637276198, 0.0002812218387032567, 0.0002811853995116189, 0.0002808065268305555, 0.000280197444464886, 0.00027926833477321045, 0.0002780409500002217, 0.0002765020258372484, 0.00027464338678576605, 0.00027245845620400524, 0.0002699387312629035, 0.0002670776879725044, 0.0002638682356241208, 0.00026030295633048156, 0.0002563760351381784, 0.00025208079324849864, 0.00024741089077219824, 0.00024236092911432053, 0.00023692535214431433, 0.00023109887243694582, 0.0002248766203312044, 0.00021825436568685826, 0.0002112279751888258, 0.00020379342129965214, 0.00019594765441000844, 0.00018768793613519225, 0.00017901156693343162, 0.0001699163889323255, 0.00016040086314937234, 0.00015046397564821766, 0.00014010492118016657, 0.00012932331202118152, 0.00011811939311034222, 0.00010649390448787931, 0.00009444816369190979, 0.00008198390428241564, 0.00006910334679829026, 0.00005580947004681174, 0.000042105866991998394, 0.000027996578416041823, 0.000013486064917873263, -0.0000014205550195404417, -0.000016717431552354825, -0.00003239824489309241, -0.00004845619470295486, -0.00006488392097284113, -0.00008167344072768395, -0.00009881608266779326, -0.00011630254584578235, -0.000134122927443183, -0.0001522667855569792, -0.00017072306915224
\ No newline at end of file
-};
-
-const float* firCoeffs[COEFFS_SIZE] = { fir2XLow, fir4XLow, fir8XLow, fir16XLow, fir32XLow, fir64XLow, fir2XHigh, fir4XHigh, fir8XHigh, fir16XHigh, fir32XHigh, fir64XHigh
-};
-
-const float firNumTaps[COEFFS_SIZE] = { 32, 32, 64, 128, 256, 256, 128, 256, 256, 512, 512, 1024 };
-
-const float shaper1[SHAPER1_TABLE_SIZE] = {0.333061f, 0.333022f, 0.332983f, 0.332944f, 0.332905f, 0.332866f, 0.332827f, 0.332788f, 0.332749f, 0.33271f, 0.332671f, 0.332632f, 0.332593f, 0.332554f, 0.332515f, 0.332475f, 0.332436f, 0.332397f, 0.332358f, 0.332319f,
-0.33228f, 0.33224f, 0.332201f, 0.332162f, 0.332123f, 0.332083f, 0.332044f, 0.332005f, 0.331966f, 0.331926f, 0.331887f, 0.331848f, 0.331808f, 0.331769f, 0.33173f, 0.33169f, 0.331651f, 0.331611f, 0.331572f, 0.331533f,
-0.331493f, 0.331454f, 0.331414f, 0.331375f, 0.331335f, 0.331296f, 0.331256f, 0.331217f, 0.331177f, 0.331138f, 0.331098f, 0.331059f, 0.331019f, 0.330979f, 0.33094f, 0.3309f, 0.330861f, 0.330821f, 0.330781f, 0.330742f,
-0.330702f, 0.330662f, 0.330623f, 0.330583f, 0.330543f, 0.330504f, 0.330464f, 0.330424f, 0.330384f, 0.330344f, 0.330305f, 0.330265f, 0.330225f, 0.330185f, 0.330145f, 0.330106f, 0.330066f, 0.330026f, 0.329986f, 0.329946f,
-0.329906f, 0.329866f, 0.329826f, 0.329786f, 0.329746f, 0.329706f, 0.329667f, 0.329627f, 0.329587f, 0.329547f, 0.329506f, 0.329466f, 0.329426f, 0.329386f, 0.329346f, 0.329306f, 0.329266f, 0.329226f, 0.329186f, 0.329146f,
-0.329106f, 0.329065f, 0.329025f, 0.328985f, 0.328945f, 0.328905f, 0.328864f, 0.328824f, 0.328784f, 0.328744f, 0.328704f, 0.328663f, 0.328623f, 0.328583f, 0.328542f, 0.328502f, 0.328462f, 0.328421f, 0.328381f, 0.328341f,
-0.3283f, 0.32826f, 0.328219f, 0.328179f, 0.328139f, 0.328098f, 0.328058f, 0.328017f, 0.327977f, 0.327936f, 0.327896f, 0.327855f, 0.327815f, 0.327774f, 0.327734f, 0.327693f, 0.327653f, 0.327612f, 0.327571f, 0.327531f,
-0.32749f, 0.32745f, 0.327409f, 0.327368f, 0.327328f, 0.327287f, 0.327246f, 0.327206f, 0.327165f, 0.327124f, 0.327084f, 0.327043f, 0.327002f, 0.326961f, 0.32692f, 0.32688f, 0.326839f, 0.326798f, 0.326757f, 0.326716f,
-0.326676f, 0.326635f, 0.326594f, 0.326553f, 0.326512f, 0.326471f, 0.32643f, 0.326389f, 0.326348f, 0.326307f, 0.326266f, 0.326225f, 0.326184f, 0.326143f, 0.326102f, 0.326061f, 0.32602f, 0.325979f, 0.325938f, 0.325897f,
-0.325856f, 0.325815f, 0.325774f, 0.325733f, 0.325692f, 0.325651f, 0.325609f, 0.325568f, 0.325527f, 0.325486f, 0.325445f, 0.325403f, 0.325362f, 0.325321f, 0.32528f, 0.325239f, 0.325197f, 0.325156f, 0.325115f, 0.325073f,
-0.325032f, 0.324991f, 0.324949f, 0.324908f, 0.324867f, 0.324825f, 0.324784f, 0.324743f, 0.324701f, 0.32466f, 0.324618f, 0.324577f, 0.324535f, 0.324494f, 0.324452f, 0.324411f, 0.324369f, 0.324328f, 0.324286f, 0.324245f,
-0.324203f, 0.324162f, 0.32412f, 0.324079f, 0.324037f, 0.323995f, 0.323954f, 0.323912f, 0.323871f, 0.323829f, 0.323787f, 0.323746f, 0.323704f, 0.323662f, 0.32362f, 0.323579f, 0.323537f, 0.323495f, 0.323453f, 0.323412f,
-0.32337f, 0.323328f, 0.323286f, 0.323244f, 0.323203f, 0.323161f, 0.323119f, 0.323077f, 0.323035f, 0.322993f, 0.322951f, 0.32291f, 0.322868f, 0.322826f, 0.322784f, 0.322742f, 0.3227f, 0.322658f, 0.322616f, 0.322574f,
-0.322532f, 0.32249f, 0.322448f, 0.322406f, 0.322364f, 0.322322f, 0.322279f, 0.322237f, 0.322195f, 0.322153f, 0.322111f, 0.322069f, 0.322027f, 0.321985f, 0.321942f, 0.3219f, 0.321858f, 0.321816f, 0.321774f, 0.321731f,
-0.321689f, 0.321647f, 0.321605f, 0.321562f, 0.32152f, 0.321478f, 0.321435f, 0.321393f, 0.321351f, 0.321308f, 0.321266f, 0.321224f, 0.321181f, 0.321139f, 0.321096f, 0.321054f, 0.321012f, 0.320969f, 0.320927f, 0.320884f,
-0.320842f, 0.320799f, 0.320757f, 0.320714f, 0.320672f, 0.320629f, 0.320587f, 0.320544f, 0.320501f, 0.320459f, 0.320416f, 0.320374f, 0.320331f, 0.320288f, 0.320246f, 0.320203f, 0.32016f, 0.320118f, 0.320075f, 0.320032f,
-0.31999f, 0.319947f, 0.319904f, 0.319862f, 0.319819f, 0.319776f, 0.319733f, 0.31969f, 0.319648f, 0.319605f, 0.319562f, 0.319519f, 0.319476f, 0.319433f, 0.319391f, 0.319348f, 0.319305f, 0.319262f, 0.319219f, 0.319176f,
-0.319133f, 0.31909f, 0.319047f, 0.319004f, 0.318961f, 0.318918f, 0.318875f, 0.318832f, 0.318789f, 0.318746f, 0.318703f, 0.31866f, 0.318617f, 0.318574f, 0.318531f, 0.318488f, 0.318444f, 0.318401f, 0.318358f, 0.318315f,
-0.318272f, 0.318229f, 0.318185f, 0.318142f, 0.318099f, 0.318056f, 0.318013f, 0.317969f, 0.317926f, 0.317883f, 0.317839f, 0.317796f, 0.317753f, 0.31771f, 0.317666f, 0.317623f, 0.31758f, 0.317536f, 0.317493f, 0.317449f,
-0.317406f, 0.317363f, 0.317319f, 0.317276f, 0.317232f, 0.317189f, 0.317145f, 0.317102f, 0.317058f, 0.317015f, 0.316971f, 0.316928f, 0.316884f, 0.316841f, 0.316797f, 0.316754f, 0.31671f, 0.316666f, 0.316623f, 0.316579f,
-0.316536f, 0.316492f, 0.316448f, 0.316405f, 0.316361f, 0.316317f, 0.316274f, 0.31623f, 0.316186f, 0.316142f, 0.316099f, 0.316055f, 0.316011f, 0.315967f, 0.315924f, 0.31588f, 0.315836f, 0.315792f, 0.315748f, 0.315704f,
-0.315661f, 0.315617f, 0.315573f, 0.315529f, 0.315485f, 0.315441f, 0.315397f, 0.315353f, 0.315309f, 0.315265f, 0.315221f, 0.315177f, 0.315133f, 0.315089f, 0.315045f, 0.315001f, 0.314957f, 0.314913f, 0.314869f, 0.314825f,
-0.314781f, 0.314737f, 0.314693f, 0.314649f, 0.314604f, 0.31456f, 0.314516f, 0.314472f, 0.314428f, 0.314384f, 0.314339f, 0.314295f, 0.314251f, 0.314207f, 0.314162f, 0.314118f, 0.314074f, 0.31403f, 0.313985f, 0.313941f,
-0.313897f, 0.313852f, 0.313808f, 0.313764f, 0.313719f, 0.313675f, 0.313631f, 0.313586f, 0.313542f, 0.313497f, 0.313453f, 0.313409f, 0.313364f, 0.31332f, 0.313275f, 0.313231f, 0.313186f, 0.313142f, 0.313097f, 0.313053f,
-0.313008f, 0.312963f, 0.312919f, 0.312874f, 0.31283f, 0.312785f, 0.312741f, 0.312696f, 0.312651f, 0.312607f, 0.312562f, 0.312517f, 0.312473f, 0.312428f, 0.312383f, 0.312338f, 0.312294f, 0.312249f, 0.312204f, 0.31216f,
-0.312115f, 0.31207f, 0.312025f, 0.31198f, 0.311936f, 0.311891f, 0.311846f, 0.311801f, 0.311756f, 0.311711f, 0.311666f, 0.311621f, 0.311577f, 0.311532f, 0.311487f, 0.311442f, 0.311397f, 0.311352f, 0.311307f, 0.311262f,
-0.311217f, 0.311172f, 0.311127f, 0.311082f, 0.311037f, 0.310992f, 0.310947f, 0.310902f, 0.310857f, 0.310811f, 0.310766f, 0.310721f, 0.310676f, 0.310631f, 0.310586f, 0.310541f, 0.310495f, 0.31045f, 0.310405f, 0.31036f,
-0.310315f, 0.310269f, 0.310224f, 0.310179f, 0.310134f, 0.310088f, 0.310043f, 0.309998f, 0.309952f, 0.309907f, 0.309862f, 0.309816f, 0.309771f, 0.309726f, 0.30968f, 0.309635f, 0.309589f, 0.309544f, 0.309499f, 0.309453f,
-0.309408f, 0.309362f, 0.309317f, 0.309271f, 0.309226f, 0.30918f, 0.309135f, 0.309089f, 0.309044f, 0.308998f, 0.308953f, 0.308907f, 0.308861f, 0.308816f, 0.30877f, 0.308725f, 0.308679f, 0.308633f, 0.308588f, 0.308542f,
-0.308496f, 0.308451f, 0.308405f, 0.308359f, 0.308313f, 0.308268f, 0.308222f, 0.308176f, 0.30813f, 0.308085f, 0.308039f, 0.307993f, 0.307947f, 0.307901f, 0.307856f, 0.30781f, 0.307764f, 0.307718f, 0.307672f, 0.307626f,
-0.30758f, 0.307534f, 0.307489f, 0.307443f, 0.307397f, 0.307351f, 0.307305f, 0.307259f, 0.307213f, 0.307167f, 0.307121f, 0.307075f, 0.307029f, 0.306983f, 0.306937f, 0.30689f, 0.306844f, 0.306798f, 0.306752f, 0.306706f,
-0.30666f, 0.306614f, 0.306568f, 0.306522f, 0.306475f, 0.306429f, 0.306383f, 0.306337f, 0.306291f, 0.306244f, 0.306198f, 0.306152f, 0.306106f, 0.306059f, 0.306013f, 0.305967f, 0.30592f, 0.305874f, 0.305828f, 0.305781f,
-0.305735f, 0.305689f, 0.305642f, 0.305596f, 0.30555f, 0.305503f, 0.305457f, 0.30541f, 0.305364f, 0.305317f, 0.305271f, 0.305224f, 0.305178f, 0.305131f, 0.305085f, 0.305038f, 0.304992f, 0.304945f, 0.304899f, 0.304852f,
-0.304806f, 0.304759f, 0.304713f, 0.304666f, 0.304619f, 0.304573f, 0.304526f, 0.304479f, 0.304433f, 0.304386f, 0.304339f, 0.304293f, 0.304246f, 0.304199f, 0.304152f, 0.304106f, 0.304059f, 0.304012f, 0.303965f, 0.303919f,
-0.303872f, 0.303825f, 0.303778f, 0.303731f, 0.303685f, 0.303638f, 0.303591f, 0.303544f, 0.303497f, 0.30345f, 0.303403f, 0.303356f, 0.303309f, 0.303262f, 0.303216f, 0.303169f, 0.303122f, 0.303075f, 0.303028f, 0.302981f,
-0.302934f, 0.302887f, 0.302839f, 0.302792f, 0.302745f, 0.302698f, 0.302651f, 0.302604f, 0.302557f, 0.30251f, 0.302463f, 0.302416f, 0.302368f, 0.302321f, 0.302274f, 0.302227f, 0.30218f, 0.302133f, 0.302085f, 0.302038f,
-0.301991f, 0.301944f, 0.301896f, 0.301849f, 0.301802f, 0.301754f, 0.301707f, 0.30166f, 0.301612f, 0.301565f, 0.301518f, 0.30147f, 0.301423f, 0.301376f, 0.301328f, 0.301281f, 0.301233f, 0.301186f, 0.301139f, 0.301091f,
-0.301044f, 0.300996f, 0.300949f, 0.300901f, 0.300854f, 0.300806f, 0.300759f, 0.300711f, 0.300664f, 0.300616f, 0.300568f, 0.300521f, 0.300473f, 0.300426f, 0.300378f, 0.30033f, 0.300283f, 0.300235f, 0.300187f, 0.30014f,
-0.300092f, 0.300044f, 0.299997f, 0.299949f, 0.299901f, 0.299853f, 0.299806f, 0.299758f, 0.29971f, 0.299662f, 0.299615f, 0.299567f, 0.299519f, 0.299471f, 0.299423f, 0.299375f, 0.299328f, 0.29928f, 0.299232f, 0.299184f,
-0.299136f, 0.299088f, 0.29904f, 0.298992f, 0.298944f, 0.298896f, 0.298848f, 0.2988f, 0.298752f, 0.298704f, 0.298656f, 0.298608f, 0.29856f, 0.298512f, 0.298464f, 0.298416f, 0.298368f, 0.29832f, 0.298272f, 0.298224f,
-0.298176f, 0.298127f, 0.298079f, 0.298031f, 0.297983f, 0.297935f, 0.297887f, 0.297838f, 0.29779f, 0.297742f, 0.297694f, 0.297645f, 0.297597f, 0.297549f, 0.297501f, 0.297452f, 0.297404f, 0.297356f, 0.297307f, 0.297259f,
-0.297211f, 0.297162f, 0.297114f, 0.297066f, 0.297017f, 0.296969f, 0.29692f, 0.296872f, 0.296823f, 0.296775f, 0.296727f, 0.296678f, 0.29663f, 0.296581f, 0.296533f, 0.296484f, 0.296436f, 0.296387f, 0.296339f, 0.29629f,
-0.296241f, 0.296193f, 0.296144f, 0.296096f, 0.296047f, 0.295998f, 0.29595f, 0.295901f, 0.295852f, 0.295804f, 0.295755f, 0.295706f, 0.295658f, 0.295609f, 0.29556f, 0.295512f, 0.295463f, 0.295414f, 0.295365f, 0.295317f,
-0.295268f, 0.295219f, 0.29517f, 0.295121f, 0.295073f, 0.295024f, 0.294975f, 0.294926f, 0.294877f, 0.294828f, 0.294779f, 0.29473f, 0.294682f, 0.294633f, 0.294584f, 0.294535f, 0.294486f, 0.294437f, 0.294388f, 0.294339f,
-0.29429f, 0.294241f, 0.294192f, 0.294143f, 0.294094f, 0.294045f, 0.293996f, 0.293946f, 0.293897f, 0.293848f, 0.293799f, 0.29375f, 0.293701f, 0.293652f, 0.293603f, 0.293553f, 0.293504f, 0.293455f, 0.293406f, 0.293357f,
-0.293307f, 0.293258f, 0.293209f, 0.29316f, 0.29311f, 0.293061f, 0.293012f, 0.292963f, 0.292913f, 0.292864f, 0.292815f, 0.292765f, 0.292716f, 0.292667f, 0.292617f, 0.292568f, 0.292518f, 0.292469f, 0.29242f, 0.29237f,
-0.292321f, 0.292271f, 0.292222f, 0.292172f, 0.292123f, 0.292073f, 0.292024f, 0.291974f, 0.291925f, 0.291875f, 0.291826f, 0.291776f, 0.291727f, 0.291677f, 0.291627f, 0.291578f, 0.291528f, 0.291479f, 0.291429f, 0.291379f,
-0.29133f, 0.29128f, 0.29123f, 0.291181f, 0.291131f, 0.291081f, 0.291031f, 0.290982f, 0.290932f, 0.290882f, 0.290832f, 0.290783f, 0.290733f, 0.290683f, 0.290633f, 0.290583f, 0.290534f, 0.290484f, 0.290434f, 0.290384f,
-0.290334f, 0.290284f, 0.290234f, 0.290185f, 0.290135f, 0.290085f, 0.290035f, 0.289985f, 0.289935f, 0.289885f, 0.289835f, 0.289785f, 0.289735f, 0.289685f, 0.289635f, 0.289585f, 0.289535f, 0.289485f, 0.289435f, 0.289385f,
-0.289335f, 0.289284f, 0.289234f, 0.289184f, 0.289134f, 0.289084f, 0.289034f, 0.288984f, 0.288933f, 0.288883f, 0.288833f, 0.288783f, 0.288733f, 0.288682f, 0.288632f, 0.288582f, 0.288532f, 0.288481f, 0.288431f, 0.288381f,
-0.28833f, 0.28828f, 0.28823f, 0.288179f, 0.288129f, 0.288079f, 0.288028f, 0.287978f, 0.287928f, 0.287877f, 0.287827f, 0.287776f, 0.287726f, 0.287676f, 0.287625f, 0.287575f, 0.287524f, 0.287474f, 0.287423f, 0.287373f,
-0.287322f, 0.287272f, 0.287221f, 0.287171f, 0.28712f, 0.287069f, 0.287019f, 0.286968f, 0.286918f, 0.286867f, 0.286816f, 0.286766f, 0.286715f, 0.286664f, 0.286614f, 0.286563f, 0.286512f, 0.286462f, 0.286411f, 0.28636f,
-0.286309f, 0.286259f, 0.286208f, 0.286157f, 0.286106f, 0.286056f, 0.286005f, 0.285954f, 0.285903f, 0.285852f, 0.285802f, 0.285751f, 0.2857f, 0.285649f, 0.285598f, 0.285547f, 0.285496f, 0.285445f, 0.285394f, 0.285344f,
-0.285293f, 0.285242f, 0.285191f, 0.28514f, 0.285089f, 0.285038f, 0.284987f, 0.284936f, 0.284885f, 0.284834f, 0.284783f, 0.284731f, 0.28468f, 0.284629f, 0.284578f, 0.284527f, 0.284476f, 0.284425f, 0.284374f, 0.284323f,
-0.284271f, 0.28422f, 0.284169f, 0.284118f, 0.284067f, 0.284015f, 0.283964f, 0.283913f, 0.283862f, 0.28381f, 0.283759f, 0.283708f, 0.283657f, 0.283605f, 0.283554f, 0.283503f, 0.283451f, 0.2834f, 0.283349f, 0.283297f,
-0.283246f, 0.283195f, 0.283143f, 0.283092f, 0.28304f, 0.282989f, 0.282937f, 0.282886f, 0.282835f, 0.282783f, 0.282732f, 0.28268f, 0.282629f, 0.282577f, 0.282526f, 0.282474f, 0.282422f, 0.282371f, 0.282319f, 0.282268f,
-0.282216f, 0.282165f, 0.282113f, 0.282061f, 0.28201f, 0.281958f, 0.281906f, 0.281855f, 0.281803f, 0.281751f, 0.2817f, 0.281648f, 0.281596f, 0.281545f, 0.281493f, 0.281441f, 0.281389f, 0.281338f, 0.281286f, 0.281234f,
-0.281182f, 0.28113f, 0.281079f, 0.281027f, 0.280975f, 0.280923f, 0.280871f, 0.280819f, 0.280767f, 0.280716f, 0.280664f, 0.280612f, 0.28056f, 0.280508f, 0.280456f, 0.280404f, 0.280352f, 0.2803f, 0.280248f, 0.280196f,
-0.280144f, 0.280092f, 0.28004f, 0.279988f, 0.279936f, 0.279884f, 0.279832f, 0.27978f, 0.279728f, 0.279675f, 0.279623f, 0.279571f, 0.279519f, 0.279467f, 0.279415f, 0.279363f, 0.27931f, 0.279258f, 0.279206f, 0.279154f,
-0.279102f, 0.279049f, 0.278997f, 0.278945f, 0.278893f, 0.27884f, 0.278788f, 0.278736f, 0.278684f, 0.278631f, 0.278579f, 0.278527f, 0.278474f, 0.278422f, 0.278369f, 0.278317f, 0.278265f, 0.278212f, 0.27816f, 0.278107f,
-0.278055f, 0.278003f, 0.27795f, 0.277898f, 0.277845f, 0.277793f, 0.27774f, 0.277688f, 0.277635f, 0.277583f, 0.27753f, 0.277478f, 0.277425f, 0.277372f, 0.27732f, 0.277267f, 0.277215f, 0.277162f, 0.277109f, 0.277057f,
-0.277004f, 0.276952f, 0.276899f, 0.276846f, 0.276794f, 0.276741f, 0.276688f, 0.276635f, 0.276583f, 0.27653f, 0.276477f, 0.276424f, 0.276372f, 0.276319f, 0.276266f, 0.276213f, 0.276161f, 0.276108f, 0.276055f, 0.276002f,
-0.275949f, 0.275896f, 0.275843f, 0.275791f, 0.275738f, 0.275685f, 0.275632f, 0.275579f, 0.275526f, 0.275473f, 0.27542f, 0.275367f, 0.275314f, 0.275261f, 0.275208f, 0.275155f, 0.275102f, 0.275049f, 0.274996f, 0.274943f,
-0.27489f, 0.274837f, 0.274784f, 0.274731f, 0.274678f, 0.274625f, 0.274571f, 0.274518f, 0.274465f, 0.274412f, 0.274359f, 0.274306f, 0.274252f, 0.274199f, 0.274146f, 0.274093f, 0.27404f, 0.273986f, 0.273933f, 0.27388f,
-0.273827f, 0.273773f, 0.27372f, 0.273667f, 0.273613f, 0.27356f, 0.273507f, 0.273453f, 0.2734f, 0.273347f, 0.273293f, 0.27324f, 0.273187f, 0.273133f, 0.27308f, 0.273026f, 0.272973f, 0.272919f, 0.272866f, 0.272813f,
-0.272759f, 0.272706f, 0.272652f, 0.272599f, 0.272545f, 0.272492f, 0.272438f, 0.272384f, 0.272331f, 0.272277f, 0.272224f, 0.27217f, 0.272117f, 0.272063f, 0.272009f, 0.271956f, 0.271902f, 0.271848f, 0.271795f, 0.271741f,
-0.271687f, 0.271634f, 0.27158f, 0.271526f, 0.271473f, 0.271419f, 0.271365f, 0.271311f, 0.271258f, 0.271204f, 0.27115f, 0.271096f, 0.271042f, 0.270989f, 0.270935f, 0.270881f, 0.270827f, 0.270773f, 0.270719f, 0.270665f,
-0.270612f, 0.270558f, 0.270504f, 0.27045f, 0.270396f, 0.270342f, 0.270288f, 0.270234f, 0.27018f, 0.270126f, 0.270072f, 0.270018f, 0.269964f, 0.26991f, 0.269856f, 0.269802f, 0.269748f, 0.269694f, 0.26964f, 0.269586f,
-0.269532f, 0.269477f, 0.269423f, 0.269369f, 0.269315f, 0.269261f, 0.269207f, 0.269153f, 0.269098f, 0.269044f, 0.26899f, 0.268936f, 0.268882f, 0.268827f, 0.268773f, 0.268719f, 0.268665f, 0.26861f, 0.268556f, 0.268502f,
-0.268448f, 0.268393f, 0.268339f, 0.268285f, 0.26823f, 0.268176f, 0.268121f, 0.268067f, 0.268013f, 0.267958f, 0.267904f, 0.26785f, 0.267795f, 0.267741f, 0.267686f, 0.267632f, 0.267577f, 0.267523f, 0.267468f, 0.267414f,
-0.267359f, 0.267305f, 0.26725f, 0.267196f, 0.267141f, 0.267087f, 0.267032f, 0.266978f, 0.266923f, 0.266868f, 0.266814f, 0.266759f, 0.266704f, 0.26665f, 0.266595f, 0.266541f, 0.266486f, 0.266431f, 0.266376f, 0.266322f,
-0.266267f, 0.266212f, 0.266158f, 0.266103f, 0.266048f, 0.265993f, 0.265939f, 0.265884f, 0.265829f, 0.265774f, 0.265719f, 0.265665f, 0.26561f, 0.265555f, 0.2655f, 0.265445f, 0.26539f, 0.265335f, 0.265281f, 0.265226f,
-0.265171f, 0.265116f, 0.265061f, 0.265006f, 0.264951f, 0.264896f, 0.264841f, 0.264786f, 0.264731f, 0.264676f, 0.264621f, 0.264566f, 0.264511f, 0.264456f, 0.264401f, 0.264346f, 0.264291f, 0.264236f, 0.26418f, 0.264125f,
-0.26407f, 0.264015f, 0.26396f, 0.263905f, 0.26385f, 0.263794f, 0.263739f, 0.263684f, 0.263629f, 0.263574f, 0.263518f, 0.263463f, 0.263408f, 0.263353f, 0.263298f, 0.263242f, 0.263187f, 0.263132f, 0.263076f, 0.263021f,
-0.262966f, 0.26291f, 0.262855f, 0.2628f, 0.262744f, 0.262689f, 0.262634f, 0.262578f, 0.262523f, 0.262467f, 0.262412f, 0.262357f, 0.262301f, 0.262246f, 0.26219f, 0.262135f, 0.262079f, 0.262024f, 0.261968f, 0.261913f,
-0.261857f, 0.261802f, 0.261746f, 0.261691f, 0.261635f, 0.261579f, 0.261524f, 0.261468f, 0.261413f, 0.261357f, 0.261301f, 0.261246f, 0.26119f, 0.261134f, 0.261079f, 0.261023f, 0.260967f, 0.260912f, 0.260856f, 0.2608f,
-0.260745f, 0.260689f, 0.260633f, 0.260577f, 0.260522f, 0.260466f, 0.26041f, 0.260354f, 0.260298f, 0.260243f, 0.260187f, 0.260131f, 0.260075f, 0.260019f, 0.259963f, 0.259907f, 0.259852f, 0.259796f, 0.25974f, 0.259684f,
-0.259628f, 0.259572f, 0.259516f, 0.25946f, 0.259404f, 0.259348f, 0.259292f, 0.259236f, 0.25918f, 0.259124f, 0.259068f, 0.259012f, 0.258956f, 0.2589f, 0.258844f, 0.258788f, 0.258732f, 0.258676f, 0.258619f, 0.258563f,
-0.258507f, 0.258451f, 0.258395f, 0.258339f, 0.258283f, 0.258226f, 0.25817f, 0.258114f, 0.258058f, 0.258002f, 0.257945f, 0.257889f, 0.257833f, 0.257777f, 0.25772f, 0.257664f, 0.257608f, 0.257552f, 0.257495f, 0.257439f,
-0.257383f, 0.257326f, 0.25727f, 0.257214f, 0.257157f, 0.257101f, 0.257044f, 0.256988f, 0.256932f, 0.256875f, 0.256819f, 0.256762f, 0.256706f, 0.256649f, 0.256593f, 0.256536f, 0.25648f, 0.256423f, 0.256367f, 0.25631f,
-0.256254f, 0.256197f, 0.256141f, 0.256084f, 0.256028f, 0.255971f, 0.255915f, 0.255858f, 0.255801f, 0.255745f, 0.255688f, 0.255631f, 0.255575f, 0.255518f, 0.255461f, 0.255405f, 0.255348f, 0.255291f, 0.255235f, 0.255178f,
-0.255121f, 0.255064f, 0.255008f, 0.254951f, 0.254894f, 0.254837f, 0.254781f, 0.254724f, 0.254667f, 0.25461f, 0.254553f, 0.254497f, 0.25444f, 0.254383f, 0.254326f, 0.254269f, 0.254212f, 0.254155f, 0.254098f, 0.254041f,
-0.253985f, 0.253928f, 0.253871f, 0.253814f, 0.253757f, 0.2537f, 0.253643f, 0.253586f, 0.253529f, 0.253472f, 0.253415f, 0.253358f, 0.253301f, 0.253244f, 0.253187f, 0.253129f, 0.253072f, 0.253015f, 0.252958f, 0.252901f,
-0.252844f, 0.252787f, 0.25273f, 0.252673f, 0.252615f, 0.252558f, 0.252501f, 0.252444f, 0.252387f, 0.252329f, 0.252272f, 0.252215f, 0.252158f, 0.2521f, 0.252043f, 0.251986f, 0.251929f, 0.251871f, 0.251814f, 0.251757f,
-0.251699f, 0.251642f, 0.251585f, 0.251527f, 0.25147f, 0.251413f, 0.251355f, 0.251298f, 0.25124f, 0.251183f, 0.251126f, 0.251068f, 0.251011f, 0.250953f, 0.250896f, 0.250838f, 0.250781f, 0.250723f, 0.250666f, 0.250608f,
-0.250551f, 0.250493f, 0.250436f, 0.250378f, 0.250321f, 0.250263f, 0.250206f, 0.250148f, 0.25009f, 0.250033f, 0.249975f, 0.249918f, 0.24986f, 0.249802f, 0.249745f, 0.249687f, 0.249629f, 0.249572f, 0.249514f, 0.249456f,
-0.249398f, 0.249341f, 0.249283f, 0.249225f, 0.249167f, 0.24911f, 0.249052f, 0.248994f, 0.248936f, 0.248879f, 0.248821f, 0.248763f, 0.248705f, 0.248647f, 0.248589f, 0.248531f, 0.248474f, 0.248416f, 0.248358f, 0.2483f,
-0.248242f, 0.248184f, 0.248126f, 0.248068f, 0.24801f, 0.247952f, 0.247894f, 0.247836f, 0.247778f, 0.24772f, 0.247662f, 0.247604f, 0.247546f, 0.247488f, 0.24743f, 0.247372f, 0.247314f, 0.247256f, 0.247198f, 0.24714f,
-0.247082f, 0.247024f, 0.246965f, 0.246907f, 0.246849f, 0.246791f, 0.246733f, 0.246675f, 0.246617f, 0.246558f, 0.2465f, 0.246442f, 0.246384f, 0.246325f, 0.246267f, 0.246209f, 0.246151f, 0.246092f, 0.246034f, 0.245976f,
-0.245918f, 0.245859f, 0.245801f, 0.245743f, 0.245684f, 0.245626f, 0.245568f, 0.245509f, 0.245451f, 0.245392f, 0.245334f, 0.245276f, 0.245217f, 0.245159f, 0.2451f, 0.245042f, 0.244983f, 0.244925f, 0.244866f, 0.244808f,
-0.244749f, 0.244691f, 0.244632f, 0.244574f, 0.244515f, 0.244457f, 0.244398f, 0.24434f, 0.244281f, 0.244223f, 0.244164f, 0.244105f, 0.244047f, 0.243988f, 0.24393f, 0.243871f, 0.243812f, 0.243754f, 0.243695f, 0.243636f,
-0.243578f, 0.243519f, 0.24346f, 0.243401f, 0.243343f, 0.243284f, 0.243225f, 0.243166f, 0.243108f, 0.243049f, 0.24299f, 0.242931f, 0.242872f, 0.242814f, 0.242755f, 0.242696f, 0.242637f, 0.242578f, 0.242519f, 0.242461f,
-0.242402f, 0.242343f, 0.242284f, 0.242225f, 0.242166f, 0.242107f, 0.242048f, 0.241989f, 0.24193f, 0.241871f, 0.241812f, 0.241753f, 0.241694f, 0.241635f, 0.241576f, 0.241517f, 0.241458f, 0.241399f, 0.24134f, 0.241281f,
-0.241222f, 0.241163f, 0.241104f, 0.241045f, 0.240986f, 0.240926f, 0.240867f, 0.240808f, 0.240749f, 0.24069f, 0.240631f, 0.240572f, 0.240512f, 0.240453f, 0.240394f, 0.240335f, 0.240275f, 0.240216f, 0.240157f, 0.240098f,
-0.240038f, 0.239979f, 0.23992f, 0.239861f, 0.239801f, 0.239742f, 0.239683f, 0.239623f, 0.239564f, 0.239505f, 0.239445f, 0.239386f, 0.239327f, 0.239267f, 0.239208f, 0.239148f, 0.239089f, 0.239029f, 0.23897f, 0.238911f,
-0.238851f, 0.238792f, 0.238732f, 0.238673f, 0.238613f, 0.238554f, 0.238494f, 0.238435f, 0.238375f, 0.238316f, 0.238256f, 0.238196f, 0.238137f, 0.238077f, 0.238018f, 0.237958f, 0.237898f, 0.237839f, 0.237779f, 0.23772f,
-0.23766f, 0.2376f, 0.237541f, 0.237481f, 0.237421f, 0.237362f, 0.237302f, 0.237242f, 0.237182f, 0.237123f, 0.237063f, 0.237003f, 0.236943f, 0.236884f, 0.236824f, 0.236764f, 0.236704f, 0.236644f, 0.236585f, 0.236525f,
-0.236465f, 0.236405f, 0.236345f, 0.236285f, 0.236225f, 0.236166f, 0.236106f, 0.236046f, 0.235986f, 0.235926f, 0.235866f, 0.235806f, 0.235746f, 0.235686f, 0.235626f, 0.235566f, 0.235506f, 0.235446f, 0.235386f, 0.235326f,
-0.235266f, 0.235206f, 0.235146f, 0.235086f, 0.235026f, 0.234966f, 0.234906f, 0.234846f, 0.234786f, 0.234725f, 0.234665f, 0.234605f, 0.234545f, 0.234485f, 0.234425f, 0.234365f, 0.234304f, 0.234244f, 0.234184f, 0.234124f,
-0.234064f, 0.234003f, 0.233943f, 0.233883f, 0.233823f, 0.233762f, 0.233702f, 0.233642f, 0.233581f, 0.233521f, 0.233461f, 0.233401f, 0.23334f, 0.23328f, 0.233219f, 0.233159f, 0.233099f, 0.233038f, 0.232978f, 0.232918f,
-0.232857f, 0.232797f, 0.232736f, 0.232676f, 0.232615f, 0.232555f, 0.232495f, 0.232434f, 0.232374f, 0.232313f, 0.232253f, 0.232192f, 0.232132f, 0.232071f, 0.23201f, 0.23195f, 0.231889f, 0.231829f, 0.231768f, 0.231708f,
-0.231647f, 0.231586f, 0.231526f, 0.231465f, 0.231405f, 0.231344f, 0.231283f, 0.231223f, 0.231162f, 0.231101f, 0.231041f, 0.23098f, 0.230919f, 0.230858f, 0.230798f, 0.230737f, 0.230676f, 0.230615f, 0.230555f, 0.230494f,
-0.230433f, 0.230372f, 0.230312f, 0.230251f, 0.23019f, 0.230129f, 0.230068f, 0.230007f, 0.229947f, 0.229886f, 0.229825f, 0.229764f, 0.229703f, 0.229642f, 0.229581f, 0.22952f, 0.229459f, 0.229398f, 0.229337f, 0.229277f,
-0.229216f, 0.229155f, 0.229094f, 0.229033f, 0.228972f, 0.228911f, 0.22885f, 0.228788f, 0.228727f, 0.228666f, 0.228605f, 0.228544f, 0.228483f, 0.228422f, 0.228361f, 0.2283f, 0.228239f, 0.228178f, 0.228116f, 0.228055f,
-0.227994f, 0.227933f, 0.227872f, 0.227811f, 0.227749f, 0.227688f, 0.227627f, 0.227566f, 0.227505f, 0.227443f, 0.227382f, 0.227321f, 0.22726f, 0.227198f, 0.227137f, 0.227076f, 0.227014f, 0.226953f, 0.226892f, 0.22683f,
-0.226769f, 0.226708f, 0.226646f, 0.226585f, 0.226524f, 0.226462f, 0.226401f, 0.226339f, 0.226278f, 0.226217f, 0.226155f, 0.226094f, 0.226032f, 0.225971f, 0.225909f, 0.225848f, 0.225786f, 0.225725f, 0.225663f, 0.225602f,
-0.22554f, 0.225479f, 0.225417f, 0.225356f, 0.225294f, 0.225233f, 0.225171f, 0.225109f, 0.225048f, 0.224986f, 0.224925f, 0.224863f, 0.224801f, 0.22474f, 0.224678f, 0.224616f, 0.224555f, 0.224493f, 0.224431f, 0.22437f,
-0.224308f, 0.224246f, 0.224184f, 0.224123f, 0.224061f, 0.223999f, 0.223937f, 0.223876f, 0.223814f, 0.223752f, 0.22369f, 0.223628f, 0.223567f, 0.223505f, 0.223443f, 0.223381f, 0.223319f, 0.223257f, 0.223195f, 0.223134f,
-0.223072f, 0.22301f, 0.222948f, 0.222886f, 0.222824f, 0.222762f, 0.2227f, 0.222638f, 0.222576f, 0.222514f, 0.222452f, 0.22239f, 0.222328f, 0.222266f, 0.222204f, 0.222142f, 0.22208f, 0.222018f, 0.221956f, 0.221894f,
-0.221832f, 0.22177f, 0.221708f, 0.221646f, 0.221583f, 0.221521f, 0.221459f, 0.221397f, 0.221335f, 0.221273f, 0.221211f, 0.221148f, 0.221086f, 0.221024f, 0.220962f, 0.2209f, 0.220837f, 0.220775f, 0.220713f, 0.220651f,
-0.220588f, 0.220526f, 0.220464f, 0.220402f, 0.220339f, 0.220277f, 0.220215f, 0.220152f, 0.22009f, 0.220028f, 0.219965f, 0.219903f, 0.219841f, 0.219778f, 0.219716f, 0.219653f, 0.219591f, 0.219529f, 0.219466f, 0.219404f,
-0.219341f, 0.219279f, 0.219216f, 0.219154f, 0.219091f, 0.219029f, 0.218966f, 0.218904f, 0.218841f, 0.218779f, 0.218716f, 0.218654f, 0.218591f, 0.218529f, 0.218466f, 0.218403f, 0.218341f, 0.218278f, 0.218216f, 0.218153f,
-0.21809f, 0.218028f, 0.217965f, 0.217903f, 0.21784f, 0.217777f, 0.217714f, 0.217652f, 0.217589f, 0.217526f, 0.217464f, 0.217401f, 0.217338f, 0.217275f, 0.217213f, 0.21715f, 0.217087f, 0.217024f, 0.216962f, 0.216899f,
-0.216836f, 0.216773f, 0.21671f, 0.216648f, 0.216585f, 0.216522f, 0.216459f, 0.216396f, 0.216333f, 0.21627f, 0.216207f, 0.216145f, 0.216082f, 0.216019f, 0.215956f, 0.215893f, 0.21583f, 0.215767f, 0.215704f, 0.215641f,
-0.215578f, 0.215515f, 0.215452f, 0.215389f, 0.215326f, 0.215263f, 0.2152f, 0.215137f, 0.215074f, 0.215011f, 0.214948f, 0.214885f, 0.214821f, 0.214758f, 0.214695f, 0.214632f, 0.214569f, 0.214506f, 0.214443f, 0.21438f,
-0.214316f, 0.214253f, 0.21419f, 0.214127f, 0.214064f, 0.214f, 0.213937f, 0.213874f, 0.213811f, 0.213747f, 0.213684f, 0.213621f, 0.213558f, 0.213494f, 0.213431f, 0.213368f, 0.213305f, 0.213241f, 0.213178f, 0.213115f,
-0.213051f, 0.212988f, 0.212924f, 0.212861f, 0.212798f, 0.212734f, 0.212671f, 0.212608f, 0.212544f, 0.212481f, 0.212417f, 0.212354f, 0.21229f, 0.212227f, 0.212163f, 0.2121f, 0.212036f, 0.211973f, 0.211909f, 0.211846f,
-0.211782f, 0.211719f, 0.211655f, 0.211592f, 0.211528f, 0.211465f, 0.211401f, 0.211337f, 0.211274f, 0.21121f, 0.211147f, 0.211083f, 0.211019f, 0.210956f, 0.210892f, 0.210828f, 0.210765f, 0.210701f, 0.210637f, 0.210574f,
-0.21051f, 0.210446f, 0.210383f, 0.210319f, 0.210255f, 0.210191f, 0.210128f, 0.210064f, 0.21f, 0.209936f, 0.209873f, 0.209809f, 0.209745f, 0.209681f, 0.209617f, 0.209553f, 0.20949f, 0.209426f, 0.209362f, 0.209298f,
-0.209234f, 0.20917f, 0.209106f, 0.209042f, 0.208979f, 0.208915f, 0.208851f, 0.208787f, 0.208723f, 0.208659f, 0.208595f, 0.208531f, 0.208467f, 0.208403f, 0.208339f, 0.208275f, 0.208211f, 0.208147f, 0.208083f, 0.208019f,
-0.207955f, 0.207891f, 0.207827f, 0.207762f, 0.207698f, 0.207634f, 0.20757f, 0.207506f, 0.207442f, 0.207378f, 0.207314f, 0.207249f, 0.207185f, 0.207121f, 0.207057f, 0.206993f, 0.206929f, 0.206864f, 0.2068f, 0.206736f,
-0.206672f, 0.206607f, 0.206543f, 0.206479f, 0.206415f, 0.20635f, 0.206286f, 0.206222f, 0.206158f, 0.206093f, 0.206029f, 0.205965f, 0.2059f, 0.205836f, 0.205772f, 0.205707f, 0.205643f, 0.205578f, 0.205514f, 0.20545f,
-0.205385f, 0.205321f, 0.205256f, 0.205192f, 0.205127f, 0.205063f, 0.204999f, 0.204934f, 0.20487f, 0.204805f, 0.204741f, 0.204676f, 0.204612f, 0.204547f, 0.204483f, 0.204418f, 0.204353f, 0.204289f, 0.204224f, 0.20416f,
-0.204095f, 0.204031f, 0.203966f, 0.203901f, 0.203837f, 0.203772f, 0.203707f, 0.203643f, 0.203578f, 0.203514f, 0.203449f, 0.203384f, 0.203319f, 0.203255f, 0.20319f, 0.203125f, 0.203061f, 0.202996f, 0.202931f, 0.202866f,
-0.202802f, 0.202737f, 0.202672f, 0.202607f, 0.202543f, 0.202478f, 0.202413f, 0.202348f, 0.202283f, 0.202218f, 0.202154f, 0.202089f, 0.202024f, 0.201959f, 0.201894f, 0.201829f, 0.201764f, 0.201699f, 0.201635f, 0.20157f,
-0.201505f, 0.20144f, 0.201375f, 0.20131f, 0.201245f, 0.20118f, 0.201115f, 0.20105f, 0.200985f, 0.20092f, 0.200855f, 0.20079f, 0.200725f, 0.20066f, 0.200595f, 0.20053f, 0.200465f, 0.2004f, 0.200334f, 0.200269f,
-0.200204f, 0.200139f, 0.200074f, 0.200009f, 0.199944f, 0.199879f, 0.199813f, 0.199748f, 0.199683f, 0.199618f, 0.199553f, 0.199488f, 0.199422f, 0.199357f, 0.199292f, 0.199227f, 0.199161f, 0.199096f, 0.199031f, 0.198966f,
-0.1989f, 0.198835f, 0.19877f, 0.198704f, 0.198639f, 0.198574f, 0.198508f, 0.198443f, 0.198378f, 0.198312f, 0.198247f, 0.198182f, 0.198116f, 0.198051f, 0.197986f, 0.19792f, 0.197855f, 0.197789f, 0.197724f, 0.197658f,
-0.197593f, 0.197528f, 0.197462f, 0.197397f, 0.197331f, 0.197266f, 0.1972f, 0.197135f, 0.197069f, 0.197004f, 0.196938f, 0.196872f, 0.196807f, 0.196741f, 0.196676f, 0.19661f, 0.196545f, 0.196479f, 0.196413f, 0.196348f,
-0.196282f, 0.196217f, 0.196151f, 0.196085f, 0.19602f, 0.195954f, 0.195888f, 0.195823f, 0.195757f, 0.195691f, 0.195626f, 0.19556f, 0.195494f, 0.195428f, 0.195363f, 0.195297f, 0.195231f, 0.195165f, 0.1951f, 0.195034f,
-0.194968f, 0.194902f, 0.194836f, 0.194771f, 0.194705f, 0.194639f, 0.194573f, 0.194507f, 0.194441f, 0.194375f, 0.19431f, 0.194244f, 0.194178f, 0.194112f, 0.194046f, 0.19398f, 0.193914f, 0.193848f, 0.193782f, 0.193716f,
-0.19365f, 0.193584f, 0.193518f, 0.193452f, 0.193386f, 0.19332f, 0.193254f, 0.193188f, 0.193122f, 0.193056f, 0.19299f, 0.192924f, 0.192858f, 0.192792f, 0.192726f, 0.19266f, 0.192594f, 0.192528f, 0.192462f, 0.192395f,
-0.192329f, 0.192263f, 0.192197f, 0.192131f, 0.192065f, 0.191999f, 0.191932f, 0.191866f, 0.1918f, 0.191734f, 0.191668f, 0.191601f, 0.191535f, 0.191469f, 0.191403f, 0.191336f, 0.19127f, 0.191204f, 0.191138f, 0.191071f,
-0.191005f, 0.190939f, 0.190872f, 0.190806f, 0.19074f, 0.190673f, 0.190607f, 0.190541f, 0.190474f, 0.190408f, 0.190341f, 0.190275f, 0.190209f, 0.190142f, 0.190076f, 0.190009f, 0.189943f, 0.189877f, 0.18981f, 0.189744f,
-0.189677f, 0.189611f, 0.189544f, 0.189478f, 0.189411f, 0.189345f, 0.189278f, 0.189212f, 0.189145f, 0.189079f, 0.189012f, 0.188945f, 0.188879f, 0.188812f, 0.188746f, 0.188679f, 0.188613f, 0.188546f, 0.188479f, 0.188413f,
-0.188346f, 0.188279f, 0.188213f, 0.188146f, 0.188079f, 0.188013f, 0.187946f, 0.187879f, 0.187813f, 0.187746f, 0.187679f, 0.187612f, 0.187546f, 0.187479f, 0.187412f, 0.187345f, 0.187279f, 0.187212f, 0.187145f, 0.187078f,
-0.187012f, 0.186945f, 0.186878f, 0.186811f, 0.186744f, 0.186677f, 0.186611f, 0.186544f, 0.186477f, 0.18641f, 0.186343f, 0.186276f, 0.186209f, 0.186142f, 0.186075f, 0.186009f, 0.185942f, 0.185875f, 0.185808f, 0.185741f,
-0.185674f, 0.185607f, 0.18554f, 0.185473f, 0.185406f, 0.185339f, 0.185272f, 0.185205f, 0.185138f, 0.185071f, 0.185004f, 0.184937f, 0.184869f, 0.184802f, 0.184735f, 0.184668f, 0.184601f, 0.184534f, 0.184467f, 0.1844f,
-0.184333f, 0.184265f, 0.184198f, 0.184131f, 0.184064f, 0.183997f, 0.18393f, 0.183862f, 0.183795f, 0.183728f, 0.183661f, 0.183594f, 0.183526f, 0.183459f, 0.183392f, 0.183325f, 0.183257f, 0.18319f, 0.183123f, 0.183055f,
-0.182988f, 0.182921f, 0.182854f, 0.182786f, 0.182719f, 0.182652f, 0.182584f, 0.182517f, 0.182449f, 0.182382f, 0.182315f, 0.182247f, 0.18218f, 0.182112f, 0.182045f, 0.181978f, 0.18191f, 0.181843f, 0.181775f, 0.181708f,
-0.18164f, 0.181573f, 0.181505f, 0.181438f, 0.18137f, 0.181303f, 0.181235f, 0.181168f, 0.1811f, 0.181033f, 0.180965f, 0.180898f, 0.18083f, 0.180763f, 0.180695f, 0.180627f, 0.18056f, 0.180492f, 0.180425f, 0.180357f,
-0.180289f, 0.180222f, 0.180154f, 0.180086f, 0.180019f, 0.179951f, 0.179883f, 0.179816f, 0.179748f, 0.17968f, 0.179613f, 0.179545f, 0.179477f, 0.179409f, 0.179342f, 0.179274f, 0.179206f, 0.179138f, 0.179071f, 0.179003f,
-0.178935f, 0.178867f, 0.178799f, 0.178732f, 0.178664f, 0.178596f, 0.178528f, 0.17846f, 0.178392f, 0.178325f, 0.178257f, 0.178189f, 0.178121f, 0.178053f, 0.177985f, 0.177917f, 0.177849f, 0.177781f, 0.177713f, 0.177645f,
-0.177578f, 0.17751f, 0.177442f, 0.177374f, 0.177306f, 0.177238f, 0.17717f, 0.177102f, 0.177034f, 0.176966f, 0.176898f, 0.176829f, 0.176761f, 0.176693f, 0.176625f, 0.176557f, 0.176489f, 0.176421f, 0.176353f, 0.176285f,
-0.176217f, 0.176149f, 0.17608f, 0.176012f, 0.175944f, 0.175876f, 0.175808f, 0.17574f, 0.175671f, 0.175603f, 0.175535f, 0.175467f, 0.175399f, 0.17533f, 0.175262f, 0.175194f, 0.175126f, 0.175057f, 0.174989f, 0.174921f,
-0.174853f, 0.174784f, 0.174716f, 0.174648f, 0.174579f, 0.174511f, 0.174443f, 0.174374f, 0.174306f, 0.174238f, 0.174169f, 0.174101f, 0.174033f, 0.173964f, 0.173896f, 0.173827f, 0.173759f, 0.173691f, 0.173622f, 0.173554f,
-0.173485f, 0.173417f, 0.173348f, 0.17328f, 0.173212f, 0.173143f, 0.173075f, 0.173006f, 0.172938f, 0.172869f, 0.172801f, 0.172732f, 0.172663f, 0.172595f, 0.172526f, 0.172458f, 0.172389f, 0.172321f, 0.172252f, 0.172183f,
-0.172115f, 0.172046f, 0.171978f, 0.171909f, 0.17184f, 0.171772f, 0.171703f, 0.171634f, 0.171566f, 0.171497f, 0.171428f, 0.17136f, 0.171291f, 0.171222f, 0.171154f, 0.171085f, 0.171016f, 0.170947f, 0.170879f, 0.17081f,
-0.170741f, 0.170672f, 0.170604f, 0.170535f, 0.170466f, 0.170397f, 0.170328f, 0.17026f, 0.170191f, 0.170122f, 0.170053f, 0.169984f, 0.169915f, 0.169847f, 0.169778f, 0.169709f, 0.16964f, 0.169571f, 0.169502f, 0.169433f,
-0.169364f, 0.169295f, 0.169226f, 0.169158f, 0.169089f, 0.16902f, 0.168951f, 0.168882f, 0.168813f, 0.168744f, 0.168675f, 0.168606f, 0.168537f, 0.168468f, 0.168399f, 0.16833f, 0.168261f, 0.168191f, 0.168122f, 0.168053f,
-0.167984f, 0.167915f, 0.167846f, 0.167777f, 0.167708f, 0.167639f, 0.16757f, 0.167501f, 0.167431f, 0.167362f, 0.167293f, 0.167224f, 0.167155f, 0.167086f, 0.167016f, 0.166947f, 0.166878f, 0.166809f, 0.16674f, 0.16667f,
-0.166601f, 0.166532f, 0.166463f, 0.166393f, 0.166324f, 0.166255f, 0.166186f, 0.166116f, 0.166047f, 0.165978f, 0.165908f, 0.165839f, 0.16577f, 0.1657f, 0.165631f, 0.165562f, 0.165492f, 0.165423f, 0.165354f, 0.165284f,
-0.165215f, 0.165145f, 0.165076f, 0.165007f, 0.164937f, 0.164868f, 0.164798f, 0.164729f, 0.164659f, 0.16459f, 0.16452f, 0.164451f, 0.164381f, 0.164312f, 0.164242f, 0.164173f, 0.164103f, 0.164034f, 0.163964f, 0.163895f,
-0.163825f, 0.163756f, 0.163686f, 0.163617f, 0.163547f, 0.163477f, 0.163408f, 0.163338f, 0.163269f, 0.163199f, 0.163129f, 0.16306f, 0.16299f, 0.16292f, 0.162851f, 0.162781f, 0.162711f, 0.162642f, 0.162572f, 0.162502f,
-0.162433f, 0.162363f, 0.162293f, 0.162223f, 0.162154f, 0.162084f, 0.162014f, 0.161945f, 0.161875f, 0.161805f, 0.161735f, 0.161665f, 0.161596f, 0.161526f, 0.161456f, 0.161386f, 0.161316f, 0.161246f, 0.161177f, 0.161107f,
-0.161037f, 0.160967f, 0.160897f, 0.160827f, 0.160757f, 0.160688f, 0.160618f, 0.160548f, 0.160478f, 0.160408f, 0.160338f, 0.160268f, 0.160198f, 0.160128f, 0.160058f, 0.159988f, 0.159918f, 0.159848f, 0.159778f, 0.159708f,
-0.159638f, 0.159568f, 0.159498f, 0.159428f, 0.159358f, 0.159288f, 0.159218f, 0.159148f, 0.159078f, 0.159008f, 0.158938f, 0.158867f, 0.158797f, 0.158727f, 0.158657f, 0.158587f, 0.158517f, 0.158447f, 0.158377f, 0.158306f,
-0.158236f, 0.158166f, 0.158096f, 0.158026f, 0.157955f, 0.157885f, 0.157815f, 0.157745f, 0.157675f, 0.157604f, 0.157534f, 0.157464f, 0.157394f, 0.157323f, 0.157253f, 0.157183f, 0.157112f, 0.157042f, 0.156972f, 0.156902f,
-0.156831f, 0.156761f, 0.156691f, 0.15662f, 0.15655f, 0.15648f, 0.156409f, 0.156339f, 0.156268f, 0.156198f, 0.156128f, 0.156057f, 0.155987f, 0.155916f, 0.155846f, 0.155776f, 0.155705f, 0.155635f, 0.155564f, 0.155494f,
-0.155423f, 0.155353f, 0.155282f, 0.155212f, 0.155141f, 0.155071f, 0.155f, 0.15493f, 0.154859f, 0.154789f, 0.154718f, 0.154648f, 0.154577f, 0.154506f, 0.154436f, 0.154365f, 0.154295f, 0.154224f, 0.154153f, 0.154083f,
-0.154012f, 0.153942f, 0.153871f, 0.1538f, 0.15373f, 0.153659f, 0.153588f, 0.153518f, 0.153447f, 0.153376f, 0.153305f, 0.153235f, 0.153164f, 0.153093f, 0.153023f, 0.152952f, 0.152881f, 0.15281f, 0.15274f, 0.152669f,
-0.152598f, 0.152527f, 0.152456f, 0.152386f, 0.152315f, 0.152244f, 0.152173f, 0.152102f, 0.152032f, 0.151961f, 0.15189f, 0.151819f, 0.151748f, 0.151677f, 0.151606f, 0.151535f, 0.151465f, 0.151394f, 0.151323f, 0.151252f,
-0.151181f, 0.15111f, 0.151039f, 0.150968f, 0.150897f, 0.150826f, 0.150755f, 0.150684f, 0.150613f, 0.150542f, 0.150471f, 0.1504f, 0.150329f, 0.150258f, 0.150187f, 0.150116f, 0.150045f, 0.149974f, 0.149903f, 0.149832f,
-0.149761f, 0.14969f, 0.149619f, 0.149548f, 0.149476f, 0.149405f, 0.149334f, 0.149263f, 0.149192f, 0.149121f, 0.14905f, 0.148978f, 0.148907f, 0.148836f, 0.148765f, 0.148694f, 0.148623f, 0.148551f, 0.14848f, 0.148409f,
-0.148338f, 0.148266f, 0.148195f, 0.148124f, 0.148053f, 0.147981f, 0.14791f, 0.147839f, 0.147768f, 0.147696f, 0.147625f, 0.147554f, 0.147482f, 0.147411f, 0.14734f, 0.147268f, 0.147197f, 0.147126f, 0.147054f, 0.146983f,
-0.146912f, 0.14684f, 0.146769f, 0.146697f, 0.146626f, 0.146555f, 0.146483f, 0.146412f, 0.14634f, 0.146269f, 0.146197f, 0.146126f, 0.146054f, 0.145983f, 0.145912f, 0.14584f, 0.145769f, 0.145697f, 0.145626f, 0.145554f,
-0.145482f, 0.145411f, 0.145339f, 0.145268f, 0.145196f, 0.145125f, 0.145053f, 0.144982f, 0.14491f, 0.144838f, 0.144767f, 0.144695f, 0.144624f, 0.144552f, 0.14448f, 0.144409f, 0.144337f, 0.144265f, 0.144194f, 0.144122f,
-0.14405f, 0.143979f, 0.143907f, 0.143835f, 0.143764f, 0.143692f, 0.14362f, 0.143549f, 0.143477f, 0.143405f, 0.143333f, 0.143262f, 0.14319f, 0.143118f, 0.143046f, 0.142974f, 0.142903f, 0.142831f, 0.142759f, 0.142687f,
-0.142615f, 0.142544f, 0.142472f, 0.1424f, 0.142328f, 0.142256f, 0.142184f, 0.142113f, 0.142041f, 0.141969f, 0.141897f, 0.141825f, 0.141753f, 0.141681f, 0.141609f, 0.141537f, 0.141465f, 0.141393f, 0.141321f, 0.14125f,
-0.141178f, 0.141106f, 0.141034f, 0.140962f, 0.14089f, 0.140818f, 0.140746f, 0.140674f, 0.140602f, 0.14053f, 0.140457f, 0.140385f, 0.140313f, 0.140241f, 0.140169f, 0.140097f, 0.140025f, 0.139953f, 0.139881f, 0.139809f,
-0.139737f, 0.139665f, 0.139592f, 0.13952f, 0.139448f, 0.139376f, 0.139304f, 0.139232f, 0.13916f, 0.139087f, 0.139015f, 0.138943f, 0.138871f, 0.138799f, 0.138726f, 0.138654f, 0.138582f, 0.13851f, 0.138437f, 0.138365f,
-0.138293f, 0.138221f, 0.138148f, 0.138076f, 0.138004f, 0.137932f, 0.137859f, 0.137787f, 0.137715f, 0.137642f, 0.13757f, 0.137498f, 0.137425f, 0.137353f, 0.137281f, 0.137208f, 0.137136f, 0.137064f, 0.136991f, 0.136919f,
-0.136846f, 0.136774f, 0.136702f, 0.136629f, 0.136557f, 0.136484f, 0.136412f, 0.136339f, 0.136267f, 0.136194f, 0.136122f, 0.13605f, 0.135977f, 0.135905f, 0.135832f, 0.13576f, 0.135687f, 0.135614f, 0.135542f, 0.135469f,
-0.135397f, 0.135324f, 0.135252f, 0.135179f, 0.135107f, 0.135034f, 0.134961f, 0.134889f, 0.134816f, 0.134744f, 0.134671f, 0.134598f, 0.134526f, 0.134453f, 0.134381f, 0.134308f, 0.134235f, 0.134163f, 0.13409f, 0.134017f,
-0.133945f, 0.133872f, 0.133799f, 0.133726f, 0.133654f, 0.133581f, 0.133508f, 0.133436f, 0.133363f, 0.13329f, 0.133217f, 0.133144f, 0.133072f, 0.132999f, 0.132926f, 0.132853f, 0.132781f, 0.132708f, 0.132635f, 0.132562f,
-0.132489f, 0.132416f, 0.132344f, 0.132271f, 0.132198f, 0.132125f, 0.132052f, 0.131979f, 0.131906f, 0.131834f, 0.131761f, 0.131688f, 0.131615f, 0.131542f, 0.131469f, 0.131396f, 0.131323f, 0.13125f, 0.131177f, 0.131104f,
-0.131031f, 0.130958f, 0.130885f, 0.130812f, 0.130739f, 0.130666f, 0.130593f, 0.13052f, 0.130447f, 0.130374f, 0.130301f, 0.130228f, 0.130155f, 0.130082f, 0.130009f, 0.129936f, 0.129863f, 0.12979f, 0.129717f, 0.129643f,
-0.12957f, 0.129497f, 0.129424f, 0.129351f, 0.129278f, 0.129205f, 0.129132f, 0.129058f, 0.128985f, 0.128912f, 0.128839f, 0.128766f, 0.128692f, 0.128619f, 0.128546f, 0.128473f, 0.1284f, 0.128326f, 0.128253f, 0.12818f,
-0.128107f, 0.128033f, 0.12796f, 0.127887f, 0.127814f, 0.12774f, 0.127667f, 0.127594f, 0.12752f, 0.127447f, 0.127374f, 0.1273f, 0.127227f, 0.127154f, 0.12708f, 0.127007f, 0.126934f, 0.12686f, 0.126787f, 0.126714f,
-0.12664f, 0.126567f, 0.126493f, 0.12642f, 0.126347f, 0.126273f, 0.1262f, 0.126126f, 0.126053f, 0.125979f, 0.125906f, 0.125832f, 0.125759f, 0.125685f, 0.125612f, 0.125538f, 0.125465f, 0.125391f, 0.125318f, 0.125244f,
-0.125171f, 0.125097f, 0.125024f, 0.12495f, 0.124877f, 0.124803f, 0.12473f, 0.124656f, 0.124582f, 0.124509f, 0.124435f, 0.124362f, 0.124288f, 0.124214f, 0.124141f, 0.124067f, 0.123993f, 0.12392f, 0.123846f, 0.123773f,
-0.123699f, 0.123625f, 0.123551f, 0.123478f, 0.123404f, 0.12333f, 0.123257f, 0.123183f, 0.123109f, 0.123036f, 0.122962f, 0.122888f, 0.122814f, 0.122741f, 0.122667f, 0.122593f, 0.122519f, 0.122445f, 0.122372f, 0.122298f,
-0.122224f, 0.12215f, 0.122076f, 0.122003f, 0.121929f, 0.121855f, 0.121781f, 0.121707f, 0.121633f, 0.121559f, 0.121486f, 0.121412f, 0.121338f, 0.121264f, 0.12119f, 0.121116f, 0.121042f, 0.120968f, 0.120894f, 0.12082f,
-0.120746f, 0.120673f, 0.120599f, 0.120525f, 0.120451f, 0.120377f, 0.120303f, 0.120229f, 0.120155f, 0.120081f, 0.120007f, 0.119933f, 0.119859f, 0.119785f, 0.119711f, 0.119636f, 0.119562f, 0.119488f, 0.119414f, 0.11934f,
-0.119266f, 0.119192f, 0.119118f, 0.119044f, 0.11897f, 0.118896f, 0.118822f, 0.118747f, 0.118673f, 0.118599f, 0.118525f, 0.118451f, 0.118377f, 0.118303f, 0.118228f, 0.118154f, 0.11808f, 0.118006f, 0.117932f, 0.117857f,
-0.117783f, 0.117709f, 0.117635f, 0.11756f, 0.117486f, 0.117412f, 0.117338f, 0.117263f, 0.117189f, 0.117115f, 0.117041f, 0.116966f, 0.116892f, 0.116818f, 0.116743f, 0.116669f, 0.116595f, 0.11652f, 0.116446f, 0.116372f,
-0.116297f, 0.116223f, 0.116149f, 0.116074f, 0.116f, 0.115926f, 0.115851f, 0.115777f, 0.115702f, 0.115628f, 0.115554f, 0.115479f, 0.115405f, 0.11533f, 0.115256f, 0.115181f, 0.115107f, 0.115032f, 0.114958f, 0.114883f,
-0.114809f, 0.114735f, 0.11466f, 0.114586f, 0.114511f, 0.114436f, 0.114362f, 0.114287f, 0.114213f, 0.114138f, 0.114064f, 0.113989f, 0.113915f, 0.11384f, 0.113766f, 0.113691f, 0.113616f, 0.113542f, 0.113467f, 0.113393f,
-0.113318f, 0.113243f, 0.113169f, 0.113094f, 0.113019f, 0.112945f, 0.11287f, 0.112795f, 0.112721f, 0.112646f, 0.112571f, 0.112497f, 0.112422f, 0.112347f, 0.112273f, 0.112198f, 0.112123f, 0.112048f, 0.111974f, 0.111899f,
-0.111824f, 0.111749f, 0.111675f, 0.1116f, 0.111525f, 0.11145f, 0.111375f, 0.111301f, 0.111226f, 0.111151f, 0.111076f, 0.111001f, 0.110927f, 0.110852f, 0.110777f, 0.110702f, 0.110627f, 0.110552f, 0.110477f, 0.110403f,
-0.110328f, 0.110253f, 0.110178f, 0.110103f, 0.110028f, 0.109953f, 0.109878f, 0.109803f, 0.109728f, 0.109653f, 0.109579f, 0.109504f, 0.109429f, 0.109354f, 0.109279f, 0.109204f, 0.109129f, 0.109054f, 0.108979f, 0.108904f,
-0.108829f, 0.108754f, 0.108679f, 0.108604f, 0.108529f, 0.108453f, 0.108378f, 0.108303f, 0.108228f, 0.108153f, 0.108078f, 0.108003f, 0.107928f, 0.107853f, 0.107778f, 0.107703f, 0.107628f, 0.107552f, 0.107477f, 0.107402f,
-0.107327f, 0.107252f, 0.107177f, 0.107101f, 0.107026f, 0.106951f, 0.106876f, 0.106801f, 0.106726f, 0.10665f, 0.106575f, 0.1065f, 0.106425f, 0.106349f, 0.106274f, 0.106199f, 0.106124f, 0.106048f, 0.105973f, 0.105898f,
-0.105823f, 0.105747f, 0.105672f, 0.105597f, 0.105521f, 0.105446f, 0.105371f, 0.105296f, 0.10522f, 0.105145f, 0.10507f, 0.104994f, 0.104919f, 0.104843f, 0.104768f, 0.104693f, 0.104617f, 0.104542f, 0.104467f, 0.104391f,
-0.104316f, 0.10424f, 0.104165f, 0.104089f, 0.104014f, 0.103939f, 0.103863f, 0.103788f, 0.103712f, 0.103637f, 0.103561f, 0.103486f, 0.10341f, 0.103335f, 0.103259f, 0.103184f, 0.103108f, 0.103033f, 0.102957f, 0.102882f,
-0.102806f, 0.102731f, 0.102655f, 0.10258f, 0.102504f, 0.102428f, 0.102353f, 0.102277f, 0.102202f, 0.102126f, 0.102051f, 0.101975f, 0.101899f, 0.101824f, 0.101748f, 0.101672f, 0.101597f, 0.101521f, 0.101446f, 0.10137f,
-0.101294f, 0.101219f, 0.101143f, 0.101067f, 0.100991f, 0.100916f, 0.10084f, 0.100764f, 0.100689f, 0.100613f, 0.100537f, 0.100461f, 0.100386f, 0.10031f, 0.100234f, 0.100158f, 0.100083f, 0.100007f, 0.099931f, 0.099855f,
-0.09978f, 0.099704f, 0.099628f, 0.099552f, 0.099476f, 0.0994f, 0.099325f, 0.099249f, 0.099173f, 0.099097f, 0.099021f, 0.098945f, 0.09887f, 0.098794f, 0.098718f, 0.098642f, 0.098566f, 0.09849f, 0.098414f, 0.098338f,
-0.098262f, 0.098186f, 0.098111f, 0.098035f, 0.097959f, 0.097883f, 0.097807f, 0.097731f, 0.097655f, 0.097579f, 0.097503f, 0.097427f, 0.097351f, 0.097275f, 0.097199f, 0.097123f, 0.097047f, 0.096971f, 0.096895f, 0.096819f,
-0.096743f, 0.096667f, 0.096591f, 0.096514f, 0.096438f, 0.096362f, 0.096286f, 0.09621f, 0.096134f, 0.096058f, 0.095982f, 0.095906f, 0.09583f, 0.095753f, 0.095677f, 0.095601f, 0.095525f, 0.095449f, 0.095373f, 0.095297f,
-0.09522f, 0.095144f, 0.095068f, 0.094992f, 0.094916f, 0.094839f, 0.094763f, 0.094687f, 0.094611f, 0.094535f, 0.094458f, 0.094382f, 0.094306f, 0.09423f, 0.094153f, 0.094077f, 0.094001f, 0.093925f, 0.093848f, 0.093772f,
-0.093696f, 0.093619f, 0.093543f, 0.093467f, 0.09339f, 0.093314f, 0.093238f, 0.093161f, 0.093085f, 0.093009f, 0.092932f, 0.092856f, 0.09278f, 0.092703f, 0.092627f, 0.09255f, 0.092474f, 0.092398f, 0.092321f, 0.092245f,
-0.092168f, 0.092092f, 0.092016f, 0.091939f, 0.091863f, 0.091786f, 0.09171f, 0.091633f, 0.091557f, 0.09148f, 0.091404f, 0.091327f, 0.091251f, 0.091174f, 0.091098f, 0.091021f, 0.090945f, 0.090868f, 0.090792f, 0.090715f,
-0.090639f, 0.090562f, 0.090486f, 0.090409f, 0.090332f, 0.090256f, 0.090179f, 0.090103f, 0.090026f, 0.08995f, 0.089873f, 0.089796f, 0.08972f, 0.089643f, 0.089566f, 0.08949f, 0.089413f, 0.089336f, 0.08926f, 0.089183f,
-0.089107f, 0.08903f, 0.088953f, 0.088876f, 0.0888f, 0.088723f, 0.088646f, 0.08857f, 0.088493f, 0.088416f, 0.088339f, 0.088263f, 0.088186f, 0.088109f, 0.088033f, 0.087956f, 0.087879f, 0.087802f, 0.087725f, 0.087649f,
-0.087572f, 0.087495f, 0.087418f, 0.087341f, 0.087265f, 0.087188f, 0.087111f, 0.087034f, 0.086957f, 0.08688f, 0.086804f, 0.086727f, 0.08665f, 0.086573f, 0.086496f, 0.086419f, 0.086342f, 0.086265f, 0.086189f, 0.086112f,
-0.086035f, 0.085958f, 0.085881f, 0.085804f, 0.085727f, 0.08565f, 0.085573f, 0.085496f, 0.085419f, 0.085342f, 0.085265f, 0.085188f, 0.085111f, 0.085034f, 0.084957f, 0.08488f, 0.084803f, 0.084726f, 0.084649f, 0.084572f,
-0.084495f, 0.084418f, 0.084341f, 0.084264f, 0.084187f, 0.08411f, 0.084033f, 0.083956f, 0.083879f, 0.083802f, 0.083725f, 0.083647f, 0.08357f, 0.083493f, 0.083416f, 0.083339f, 0.083262f, 0.083185f, 0.083108f, 0.08303f,
-0.082953f, 0.082876f, 0.082799f, 0.082722f, 0.082645f, 0.082567f, 0.08249f, 0.082413f, 0.082336f, 0.082259f, 0.082181f, 0.082104f, 0.082027f, 0.08195f, 0.081873f, 0.081795f, 0.081718f, 0.081641f, 0.081564f, 0.081486f,
-0.081409f, 0.081332f, 0.081254f, 0.081177f, 0.0811f, 0.081023f, 0.080945f, 0.080868f, 0.080791f, 0.080713f, 0.080636f, 0.080559f, 0.080481f, 0.080404f, 0.080327f, 0.080249f, 0.080172f, 0.080094f, 0.080017f, 0.07994f,
-0.079862f, 0.079785f, 0.079707f, 0.07963f, 0.079553f, 0.079475f, 0.079398f, 0.07932f, 0.079243f, 0.079165f, 0.079088f, 0.079011f, 0.078933f, 0.078856f, 0.078778f, 0.078701f, 0.078623f, 0.078546f, 0.078468f, 0.078391f,
-0.078313f, 0.078236f, 0.078158f, 0.078081f, 0.078003f, 0.077926f, 0.077848f, 0.07777f, 0.077693f, 0.077615f, 0.077538f, 0.07746f, 0.077383f, 0.077305f, 0.077227f, 0.07715f, 0.077072f, 0.076995f, 0.076917f, 0.076839f,
-0.076762f, 0.076684f, 0.076606f, 0.076529f, 0.076451f, 0.076374f, 0.076296f, 0.076218f, 0.076141f, 0.076063f, 0.075985f, 0.075907f, 0.07583f, 0.075752f, 0.075674f, 0.075597f, 0.075519f, 0.075441f, 0.075363f, 0.075286f,
-0.075208f, 0.07513f, 0.075052f, 0.074975f, 0.074897f, 0.074819f, 0.074741f, 0.074664f, 0.074586f, 0.074508f, 0.07443f, 0.074352f, 0.074275f, 0.074197f, 0.074119f, 0.074041f, 0.073963f, 0.073885f, 0.073808f, 0.07373f,
-0.073652f, 0.073574f, 0.073496f, 0.073418f, 0.07334f, 0.073262f, 0.073185f, 0.073107f, 0.073029f, 0.072951f, 0.072873f, 0.072795f, 0.072717f, 0.072639f, 0.072561f, 0.072483f, 0.072405f, 0.072327f, 0.072249f, 0.072171f,
-0.072093f, 0.072015f, 0.071937f, 0.071859f, 0.071781f, 0.071703f, 0.071625f, 0.071547f, 0.071469f, 0.071391f, 0.071313f, 0.071235f, 0.071157f, 0.071079f, 0.071001f, 0.070923f, 0.070845f, 0.070767f, 0.070689f, 0.070611f,
-0.070533f, 0.070455f, 0.070376f, 0.070298f, 0.07022f, 0.070142f, 0.070064f, 0.069986f, 0.069908f, 0.06983f, 0.069751f, 0.069673f, 0.069595f, 0.069517f, 0.069439f, 0.069361f, 0.069282f, 0.069204f, 0.069126f, 0.069048f,
-0.06897f, 0.068891f, 0.068813f, 0.068735f, 0.068657f, 0.068578f, 0.0685f, 0.068422f, 0.068344f, 0.068265f, 0.068187f, 0.068109f, 0.068031f, 0.067952f, 0.067874f, 0.067796f, 0.067717f, 0.067639f, 0.067561f, 0.067483f,
-0.067404f, 0.067326f, 0.067248f, 0.067169f, 0.067091f, 0.067013f, 0.066934f, 0.066856f, 0.066777f, 0.066699f, 0.066621f, 0.066542f, 0.066464f, 0.066386f, 0.066307f, 0.066229f, 0.06615f, 0.066072f, 0.065994f, 0.065915f,
-0.065837f, 0.065758f, 0.06568f, 0.065601f, 0.065523f, 0.065444f, 0.065366f, 0.065287f, 0.065209f, 0.06513f, 0.065052f, 0.064974f, 0.064895f, 0.064817f, 0.064738f, 0.064659f, 0.064581f, 0.064502f, 0.064424f, 0.064345f,
-0.064267f, 0.064188f, 0.06411f, 0.064031f, 0.063953f, 0.063874f, 0.063795f, 0.063717f, 0.063638f, 0.06356f, 0.063481f, 0.063402f, 0.063324f, 0.063245f, 0.063167f, 0.063088f, 0.063009f, 0.062931f, 0.062852f, 0.062773f,
-0.062695f, 0.062616f, 0.062537f, 0.062459f, 0.06238f, 0.062301f, 0.062223f, 0.062144f, 0.062065f, 0.061987f, 0.061908f, 0.061829f, 0.06175f, 0.061672f, 0.061593f, 0.061514f, 0.061435f, 0.061357f, 0.061278f, 0.061199f,
-0.06112f, 0.061042f, 0.060963f, 0.060884f, 0.060805f, 0.060726f, 0.060648f, 0.060569f, 0.06049f, 0.060411f, 0.060332f, 0.060254f, 0.060175f, 0.060096f, 0.060017f, 0.059938f, 0.059859f, 0.059781f, 0.059702f, 0.059623f,
-0.059544f, 0.059465f, 0.059386f, 0.059307f, 0.059228f, 0.059149f, 0.059071f, 0.058992f, 0.058913f, 0.058834f, 0.058755f, 0.058676f, 0.058597f, 0.058518f, 0.058439f, 0.05836f, 0.058281f, 0.058202f, 0.058123f, 0.058044f,
-0.057965f, 0.057886f, 0.057807f, 0.057728f, 0.057649f, 0.05757f, 0.057491f, 0.057412f, 0.057333f, 0.057254f, 0.057175f, 0.057096f, 0.057017f, 0.056938f, 0.056859f, 0.05678f, 0.056701f, 0.056622f, 0.056542f, 0.056463f,
-0.056384f, 0.056305f, 0.056226f, 0.056147f, 0.056068f, 0.055989f, 0.05591f, 0.05583f, 0.055751f, 0.055672f, 0.055593f, 0.055514f, 0.055435f, 0.055356f, 0.055276f, 0.055197f, 0.055118f, 0.055039f, 0.05496f, 0.05488f,
-0.054801f, 0.054722f, 0.054643f, 0.054564f, 0.054484f, 0.054405f, 0.054326f, 0.054247f, 0.054167f, 0.054088f, 0.054009f, 0.05393f, 0.05385f, 0.053771f, 0.053692f, 0.053613f, 0.053533f, 0.053454f, 0.053375f, 0.053295f,
-0.053216f, 0.053137f, 0.053057f, 0.052978f, 0.052899f, 0.052819f, 0.05274f, 0.052661f, 0.052581f, 0.052502f, 0.052423f, 0.052343f, 0.052264f, 0.052184f, 0.052105f, 0.052026f, 0.051946f, 0.051867f, 0.051787f, 0.051708f,
-0.051629f, 0.051549f, 0.05147f, 0.05139f, 0.051311f, 0.051231f, 0.051152f, 0.051073f, 0.050993f, 0.050914f, 0.050834f, 0.050755f, 0.050675f, 0.050596f, 0.050516f, 0.050437f, 0.050357f, 0.050278f, 0.050198f, 0.050119f,
-0.050039f, 0.04996f, 0.04988f, 0.049801f, 0.049721f, 0.049641f, 0.049562f, 0.049482f, 0.049403f, 0.049323f, 0.049244f, 0.049164f, 0.049084f, 0.049005f, 0.048925f, 0.048846f, 0.048766f, 0.048686f, 0.048607f, 0.048527f,
-0.048448f, 0.048368f, 0.048288f, 0.048209f, 0.048129f, 0.048049f, 0.04797f, 0.04789f, 0.04781f, 0.047731f, 0.047651f, 0.047571f, 0.047492f, 0.047412f, 0.047332f, 0.047252f, 0.047173f, 0.047093f, 0.047013f, 0.046934f,
-0.046854f, 0.046774f, 0.046694f, 0.046615f, 0.046535f, 0.046455f, 0.046375f, 0.046296f, 0.046216f, 0.046136f, 0.046056f, 0.045976f, 0.045897f, 0.045817f, 0.045737f, 0.045657f, 0.045577f, 0.045498f, 0.045418f, 0.045338f,
-0.045258f, 0.045178f, 0.045098f, 0.045018f, 0.044939f, 0.044859f, 0.044779f, 0.044699f, 0.044619f, 0.044539f, 0.044459f, 0.044379f, 0.0443f, 0.04422f, 0.04414f, 0.04406f, 0.04398f, 0.0439f, 0.04382f, 0.04374f,
-0.04366f, 0.04358f, 0.0435f, 0.04342f, 0.04334f, 0.04326f, 0.04318f, 0.0431f, 0.04302f, 0.04294f, 0.04286f, 0.04278f, 0.0427f, 0.04262f, 0.04254f, 0.04246f, 0.04238f, 0.0423f, 0.04222f, 0.04214f,
-0.04206f, 0.04198f, 0.0419f, 0.04182f, 0.04174f, 0.04166f, 0.04158f, 0.0415f, 0.04142f, 0.04134f, 0.041259f, 0.041179f, 0.041099f, 0.041019f, 0.040939f, 0.040859f, 0.040779f, 0.040699f, 0.040619f, 0.040538f,
-0.040458f, 0.040378f, 0.040298f, 0.040218f, 0.040138f, 0.040057f, 0.039977f, 0.039897f, 0.039817f, 0.039737f, 0.039656f, 0.039576f, 0.039496f, 0.039416f, 0.039336f, 0.039255f, 0.039175f, 0.039095f, 0.039015f, 0.038934f,
-0.038854f, 0.038774f, 0.038694f, 0.038613f, 0.038533f, 0.038453f, 0.038373f, 0.038292f, 0.038212f, 0.038132f, 0.038051f, 0.037971f, 0.037891f, 0.037811f, 0.03773f, 0.03765f, 0.03757f, 0.037489f, 0.037409f, 0.037329f,
-0.037248f, 0.037168f, 0.037087f, 0.037007f, 0.036927f, 0.036846f, 0.036766f, 0.036686f, 0.036605f, 0.036525f, 0.036444f, 0.036364f, 0.036284f, 0.036203f, 0.036123f, 0.036042f, 0.035962f, 0.035881f, 0.035801f, 0.035721f,
-0.03564f, 0.03556f, 0.035479f, 0.035399f, 0.035318f, 0.035238f, 0.035157f, 0.035077f, 0.034996f, 0.034916f, 0.034835f, 0.034755f, 0.034674f, 0.034594f, 0.034513f, 0.034433f, 0.034352f, 0.034272f, 0.034191f, 0.034111f,
-0.03403f, 0.03395f, 0.033869f, 0.033788f, 0.033708f, 0.033627f, 0.033547f, 0.033466f, 0.033386f, 0.033305f, 0.033224f, 0.033144f, 0.033063f, 0.032983f, 0.032902f, 0.032821f, 0.032741f, 0.03266f, 0.032579f, 0.032499f,
-0.032418f, 0.032337f, 0.032257f, 0.032176f, 0.032095f, 0.032015f, 0.031934f, 0.031853f, 0.031773f, 0.031692f, 0.031611f, 0.031531f, 0.03145f, 0.031369f, 0.031289f, 0.031208f, 0.031127f, 0.031046f, 0.030966f, 0.030885f,
-0.030804f, 0.030723f, 0.030643f, 0.030562f, 0.030481f, 0.0304f, 0.03032f, 0.030239f, 0.030158f, 0.030077f, 0.029996f, 0.029916f, 0.029835f, 0.029754f, 0.029673f, 0.029592f, 0.029512f, 0.029431f, 0.02935f, 0.029269f,
-0.029188f, 0.029107f, 0.029027f, 0.028946f, 0.028865f, 0.028784f, 0.028703f, 0.028622f, 0.028541f, 0.02846f, 0.02838f, 0.028299f, 0.028218f, 0.028137f, 0.028056f, 0.027975f, 0.027894f, 0.027813f, 0.027732f, 0.027651f,
-0.02757f, 0.027489f, 0.027408f, 0.027328f, 0.027247f, 0.027166f, 0.027085f, 0.027004f, 0.026923f, 0.026842f, 0.026761f, 0.02668f, 0.026599f, 0.026518f, 0.026437f, 0.026356f, 0.026275f, 0.026194f, 0.026113f, 0.026032f,
-0.025951f, 0.02587f, 0.025788f, 0.025707f, 0.025626f, 0.025545f, 0.025464f, 0.025383f, 0.025302f, 0.025221f, 0.02514f, 0.025059f, 0.024978f, 0.024897f, 0.024816f, 0.024734f, 0.024653f, 0.024572f, 0.024491f, 0.02441f,
-0.024329f, 0.024248f, 0.024167f, 0.024085f, 0.024004f, 0.023923f, 0.023842f, 0.023761f, 0.02368f, 0.023598f, 0.023517f, 0.023436f, 0.023355f, 0.023274f, 0.023193f, 0.023111f, 0.02303f, 0.022949f, 0.022868f, 0.022787f,
-0.022705f, 0.022624f, 0.022543f, 0.022462f, 0.02238f, 0.022299f, 0.022218f, 0.022137f, 0.022055f, 0.021974f, 0.021893f, 0.021812f, 0.02173f, 0.021649f, 0.021568f, 0.021486f, 0.021405f, 0.021324f, 0.021242f, 0.021161f,
-0.02108f, 0.020999f, 0.020917f, 0.020836f, 0.020755f, 0.020673f, 0.020592f, 0.02051f, 0.020429f, 0.020348f, 0.020266f, 0.020185f, 0.020104f, 0.020022f, 0.019941f, 0.019859f, 0.019778f, 0.019697f, 0.019615f, 0.019534f,
-0.019452f, 0.019371f, 0.01929f, 0.019208f, 0.019127f, 0.019045f, 0.018964f, 0.018882f, 0.018801f, 0.01872f, 0.018638f, 0.018557f, 0.018475f, 0.018394f, 0.018312f, 0.018231f, 0.018149f, 0.018068f, 0.017986f, 0.017905f,
-0.017823f, 0.017742f, 0.01766f, 0.017579f, 0.017497f, 0.017416f, 0.017334f, 0.017253f, 0.017171f, 0.01709f, 0.017008f, 0.016926f, 0.016845f, 0.016763f, 0.016682f, 0.0166f, 0.016519f, 0.016437f, 0.016355f, 0.016274f,
-0.016192f, 0.016111f, 0.016029f, 0.015947f, 0.015866f, 0.015784f, 0.015703f, 0.015621f, 0.015539f, 0.015458f, 0.015376f, 0.015294f, 0.015213f, 0.015131f, 0.015049f, 0.014968f, 0.014886f, 0.014804f, 0.014723f, 0.014641f,
-0.014559f, 0.014478f, 0.014396f, 0.014314f, 0.014233f, 0.014151f, 0.014069f, 0.013987f, 0.013906f, 0.013824f, 0.013742f, 0.013661f, 0.013579f, 0.013497f, 0.013415f, 0.013334f, 0.013252f, 0.01317f, 0.013088f, 0.013007f,
-0.012925f, 0.012843f, 0.012761f, 0.012679f, 0.012598f, 0.012516f, 0.012434f, 0.012352f, 0.01227f, 0.012189f, 0.012107f, 0.012025f, 0.011943f, 0.011861f, 0.011779f, 0.011698f, 0.011616f, 0.011534f, 0.011452f, 0.01137f,
-0.011288f, 0.011206f, 0.011125f, 0.011043f, 0.010961f, 0.010879f, 0.010797f, 0.010715f, 0.010633f, 0.010551f, 0.010469f, 0.010387f, 0.010306f, 0.010224f, 0.010142f, 0.01006f, 0.009978f, 0.009896f, 0.009814f, 0.009732f,
-0.00965f, 0.009568f, 0.009486f, 0.009404f, 0.009322f, 0.00924f, 0.009158f, 0.009076f, 0.008994f, 0.008912f, 0.00883f, 0.008748f, 0.008666f, 0.008584f, 0.008502f, 0.00842f, 0.008338f, 0.008256f, 0.008174f, 0.008092f,
-0.00801f, 0.007928f, 0.007846f, 0.007764f, 0.007682f, 0.0076f, 0.007518f, 0.007436f, 0.007354f, 0.007271f, 0.007189f, 0.007107f, 0.007025f, 0.006943f, 0.006861f, 0.006779f, 0.006697f, 0.006615f, 0.006532f, 0.00645f,
-0.006368f, 0.006286f, 0.006204f, 0.006122f, 0.00604f, 0.005958f, 0.005875f, 0.005793f, 0.005711f, 0.005629f, 0.005547f, 0.005465f, 0.005382f, 0.0053f, 0.005218f, 0.005136f, 0.005054f, 0.004971f, 0.004889f, 0.004807f,
-0.004725f, 0.004642f, 0.00456f, 0.004478f, 0.004396f, 0.004314f, 0.004231f, 0.004149f, 0.004067f, 0.003985f, 0.003902f, 0.00382f, 0.003738f, 0.003655f, 0.003573f, 0.003491f, 0.003409f, 0.003326f, 0.003244f, 0.003162f,
-0.003079f, 0.002997f, 0.002915f, 0.002833f, 0.00275f, 0.002668f, 0.002586f, 0.002503f, 0.002421f, 0.002339f, 0.002256f, 0.002174f, 0.002091f, 0.002009f, 0.001927f, 0.001844f, 0.001762f, 0.00168f, 0.001597f, 0.001515f,
-0.001432f, 0.00135f, 0.001268f, 0.001185f, 0.001103f, 0.00102f, 0.000938f, 0.000856f, 0.000773f, 0.000691f, 0.000608f, 0.000526f, 0.000443f, 0.000361f, 0.000279f, 0.000196f, 0.000114f, 3.1e-05f, -5.1e-05f, -0.000134f,
--0.000216f, -0.000299f, -0.000381f, -0.000464f, -0.000546f, -0.000629f, -0.000711f, -0.000794f, -0.000876f, -0.000959f, -0.001041f, -0.001124f, -0.001206f, -0.001289f, -0.001371f, -0.001454f, -0.001536f, -0.001619f, -0.001701f, -0.001784f,
--0.001867f, -0.001949f, -0.002032f, -0.002114f, -0.002197f, -0.002279f, -0.002362f, -0.002445f, -0.002527f, -0.00261f, -0.002692f, -0.002775f, -0.002858f, -0.00294f, -0.003023f, -0.003105f, -0.003188f, -0.003271f, -0.003353f, -0.003436f,
--0.003519f, -0.003601f, -0.003684f, -0.003767f, -0.003849f, -0.003932f, -0.004015f, -0.004097f, -0.00418f, -0.004263f, -0.004345f, -0.004428f, -0.004511f, -0.004593f, -0.004676f, -0.004759f, -0.004841f, -0.004924f, -0.005007f, -0.00509f,
--0.005172f, -0.005255f, -0.005338f, -0.00542f, -0.005503f, -0.005586f, -0.005669f, -0.005751f, -0.005834f, -0.005917f, -0.006f, -0.006082f, -0.006165f, -0.006248f, -0.006331f, -0.006414f, -0.006496f, -0.006579f, -0.006662f, -0.006745f,
--0.006828f, -0.00691f, -0.006993f, -0.007076f, -0.007159f, -0.007242f, -0.007325f, -0.007407f, -0.00749f, -0.007573f, -0.007656f, -0.007739f, -0.007822f, -0.007904f, -0.007987f, -0.00807f, -0.008153f, -0.008236f, -0.008319f, -0.008402f,
--0.008485f, -0.008567f, -0.00865f, -0.008733f, -0.008816f, -0.008899f, -0.008982f, -0.009065f, -0.009148f, -0.009231f, -0.009314f, -0.009397f, -0.00948f, -0.009562f, -0.009645f, -0.009728f, -0.009811f, -0.009894f, -0.009977f, -0.01006f,
--0.010143f, -0.010226f, -0.010309f, -0.010392f, -0.010475f, -0.010558f, -0.010641f, -0.010724f, -0.010807f, -0.01089f, -0.010973f, -0.011056f, -0.011139f, -0.011222f, -0.011305f, -0.011388f, -0.011471f, -0.011554f, -0.011637f, -0.01172f,
--0.011803f, -0.011886f, -0.011969f, -0.012053f, -0.012136f, -0.012219f, -0.012302f, -0.012385f, -0.012468f, -0.012551f, -0.012634f, -0.012717f, -0.0128f, -0.012883f, -0.012966f, -0.01305f, -0.013133f, -0.013216f, -0.013299f, -0.013382f,
--0.013465f, -0.013548f, -0.013631f, -0.013715f, -0.013798f, -0.013881f, -0.013964f, -0.014047f, -0.01413f, -0.014213f, -0.014297f, -0.01438f, -0.014463f, -0.014546f, -0.014629f, -0.014712f, -0.014796f, -0.014879f, -0.014962f, -0.015045f,
--0.015128f, -0.015212f, -0.015295f, -0.015378f, -0.015461f, -0.015545f, -0.015628f, -0.015711f, -0.015794f, -0.015878f, -0.015961f, -0.016044f, -0.016127f, -0.016211f, -0.016294f, -0.016377f, -0.01646f, -0.016544f, -0.016627f, -0.01671f,
--0.016793f, -0.016877f, -0.01696f, -0.017043f, -0.017127f, -0.01721f, -0.017293f, -0.017376f, -0.01746f, -0.017543f, -0.017626f, -0.01771f, -0.017793f, -0.017876f, -0.01796f, -0.018043f, -0.018126f, -0.01821f, -0.018293f, -0.018377f,
--0.01846f, -0.018543f, -0.018627f, -0.01871f, -0.018793f, -0.018877f, -0.01896f, -0.019044f, -0.019127f, -0.01921f, -0.019294f, -0.019377f, -0.01946f, -0.019544f, -0.019627f, -0.019711f, -0.019794f, -0.019878f, -0.019961f, -0.020044f,
--0.020128f, -0.020211f, -0.020295f, -0.020378f, -0.020462f, -0.020545f, -0.020629f, -0.020712f, -0.020796f, -0.020879f, -0.020962f, -0.021046f, -0.021129f, -0.021213f, -0.021296f, -0.02138f, -0.021463f, -0.021547f, -0.02163f, -0.021714f,
--0.021797f, -0.021881f, -0.021964f, -0.022048f, -0.022131f, -0.022215f, -0.022299f, -0.022382f, -0.022466f, -0.022549f, -0.022633f, -0.022716f, -0.0228f, -0.022883f, -0.022967f, -0.023051f, -0.023134f, -0.023218f, -0.023301f, -0.023385f,
--0.023468f, -0.023552f, -0.023636f, -0.023719f, -0.023803f, -0.023886f, -0.02397f, -0.024054f, -0.024137f, -0.024221f, -0.024305f, -0.024388f, -0.024472f, -0.024555f, -0.024639f, -0.024723f, -0.024806f, -0.02489f, -0.024974f, -0.025057f,
--0.025141f, -0.025225f, -0.025308f, -0.025392f, -0.025476f, -0.025559f, -0.025643f, -0.025727f, -0.02581f, -0.025894f, -0.025978f, -0.026061f, -0.026145f, -0.026229f, -0.026313f, -0.026396f, -0.02648f, -0.026564f, -0.026647f, -0.026731f,
--0.026815f, -0.026899f, -0.026982f, -0.027066f, -0.02715f, -0.027234f, -0.027317f, -0.027401f, -0.027485f, -0.027569f, -0.027653f, -0.027736f, -0.02782f, -0.027904f, -0.027988f, -0.028071f, -0.028155f, -0.028239f, -0.028323f, -0.028407f,
--0.02849f, -0.028574f, -0.028658f, -0.028742f, -0.028826f, -0.02891f, -0.028993f, -0.029077f, -0.029161f, -0.029245f, -0.029329f, -0.029413f, -0.029496f, -0.02958f, -0.029664f, -0.029748f, -0.029832f, -0.029916f, -0.03f, -0.030083f,
--0.030167f, -0.030251f, -0.030335f, -0.030419f, -0.030503f, -0.030587f, -0.030671f, -0.030755f, -0.030839f, -0.030922f, -0.031006f, -0.03109f, -0.031174f, -0.031258f, -0.031342f, -0.031426f, -0.03151f, -0.031594f, -0.031678f, -0.031762f,
--0.031846f, -0.03193f, -0.032014f, -0.032098f, -0.032182f, -0.032266f, -0.032349f, -0.032433f, -0.032517f, -0.032601f, -0.032685f, -0.032769f, -0.032853f, -0.032937f, -0.033021f, -0.033105f, -0.033189f, -0.033273f, -0.033357f, -0.033441f,
--0.033525f, -0.03361f, -0.033694f, -0.033778f, -0.033862f, -0.033946f, -0.03403f, -0.034114f, -0.034198f, -0.034282f, -0.034366f, -0.03445f, -0.034534f, -0.034618f, -0.034702f, -0.034786f, -0.03487f, -0.034954f, -0.035038f, -0.035123f,
--0.035207f, -0.035291f, -0.035375f, -0.035459f, -0.035543f, -0.035627f, -0.035711f, -0.035795f, -0.03588f, -0.035964f, -0.036048f, -0.036132f, -0.036216f, -0.0363f, -0.036384f, -0.036468f, -0.036553f, -0.036637f, -0.036721f, -0.036805f,
--0.036889f, -0.036973f, -0.037058f, -0.037142f, -0.037226f, -0.03731f, -0.037394f, -0.037478f, -0.037563f, -0.037647f, -0.037731f, -0.037815f, -0.037899f, -0.037984f, -0.038068f, -0.038152f, -0.038236f, -0.038321f, -0.038405f, -0.038489f,
--0.038573f, -0.038657f, -0.038742f, -0.038826f, -0.03891f, -0.038994f, -0.039079f, -0.039163f, -0.039247f, -0.039331f, -0.039416f, -0.0395f, -0.039584f, -0.039669f, -0.039753f, -0.039837f, -0.039921f, -0.040006f, -0.04009f, -0.040174f,
--0.040259f, -0.040343f, -0.040427f, -0.040511f, -0.040596f, -0.04068f, -0.040764f, -0.040849f, -0.040933f, -0.041017f, -0.041102f, -0.041186f, -0.04127f, -0.041355f, -0.041439f, -0.041523f, -0.041608f, -0.041692f, -0.041777f, -0.041861f,
--0.041945f, -0.04203f, -0.042114f, -0.042198f, -0.042283f, -0.042367f, -0.042452f, -0.042536f, -0.04262f, -0.042705f, -0.042789f, -0.042873f, -0.042958f, -0.043042f, -0.043127f, -0.043211f, -0.043296f, -0.04338f, -0.043464f, -0.043549f,
--0.043633f, -0.043718f, -0.043802f, -0.043887f, -0.043971f, -0.044055f, -0.04414f, -0.044224f, -0.044309f, -0.044393f, -0.044478f, -0.044562f, -0.044647f, -0.044731f, -0.044816f, -0.0449f, -0.044985f, -0.045069f, -0.045154f, -0.045238f,
--0.045323f, -0.045407f, -0.045492f, -0.045576f, -0.045661f, -0.045745f, -0.04583f, -0.045914f, -0.045999f, -0.046083f, -0.046168f, -0.046252f, -0.046337f, -0.046421f, -0.046506f, -0.046591f, -0.046675f, -0.04676f, -0.046844f, -0.046929f,
--0.047013f, -0.047098f, -0.047182f, -0.047267f, -0.047352f, -0.047436f, -0.047521f, -0.047605f, -0.04769f, -0.047775f, -0.047859f, -0.047944f, -0.048028f, -0.048113f, -0.048198f, -0.048282f, -0.048367f, -0.048451f, -0.048536f, -0.048621f,
--0.048705f, -0.04879f, -0.048875f, -0.048959f, -0.049044f, -0.049128f, -0.049213f, -0.049298f, -0.049382f, -0.049467f, -0.049552f, -0.049636f, -0.049721f, -0.049806f, -0.04989f, -0.049975f, -0.05006f, -0.050144f, -0.050229f, -0.050314f,
--0.050399f, -0.050483f, -0.050568f, -0.050653f, -0.050737f, -0.050822f, -0.050907f, -0.050991f, -0.051076f, -0.051161f, -0.051246f, -0.05133f, -0.051415f, -0.0515f, -0.051585f, -0.051669f, -0.051754f, -0.051839f, -0.051924f, -0.052008f,
--0.052093f, -0.052178f, -0.052263f, -0.052347f, -0.052432f, -0.052517f, -0.052602f, -0.052686f, -0.052771f, -0.052856f, -0.052941f, -0.053026f, -0.05311f, -0.053195f, -0.05328f, -0.053365f, -0.05345f, -0.053534f, -0.053619f, -0.053704f,
--0.053789f, -0.053874f, -0.053958f, -0.054043f, -0.054128f, -0.054213f, -0.054298f, -0.054383f, -0.054467f, -0.054552f, -0.054637f, -0.054722f, -0.054807f, -0.054892f, -0.054977f, -0.055061f, -0.055146f, -0.055231f, -0.055316f, -0.055401f,
--0.055486f, -0.055571f, -0.055656f, -0.05574f, -0.055825f, -0.05591f, -0.055995f, -0.05608f, -0.056165f, -0.05625f, -0.056335f, -0.05642f, -0.056505f, -0.05659f, -0.056674f, -0.056759f, -0.056844f, -0.056929f, -0.057014f, -0.057099f,
--0.057184f, -0.057269f, -0.057354f, -0.057439f, -0.057524f, -0.057609f, -0.057694f, -0.057779f, -0.057864f, -0.057949f, -0.058034f, -0.058119f, -0.058204f, -0.058289f, -0.058374f, -0.058459f, -0.058544f, -0.058629f, -0.058713f, -0.058798f,
--0.058883f, -0.058969f, -0.059054f, -0.059139f, -0.059224f, -0.059309f, -0.059394f, -0.059479f, -0.059564f, -0.059649f, -0.059734f, -0.059819f, -0.059904f, -0.059989f, -0.060074f, -0.060159f, -0.060244f, -0.060329f, -0.060414f, -0.060499f,
--0.060584f, -0.060669f, -0.060754f, -0.060839f, -0.060924f, -0.06101f, -0.061095f, -0.06118f, -0.061265f, -0.06135f, -0.061435f, -0.06152f, -0.061605f, -0.06169f, -0.061775f, -0.06186f, -0.061946f, -0.062031f, -0.062116f, -0.062201f,
--0.062286f, -0.062371f, -0.062456f, -0.062541f, -0.062627f, -0.062712f, -0.062797f, -0.062882f, -0.062967f, -0.063052f, -0.063137f, -0.063223f, -0.063308f, -0.063393f, -0.063478f, -0.063563f, -0.063648f, -0.063733f, -0.063819f, -0.063904f,
--0.063989f, -0.064074f, -0.064159f, -0.064245f, -0.06433f, -0.064415f, -0.0645f, -0.064585f, -0.064671f, -0.064756f, -0.064841f, -0.064926f, -0.065011f, -0.065097f, -0.065182f, -0.065267f, -0.065352f, -0.065437f, -0.065523f, -0.065608f,
--0.065693f, -0.065778f, -0.065864f, -0.065949f, -0.066034f, -0.066119f, -0.066205f, -0.06629f, -0.066375f, -0.06646f, -0.066546f, -0.066631f, -0.066716f, -0.066802f, -0.066887f, -0.066972f, -0.067057f, -0.067143f, -0.067228f, -0.067313f,
--0.067398f, -0.067484f, -0.067569f, -0.067654f, -0.06774f, -0.067825f, -0.06791f, -0.067996f, -0.068081f, -0.068166f, -0.068252f, -0.068337f, -0.068422f, -0.068508f, -0.068593f, -0.068678f, -0.068764f, -0.068849f, -0.068934f, -0.06902f,
--0.069105f, -0.06919f, -0.069276f, -0.069361f, -0.069446f, -0.069532f, -0.069617f, -0.069702f, -0.069788f, -0.069873f, -0.069959f, -0.070044f, -0.070129f, -0.070215f, -0.0703f, -0.070386f, -0.070471f, -0.070556f, -0.070642f, -0.070727f,
--0.070812f, -0.070898f, -0.070983f, -0.071069f, -0.071154f, -0.07124f, -0.071325f, -0.07141f, -0.071496f, -0.071581f, -0.071667f, -0.071752f, -0.071838f, -0.071923f, -0.072008f, -0.072094f, -0.072179f, -0.072265f, -0.07235f, -0.072436f,
--0.072521f, -0.072607f, -0.072692f, -0.072778f, -0.072863f, -0.072948f, -0.073034f, -0.073119f, -0.073205f, -0.07329f, -0.073376f, -0.073461f, -0.073547f, -0.073632f, -0.073718f, -0.073803f, -0.073889f, -0.073974f, -0.07406f, -0.074145f,
--0.074231f, -0.074316f, -0.074402f, -0.074487f, -0.074573f, -0.074659f, -0.074744f, -0.07483f, -0.074915f, -0.075001f, -0.075086f, -0.075172f, -0.075257f, -0.075343f, -0.075428f, -0.075514f, -0.075599f, -0.075685f, -0.075771f, -0.075856f,
--0.075942f, -0.076027f, -0.076113f, -0.076198f, -0.076284f, -0.07637f, -0.076455f, -0.076541f, -0.076626f, -0.076712f, -0.076798f, -0.076883f, -0.076969f, -0.077054f, -0.07714f, -0.077226f, -0.077311f, -0.077397f, -0.077482f, -0.077568f,
--0.077654f, -0.077739f, -0.077825f, -0.077911f, -0.077996f, -0.078082f, -0.078167f, -0.078253f, -0.078339f, -0.078424f, -0.07851f, -0.078596f, -0.078681f, -0.078767f, -0.078853f, -0.078938f, -0.079024f, -0.07911f, -0.079195f, -0.079281f,
--0.079367f, -0.079452f, -0.079538f, -0.079624f, -0.079709f, -0.079795f, -0.079881f, -0.079966f, -0.080052f, -0.080138f, -0.080223f, -0.080309f, -0.080395f, -0.080481f, -0.080566f, -0.080652f, -0.080738f, -0.080823f, -0.080909f, -0.080995f,
--0.081081f, -0.081166f, -0.081252f, -0.081338f, -0.081423f, -0.081509f, -0.081595f, -0.081681f, -0.081766f, -0.081852f, -0.081938f, -0.082024f, -0.082109f, -0.082195f, -0.082281f, -0.082367f, -0.082452f, -0.082538f, -0.082624f, -0.08271f,
--0.082796f, -0.082881f, -0.082967f, -0.083053f, -0.083139f, -0.083224f, -0.08331f, -0.083396f, -0.083482f, -0.083568f, -0.083653f, -0.083739f, -0.083825f, -0.083911f, -0.083997f, -0.084082f, -0.084168f, -0.084254f, -0.08434f, -0.084426f,
--0.084511f, -0.084597f, -0.084683f, -0.084769f, -0.084855f, -0.084941f, -0.085026f, -0.085112f, -0.085198f, -0.085284f, -0.08537f, -0.085456f, -0.085542f, -0.085627f, -0.085713f, -0.085799f, -0.085885f, -0.085971f, -0.086057f, -0.086143f,
--0.086228f, -0.086314f, -0.0864f, -0.086486f, -0.086572f, -0.086658f, -0.086744f, -0.08683f, -0.086916f, -0.087001f, -0.087087f, -0.087173f, -0.087259f, -0.087345f, -0.087431f, -0.087517f, -0.087603f, -0.087689f, -0.087775f, -0.087861f,
--0.087946f, -0.088032f, -0.088118f, -0.088204f, -0.08829f, -0.088376f, -0.088462f, -0.088548f, -0.088634f, -0.08872f, -0.088806f, -0.088892f, -0.088978f, -0.089064f, -0.08915f, -0.089236f, -0.089321f, -0.089407f, -0.089493f, -0.089579f,
--0.089665f, -0.089751f, -0.089837f, -0.089923f, -0.090009f, -0.090095f, -0.090181f, -0.090267f, -0.090353f, -0.090439f, -0.090525f, -0.090611f, -0.090697f, -0.090783f, -0.090869f, -0.090955f, -0.091041f, -0.091127f, -0.091213f, -0.091299f,
--0.091385f, -0.091471f, -0.091557f, -0.091643f, -0.091729f, -0.091815f, -0.091901f, -0.091987f, -0.092073f, -0.092159f, -0.092246f, -0.092332f, -0.092418f, -0.092504f, -0.09259f, -0.092676f, -0.092762f, -0.092848f, -0.092934f, -0.09302f,
--0.093106f, -0.093192f, -0.093278f, -0.093364f, -0.09345f, -0.093536f, -0.093622f, -0.093709f, -0.093795f, -0.093881f, -0.093967f, -0.094053f, -0.094139f, -0.094225f, -0.094311f, -0.094397f, -0.094483f, -0.094569f, -0.094656f, -0.094742f,
--0.094828f, -0.094914f, -0.095f, -0.095086f, -0.095172f, -0.095258f, -0.095344f, -0.095431f, -0.095517f, -0.095603f, -0.095689f, -0.095775f, -0.095861f, -0.095947f, -0.096033f, -0.09612f, -0.096206f, -0.096292f, -0.096378f, -0.096464f,
--0.09655f, -0.096637f, -0.096723f, -0.096809f, -0.096895f, -0.096981f, -0.097067f, -0.097154f, -0.09724f, -0.097326f, -0.097412f, -0.097498f, -0.097584f, -0.097671f, -0.097757f, -0.097843f, -0.097929f, -0.098015f, -0.098102f, -0.098188f,
--0.098274f, -0.09836f, -0.098446f, -0.098532f, -0.098619f, -0.098705f, -0.098791f, -0.098877f, -0.098964f, -0.09905f, -0.099136f, -0.099222f, -0.099308f, -0.099395f, -0.099481f, -0.099567f, -0.099653f, -0.09974f, -0.099826f, -0.099912f,
--0.099998f, -0.100085f, -0.100171f, -0.100257f, -0.100343f, -0.10043f, -0.100516f, -0.100602f, -0.100688f, -0.100775f, -0.100861f, -0.100947f, -0.101033f, -0.10112f, -0.101206f, -0.101292f, -0.101378f, -0.101465f, -0.101551f, -0.101637f,
--0.101724f, -0.10181f, -0.101896f, -0.101982f, -0.102069f, -0.102155f, -0.102241f, -0.102328f, -0.102414f, -0.1025f, -0.102587f, -0.102673f, -0.102759f, -0.102845f, -0.102932f, -0.103018f, -0.103104f, -0.103191f, -0.103277f, -0.103363f,
--0.10345f, -0.103536f, -0.103622f, -0.103709f, -0.103795f, -0.103881f, -0.103968f, -0.104054f, -0.10414f, -0.104227f, -0.104313f, -0.104399f, -0.104486f, -0.104572f, -0.104658f, -0.104745f, -0.104831f, -0.104918f, -0.105004f, -0.10509f,
--0.105177f, -0.105263f, -0.105349f, -0.105436f, -0.105522f, -0.105608f, -0.105695f, -0.105781f, -0.105868f, -0.105954f, -0.10604f, -0.106127f, -0.106213f, -0.1063f, -0.106386f, -0.106472f, -0.106559f, -0.106645f, -0.106732f, -0.106818f,
--0.106904f, -0.106991f, -0.107077f, -0.107164f, -0.10725f, -0.107336f, -0.107423f, -0.107509f, -0.107596f, -0.107682f, -0.107769f, -0.107855f, -0.107941f, -0.108028f, -0.108114f, -0.108201f, -0.108287f, -0.108374f, -0.10846f, -0.108547f,
--0.108633f, -0.108719f, -0.108806f, -0.108892f, -0.108979f, -0.109065f, -0.109152f, -0.109238f, -0.109325f, -0.109411f, -0.109498f, -0.109584f, -0.109671f, -0.109757f, -0.109843f, -0.10993f, -0.110016f, -0.110103f, -0.110189f, -0.110276f,
--0.110362f, -0.110449f, -0.110535f, -0.110622f, -0.110708f, -0.110795f, -0.110881f, -0.110968f, -0.111054f, -0.111141f, -0.111227f, -0.111314f, -0.1114f, -0.111487f, -0.111573f, -0.11166f, -0.111746f, -0.111833f, -0.111919f, -0.112006f,
--0.112093f, -0.112179f, -0.112266f, -0.112352f, -0.112439f, -0.112525f, -0.112612f, -0.112698f, -0.112785f, -0.112871f, -0.112958f, -0.113044f, -0.113131f, -0.113218f, -0.113304f, -0.113391f, -0.113477f, -0.113564f, -0.11365f, -0.113737f,
--0.113823f, -0.11391f, -0.113997f, -0.114083f, -0.11417f, -0.114256f, -0.114343f, -0.114429f, -0.114516f, -0.114603f, -0.114689f, -0.114776f, -0.114862f, -0.114949f, -0.115036f, -0.115122f, -0.115209f, -0.115295f, -0.115382f, -0.115469f,
--0.115555f, -0.115642f, -0.115728f, -0.115815f, -0.115902f, -0.115988f, -0.116075f, -0.116161f, -0.116248f, -0.116335f, -0.116421f, -0.116508f, -0.116595f, -0.116681f, -0.116768f, -0.116854f, -0.116941f, -0.117028f, -0.117114f, -0.117201f,
--0.117288f, -0.117374f, -0.117461f, -0.117548f, -0.117634f, -0.117721f, -0.117807f, -0.117894f, -0.117981f, -0.118067f, -0.118154f, -0.118241f, -0.118327f, -0.118414f, -0.118501f, -0.118587f, -0.118674f, -0.118761f, -0.118847f, -0.118934f,
--0.119021f, -0.119107f, -0.119194f, -0.119281f, -0.119367f, -0.119454f, -0.119541f, -0.119627f, -0.119714f, -0.119801f, -0.119888f, -0.119974f, -0.120061f, -0.120148f, -0.120234f, -0.120321f, -0.120408f, -0.120494f, -0.120581f, -0.120668f,
--0.120755f, -0.120841f, -0.120928f, -0.121015f, -0.121101f, -0.121188f, -0.121275f, -0.121362f, -0.121448f, -0.121535f, -0.121622f, -0.121709f, -0.121795f, -0.121882f, -0.121969f, -0.122055f, -0.122142f, -0.122229f, -0.122316f, -0.122402f,
--0.122489f, -0.122576f, -0.122663f, -0.122749f, -0.122836f, -0.122923f, -0.12301f, -0.123096f, -0.123183f, -0.12327f, -0.123357f, -0.123443f, -0.12353f, -0.123617f, -0.123704f, -0.123791f, -0.123877f, -0.123964f, -0.124051f, -0.124138f,
--0.124224f, -0.124311f, -0.124398f, -0.124485f, -0.124572f, -0.124658f, -0.124745f, -0.124832f, -0.124919f, -0.125005f, -0.125092f, -0.125179f, -0.125266f, -0.125353f, -0.125439f, -0.125526f, -0.125613f, -0.1257f, -0.125787f, -0.125873f,
--0.12596f, -0.126047f, -0.126134f, -0.126221f, -0.126308f, -0.126394f, -0.126481f, -0.126568f, -0.126655f, -0.126742f, -0.126829f, -0.126915f, -0.127002f, -0.127089f, -0.127176f, -0.127263f, -0.12735f, -0.127436f, -0.127523f, -0.12761f,
--0.127697f, -0.127784f, -0.127871f, -0.127957f, -0.128044f, -0.128131f, -0.128218f, -0.128305f, -0.128392f, -0.128479f, -0.128565f, -0.128652f, -0.128739f, -0.128826f, -0.128913f, -0.129f, -0.129087f, -0.129173f, -0.12926f, -0.129347f,
--0.129434f, -0.129521f, -0.129608f, -0.129695f, -0.129782f, -0.129868f, -0.129955f, -0.130042f, -0.130129f, -0.130216f, -0.130303f, -0.13039f, -0.130477f, -0.130564f, -0.13065f, -0.130737f, -0.130824f, -0.130911f, -0.130998f, -0.131085f,
--0.131172f, -0.131259f, -0.131346f, -0.131433f, -0.13152f, -0.131606f, -0.131693f, -0.13178f, -0.131867f, -0.131954f, -0.132041f, -0.132128f, -0.132215f, -0.132302f, -0.132389f, -0.132476f, -0.132563f, -0.13265f, -0.132736f, -0.132823f,
--0.13291f, -0.132997f, -0.133084f, -0.133171f, -0.133258f, -0.133345f, -0.133432f, -0.133519f, -0.133606f, -0.133693f, -0.13378f, -0.133867f, -0.133954f, -0.134041f, -0.134128f, -0.134215f, -0.134302f, -0.134389f, -0.134475f, -0.134562f,
--0.134649f, -0.134736f, -0.134823f, -0.13491f, -0.134997f, -0.135084f, -0.135171f, -0.135258f, -0.135345f, -0.135432f, -0.135519f, -0.135606f, -0.135693f, -0.13578f, -0.135867f, -0.135954f, -0.136041f, -0.136128f, -0.136215f, -0.136302f,
--0.136389f, -0.136476f, -0.136563f, -0.13665f, -0.136737f, -0.136824f, -0.136911f, -0.136998f, -0.137085f, -0.137172f, -0.137259f, -0.137346f, -0.137433f, -0.13752f, -0.137607f, -0.137694f, -0.137781f, -0.137868f, -0.137955f, -0.138042f,
--0.138129f, -0.138216f, -0.138303f, -0.13839f, -0.138477f, -0.138564f, -0.138651f, -0.138738f, -0.138826f, -0.138913f, -0.139f, -0.139087f, -0.139174f, -0.139261f, -0.139348f, -0.139435f, -0.139522f, -0.139609f, -0.139696f, -0.139783f,
--0.13987f, -0.139957f, -0.140044f, -0.140131f, -0.140218f, -0.140305f, -0.140392f, -0.140479f, -0.140567f, -0.140654f, -0.140741f, -0.140828f, -0.140915f, -0.141002f, -0.141089f, -0.141176f, -0.141263f, -0.14135f, -0.141437f, -0.141524f,
--0.141611f, -0.141698f, -0.141786f, -0.141873f, -0.14196f, -0.142047f, -0.142134f, -0.142221f, -0.142308f, -0.142395f, -0.142482f, -0.142569f, -0.142656f, -0.142744f, -0.142831f, -0.142918f, -0.143005f, -0.143092f, -0.143179f, -0.143266f,
--0.143353f, -0.14344f, -0.143527f, -0.143615f, -0.143702f, -0.143789f, -0.143876f, -0.143963f, -0.14405f, -0.144137f, -0.144224f, -0.144311f, -0.144399f, -0.144486f, -0.144573f, -0.14466f, -0.144747f, -0.144834f, -0.144921f, -0.145008f,
--0.145096f, -0.145183f, -0.14527f, -0.145357f, -0.145444f, -0.145531f, -0.145618f, -0.145706f, -0.145793f, -0.14588f, -0.145967f, -0.146054f, -0.146141f, -0.146228f, -0.146316f, -0.146403f, -0.14649f, -0.146577f, -0.146664f, -0.146751f,
--0.146838f, -0.146926f, -0.147013f, -0.1471f, -0.147187f, -0.147274f, -0.147361f, -0.147449f, -0.147536f, -0.147623f, -0.14771f, -0.147797f, -0.147884f, -0.147972f, -0.148059f, -0.148146f, -0.148233f, -0.14832f, -0.148407f, -0.148495f,
--0.148582f, -0.148669f, -0.148756f, -0.148843f, -0.148931f, -0.149018f, -0.149105f, -0.149192f, -0.149279f, -0.149366f, -0.149454f, -0.149541f, -0.149628f, -0.149715f, -0.149802f, -0.14989f, -0.149977f, -0.150064f, -0.150151f, -0.150238f,
--0.150326f, -0.150413f, -0.1505f, -0.150587f, -0.150674f, -0.150762f, -0.150849f, -0.150936f, -0.151023f, -0.151111f, -0.151198f, -0.151285f, -0.151372f, -0.151459f, -0.151547f, -0.151634f, -0.151721f, -0.151808f, -0.151895f, -0.151983f,
--0.15207f, -0.152157f, -0.152244f, -0.152332f, -0.152419f, -0.152506f, -0.152593f, -0.152681f, -0.152768f, -0.152855f, -0.152942f, -0.153029f, -0.153117f, -0.153204f, -0.153291f, -0.153378f, -0.153466f, -0.153553f, -0.15364f, -0.153727f,
--0.153815f, -0.153902f, -0.153989f, -0.154076f, -0.154164f, -0.154251f, -0.154338f, -0.154425f, -0.154513f, -0.1546f, -0.154687f, -0.154774f, -0.154862f, -0.154949f, -0.155036f, -0.155124f, -0.155211f, -0.155298f, -0.155385f, -0.155473f,
--0.15556f, -0.155647f, -0.155734f, -0.155822f, -0.155909f, -0.155996f, -0.156083f, -0.156171f, -0.156258f, -0.156345f, -0.156433f, -0.15652f, -0.156607f, -0.156694f, -0.156782f, -0.156869f, -0.156956f, -0.157044f, -0.157131f, -0.157218f,
--0.157305f, -0.157393f, -0.15748f, -0.157567f, -0.157655f, -0.157742f, -0.157829f, -0.157917f, -0.158004f, -0.158091f, -0.158178f, -0.158266f, -0.158353f, -0.15844f, -0.158528f, -0.158615f, -0.158702f, -0.15879f, -0.158877f, -0.158964f,
--0.159051f, -0.159139f, -0.159226f, -0.159313f, -0.159401f, -0.159488f, -0.159575f, -0.159663f, -0.15975f, -0.159837f, -0.159925f, -0.160012f, -0.160099f, -0.160187f, -0.160274f, -0.160361f, -0.160449f, -0.160536f, -0.160623f, -0.160711f,
--0.160798f, -0.160885f, -0.160973f, -0.16106f, -0.161147f, -0.161235f, -0.161322f, -0.161409f, -0.161497f, -0.161584f, -0.161671f, -0.161759f, -0.161846f, -0.161933f, -0.162021f, -0.162108f, -0.162195f, -0.162283f, -0.16237f, -0.162457f,
--0.162545f, -0.162632f, -0.162719f, -0.162807f, -0.162894f, -0.162981f, -0.163069f, -0.163156f, -0.163243f, -0.163331f, -0.163418f, -0.163506f, -0.163593f, -0.16368f, -0.163768f, -0.163855f, -0.163942f, -0.16403f, -0.164117f, -0.164204f,
--0.164292f, -0.164379f, -0.164467f, -0.164554f, -0.164641f, -0.164729f, -0.164816f, -0.164903f, -0.164991f, -0.165078f, -0.165165f, -0.165253f, -0.16534f, -0.165428f, -0.165515f, -0.165602f, -0.16569f, -0.165777f, -0.165865f, -0.165952f,
--0.166039f, -0.166127f, -0.166214f, -0.166301f, -0.166389f, -0.166476f, -0.166564f, -0.166651f, -0.166738f, -0.166826f, -0.166913f, -0.167001f, -0.167088f, -0.167175f, -0.167263f, -0.16735f, -0.167438f, -0.167525f, -0.167612f, -0.1677f,
--0.167787f, -0.167874f, -0.167962f, -0.168049f, -0.168137f, -0.168224f, -0.168312f, -0.168399f, -0.168486f, -0.168574f, -0.168661f, -0.168749f, -0.168836f, -0.168923f, -0.169011f, -0.169098f, -0.169186f, -0.169273f, -0.16936f, -0.169448f,
--0.169535f, -0.169623f, -0.16971f, -0.169798f, -0.169885f, -0.169972f, -0.17006f, -0.170147f, -0.170235f, -0.170322f, -0.170409f, -0.170497f, -0.170584f, -0.170672f, -0.170759f, -0.170847f, -0.170934f, -0.171021f, -0.171109f, -0.171196f,
--0.171284f, -0.171371f, -0.171459f, -0.171546f, -0.171633f, -0.171721f, -0.171808f, -0.171896f, -0.171983f, -0.172071f, -0.172158f, -0.172245f, -0.172333f, -0.17242f, -0.172508f, -0.172595f, -0.172683f, -0.17277f, -0.172858f, -0.172945f,
--0.173032f, -0.17312f, -0.173207f, -0.173295f, -0.173382f, -0.17347f, -0.173557f, -0.173645f, -0.173732f, -0.17382f, -0.173907f, -0.173994f, -0.174082f, -0.174169f, -0.174257f, -0.174344f, -0.174432f, -0.174519f, -0.174607f, -0.174694f,
--0.174782f, -0.174869f, -0.174956f, -0.175044f, -0.175131f, -0.175219f, -0.175306f, -0.175394f, -0.175481f, -0.175569f, -0.175656f, -0.175744f, -0.175831f, -0.175919f, -0.176006f, -0.176093f, -0.176181f, -0.176268f, -0.176356f, -0.176443f,
--0.176531f, -0.176618f, -0.176706f, -0.176793f, -0.176881f, -0.176968f, -0.177056f, -0.177143f, -0.177231f, -0.177318f, -0.177406f, -0.177493f, -0.177581f, -0.177668f, -0.177755f, -0.177843f, -0.17793f, -0.178018f, -0.178105f, -0.178193f,
--0.17828f, -0.178368f, -0.178455f, -0.178543f, -0.17863f, -0.178718f, -0.178805f, -0.178893f, -0.17898f, -0.179068f, -0.179155f, -0.179243f, -0.17933f, -0.179418f, -0.179505f, -0.179593f, -0.17968f, -0.179768f, -0.179855f, -0.179943f,
--0.18003f, -0.180118f, -0.180205f, -0.180293f, -0.18038f, -0.180468f, -0.180555f, -0.180643f, -0.18073f, -0.180818f, -0.180905f, -0.180993f, -0.18108f, -0.181168f, -0.181255f, -0.181343f, -0.18143f, -0.181518f, -0.181605f, -0.181693f,
--0.18178f, -0.181868f, -0.181955f, -0.182043f, -0.18213f, -0.182218f, -0.182305f, -0.182393f, -0.18248f, -0.182568f, -0.182655f, -0.182743f, -0.18283f, -0.182918f, -0.183005f, -0.183093f, -0.18318f, -0.183268f, -0.183355f, -0.183443f,
--0.18353f, -0.183618f, -0.183706f, -0.183793f, -0.183881f, -0.183968f, -0.184056f, -0.184143f, -0.184231f, -0.184318f, -0.184406f, -0.184493f, -0.184581f, -0.184668f, -0.184756f, -0.184843f, -0.184931f, -0.185018f, -0.185106f, -0.185193f,
--0.185281f, -0.185368f, -0.185456f, -0.185544f, -0.185631f, -0.185719f, -0.185806f, -0.185894f, -0.185981f, -0.186069f, -0.186156f, -0.186244f, -0.186331f, -0.186419f, -0.186506f, -0.186594f, -0.186681f, -0.186769f, -0.186856f, -0.186944f,
--0.187032f, -0.187119f, -0.187207f, -0.187294f, -0.187382f, -0.187469f, -0.187557f, -0.187644f, -0.187732f, -0.187819f, -0.187907f, -0.187994f, -0.188082f, -0.18817f, -0.188257f, -0.188345f, -0.188432f, -0.18852f, -0.188607f, -0.188695f,
--0.188782f, -0.18887f, -0.188957f, -0.189045f, -0.189133f, -0.18922f, -0.189308f, -0.189395f, -0.189483f, -0.18957f, -0.189658f, -0.189745f, -0.189833f, -0.18992f, -0.190008f, -0.190096f, -0.190183f, -0.190271f, -0.190358f, -0.190446f,
--0.190533f, -0.190621f, -0.190708f, -0.190796f, -0.190884f, -0.190971f, -0.191059f, -0.191146f, -0.191234f, -0.191321f, -0.191409f, -0.191496f, -0.191584f, -0.191672f, -0.191759f, -0.191847f, -0.191934f, -0.192022f, -0.192109f, -0.192197f,
--0.192284f, -0.192372f, -0.19246f, -0.192547f, -0.192635f, -0.192722f, -0.19281f, -0.192897f, -0.192985f, -0.193072f, -0.19316f, -0.193248f, -0.193335f, -0.193423f, -0.19351f, -0.193598f, -0.193685f, -0.193773f, -0.193861f, -0.193948f,
--0.194036f, -0.194123f, -0.194211f, -0.194298f, -0.194386f, -0.194474f, -0.194561f, -0.194649f, -0.194736f, -0.194824f, -0.194911f, -0.194999f, -0.195086f, -0.195174f, -0.195262f, -0.195349f, -0.195437f, -0.195524f, -0.195612f, -0.195699f,
--0.195787f, -0.195875f, -0.195962f, -0.19605f, -0.196137f, -0.196225f, -0.196312f, -0.1964f, -0.196488f, -0.196575f, -0.196663f, -0.19675f, -0.196838f, -0.196925f, -0.197013f, -0.197101f, -0.197188f, -0.197276f, -0.197363f, -0.197451f,
--0.197539f, -0.197626f, -0.197714f, -0.197801f, -0.197889f, -0.197976f, -0.198064f, -0.198152f, -0.198239f, -0.198327f, -0.198414f, -0.198502f, -0.198589f, -0.198677f, -0.198765f, -0.198852f, -0.19894f, -0.199027f, -0.199115f, -0.199202f,
--0.19929f, -0.199378f, -0.199465f, -0.199553f, -0.19964f, -0.199728f, -0.199816f, -0.199903f, -0.199991f, -0.200078f, -0.200166f, -0.200253f, -0.200341f, -0.200429f, -0.200516f, -0.200604f, -0.200691f, -0.200779f, -0.200867f, -0.200954f,
--0.201042f, -0.201129f, -0.201217f, -0.201304f, -0.201392f, -0.20148f, -0.201567f, -0.201655f, -0.201742f, -0.20183f, -0.201918f, -0.202005f, -0.202093f, -0.20218f, -0.202268f, -0.202355f, -0.202443f, -0.202531f, -0.202618f, -0.202706f,
--0.202793f, -0.202881f, -0.202969f, -0.203056f, -0.203144f, -0.203231f, -0.203319f, -0.203406f, -0.203494f, -0.203582f, -0.203669f, -0.203757f, -0.203844f, -0.203932f, -0.20402f, -0.204107f, -0.204195f, -0.204282f, -0.20437f, -0.204458f,
--0.204545f, -0.204633f, -0.20472f, -0.204808f, -0.204895f, -0.204983f, -0.205071f, -0.205158f, -0.205246f, -0.205333f, -0.205421f, -0.205509f, -0.205596f, -0.205684f, -0.205771f, -0.205859f, -0.205947f, -0.206034f, -0.206122f, -0.206209f,
--0.206297f, -0.206384f, -0.206472f, -0.20656f, -0.206647f, -0.206735f, -0.206822f, -0.20691f, -0.206998f, -0.207085f, -0.207173f, -0.20726f, -0.207348f, -0.207436f, -0.207523f, -0.207611f, -0.207698f, -0.207786f, -0.207874f, -0.207961f,
--0.208049f, -0.208136f, -0.208224f, -0.208311f, -0.208399f, -0.208487f, -0.208574f, -0.208662f, -0.208749f, -0.208837f, -0.208925f, -0.209012f, -0.2091f, -0.209187f, -0.209275f, -0.209363f, -0.20945f, -0.209538f, -0.209625f, -0.209713f,
--0.209801f, -0.209888f, -0.209976f, -0.210063f, -0.210151f, -0.210238f, -0.210326f, -0.210414f, -0.210501f, -0.210589f, -0.210676f, -0.210764f, -0.210852f, -0.210939f, -0.211027f, -0.211114f, -0.211202f, -0.21129f, -0.211377f, -0.211465f,
--0.211552f, -0.21164f, -0.211727f, -0.211815f, -0.211903f, -0.21199f, -0.212078f, -0.212165f, -0.212253f, -0.212341f, -0.212428f, -0.212516f, -0.212603f, -0.212691f, -0.212779f, -0.212866f, -0.212954f, -0.213041f, -0.213129f, -0.213217f,
--0.213304f, -0.213392f, -0.213479f, -0.213567f, -0.213654f, -0.213742f, -0.21383f, -0.213917f, -0.214005f, -0.214092f, -0.21418f, -0.214268f, -0.214355f, -0.214443f, -0.21453f, -0.214618f, -0.214705f, -0.214793f, -0.214881f, -0.214968f,
--0.215056f, -0.215143f, -0.215231f, -0.215319f, -0.215406f, -0.215494f, -0.215581f, -0.215669f, -0.215757f, -0.215844f, -0.215932f, -0.216019f, -0.216107f, -0.216194f, -0.216282f, -0.21637f, -0.216457f, -0.216545f, -0.216632f, -0.21672f,
--0.216808f, -0.216895f, -0.216983f, -0.21707f, -0.217158f, -0.217245f, -0.217333f, -0.217421f, -0.217508f, -0.217596f, -0.217683f, -0.217771f, -0.217859f, -0.217946f, -0.218034f, -0.218121f, -0.218209f, -0.218296f, -0.218384f, -0.218472f,
--0.218559f, -0.218647f, -0.218734f, -0.218822f, -0.21891f, -0.218997f, -0.219085f, -0.219172f, -0.21926f, -0.219347f, -0.219435f, -0.219523f, -0.21961f, -0.219698f, -0.219785f, -0.219873f, -0.21996f, -0.220048f, -0.220136f, -0.220223f,
--0.220311f, -0.220398f, -0.220486f, -0.220573f, -0.220661f, -0.220749f, -0.220836f, -0.220924f, -0.221011f, -0.221099f, -0.221187f, -0.221274f, -0.221362f, -0.221449f, -0.221537f, -0.221624f, -0.221712f, -0.2218f, -0.221887f, -0.221975f,
--0.222062f, -0.22215f, -0.222237f, -0.222325f, -0.222413f, -0.2225f, -0.222588f, -0.222675f, -0.222763f, -0.22285f, -0.222938f, -0.223026f, -0.223113f, -0.223201f, -0.223288f, -0.223376f, -0.223463f, -0.223551f, -0.223638f, -0.223726f,
--0.223814f, -0.223901f, -0.223989f, -0.224076f, -0.224164f, -0.224251f, -0.224339f, -0.224427f, -0.224514f, -0.224602f, -0.224689f, -0.224777f, -0.224864f, -0.224952f, -0.22504f, -0.225127f, -0.225215f, -0.225302f, -0.22539f, -0.225477f,
--0.225565f, -0.225652f, -0.22574f, -0.225828f, -0.225915f, -0.226003f, -0.22609f, -0.226178f, -0.226265f, -0.226353f, -0.22644f, -0.226528f, -0.226616f, -0.226703f, -0.226791f, -0.226878f, -0.226966f, -0.227053f, -0.227141f, -0.227228f,
--0.227316f, -0.227404f, -0.227491f, -0.227579f, -0.227666f, -0.227754f, -0.227841f, -0.227929f, -0.228016f, -0.228104f, -0.228192f, -0.228279f, -0.228367f, -0.228454f, -0.228542f, -0.228629f, -0.228717f, -0.228804f, -0.228892f, -0.228979f,
--0.229067f, -0.229155f, -0.229242f, -0.22933f, -0.229417f, -0.229505f, -0.229592f, -0.22968f, -0.229767f, -0.229855f, -0.229942f, -0.23003f, -0.230118f, -0.230205f, -0.230293f, -0.23038f, -0.230468f, -0.230555f, -0.230643f, -0.23073f,
--0.230818f, -0.230905f, -0.230993f, -0.231081f, -0.231168f, -0.231256f, -0.231343f, -0.231431f, -0.231518f, -0.231606f, -0.231693f, -0.231781f, -0.231868f, -0.231956f, -0.232043f, -0.232131f, -0.232218f, -0.232306f, -0.232394f, -0.232481f,
--0.232569f, -0.232656f, -0.232744f, -0.232831f, -0.232919f, -0.233006f, -0.233094f, -0.233181f, -0.233269f, -0.233356f, -0.233444f, -0.233531f, -0.233619f, -0.233706f, -0.233794f, -0.233881f, -0.233969f, -0.234057f, -0.234144f, -0.234232f,
--0.234319f, -0.234407f, -0.234494f, -0.234582f, -0.234669f, -0.234757f, -0.234844f, -0.234932f, -0.235019f, -0.235107f, -0.235194f, -0.235282f, -0.235369f, -0.235457f, -0.235544f, -0.235632f, -0.235719f, -0.235807f, -0.235894f, -0.235982f,
--0.236069f, -0.236157f, -0.236244f, -0.236332f, -0.236419f, -0.236507f, -0.236594f, -0.236682f, -0.236769f, -0.236857f, -0.236944f, -0.237032f, -0.237119f, -0.237207f, -0.237294f, -0.237382f, -0.237469f, -0.237557f, -0.237644f, -0.237732f,
--0.237819f, -0.237907f, -0.237994f, -0.238082f, -0.238169f, -0.238257f, -0.238344f, -0.238432f, -0.238519f, -0.238607f, -0.238694f, -0.238782f, -0.238869f, -0.238957f, -0.239044f, -0.239132f, -0.239219f, -0.239307f, -0.239394f, -0.239482f,
--0.239569f, -0.239657f, -0.239744f, -0.239832f, -0.239919f, -0.240007f, -0.240094f, -0.240182f, -0.240269f, -0.240357f, -0.240444f, -0.240532f, -0.240619f, -0.240707f, -0.240794f, -0.240882f, -0.240969f, -0.241057f, -0.241144f, -0.241231f,
--0.241319f, -0.241406f, -0.241494f, -0.241581f, -0.241669f, -0.241756f, -0.241844f, -0.241931f, -0.242019f, -0.242106f, -0.242194f, -0.242281f, -0.242369f, -0.242456f, -0.242544f, -0.242631f, -0.242718f, -0.242806f, -0.242893f, -0.242981f,
--0.243068f, -0.243156f, -0.243243f, -0.243331f, -0.243418f, -0.243506f, -0.243593f, -0.243681f, -0.243768f, -0.243855f, -0.243943f, -0.24403f, -0.244118f, -0.244205f, -0.244293f, -0.24438f, -0.244468f, -0.244555f, -0.244643f, -0.24473f,
--0.244817f, -0.244905f, -0.244992f, -0.24508f, -0.245167f, -0.245255f, -0.245342f, -0.24543f, -0.245517f, -0.245604f, -0.245692f, -0.245779f, -0.245867f, -0.245954f, -0.246042f, -0.246129f, -0.246217f, -0.246304f, -0.246391f, -0.246479f,
--0.246566f, -0.246654f, -0.246741f, -0.246829f, -0.246916f, -0.247003f, -0.247091f, -0.247178f, -0.247266f, -0.247353f, -0.247441f, -0.247528f, -0.247615f, -0.247703f, -0.24779f, -0.247878f, -0.247965f, -0.248053f, -0.24814f, -0.248227f,
--0.248315f, -0.248402f, -0.24849f, -0.248577f, -0.248665f, -0.248752f, -0.248839f, -0.248927f, -0.249014f, -0.249102f, -0.249189f, -0.249276f, -0.249364f, -0.249451f, -0.249539f, -0.249626f, -0.249714f, -0.249801f, -0.249888f, -0.249976f,
--0.250063f, -0.250151f, -0.250238f, -0.250325f, -0.250413f, -0.2505f, -0.250588f, -0.250675f, -0.250762f, -0.25085f, -0.250937f, -0.251025f, -0.251112f, -0.251199f, -0.251287f, -0.251374f, -0.251462f, -0.251549f, -0.251636f, -0.251724f,
--0.251811f, -0.251898f, -0.251986f, -0.252073f, -0.252161f, -0.252248f, -0.252335f, -0.252423f, -0.25251f, -0.252598f, -0.252685f, -0.252772f, -0.25286f, -0.252947f, -0.253034f, -0.253122f, -0.253209f, -0.253297f, -0.253384f, -0.253471f,
--0.253559f, -0.253646f, -0.253733f, -0.253821f, -0.253908f, -0.253996f, -0.254083f, -0.25417f, -0.254258f, -0.254345f, -0.254432f, -0.25452f, -0.254607f, -0.254694f, -0.254782f, -0.254869f, -0.254957f, -0.255044f, -0.255131f, -0.255219f,
--0.255306f, -0.255393f, -0.255481f, -0.255568f, -0.255655f, -0.255743f, -0.25583f, -0.255917f, -0.256005f, -0.256092f, -0.256179f, -0.256267f, -0.256354f, -0.256441f, -0.256529f, -0.256616f, -0.256704f, -0.256791f, -0.256878f, -0.256966f,
--0.257053f, -0.25714f, -0.257228f, -0.257315f, -0.257402f, -0.25749f, -0.257577f, -0.257664f, -0.257752f, -0.257839f, -0.257926f, -0.258014f, -0.258101f, -0.258188f, -0.258275f, -0.258363f, -0.25845f, -0.258537f, -0.258625f, -0.258712f,
--0.258799f, -0.258887f, -0.258974f, -0.259061f, -0.259149f, -0.259236f, -0.259323f, -0.259411f, -0.259498f, -0.259585f, -0.259673f, -0.25976f, -0.259847f, -0.259934f, -0.260022f, -0.260109f, -0.260196f, -0.260284f, -0.260371f, -0.260458f,
--0.260546f, -0.260633f, -0.26072f, -0.260807f, -0.260895f, -0.260982f, -0.261069f, -0.261157f, -0.261244f, -0.261331f, -0.261418f, -0.261506f, -0.261593f, -0.26168f, -0.261768f, -0.261855f, -0.261942f, -0.262029f, -0.262117f, -0.262204f,
--0.262291f, -0.262379f, -0.262466f, -0.262553f, -0.26264f, -0.262728f, -0.262815f, -0.262902f, -0.26299f, -0.263077f, -0.263164f, -0.263251f, -0.263339f, -0.263426f, -0.263513f, -0.2636f, -0.263688f, -0.263775f, -0.263862f, -0.263949f,
--0.264037f, -0.264124f, -0.264211f, -0.264298f, -0.264386f, -0.264473f, -0.26456f, -0.264647f, -0.264735f, -0.264822f, -0.264909f, -0.264996f, -0.265084f, -0.265171f, -0.265258f, -0.265345f, -0.265433f, -0.26552f, -0.265607f, -0.265694f,
--0.265782f, -0.265869f, -0.265956f, -0.266043f, -0.266131f, -0.266218f, -0.266305f, -0.266392f, -0.266479f, -0.266567f, -0.266654f, -0.266741f, -0.266828f, -0.266916f, -0.267003f, -0.26709f, -0.267177f, -0.267264f, -0.267352f, -0.267439f,
--0.267526f, -0.267613f, -0.267701f, -0.267788f, -0.267875f, -0.267962f, -0.268049f, -0.268137f, -0.268224f, -0.268311f, -0.268398f, -0.268485f, -0.268573f, -0.26866f, -0.268747f, -0.268834f, -0.268921f, -0.269009f, -0.269096f, -0.269183f,
--0.26927f, -0.269357f, -0.269445f, -0.269532f, -0.269619f, -0.269706f, -0.269793f, -0.26988f, -0.269968f, -0.270055f, -0.270142f, -0.270229f, -0.270316f, -0.270404f, -0.270491f, -0.270578f, -0.270665f, -0.270752f, -0.270839f, -0.270927f,
--0.271014f, -0.271101f, -0.271188f, -0.271275f, -0.271362f, -0.27145f, -0.271537f, -0.271624f, -0.271711f, -0.271798f, -0.271885f, -0.271972f, -0.27206f, -0.272147f, -0.272234f, -0.272321f, -0.272408f, -0.272495f, -0.272583f, -0.27267f,
--0.272757f, -0.272844f, -0.272931f, -0.273018f, -0.273105f, -0.273193f, -0.27328f, -0.273367f, -0.273454f, -0.273541f, -0.273628f, -0.273715f, -0.273802f, -0.27389f, -0.273977f, -0.274064f, -0.274151f, -0.274238f, -0.274325f, -0.274412f,
--0.274499f, -0.274587f, -0.274674f, -0.274761f, -0.274848f, -0.274935f, -0.275022f, -0.275109f, -0.275196f, -0.275283f, -0.275371f, -0.275458f, -0.275545f, -0.275632f, -0.275719f, -0.275806f, -0.275893f, -0.27598f, -0.276067f, -0.276154f,
--0.276242f, -0.276329f, -0.276416f, -0.276503f, -0.27659f, -0.276677f, -0.276764f, -0.276851f, -0.276938f, -0.277025f, -0.277112f, -0.277199f, -0.277287f, -0.277374f, -0.277461f, -0.277548f, -0.277635f, -0.277722f, -0.277809f, -0.277896f,
--0.277983f, -0.27807f, -0.278157f, -0.278244f, -0.278331f, -0.278418f, -0.278506f, -0.278593f, -0.27868f, -0.278767f, -0.278854f, -0.278941f, -0.279028f, -0.279115f, -0.279202f, -0.279289f, -0.279376f, -0.279463f, -0.27955f, -0.279637f,
--0.279724f, -0.279811f, -0.279898f, -0.279985f, -0.280072f, -0.280159f, -0.280246f, -0.280333f, -0.28042f, -0.280508f, -0.280595f, -0.280682f, -0.280769f, -0.280856f, -0.280943f, -0.28103f, -0.281117f, -0.281204f, -0.281291f, -0.281378f,
--0.281465f, -0.281552f, -0.281639f, -0.281726f, -0.281813f, -0.2819f, -0.281987f, -0.282074f, -0.282161f, -0.282248f, -0.282335f, -0.282422f, -0.282509f, -0.282596f, -0.282683f, -0.28277f, -0.282857f, -0.282944f, -0.283031f, -0.283118f,
--0.283205f, -0.283292f, -0.283379f, -0.283466f, -0.283553f, -0.28364f, -0.283727f, -0.283814f, -0.283901f, -0.283987f, -0.284074f, -0.284161f, -0.284248f, -0.284335f, -0.284422f, -0.284509f, -0.284596f, -0.284683f, -0.28477f, -0.284857f,
--0.284944f, -0.285031f, -0.285118f, -0.285205f, -0.285292f, -0.285379f, -0.285466f, -0.285553f, -0.28564f, -0.285727f, -0.285814f, -0.285901f, -0.285987f, -0.286074f, -0.286161f, -0.286248f, -0.286335f, -0.286422f, -0.286509f, -0.286596f,
--0.286683f, -0.28677f, -0.286857f, -0.286944f, -0.287031f, -0.287118f, -0.287204f, -0.287291f, -0.287378f, -0.287465f, -0.287552f, -0.287639f, -0.287726f, -0.287813f, -0.2879f, -0.287987f, -0.288074f, -0.28816f, -0.288247f, -0.288334f,
--0.288421f, -0.288508f, -0.288595f, -0.288682f, -0.288769f, -0.288856f, -0.288942f, -0.289029f, -0.289116f, -0.289203f, -0.28929f, -0.289377f, -0.289464f, -0.289551f, -0.289638f, -0.289724f, -0.289811f, -0.289898f, -0.289985f, -0.290072f,
--0.290159f, -0.290246f, -0.290332f, -0.290419f, -0.290506f, -0.290593f, -0.29068f, -0.290767f, -0.290854f, -0.29094f, -0.291027f, -0.291114f, -0.291201f, -0.291288f, -0.291375f, -0.291462f, -0.291548f, -0.291635f, -0.291722f, -0.291809f,
--0.291896f, -0.291983f, -0.292069f, -0.292156f, -0.292243f, -0.29233f, -0.292417f, -0.292504f, -0.29259f, -0.292677f, -0.292764f, -0.292851f, -0.292938f, -0.293024f, -0.293111f, -0.293198f, -0.293285f, -0.293372f, -0.293458f, -0.293545f,
--0.293632f, -0.293719f, -0.293806f, -0.293892f, -0.293979f, -0.294066f, -0.294153f, -0.29424f, -0.294326f, -0.294413f, -0.2945f, -0.294587f, -0.294674f, -0.29476f, -0.294847f, -0.294934f, -0.295021f, -0.295107f, -0.295194f, -0.295281f,
--0.295368f, -0.295455f, -0.295541f, -0.295628f, -0.295715f, -0.295802f, -0.295888f, -0.295975f, -0.296062f, -0.296149f, -0.296235f, -0.296322f, -0.296409f, -0.296496f, -0.296582f, -0.296669f, -0.296756f, -0.296843f, -0.296929f, -0.297016f,
--0.297103f, -0.29719f, -0.297276f, -0.297363f, -0.29745f, -0.297536f, -0.297623f, -0.29771f, -0.297797f, -0.297883f, -0.29797f, -0.298057f, -0.298144f, -0.29823f, -0.298317f, -0.298404f, -0.29849f, -0.298577f, -0.298664f, -0.29875f,
--0.298837f, -0.298924f, -0.299011f, -0.299097f, -0.299184f, -0.299271f, -0.299357f, -0.299444f, -0.299531f, -0.299617f, -0.299704f, -0.299791f, -0.299877f, -0.299964f, -0.300051f, -0.300138f, -0.300224f, -0.300311f, -0.300398f, -0.300484f,
--0.300571f, -0.300658f, -0.300744f, -0.300831f, -0.300918f, -0.301004f, -0.301091f, -0.301177f, -0.301264f, -0.301351f, -0.301437f, -0.301524f, -0.301611f, -0.301697f, -0.301784f, -0.301871f, -0.301957f, -0.302044f, -0.302131f, -0.302217f,
--0.302304f, -0.30239f, -0.302477f, -0.302564f, -0.30265f, -0.302737f, -0.302824f, -0.30291f, -0.302997f, -0.303083f, -0.30317f, -0.303257f, -0.303343f, -0.30343f, -0.303517f, -0.303603f, -0.30369f, -0.303776f, -0.303863f, -0.30395f,
--0.304036f, -0.304123f, -0.304209f, -0.304296f, -0.304382f, -0.304469f, -0.304556f, -0.304642f, -0.304729f, -0.304815f, -0.304902f, -0.304989f, -0.305075f, -0.305162f, -0.305248f, -0.305335f, -0.305421f, -0.305508f, -0.305595f, -0.305681f,
--0.305768f, -0.305854f, -0.305941f, -0.306027f, -0.306114f, -0.3062f, -0.306287f, -0.306374f, -0.30646f, -0.306547f, -0.306633f, -0.30672f, -0.306806f, -0.306893f, -0.306979f, -0.307066f, -0.307152f, -0.307239f, -0.307325f, -0.307412f,
--0.307498f, -0.307585f, -0.307671f, -0.307758f, -0.307845f, -0.307931f, -0.308018f, -0.308104f, -0.308191f, -0.308277f, -0.308364f, -0.30845f, -0.308537f, -0.308623f, -0.30871f, -0.308796f, -0.308883f, -0.308969f, -0.309056f, -0.309142f,
--0.309229f, -0.309315f, -0.309401f, -0.309488f, -0.309574f, -0.309661f, -0.309747f, -0.309834f, -0.30992f, -0.310007f, -0.310093f, -0.31018f, -0.310266f, -0.310353f, -0.310439f, -0.310526f, -0.310612f, -0.310698f, -0.310785f, -0.310871f,
--0.310958f, -0.311044f, -0.311131f, -0.311217f, -0.311304f, -0.31139f, -0.311476f, -0.311563f, -0.311649f, -0.311736f, -0.311822f, -0.311909f, -0.311995f, -0.312081f, -0.312168f, -0.312254f, -0.312341f, -0.312427f, -0.312513f, -0.3126f,
--0.312686f, -0.312773f, -0.312859f, -0.312945f, -0.313032f, -0.313118f, -0.313205f, -0.313291f, -0.313377f, -0.313464f, -0.31355f, -0.313637f, -0.313723f, -0.313809f, -0.313896f, -0.313982f, -0.314069f, -0.314155f, -0.314241f, -0.314328f,
--0.314414f, -0.3145f, -0.314587f, -0.314673f, -0.314759f, -0.314846f, -0.314932f, -0.315019f, -0.315105f, -0.315191f, -0.315278f, -0.315364f, -0.31545f, -0.315537f, -0.315623f, -0.315709f, -0.315796f, -0.315882f, -0.315968f, -0.316055f,
--0.316141f, -0.316227f, -0.316314f, -0.3164f, -0.316486f, -0.316573f, -0.316659f, -0.316745f, -0.316831f, -0.316918f, -0.317004f, -0.31709f, -0.317177f, -0.317263f, -0.317349f, -0.317436f, -0.317522f, -0.317608f, -0.317694f, -0.317781f,
--0.317867f, -0.317953f, -0.31804f, -0.318126f, -0.318212f, -0.318298f, -0.318385f, -0.318471f, -0.318557f, -0.318643f, -0.31873f, -0.318816f, -0.318902f, -0.318989f, -0.319075f, -0.319161f, -0.319247f, -0.319334f, -0.31942f, -0.319506f,
--0.319592f, -0.319678f, -0.319765f, -0.319851f, -0.319937f, -0.320023f, -0.32011f, -0.320196f, -0.320282f, -0.320368f, -0.320455f, -0.320541f, -0.320627f, -0.320713f, -0.320799f, -0.320886f, -0.320972f, -0.321058f, -0.321144f, -0.32123f,
--0.321317f, -0.321403f, -0.321489f, -0.321575f, -0.321661f, -0.321748f, -0.321834f, -0.32192f, -0.322006f, -0.322092f, -0.322179f, -0.322265f, -0.322351f, -0.322437f, -0.322523f, -0.322609f, -0.322696f, -0.322782f, -0.322868f, -0.322954f,
--0.32304f, -0.323126f, -0.323213f, -0.323299f, -0.323385f, -0.323471f, -0.323557f, -0.323643f, -0.323729f, -0.323816f, -0.323902f, -0.323988f, -0.324074f, -0.32416f, -0.324246f, -0.324332f, -0.324418f, -0.324505f, -0.324591f, -0.324677f,
--0.324763f, -0.324849f, -0.324935f, -0.325021f, -0.325107f, -0.325193f, -0.32528f, -0.325366f, -0.325452f, -0.325538f, -0.325624f, -0.32571f, -0.325796f, -0.325882f, -0.325968f, -0.326054f, -0.32614f, -0.326227f, -0.326313f, -0.326399f,
--0.326485f, -0.326571f, -0.326657f, -0.326743f, -0.326829f, -0.326915f, -0.327001f, -0.327087f, -0.327173f, -0.327259f, -0.327345f, -0.327431f, -0.327517f, -0.327603f, -0.327689f, -0.327775f, -0.327862f, -0.327948f, -0.328034f, -0.32812f,
--0.328206f, -0.328292f, -0.328378f, -0.328464f, -0.32855f, -0.328636f, -0.328722f, -0.328808f, -0.328894f, -0.32898f, -0.329066f, -0.329152f, -0.329238f, -0.329324f, -0.32941f, -0.329496f, -0.329582f, -0.329668f, -0.329754f, -0.32984f,
--0.329926f, -0.330012f, -0.330098f, -0.330184f, -0.33027f, -0.330355f, -0.330441f, -0.330527f, -0.330613f, -0.330699f, -0.330785f, -0.330871f, -0.330957f, -0.331043f, -0.331129f, -0.331215f, -0.331301f, -0.331387f, -0.331473f, -0.331559f,
--0.331645f, -0.331731f, -0.331817f, -0.331902f, -0.331988f, -0.332074f, -0.33216f, -0.332246f, -0.332332f, -0.332418f, -0.332504f, -0.33259f, -0.332676f, -0.332762f, -0.332848f, -0.332933f, -0.333019f, -0.333105f, -0.333191f, -0.333277f,
--0.333363f, -0.333449f, -0.333535f, -0.333621f, -0.333706f, -0.333792f, -0.333878f, -0.333964f, -0.33405f, -0.334136f, -0.334222f, -0.334307f, -0.334393f, -0.334479f, -0.334565f, -0.334651f, -0.334737f, -0.334823f, -0.334908f, -0.334994f,
--0.33508f, -0.335166f, -0.335252f, -0.335338f, -0.335423f, -0.335509f, -0.335595f, -0.335681f, -0.335767f, -0.335852f, -0.335938f, -0.336024f, -0.33611f, -0.336196f, -0.336282f, -0.336367f, -0.336453f, -0.336539f, -0.336625f, -0.336711f,
--0.336796f, -0.336882f, -0.336968f, -0.337054f, -0.337139f, -0.337225f, -0.337311f, -0.337397f, -0.337483f, -0.337568f, -0.337654f, -0.33774f, -0.337826f, -0.337911f, -0.337997f, -0.338083f, -0.338169f, -0.338254f, -0.33834f, -0.338426f,
--0.338512f, -0.338597f, -0.338683f, -0.338769f, -0.338855f, -0.33894f, -0.339026f, -0.339112f, -0.339197f, -0.339283f, -0.339369f, -0.339455f, -0.33954f, -0.339626f, -0.339712f, -0.339797f, -0.339883f, -0.339969f, -0.340054f, -0.34014f,
--0.340226f, -0.340312f, -0.340397f, -0.340483f, -0.340569f, -0.340654f, -0.34074f, -0.340826f, -0.340911f, -0.340997f, -0.341083f, -0.341168f, -0.341254f, -0.34134f, -0.341425f, -0.341511f, -0.341597f, -0.341682f, -0.341768f, -0.341853f,
--0.341939f, -0.342025f, -0.34211f, -0.342196f, -0.342282f, -0.342367f, -0.342453f, -0.342539f, -0.342624f, -0.34271f, -0.342795f, -0.342881f, -0.342967f, -0.343052f, -0.343138f, -0.343223f, -0.343309f, -0.343395f, -0.34348f, -0.343566f,
--0.343651f, -0.343737f, -0.343823f, -0.343908f, -0.343994f, -0.344079f, -0.344165f, -0.34425f, -0.344336f, -0.344422f, -0.344507f, -0.344593f, -0.344678f, -0.344764f, -0.344849f, -0.344935f, -0.34502f, -0.345106f, -0.345192f, -0.345277f,
--0.345363f, -0.345448f, -0.345534f, -0.345619f, -0.345705f, -0.34579f, -0.345876f, -0.345961f, -0.346047f, -0.346132f, -0.346218f, -0.346303f, -0.346389f, -0.346474f, -0.34656f, -0.346645f, -0.346731f, -0.346816f, -0.346902f, -0.346987f,
--0.347073f, -0.347158f, -0.347244f, -0.347329f, -0.347415f, -0.3475f, -0.347586f, -0.347671f, -0.347757f, -0.347842f, -0.347928f, -0.348013f, -0.348098f, -0.348184f, -0.348269f, -0.348355f, -0.34844f, -0.348526f, -0.348611f, -0.348697f,
--0.348782f, -0.348867f, -0.348953f, -0.349038f, -0.349124f, -0.349209f, -0.349295f, -0.34938f, -0.349465f, -0.349551f, -0.349636f, -0.349722f, -0.349807f, -0.349892f, -0.349978f, -0.350063f, -0.350149f, -0.350234f, -0.350319f, -0.350405f,
--0.35049f, -0.350576f, -0.350661f, -0.350746f, -0.350832f, -0.350917f, -0.351002f, -0.351088f, -0.351173f, -0.351258f, -0.351344f, -0.351429f, -0.351514f, -0.3516f, -0.351685f, -0.351771f, -0.351856f, -0.351941f, -0.352027f, -0.352112f,
--0.352197f, -0.352282f, -0.352368f, -0.352453f, -0.352538f, -0.352624f, -0.352709f, -0.352794f, -0.35288f, -0.352965f, -0.35305f, -0.353136f, -0.353221f, -0.353306f, -0.353391f, -0.353477f, -0.353562f, -0.353647f, -0.353733f, -0.353818f,
--0.353903f, -0.353988f, -0.354074f, -0.354159f, -0.354244f, -0.354329f, -0.354415f, -0.3545f, -0.354585f, -0.35467f, -0.354756f, -0.354841f, -0.354926f, -0.355011f, -0.355097f, -0.355182f, -0.355267f, -0.355352f, -0.355438f, -0.355523f,
--0.355608f, -0.355693f, -0.355778f, -0.355864f, -0.355949f, -0.356034f, -0.356119f, -0.356204f, -0.35629f, -0.356375f, -0.35646f, -0.356545f, -0.35663f, -0.356716f, -0.356801f, -0.356886f, -0.356971f, -0.357056f, -0.357141f, -0.357227f,
--0.357312f, -0.357397f, -0.357482f, -0.357567f, -0.357652f, -0.357737f, -0.357823f, -0.357908f, -0.357993f, -0.358078f, -0.358163f, -0.358248f, -0.358333f, -0.358419f, -0.358504f, -0.358589f, -0.358674f, -0.358759f, -0.358844f, -0.358929f,
--0.359014f, -0.359099f, -0.359184f, -0.35927f, -0.359355f, -0.35944f, -0.359525f, -0.35961f, -0.359695f, -0.35978f, -0.359865f, -0.35995f, -0.360035f, -0.36012f, -0.360205f, -0.36029f, -0.360376f, -0.360461f, -0.360546f, -0.360631f,
--0.360716f, -0.360801f, -0.360886f, -0.360971f, -0.361056f, -0.361141f, -0.361226f, -0.361311f, -0.361396f, -0.361481f, -0.361566f, -0.361651f, -0.361736f, -0.361821f, -0.361906f, -0.361991f, -0.362076f, -0.362161f, -0.362246f, -0.362331f,
--0.362416f, -0.362501f, -0.362586f, -0.362671f, -0.362756f, -0.362841f, -0.362926f, -0.363011f, -0.363096f, -0.363181f, -0.363266f, -0.363351f, -0.363436f, -0.363521f, -0.363606f, -0.363691f, -0.363775f, -0.36386f, -0.363945f, -0.36403f,
--0.364115f, -0.3642f, -0.364285f, -0.36437f, -0.364455f, -0.36454f, -0.364625f, -0.36471f, -0.364795f, -0.364879f, -0.364964f, -0.365049f, -0.365134f, -0.365219f, -0.365304f, -0.365389f, -0.365474f, -0.365559f, -0.365643f, -0.365728f,
--0.365813f, -0.365898f, -0.365983f, -0.366068f, -0.366153f, -0.366238f, -0.366322f, -0.366407f, -0.366492f, -0.366577f, -0.366662f, -0.366747f, -0.366831f, -0.366916f, -0.367001f, -0.367086f, -0.367171f, -0.367256f, -0.36734f, -0.367425f,
--0.36751f, -0.367595f, -0.36768f, -0.367764f, -0.367849f, -0.367934f, -0.368019f, -0.368104f, -0.368188f, -0.368273f, -0.368358f, -0.368443f, -0.368527f, -0.368612f, -0.368697f, -0.368782f, -0.368867f, -0.368951f, -0.369036f, -0.369121f,
--0.369206f, -0.36929f, -0.369375f, -0.36946f, -0.369545f, -0.369629f, -0.369714f, -0.369799f, -0.369883f, -0.369968f, -0.370053f, -0.370138f, -0.370222f, -0.370307f, -0.370392f, -0.370476f, -0.370561f, -0.370646f, -0.370731f, -0.370815f,
--0.3709f, -0.370985f, -0.371069f, -0.371154f, -0.371239f, -0.371323f, -0.371408f, -0.371493f, -0.371577f, -0.371662f, -0.371747f, -0.371831f, -0.371916f, -0.372001f, -0.372085f, -0.37217f, -0.372255f, -0.372339f, -0.372424f, -0.372508f,
--0.372593f, -0.372678f, -0.372762f, -0.372847f, -0.372932f, -0.373016f, -0.373101f, -0.373185f, -0.37327f, -0.373355f, -0.373439f, -0.373524f, -0.373608f, -0.373693f, -0.373778f, -0.373862f, -0.373947f, -0.374031f, -0.374116f, -0.3742f,
--0.374285f, -0.37437f, -0.374454f, -0.374539f, -0.374623f, -0.374708f, -0.374792f, -0.374877f, -0.374961f, -0.375046f, -0.37513f, -0.375215f, -0.3753f, -0.375384f, -0.375469f, -0.375553f, -0.375638f, -0.375722f, -0.375807f, -0.375891f,
--0.375976f, -0.37606f, -0.376145f, -0.376229f, -0.376314f, -0.376398f, -0.376483f, -0.376567f, -0.376652f, -0.376736f, -0.376821f, -0.376905f, -0.376989f, -0.377074f, -0.377158f, -0.377243f, -0.377327f, -0.377412f, -0.377496f, -0.377581f,
--0.377665f, -0.377749f, -0.377834f, -0.377918f, -0.378003f, -0.378087f, -0.378172f, -0.378256f, -0.37834f, -0.378425f, -0.378509f, -0.378594f, -0.378678f, -0.378762f, -0.378847f, -0.378931f, -0.379016f, -0.3791f, -0.379184f, -0.379269f,
--0.379353f, -0.379438f, -0.379522f, -0.379606f, -0.379691f, -0.379775f, -0.379859f, -0.379944f, -0.380028f, -0.380112f, -0.380197f, -0.380281f, -0.380365f, -0.38045f, -0.380534f, -0.380618f, -0.380703f, -0.380787f, -0.380871f, -0.380956f,
--0.38104f, -0.381124f, -0.381209f, -0.381293f, -0.381377f, -0.381462f, -0.381546f, -0.38163f, -0.381714f, -0.381799f, -0.381883f, -0.381967f, -0.382051f, -0.382136f, -0.38222f, -0.382304f, -0.382389f, -0.382473f, -0.382557f, -0.382641f,
--0.382726f, -0.38281f, -0.382894f, -0.382978f, -0.383062f, -0.383147f, -0.383231f, -0.383315f, -0.383399f, -0.383484f, -0.383568f, -0.383652f, -0.383736f, -0.38382f, -0.383905f, -0.383989f, -0.384073f, -0.384157f, -0.384241f, -0.384326f,
--0.38441f, -0.384494f, -0.384578f, -0.384662f, -0.384746f, -0.384831f, -0.384915f, -0.384999f, -0.385083f, -0.385167f, -0.385251f, -0.385336f, -0.38542f, -0.385504f, -0.385588f, -0.385672f, -0.385756f, -0.38584f, -0.385924f, -0.386009f,
--0.386093f, -0.386177f, -0.386261f, -0.386345f, -0.386429f, -0.386513f, -0.386597f, -0.386681f, -0.386765f, -0.38685f, -0.386934f, -0.387018f, -0.387102f, -0.387186f, -0.38727f, -0.387354f, -0.387438f, -0.387522f, -0.387606f, -0.38769f,
--0.387774f, -0.387858f, -0.387942f, -0.388026f, -0.38811f, -0.388194f, -0.388278f, -0.388362f, -0.388446f, -0.38853f, -0.388614f, -0.388698f, -0.388783f, -0.388867f, -0.388951f, -0.389034f, -0.389118f, -0.389202f, -0.389286f, -0.38937f,
--0.389454f, -0.389538f, -0.389622f, -0.389706f, -0.38979f, -0.389874f, -0.389958f, -0.390042f, -0.390126f, -0.39021f, -0.390294f, -0.390378f, -0.390462f, -0.390546f, -0.39063f, -0.390714f, -0.390798f, -0.390882f, -0.390965f, -0.391049f,
--0.391133f, -0.391217f, -0.391301f, -0.391385f, -0.391469f, -0.391553f, -0.391637f, -0.391721f, -0.391804f, -0.391888f, -0.391972f, -0.392056f, -0.39214f, -0.392224f, -0.392308f, -0.392391f, -0.392475f, -0.392559f, -0.392643f, -0.392727f,
--0.392811f, -0.392895f, -0.392978f, -0.393062f, -0.393146f, -0.39323f, -0.393314f, -0.393398f, -0.393481f, -0.393565f, -0.393649f, -0.393733f, -0.393817f, -0.3939f, -0.393984f, -0.394068f, -0.394152f, -0.394235f, -0.394319f, -0.394403f,
--0.394487f, -0.394571f, -0.394654f, -0.394738f, -0.394822f, -0.394906f, -0.394989f, -0.395073f, -0.395157f, -0.395241f, -0.395324f, -0.395408f, -0.395492f, -0.395576f, -0.395659f, -0.395743f, -0.395827f, -0.39591f, -0.395994f, -0.396078f,
--0.396162f, -0.396245f, -0.396329f, -0.396413f, -0.396496f, -0.39658f, -0.396664f, -0.396747f, -0.396831f, -0.396915f, -0.396998f, -0.397082f, -0.397166f, -0.397249f, -0.397333f, -0.397417f, -0.3975f, -0.397584f, -0.397668f, -0.397751f,
--0.397835f, -0.397918f, -0.398002f, -0.398086f, -0.398169f, -0.398253f, -0.398336f, -0.39842f, -0.398504f, -0.398587f, -0.398671f, -0.398754f, -0.398838f, -0.398922f, -0.399005f, -0.399089f, -0.399172f, -0.399256f, -0.399339f, -0.399423f,
--0.399507f, -0.39959f, -0.399674f, -0.399757f, -0.399841f, -0.399924f, -0.400008f, -0.400091f, -0.400175f, -0.400258f, -0.400342f, -0.400426f, -0.400509f, -0.400593f, -0.400676f, -0.40076f, -0.400843f, -0.400927f, -0.40101f, -0.401094f,
--0.401177f, -0.401261f, -0.401344f, -0.401427f, -0.401511f, -0.401594f, -0.401678f, -0.401761f, -0.401845f, -0.401928f, -0.402012f, -0.402095f, -0.402179f, -0.402262f, -0.402345f, -0.402429f, -0.402512f, -0.402596f, -0.402679f, -0.402763f,
--0.402846f, -0.402929f, -0.403013f, -0.403096f, -0.40318f, -0.403263f, -0.403346f, -0.40343f, -0.403513f, -0.403597f, -0.40368f, -0.403763f, -0.403847f, -0.40393f, -0.404013f, -0.404097f, -0.40418f, -0.404263f, -0.404347f, -0.40443f,
--0.404513f, -0.404597f, -0.40468f, -0.404763f, -0.404847f, -0.40493f, -0.405013f, -0.405097f, -0.40518f, -0.405263f, -0.405347f, -0.40543f, -0.405513f, -0.405597f, -0.40568f, -0.405763f, -0.405846f, -0.40593f, -0.406013f, -0.406096f,
--0.40618f, -0.406263f, -0.406346f, -0.406429f, -0.406513f, -0.406596f, -0.406679f, -0.406762f, -0.406846f, -0.406929f, -0.407012f, -0.407095f, -0.407178f, -0.407262f, -0.407345f, -0.407428f, -0.407511f, -0.407594f, -0.407678f, -0.407761f,
--0.407844f, -0.407927f, -0.40801f, -0.408094f, -0.408177f, -0.40826f, -0.408343f, -0.408426f, -0.408509f, -0.408593f, -0.408676f, -0.408759f, -0.408842f, -0.408925f, -0.409008f, -0.409091f, -0.409175f, -0.409258f, -0.409341f, -0.409424f,
--0.409507f, -0.40959f, -0.409673f, -0.409756f, -0.40984f, -0.409923f, -0.410006f, -0.410089f, -0.410172f, -0.410255f, -0.410338f, -0.410421f, -0.410504f, -0.410587f, -0.41067f, -0.410753f, -0.410836f, -0.41092f, -0.411003f, -0.411086f,
--0.411169f, -0.411252f, -0.411335f, -0.411418f, -0.411501f, -0.411584f, -0.411667f, -0.41175f, -0.411833f, -0.411916f, -0.411999f, -0.412082f, -0.412165f, -0.412248f, -0.412331f, -0.412414f, -0.412497f, -0.41258f, -0.412663f, -0.412746f,
--0.412829f, -0.412912f, -0.412995f, -0.413078f, -0.41316f, -0.413243f, -0.413326f, -0.413409f, -0.413492f, -0.413575f, -0.413658f, -0.413741f, -0.413824f, -0.413907f, -0.41399f, -0.414073f, -0.414156f, -0.414238f, -0.414321f, -0.414404f,
--0.414487f, -0.41457f, -0.414653f, -0.414736f, -0.414819f, -0.414902f, -0.414984f, -0.415067f, -0.41515f, -0.415233f, -0.415316f, -0.415399f, -0.415481f, -0.415564f, -0.415647f, -0.41573f, -0.415813f, -0.415896f, -0.415978f, -0.416061f,
--0.416144f, -0.416227f, -0.41631f, -0.416392f, -0.416475f, -0.416558f, -0.416641f, -0.416724f, -0.416806f, -0.416889f, -0.416972f, -0.417055f, -0.417137f, -0.41722f, -0.417303f, -0.417386f, -0.417469f, -0.417551f, -0.417634f, -0.417717f,
--0.417799f, -0.417882f, -0.417965f, -0.418048f, -0.41813f, -0.418213f, -0.418296f, -0.418378f, -0.418461f, -0.418544f, -0.418627f, -0.418709f, -0.418792f, -0.418875f, -0.418957f, -0.41904f, -0.419123f, -0.419205f, -0.419288f, -0.419371f,
--0.419453f, -0.419536f, -0.419619f, -0.419701f, -0.419784f, -0.419866f, -0.419949f, -0.420032f, -0.420114f, -0.420197f, -0.42028f, -0.420362f, -0.420445f, -0.420527f, -0.42061f, -0.420693f, -0.420775f, -0.420858f, -0.42094f, -0.421023f,
--0.421105f, -0.421188f, -0.421271f, -0.421353f, -0.421436f, -0.421518f, -0.421601f, -0.421683f, -0.421766f, -0.421848f, -0.421931f, -0.422014f, -0.422096f, -0.422179f, -0.422261f, -0.422344f, -0.422426f, -0.422509f, -0.422591f, -0.422674f,
--0.422756f, -0.422839f, -0.422921f, -0.423004f, -0.423086f, -0.423169f, -0.423251f, -0.423333f, -0.423416f, -0.423498f, -0.423581f, -0.423663f, -0.423746f, -0.423828f, -0.423911f, -0.423993f, -0.424075f, -0.424158f, -0.42424f, -0.424323f,
--0.424405f, -0.424488f, -0.42457f, -0.424652f, -0.424735f, -0.424817f, -0.4249f, -0.424982f, -0.425064f, -0.425147f, -0.425229f, -0.425311f, -0.425394f, -0.425476f, -0.425559f, -0.425641f, -0.425723f, -0.425806f, -0.425888f, -0.42597f,
--0.426053f, -0.426135f, -0.426217f, -0.4263f, -0.426382f, -0.426464f, -0.426546f, -0.426629f, -0.426711f, -0.426793f, -0.426876f, -0.426958f, -0.42704f, -0.427123f, -0.427205f, -0.427287f, -0.427369f, -0.427452f, -0.427534f, -0.427616f,
--0.427698f, -0.427781f, -0.427863f, -0.427945f, -0.428027f, -0.42811f, -0.428192f, -0.428274f, -0.428356f, -0.428438f, -0.428521f, -0.428603f, -0.428685f, -0.428767f, -0.428849f, -0.428932f, -0.429014f, -0.429096f, -0.429178f, -0.42926f,
--0.429342f, -0.429425f, -0.429507f, -0.429589f, -0.429671f, -0.429753f, -0.429835f, -0.429918f, -0.43f, -0.430082f, -0.430164f, -0.430246f, -0.430328f, -0.43041f, -0.430492f, -0.430574f, -0.430657f, -0.430739f, -0.430821f, -0.430903f,
--0.430985f, -0.431067f, -0.431149f, -0.431231f, -0.431313f, -0.431395f, -0.431477f, -0.431559f, -0.431641f, -0.431724f, -0.431806f, -0.431888f, -0.43197f, -0.432052f, -0.432134f, -0.432216f, -0.432298f, -0.43238f, -0.432462f, -0.432544f,
--0.432626f, -0.432708f, -0.43279f, -0.432872f, -0.432954f, -0.433036f, -0.433118f, -0.4332f, -0.433282f, -0.433364f, -0.433446f, -0.433528f, -0.433609f, -0.433691f, -0.433773f, -0.433855f, -0.433937f, -0.434019f, -0.434101f, -0.434183f,
--0.434265f, -0.434347f, -0.434429f, -0.434511f, -0.434593f, -0.434674f, -0.434756f, -0.434838f, -0.43492f, -0.435002f, -0.435084f, -0.435166f, -0.435248f, -0.435329f, -0.435411f, -0.435493f, -0.435575f, -0.435657f, -0.435739f, -0.435821f,
--0.435902f, -0.435984f, -0.436066f, -0.436148f, -0.43623f, -0.436311f, -0.436393f, -0.436475f, -0.436557f, -0.436639f, -0.43672f, -0.436802f, -0.436884f, -0.436966f, -0.437048f, -0.437129f, -0.437211f, -0.437293f, -0.437375f, -0.437456f,
--0.437538f, -0.43762f, -0.437702f, -0.437783f, -0.437865f, -0.437947f, -0.438028f, -0.43811f, -0.438192f, -0.438274f, -0.438355f, -0.438437f, -0.438519f, -0.4386f, -0.438682f, -0.438764f, -0.438845f, -0.438927f, -0.439009f, -0.43909f,
--0.439172f, -0.439254f, -0.439335f, -0.439417f, -0.439499f, -0.43958f, -0.439662f, -0.439744f, -0.439825f, -0.439907f, -0.439989f, -0.44007f, -0.440152f, -0.440233f, -0.440315f, -0.440397f, -0.440478f, -0.44056f, -0.440641f, -0.440723f,
--0.440804f, -0.440886f, -0.440968f, -0.441049f, -0.441131f, -0.441212f, -0.441294f, -0.441375f, -0.441457f, -0.441538f, -0.44162f, -0.441701f, -0.441783f, -0.441865f, -0.441946f, -0.442028f, -0.442109f, -0.442191f, -0.442272f, -0.442354f,
--0.442435f, -0.442517f, -0.442598f, -0.442679f, -0.442761f, -0.442842f, -0.442924f, -0.443005f, -0.443087f, -0.443168f, -0.44325f, -0.443331f, -0.443413f, -0.443494f, -0.443575f, -0.443657f, -0.443738f, -0.44382f, -0.443901f, -0.443982f,
--0.444064f, -0.444145f, -0.444227f, -0.444308f, -0.444389f, -0.444471f, -0.444552f, -0.444634f, -0.444715f, -0.444796f, -0.444878f, -0.444959f, -0.44504f, -0.445122f, -0.445203f, -0.445284f, -0.445366f, -0.445447f, -0.445528f, -0.44561f,
--0.445691f, -0.445772f, -0.445854f, -0.445935f, -0.446016f, -0.446097f, -0.446179f, -0.44626f, -0.446341f, -0.446423f, -0.446504f, -0.446585f, -0.446666f, -0.446748f, -0.446829f, -0.44691f, -0.446991f, -0.447073f, -0.447154f, -0.447235f,
--0.447316f, -0.447397f, -0.447479f, -0.44756f, -0.447641f, -0.447722f, -0.447803f, -0.447885f, -0.447966f, -0.448047f, -0.448128f, -0.448209f, -0.448291f, -0.448372f, -0.448453f, -0.448534f, -0.448615f, -0.448696f, -0.448777f, -0.448859f,
--0.44894f, -0.449021f, -0.449102f, -0.449183f, -0.449264f, -0.449345f, -0.449426f, -0.449508f, -0.449589f, -0.44967f, -0.449751f, -0.449832f, -0.449913f, -0.449994f, -0.450075f, -0.450156f, -0.450237f, -0.450318f, -0.450399f, -0.45048f,
--0.450561f, -0.450642f, -0.450723f, -0.450805f, -0.450886f, -0.450967f, -0.451048f, -0.451129f, -0.45121f, -0.451291f, -0.451372f, -0.451453f, -0.451534f, -0.451615f, -0.451696f, -0.451777f, -0.451857f, -0.451938f, -0.452019f, -0.4521f,
--0.452181f, -0.452262f, -0.452343f, -0.452424f, -0.452505f, -0.452586f, -0.452667f, -0.452748f, -0.452829f, -0.45291f, -0.452991f, -0.453071f, -0.453152f, -0.453233f, -0.453314f, -0.453395f, -0.453476f, -0.453557f, -0.453638f, -0.453719f,
--0.453799f, -0.45388f, -0.453961f, -0.454042f, -0.454123f, -0.454204f, -0.454284f, -0.454365f, -0.454446f, -0.454527f, -0.454608f, -0.454689f, -0.454769f, -0.45485f, -0.454931f, -0.455012f, -0.455093f, -0.455173f, -0.455254f, -0.455335f,
--0.455416f, -0.455496f, -0.455577f, -0.455658f, -0.455739f, -0.455819f, -0.4559f, -0.455981f, -0.456062f, -0.456142f, -0.456223f, -0.456304f, -0.456385f, -0.456465f, -0.456546f, -0.456627f, -0.456707f, -0.456788f, -0.456869f, -0.456949f,
--0.45703f, -0.457111f, -0.457191f, -0.457272f, -0.457353f, -0.457433f, -0.457514f, -0.457595f, -0.457675f, -0.457756f, -0.457837f, -0.457917f, -0.457998f, -0.458078f, -0.458159f, -0.45824f, -0.45832f, -0.458401f, -0.458481f, -0.458562f,
--0.458643f, -0.458723f, -0.458804f, -0.458884f, -0.458965f, -0.459045f, -0.459126f, -0.459207f, -0.459287f, -0.459368f, -0.459448f, -0.459529f, -0.459609f, -0.45969f, -0.45977f, -0.459851f, -0.459931f, -0.460012f, -0.460092f, -0.460173f,
--0.460253f, -0.460334f, -0.460414f, -0.460495f, -0.460575f, -0.460656f, -0.460736f, -0.460817f, -0.460897f, -0.460978f, -0.461058f, -0.461138f, -0.461219f, -0.461299f, -0.46138f, -0.46146f, -0.461541f, -0.461621f, -0.461701f, -0.461782f,
--0.461862f, -0.461943f, -0.462023f, -0.462103f, -0.462184f, -0.462264f, -0.462344f, -0.462425f, -0.462505f, -0.462585f, -0.462666f, -0.462746f, -0.462827f, -0.462907f, -0.462987f, -0.463068f, -0.463148f, -0.463228f, -0.463308f, -0.463389f,
--0.463469f, -0.463549f, -0.46363f, -0.46371f, -0.46379f, -0.46387f, -0.463951f, -0.464031f, -0.464111f, -0.464192f, -0.464272f, -0.464352f, -0.464432f, -0.464513f, -0.464593f, -0.464673f, -0.464753f, -0.464833f, -0.464914f, -0.464994f,
--0.465074f, -0.465154f, -0.465234f, -0.465315f, -0.465395f, -0.465475f, -0.465555f, -0.465635f, -0.465716f, -0.465796f, -0.465876f, -0.465956f, -0.466036f, -0.466116f, -0.466196f, -0.466277f, -0.466357f, -0.466437f, -0.466517f, -0.466597f,
--0.466677f, -0.466757f, -0.466837f, -0.466917f, -0.466998f, -0.467078f, -0.467158f, -0.467238f, -0.467318f, -0.467398f, -0.467478f, -0.467558f, -0.467638f, -0.467718f, -0.467798f, -0.467878f, -0.467958f, -0.468038f, -0.468118f, -0.468198f,
--0.468278f, -0.468358f, -0.468438f, -0.468518f, -0.468598f, -0.468678f, -0.468758f, -0.468838f, -0.468918f, -0.468998f, -0.469078f, -0.469158f, -0.469238f, -0.469318f, -0.469398f, -0.469478f, -0.469558f, -0.469638f, -0.469718f, -0.469798f,
--0.469878f, -0.469958f, -0.470037f, -0.470117f, -0.470197f, -0.470277f, -0.470357f, -0.470437f, -0.470517f, -0.470597f, -0.470677f, -0.470756f, -0.470836f, -0.470916f, -0.470996f, -0.471076f, -0.471156f, -0.471235f, -0.471315f, -0.471395f,
--0.471475f, -0.471555f, -0.471635f, -0.471714f, -0.471794f, -0.471874f, -0.471954f, -0.472034f, -0.472113f, -0.472193f, -0.472273f, -0.472353f, -0.472432f, -0.472512f, -0.472592f, -0.472672f, -0.472751f, -0.472831f, -0.472911f, -0.472991f,
--0.47307f, -0.47315f, -0.47323f, -0.473309f, -0.473389f, -0.473469f, -0.473549f, -0.473628f, -0.473708f, -0.473788f, -0.473867f, -0.473947f, -0.474027f, -0.474106f, -0.474186f, -0.474266f, -0.474345f, -0.474425f, -0.474504f, -0.474584f,
--0.474664f, -0.474743f, -0.474823f, -0.474903f, -0.474982f, -0.475062f, -0.475141f, -0.475221f, -0.4753f, -0.47538f, -0.47546f, -0.475539f, -0.475619f, -0.475698f, -0.475778f, -0.475857f, -0.475937f, -0.476016f, -0.476096f, -0.476176f,
--0.476255f, -0.476335f, -0.476414f, -0.476494f, -0.476573f, -0.476653f, -0.476732f, -0.476812f, -0.476891f, -0.476971f, -0.47705f, -0.477129f, -0.477209f, -0.477288f, -0.477368f, -0.477447f, -0.477527f, -0.477606f, -0.477686f, -0.477765f,
--0.477844f, -0.477924f, -0.478003f, -0.478083f, -0.478162f, -0.478242f, -0.478321f, -0.4784f, -0.47848f, -0.478559f, -0.478638f, -0.478718f, -0.478797f, -0.478877f, -0.478956f, -0.479035f, -0.479115f, -0.479194f, -0.479273f, -0.479353f,
--0.479432f, -0.479511f, -0.479591f, -0.47967f, -0.479749f, -0.479828f, -0.479908f, -0.479987f, -0.480066f, -0.480146f, -0.480225f, -0.480304f, -0.480383f, -0.480463f, -0.480542f, -0.480621f, -0.4807f, -0.48078f, -0.480859f, -0.480938f,
--0.481017f, -0.481096f, -0.481176f, -0.481255f, -0.481334f, -0.481413f, -0.481492f, -0.481572f, -0.481651f, -0.48173f, -0.481809f, -0.481888f, -0.481968f, -0.482047f, -0.482126f, -0.482205f, -0.482284f, -0.482363f, -0.482442f, -0.482522f,
--0.482601f, -0.48268f, -0.482759f, -0.482838f, -0.482917f, -0.482996f, -0.483075f, -0.483154f, -0.483233f, -0.483312f, -0.483392f, -0.483471f, -0.48355f, -0.483629f, -0.483708f, -0.483787f, -0.483866f, -0.483945f, -0.484024f, -0.484103f,
--0.484182f, -0.484261f, -0.48434f, -0.484419f, -0.484498f, -0.484577f, -0.484656f, -0.484735f, -0.484814f, -0.484893f, -0.484972f, -0.485051f, -0.48513f, -0.485209f, -0.485288f, -0.485367f, -0.485446f, -0.485524f, -0.485603f, -0.485682f,
--0.485761f, -0.48584f, -0.485919f, -0.485998f, -0.486077f, -0.486156f, -0.486235f, -0.486313f, -0.486392f, -0.486471f, -0.48655f, -0.486629f, -0.486708f, -0.486787f, -0.486865f, -0.486944f, -0.487023f, -0.487102f, -0.487181f, -0.48726f,
--0.487338f, -0.487417f, -0.487496f, -0.487575f, -0.487654f, -0.487732f, -0.487811f, -0.48789f, -0.487969f, -0.488048f, -0.488126f, -0.488205f, -0.488284f, -0.488363f, -0.488441f, -0.48852f, -0.488599f, -0.488677f, -0.488756f, -0.488835f,
--0.488914f, -0.488992f, -0.489071f, -0.48915f, -0.489228f, -0.489307f, -0.489386f, -0.489464f, -0.489543f, -0.489622f, -0.4897f, -0.489779f, -0.489858f, -0.489936f, -0.490015f, -0.490094f, -0.490172f, -0.490251f, -0.490329f, -0.490408f,
--0.490487f, -0.490565f, -0.490644f, -0.490722f, -0.490801f, -0.49088f, -0.490958f, -0.491037f, -0.491115f, -0.491194f, -0.491272f, -0.491351f, -0.491429f, -0.491508f, -0.491587f, -0.491665f, -0.491744f, -0.491822f, -0.491901f, -0.491979f,
--0.492058f, -0.492136f, -0.492215f, -0.492293f, -0.492372f, -0.49245f, -0.492528f, -0.492607f, -0.492685f, -0.492764f, -0.492842f, -0.492921f, -0.492999f, -0.493078f, -0.493156f, -0.493234f, -0.493313f, -0.493391f, -0.49347f, -0.493548f,
--0.493626f, -0.493705f, -0.493783f, -0.493862f, -0.49394f, -0.494018f, -0.494097f, -0.494175f, -0.494253f, -0.494332f, -0.49441f, -0.494488f, -0.494567f, -0.494645f, -0.494723f, -0.494802f, -0.49488f, -0.494958f, -0.495037f, -0.495115f,
--0.495193f, -0.495271f, -0.49535f, -0.495428f, -0.495506f, -0.495585f, -0.495663f, -0.495741f, -0.495819f, -0.495898f, -0.495976f, -0.496054f, -0.496132f, -0.49621f, -0.496289f, -0.496367f, -0.496445f, -0.496523f, -0.496601f, -0.49668f,
--0.496758f, -0.496836f, -0.496914f, -0.496992f, -0.49707f, -0.497149f, -0.497227f, -0.497305f, -0.497383f, -0.497461f, -0.497539f, -0.497617f, -0.497696f, -0.497774f, -0.497852f, -0.49793f, -0.498008f, -0.498086f, -0.498164f, -0.498242f,
--0.49832f, -0.498398f, -0.498476f, -0.498554f, -0.498633f, -0.498711f, -0.498789f, -0.498867f, -0.498945f, -0.499023f, -0.499101f, -0.499179f, -0.499257f, -0.499335f, -0.499413f, -0.499491f, -0.499569f, -0.499647f, -0.499725f, -0.499803f,
--0.499881f, -0.499959f, -0.500037f, -0.500114f, -0.500192f, -0.50027f, -0.500348f, -0.500426f, -0.500504f, -0.500582f, -0.50066f, -0.500738f, -0.500816f, -0.500894f, -0.500972f, -0.501049f, -0.501127f, -0.501205f, -0.501283f, -0.501361f,
--0.501439f, -0.501517f, -0.501594f, -0.501672f, -0.50175f, -0.501828f, -0.501906f, -0.501984f, -0.502061f, -0.502139f, -0.502217f, -0.502295f, -0.502373f, -0.50245f, -0.502528f, -0.502606f, -0.502684f, -0.502762f, -0.502839f, -0.502917f,
--0.502995f, -0.503073f, -0.50315f, -0.503228f, -0.503306f, -0.503383f, -0.503461f, -0.503539f, -0.503617f, -0.503694f, -0.503772f, -0.50385f, -0.503927f, -0.504005f, -0.504083f, -0.50416f, -0.504238f, -0.504316f, -0.504393f, -0.504471f,
--0.504549f, -0.504626f, -0.504704f, -0.504781f, -0.504859f, -0.504937f, -0.505014f, -0.505092f, -0.505169f, -0.505247f, -0.505325f, -0.505402f, -0.50548f, -0.505557f, -0.505635f, -0.505712f, -0.50579f, -0.505868f, -0.505945f, -0.506023f,
--0.5061f, -0.506178f, -0.506255f, -0.506333f, -0.50641f, -0.506488f, -0.506565f, -0.506643f, -0.50672f, -0.506798f, -0.506875f, -0.506953f, -0.50703f, -0.507108f, -0.507185f, -0.507262f, -0.50734f, -0.507417f, -0.507495f, -0.507572f,
--0.50765f, -0.507727f, -0.507804f, -0.507882f, -0.507959f, -0.508037f, -0.508114f, -0.508191f, -0.508269f, -0.508346f, -0.508423f, -0.508501f, -0.508578f, -0.508656f, -0.508733f, -0.50881f, -0.508888f, -0.508965f, -0.509042f, -0.509119f,
--0.509197f, -0.509274f, -0.509351f, -0.509429f, -0.509506f, -0.509583f, -0.509661f, -0.509738f, -0.509815f, -0.509892f, -0.50997f, -0.510047f, -0.510124f, -0.510201f, -0.510279f, -0.510356f, -0.510433f, -0.51051f, -0.510587f, -0.510665f,
--0.510742f, -0.510819f, -0.510896f, -0.510973f, -0.51105f, -0.511128f, -0.511205f, -0.511282f, -0.511359f, -0.511436f, -0.511513f, -0.511591f, -0.511668f, -0.511745f, -0.511822f, -0.511899f, -0.511976f, -0.512053f, -0.51213f, -0.512207f,
--0.512284f, -0.512362f, -0.512439f, -0.512516f, -0.512593f, -0.51267f, -0.512747f, -0.512824f, -0.512901f, -0.512978f, -0.513055f, -0.513132f, -0.513209f, -0.513286f, -0.513363f, -0.51344f, -0.513517f, -0.513594f, -0.513671f, -0.513748f,
--0.513825f, -0.513902f, -0.513979f, -0.514056f, -0.514133f, -0.51421f, -0.514287f, -0.514364f, -0.514441f, -0.514517f, -0.514594f, -0.514671f, -0.514748f, -0.514825f, -0.514902f, -0.514979f, -0.515056f, -0.515133f, -0.515209f, -0.515286f,
--0.515363f, -0.51544f, -0.515517f, -0.515594f, -0.515671f, -0.515747f, -0.515824f, -0.515901f, -0.515978f, -0.516055f, -0.516131f, -0.516208f, -0.516285f, -0.516362f, -0.516439f, -0.516515f, -0.516592f, -0.516669f, -0.516746f, -0.516822f,
--0.516899f, -0.516976f, -0.517053f, -0.517129f, -0.517206f, -0.517283f, -0.517359f, -0.517436f, -0.517513f, -0.51759f, -0.517666f, -0.517743f, -0.51782f, -0.517896f, -0.517973f, -0.51805f, -0.518126f, -0.518203f, -0.51828f, -0.518356f,
--0.518433f, -0.518509f, -0.518586f, -0.518663f, -0.518739f, -0.518816f, -0.518892f, -0.518969f, -0.519046f, -0.519122f, -0.519199f, -0.519275f, -0.519352f, -0.519428f, -0.519505f, -0.519582f, -0.519658f, -0.519735f, -0.519811f, -0.519888f,
--0.519964f, -0.520041f, -0.520117f, -0.520194f, -0.52027f, -0.520347f, -0.520423f, -0.5205f, -0.520576f, -0.520653f, -0.520729f, -0.520805f, -0.520882f, -0.520958f, -0.521035f, -0.521111f, -0.521188f, -0.521264f, -0.52134f, -0.521417f,
--0.521493f, -0.52157f, -0.521646f, -0.521722f, -0.521799f, -0.521875f, -0.521951f, -0.522028f, -0.522104f, -0.522181f, -0.522257f, -0.522333f, -0.52241f, -0.522486f, -0.522562f, -0.522639f, -0.522715f, -0.522791f, -0.522867f, -0.522944f,
--0.52302f, -0.523096f, -0.523173f, -0.523249f, -0.523325f, -0.523401f, -0.523478f, -0.523554f, -0.52363f, -0.523706f, -0.523782f, -0.523859f, -0.523935f, -0.524011f, -0.524087f, -0.524164f, -0.52424f, -0.524316f, -0.524392f, -0.524468f,
--0.524544f, -0.524621f, -0.524697f, -0.524773f, -0.524849f, -0.524925f, -0.525001f, -0.525077f, -0.525154f, -0.52523f, -0.525306f, -0.525382f, -0.525458f, -0.525534f, -0.52561f, -0.525686f, -0.525762f, -0.525838f, -0.525914f, -0.52599f,
--0.526067f, -0.526143f, -0.526219f, -0.526295f, -0.526371f, -0.526447f, -0.526523f, -0.526599f, -0.526675f, -0.526751f, -0.526827f, -0.526903f, -0.526979f, -0.527055f, -0.527131f, -0.527207f, -0.527282f, -0.527358f, -0.527434f, -0.52751f,
--0.527586f, -0.527662f, -0.527738f, -0.527814f, -0.52789f, -0.527966f, -0.528042f, -0.528118f, -0.528193f, -0.528269f, -0.528345f, -0.528421f, -0.528497f, -0.528573f, -0.528649f, -0.528725f, -0.5288f, -0.528876f, -0.528952f, -0.529028f,
--0.529104f, -0.529179f, -0.529255f, -0.529331f, -0.529407f, -0.529483f, -0.529558f, -0.529634f, -0.52971f, -0.529786f, -0.529861f, -0.529937f, -0.530013f, -0.530089f, -0.530164f, -0.53024f, -0.530316f, -0.530392f, -0.530467f, -0.530543f,
--0.530619f, -0.530694f, -0.53077f, -0.530846f, -0.530921f, -0.530997f, -0.531073f, -0.531148f, -0.531224f, -0.5313f, -0.531375f, -0.531451f, -0.531527f, -0.531602f, -0.531678f, -0.531753f, -0.531829f, -0.531905f, -0.53198f, -0.532056f,
--0.532131f, -0.532207f, -0.532282f, -0.532358f, -0.532434f, -0.532509f, -0.532585f, -0.53266f, -0.532736f, -0.532811f, -0.532887f, -0.532962f, -0.533038f, -0.533113f, -0.533189f, -0.533264f, -0.53334f, -0.533415f, -0.533491f, -0.533566f,
--0.533642f, -0.533717f, -0.533792f, -0.533868f, -0.533943f, -0.534019f, -0.534094f, -0.53417f, -0.534245f, -0.53432f, -0.534396f, -0.534471f, -0.534547f, -0.534622f, -0.534697f, -0.534773f, -0.534848f, -0.534923f, -0.534999f, -0.535074f,
--0.535149f, -0.535225f, -0.5353f, -0.535375f, -0.535451f, -0.535526f, -0.535601f, -0.535677f, -0.535752f, -0.535827f, -0.535902f, -0.535978f, -0.536053f, -0.536128f, -0.536203f, -0.536279f, -0.536354f, -0.536429f, -0.536504f, -0.53658f,
--0.536655f, -0.53673f, -0.536805f, -0.53688f, -0.536956f, -0.537031f, -0.537106f, -0.537181f, -0.537256f, -0.537331f, -0.537407f, -0.537482f, -0.537557f, -0.537632f, -0.537707f, -0.537782f, -0.537857f, -0.537933f, -0.538008f, -0.538083f,
--0.538158f, -0.538233f, -0.538308f, -0.538383f, -0.538458f, -0.538533f, -0.538608f, -0.538683f, -0.538758f, -0.538833f, -0.538908f, -0.538983f, -0.539058f, -0.539133f, -0.539209f, -0.539284f, -0.539359f, -0.539433f, -0.539508f, -0.539583f,
--0.539658f, -0.539733f, -0.539808f, -0.539883f, -0.539958f, -0.540033f, -0.540108f, -0.540183f, -0.540258f, -0.540333f, -0.540408f, -0.540483f, -0.540558f, -0.540632f, -0.540707f, -0.540782f, -0.540857f, -0.540932f, -0.541007f, -0.541082f,
--0.541157f, -0.541231f, -0.541306f, -0.541381f, -0.541456f, -0.541531f, -0.541606f, -0.54168f, -0.541755f, -0.54183f, -0.541905f, -0.541979f, -0.542054f, -0.542129f, -0.542204f, -0.542279f, -0.542353f, -0.542428f, -0.542503f, -0.542578f,
--0.542652f, -0.542727f, -0.542802f, -0.542876f, -0.542951f, -0.543026f, -0.5431f, -0.543175f, -0.54325f, -0.543325f, -0.543399f, -0.543474f, -0.543548f, -0.543623f, -0.543698f, -0.543772f, -0.543847f, -0.543922f, -0.543996f, -0.544071f,
--0.544145f, -0.54422f, -0.544295f, -0.544369f, -0.544444f, -0.544518f, -0.544593f, -0.544668f, -0.544742f, -0.544817f, -0.544891f, -0.544966f, -0.54504f, -0.545115f, -0.545189f, -0.545264f, -0.545338f, -0.545413f, -0.545487f, -0.545562f,
--0.545636f, -0.545711f, -0.545785f, -0.54586f, -0.545934f, -0.546009f, -0.546083f, -0.546157f, -0.546232f, -0.546306f, -0.546381f, -0.546455f, -0.546529f, -0.546604f, -0.546678f, -0.546753f, -0.546827f, -0.546901f, -0.546976f, -0.54705f,
--0.547124f, -0.547199f, -0.547273f, -0.547348f, -0.547422f, -0.547496f, -0.54757f, -0.547645f, -0.547719f, -0.547793f, -0.547868f, -0.547942f, -0.548016f, -0.548091f, -0.548165f, -0.548239f, -0.548313f, -0.548388f, -0.548462f, -0.548536f,
--0.54861f, -0.548684f, -0.548759f, -0.548833f, -0.548907f, -0.548981f, -0.549055f, -0.54913f, -0.549204f, -0.549278f, -0.549352f, -0.549426f, -0.549501f, -0.549575f, -0.549649f, -0.549723f, -0.549797f, -0.549871f, -0.549945f, -0.550019f,
--0.550094f, -0.550168f, -0.550242f, -0.550316f, -0.55039f, -0.550464f, -0.550538f, -0.550612f, -0.550686f, -0.55076f, -0.550834f, -0.550908f, -0.550982f, -0.551056f, -0.55113f, -0.551204f, -0.551278f, -0.551352f, -0.551426f, -0.5515f,
--0.551574f, -0.551648f, -0.551722f, -0.551796f, -0.55187f, -0.551944f, -0.552018f, -0.552092f, -0.552166f, -0.55224f, -0.552314f, -0.552388f, -0.552461f, -0.552535f, -0.552609f, -0.552683f, -0.552757f, -0.552831f, -0.552905f, -0.552979f,
--0.553052f, -0.553126f, -0.5532f, -0.553274f, -0.553348f, -0.553422f, -0.553495f, -0.553569f, -0.553643f, -0.553717f, -0.553791f, -0.553864f, -0.553938f, -0.554012f, -0.554086f, -0.554159f, -0.554233f, -0.554307f, -0.554381f, -0.554454f,
--0.554528f, -0.554602f, -0.554676f, -0.554749f, -0.554823f, -0.554897f, -0.55497f, -0.555044f, -0.555118f, -0.555191f, -0.555265f, -0.555339f, -0.555412f, -0.555486f, -0.55556f, -0.555633f, -0.555707f, -0.55578f, -0.555854f, -0.555928f,
--0.556001f, -0.556075f, -0.556148f, -0.556222f, -0.556296f, -0.556369f, -0.556443f, -0.556516f, -0.55659f, -0.556663f, -0.556737f, -0.55681f, -0.556884f, -0.556957f, -0.557031f, -0.557104f, -0.557178f, -0.557251f, -0.557325f, -0.557398f,
--0.557472f, -0.557545f, -0.557619f, -0.557692f, -0.557766f, -0.557839f, -0.557913f, -0.557986f, -0.558059f, -0.558133f, -0.558206f, -0.55828f, -0.558353f, -0.558426f, -0.5585f, -0.558573f, -0.558646f, -0.55872f, -0.558793f, -0.558867f,
--0.55894f, -0.559013f, -0.559087f, -0.55916f, -0.559233f, -0.559306f, -0.55938f, -0.559453f, -0.559526f, -0.5596f, -0.559673f, -0.559746f, -0.559819f, -0.559893f, -0.559966f, -0.560039f, -0.560112f, -0.560186f, -0.560259f, -0.560332f,
--0.560405f, -0.560479f, -0.560552f, -0.560625f, -0.560698f, -0.560771f, -0.560844f, -0.560918f, -0.560991f, -0.561064f, -0.561137f, -0.56121f, -0.561283f, -0.561356f, -0.56143f, -0.561503f, -0.561576f, -0.561649f, -0.561722f, -0.561795f,
--0.561868f, -0.561941f, -0.562014f, -0.562087f, -0.56216f, -0.562233f, -0.562307f, -0.56238f, -0.562453f, -0.562526f, -0.562599f, -0.562672f, -0.562745f, -0.562818f, -0.562891f, -0.562964f, -0.563037f, -0.56311f, -0.563182f, -0.563255f,
--0.563328f, -0.563401f, -0.563474f, -0.563547f, -0.56362f, -0.563693f, -0.563766f, -0.563839f, -0.563912f, -0.563985f, -0.564058f, -0.56413f, -0.564203f, -0.564276f, -0.564349f, -0.564422f, -0.564495f, -0.564568f, -0.56464f, -0.564713f,
--0.564786f, -0.564859f, -0.564932f, -0.565004f, -0.565077f, -0.56515f, -0.565223f, -0.565296f, -0.565368f, -0.565441f, -0.565514f, -0.565587f, -0.565659f, -0.565732f, -0.565805f, -0.565878f, -0.56595f, -0.566023f, -0.566096f, -0.566168f,
--0.566241f, -0.566314f, -0.566386f, -0.566459f, -0.566532f, -0.566604f, -0.566677f, -0.56675f, -0.566822f, -0.566895f, -0.566968f, -0.56704f, -0.567113f, -0.567185f, -0.567258f, -0.567331f, -0.567403f, -0.567476f, -0.567548f, -0.567621f,
--0.567693f, -0.567766f, -0.567839f, -0.567911f, -0.567984f, -0.568056f, -0.568129f, -0.568201f, -0.568274f, -0.568346f, -0.568419f, -0.568491f, -0.568564f, -0.568636f, -0.568709f, -0.568781f, -0.568853f, -0.568926f, -0.568998f, -0.569071f,
--0.569143f, -0.569216f, -0.569288f, -0.56936f, -0.569433f, -0.569505f, -0.569578f, -0.56965f, -0.569722f, -0.569795f, -0.569867f, -0.569939f, -0.570012f, -0.570084f, -0.570156f, -0.570229f, -0.570301f, -0.570373f, -0.570446f, -0.570518f,
--0.57059f, -0.570663f, -0.570735f, -0.570807f, -0.570879f, -0.570952f, -0.571024f, -0.571096f, -0.571168f, -0.571241f, -0.571313f, -0.571385f, -0.571457f, -0.571529f, -0.571602f, -0.571674f, -0.571746f, -0.571818f, -0.57189f, -0.571963f,
--0.572035f, -0.572107f, -0.572179f, -0.572251f, -0.572323f, -0.572395f, -0.572468f, -0.57254f, -0.572612f, -0.572684f, -0.572756f, -0.572828f, -0.5729f, -0.572972f, -0.573044f, -0.573116f, -0.573188f, -0.57326f, -0.573332f, -0.573404f,
--0.573476f, -0.573548f, -0.573621f, -0.573693f, -0.573765f, -0.573836f, -0.573908f, -0.57398f, -0.574052f, -0.574124f, -0.574196f, -0.574268f, -0.57434f, -0.574412f, -0.574484f, -0.574556f, -0.574628f, -0.5747f, -0.574772f, -0.574844f,
--0.574916f, -0.574987f, -0.575059f, -0.575131f, -0.575203f, -0.575275f, -0.575347f, -0.575419f, -0.57549f, -0.575562f, -0.575634f, -0.575706f, -0.575778f, -0.57585f, -0.575921f, -0.575993f, -0.576065f, -0.576137f, -0.576208f, -0.57628f,
--0.576352f, -0.576424f, -0.576495f, -0.576567f, -0.576639f, -0.576711f, -0.576782f, -0.576854f, -0.576926f, -0.576997f, -0.577069f, -0.577141f, -0.577212f, -0.577284f, -0.577356f, -0.577427f, -0.577499f, -0.577571f, -0.577642f, -0.577714f,
--0.577786f, -0.577857f, -0.577929f, -0.578f, -0.578072f, -0.578144f, -0.578215f, -0.578287f, -0.578358f, -0.57843f, -0.578501f, -0.578573f, -0.578645f, -0.578716f, -0.578788f, -0.578859f, -0.578931f, -0.579002f, -0.579074f, -0.579145f,
--0.579217f, -0.579288f, -0.57936f, -0.579431f, -0.579503f, -0.579574f, -0.579645f, -0.579717f, -0.579788f, -0.57986f, -0.579931f, -0.580003f, -0.580074f, -0.580145f, -0.580217f, -0.580288f, -0.580359f, -0.580431f, -0.580502f, -0.580574f,
--0.580645f, -0.580716f, -0.580788f, -0.580859f, -0.58093f, -0.581002f, -0.581073f, -0.581144f, -0.581215f, -0.581287f, -0.581358f, -0.581429f, -0.581501f, -0.581572f, -0.581643f, -0.581714f, -0.581786f, -0.581857f, -0.581928f, -0.581999f,
--0.58207f, -0.582142f, -0.582213f, -0.582284f, -0.582355f, -0.582426f, -0.582498f, -0.582569f, -0.58264f, -0.582711f, -0.582782f, -0.582853f, -0.582924f, -0.582996f, -0.583067f, -0.583138f, -0.583209f, -0.58328f, -0.583351f, -0.583422f,
--0.583493f, -0.583564f, -0.583635f, -0.583706f, -0.583777f, -0.583848f, -0.58392f, -0.583991f, -0.584062f, -0.584133f, -0.584204f, -0.584275f, -0.584346f, -0.584417f, -0.584488f, -0.584559f, -0.584629f, -0.5847f, -0.584771f, -0.584842f,
--0.584913f, -0.584984f, -0.585055f, -0.585126f, -0.585197f, -0.585268f, -0.585339f, -0.58541f, -0.585481f, -0.585551f, -0.585622f, -0.585693f, -0.585764f, -0.585835f, -0.585906f, -0.585976f, -0.586047f, -0.586118f, -0.586189f, -0.58626f,
--0.586331f, -0.586401f, -0.586472f, -0.586543f, -0.586614f, -0.586684f, -0.586755f, -0.586826f, -0.586897f, -0.586967f, -0.587038f, -0.587109f, -0.58718f, -0.58725f, -0.587321f, -0.587392f, -0.587462f, -0.587533f, -0.587604f, -0.587674f,
--0.587745f, -0.587816f, -0.587886f, -0.587957f, -0.588028f, -0.588098f, -0.588169f, -0.588239f, -0.58831f, -0.588381f, -0.588451f, -0.588522f, -0.588592f, -0.588663f, -0.588734f, -0.588804f, -0.588875f, -0.588945f, -0.589016f, -0.589086f,
--0.589157f, -0.589227f, -0.589298f, -0.589368f, -0.589439f, -0.589509f, -0.58958f, -0.58965f, -0.589721f, -0.589791f, -0.589862f, -0.589932f, -0.590003f, -0.590073f, -0.590143f, -0.590214f, -0.590284f, -0.590355f, -0.590425f, -0.590495f,
--0.590566f, -0.590636f, -0.590706f, -0.590777f, -0.590847f, -0.590918f, -0.590988f, -0.591058f, -0.591129f, -0.591199f, -0.591269f, -0.591339f, -0.59141f, -0.59148f, -0.59155f, -0.591621f, -0.591691f, -0.591761f, -0.591831f, -0.591902f,
--0.591972f, -0.592042f, -0.592112f, -0.592183f, -0.592253f, -0.592323f, -0.592393f, -0.592463f, -0.592534f, -0.592604f, -0.592674f, -0.592744f, -0.592814f, -0.592884f, -0.592955f, -0.593025f, -0.593095f, -0.593165f, -0.593235f, -0.593305f,
--0.593375f, -0.593445f, -0.593515f, -0.593585f, -0.593656f, -0.593726f, -0.593796f, -0.593866f, -0.593936f, -0.594006f, -0.594076f, -0.594146f, -0.594216f, -0.594286f, -0.594356f, -0.594426f, -0.594496f, -0.594566f, -0.594636f, -0.594706f,
--0.594776f, -0.594846f, -0.594916f, -0.594986f, -0.595056f, -0.595125f, -0.595195f, -0.595265f, -0.595335f, -0.595405f, -0.595475f, -0.595545f, -0.595615f, -0.595685f, -0.595754f, -0.595824f, -0.595894f, -0.595964f, -0.596034f, -0.596104f,
--0.596173f, -0.596243f, -0.596313f, -0.596383f, -0.596453f, -0.596522f, -0.596592f, -0.596662f, -0.596732f, -0.596801f, -0.596871f, -0.596941f, -0.597011f, -0.59708f, -0.59715f, -0.59722f, -0.59729f, -0.597359f, -0.597429f, -0.597499f,
--0.597568f, -0.597638f, -0.597708f, -0.597777f, -0.597847f, -0.597917f, -0.597986f, -0.598056f, -0.598125f, -0.598195f, -0.598265f, -0.598334f, -0.598404f, -0.598473f, -0.598543f, -0.598613f, -0.598682f, -0.598752f, -0.598821f, -0.598891f,
--0.59896f, -0.59903f, -0.599099f, -0.599169f, -0.599238f, -0.599308f, -0.599377f, -0.599447f, -0.599516f, -0.599586f, -0.599655f, -0.599725f, -0.599794f, -0.599864f, -0.599933f, -0.600002f, -0.600072f, -0.600141f, -0.600211f, -0.60028f,
--0.600349f, -0.600419f, -0.600488f, -0.600558f, -0.600627f, -0.600696f, -0.600766f, -0.600835f, -0.600904f, -0.600974f, -0.601043f, -0.601112f, -0.601182f, -0.601251f, -0.60132f, -0.601389f, -0.601459f, -0.601528f, -0.601597f, -0.601666f,
--0.601736f, -0.601805f, -0.601874f, -0.601943f, -0.602013f, -0.602082f, -0.602151f, -0.60222f, -0.602289f, -0.602359f, -0.602428f, -0.602497f, -0.602566f, -0.602635f, -0.602704f, -0.602774f, -0.602843f, -0.602912f, -0.602981f, -0.60305f,
--0.603119f, -0.603188f, -0.603257f, -0.603326f, -0.603395f, -0.603465f, -0.603534f, -0.603603f, -0.603672f, -0.603741f, -0.60381f, -0.603879f, -0.603948f, -0.604017f, -0.604086f, -0.604155f, -0.604224f, -0.604293f, -0.604362f, -0.604431f,
--0.6045f, -0.604569f, -0.604638f, -0.604706f, -0.604775f, -0.604844f, -0.604913f, -0.604982f, -0.605051f, -0.60512f, -0.605189f, -0.605258f, -0.605327f, -0.605395f, -0.605464f, -0.605533f, -0.605602f, -0.605671f, -0.60574f, -0.605808f,
--0.605877f, -0.605946f, -0.606015f, -0.606084f, -0.606152f, -0.606221f, -0.60629f, -0.606359f, -0.606428f, -0.606496f, -0.606565f, -0.606634f, -0.606702f, -0.606771f, -0.60684f, -0.606909f, -0.606977f, -0.607046f, -0.607115f, -0.607183f,
--0.607252f, -0.607321f, -0.607389f, -0.607458f, -0.607527f, -0.607595f, -0.607664f, -0.607732f, -0.607801f, -0.60787f, -0.607938f, -0.608007f, -0.608075f, -0.608144f, -0.608213f, -0.608281f, -0.60835f, -0.608418f, -0.608487f, -0.608555f,
--0.608624f, -0.608692f, -0.608761f, -0.608829f, -0.608898f, -0.608966f, -0.609035f, -0.609103f, -0.609172f, -0.60924f, -0.609309f, -0.609377f, -0.609445f, -0.609514f, -0.609582f, -0.609651f, -0.609719f, -0.609788f, -0.609856f, -0.609924f,
--0.609993f, -0.610061f, -0.610129f, -0.610198f, -0.610266f, -0.610334f, -0.610403f, -0.610471f, -0.610539f, -0.610608f, -0.610676f, -0.610744f, -0.610813f, -0.610881f, -0.610949f, -0.611017f, -0.611086f, -0.611154f, -0.611222f, -0.61129f,
--0.611359f, -0.611427f, -0.611495f, -0.611563f, -0.611631f, -0.6117f, -0.611768f, -0.611836f, -0.611904f, -0.611972f, -0.61204f, -0.612109f, -0.612177f, -0.612245f, -0.612313f, -0.612381f, -0.612449f, -0.612517f, -0.612585f, -0.612654f,
--0.612722f, -0.61279f, -0.612858f, -0.612926f, -0.612994f, -0.613062f, -0.61313f, -0.613198f, -0.613266f, -0.613334f, -0.613402f, -0.61347f, -0.613538f, -0.613606f, -0.613674f, -0.613742f, -0.61381f, -0.613878f, -0.613946f, -0.614014f,
--0.614082f, -0.61415f, -0.614218f, -0.614285f, -0.614353f, -0.614421f, -0.614489f, -0.614557f, -0.614625f, -0.614693f, -0.614761f, -0.614828f, -0.614896f, -0.614964f, -0.615032f, -0.6151f, -0.615168f, -0.615235f, -0.615303f, -0.615371f,
--0.615439f, -0.615507f, -0.615574f, -0.615642f, -0.61571f, -0.615778f, -0.615845f, -0.615913f, -0.615981f, -0.616048f, -0.616116f, -0.616184f, -0.616252f, -0.616319f, -0.616387f, -0.616455f, -0.616522f, -0.61659f, -0.616658f, -0.616725f,
--0.616793f, -0.61686f, -0.616928f, -0.616996f, -0.617063f, -0.617131f, -0.617199f, -0.617266f, -0.617334f, -0.617401f, -0.617469f, -0.617536f, -0.617604f, -0.617671f, -0.617739f, -0.617806f, -0.617874f, -0.617942f, -0.618009f, -0.618077f,
--0.618144f, -0.618211f, -0.618279f, -0.618346f, -0.618414f, -0.618481f, -0.618549f, -0.618616f, -0.618684f, -0.618751f, -0.618818f, -0.618886f, -0.618953f, -0.619021f, -0.619088f, -0.619155f, -0.619223f, -0.61929f, -0.619357f, -0.619425f,
--0.619492f, -0.619559f, -0.619627f, -0.619694f, -0.619761f, -0.619829f, -0.619896f, -0.619963f, -0.620031f, -0.620098f, -0.620165f, -0.620232f, -0.6203f, -0.620367f, -0.620434f, -0.620501f, -0.620568f, -0.620636f, -0.620703f, -0.62077f,
--0.620837f, -0.620904f, -0.620972f, -0.621039f, -0.621106f, -0.621173f, -0.62124f, -0.621307f, -0.621374f, -0.621442f, -0.621509f, -0.621576f, -0.621643f, -0.62171f, -0.621777f, -0.621844f, -0.621911f, -0.621978f, -0.622045f, -0.622112f,
--0.622179f, -0.622246f, -0.622313f, -0.62238f, -0.622447f, -0.622514f, -0.622581f, -0.622648f, -0.622715f, -0.622782f, -0.622849f, -0.622916f, -0.622983f, -0.62305f, -0.623117f, -0.623184f, -0.623251f, -0.623318f, -0.623385f, -0.623452f,
--0.623519f, -0.623585f, -0.623652f, -0.623719f, -0.623786f, -0.623853f, -0.62392f, -0.623987f, -0.624053f, -0.62412f, -0.624187f, -0.624254f, -0.624321f, -0.624387f, -0.624454f, -0.624521f, -0.624588f, -0.624654f, -0.624721f, -0.624788f,
--0.624855f, -0.624921f, -0.624988f, -0.625055f, -0.625121f, -0.625188f, -0.625255f, -0.625322f, -0.625388f, -0.625455f, -0.625522f, -0.625588f, -0.625655f, -0.625721f, -0.625788f, -0.625855f, -0.625921f, -0.625988f, -0.626054f, -0.626121f,
--0.626188f, -0.626254f, -0.626321f, -0.626387f, -0.626454f, -0.62652f, -0.626587f, -0.626654f, -0.62672f, -0.626787f, -0.626853f, -0.62692f, -0.626986f, -0.627053f, -0.627119f, -0.627185f, -0.627252f, -0.627318f, -0.627385f, -0.627451f,
--0.627518f, -0.627584f, -0.627651f, -0.627717f, -0.627783f, -0.62785f, -0.627916f, -0.627982f, -0.628049f, -0.628115f, -0.628182f, -0.628248f, -0.628314f, -0.628381f, -0.628447f, -0.628513f, -0.628579f, -0.628646f, -0.628712f, -0.628778f,
--0.628845f, -0.628911f, -0.628977f, -0.629043f, -0.62911f, -0.629176f, -0.629242f, -0.629308f, -0.629375f, -0.629441f, -0.629507f, -0.629573f, -0.629639f, -0.629705f, -0.629772f, -0.629838f, -0.629904f, -0.62997f, -0.630036f, -0.630102f,
--0.630169f, -0.630235f, -0.630301f, -0.630367f, -0.630433f, -0.630499f, -0.630565f, -0.630631f, -0.630697f, -0.630763f, -0.630829f, -0.630895f, -0.630961f, -0.631027f, -0.631093f, -0.631159f, -0.631225f, -0.631291f, -0.631357f, -0.631423f,
--0.631489f, -0.631555f, -0.631621f, -0.631687f, -0.631753f, -0.631819f, -0.631885f, -0.631951f, -0.632017f, -0.632083f, -0.632149f, -0.632214f, -0.63228f, -0.632346f, -0.632412f, -0.632478f, -0.632544f, -0.63261f, -0.632675f, -0.632741f,
--0.632807f, -0.632873f, -0.632939f, -0.633004f, -0.63307f, -0.633136f, -0.633202f, -0.633268f, -0.633333f, -0.633399f, -0.633465f, -0.63353f, -0.633596f, -0.633662f, -0.633728f, -0.633793f, -0.633859f, -0.633925f, -0.63399f, -0.634056f,
--0.634122f, -0.634187f, -0.634253f, -0.634319f, -0.634384f, -0.63445f, -0.634515f, -0.634581f, -0.634647f, -0.634712f, -0.634778f, -0.634843f, -0.634909f, -0.634975f, -0.63504f, -0.635106f, -0.635171f, -0.635237f, -0.635302f, -0.635368f,
--0.635433f, -0.635499f, -0.635564f, -0.63563f, -0.635695f, -0.635761f, -0.635826f, -0.635892f, -0.635957f, -0.636022f, -0.636088f, -0.636153f, -0.636219f, -0.636284f, -0.636349f, -0.636415f, -0.63648f, -0.636546f, -0.636611f, -0.636676f,
--0.636742f, -0.636807f, -0.636872f, -0.636938f, -0.637003f, -0.637068f, -0.637134f, -0.637199f, -0.637264f, -0.637329f, -0.637395f, -0.63746f, -0.637525f, -0.63759f, -0.637656f, -0.637721f, -0.637786f, -0.637851f, -0.637917f, -0.637982f,
--0.638047f, -0.638112f, -0.638177f, -0.638243f, -0.638308f, -0.638373f, -0.638438f, -0.638503f, -0.638568f, -0.638633f, -0.638698f, -0.638764f, -0.638829f, -0.638894f, -0.638959f, -0.639024f, -0.639089f, -0.639154f, -0.639219f, -0.639284f,
--0.639349f, -0.639414f, -0.639479f, -0.639544f, -0.639609f, -0.639674f, -0.639739f, -0.639804f, -0.639869f, -0.639934f, -0.639999f, -0.640064f, -0.640129f, -0.640194f, -0.640259f, -0.640324f, -0.640389f, -0.640454f, -0.640518f, -0.640583f,
--0.640648f, -0.640713f, -0.640778f, -0.640843f, -0.640908f, -0.640972f, -0.641037f, -0.641102f, -0.641167f, -0.641232f, -0.641297f, -0.641361f, -0.641426f, -0.641491f, -0.641556f, -0.64162f, -0.641685f, -0.64175f, -0.641815f, -0.641879f,
--0.641944f, -0.642009f, -0.642074f, -0.642138f, -0.642203f, -0.642268f, -0.642332f, -0.642397f, -0.642462f, -0.642526f, -0.642591f, -0.642656f, -0.64272f, -0.642785f, -0.642849f, -0.642914f, -0.642979f, -0.643043f, -0.643108f, -0.643172f,
--0.643237f, -0.643301f, -0.643366f, -0.643431f, -0.643495f, -0.64356f, -0.643624f, -0.643689f, -0.643753f, -0.643818f, -0.643882f, -0.643947f, -0.644011f, -0.644075f, -0.64414f, -0.644204f, -0.644269f, -0.644333f, -0.644398f, -0.644462f,
--0.644526f, -0.644591f, -0.644655f, -0.64472f, -0.644784f, -0.644848f, -0.644913f, -0.644977f, -0.645041f, -0.645106f, -0.64517f, -0.645234f, -0.645299f, -0.645363f, -0.645427f, -0.645492f, -0.645556f, -0.64562f, -0.645684f, -0.645749f,
--0.645813f, -0.645877f, -0.645941f, -0.646006f, -0.64607f, -0.646134f, -0.646198f, -0.646262f, -0.646327f, -0.646391f, -0.646455f, -0.646519f, -0.646583f, -0.646647f, -0.646711f, -0.646776f, -0.64684f, -0.646904f, -0.646968f, -0.647032f,
--0.647096f, -0.64716f, -0.647224f, -0.647288f, -0.647352f, -0.647416f, -0.64748f, -0.647544f, -0.647609f, -0.647673f, -0.647737f, -0.647801f, -0.647865f, -0.647928f, -0.647992f, -0.648056f, -0.64812f, -0.648184f, -0.648248f, -0.648312f,
--0.648376f, -0.64844f, -0.648504f, -0.648568f, -0.648632f, -0.648696f, -0.64876f, -0.648823f, -0.648887f, -0.648951f, -0.649015f, -0.649079f, -0.649143f, -0.649206f, -0.64927f, -0.649334f, -0.649398f, -0.649462f, -0.649525f, -0.649589f,
--0.649653f, -0.649717f, -0.649781f, -0.649844f, -0.649908f, -0.649972f, -0.650035f, -0.650099f, -0.650163f, -0.650227f, -0.65029f, -0.650354f, -0.650418f, -0.650481f, -0.650545f, -0.650609f, -0.650672f, -0.650736f, -0.650799f, -0.650863f,
--0.650927f, -0.65099f, -0.651054f, -0.651117f, -0.651181f, -0.651245f, -0.651308f, -0.651372f, -0.651435f, -0.651499f, -0.651562f, -0.651626f, -0.651689f, -0.651753f, -0.651816f, -0.65188f, -0.651943f, -0.652007f, -0.65207f, -0.652134f,
--0.652197f, -0.65226f, -0.652324f, -0.652387f, -0.652451f, -0.652514f, -0.652578f, -0.652641f, -0.652704f, -0.652768f, -0.652831f, -0.652894f, -0.652958f, -0.653021f, -0.653084f, -0.653148f, -0.653211f, -0.653274f, -0.653338f, -0.653401f,
--0.653464f, -0.653528f, -0.653591f, -0.653654f, -0.653717f, -0.653781f, -0.653844f, -0.653907f, -0.65397f, -0.654033f, -0.654097f, -0.65416f, -0.654223f, -0.654286f, -0.654349f, -0.654413f, -0.654476f, -0.654539f, -0.654602f, -0.654665f,
--0.654728f, -0.654791f, -0.654854f, -0.654918f, -0.654981f, -0.655044f, -0.655107f, -0.65517f, -0.655233f, -0.655296f, -0.655359f, -0.655422f, -0.655485f, -0.655548f, -0.655611f, -0.655674f, -0.655737f, -0.6558f, -0.655863f, -0.655926f,
--0.655989f, -0.656052f, -0.656115f, -0.656178f, -0.656241f, -0.656304f, -0.656367f, -0.656429f, -0.656492f, -0.656555f, -0.656618f, -0.656681f, -0.656744f, -0.656807f, -0.65687f, -0.656932f, -0.656995f, -0.657058f, -0.657121f, -0.657184f,
--0.657246f, -0.657309f, -0.657372f, -0.657435f, -0.657498f, -0.65756f, -0.657623f, -0.657686f, -0.657748f, -0.657811f, -0.657874f, -0.657937f, -0.657999f, -0.658062f, -0.658125f, -0.658187f, -0.65825f, -0.658313f, -0.658375f, -0.658438f,
--0.658501f, -0.658563f, -0.658626f, -0.658688f, -0.658751f, -0.658814f, -0.658876f, -0.658939f, -0.659001f, -0.659064f, -0.659127f, -0.659189f, -0.659252f, -0.659314f, -0.659377f, -0.659439f, -0.659502f, -0.659564f, -0.659627f, -0.659689f,
--0.659752f, -0.659814f, -0.659876f, -0.659939f, -0.660001f, -0.660064f, -0.660126f, -0.660189f, -0.660251f, -0.660313f, -0.660376f, -0.660438f, -0.660501f, -0.660563f, -0.660625f, -0.660688f, -0.66075f, -0.660812f, -0.660875f, -0.660937f,
--0.660999f, -0.661062f, -0.661124f, -0.661186f, -0.661248f, -0.661311f, -0.661373f, -0.661435f, -0.661497f, -0.66156f, -0.661622f, -0.661684f, -0.661746f, -0.661808f, -0.661871f, -0.661933f, -0.661995f, -0.662057f, -0.662119f, -0.662182f,
--0.662244f, -0.662306f, -0.662368f, -0.66243f, -0.662492f, -0.662554f, -0.662616f, -0.662678f, -0.66274f, -0.662803f, -0.662865f, -0.662927f, -0.662989f, -0.663051f, -0.663113f, -0.663175f, -0.663237f, -0.663299f, -0.663361f, -0.663423f,
--0.663485f, -0.663547f, -0.663609f, -0.663671f, -0.663733f, -0.663794f, -0.663856f, -0.663918f, -0.66398f, -0.664042f, -0.664104f, -0.664166f, -0.664228f, -0.66429f, -0.664352f, -0.664413f, -0.664475f, -0.664537f, -0.664599f, -0.664661f,
--0.664723f, -0.664784f, -0.664846f, -0.664908f, -0.66497f, -0.665031f, -0.665093f, -0.665155f, -0.665217f, -0.665278f, -0.66534f, -0.665402f, -0.665464f, -0.665525f, -0.665587f, -0.665649f, -0.66571f, -0.665772f, -0.665834f, -0.665895f,
--0.665957f, -0.666019f, -0.66608f, -0.666142f, -0.666204f, -0.666265f, -0.666327f, -0.666388f, -0.66645f, -0.666511f, -0.666573f, -0.666635f, -0.666696f, -0.666758f, -0.666819f, -0.666881f, -0.666942f, -0.667004f, -0.667065f, -0.667127f,
--0.667188f, -0.66725f, -0.667311f, -0.667373f, -0.667434f, -0.667495f, -0.667557f, -0.667618f, -0.66768f, -0.667741f, -0.667803f, -0.667864f, -0.667925f, -0.667987f, -0.668048f, -0.668109f, -0.668171f, -0.668232f, -0.668293f, -0.668355f,
--0.668416f, -0.668477f, -0.668539f, -0.6686f, -0.668661f, -0.668722f, -0.668784f, -0.668845f, -0.668906f, -0.668967f, -0.669029f, -0.66909f, -0.669151f, -0.669212f, -0.669274f, -0.669335f, -0.669396f, -0.669457f, -0.669518f, -0.669579f,
--0.669641f, -0.669702f, -0.669763f, -0.669824f, -0.669885f, -0.669946f, -0.670007f, -0.670068f, -0.670129f, -0.67019f, -0.670252f, -0.670313f, -0.670374f, -0.670435f, -0.670496f, -0.670557f, -0.670618f, -0.670679f, -0.67074f, -0.670801f,
--0.670862f, -0.670923f, -0.670984f, -0.671045f, -0.671106f, -0.671166f, -0.671227f, -0.671288f, -0.671349f, -0.67141f, -0.671471f, -0.671532f, -0.671593f, -0.671654f, -0.671714f, -0.671775f, -0.671836f, -0.671897f, -0.671958f, -0.672019f,
--0.672079f, -0.67214f, -0.672201f, -0.672262f, -0.672323f, -0.672383f, -0.672444f, -0.672505f, -0.672566f, -0.672626f, -0.672687f, -0.672748f, -0.672809f, -0.672869f, -0.67293f, -0.672991f, -0.673051f, -0.673112f, -0.673173f, -0.673233f,
--0.673294f, -0.673355f, -0.673415f, -0.673476f, -0.673536f, -0.673597f, -0.673658f, -0.673718f, -0.673779f, -0.673839f, -0.6739f, -0.67396f, -0.674021f, -0.674082f, -0.674142f, -0.674203f, -0.674263f, -0.674324f, -0.674384f, -0.674445f,
--0.674505f, -0.674565f, -0.674626f, -0.674686f, -0.674747f, -0.674807f, -0.674868f, -0.674928f, -0.674988f, -0.675049f, -0.675109f, -0.67517f, -0.67523f, -0.67529f, -0.675351f, -0.675411f, -0.675471f, -0.675532f, -0.675592f, -0.675652f,
--0.675713f, -0.675773f, -0.675833f, -0.675894f, -0.675954f, -0.676014f, -0.676074f, -0.676135f, -0.676195f, -0.676255f, -0.676315f, -0.676375f, -0.676436f, -0.676496f, -0.676556f, -0.676616f, -0.676676f, -0.676737f, -0.676797f, -0.676857f,
--0.676917f, -0.676977f, -0.677037f, -0.677097f, -0.677157f, -0.677218f, -0.677278f, -0.677338f, -0.677398f, -0.677458f, -0.677518f, -0.677578f, -0.677638f, -0.677698f, -0.677758f, -0.677818f, -0.677878f, -0.677938f, -0.677998f, -0.678058f,
--0.678118f, -0.678178f, -0.678238f, -0.678298f, -0.678358f, -0.678418f, -0.678478f, -0.678537f, -0.678597f, -0.678657f, -0.678717f, -0.678777f, -0.678837f, -0.678897f, -0.678957f, -0.679016f, -0.679076f, -0.679136f, -0.679196f, -0.679256f,
--0.679315f, -0.679375f, -0.679435f, -0.679495f, -0.679555f, -0.679614f, -0.679674f, -0.679734f, -0.679794f, -0.679853f, -0.679913f, -0.679973f, -0.680032f, -0.680092f, -0.680152f, -0.680211f, -0.680271f, -0.680331f, -0.68039f, -0.68045f,
--0.68051f, -0.680569f, -0.680629f, -0.680688f, -0.680748f, -0.680808f, -0.680867f, -0.680927f, -0.680986f, -0.681046f, -0.681105f, -0.681165f, -0.681224f, -0.681284f, -0.681343f, -0.681403f, -0.681462f, -0.681522f, -0.681581f, -0.681641f,
--0.6817f, -0.68176f, -0.681819f, -0.681879f, -0.681938f, -0.681997f, -0.682057f, -0.682116f, -0.682176f, -0.682235f, -0.682294f, -0.682354f, -0.682413f, -0.682472f, -0.682532f, -0.682591f, -0.68265f, -0.68271f, -0.682769f, -0.682828f,
--0.682888f, -0.682947f, -0.683006f, -0.683065f, -0.683125f, -0.683184f, -0.683243f, -0.683302f, -0.683361f, -0.683421f, -0.68348f, -0.683539f, -0.683598f, -0.683657f, -0.683717f, -0.683776f, -0.683835f, -0.683894f, -0.683953f, -0.684012f,
--0.684071f, -0.68413f, -0.68419f, -0.684249f, -0.684308f, -0.684367f, -0.684426f, -0.684485f, -0.684544f, -0.684603f, -0.684662f, -0.684721f, -0.68478f, -0.684839f, -0.684898f, -0.684957f, -0.685016f, -0.685075f, -0.685134f, -0.685193f,
--0.685252f, -0.685311f, -0.68537f, -0.685429f, -0.685487f, -0.685546f, -0.685605f, -0.685664f, -0.685723f, -0.685782f, -0.685841f, -0.6859f, -0.685958f, -0.686017f, -0.686076f, -0.686135f, -0.686194f, -0.686252f, -0.686311f, -0.68637f,
--0.686429f, -0.686487f, -0.686546f, -0.686605f, -0.686664f, -0.686722f, -0.686781f, -0.68684f, -0.686899f, -0.686957f, -0.687016f, -0.687075f, -0.687133f, -0.687192f, -0.687251f, -0.687309f, -0.687368f, -0.687426f, -0.687485f, -0.687544f,
--0.687602f, -0.687661f, -0.687719f, -0.687778f, -0.687836f, -0.687895f, -0.687954f, -0.688012f, -0.688071f, -0.688129f, -0.688188f, -0.688246f, -0.688305f, -0.688363f, -0.688422f, -0.68848f, -0.688538f, -0.688597f, -0.688655f, -0.688714f,
--0.688772f, -0.688831f, -0.688889f, -0.688947f, -0.689006f, -0.689064f, -0.689123f, -0.689181f, -0.689239f, -0.689298f, -0.689356f, -0.689414f, -0.689473f, -0.689531f, -0.689589f, -0.689647f, -0.689706f, -0.689764f, -0.689822f, -0.689881f,
--0.689939f, -0.689997f, -0.690055f, -0.690113f, -0.690172f, -0.69023f, -0.690288f, -0.690346f, -0.690404f, -0.690463f, -0.690521f, -0.690579f, -0.690637f, -0.690695f, -0.690753f, -0.690811f, -0.690869f, -0.690928f, -0.690986f, -0.691044f,
--0.691102f, -0.69116f, -0.691218f, -0.691276f, -0.691334f, -0.691392f, -0.69145f, -0.691508f, -0.691566f, -0.691624f, -0.691682f, -0.69174f, -0.691798f, -0.691856f, -0.691914f, -0.691972f, -0.69203f, -0.692088f, -0.692146f, -0.692204f,
--0.692261f, -0.692319f, -0.692377f, -0.692435f, -0.692493f, -0.692551f, -0.692609f, -0.692666f, -0.692724f, -0.692782f, -0.69284f, -0.692898f, -0.692955f, -0.693013f, -0.693071f, -0.693129f, -0.693187f, -0.693244f, -0.693302f, -0.69336f,
--0.693417f, -0.693475f, -0.693533f, -0.693591f, -0.693648f, -0.693706f, -0.693764f, -0.693821f, -0.693879f, -0.693937f, -0.693994f, -0.694052f, -0.694109f, -0.694167f, -0.694225f, -0.694282f, -0.69434f, -0.694397f, -0.694455f, -0.694513f,
--0.69457f, -0.694628f, -0.694685f, -0.694743f, -0.6948f, -0.694858f, -0.694915f, -0.694973f, -0.69503f, -0.695088f, -0.695145f, -0.695202f, -0.69526f, -0.695317f, -0.695375f, -0.695432f, -0.69549f, -0.695547f, -0.695604f, -0.695662f,
--0.695719f, -0.695776f, -0.695834f, -0.695891f, -0.695949f, -0.696006f, -0.696063f, -0.69612f, -0.696178f, -0.696235f, -0.696292f, -0.69635f, -0.696407f, -0.696464f, -0.696521f, -0.696579f, -0.696636f, -0.696693f, -0.69675f, -0.696807f,
--0.696865f, -0.696922f, -0.696979f, -0.697036f, -0.697093f, -0.69715f, -0.697208f, -0.697265f, -0.697322f, -0.697379f, -0.697436f, -0.697493f, -0.69755f, -0.697607f, -0.697664f, -0.697721f, -0.697779f, -0.697836f, -0.697893f, -0.69795f,
--0.698007f, -0.698064f, -0.698121f, -0.698178f, -0.698235f, -0.698292f, -0.698349f, -0.698406f, -0.698462f, -0.698519f, -0.698576f, -0.698633f, -0.69869f, -0.698747f, -0.698804f, -0.698861f, -0.698918f, -0.698975f, -0.699031f, -0.699088f,
--0.699145f, -0.699202f, -0.699259f, -0.699316f, -0.699372f, -0.699429f, -0.699486f, -0.699543f, -0.6996f, -0.699656f, -0.699713f, -0.69977f, -0.699827f, -0.699883f, -0.69994f, -0.699997f, -0.700053f, -0.70011f, -0.700167f, -0.700223f,
--0.70028f, -0.700337f, -0.700393f, -0.70045f, -0.700507f, -0.700563f, -0.70062f, -0.700676f, -0.700733f, -0.70079f, -0.700846f, -0.700903f, -0.700959f, -0.701016f, -0.701072f, -0.701129f, -0.701185f, -0.701242f, -0.701298f, -0.701355f,
--0.701411f, -0.701468f, -0.701524f, -0.701581f, -0.701637f, -0.701694f, -0.70175f, -0.701807f, -0.701863f, -0.701919f, -0.701976f, -0.702032f, -0.702089f, -0.702145f, -0.702201f, -0.702258f, -0.702314f, -0.70237f, -0.702427f, -0.702483f,
--0.702539f, -0.702596f, -0.702652f, -0.702708f, -0.702764f, -0.702821f, -0.702877f, -0.702933f, -0.702989f, -0.703046f, -0.703102f, -0.703158f, -0.703214f, -0.70327f, -0.703327f, -0.703383f, -0.703439f, -0.703495f, -0.703551f, -0.703607f,
--0.703664f, -0.70372f, -0.703776f, -0.703832f, -0.703888f, -0.703944f, -0.704f, -0.704056f, -0.704112f, -0.704168f, -0.704224f, -0.70428f, -0.704336f, -0.704392f, -0.704448f, -0.704504f, -0.70456f, -0.704616f, -0.704672f, -0.704728f,
--0.704784f, -0.70484f, -0.704896f, -0.704952f, -0.705008f, -0.705064f, -0.70512f, -0.705176f, -0.705231f, -0.705287f, -0.705343f, -0.705399f, -0.705455f, -0.705511f, -0.705567f, -0.705622f, -0.705678f, -0.705734f, -0.70579f, -0.705846f,
--0.705901f, -0.705957f, -0.706013f, -0.706069f, -0.706124f, -0.70618f, -0.706236f, -0.706291f, -0.706347f, -0.706403f, -0.706458f, -0.706514f, -0.70657f, -0.706625f, -0.706681f, -0.706737f, -0.706792f, -0.706848f, -0.706904f, -0.706959f,
--0.707015f, -0.70707f, -0.707126f, -0.707181f, -0.707237f, -0.707293f, -0.707348f, -0.707404f, -0.707459f, -0.707515f, -0.70757f, -0.707626f, -0.707681f, -0.707737f, -0.707792f, -0.707848f, -0.707903f, -0.707958f, -0.708014f, -0.708069f,
--0.708125f, -0.70818f, -0.708235f, -0.708291f, -0.708346f, -0.708402f, -0.708457f, -0.708512f, -0.708568f, -0.708623f, -0.708678f, -0.708734f, -0.708789f, -0.708844f, -0.708899f, -0.708955f, -0.70901f, -0.709065f, -0.709121f, -0.709176f,
--0.709231f, -0.709286f, -0.709341f, -0.709397f, -0.709452f, -0.709507f, -0.709562f, -0.709617f, -0.709672f, -0.709728f, -0.709783f, -0.709838f, -0.709893f, -0.709948f, -0.710003f, -0.710058f, -0.710113f, -0.710168f, -0.710224f, -0.710279f,
--0.710334f, -0.710389f, -0.710444f, -0.710499f, -0.710554f, -0.710609f, -0.710664f, -0.710719f, -0.710774f, -0.710829f, -0.710884f, -0.710939f, -0.710994f, -0.711048f, -0.711103f, -0.711158f, -0.711213f, -0.711268f, -0.711323f, -0.711378f,
--0.711433f, -0.711488f, -0.711542f, -0.711597f, -0.711652f, -0.711707f, -0.711762f, -0.711817f, -0.711871f, -0.711926f, -0.711981f, -0.712036f, -0.71209f, -0.712145f, -0.7122f, -0.712255f, -0.712309f, -0.712364f, -0.712419f, -0.712473f,
--0.712528f, -0.712583f, -0.712638f, -0.712692f, -0.712747f, -0.712801f, -0.712856f, -0.712911f, -0.712965f, -0.71302f, -0.713075f, -0.713129f, -0.713184f, -0.713238f, -0.713293f, -0.713347f, -0.713402f, -0.713456f, -0.713511f, -0.713565f,
--0.71362f, -0.713674f, -0.713729f, -0.713783f, -0.713838f, -0.713892f, -0.713947f, -0.714001f, -0.714056f, -0.71411f, -0.714165f, -0.714219f, -0.714273f, -0.714328f, -0.714382f, -0.714436f, -0.714491f, -0.714545f, -0.714599f, -0.714654f,
--0.714708f, -0.714762f, -0.714817f, -0.714871f, -0.714925f, -0.71498f, -0.715034f, -0.715088f, -0.715142f, -0.715197f, -0.715251f, -0.715305f, -0.715359f, -0.715413f, -0.715468f, -0.715522f, -0.715576f, -0.71563f, -0.715684f, -0.715739f,
--0.715793f, -0.715847f, -0.715901f, -0.715955f, -0.716009f, -0.716063f, -0.716117f, -0.716171f, -0.716225f, -0.716279f, -0.716334f, -0.716388f, -0.716442f, -0.716496f, -0.71655f, -0.716604f, -0.716658f, -0.716712f, -0.716766f, -0.71682f,
--0.716874f, -0.716927f, -0.716981f, -0.717035f, -0.717089f, -0.717143f, -0.717197f, -0.717251f, -0.717305f, -0.717359f, -0.717413f, -0.717466f, -0.71752f, -0.717574f, -0.717628f, -0.717682f, -0.717736f, -0.717789f, -0.717843f, -0.717897f,
--0.717951f, -0.718004f, -0.718058f, -0.718112f, -0.718166f, -0.718219f, -0.718273f, -0.718327f, -0.718381f, -0.718434f, -0.718488f, -0.718542f, -0.718595f, -0.718649f, -0.718703f, -0.718756f, -0.71881f, -0.718863f, -0.718917f, -0.718971f,
--0.719024f, -0.719078f, -0.719131f, -0.719185f, -0.719238f, -0.719292f, -0.719346f, -0.719399f, -0.719453f, -0.719506f, -0.71956f, -0.719613f, -0.719667f, -0.71972f, -0.719774f, -0.719827f, -0.71988f, -0.719934f, -0.719987f, -0.720041f,
--0.720094f, -0.720147f, -0.720201f, -0.720254f, -0.720308f, -0.720361f, -0.720414f, -0.720468f, -0.720521f, -0.720574f, -0.720628f, -0.720681f, -0.720734f, -0.720787f, -0.720841f, -0.720894f, -0.720947f, -0.721001f, -0.721054f, -0.721107f,
--0.72116f, -0.721213f, -0.721267f, -0.72132f, -0.721373f, -0.721426f, -0.721479f, -0.721533f, -0.721586f, -0.721639f, -0.721692f, -0.721745f, -0.721798f, -0.721851f, -0.721904f, -0.721957f, -0.722011f, -0.722064f, -0.722117f, -0.72217f,
--0.722223f, -0.722276f, -0.722329f, -0.722382f, -0.722435f, -0.722488f, -0.722541f, -0.722594f, -0.722647f, -0.7227f, -0.722753f, -0.722805f, -0.722858f, -0.722911f, -0.722964f, -0.723017f, -0.72307f, -0.723123f, -0.723176f, -0.723229f,
--0.723281f, -0.723334f, -0.723387f, -0.72344f, -0.723493f, -0.723546f, -0.723598f, -0.723651f, -0.723704f, -0.723757f, -0.723809f, -0.723862f, -0.723915f, -0.723968f, -0.72402f, -0.724073f, -0.724126f, -0.724178f, -0.724231f, -0.724284f,
--0.724337f, -0.724389f, -0.724442f, -0.724494f, -0.724547f, -0.7246f, -0.724652f, -0.724705f, -0.724758f, -0.72481f, -0.724863f, -0.724915f, -0.724968f, -0.72502f, -0.725073f, -0.725125f, -0.725178f, -0.72523f, -0.725283f, -0.725335f,
--0.725388f, -0.72544f, -0.725493f, -0.725545f, -0.725598f, -0.72565f, -0.725703f, -0.725755f, -0.725807f, -0.72586f, -0.725912f, -0.725965f, -0.726017f, -0.726069f, -0.726122f, -0.726174f, -0.726226f, -0.726279f, -0.726331f, -0.726383f,
--0.726435f, -0.726488f, -0.72654f, -0.726592f, -0.726645f, -0.726697f, -0.726749f, -0.726801f, -0.726853f, -0.726906f, -0.726958f, -0.72701f, -0.727062f, -0.727114f, -0.727167f, -0.727219f, -0.727271f, -0.727323f, -0.727375f, -0.727427f,
--0.727479f, -0.727531f, -0.727584f, -0.727636f, -0.727688f, -0.72774f, -0.727792f, -0.727844f, -0.727896f, -0.727948f, -0.728f, -0.728052f, -0.728104f, -0.728156f, -0.728208f, -0.72826f, -0.728312f, -0.728364f, -0.728416f, -0.728468f,
--0.72852f, -0.728571f, -0.728623f, -0.728675f, -0.728727f, -0.728779f, -0.728831f, -0.728883f, -0.728935f, -0.728986f, -0.729038f, -0.72909f, -0.729142f, -0.729194f, -0.729245f, -0.729297f, -0.729349f, -0.729401f, -0.729452f, -0.729504f,
--0.729556f, -0.729608f, -0.729659f, -0.729711f, -0.729763f, -0.729814f, -0.729866f, -0.729918f, -0.729969f, -0.730021f, -0.730073f, -0.730124f, -0.730176f, -0.730228f, -0.730279f, -0.730331f, -0.730382f, -0.730434f, -0.730486f, -0.730537f,
--0.730589f, -0.73064f, -0.730692f, -0.730743f, -0.730795f, -0.730846f, -0.730898f, -0.730949f, -0.731001f, -0.731052f, -0.731104f, -0.731155f, -0.731206f, -0.731258f, -0.731309f, -0.731361f, -0.731412f, -0.731463f, -0.731515f, -0.731566f,
--0.731618f, -0.731669f, -0.73172f, -0.731772f, -0.731823f, -0.731874f, -0.731925f, -0.731977f, -0.732028f, -0.732079f, -0.732131f, -0.732182f, -0.732233f, -0.732284f, -0.732336f, -0.732387f, -0.732438f, -0.732489f, -0.73254f, -0.732591f,
--0.732643f, -0.732694f, -0.732745f, -0.732796f, -0.732847f, -0.732898f, -0.732949f, -0.733001f, -0.733052f, -0.733103f, -0.733154f, -0.733205f, -0.733256f, -0.733307f, -0.733358f, -0.733409f, -0.73346f, -0.733511f, -0.733562f, -0.733613f,
--0.733664f, -0.733715f, -0.733766f, -0.733817f, -0.733868f, -0.733919f, -0.73397f, -0.734021f, -0.734072f, -0.734122f, -0.734173f, -0.734224f, -0.734275f, -0.734326f, -0.734377f, -0.734428f, -0.734478f, -0.734529f, -0.73458f, -0.734631f,
--0.734682f, -0.734732f, -0.734783f, -0.734834f, -0.734885f, -0.734935f, -0.734986f, -0.735037f, -0.735088f, -0.735138f, -0.735189f, -0.73524f, -0.73529f, -0.735341f, -0.735392f, -0.735442f, -0.735493f, -0.735544f, -0.735594f, -0.735645f,
--0.735695f, -0.735746f, -0.735797f, -0.735847f, -0.735898f, -0.735948f, -0.735999f, -0.736049f, -0.7361f, -0.73615f, -0.736201f, -0.736251f, -0.736302f, -0.736352f, -0.736403f, -0.736453f, -0.736504f, -0.736554f, -0.736605f, -0.736655f,
--0.736705f, -0.736756f, -0.736806f, -0.736857f, -0.736907f, -0.736957f, -0.737008f, -0.737058f, -0.737108f, -0.737159f, -0.737209f, -0.737259f, -0.73731f, -0.73736f, -0.73741f, -0.73746f, -0.737511f, -0.737561f, -0.737611f, -0.737661f,
--0.737712f, -0.737762f, -0.737812f, -0.737862f, -0.737912f, -0.737963f, -0.738013f, -0.738063f, -0.738113f, -0.738163f, -0.738213f, -0.738263f, -0.738314f, -0.738364f, -0.738414f, -0.738464f, -0.738514f, -0.738564f, -0.738614f, -0.738664f,
--0.738714f, -0.738764f, -0.738814f, -0.738864f, -0.738914f, -0.738964f, -0.739014f, -0.739064f, -0.739114f, -0.739164f, -0.739214f, -0.739264f, -0.739314f, -0.739364f, -0.739414f, -0.739463f, -0.739513f, -0.739563f, -0.739613f, -0.739663f,
--0.739713f, -0.739763f, -0.739812f, -0.739862f, -0.739912f, -0.739962f, -0.740012f, -0.740061f, -0.740111f, -0.740161f, -0.740211f, -0.74026f, -0.74031f, -0.74036f, -0.740409f, -0.740459f, -0.740509f, -0.740559f, -0.740608f, -0.740658f,
--0.740708f, -0.740757f, -0.740807f, -0.740856f, -0.740906f, -0.740956f, -0.741005f, -0.741055f, -0.741104f, -0.741154f, -0.741203f, -0.741253f, -0.741303f, -0.741352f, -0.741402f, -0.741451f, -0.741501f, -0.74155f, -0.7416f, -0.741649f,
--0.741698f, -0.741748f, -0.741797f, -0.741847f, -0.741896f, -0.741946f, -0.741995f, -0.742044f, -0.742094f, -0.742143f, -0.742193f, -0.742242f, -0.742291f, -0.742341f, -0.74239f, -0.742439f, -0.742488f, -0.742538f, -0.742587f, -0.742636f,
--0.742686f, -0.742735f, -0.742784f, -0.742833f, -0.742883f, -0.742932f, -0.742981f, -0.74303f, -0.743079f, -0.743129f, -0.743178f, -0.743227f, -0.743276f, -0.743325f, -0.743374f, -0.743423f, -0.743473f, -0.743522f, -0.743571f, -0.74362f,
--0.743669f, -0.743718f, -0.743767f, -0.743816f, -0.743865f, -0.743914f, -0.743963f, -0.744012f, -0.744061f, -0.74411f, -0.744159f, -0.744208f, -0.744257f, -0.744306f, -0.744355f, -0.744404f, -0.744453f, -0.744502f, -0.744551f, -0.744599f,
--0.744648f, -0.744697f, -0.744746f, -0.744795f, -0.744844f, -0.744893f, -0.744941f, -0.74499f, -0.745039f, -0.745088f, -0.745137f, -0.745185f, -0.745234f, -0.745283f, -0.745332f, -0.74538f, -0.745429f, -0.745478f, -0.745527f, -0.745575f,
--0.745624f, -0.745673f, -0.745721f, -0.74577f, -0.745819f, -0.745867f, -0.745916f, -0.745965f, -0.746013f, -0.746062f, -0.74611f, -0.746159f, -0.746207f, -0.746256f, -0.746305f, -0.746353f, -0.746402f, -0.74645f, -0.746499f, -0.746547f,
--0.746596f, -0.746644f, -0.746693f, -0.746741f, -0.74679f, -0.746838f, -0.746886f, -0.746935f, -0.746983f, -0.747032f, -0.74708f, -0.747129f, -0.747177f, -0.747225f, -0.747274f, -0.747322f, -0.74737f, -0.747419f, -0.747467f, -0.747515f,
--0.747564f, -0.747612f, -0.74766f, -0.747708f, -0.747757f, -0.747805f, -0.747853f, -0.747901f, -0.74795f, -0.747998f, -0.748046f, -0.748094f, -0.748142f, -0.748191f, -0.748239f, -0.748287f, -0.748335f, -0.748383f, -0.748431f, -0.748479f,
--0.748528f, -0.748576f, -0.748624f, -0.748672f, -0.74872f, -0.748768f, -0.748816f, -0.748864f, -0.748912f, -0.74896f, -0.749008f, -0.749056f, -0.749104f, -0.749152f, -0.7492f, -0.749248f, -0.749296f, -0.749344f, -0.749392f, -0.74944f,
--0.749488f, -0.749536f, -0.749584f, -0.749631f, -0.749679f, -0.749727f, -0.749775f, -0.749823f, -0.749871f, -0.749918f, -0.749966f, -0.750014f, -0.750062f, -0.75011f, -0.750157f, -0.750205f, -0.750253f, -0.750301f, -0.750349f, -0.750396f,
--0.750444f, -0.750492f, -0.750539f, -0.750587f, -0.750635f, -0.750682f, -0.75073f, -0.750778f, -0.750825f, -0.750873f, -0.750921f, -0.750968f, -0.751016f, -0.751063f, -0.751111f, -0.751159f, -0.751206f, -0.751254f, -0.751301f, -0.751349f,
--0.751396f, -0.751444f, -0.751491f, -0.751539f, -0.751586f, -0.751634f, -0.751681f, -0.751729f, -0.751776f, -0.751824f, -0.751871f, -0.751918f, -0.751966f, -0.752013f, -0.752061f, -0.752108f, -0.752155f, -0.752203f, -0.75225f, -0.752297f,
--0.752345f, -0.752392f, -0.752439f, -0.752487f, -0.752534f, -0.752581f, -0.752629f, -0.752676f, -0.752723f, -0.75277f, -0.752818f, -0.752865f, -0.752912f, -0.752959f, -0.753006f, -0.753054f, -0.753101f, -0.753148f, -0.753195f, -0.753242f,
--0.753289f, -0.753336f, -0.753384f, -0.753431f, -0.753478f, -0.753525f, -0.753572f, -0.753619f, -0.753666f, -0.753713f, -0.75376f, -0.753807f, -0.753854f, -0.753901f, -0.753948f, -0.753995f, -0.754042f, -0.754089f, -0.754136f, -0.754183f,
--0.75423f, -0.754277f, -0.754324f, -0.754371f, -0.754418f, -0.754465f, -0.754511f, -0.754558f, -0.754605f, -0.754652f, -0.754699f, -0.754746f, -0.754792f, -0.754839f, -0.754886f, -0.754933f, -0.75498f, -0.755026f, -0.755073f, -0.75512f,
--0.755167f, -0.755213f, -0.75526f, -0.755307f, -0.755354f, -0.7554f, -0.755447f, -0.755494f, -0.75554f, -0.755587f, -0.755634f, -0.75568f, -0.755727f, -0.755773f, -0.75582f, -0.755867f, -0.755913f, -0.75596f, -0.756006f, -0.756053f,
--0.7561f, -0.756146f, -0.756193f, -0.756239f, -0.756286f, -0.756332f, -0.756379f, -0.756425f, -0.756472f, -0.756518f, -0.756564f, -0.756611f, -0.756657f, -0.756704f, -0.75675f, -0.756797f, -0.756843f, -0.756889f, -0.756936f, -0.756982f,
--0.757028f, -0.757075f, -0.757121f, -0.757167f, -0.757214f, -0.75726f, -0.757306f, -0.757353f, -0.757399f, -0.757445f, -0.757491f, -0.757538f, -0.757584f, -0.75763f, -0.757676f, -0.757722f, -0.757769f, -0.757815f, -0.757861f, -0.757907f,
--0.757953f, -0.757999f, -0.758046f, -0.758092f, -0.758138f, -0.758184f, -0.75823f, -0.758276f, -0.758322f, -0.758368f, -0.758414f, -0.75846f, -0.758506f, -0.758552f, -0.758598f, -0.758644f, -0.75869f, -0.758736f, -0.758782f, -0.758828f,
--0.758874f, -0.75892f, -0.758966f, -0.759012f, -0.759058f, -0.759104f, -0.75915f, -0.759196f, -0.759242f, -0.759288f, -0.759333f, -0.759379f, -0.759425f, -0.759471f, -0.759517f, -0.759563f, -0.759608f, -0.759654f, -0.7597f, -0.759746f,
--0.759791f, -0.759837f, -0.759883f, -0.759929f, -0.759974f, -0.76002f, -0.760066f, -0.760111f, -0.760157f, -0.760203f, -0.760248f, -0.760294f, -0.76034f, -0.760385f, -0.760431f, -0.760477f, -0.760522f, -0.760568f, -0.760613f, -0.760659f,
--0.760705f, -0.76075f, -0.760796f, -0.760841f, -0.760887f, -0.760932f, -0.760978f, -0.761023f, -0.761069f, -0.761114f, -0.76116f, -0.761205f, -0.76125f, -0.761296f, -0.761341f, -0.761387f, -0.761432f, -0.761478f, -0.761523f, -0.761568f,
--0.761614f, -0.761659f, -0.761704f, -0.76175f, -0.761795f, -0.76184f, -0.761886f, -0.761931f, -0.761976f, -0.762021f, -0.762067f, -0.762112f, -0.762157f, -0.762202f, -0.762248f, -0.762293f, -0.762338f, -0.762383f, -0.762429f, -0.762474f,
--0.762519f, -0.762564f, -0.762609f, -0.762654f, -0.762699f, -0.762745f, -0.76279f, -0.762835f, -0.76288f, -0.762925f, -0.76297f, -0.763015f, -0.76306f, -0.763105f, -0.76315f, -0.763195f, -0.76324f, -0.763285f, -0.76333f, -0.763375f,
--0.76342f, -0.763465f, -0.76351f, -0.763555f, -0.7636f, -0.763645f, -0.76369f, -0.763735f, -0.763779f, -0.763824f, -0.763869f, -0.763914f, -0.763959f, -0.764004f, -0.764049f, -0.764093f, -0.764138f, -0.764183f, -0.764228f, -0.764273f,
--0.764317f, -0.764362f, -0.764407f, -0.764452f, -0.764496f, -0.764541f, -0.764586f, -0.76463f, -0.764675f, -0.76472f, -0.764764f, -0.764809f, -0.764854f, -0.764898f, -0.764943f, -0.764988f, -0.765032f, -0.765077f, -0.765121f, -0.765166f,
--0.765211f, -0.765255f, -0.7653f, -0.765344f, -0.765389f, -0.765433f, -0.765478f, -0.765522f, -0.765567f, -0.765611f, -0.765656f, -0.7657f, -0.765745f, -0.765789f, -0.765833f, -0.765878f, -0.765922f, -0.765967f, -0.766011f, -0.766055f,
--0.7661f, -0.766144f, -0.766189f, -0.766233f, -0.766277f, -0.766321f, -0.766366f, -0.76641f, -0.766454f, -0.766499f, -0.766543f, -0.766587f, -0.766631f, -0.766676f, -0.76672f, -0.766764f, -0.766808f, -0.766853f, -0.766897f, -0.766941f,
--0.766985f, -0.767029f, -0.767073f, -0.767118f, -0.767162f, -0.767206f, -0.76725f, -0.767294f, -0.767338f, -0.767382f, -0.767426f, -0.76747f, -0.767514f, -0.767558f, -0.767602f, -0.767646f, -0.76769f, -0.767734f, -0.767778f, -0.767822f,
--0.767866f, -0.76791f, -0.767954f, -0.767998f, -0.768042f, -0.768086f, -0.76813f, -0.768174f, -0.768218f, -0.768262f, -0.768305f, -0.768349f, -0.768393f, -0.768437f, -0.768481f, -0.768525f, -0.768568f, -0.768612f, -0.768656f, -0.7687f,
--0.768744f, -0.768787f, -0.768831f, -0.768875f, -0.768919f, -0.768962f, -0.769006f, -0.76905f, -0.769093f, -0.769137f, -0.769181f, -0.769224f, -0.769268f, -0.769312f, -0.769355f, -0.769399f, -0.769443f, -0.769486f, -0.76953f, -0.769573f,
--0.769617f, -0.76966f, -0.769704f, -0.769747f, -0.769791f, -0.769835f, -0.769878f, -0.769922f, -0.769965f, -0.770008f, -0.770052f, -0.770095f, -0.770139f, -0.770182f, -0.770226f, -0.770269f, -0.770313f, -0.770356f, -0.770399f, -0.770443f,
--0.770486f, -0.770529f, -0.770573f, -0.770616f, -0.770659f, -0.770703f, -0.770746f, -0.770789f, -0.770833f, -0.770876f, -0.770919f, -0.770962f, -0.771006f, -0.771049f, -0.771092f, -0.771135f, -0.771179f, -0.771222f, -0.771265f, -0.771308f,
--0.771351f, -0.771394f, -0.771438f, -0.771481f, -0.771524f, -0.771567f, -0.77161f, -0.771653f, -0.771696f, -0.771739f, -0.771782f, -0.771825f, -0.771868f, -0.771911f, -0.771955f, -0.771998f, -0.772041f, -0.772084f, -0.772126f, -0.772169f,
--0.772212f, -0.772255f, -0.772298f, -0.772341f, -0.772384f, -0.772427f, -0.77247f, -0.772513f, -0.772556f, -0.772599f, -0.772642f, -0.772684f, -0.772727f, -0.77277f, -0.772813f, -0.772856f, -0.772898f, -0.772941f, -0.772984f, -0.773027f,
--0.77307f, -0.773112f, -0.773155f, -0.773198f, -0.773241f, -0.773283f, -0.773326f, -0.773369f, -0.773411f, -0.773454f, -0.773497f, -0.773539f, -0.773582f, -0.773625f, -0.773667f, -0.77371f, -0.773752f, -0.773795f, -0.773838f, -0.77388f,
--0.773923f, -0.773965f, -0.774008f, -0.77405f, -0.774093f, -0.774135f, -0.774178f, -0.77422f, -0.774263f, -0.774305f, -0.774348f, -0.77439f, -0.774433f, -0.774475f, -0.774517f, -0.77456f, -0.774602f, -0.774645f, -0.774687f, -0.774729f,
--0.774772f, -0.774814f, -0.774856f, -0.774899f, -0.774941f, -0.774983f, -0.775026f, -0.775068f, -0.77511f, -0.775152f, -0.775195f, -0.775237f, -0.775279f, -0.775321f, -0.775364f, -0.775406f, -0.775448f, -0.77549f, -0.775532f, -0.775575f,
--0.775617f, -0.775659f, -0.775701f, -0.775743f, -0.775785f, -0.775827f, -0.775869f, -0.775911f, -0.775954f, -0.775996f, -0.776038f, -0.77608f, -0.776122f, -0.776164f, -0.776206f, -0.776248f, -0.77629f, -0.776332f, -0.776374f, -0.776416f,
--0.776458f, -0.7765f, -0.776542f, -0.776583f, -0.776625f, -0.776667f, -0.776709f, -0.776751f, -0.776793f, -0.776835f, -0.776877f, -0.776918f, -0.77696f, -0.777002f, -0.777044f, -0.777086f, -0.777127f, -0.777169f, -0.777211f, -0.777253f,
--0.777294f, -0.777336f, -0.777378f, -0.77742f, -0.777461f, -0.777503f, -0.777545f, -0.777586f, -0.777628f, -0.77767f, -0.777711f, -0.777753f, -0.777795f, -0.777836f, -0.777878f, -0.777919f, -0.777961f, -0.778003f, -0.778044f, -0.778086f,
--0.778127f, -0.778169f, -0.77821f, -0.778252f, -0.778293f, -0.778335f, -0.778376f, -0.778418f, -0.778459f, -0.778501f, -0.778542f, -0.778584f, -0.778625f, -0.778666f, -0.778708f, -0.778749f, -0.778791f, -0.778832f, -0.778873f, -0.778915f,
--0.778956f, -0.778997f, -0.779039f, -0.77908f, -0.779121f, -0.779163f, -0.779204f, -0.779245f, -0.779286f, -0.779328f, -0.779369f, -0.77941f, -0.779451f, -0.779493f, -0.779534f, -0.779575f, -0.779616f, -0.779657f, -0.779698f, -0.77974f,
--0.779781f, -0.779822f, -0.779863f, -0.779904f, -0.779945f, -0.779986f, -0.780027f, -0.780068f, -0.780109f, -0.78015f, -0.780191f, -0.780232f, -0.780273f, -0.780314f, -0.780355f, -0.780396f, -0.780437f, -0.780478f, -0.780519f, -0.78056f,
--0.780601f, -0.780642f, -0.780683f, -0.780724f, -0.780765f, -0.780806f, -0.780847f, -0.780887f, -0.780928f, -0.780969f, -0.78101f, -0.781051f, -0.781092f, -0.781132f, -0.781173f, -0.781214f, -0.781255f, -0.781295f, -0.781336f, -0.781377f,
--0.781418f, -0.781458f, -0.781499f, -0.78154f, -0.78158f, -0.781621f, -0.781662f, -0.781702f, -0.781743f, -0.781784f, -0.781824f, -0.781865f, -0.781906f, -0.781946f, -0.781987f, -0.782027f, -0.782068f, -0.782108f, -0.782149f, -0.78219f,
--0.78223f, -0.782271f, -0.782311f, -0.782352f, -0.782392f, -0.782432f, -0.782473f, -0.782513f, -0.782554f, -0.782594f, -0.782635f, -0.782675f, -0.782715f, -0.782756f, -0.782796f, -0.782837f, -0.782877f, -0.782917f, -0.782958f, -0.782998f,
--0.783038f, -0.783079f, -0.783119f, -0.783159f, -0.783199f, -0.78324f, -0.78328f, -0.78332f, -0.78336f, -0.783401f, -0.783441f, -0.783481f, -0.783521f, -0.783561f, -0.783602f, -0.783642f, -0.783682f, -0.783722f, -0.783762f, -0.783802f,
--0.783842f, -0.783883f, -0.783923f, -0.783963f, -0.784003f, -0.784043f, -0.784083f, -0.784123f, -0.784163f, -0.784203f, -0.784243f, -0.784283f, -0.784323f, -0.784363f, -0.784403f, -0.784443f, -0.784483f, -0.784523f, -0.784563f, -0.784603f,
--0.784642f, -0.784682f, -0.784722f, -0.784762f, -0.784802f, -0.784842f, -0.784882f, -0.784922f, -0.784961f, -0.785001f, -0.785041f, -0.785081f, -0.785121f, -0.78516f, -0.7852f, -0.78524f, -0.78528f, -0.785319f, -0.785359f, -0.785399f,
--0.785438f, -0.785478f, -0.785518f, -0.785557f, -0.785597f, -0.785637f, -0.785676f, -0.785716f, -0.785756f, -0.785795f, -0.785835f, -0.785874f, -0.785914f, -0.785954f, -0.785993f, -0.786033f, -0.786072f, -0.786112f, -0.786151f, -0.786191f,
--0.78623f, -0.78627f, -0.786309f, -0.786349f, -0.786388f, -0.786427f, -0.786467f, -0.786506f, -0.786546f, -0.786585f, -0.786625f, -0.786664f, -0.786703f, -0.786743f, -0.786782f, -0.786821f, -0.786861f, -0.7869f, -0.786939f, -0.786979f,
--0.787018f, -0.787057f, -0.787096f, -0.787136f, -0.787175f, -0.787214f, -0.787253f, -0.787293f, -0.787332f, -0.787371f, -0.78741f, -0.787449f, -0.787488f, -0.787528f, -0.787567f, -0.787606f, -0.787645f, -0.787684f, -0.787723f, -0.787762f,
--0.787801f, -0.78784f, -0.78788f, -0.787919f, -0.787958f, -0.787997f, -0.788036f, -0.788075f, -0.788114f, -0.788153f, -0.788192f, -0.788231f, -0.78827f, -0.788308f, -0.788347f, -0.788386f, -0.788425f, -0.788464f, -0.788503f, -0.788542f,
--0.788581f, -0.78862f, -0.788658f, -0.788697f, -0.788736f, -0.788775f, -0.788814f, -0.788853f, -0.788891f, -0.78893f, -0.788969f, -0.789008f, -0.789046f, -0.789085f, -0.789124f, -0.789163f, -0.789201f, -0.78924f, -0.789279f, -0.789317f,
--0.789356f, -0.789395f, -0.789433f, -0.789472f, -0.789511f, -0.789549f, -0.789588f, -0.789626f, -0.789665f, -0.789704f, -0.789742f, -0.789781f, -0.789819f, -0.789858f, -0.789896f, -0.789935f, -0.789973f, -0.790012f, -0.79005f, -0.790089f,
--0.790127f, -0.790166f, -0.790204f, -0.790242f, -0.790281f, -0.790319f, -0.790358f, -0.790396f, -0.790434f, -0.790473f, -0.790511f, -0.790549f, -0.790588f, -0.790626f, -0.790664f, -0.790703f, -0.790741f, -0.790779f, -0.790818f, -0.790856f,
--0.790894f, -0.790932f, -0.79097f, -0.791009f, -0.791047f, -0.791085f, -0.791123f, -0.791161f, -0.7912f, -0.791238f, -0.791276f, -0.791314f, -0.791352f, -0.79139f, -0.791428f, -0.791466f, -0.791505f, -0.791543f, -0.791581f, -0.791619f,
--0.791657f, -0.791695f, -0.791733f, -0.791771f, -0.791809f, -0.791847f, -0.791885f, -0.791923f, -0.791961f, -0.791999f, -0.792037f, -0.792075f, -0.792112f, -0.79215f, -0.792188f, -0.792226f, -0.792264f, -0.792302f, -0.79234f, -0.792378f,
--0.792415f, -0.792453f, -0.792491f, -0.792529f, -0.792567f, -0.792604f, -0.792642f, -0.79268f, -0.792718f, -0.792755f, -0.792793f, -0.792831f, -0.792869f, -0.792906f, -0.792944f, -0.792982f, -0.793019f, -0.793057f, -0.793095f, -0.793132f,
--0.79317f, -0.793207f, -0.793245f, -0.793283f, -0.79332f, -0.793358f, -0.793395f, -0.793433f, -0.79347f, -0.793508f, -0.793545f, -0.793583f, -0.79362f, -0.793658f, -0.793695f, -0.793733f, -0.79377f, -0.793808f, -0.793845f, -0.793883f,
--0.79392f, -0.793957f, -0.793995f, -0.794032f, -0.79407f, -0.794107f, -0.794144f, -0.794182f, -0.794219f, -0.794256f, -0.794294f, -0.794331f, -0.794368f, -0.794406f, -0.794443f, -0.79448f, -0.794517f, -0.794555f, -0.794592f, -0.794629f,
--0.794666f, -0.794703f, -0.794741f, -0.794778f, -0.794815f, -0.794852f, -0.794889f, -0.794926f, -0.794963f, -0.795001f, -0.795038f, -0.795075f, -0.795112f, -0.795149f, -0.795186f, -0.795223f, -0.79526f, -0.795297f, -0.795334f, -0.795371f,
--0.795408f, -0.795445f, -0.795482f, -0.795519f, -0.795556f, -0.795593f, -0.79563f, -0.795667f, -0.795704f, -0.795741f, -0.795777f, -0.795814f, -0.795851f, -0.795888f, -0.795925f, -0.795962f, -0.795999f, -0.796035f, -0.796072f, -0.796109f,
--0.796146f, -0.796183f, -0.796219f, -0.796256f, -0.796293f, -0.79633f, -0.796366f, -0.796403f, -0.79644f, -0.796476f, -0.796513f, -0.79655f, -0.796586f, -0.796623f, -0.79666f, -0.796696f, -0.796733f, -0.796769f, -0.796806f, -0.796843f,
--0.796879f, -0.796916f, -0.796952f, -0.796989f, -0.797025f, -0.797062f, -0.797098f, -0.797135f, -0.797171f, -0.797208f, -0.797244f, -0.797281f, -0.797317f, -0.797354f, -0.79739f, -0.797427f, -0.797463f, -0.797499f, -0.797536f, -0.797572f,
--0.797609f, -0.797645f, -0.797681f, -0.797718f, -0.797754f, -0.79779f, -0.797827f, -0.797863f, -0.797899f, -0.797935f, -0.797972f, -0.798008f, -0.798044f, -0.79808f, -0.798117f, -0.798153f, -0.798189f, -0.798225f, -0.798261f, -0.798297f,
--0.798334f, -0.79837f, -0.798406f, -0.798442f, -0.798478f, -0.798514f, -0.79855f, -0.798586f, -0.798622f, -0.798659f, -0.798695f, -0.798731f, -0.798767f, -0.798803f, -0.798839f, -0.798875f, -0.798911f, -0.798947f, -0.798983f, -0.799019f,
--0.799055f, -0.79909f, -0.799126f, -0.799162f, -0.799198f, -0.799234f, -0.79927f, -0.799306f, -0.799342f, -0.799378f, -0.799413f, -0.799449f, -0.799485f, -0.799521f, -0.799557f, -0.799592f, -0.799628f, -0.799664f, -0.7997f, -0.799735f,
--0.799771f, -0.799807f, -0.799843f, -0.799878f, -0.799914f, -0.79995f, -0.799985f, -0.800021f, -0.800057f, -0.800092f, -0.800128f, -0.800164f, -0.800199f, -0.800235f, -0.80027f, -0.800306f, -0.800341f, -0.800377f, -0.800413f, -0.800448f,
--0.800484f, -0.800519f, -0.800555f, -0.80059f, -0.800626f, -0.800661f, -0.800697f, -0.800732f, -0.800767f, -0.800803f, -0.800838f, -0.800874f, -0.800909f, -0.800944f, -0.80098f, -0.801015f, -0.801051f, -0.801086f, -0.801121f, -0.801157f,
--0.801192f, -0.801227f, -0.801262f, -0.801298f, -0.801333f, -0.801368f, -0.801403f, -0.801439f, -0.801474f, -0.801509f, -0.801544f, -0.80158f, -0.801615f, -0.80165f, -0.801685f, -0.80172f, -0.801755f, -0.801791f, -0.801826f, -0.801861f,
--0.801896f, -0.801931f, -0.801966f, -0.802001f, -0.802036f, -0.802071f, -0.802106f, -0.802141f, -0.802176f, -0.802211f, -0.802246f, -0.802281f, -0.802316f, -0.802351f, -0.802386f, -0.802421f, -0.802456f, -0.802491f, -0.802526f, -0.802561f,
--0.802596f, -0.80263f, -0.802665f, -0.8027f, -0.802735f, -0.80277f, -0.802805f, -0.802839f, -0.802874f, -0.802909f, -0.802944f, -0.802979f, -0.803013f, -0.803048f, -0.803083f, -0.803118f, -0.803152f, -0.803187f, -0.803222f, -0.803256f,
--0.803291f, -0.803326f, -0.80336f, -0.803395f, -0.80343f, -0.803464f, -0.803499f, -0.803534f, -0.803568f, -0.803603f, -0.803637f, -0.803672f, -0.803706f, -0.803741f, -0.803775f, -0.80381f, -0.803844f, -0.803879f, -0.803913f, -0.803948f,
--0.803982f, -0.804017f, -0.804051f, -0.804086f, -0.80412f, -0.804155f, -0.804189f, -0.804223f, -0.804258f, -0.804292f, -0.804326f, -0.804361f, -0.804395f, -0.804429f, -0.804464f, -0.804498f, -0.804532f, -0.804567f, -0.804601f, -0.804635f,
--0.804669f, -0.804704f, -0.804738f, -0.804772f, -0.804806f, -0.80484f, -0.804875f, -0.804909f, -0.804943f, -0.804977f, -0.805011f, -0.805045f, -0.80508f, -0.805114f, -0.805148f, -0.805182f, -0.805216f, -0.80525f, -0.805284f, -0.805318f,
--0.805352f, -0.805386f, -0.80542f, -0.805454f, -0.805488f, -0.805522f, -0.805556f, -0.80559f, -0.805624f, -0.805658f, -0.805692f, -0.805726f, -0.80576f, -0.805794f, -0.805828f, -0.805861f, -0.805895f, -0.805929f, -0.805963f, -0.805997f,
--0.806031f, -0.806064f, -0.806098f, -0.806132f, -0.806166f, -0.8062f, -0.806233f, -0.806267f, -0.806301f, -0.806335f, -0.806368f, -0.806402f, -0.806436f, -0.806469f, -0.806503f, -0.806537f, -0.80657f, -0.806604f, -0.806638f, -0.806671f,
--0.806705f, -0.806738f, -0.806772f, -0.806806f, -0.806839f, -0.806873f, -0.806906f, -0.80694f, -0.806973f, -0.807007f, -0.80704f, -0.807074f, -0.807107f, -0.807141f, -0.807174f, -0.807208f, -0.807241f, -0.807275f, -0.807308f, -0.807341f,
--0.807375f, -0.807408f, -0.807442f, -0.807475f, -0.807508f, -0.807542f, -0.807575f, -0.807608f, -0.807642f, -0.807675f, -0.807708f, -0.807742f, -0.807775f, -0.807808f, -0.807841f, -0.807875f, -0.807908f, -0.807941f, -0.807974f, -0.808007f,
--0.808041f, -0.808074f, -0.808107f, -0.80814f, -0.808173f, -0.808206f, -0.808239f, -0.808273f, -0.808306f, -0.808339f, -0.808372f, -0.808405f, -0.808438f, -0.808471f, -0.808504f, -0.808537f, -0.80857f, -0.808603f, -0.808636f, -0.808669f,
--0.808702f, -0.808735f, -0.808768f, -0.808801f, -0.808834f, -0.808867f, -0.8089f, -0.808932f, -0.808965f, -0.808998f, -0.809031f, -0.809064f, -0.809097f, -0.80913f, -0.809162f, -0.809195f, -0.809228f, -0.809261f, -0.809294f, -0.809326f,
--0.809359f, -0.809392f, -0.809425f, -0.809457f, -0.80949f, -0.809523f, -0.809555f, -0.809588f, -0.809621f, -0.809653f, -0.809686f, -0.809719f, -0.809751f, -0.809784f, -0.809817f, -0.809849f, -0.809882f, -0.809914f, -0.809947f, -0.809979f,
--0.810012f, -0.810045f, -0.810077f, -0.81011f, -0.810142f, -0.810175f, -0.810207f, -0.810239f, -0.810272f, -0.810304f, -0.810337f, -0.810369f, -0.810402f, -0.810434f, -0.810466f, -0.810499f, -0.810531f, -0.810564f, -0.810596f, -0.810628f,
--0.810661f, -0.810693f, -0.810725f, -0.810757f, -0.81079f, -0.810822f, -0.810854f, -0.810887f, -0.810919f, -0.810951f, -0.810983f, -0.811015f, -0.811048f, -0.81108f, -0.811112f, -0.811144f, -0.811176f, -0.811208f, -0.811241f, -0.811273f,
--0.811305f, -0.811337f, -0.811369f, -0.811401f, -0.811433f, -0.811465f, -0.811497f, -0.811529f, -0.811561f, -0.811593f, -0.811625f, -0.811657f, -0.811689f, -0.811721f, -0.811753f, -0.811785f, -0.811817f, -0.811849f, -0.811881f, -0.811913f,
--0.811945f, -0.811977f, -0.812009f, -0.81204f, -0.812072f, -0.812104f, -0.812136f, -0.812168f, -0.8122f, -0.812231f, -0.812263f, -0.812295f, -0.812327f, -0.812358f, -0.81239f, -0.812422f, -0.812454f, -0.812485f, -0.812517f, -0.812549f,
--0.81258f, -0.812612f, -0.812644f, -0.812675f, -0.812707f, -0.812739f, -0.81277f, -0.812802f, -0.812834f, -0.812865f, -0.812897f, -0.812928f, -0.81296f, -0.812991f, -0.813023f, -0.813054f, -0.813086f, -0.813117f, -0.813149f, -0.81318f,
--0.813212f, -0.813243f, -0.813275f, -0.813306f, -0.813338f, -0.813369f, -0.8134f, -0.813432f, -0.813463f, -0.813495f, -0.813526f, -0.813557f, -0.813589f, -0.81362f, -0.813651f, -0.813683f, -0.813714f, -0.813745f, -0.813776f, -0.813808f,
--0.813839f, -0.81387f, -0.813901f, -0.813933f, -0.813964f, -0.813995f, -0.814026f, -0.814057f, -0.814089f, -0.81412f, -0.814151f, -0.814182f, -0.814213f, -0.814244f, -0.814275f, -0.814306f, -0.814337f, -0.814368f, -0.8144f, -0.814431f,
--0.814462f, -0.814493f, -0.814524f, -0.814555f, -0.814586f, -0.814617f, -0.814648f, -0.814679f, -0.81471f, -0.81474f, -0.814771f, -0.814802f, -0.814833f, -0.814864f, -0.814895f, -0.814926f, -0.814957f, -0.814988f, -0.815018f, -0.815049f,
--0.81508f, -0.815111f, -0.815142f, -0.815172f, -0.815203f, -0.815234f, -0.815265f, -0.815295f, -0.815326f, -0.815357f, -0.815388f, -0.815418f, -0.815449f, -0.81548f, -0.81551f, -0.815541f, -0.815572f, -0.815602f, -0.815633f, -0.815664f,
--0.815694f, -0.815725f, -0.815755f, -0.815786f, -0.815816f, -0.815847f, -0.815878f, -0.815908f, -0.815939f, -0.815969f, -0.816f, -0.81603f, -0.816061f, -0.816091f, -0.816121f, -0.816152f, -0.816182f, -0.816213f, -0.816243f, -0.816274f,
--0.816304f, -0.816334f, -0.816365f, -0.816395f, -0.816425f, -0.816456f, -0.816486f, -0.816516f, -0.816547f, -0.816577f, -0.816607f, -0.816637f, -0.816668f, -0.816698f, -0.816728f, -0.816758f, -0.816789f, -0.816819f, -0.816849f, -0.816879f,
--0.816909f, -0.81694f, -0.81697f, -0.817f, -0.81703f, -0.81706f, -0.81709f, -0.81712f, -0.81715f, -0.81718f, -0.81721f, -0.81724f, -0.817271f, -0.817301f, -0.817331f, -0.817361f, -0.817391f, -0.817421f, -0.817451f, -0.81748f,
--0.81751f, -0.81754f, -0.81757f, -0.8176f, -0.81763f, -0.81766f, -0.81769f, -0.81772f, -0.81775f, -0.81778f, -0.817809f, -0.817839f, -0.817869f, -0.817899f, -0.817929f, -0.817958f, -0.817988f, -0.818018f, -0.818048f, -0.818077f,
--0.818107f, -0.818137f, -0.818167f, -0.818196f, -0.818226f, -0.818256f, -0.818285f, -0.818315f, -0.818345f, -0.818374f, -0.818404f, -0.818434f, -0.818463f, -0.818493f, -0.818522f, -0.818552f, -0.818581f, -0.818611f, -0.818641f, -0.81867f,
--0.8187f, -0.818729f, -0.818759f, -0.818788f, -0.818818f, -0.818847f, -0.818876f, -0.818906f, -0.818935f, -0.818965f, -0.818994f, -0.819024f, -0.819053f, -0.819082f, -0.819112f, -0.819141f, -0.81917f, -0.8192f, -0.819229f, -0.819258f,
--0.819288f, -0.819317f, -0.819346f, -0.819376f, -0.819405f, -0.819434f, -0.819463f, -0.819492f, -0.819522f, -0.819551f, -0.81958f, -0.819609f, -0.819638f, -0.819668f, -0.819697f, -0.819726f, -0.819755f, -0.819784f, -0.819813f, -0.819842f,
--0.819871f, -0.8199f, -0.81993f, -0.819959f, -0.819988f, -0.820017f, -0.820046f, -0.820075f, -0.820104f, -0.820133f, -0.820162f, -0.820191f, -0.82022f, -0.820248f, -0.820277f, -0.820306f, -0.820335f, -0.820364f, -0.820393f, -0.820422f,
--0.820451f, -0.82048f, -0.820508f, -0.820537f, -0.820566f, -0.820595f, -0.820624f, -0.820652f, -0.820681f, -0.82071f, -0.820739f, -0.820768f, -0.820796f, -0.820825f, -0.820854f, -0.820882f, -0.820911f, -0.82094f, -0.820968f, -0.820997f,
--0.821026f, -0.821054f, -0.821083f, -0.821112f, -0.82114f, -0.821169f, -0.821197f, -0.821226f, -0.821255f, -0.821283f, -0.821312f, -0.82134f, -0.821369f, -0.821397f, -0.821426f, -0.821454f, -0.821483f, -0.821511f, -0.82154f, -0.821568f,
--0.821596f, -0.821625f, -0.821653f, -0.821682f, -0.82171f, -0.821738f, -0.821767f, -0.821795f, -0.821823f, -0.821852f, -0.82188f, -0.821908f, -0.821937f, -0.821965f, -0.821993f, -0.822021f, -0.82205f, -0.822078f, -0.822106f, -0.822134f,
--0.822163f, -0.822191f, -0.822219f, -0.822247f, -0.822275f, -0.822304f, -0.822332f, -0.82236f, -0.822388f, -0.822416f, -0.822444f, -0.822472f, -0.8225f, -0.822528f, -0.822556f, -0.822584f, -0.822613f, -0.822641f, -0.822669f, -0.822697f,
--0.822725f, -0.822753f, -0.82278f, -0.822808f, -0.822836f, -0.822864f, -0.822892f, -0.82292f, -0.822948f, -0.822976f, -0.823004f, -0.823032f, -0.82306f, -0.823087f, -0.823115f, -0.823143f, -0.823171f, -0.823199f, -0.823226f, -0.823254f,
--0.823282f, -0.82331f, -0.823338f, -0.823365f, -0.823393f, -0.823421f, -0.823448f, -0.823476f, -0.823504f, -0.823531f, -0.823559f, -0.823587f, -0.823614f, -0.823642f, -0.82367f, -0.823697f, -0.823725f, -0.823752f, -0.82378f, -0.823808f,
--0.823835f, -0.823863f, -0.82389f, -0.823918f, -0.823945f, -0.823973f, -0.824f, -0.824028f, -0.824055f, -0.824083f, -0.82411f, -0.824138f, -0.824165f, -0.824192f, -0.82422f, -0.824247f, -0.824275f, -0.824302f, -0.824329f, -0.824357f,
--0.824384f, -0.824411f, -0.824439f, -0.824466f, -0.824493f, -0.82452f, -0.824548f, -0.824575f, -0.824602f, -0.824629f, -0.824657f, -0.824684f, -0.824711f, -0.824738f, -0.824765f, -0.824793f, -0.82482f, -0.824847f, -0.824874f, -0.824901f,
--0.824928f, -0.824955f, -0.824982f, -0.82501f, -0.825037f, -0.825064f, -0.825091f, -0.825118f, -0.825145f, -0.825172f, -0.825199f, -0.825226f, -0.825253f, -0.82528f, -0.825307f, -0.825334f, -0.825361f, -0.825388f, -0.825414f, -0.825441f,
--0.825468f, -0.825495f, -0.825522f, -0.825549f, -0.825576f, -0.825603f, -0.825629f, -0.825656f, -0.825683f, -0.82571f, -0.825737f, -0.825763f, -0.82579f, -0.825817f, -0.825844f, -0.82587f, -0.825897f, -0.825924f, -0.82595f, -0.825977f,
--0.826004f, -0.826031f, -0.826057f, -0.826084f, -0.82611f, -0.826137f, -0.826164f, -0.82619f, -0.826217f, -0.826243f, -0.82627f, -0.826297f, -0.826323f, -0.82635f, -0.826376f, -0.826403f, -0.826429f, -0.826456f, -0.826482f, -0.826509f,
--0.826535f, -0.826561f, -0.826588f, -0.826614f, -0.826641f, -0.826667f, -0.826694f, -0.82672f, -0.826746f, -0.826773f, -0.826799f, -0.826825f, -0.826852f, -0.826878f, -0.826904f, -0.826931f, -0.826957f, -0.826983f, -0.827009f, -0.827036f,
--0.827062f, -0.827088f, -0.827114f, -0.82714f, -0.827167f, -0.827193f, -0.827219f, -0.827245f, -0.827271f, -0.827297f, -0.827324f, -0.82735f, -0.827376f, -0.827402f, -0.827428f, -0.827454f, -0.82748f, -0.827506f, -0.827532f, -0.827558f,
--0.827584f, -0.82761f, -0.827636f, -0.827662f, -0.827688f, -0.827714f, -0.82774f, -0.827766f, -0.827792f, -0.827818f, -0.827844f, -0.82787f, -0.827896f, -0.827921f, -0.827947f, -0.827973f, -0.827999f, -0.828025f, -0.828051f, -0.828076f,
--0.828102f, -0.828128f, -0.828154f, -0.828179f, -0.828205f, -0.828231f, -0.828257f, -0.828282f, -0.828308f, -0.828334f, -0.828359f, -0.828385f, -0.828411f, -0.828436f, -0.828462f, -0.828488f, -0.828513f, -0.828539f, -0.828565f, -0.82859f,
--0.828616f, -0.828641f, -0.828667f, -0.828692f, -0.828718f, -0.828743f, -0.828769f, -0.828794f, -0.82882f, -0.828845f, -0.828871f, -0.828896f, -0.828922f, -0.828947f, -0.828973f, -0.828998f, -0.829023f, -0.829049f, -0.829074f, -0.8291f,
--0.829125f, -0.82915f, -0.829176f, -0.829201f, -0.829226f, -0.829251f, -0.829277f, -0.829302f, -0.829327f, -0.829353f, -0.829378f, -0.829403f, -0.829428f, -0.829453f, -0.829479f, -0.829504f, -0.829529f, -0.829554f, -0.829579f, -0.829604f,
--0.82963f, -0.829655f, -0.82968f, -0.829705f, -0.82973f, -0.829755f, -0.82978f, -0.829805f, -0.82983f, -0.829855f, -0.82988f, -0.829905f, -0.82993f, -0.829955f, -0.82998f, -0.830005f, -0.83003f, -0.830055f, -0.83008f, -0.830105f,
--0.83013f, -0.830155f, -0.83018f, -0.830205f, -0.830229f, -0.830254f, -0.830279f, -0.830304f, -0.830329f, -0.830354f, -0.830378f, -0.830403f, -0.830428f, -0.830453f, -0.830477f, -0.830502f, -0.830527f, -0.830552f, -0.830576f, -0.830601f,
--0.830626f, -0.83065f, -0.830675f, -0.8307f, -0.830724f, -0.830749f, -0.830774f, -0.830798f, -0.830823f, -0.830847f, -0.830872f, -0.830897f, -0.830921f, -0.830946f, -0.83097f, -0.830995f, -0.831019f, -0.831044f, -0.831068f, -0.831093f,
--0.831117f, -0.831142f, -0.831166f, -0.831191f, -0.831215f, -0.831239f, -0.831264f, -0.831288f, -0.831313f, -0.831337f, -0.831361f, -0.831386f, -0.83141f, -0.831434f, -0.831459f, -0.831483f, -0.831507f, -0.831531f, -0.831556f, -0.83158f,
--0.831604f, -0.831628f, -0.831653f, -0.831677f, -0.831701f, -0.831725f, -0.831749f, -0.831774f, -0.831798f, -0.831822f, -0.831846f, -0.83187f, -0.831894f, -0.831918f, -0.831942f, -0.831967f, -0.831991f, -0.832015f, -0.832039f, -0.832063f,
--0.832087f, -0.832111f, -0.832135f, -0.832159f, -0.832183f, -0.832207f, -0.832231f, -0.832255f, -0.832279f, -0.832302f, -0.832326f, -0.83235f, -0.832374f, -0.832398f, -0.832422f, -0.832446f, -0.83247f, -0.832493f, -0.832517f, -0.832541f,
--0.832565f, -0.832589f, -0.832612f, -0.832636f, -0.83266f, -0.832684f, -0.832707f, -0.832731f, -0.832755f, -0.832779f, -0.832802f, -0.832826f, -0.83285f, -0.832873f, -0.832897f, -0.832921f, -0.832944f, -0.832968f, -0.832991f, -0.833015f,
--0.833039f, -0.833062f, -0.833086f, -0.833109f, -0.833133f, -0.833156f, -0.83318f, -0.833203f, -0.833227f, -0.83325f, -0.833274f, -0.833297f, -0.833321f, -0.833344f, -0.833368f, -0.833391f, -0.833414f, -0.833438f, -0.833461f, -0.833484f,
--0.833508f, -0.833531f, -0.833555f, -0.833578f, -0.833601f, -0.833624f, -0.833648f, -0.833671f, -0.833694f, -0.833718f, -0.833741f, -0.833764f, -0.833787f, -0.83381f, -0.833834f, -0.833857f, -0.83388f, -0.833903f, -0.833926f, -0.833949f,
--0.833973f, -0.833996f, -0.834019f, -0.834042f, -0.834065f, -0.834088f, -0.834111f, -0.834134f, -0.834157f, -0.83418f, -0.834203f, -0.834226f, -0.834249f, -0.834272f, -0.834295f, -0.834318f, -0.834341f, -0.834364f, -0.834387f, -0.83441f,
--0.834433f, -0.834456f, -0.834479f, -0.834502f, -0.834525f, -0.834547f, -0.83457f, -0.834593f, -0.834616f, -0.834639f, -0.834661f, -0.834684f, -0.834707f, -0.83473f, -0.834753f, -0.834775f, -0.834798f, -0.834821f, -0.834843f, -0.834866f,
--0.834889f, -0.834912f, -0.834934f, -0.834957f, -0.834979f, -0.835002f, -0.835025f, -0.835047f, -0.83507f, -0.835093f, -0.835115f, -0.835138f, -0.83516f, -0.835183f, -0.835205f, -0.835228f, -0.83525f, -0.835273f, -0.835295f, -0.835318f,
--0.83534f, -0.835363f, -0.835385f, -0.835408f, -0.83543f, -0.835452f, -0.835475f, -0.835497f, -0.83552f, -0.835542f, -0.835564f, -0.835587f, -0.835609f, -0.835631f, -0.835654f, -0.835676f, -0.835698f, -0.83572f, -0.835743f, -0.835765f,
--0.835787f, -0.835809f, -0.835832f, -0.835854f, -0.835876f, -0.835898f, -0.83592f, -0.835943f, -0.835965f, -0.835987f, -0.836009f, -0.836031f, -0.836053f, -0.836075f, -0.836097f, -0.83612f, -0.836142f, -0.836164f, -0.836186f, -0.836208f,
--0.83623f, -0.836252f, -0.836274f, -0.836296f, -0.836318f, -0.83634f, -0.836362f, -0.836384f, -0.836405f, -0.836427f, -0.836449f, -0.836471f, -0.836493f, -0.836515f, -0.836537f, -0.836559f, -0.836581f, -0.836602f, -0.836624f, -0.836646f,
--0.836668f, -0.83669f, -0.836711f, -0.836733f, -0.836755f, -0.836777f, -0.836798f, -0.83682f, -0.836842f, -0.836863f, -0.836885f, -0.836907f, -0.836928f, -0.83695f, -0.836972f, -0.836993f, -0.837015f, -0.837037f, -0.837058f, -0.83708f,
--0.837101f, -0.837123f, -0.837144f, -0.837166f, -0.837188f, -0.837209f, -0.837231f, -0.837252f, -0.837274f, -0.837295f, -0.837316f, -0.837338f, -0.837359f, -0.837381f, -0.837402f, -0.837424f, -0.837445f, -0.837466f, -0.837488f, -0.837509f,
--0.83753f, -0.837552f, -0.837573f, -0.837594f, -0.837616f, -0.837637f, -0.837658f, -0.83768f, -0.837701f, -0.837722f, -0.837743f, -0.837765f, -0.837786f, -0.837807f, -0.837828f, -0.837849f, -0.83787f, -0.837892f, -0.837913f, -0.837934f,
--0.837955f, -0.837976f, -0.837997f, -0.838018f, -0.838039f, -0.83806f, -0.838082f, -0.838103f, -0.838124f, -0.838145f, -0.838166f, -0.838187f, -0.838208f, -0.838229f, -0.83825f, -0.838271f, -0.838292f, -0.838312f, -0.838333f, -0.838354f,
--0.838375f, -0.838396f, -0.838417f, -0.838438f, -0.838459f, -0.83848f, -0.8385f, -0.838521f, -0.838542f, -0.838563f, -0.838584f, -0.838604f, -0.838625f, -0.838646f, -0.838667f, -0.838687f, -0.838708f, -0.838729f, -0.838749f, -0.83877f,
--0.838791f, -0.838811f, -0.838832f, -0.838853f, -0.838873f, -0.838894f, -0.838915f, -0.838935f, -0.838956f, -0.838976f, -0.838997f, -0.839018f, -0.839038f, -0.839059f, -0.839079f, -0.8391f, -0.83912f, -0.839141f, -0.839161f, -0.839182f,
--0.839202f, -0.839222f, -0.839243f, -0.839263f, -0.839284f, -0.839304f, -0.839324f, -0.839345f, -0.839365f, -0.839386f, -0.839406f, -0.839426f, -0.839447f, -0.839467f, -0.839487f, -0.839507f, -0.839528f, -0.839548f, -0.839568f, -0.839588f,
--0.839609f, -0.839629f, -0.839649f, -0.839669f, -0.839689f, -0.83971f, -0.83973f, -0.83975f, -0.83977f, -0.83979f, -0.83981f, -0.83983f, -0.839851f, -0.839871f, -0.839891f, -0.839911f, -0.839931f, -0.839951f, -0.839971f, -0.839991f,
--0.840011f, -0.840031f, -0.840051f, -0.840071f, -0.840091f, -0.840111f, -0.840131f, -0.840151f, -0.84017f, -0.84019f, -0.84021f, -0.84023f, -0.84025f, -0.84027f, -0.84029f, -0.84031f, -0.840329f, -0.840349f, -0.840369f, -0.840389f,
--0.840409f, -0.840428f, -0.840448f, -0.840468f, -0.840488f, -0.840507f, -0.840527f, -0.840547f, -0.840566f, -0.840586f, -0.840606f, -0.840625f, -0.840645f, -0.840665f, -0.840684f, -0.840704f, -0.840723f, -0.840743f, -0.840763f, -0.840782f,
--0.840802f, -0.840821f, -0.840841f, -0.84086f, -0.84088f, -0.840899f, -0.840919f, -0.840938f, -0.840958f, -0.840977f, -0.840997f, -0.841016f, -0.841035f, -0.841055f, -0.841074f, -0.841094f, -0.841113f, -0.841132f, -0.841152f, -0.841171f,
--0.84119f, -0.84121f, -0.841229f, -0.841248f, -0.841268f, -0.841287f, -0.841306f, -0.841325f, -0.841345f, -0.841364f, -0.841383f, -0.841402f, -0.841421f, -0.841441f, -0.84146f, -0.841479f, -0.841498f, -0.841517f, -0.841536f, -0.841555f,
--0.841575f, -0.841594f, -0.841613f, -0.841632f, -0.841651f, -0.84167f, -0.841689f, -0.841708f, -0.841727f, -0.841746f, -0.841765f, -0.841784f, -0.841803f, -0.841822f, -0.841841f, -0.84186f, -0.841879f, -0.841898f, -0.841917f, -0.841935f,
--0.841954f, -0.841973f, -0.841992f, -0.842011f, -0.84203f, -0.842048f, -0.842067f, -0.842086f, -0.842105f, -0.842124f, -0.842142f, -0.842161f, -0.84218f, -0.842199f, -0.842217f, -0.842236f, -0.842255f, -0.842273f, -0.842292f, -0.842311f,
--0.842329f, -0.842348f, -0.842367f, -0.842385f, -0.842404f, -0.842423f, -0.842441f, -0.84246f, -0.842478f, -0.842497f, -0.842515f, -0.842534f, -0.842552f, -0.842571f, -0.842589f, -0.842608f, -0.842626f, -0.842645f, -0.842663f, -0.842682f,
--0.8427f, -0.842719f, -0.842737f, -0.842755f, -0.842774f, -0.842792f, -0.84281f, -0.842829f, -0.842847f, -0.842865f, -0.842884f, -0.842902f, -0.84292f, -0.842939f, -0.842957f, -0.842975f, -0.842993f, -0.843012f, -0.84303f, -0.843048f,
--0.843066f, -0.843084f, -0.843103f, -0.843121f, -0.843139f, -0.843157f, -0.843175f, -0.843193f, -0.843211f, -0.84323f, -0.843248f, -0.843266f, -0.843284f, -0.843302f, -0.84332f, -0.843338f, -0.843356f, -0.843374f, -0.843392f, -0.84341f,
--0.843428f, -0.843446f, -0.843464f, -0.843482f, -0.8435f, -0.843518f, -0.843536f, -0.843553f, -0.843571f, -0.843589f, -0.843607f, -0.843625f, -0.843643f, -0.843661f, -0.843678f, -0.843696f, -0.843714f, -0.843732f, -0.84375f, -0.843767f,
--0.843785f, -0.843803f, -0.84382f, -0.843838f, -0.843856f, -0.843874f, -0.843891f, -0.843909f, -0.843927f, -0.843944f, -0.843962f, -0.84398f, -0.843997f, -0.844015f, -0.844032f, -0.84405f, -0.844067f, -0.844085f, -0.844103f, -0.84412f,
--0.844138f, -0.844155f, -0.844173f, -0.84419f, -0.844208f, -0.844225f, -0.844243f, -0.84426f, -0.844277f, -0.844295f, -0.844312f, -0.84433f, -0.844347f, -0.844364f, -0.844382f, -0.844399f, -0.844416f, -0.844434f, -0.844451f, -0.844468f,
--0.844486f, -0.844503f, -0.84452f, -0.844538f, -0.844555f, -0.844572f, -0.844589f, -0.844606f, -0.844624f, -0.844641f, -0.844658f, -0.844675f, -0.844692f, -0.84471f, -0.844727f, -0.844744f, -0.844761f, -0.844778f, -0.844795f, -0.844812f,
--0.844829f, -0.844846f, -0.844863f, -0.84488f, -0.844897f, -0.844914f, -0.844931f, -0.844948f, -0.844965f, -0.844982f, -0.844999f, -0.845016f, -0.845033f, -0.84505f, -0.845067f, -0.845084f, -0.845101f, -0.845118f, -0.845135f, -0.845151f,
--0.845168f, -0.845185f, -0.845202f, -0.845219f, -0.845236f, -0.845252f, -0.845269f, -0.845286f, -0.845303f, -0.845319f, -0.845336f, -0.845353f, -0.845369f, -0.845386f, -0.845403f, -0.84542f, -0.845436f, -0.845453f, -0.845469f, -0.845486f,
--0.845503f, -0.845519f, -0.845536f, -0.845553f, -0.845569f, -0.845586f, -0.845602f, -0.845619f, -0.845635f, -0.845652f, -0.845668f, -0.845685f, -0.845701f, -0.845718f, -0.845734f, -0.845751f, -0.845767f, -0.845783f, -0.8458f, -0.845816f,
--0.845833f, -0.845849f, -0.845865f, -0.845882f, -0.845898f, -0.845914f, -0.845931f, -0.845947f, -0.845963f, -0.84598f, -0.845996f, -0.846012f, -0.846028f, -0.846045f, -0.846061f, -0.846077f, -0.846093f, -0.84611f, -0.846126f, -0.846142f,
--0.846158f, -0.846174f, -0.84619f, -0.846207f, -0.846223f, -0.846239f, -0.846255f, -0.846271f, -0.846287f, -0.846303f, -0.846319f, -0.846335f, -0.846351f, -0.846367f, -0.846383f, -0.846399f, -0.846415f, -0.846431f, -0.846447f, -0.846463f,
--0.846479f, -0.846495f, -0.846511f, -0.846527f, -0.846543f, -0.846559f, -0.846574f, -0.84659f, -0.846606f, -0.846622f, -0.846638f, -0.846654f, -0.846669f, -0.846685f, -0.846701f, -0.846717f, -0.846732f, -0.846748f, -0.846764f, -0.84678f,
--0.846795f, -0.846811f, -0.846827f, -0.846842f, -0.846858f, -0.846874f, -0.846889f, -0.846905f, -0.846921f, -0.846936f, -0.846952f, -0.846967f, -0.846983f, -0.846999f, -0.847014f, -0.84703f, -0.847045f, -0.847061f, -0.847076f, -0.847092f,
--0.847107f, -0.847123f, -0.847138f, -0.847154f, -0.847169f, -0.847184f, -0.8472f, -0.847215f, -0.847231f, -0.847246f, -0.847261f, -0.847277f, -0.847292f, -0.847307f, -0.847323f, -0.847338f, -0.847353f, -0.847369f, -0.847384f, -0.847399f,
--0.847414f, -0.84743f, -0.847445f, -0.84746f, -0.847475f, -0.847491f, -0.847506f, -0.847521f, -0.847536f, -0.847551f, -0.847566f, -0.847581f, -0.847597f, -0.847612f, -0.847627f, -0.847642f, -0.847657f, -0.847672f, -0.847687f, -0.847702f,
--0.847717f, -0.847732f, -0.847747f, -0.847762f, -0.847777f, -0.847792f, -0.847807f, -0.847822f, -0.847837f, -0.847852f, -0.847867f, -0.847882f, -0.847897f, -0.847911f, -0.847926f, -0.847941f, -0.847956f, -0.847971f, -0.847986f, -0.848f,
--0.848015f, -0.84803f, -0.848045f, -0.84806f, -0.848074f, -0.848089f, -0.848104f, -0.848119f, -0.848133f, -0.848148f, -0.848163f, -0.848177f, -0.848192f, -0.848207f, -0.848221f, -0.848236f, -0.848251f, -0.848265f, -0.84828f, -0.848294f,
--0.848309f, -0.848323f, -0.848338f, -0.848353f, -0.848367f, -0.848382f, -0.848396f, -0.848411f, -0.848425f, -0.84844f, -0.848454f, -0.848468f, -0.848483f, -0.848497f, -0.848512f, -0.848526f, -0.84854f, -0.848555f, -0.848569f, -0.848584f,
--0.848598f, -0.848612f, -0.848627f, -0.848641f, -0.848655f, -0.848669f, -0.848684f, -0.848698f, -0.848712f, -0.848727f, -0.848741f, -0.848755f, -0.848769f, -0.848783f, -0.848798f, -0.848812f, -0.848826f, -0.84884f, -0.848854f, -0.848868f,
--0.848882f, -0.848897f, -0.848911f, -0.848925f, -0.848939f, -0.848953f, -0.848967f, -0.848981f, -0.848995f, -0.849009f, -0.849023f, -0.849037f, -0.849051f, -0.849065f, -0.849079f, -0.849093f, -0.849107f, -0.849121f, -0.849135f, -0.849148f,
--0.849162f, -0.849176f, -0.84919f, -0.849204f, -0.849218f, -0.849232f, -0.849245f, -0.849259f, -0.849273f, -0.849287f, -0.849301f, -0.849314f, -0.849328f, -0.849342f, -0.849356f, -0.849369f, -0.849383f, -0.849397f, -0.84941f, -0.849424f,
--0.849438f, -0.849451f, -0.849465f, -0.849479f, -0.849492f, -0.849506f, -0.849519f, -0.849533f, -0.849547f, -0.84956f, -0.849574f, -0.849587f, -0.849601f, -0.849614f, -0.849628f, -0.849641f, -0.849655f, -0.849668f, -0.849682f, -0.849695f,
--0.849709f, -0.849722f, -0.849735f, -0.849749f, -0.849762f, -0.849776f, -0.849789f, -0.849802f, -0.849816f, -0.849829f, -0.849842f, -0.849856f, -0.849869f, -0.849882f, -0.849895f, -0.849909f, -0.849922f, -0.849935f, -0.849948f, -0.849962f,
--0.849975f, -0.849988f, -0.850001f, -0.850014f, -0.850028f, -0.850041f, -0.850054f, -0.850067f, -0.85008f, -0.850093f, -0.850106f, -0.850119f, -0.850132f, -0.850145f, -0.850159f, -0.850172f, -0.850185f, -0.850198f, -0.850211f, -0.850224f,
--0.850237f, -0.85025f, -0.850262f, -0.850275f, -0.850288f, -0.850301f, -0.850314f, -0.850327f, -0.85034f, -0.850353f, -0.850366f, -0.850379f, -0.850391f, -0.850404f, -0.850417f, -0.85043f, -0.850443f, -0.850455f, -0.850468f, -0.850481f,
--0.850494f, -0.850506f, -0.850519f, -0.850532f, -0.850545f, -0.850557f, -0.85057f, -0.850583f, -0.850595f, -0.850608f, -0.850621f, -0.850633f, -0.850646f, -0.850658f, -0.850671f, -0.850684f, -0.850696f, -0.850709f, -0.850721f, -0.850734f,
--0.850746f, -0.850759f, -0.850771f, -0.850784f, -0.850796f, -0.850809f, -0.850821f, -0.850834f, -0.850846f, -0.850858f, -0.850871f, -0.850883f, -0.850896f, -0.850908f, -0.85092f, -0.850933f, -0.850945f, -0.850957f, -0.85097f, -0.850982f,
--0.850994f, -0.851006f, -0.851019f, -0.851031f, -0.851043f, -0.851055f, -0.851068f, -0.85108f, -0.851092f, -0.851104f, -0.851116f, -0.851129f, -0.851141f, -0.851153f, -0.851165f, -0.851177f, -0.851189f, -0.851201f, -0.851213f, -0.851226f,
--0.851238f, -0.85125f, -0.851262f, -0.851274f, -0.851286f, -0.851298f, -0.85131f, -0.851322f, -0.851334f, -0.851346f, -0.851358f, -0.85137f, -0.851381f, -0.851393f, -0.851405f, -0.851417f, -0.851429f, -0.851441f, -0.851453f, -0.851465f,
--0.851476f, -0.851488f, -0.8515f, -0.851512f, -0.851524f, -0.851535f, -0.851547f, -0.851559f, -0.851571f, -0.851582f, -0.851594f, -0.851606f, -0.851618f, -0.851629f, -0.851641f, -0.851653f, -0.851664f, -0.851676f, -0.851688f, -0.851699f,
--0.851711f, -0.851722f, -0.851734f, -0.851745f, -0.851757f, -0.851769f, -0.85178f, -0.851792f, -0.851803f, -0.851815f, -0.851826f, -0.851838f, -0.851849f, -0.851861f, -0.851872f, -0.851883f, -0.851895f, -0.851906f, -0.851918f, -0.851929f,
--0.85194f, -0.851952f, -0.851963f, -0.851974f, -0.851986f, -0.851997f, -0.852008f, -0.85202f, -0.852031f, -0.852042f, -0.852054f, -0.852065f, -0.852076f, -0.852087f, -0.852098f, -0.85211f, -0.852121f, -0.852132f, -0.852143f, -0.852154f,
--0.852166f, -0.852177f, -0.852188f, -0.852199f, -0.85221f, -0.852221f, -0.852232f, -0.852243f, -0.852254f, -0.852265f, -0.852276f, -0.852287f, -0.852298f, -0.852309f, -0.85232f, -0.852331f, -0.852342f, -0.852353f, -0.852364f, -0.852375f,
--0.852386f, -0.852397f, -0.852408f, -0.852419f, -0.85243f, -0.85244f, -0.852451f, -0.852462f, -0.852473f, -0.852484f, -0.852495f, -0.852505f, -0.852516f, -0.852527f, -0.852538f, -0.852548f, -0.852559f, -0.85257f, -0.852581f, -0.852591f,
--0.852602f, -0.852613f, -0.852623f, -0.852634f, -0.852645f, -0.852655f, -0.852666f, -0.852676f, -0.852687f, -0.852698f, -0.852708f, -0.852719f, -0.852729f, -0.85274f, -0.85275f, -0.852761f, -0.852771f, -0.852782f, -0.852792f, -0.852803f,
--0.852813f, -0.852824f, -0.852834f, -0.852845f, -0.852855f, -0.852865f, -0.852876f, -0.852886f, -0.852897f, -0.852907f, -0.852917f, -0.852928f, -0.852938f, -0.852948f, -0.852959f, -0.852969f, -0.852979f, -0.852989f, -0.853f, -0.85301f,
--0.85302f, -0.85303f, -0.853041f, -0.853051f, -0.853061f, -0.853071f, -0.853081f, -0.853091f, -0.853102f, -0.853112f, -0.853122f, -0.853132f, -0.853142f, -0.853152f, -0.853162f, -0.853172f, -0.853182f, -0.853192f, -0.853202f, -0.853212f,
--0.853222f, -0.853232f, -0.853242f, -0.853252f, -0.853262f, -0.853272f, -0.853282f, -0.853292f, -0.853302f, -0.853312f, -0.853322f, -0.853332f, -0.853341f, -0.853351f, -0.853361f, -0.853371f, -0.853381f, -0.853391f, -0.8534f, -0.85341f,
--0.85342f, -0.85343f, -0.853439f, -0.853449f, -0.853459f, -0.853469f, -0.853478f, -0.853488f, -0.853498f, -0.853507f, -0.853517f, -0.853527f, -0.853536f, -0.853546f, -0.853555f, -0.853565f, -0.853575f, -0.853584f, -0.853594f, -0.853603f,
--0.853613f, -0.853622f, -0.853632f, -0.853641f, -0.853651f, -0.85366f, -0.85367f, -0.853679f, -0.853689f, -0.853698f, -0.853708f, -0.853717f, -0.853726f, -0.853736f, -0.853745f, -0.853755f, -0.853764f, -0.853773f, -0.853783f, -0.853792f,
--0.853801f, -0.853811f, -0.85382f, -0.853829f, -0.853838f, -0.853848f, -0.853857f, -0.853866f, -0.853875f, -0.853885f, -0.853894f, -0.853903f, -0.853912f, -0.853921f, -0.85393f, -0.85394f, -0.853949f, -0.853958f, -0.853967f, -0.853976f,
--0.853985f, -0.853994f, -0.854003f, -0.854012f, -0.854021f, -0.85403f, -0.854039f, -0.854048f, -0.854057f, -0.854066f, -0.854075f, -0.854084f, -0.854093f, -0.854102f, -0.854111f, -0.85412f, -0.854129f, -0.854138f, -0.854147f, -0.854155f,
--0.854164f, -0.854173f, -0.854182f, -0.854191f, -0.8542f, -0.854208f, -0.854217f, -0.854226f, -0.854235f, -0.854243f, -0.854252f, -0.854261f, -0.85427f, -0.854278f, -0.854287f, -0.854296f, -0.854304f, -0.854313f, -0.854322f, -0.85433f,
--0.854339f, -0.854348f, -0.854356f, -0.854365f, -0.854373f, -0.854382f, -0.85439f, -0.854399f, -0.854407f, -0.854416f, -0.854424f, -0.854433f, -0.854441f, -0.85445f, -0.854458f, -0.854467f, -0.854475f, -0.854484f, -0.854492f, -0.854501f,
--0.854509f, -0.854517f, -0.854526f, -0.854534f, -0.854542f, -0.854551f, -0.854559f, -0.854567f, -0.854576f, -0.854584f, -0.854592f, -0.8546f, -0.854609f, -0.854617f, -0.854625f, -0.854633f, -0.854642f, -0.85465f, -0.854658f, -0.854666f,
--0.854674f, -0.854682f, -0.854691f, -0.854699f, -0.854707f, -0.854715f, -0.854723f, -0.854731f, -0.854739f, -0.854747f, -0.854755f, -0.854763f, -0.854771f, -0.854779f, -0.854787f, -0.854795f, -0.854803f, -0.854811f, -0.854819f, -0.854827f,
--0.854835f, -0.854843f, -0.854851f, -0.854859f, -0.854867f, -0.854875f, -0.854882f, -0.85489f, -0.854898f, -0.854906f, -0.854914f, -0.854922f, -0.854929f, -0.854937f, -0.854945f, -0.854953f, -0.85496f, -0.854968f, -0.854976f, -0.854984f,
--0.854991f, -0.854999f, -0.855007f, -0.855014f, -0.855022f, -0.85503f, -0.855037f, -0.855045f, -0.855053f, -0.85506f, -0.855068f, -0.855075f, -0.855083f, -0.85509f, -0.855098f, -0.855105f, -0.855113f, -0.855121f, -0.855128f, -0.855135f,
--0.855143f, -0.85515f, -0.855158f, -0.855165f, -0.855173f, -0.85518f, -0.855188f, -0.855195f, -0.855202f, -0.85521f, -0.855217f, -0.855224f, -0.855232f, -0.855239f, -0.855246f, -0.855254f, -0.855261f, -0.855268f, -0.855275f, -0.855283f,
--0.85529f, -0.855297f, -0.855304f, -0.855312f, -0.855319f, -0.855326f, -0.855333f, -0.85534f, -0.855347f, -0.855355f, -0.855362f, -0.855369f, -0.855376f, -0.855383f, -0.85539f, -0.855397f, -0.855404f, -0.855411f, -0.855418f, -0.855425f,
--0.855432f, -0.855439f, -0.855446f, -0.855453f, -0.85546f, -0.855467f, -0.855474f, -0.855481f, -0.855488f, -0.855495f, -0.855502f, -0.855509f, -0.855516f, -0.855522f, -0.855529f, -0.855536f, -0.855543f, -0.85555f, -0.855557f, -0.855563f,
--0.85557f, -0.855577f, -0.855584f, -0.85559f, -0.855597f, -0.855604f, -0.855611f, -0.855617f, -0.855624f, -0.855631f, -0.855637f, -0.855644f, -0.855651f, -0.855657f, -0.855664f, -0.85567f, -0.855677f, -0.855684f, -0.85569f, -0.855697f,
--0.855703f, -0.85571f, -0.855716f, -0.855723f, -0.855729f, -0.855736f, -0.855742f, -0.855749f, -0.855755f, -0.855762f, -0.855768f, -0.855775f, -0.855781f, -0.855787f, -0.855794f, -0.8558f, -0.855807f, -0.855813f, -0.855819f, -0.855826f,
--0.855832f, -0.855838f, -0.855845f, -0.855851f, -0.855857f, -0.855863f, -0.85587f, -0.855876f, -0.855882f, -0.855888f, -0.855894f, -0.855901f, -0.855907f, -0.855913f, -0.855919f, -0.855925f, -0.855931f, -0.855938f, -0.855944f, -0.85595f,
--0.855956f, -0.855962f, -0.855968f, -0.855974f, -0.85598f, -0.855986f, -0.855992f, -0.855998f, -0.856004f, -0.85601f, -0.856016f, -0.856022f, -0.856028f, -0.856034f, -0.85604f, -0.856046f, -0.856052f, -0.856058f, -0.856063f, -0.856069f,
--0.856075f, -0.856081f, -0.856087f, -0.856093f, -0.856099f, -0.856104f, -0.85611f, -0.856116f, -0.856122f, -0.856127f, -0.856133f, -0.856139f, -0.856145f, -0.85615f, -0.856156f, -0.856162f, -0.856167f, -0.856173f, -0.856179f, -0.856184f,
--0.85619f, -0.856196f, -0.856201f, -0.856207f, -0.856212f, -0.856218f, -0.856223f, -0.856229f, -0.856235f, -0.85624f, -0.856246f, -0.856251f, -0.856257f, -0.856262f, -0.856267f, -0.856273f, -0.856278f, -0.856284f, -0.856289f, -0.856295f,
--0.8563f, -0.856305f, -0.856311f, -0.856316f, -0.856322f, -0.856327f, -0.856332f, -0.856337f, -0.856343f, -0.856348f, -0.856353f, -0.856359f, -0.856364f, -0.856369f, -0.856374f, -0.85638f, -0.856385f, -0.85639f, -0.856395f, -0.8564f,
--0.856406f, -0.856411f, -0.856416f, -0.856421f, -0.856426f, -0.856431f, -0.856436f, -0.856441f, -0.856446f, -0.856452f, -0.856457f, -0.856462f, -0.856467f, -0.856472f, -0.856477f, -0.856482f, -0.856487f, -0.856492f, -0.856497f, -0.856501f,
--0.856506f, -0.856511f, -0.856516f, -0.856521f, -0.856526f, -0.856531f, -0.856536f, -0.856541f, -0.856545f, -0.85655f, -0.856555f, -0.85656f, -0.856565f, -0.85657f, -0.856574f, -0.856579f, -0.856584f, -0.856589f, -0.856593f, -0.856598f,
--0.856603f, -0.856607f, -0.856612f, -0.856617f, -0.856621f, -0.856626f, -0.856631f, -0.856635f, -0.85664f, -0.856645f, -0.856649f, -0.856654f, -0.856658f, -0.856663f, -0.856667f, -0.856672f, -0.856676f, -0.856681f, -0.856685f, -0.85669f,
--0.856694f, -0.856699f, -0.856703f, -0.856708f, -0.856712f, -0.856717f, -0.856721f, -0.856725f, -0.85673f, -0.856734f, -0.856738f, -0.856743f, -0.856747f, -0.856751f, -0.856756f, -0.85676f, -0.856764f, -0.856769f, -0.856773f, -0.856777f,
--0.856781f, -0.856786f, -0.85679f, -0.856794f, -0.856798f, -0.856802f, -0.856807f, -0.856811f, -0.856815f, -0.856819f, -0.856823f, -0.856827f, -0.856831f, -0.856835f, -0.85684f, -0.856844f, -0.856848f, -0.856852f, -0.856856f, -0.85686f,
--0.856864f, -0.856868f, -0.856872f, -0.856876f, -0.85688f, -0.856884f, -0.856888f, -0.856892f, -0.856895f, -0.856899f, -0.856903f, -0.856907f, -0.856911f, -0.856915f, -0.856919f, -0.856923f, -0.856926f, -0.85693f, -0.856934f, -0.856938f,
--0.856942f, -0.856945f, -0.856949f, -0.856953f, -0.856957f, -0.85696f, -0.856964f, -0.856968f, -0.856971f, -0.856975f, -0.856979f, -0.856982f, -0.856986f, -0.85699f, -0.856993f, -0.856997f, -0.857f, -0.857004f, -0.857008f, -0.857011f,
--0.857015f, -0.857018f, -0.857022f, -0.857025f, -0.857029f, -0.857032f, -0.857036f, -0.857039f, -0.857043f, -0.857046f, -0.85705f, -0.857053f, -0.857056f, -0.85706f, -0.857063f, -0.857067f, -0.85707f, -0.857073f, -0.857077f, -0.85708f,
--0.857083f, -0.857087f, -0.85709f, -0.857093f, -0.857096f, -0.8571f, -0.857103f, -0.857106f, -0.857109f, -0.857113f, -0.857116f, -0.857119f, -0.857122f, -0.857125f, -0.857128f, -0.857132f, -0.857135f, -0.857138f, -0.857141f, -0.857144f,
--0.857147f, -0.85715f, -0.857153f, -0.857156f, -0.857159f, -0.857162f, -0.857165f, -0.857168f, -0.857171f, -0.857174f, -0.857177f, -0.85718f, -0.857183f, -0.857186f, -0.857189f, -0.857192f, -0.857195f, -0.857198f, -0.857201f, -0.857204f,
--0.857206f, -0.857209f, -0.857212f, -0.857215f, -0.857218f, -0.857221f, -0.857223f, -0.857226f, -0.857229f, -0.857232f, -0.857234f, -0.857237f, -0.85724f, -0.857243f, -0.857245f, -0.857248f, -0.857251f, -0.857253f, -0.857256f, -0.857259f,
--0.857261f, -0.857264f, -0.857266f, -0.857269f, -0.857272f, -0.857274f, -0.857277f, -0.857279f, -0.857282f, -0.857284f, -0.857287f, -0.857289f, -0.857292f, -0.857294f, -0.857297f, -0.857299f, -0.857302f, -0.857304f, -0.857306f, -0.857309f,
--0.857311f, -0.857314f, -0.857316f, -0.857318f, -0.857321f, -0.857323f, -0.857325f, -0.857328f, -0.85733f, -0.857332f, -0.857334f, -0.857337f, -0.857339f, -0.857341f, -0.857343f, -0.857346f, -0.857348f, -0.85735f, -0.857352f, -0.857354f,
--0.857357f, -0.857359f, -0.857361f, -0.857363f, -0.857365f, -0.857367f, -0.857369f, -0.857371f, -0.857373f, -0.857376f, -0.857378f, -0.85738f, -0.857382f, -0.857384f, -0.857386f, -0.857388f, -0.85739f, -0.857392f, -0.857394f, -0.857395f,
--0.857397f, -0.857399f, -0.857401f, -0.857403f, -0.857405f, -0.857407f, -0.857409f, -0.857411f, -0.857412f, -0.857414f, -0.857416f, -0.857418f, -0.85742f, -0.857421f, -0.857423f, -0.857425f, -0.857427f, -0.857428f, -0.85743f, -0.857432f,
--0.857434f, -0.857435f, -0.857437f, -0.857439f, -0.85744f, -0.857442f, -0.857443f, -0.857445f, -0.857447f, -0.857448f, -0.85745f, -0.857451f, -0.857453f, -0.857455f, -0.857456f, -0.857458f, -0.857459f, -0.857461f, -0.857462f, -0.857464f,
--0.857465f, -0.857467f, -0.857468f, -0.857469f, -0.857471f, -0.857472f, -0.857474f, -0.857475f, -0.857476f, -0.857478f, -0.857479f, -0.85748f, -0.857482f, -0.857483f, -0.857484f, -0.857486f, -0.857487f, -0.857488f, -0.85749f, -0.857491f,
--0.857492f, -0.857493f, -0.857494f, -0.857496f, -0.857497f, -0.857498f, -0.857499f, -0.8575f, -0.857501f, -0.857503f, -0.857504f, -0.857505f, -0.857506f, -0.857507f, -0.857508f, -0.857509f, -0.85751f, -0.857511f, -0.857512f, -0.857513f,
--0.857514f, -0.857515f, -0.857516f, -0.857517f, -0.857518f, -0.857519f, -0.85752f, -0.857521f, -0.857522f, -0.857523f, -0.857524f, -0.857525f, -0.857525f, -0.857526f, -0.857527f, -0.857528f, -0.857529f, -0.85753f, -0.85753f, -0.857531f,
--0.857532f, -0.857533f, -0.857533f, -0.857534f, -0.857535f, -0.857536f, -0.857536f, -0.857537f, -0.857538f, -0.857538f, -0.857539f, -0.85754f, -0.85754f, -0.857541f, -0.857541f, -0.857542f, -0.857543f, -0.857543f, -0.857544f, -0.857544f,
--0.857545f, -0.857545f, -0.857546f, -0.857546f, -0.857547f, -0.857547f, -0.857548f, -0.857548f, -0.857549f, -0.857549f, -0.85755f, -0.85755f, -0.857551f, -0.857551f, -0.857551f, -0.857552f, -0.857552f, -0.857552f, -0.857553f, -0.857553f,
--0.857553f, -0.857554f, -0.857554f, -0.857554f, -0.857554f, -0.857555f, -0.857555f, -0.857555f, -0.857555f, -0.857556f, -0.857556f, -0.857556f, -0.857556f, -0.857556f, -0.857556f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f,
--0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857557f, -0.857556f, -0.857556f,
--0.857556f, -0.857556f, -0.857556f, -0.857556f, -0.857555f, -0.857555f, -0.857555f, -0.857555f, -0.857555f, -0.857554f, -0.857554f, -0.857554f, -0.857553f, -0.857553f, -0.857553f, -0.857552f, -0.857552f, -0.857552f, -0.857551f, -0.857551f,
--0.857551f, -0.85755f, -0.85755f, -0.857549f, -0.857549f, -0.857549f, -0.857548f, -0.857548f, -0.857547f, -0.857547f, -0.857546f, -0.857546f, -0.857545f, -0.857545f, -0.857544f, -0.857543f, -0.857543f, -0.857542f, -0.857542f, -0.857541f,
--0.857541f, -0.85754f, -0.857539f, -0.857539f, -0.857538f, -0.857537f, -0.857537f, -0.857536f, -0.857535f, -0.857534f, -0.857534f, -0.857533f, -0.857532f, -0.857531f, -0.857531f, -0.85753f, -0.857529f, -0.857528f, -0.857527f, -0.857527f,
--0.857526f, -0.857525f, -0.857524f, -0.857523f, -0.857522f, -0.857521f, -0.85752f, -0.857519f, -0.857519f, -0.857518f, -0.857517f, -0.857516f, -0.857515f, -0.857514f, -0.857513f, -0.857512f, -0.857511f, -0.85751f, -0.857508f, -0.857507f,
--0.857506f, -0.857505f, -0.857504f, -0.857503f, -0.857502f, -0.857501f, -0.8575f, -0.857498f, -0.857497f, -0.857496f, -0.857495f, -0.857494f, -0.857492f, -0.857491f, -0.85749f, -0.857489f, -0.857487f, -0.857486f, -0.857485f, -0.857484f,
--0.857482f, -0.857481f, -0.85748f, -0.857478f, -0.857477f, -0.857476f, -0.857474f, -0.857473f, -0.857471f, -0.85747f, -0.857469f, -0.857467f, -0.857466f, -0.857464f, -0.857463f, -0.857461f, -0.85746f, -0.857458f, -0.857457f, -0.857455f,
--0.857454f, -0.857452f, -0.85745f, -0.857449f, -0.857447f, -0.857446f, -0.857444f, -0.857442f, -0.857441f, -0.857439f, -0.857438f, -0.857436f, -0.857434f, -0.857432f, -0.857431f, -0.857429f, -0.857427f, -0.857426f, -0.857424f, -0.857422f,
--0.85742f, -0.857419f, -0.857417f, -0.857415f, -0.857413f, -0.857411f, -0.857409f, -0.857408f, -0.857406f, -0.857404f, -0.857402f, -0.8574f, -0.857398f, -0.857396f, -0.857394f, -0.857392f, -0.85739f, -0.857388f, -0.857386f, -0.857384f,
--0.857382f, -0.85738f, -0.857378f, -0.857376f, -0.857374f, -0.857372f, -0.85737f, -0.857368f, -0.857366f, -0.857364f, -0.857362f, -0.85736f, -0.857357f, -0.857355f, -0.857353f, -0.857351f, -0.857349f, -0.857346f, -0.857344f, -0.857342f,
--0.85734f, -0.857338f, -0.857335f, -0.857333f, -0.857331f, -0.857328f, -0.857326f, -0.857324f, -0.857321f, -0.857319f, -0.857317f, -0.857314f, -0.857312f, -0.85731f, -0.857307f, -0.857305f, -0.857302f, -0.8573f, -0.857297f, -0.857295f,
--0.857293f, -0.85729f, -0.857288f, -0.857285f, -0.857283f, -0.85728f, -0.857278f, -0.857275f, -0.857272f, -0.85727f, -0.857267f, -0.857265f, -0.857262f, -0.857259f, -0.857257f, -0.857254f, -0.857251f, -0.857249f, -0.857246f, -0.857243f,
--0.857241f, -0.857238f, -0.857235f, -0.857233f, -0.85723f, -0.857227f, -0.857224f, -0.857221f, -0.857219f, -0.857216f, -0.857213f, -0.85721f, -0.857207f, -0.857205f, -0.857202f, -0.857199f, -0.857196f, -0.857193f, -0.85719f, -0.857187f,
--0.857184f, -0.857181f, -0.857178f, -0.857175f, -0.857172f, -0.857169f, -0.857166f, -0.857163f, -0.85716f, -0.857157f, -0.857154f, -0.857151f, -0.857148f, -0.857145f, -0.857142f, -0.857139f, -0.857136f, -0.857133f, -0.857129f, -0.857126f,
--0.857123f, -0.85712f, -0.857117f, -0.857114f, -0.85711f, -0.857107f, -0.857104f, -0.857101f, -0.857097f, -0.857094f, -0.857091f, -0.857088f, -0.857084f, -0.857081f, -0.857078f, -0.857074f, -0.857071f, -0.857068f, -0.857064f, -0.857061f,
--0.857057f, -0.857054f, -0.857051f, -0.857047f, -0.857044f, -0.85704f, -0.857037f, -0.857033f, -0.85703f, -0.857026f, -0.857023f, -0.857019f, -0.857016f, -0.857012f, -0.857009f, -0.857005f, -0.857001f, -0.856998f, -0.856994f, -0.856991f,
--0.856987f, -0.856983f, -0.85698f, -0.856976f, -0.856972f, -0.856969f, -0.856965f, -0.856961f, -0.856958f, -0.856954f, -0.85695f, -0.856946f, -0.856943f, -0.856939f, -0.856935f, -0.856931f, -0.856927f, -0.856924f, -0.85692f, -0.856916f,
--0.856912f, -0.856908f, -0.856904f, -0.8569f, -0.856896f, -0.856893f, -0.856889f, -0.856885f, -0.856881f, -0.856877f, -0.856873f, -0.856869f, -0.856865f, -0.856861f, -0.856857f, -0.856853f, -0.856849f, -0.856845f, -0.856841f, -0.856836f,
--0.856832f, -0.856828f, -0.856824f, -0.85682f, -0.856816f, -0.856812f, -0.856808f, -0.856803f, -0.856799f, -0.856795f, -0.856791f, -0.856787f, -0.856782f, -0.856778f, -0.856774f, -0.85677f, -0.856765f, -0.856761f, -0.856757f, -0.856752f,
--0.856748f, -0.856744f, -0.856739f, -0.856735f, -0.856731f, -0.856726f, -0.856722f, -0.856717f, -0.856713f, -0.856709f, -0.856704f, -0.8567f, -0.856695f, -0.856691f, -0.856686f, -0.856682f, -0.856677f, -0.856673f, -0.856668f, -0.856664f,
--0.856659f, -0.856655f, -0.85665f, -0.856645f, -0.856641f, -0.856636f, -0.856632f, -0.856627f, -0.856622f, -0.856618f, -0.856613f, -0.856608f, -0.856604f, -0.856599f, -0.856594f, -0.856589f, -0.856585f, -0.85658f, -0.856575f, -0.85657f,
--0.856566f, -0.856561f, -0.856556f, -0.856551f, -0.856546f, -0.856541f, -0.856537f, -0.856532f, -0.856527f, -0.856522f, -0.856517f, -0.856512f, -0.856507f, -0.856502f, -0.856497f, -0.856492f, -0.856487f, -0.856482f, -0.856477f, -0.856472f,
--0.856467f, -0.856462f, -0.856457f, -0.856452f, -0.856447f, -0.856442f, -0.856437f, -0.856432f, -0.856427f, -0.856422f, -0.856417f, -0.856411f, -0.856406f, -0.856401f, -0.856396f, -0.856391f, -0.856386f, -0.85638f, -0.856375f, -0.85637f,
--0.856365f, -0.856359f, -0.856354f, -0.856349f, -0.856343f, -0.856338f, -0.856333f, -0.856327f, -0.856322f, -0.856317f, -0.856311f, -0.856306f, -0.856301f, -0.856295f, -0.85629f, -0.856284f, -0.856279f, -0.856274f, -0.856268f, -0.856263f,
--0.856257f, -0.856252f, -0.856246f, -0.856241f, -0.856235f, -0.85623f, -0.856224f, -0.856218f, -0.856213f, -0.856207f, -0.856202f, -0.856196f, -0.85619f, -0.856185f, -0.856179f, -0.856173f, -0.856168f, -0.856162f, -0.856156f, -0.856151f,
--0.856145f, -0.856139f, -0.856134f, -0.856128f, -0.856122f, -0.856116f, -0.856111f, -0.856105f, -0.856099f, -0.856093f, -0.856087f, -0.856081f, -0.856076f, -0.85607f, -0.856064f, -0.856058f, -0.856052f, -0.856046f, -0.85604f, -0.856034f,
--0.856028f, -0.856022f, -0.856016f, -0.85601f, -0.856004f, -0.855998f, -0.855992f, -0.855986f, -0.85598f, -0.855974f, -0.855968f, -0.855962f, -0.855956f, -0.85595f, -0.855944f, -0.855938f, -0.855932f, -0.855925f, -0.855919f, -0.855913f,
--0.855907f, -0.855901f, -0.855895f, -0.855888f, -0.855882f, -0.855876f, -0.85587f, -0.855863f, -0.855857f, -0.855851f, -0.855845f, -0.855838f, -0.855832f, -0.855826f, -0.855819f, -0.855813f, -0.855807f, -0.8558f, -0.855794f, -0.855787f,
--0.855781f, -0.855775f, -0.855768f, -0.855762f, -0.855755f, -0.855749f, -0.855742f, -0.855736f, -0.855729f, -0.855723f, -0.855716f, -0.85571f, -0.855703f, -0.855697f, -0.85569f, -0.855683f, -0.855677f, -0.85567f, -0.855664f, -0.855657f,
--0.85565f, -0.855644f, -0.855637f, -0.85563f, -0.855624f, -0.855617f, -0.85561f, -0.855604f, -0.855597f, -0.85559f, -0.855583f, -0.855577f, -0.85557f, -0.855563f, -0.855556f, -0.855549f, -0.855543f, -0.855536f, -0.855529f, -0.855522f,
--0.855515f, -0.855508f, -0.855501f, -0.855494f, -0.855488f, -0.855481f, -0.855474f, -0.855467f, -0.85546f, -0.855453f, -0.855446f, -0.855439f, -0.855432f, -0.855425f, -0.855418f, -0.855411f, -0.855404f, -0.855397f, -0.855389f, -0.855382f,
--0.855375f, -0.855368f, -0.855361f, -0.855354f, -0.855347f, -0.85534f, -0.855332f, -0.855325f, -0.855318f, -0.855311f, -0.855304f, -0.855296f, -0.855289f, -0.855282f, -0.855275f, -0.855267f, -0.85526f, -0.855253f, -0.855245f, -0.855238f,
--0.855231f, -0.855223f, -0.855216f, -0.855209f, -0.855201f, -0.855194f, -0.855187f, -0.855179f, -0.855172f, -0.855164f, -0.855157f, -0.855149f, -0.855142f, -0.855134f, -0.855127f, -0.855119f, -0.855112f, -0.855104f, -0.855097f, -0.855089f,
--0.855082f, -0.855074f, -0.855066f, -0.855059f, -0.855051f, -0.855044f, -0.855036f, -0.855028f, -0.855021f, -0.855013f, -0.855005f, -0.854998f, -0.85499f, -0.854982f, -0.854974f, -0.854967f, -0.854959f, -0.854951f, -0.854943f, -0.854936f,
--0.854928f, -0.85492f, -0.854912f, -0.854904f, -0.854897f, -0.854889f, -0.854881f, -0.854873f, -0.854865f, -0.854857f, -0.854849f, -0.854841f, -0.854833f, -0.854825f, -0.854817f, -0.85481f, -0.854802f, -0.854794f, -0.854786f, -0.854778f,
--0.854769f, -0.854761f, -0.854753f, -0.854745f, -0.854737f, -0.854729f, -0.854721f, -0.854713f, -0.854705f, -0.854697f, -0.854689f, -0.85468f, -0.854672f, -0.854664f, -0.854656f, -0.854648f, -0.854639f, -0.854631f, -0.854623f, -0.854615f,
--0.854606f, -0.854598f, -0.85459f, -0.854582f, -0.854573f, -0.854565f, -0.854557f, -0.854548f, -0.85454f, -0.854532f, -0.854523f, -0.854515f, -0.854506f, -0.854498f, -0.85449f, -0.854481f, -0.854473f, -0.854464f, -0.854456f, -0.854447f,
--0.854439f, -0.85443f, -0.854422f, -0.854413f, -0.854405f, -0.854396f, -0.854388f, -0.854379f, -0.85437f, -0.854362f, -0.854353f, -0.854345f, -0.854336f, -0.854327f, -0.854319f, -0.85431f, -0.854301f, -0.854293f, -0.854284f, -0.854275f,
--0.854267f, -0.854258f, -0.854249f, -0.85424f, -0.854232f, -0.854223f, -0.854214f, -0.854205f, -0.854196f, -0.854188f, -0.854179f, -0.85417f, -0.854161f, -0.854152f, -0.854143f, -0.854134f, -0.854125f, -0.854116f, -0.854108f, -0.854099f,
--0.85409f, -0.854081f, -0.854072f, -0.854063f, -0.854054f, -0.854045f, -0.854036f, -0.854027f, -0.854018f, -0.854009f, -0.853999f, -0.85399f, -0.853981f, -0.853972f, -0.853963f, -0.853954f, -0.853945f, -0.853936f, -0.853926f, -0.853917f,
--0.853908f, -0.853899f, -0.85389f, -0.85388f, -0.853871f, -0.853862f, -0.853853f, -0.853843f, -0.853834f, -0.853825f, -0.853816f, -0.853806f, -0.853797f, -0.853788f, -0.853778f, -0.853769f, -0.85376f, -0.85375f, -0.853741f, -0.853731f,
--0.853722f, -0.853713f, -0.853703f, -0.853694f, -0.853684f, -0.853675f, -0.853665f, -0.853656f, -0.853646f, -0.853637f, -0.853627f, -0.853618f, -0.853608f, -0.853598f, -0.853589f, -0.853579f, -0.85357f, -0.85356f, -0.85355f, -0.853541f,
--0.853531f, -0.853522f, -0.853512f, -0.853502f, -0.853492f, -0.853483f, -0.853473f, -0.853463f, -0.853454f, -0.853444f, -0.853434f, -0.853424f, -0.853414f, -0.853405f, -0.853395f, -0.853385f, -0.853375f, -0.853365f, -0.853356f, -0.853346f,
--0.853336f, -0.853326f, -0.853316f, -0.853306f, -0.853296f, -0.853286f, -0.853276f, -0.853266f, -0.853256f, -0.853246f, -0.853236f, -0.853226f, -0.853216f, -0.853206f, -0.853196f, -0.853186f, -0.853176f, -0.853166f, -0.853156f, -0.853146f,
--0.853136f, -0.853126f, -0.853116f, -0.853105f, -0.853095f, -0.853085f, -0.853075f, -0.853065f, -0.853054f, -0.853044f, -0.853034f, -0.853024f, -0.853014f, -0.853003f, -0.852993f, -0.852983f, -0.852972f, -0.852962f, -0.852952f, -0.852941f,
--0.852931f, -0.852921f, -0.85291f, -0.8529f, -0.85289f, -0.852879f, -0.852869f, -0.852858f, -0.852848f, -0.852838f, -0.852827f, -0.852817f, -0.852806f, -0.852796f, -0.852785f, -0.852775f, -0.852764f, -0.852754f, -0.852743f, -0.852732f,
--0.852722f, -0.852711f, -0.852701f, -0.85269f, -0.852679f, -0.852669f, -0.852658f, -0.852648f, -0.852637f, -0.852626f, -0.852615f, -0.852605f, -0.852594f, -0.852583f, -0.852573f, -0.852562f, -0.852551f, -0.85254f, -0.85253f, -0.852519f,
--0.852508f, -0.852497f, -0.852486f, -0.852475f, -0.852465f, -0.852454f, -0.852443f, -0.852432f, -0.852421f, -0.85241f, -0.852399f, -0.852388f, -0.852377f, -0.852366f, -0.852356f, -0.852345f, -0.852334f, -0.852323f, -0.852312f, -0.852301f,
--0.852289f, -0.852278f, -0.852267f, -0.852256f, -0.852245f, -0.852234f, -0.852223f, -0.852212f, -0.852201f, -0.85219f, -0.852178f, -0.852167f, -0.852156f, -0.852145f, -0.852134f, -0.852123f, -0.852111f, -0.8521f, -0.852089f, -0.852078f,
--0.852066f, -0.852055f, -0.852044f, -0.852032f, -0.852021f, -0.85201f, -0.851999f, -0.851987f, -0.851976f, -0.851964f, -0.851953f, -0.851942f, -0.85193f, -0.851919f, -0.851907f, -0.851896f, -0.851885f, -0.851873f, -0.851862f, -0.85185f,
--0.851839f, -0.851827f, -0.851816f, -0.851804f, -0.851793f, -0.851781f, -0.851769f, -0.851758f, -0.851746f, -0.851735f, -0.851723f, -0.851711f, -0.8517f, -0.851688f, -0.851676f, -0.851665f, -0.851653f, -0.851641f, -0.85163f, -0.851618f,
--0.851606f, -0.851595f, -0.851583f, -0.851571f, -0.851559f, -0.851547f, -0.851536f, -0.851524f, -0.851512f, -0.8515f, -0.851488f, -0.851476f, -0.851465f, -0.851453f, -0.851441f, -0.851429f, -0.851417f, -0.851405f, -0.851393f, -0.851381f,
--0.851369f, -0.851357f, -0.851345f, -0.851333f, -0.851321f, -0.851309f, -0.851297f, -0.851285f, -0.851273f, -0.851261f, -0.851249f, -0.851237f, -0.851225f, -0.851213f, -0.851201f, -0.851189f, -0.851176f, -0.851164f, -0.851152f, -0.85114f,
--0.851128f, -0.851115f, -0.851103f, -0.851091f, -0.851079f, -0.851067f, -0.851054f, -0.851042f, -0.85103f, -0.851017f, -0.851005f, -0.850993f, -0.850981f, -0.850968f, -0.850956f, -0.850943f, -0.850931f, -0.850919f, -0.850906f, -0.850894f,
--0.850881f, -0.850869f, -0.850857f, -0.850844f, -0.850832f, -0.850819f, -0.850807f, -0.850794f, -0.850782f, -0.850769f, -0.850757f, -0.850744f, -0.850732f, -0.850719f, -0.850706f, -0.850694f, -0.850681f, -0.850669f, -0.850656f, -0.850643f,
--0.850631f, -0.850618f, -0.850605f, -0.850593f, -0.85058f, -0.850567f, -0.850555f, -0.850542f, -0.850529f, -0.850516f, -0.850504f, -0.850491f, -0.850478f, -0.850465f, -0.850452f, -0.85044f, -0.850427f, -0.850414f, -0.850401f, -0.850388f,
--0.850375f, -0.850362f, -0.850349f, -0.850337f, -0.850324f, -0.850311f, -0.850298f, -0.850285f, -0.850272f, -0.850259f, -0.850246f, -0.850233f, -0.85022f, -0.850207f, -0.850194f, -0.850181f, -0.850168f, -0.850155f, -0.850141f, -0.850128f,
--0.850115f, -0.850102f, -0.850089f, -0.850076f, -0.850063f, -0.850049f, -0.850036f, -0.850023f, -0.85001f, -0.849997f, -0.849983f, -0.84997f, -0.849957f, -0.849944f, -0.84993f, -0.849917f, -0.849904f, -0.849891f, -0.849877f, -0.849864f,
--0.849851f, -0.849837f, -0.849824f, -0.84981f, -0.849797f, -0.849784f, -0.84977f, -0.849757f, -0.849743f, -0.84973f, -0.849717f, -0.849703f, -0.84969f, -0.849676f, -0.849663f, -0.849649f, -0.849636f, -0.849622f, -0.849608f, -0.849595f,
--0.849581f, -0.849568f, -0.849554f, -0.849541f, -0.849527f, -0.849513f, -0.8495f, -0.849486f, -0.849472f, -0.849459f, -0.849445f, -0.849431f, -0.849418f, -0.849404f, -0.84939f, -0.849376f, -0.849363f, -0.849349f, -0.849335f, -0.849321f,
--0.849307f, -0.849294f, -0.84928f, -0.849266f, -0.849252f, -0.849238f, -0.849224f, -0.849211f, -0.849197f, -0.849183f, -0.849169f, -0.849155f, -0.849141f, -0.849127f, -0.849113f, -0.849099f, -0.849085f, -0.849071f, -0.849057f, -0.849043f,
--0.849029f, -0.849015f, -0.849001f, -0.848987f, -0.848973f, -0.848959f, -0.848945f, -0.84893f, -0.848916f, -0.848902f, -0.848888f, -0.848874f, -0.84886f, -0.848846f, -0.848831f, -0.848817f, -0.848803f, -0.848789f, -0.848774f, -0.84876f,
--0.848746f, -0.848732f, -0.848717f, -0.848703f, -0.848689f, -0.848674f, -0.84866f, -0.848646f, -0.848631f, -0.848617f, -0.848603f, -0.848588f, -0.848574f, -0.848559f, -0.848545f, -0.848531f, -0.848516f, -0.848502f, -0.848487f, -0.848473f,
--0.848458f, -0.848444f, -0.848429f, -0.848415f, -0.8484f, -0.848386f, -0.848371f, -0.848357f, -0.848342f, -0.848327f, -0.848313f, -0.848298f, -0.848283f, -0.848269f, -0.848254f, -0.84824f, -0.848225f, -0.84821f, -0.848195f, -0.848181f,
--0.848166f, -0.848151f, -0.848137f, -0.848122f, -0.848107f, -0.848092f, -0.848077f, -0.848063f, -0.848048f, -0.848033f, -0.848018f, -0.848003f, -0.847988f, -0.847974f, -0.847959f, -0.847944f, -0.847929f, -0.847914f, -0.847899f, -0.847884f,
--0.847869f, -0.847854f, -0.847839f, -0.847824f, -0.847809f, -0.847794f, -0.847779f, -0.847764f, -0.847749f, -0.847734f, -0.847719f, -0.847704f, -0.847689f, -0.847674f, -0.847659f, -0.847643f, -0.847628f, -0.847613f, -0.847598f, -0.847583f,
--0.847568f, -0.847552f, -0.847537f, -0.847522f, -0.847507f, -0.847492f, -0.847476f, -0.847461f, -0.847446f, -0.847431f, -0.847415f, -0.8474f, -0.847385f, -0.847369f, -0.847354f, -0.847339f, -0.847323f, -0.847308f, -0.847292f, -0.847277f,
--0.847262f, -0.847246f, -0.847231f, -0.847215f, -0.8472f, -0.847184f, -0.847169f, -0.847153f, -0.847138f, -0.847122f, -0.847107f, -0.847091f, -0.847076f, -0.84706f, -0.847045f, -0.847029f, -0.847013f, -0.846998f, -0.846982f, -0.846967f,
--0.846951f, -0.846935f, -0.84692f, -0.846904f, -0.846888f, -0.846873f, -0.846857f, -0.846841f, -0.846825f, -0.84681f, -0.846794f, -0.846778f, -0.846762f, -0.846747f, -0.846731f, -0.846715f, -0.846699f, -0.846683f, -0.846667f, -0.846652f,
--0.846636f, -0.84662f, -0.846604f, -0.846588f, -0.846572f, -0.846556f, -0.84654f, -0.846524f, -0.846508f, -0.846492f, -0.846476f, -0.84646f, -0.846444f, -0.846428f, -0.846412f, -0.846396f, -0.84638f, -0.846364f, -0.846348f, -0.846332f,
--0.846316f, -0.8463f, -0.846284f, -0.846267f, -0.846251f, -0.846235f, -0.846219f, -0.846203f, -0.846187f, -0.84617f, -0.846154f, -0.846138f, -0.846122f, -0.846105f, -0.846089f, -0.846073f, -0.846057f, -0.84604f, -0.846024f, -0.846008f,
--0.845991f, -0.845975f, -0.845959f, -0.845942f, -0.845926f, -0.84591f, -0.845893f, -0.845877f, -0.84586f, -0.845844f, -0.845827f, -0.845811f, -0.845795f, -0.845778f, -0.845762f, -0.845745f, -0.845729f, -0.845712f, -0.845695f, -0.845679f,
--0.845662f, -0.845646f, -0.845629f, -0.845613f, -0.845596f, -0.845579f, -0.845563f, -0.845546f, -0.845529f, -0.845513f, -0.845496f, -0.845479f, -0.845463f, -0.845446f, -0.845429f, -0.845413f, -0.845396f, -0.845379f, -0.845362f, -0.845346f,
--0.845329f, -0.845312f, -0.845295f, -0.845278f, -0.845261f, -0.845245f, -0.845228f, -0.845211f, -0.845194f, -0.845177f, -0.84516f, -0.845143f, -0.845126f, -0.845109f, -0.845092f, -0.845075f, -0.845059f, -0.845042f, -0.845025f, -0.845008f,
--0.844991f, -0.844973f, -0.844956f, -0.844939f, -0.844922f, -0.844905f, -0.844888f, -0.844871f, -0.844854f, -0.844837f, -0.84482f, -0.844803f, -0.844785f, -0.844768f, -0.844751f, -0.844734f, -0.844717f, -0.844699f, -0.844682f, -0.844665f,
--0.844648f, -0.84463f, -0.844613f, -0.844596f, -0.844579f, -0.844561f, -0.844544f, -0.844527f, -0.844509f, -0.844492f, -0.844475f, -0.844457f, -0.84444f, -0.844422f, -0.844405f, -0.844388f, -0.84437f, -0.844353f, -0.844335f, -0.844318f,
--0.8443f, -0.844283f, -0.844265f, -0.844248f, -0.84423f, -0.844213f, -0.844195f, -0.844178f, -0.84416f, -0.844143f, -0.844125f, -0.844107f, -0.84409f, -0.844072f, -0.844054f, -0.844037f, -0.844019f, -0.844001f, -0.843984f, -0.843966f,
--0.843948f, -0.843931f, -0.843913f, -0.843895f, -0.843877f, -0.84386f, -0.843842f, -0.843824f, -0.843806f, -0.843789f, -0.843771f, -0.843753f, -0.843735f, -0.843717f, -0.843699f, -0.843681f, -0.843664f, -0.843646f, -0.843628f, -0.84361f,
--0.843592f, -0.843574f, -0.843556f, -0.843538f, -0.84352f, -0.843502f, -0.843484f, -0.843466f, -0.843448f, -0.84343f, -0.843412f, -0.843394f, -0.843376f, -0.843358f, -0.84334f, -0.843321f, -0.843303f, -0.843285f, -0.843267f, -0.843249f,
--0.843231f, -0.843213f, -0.843194f, -0.843176f, -0.843158f, -0.84314f, -0.843121f, -0.843103f, -0.843085f, -0.843067f, -0.843048f, -0.84303f, -0.843012f, -0.842994f, -0.842975f, -0.842957f, -0.842939f, -0.84292f, -0.842902f, -0.842883f,
--0.842865f, -0.842847f, -0.842828f, -0.84281f, -0.842791f, -0.842773f, -0.842754f, -0.842736f, -0.842717f, -0.842699f, -0.84268f, -0.842662f, -0.842643f, -0.842625f, -0.842606f, -0.842588f, -0.842569f, -0.842551f, -0.842532f, -0.842513f,
--0.842495f, -0.842476f, -0.842457f, -0.842439f, -0.84242f, -0.842401f, -0.842383f, -0.842364f, -0.842345f, -0.842327f, -0.842308f, -0.842289f, -0.84227f, -0.842252f, -0.842233f, -0.842214f, -0.842195f, -0.842176f, -0.842158f, -0.842139f,
--0.84212f, -0.842101f, -0.842082f, -0.842063f, -0.842044f, -0.842025f, -0.842007f, -0.841988f, -0.841969f, -0.84195f, -0.841931f, -0.841912f, -0.841893f, -0.841874f, -0.841855f, -0.841836f, -0.841817f, -0.841798f, -0.841779f, -0.84176f,
--0.84174f, -0.841721f, -0.841702f, -0.841683f, -0.841664f, -0.841645f, -0.841626f, -0.841607f, -0.841587f, -0.841568f, -0.841549f, -0.84153f, -0.841511f, -0.841491f, -0.841472f, -0.841453f, -0.841434f, -0.841414f, -0.841395f, -0.841376f,
--0.841356f, -0.841337f, -0.841318f, -0.841299f, -0.841279f, -0.84126f, -0.84124f, -0.841221f, -0.841202f, -0.841182f, -0.841163f, -0.841143f, -0.841124f, -0.841104f, -0.841085f, -0.841066f, -0.841046f, -0.841027f, -0.841007f, -0.840987f,
--0.840968f, -0.840948f, -0.840929f, -0.840909f, -0.84089f, -0.84087f, -0.84085f, -0.840831f, -0.840811f, -0.840792f, -0.840772f, -0.840752f, -0.840733f, -0.840713f, -0.840693f, -0.840674f, -0.840654f, -0.840634f, -0.840614f, -0.840595f,
--0.840575f, -0.840555f, -0.840535f, -0.840515f, -0.840496f, -0.840476f, -0.840456f, -0.840436f, -0.840416f, -0.840396f, -0.840377f, -0.840357f, -0.840337f, -0.840317f, -0.840297f, -0.840277f, -0.840257f, -0.840237f, -0.840217f, -0.840197f,
--0.840177f, -0.840157f, -0.840137f, -0.840117f, -0.840097f, -0.840077f, -0.840057f, -0.840037f, -0.840017f, -0.839997f, -0.839977f, -0.839956f, -0.839936f, -0.839916f, -0.839896f, -0.839876f, -0.839856f, -0.839836f, -0.839815f, -0.839795f,
--0.839775f, -0.839755f, -0.839734f, -0.839714f, -0.839694f, -0.839674f, -0.839653f, -0.839633f, -0.839613f, -0.839592f, -0.839572f, -0.839552f, -0.839531f, -0.839511f, -0.839491f, -0.83947f, -0.83945f, -0.839429f, -0.839409f, -0.839389f,
--0.839368f, -0.839348f, -0.839327f, -0.839307f, -0.839286f, -0.839266f, -0.839245f, -0.839225f, -0.839204f, -0.839184f, -0.839163f, -0.839142f, -0.839122f, -0.839101f, -0.839081f, -0.83906f, -0.839039f, -0.839019f, -0.838998f, -0.838977f,
--0.838957f, -0.838936f, -0.838915f, -0.838895f, -0.838874f, -0.838853f, -0.838832f, -0.838812f, -0.838791f, -0.83877f, -0.838749f, -0.838729f, -0.838708f, -0.838687f, -0.838666f, -0.838645f, -0.838624f, -0.838603f, -0.838583f, -0.838562f,
--0.838541f, -0.83852f, -0.838499f, -0.838478f, -0.838457f, -0.838436f, -0.838415f, -0.838394f, -0.838373f, -0.838352f, -0.838331f, -0.83831f, -0.838289f, -0.838268f, -0.838247f, -0.838226f, -0.838205f, -0.838184f, -0.838163f, -0.838141f,
--0.83812f, -0.838099f, -0.838078f, -0.838057f, -0.838036f, -0.838014f, -0.837993f, -0.837972f, -0.837951f, -0.83793f, -0.837908f, -0.837887f, -0.837866f, -0.837845f, -0.837823f, -0.837802f, -0.837781f, -0.837759f, -0.837738f, -0.837717f,
--0.837695f, -0.837674f, -0.837653f, -0.837631f, -0.83761f, -0.837588f, -0.837567f, -0.837545f, -0.837524f, -0.837503f, -0.837481f, -0.83746f, -0.837438f, -0.837417f, -0.837395f, -0.837374f, -0.837352f, -0.83733f, -0.837309f, -0.837287f,
--0.837266f, -0.837244f, -0.837222f, -0.837201f, -0.837179f, -0.837158f, -0.837136f, -0.837114f, -0.837093f, -0.837071f, -0.837049f, -0.837027f, -0.837006f, -0.836984f, -0.836962f, -0.836941f, -0.836919f, -0.836897f, -0.836875f, -0.836853f,
--0.836832f, -0.83681f, -0.836788f, -0.836766f, -0.836744f, -0.836722f, -0.8367f, -0.836679f, -0.836657f, -0.836635f, -0.836613f, -0.836591f, -0.836569f, -0.836547f, -0.836525f, -0.836503f, -0.836481f, -0.836459f, -0.836437f, -0.836415f,
--0.836393f, -0.836371f, -0.836349f, -0.836327f, -0.836305f, -0.836282f, -0.83626f, -0.836238f, -0.836216f, -0.836194f, -0.836172f, -0.83615f, -0.836127f, -0.836105f, -0.836083f, -0.836061f, -0.836039f, -0.836016f, -0.835994f, -0.835972f,
--0.83595f, -0.835927f, -0.835905f, -0.835883f, -0.83586f, -0.835838f, -0.835816f, -0.835793f, -0.835771f, -0.835749f, -0.835726f, -0.835704f, -0.835682f, -0.835659f, -0.835637f, -0.835614f, -0.835592f, -0.835569f, -0.835547f, -0.835524f,
--0.835502f, -0.835479f, -0.835457f, -0.835434f, -0.835412f, -0.835389f, -0.835367f, -0.835344f, -0.835322f, -0.835299f, -0.835276f, -0.835254f, -0.835231f, -0.835208f, -0.835186f, -0.835163f, -0.83514f, -0.835118f, -0.835095f, -0.835072f,
--0.83505f, -0.835027f, -0.835004f, -0.834981f, -0.834959f, -0.834936f, -0.834913f, -0.83489f, -0.834867f, -0.834845f, -0.834822f, -0.834799f, -0.834776f, -0.834753f, -0.83473f, -0.834707f, -0.834684f, -0.834662f, -0.834639f, -0.834616f,
--0.834593f, -0.83457f, -0.834547f, -0.834524f, -0.834501f, -0.834478f, -0.834455f, -0.834432f, -0.834409f, -0.834386f, -0.834363f, -0.83434f, -0.834316f, -0.834293f, -0.83427f, -0.834247f, -0.834224f, -0.834201f, -0.834178f, -0.834155f,
--0.834131f, -0.834108f, -0.834085f, -0.834062f, -0.834039f, -0.834015f, -0.833992f, -0.833969f, -0.833946f, -0.833922f, -0.833899f, -0.833876f, -0.833852f, -0.833829f, -0.833806f, -0.833782f, -0.833759f, -0.833736f, -0.833712f, -0.833689f,
--0.833665f, -0.833642f, -0.833619f, -0.833595f, -0.833572f, -0.833548f, -0.833525f, -0.833501f, -0.833478f, -0.833454f, -0.833431f, -0.833407f, -0.833384f, -0.83336f, -0.833337f, -0.833313f, -0.833289f, -0.833266f, -0.833242f, -0.833219f,
--0.833195f, -0.833171f, -0.833148f, -0.833124f, -0.8331f, -0.833077f, -0.833053f, -0.833029f, -0.833006f, -0.832982f, -0.832958f, -0.832934f, -0.832911f, -0.832887f, -0.832863f, -0.832839f, -0.832815f, -0.832792f, -0.832768f, -0.832744f,
--0.83272f, -0.832696f, -0.832672f, -0.832648f, -0.832625f, -0.832601f, -0.832577f, -0.832553f, -0.832529f, -0.832505f, -0.832481f, -0.832457f, -0.832433f, -0.832409f, -0.832385f, -0.832361f, -0.832337f, -0.832313f, -0.832289f, -0.832265f,
--0.832241f, -0.832216f, -0.832192f, -0.832168f, -0.832144f, -0.83212f, -0.832096f, -0.832072f, -0.832048f, -0.832023f, -0.831999f, -0.831975f, -0.831951f, -0.831926f, -0.831902f, -0.831878f, -0.831854f, -0.831829f, -0.831805f, -0.831781f,
--0.831757f, -0.831732f, -0.831708f, -0.831684f, -0.831659f, -0.831635f, -0.83161f, -0.831586f, -0.831562f, -0.831537f, -0.831513f, -0.831488f, -0.831464f, -0.83144f, -0.831415f, -0.831391f, -0.831366f, -0.831342f, -0.831317f, -0.831293f,
--0.831268f, -0.831243f, -0.831219f, -0.831194f, -0.83117f, -0.831145f, -0.831121f, -0.831096f, -0.831071f, -0.831047f, -0.831022f, -0.830997f, -0.830973f, -0.830948f, -0.830923f, -0.830899f, -0.830874f, -0.830849f, -0.830824f, -0.8308f,
--0.830775f, -0.83075f, -0.830725f, -0.830701f, -0.830676f, -0.830651f, -0.830626f, -0.830601f, -0.830576f, -0.830552f, -0.830527f, -0.830502f, -0.830477f, -0.830452f, -0.830427f, -0.830402f, -0.830377f, -0.830352f, -0.830327f, -0.830302f,
--0.830277f, -0.830252f, -0.830227f, -0.830202f, -0.830177f, -0.830152f, -0.830127f, -0.830102f, -0.830077f, -0.830052f, -0.830027f, -0.830002f, -0.829977f, -0.829952f, -0.829926f, -0.829901f, -0.829876f, -0.829851f, -0.829826f, -0.829801f,
--0.829775f, -0.82975f, -0.829725f, -0.8297f, -0.829674f, -0.829649f, -0.829624f, -0.829599f, -0.829573f, -0.829548f, -0.829523f, -0.829497f, -0.829472f, -0.829447f, -0.829421f, -0.829396f, -0.82937f, -0.829345f, -0.82932f, -0.829294f,
--0.829269f, -0.829243f, -0.829218f, -0.829192f, -0.829167f, -0.829141f, -0.829116f, -0.82909f, -0.829065f, -0.829039f, -0.829014f, -0.828988f, -0.828963f, -0.828937f, -0.828911f, -0.828886f, -0.82886f, -0.828835f, -0.828809f, -0.828783f,
--0.828758f, -0.828732f, -0.828706f, -0.828681f, -0.828655f, -0.828629f, -0.828603f, -0.828578f, -0.828552f, -0.828526f, -0.8285f, -0.828475f, -0.828449f, -0.828423f, -0.828397f, -0.828371f, -0.828345f, -0.82832f, -0.828294f, -0.828268f,
--0.828242f, -0.828216f, -0.82819f, -0.828164f, -0.828138f, -0.828112f, -0.828086f, -0.82806f, -0.828035f, -0.828009f, -0.827983f, -0.827957f, -0.82793f, -0.827904f, -0.827878f, -0.827852f, -0.827826f, -0.8278f, -0.827774f, -0.827748f,
--0.827722f, -0.827696f, -0.82767f, -0.827644f, -0.827617f, -0.827591f, -0.827565f, -0.827539f, -0.827513f, -0.827486f, -0.82746f, -0.827434f, -0.827408f, -0.827381f, -0.827355f, -0.827329f, -0.827303f, -0.827276f, -0.82725f, -0.827224f,
--0.827197f, -0.827171f, -0.827145f, -0.827118f, -0.827092f, -0.827065f, -0.827039f, -0.827013f, -0.826986f, -0.82696f, -0.826933f, -0.826907f, -0.82688f, -0.826854f, -0.826827f, -0.826801f, -0.826774f, -0.826748f, -0.826721f, -0.826695f,
--0.826668f, -0.826642f, -0.826615f, -0.826588f, -0.826562f, -0.826535f, -0.826509f, -0.826482f, -0.826455f, -0.826429f, -0.826402f, -0.826375f, -0.826349f, -0.826322f, -0.826295f, -0.826268f, -0.826242f, -0.826215f, -0.826188f, -0.826161f,
--0.826135f, -0.826108f, -0.826081f, -0.826054f, -0.826027f, -0.826f, -0.825974f, -0.825947f, -0.82592f, -0.825893f, -0.825866f, -0.825839f, -0.825812f, -0.825785f, -0.825758f, -0.825731f, -0.825704f, -0.825677f, -0.82565f, -0.825623f,
--0.825596f, -0.825569f, -0.825542f, -0.825515f, -0.825488f, -0.825461f, -0.825434f, -0.825407f, -0.82538f, -0.825353f, -0.825326f, -0.825299f, -0.825271f, -0.825244f, -0.825217f, -0.82519f, -0.825163f, -0.825136f, -0.825108f, -0.825081f,
--0.825054f, -0.825027f, -0.824999f, -0.824972f, -0.824945f, -0.824918f, -0.82489f, -0.824863f, -0.824836f, -0.824808f, -0.824781f, -0.824754f, -0.824726f, -0.824699f, -0.824671f, -0.824644f, -0.824617f, -0.824589f, -0.824562f, -0.824534f,
--0.824507f, -0.824479f, -0.824452f, -0.824424f, -0.824397f, -0.824369f, -0.824342f, -0.824314f, -0.824287f, -0.824259f, -0.824232f, -0.824204f, -0.824176f, -0.824149f, -0.824121f, -0.824094f, -0.824066f, -0.824038f, -0.824011f, -0.823983f,
--0.823955f, -0.823928f, -0.8239f, -0.823872f, -0.823844f, -0.823817f, -0.823789f, -0.823761f, -0.823733f, -0.823706f, -0.823678f, -0.82365f, -0.823622f, -0.823594f, -0.823567f, -0.823539f, -0.823511f, -0.823483f, -0.823455f, -0.823427f,
--0.823399f, -0.823371f, -0.823343f, -0.823315f, -0.823287f, -0.82326f, -0.823232f, -0.823204f, -0.823176f, -0.823148f, -0.82312f, -0.823091f, -0.823063f, -0.823035f, -0.823007f, -0.822979f, -0.822951f, -0.822923f, -0.822895f, -0.822867f,
--0.822839f, -0.822811f, -0.822782f, -0.822754f, -0.822726f, -0.822698f, -0.82267f, -0.822641f, -0.822613f, -0.822585f, -0.822557f, -0.822529f, -0.8225f, -0.822472f, -0.822444f, -0.822415f, -0.822387f, -0.822359f, -0.82233f, -0.822302f,
--0.822274f, -0.822245f, -0.822217f, -0.822189f, -0.82216f, -0.822132f, -0.822103f, -0.822075f, -0.822046f, -0.822018f, -0.82199f, -0.821961f, -0.821933f, -0.821904f, -0.821876f, -0.821847f, -0.821818f, -0.82179f, -0.821761f, -0.821733f,
--0.821704f, -0.821676f, -0.821647f, -0.821618f, -0.82159f, -0.821561f, -0.821533f, -0.821504f, -0.821475f, -0.821447f, -0.821418f, -0.821389f, -0.82136f, -0.821332f, -0.821303f, -0.821274f, -0.821245f, -0.821217f, -0.821188f, -0.821159f,
--0.82113f, -0.821101f, -0.821073f, -0.821044f, -0.821015f, -0.820986f, -0.820957f, -0.820928f, -0.820899f, -0.820871f, -0.820842f, -0.820813f, -0.820784f, -0.820755f, -0.820726f, -0.820697f, -0.820668f, -0.820639f, -0.82061f, -0.820581f,
--0.820552f, -0.820523f, -0.820494f, -0.820465f, -0.820436f, -0.820407f, -0.820378f, -0.820348f, -0.820319f, -0.82029f, -0.820261f, -0.820232f, -0.820203f, -0.820174f, -0.820144f, -0.820115f, -0.820086f, -0.820057f, -0.820028f, -0.819998f,
--0.819969f, -0.81994f, -0.81991f, -0.819881f, -0.819852f, -0.819823f, -0.819793f, -0.819764f, -0.819735f, -0.819705f, -0.819676f, -0.819647f, -0.819617f, -0.819588f, -0.819558f, -0.819529f, -0.8195f, -0.81947f, -0.819441f, -0.819411f,
--0.819382f, -0.819352f, -0.819323f, -0.819293f, -0.819264f, -0.819234f, -0.819205f, -0.819175f, -0.819146f, -0.819116f, -0.819086f, -0.819057f, -0.819027f, -0.818998f, -0.818968f, -0.818938f, -0.818909f, -0.818879f, -0.818849f, -0.81882f,
--0.81879f, -0.81876f, -0.81873f, -0.818701f, -0.818671f, -0.818641f, -0.818612f, -0.818582f, -0.818552f, -0.818522f, -0.818492f, -0.818463f, -0.818433f, -0.818403f, -0.818373f, -0.818343f, -0.818313f, -0.818283f, -0.818253f, -0.818224f,
--0.818194f, -0.818164f, -0.818134f, -0.818104f, -0.818074f, -0.818044f, -0.818014f, -0.817984f, -0.817954f, -0.817924f, -0.817894f, -0.817864f, -0.817834f, -0.817804f, -0.817774f, -0.817744f, -0.817713f, -0.817683f, -0.817653f, -0.817623f,
--0.817593f, -0.817563f, -0.817533f, -0.817502f, -0.817472f, -0.817442f, -0.817412f, -0.817382f, -0.817351f, -0.817321f, -0.817291f, -0.817261f, -0.81723f, -0.8172f, -0.81717f, -0.81714f, -0.817109f, -0.817079f, -0.817049f, -0.817018f,
--0.816988f, -0.816957f, -0.816927f, -0.816897f, -0.816866f, -0.816836f, -0.816805f, -0.816775f, -0.816745f, -0.816714f, -0.816684f, -0.816653f, -0.816623f, -0.816592f, -0.816562f, -0.816531f, -0.816501f, -0.81647f, -0.816439f, -0.816409f,
--0.816378f, -0.816348f, -0.816317f, -0.816286f, -0.816256f, -0.816225f, -0.816194f, -0.816164f, -0.816133f, -0.816102f, -0.816072f, -0.816041f, -0.81601f, -0.81598f, -0.815949f, -0.815918f, -0.815887f, -0.815857f, -0.815826f, -0.815795f,
--0.815764f, -0.815733f, -0.815703f, -0.815672f, -0.815641f, -0.81561f, -0.815579f, -0.815548f, -0.815517f, -0.815486f, -0.815456f, -0.815425f, -0.815394f, -0.815363f, -0.815332f, -0.815301f, -0.81527f, -0.815239f, -0.815208f, -0.815177f,
--0.815146f, -0.815115f, -0.815084f, -0.815053f, -0.815021f, -0.81499f, -0.814959f, -0.814928f, -0.814897f, -0.814866f, -0.814835f, -0.814804f, -0.814773f, -0.814741f, -0.81471f, -0.814679f, -0.814648f, -0.814617f, -0.814585f, -0.814554f,
--0.814523f, -0.814492f, -0.81446f, -0.814429f, -0.814398f, -0.814366f, -0.814335f, -0.814304f, -0.814272f, -0.814241f, -0.81421f, -0.814178f, -0.814147f, -0.814116f, -0.814084f, -0.814053f, -0.814021f, -0.81399f, -0.813958f, -0.813927f,
--0.813895f, -0.813864f, -0.813832f, -0.813801f, -0.813769f, -0.813738f, -0.813706f, -0.813675f, -0.813643f, -0.813612f, -0.81358f, -0.813549f, -0.813517f, -0.813485f, -0.813454f, -0.813422f, -0.81339f, -0.813359f, -0.813327f, -0.813295f,
--0.813264f, -0.813232f, -0.8132f, -0.813169f, -0.813137f, -0.813105f, -0.813073f, -0.813042f, -0.81301f, -0.812978f, -0.812946f, -0.812914f, -0.812882f, -0.812851f, -0.812819f, -0.812787f, -0.812755f, -0.812723f, -0.812691f, -0.812659f,
--0.812627f, -0.812596f, -0.812564f, -0.812532f, -0.8125f, -0.812468f, -0.812436f, -0.812404f, -0.812372f, -0.81234f, -0.812308f, -0.812276f, -0.812244f, -0.812212f, -0.81218f, -0.812147f, -0.812115f, -0.812083f, -0.812051f, -0.812019f,
--0.811987f, -0.811955f, -0.811923f, -0.81189f, -0.811858f, -0.811826f, -0.811794f, -0.811762f, -0.811729f, -0.811697f, -0.811665f, -0.811633f, -0.8116f, -0.811568f, -0.811536f, -0.811503f, -0.811471f, -0.811439f, -0.811407f, -0.811374f,
--0.811342f, -0.811309f, -0.811277f, -0.811245f, -0.811212f, -0.81118f, -0.811147f, -0.811115f, -0.811083f, -0.81105f, -0.811018f, -0.810985f, -0.810953f, -0.81092f, -0.810888f, -0.810855f, -0.810823f, -0.81079f, -0.810757f, -0.810725f,
--0.810692f, -0.81066f, -0.810627f, -0.810595f, -0.810562f, -0.810529f, -0.810497f, -0.810464f, -0.810431f, -0.810399f, -0.810366f, -0.810333f, -0.810301f, -0.810268f, -0.810235f, -0.810202f, -0.81017f, -0.810137f, -0.810104f, -0.810071f,
--0.810038f, -0.810006f, -0.809973f, -0.80994f, -0.809907f, -0.809874f, -0.809841f, -0.809809f, -0.809776f, -0.809743f, -0.80971f, -0.809677f, -0.809644f, -0.809611f, -0.809578f, -0.809545f, -0.809512f, -0.809479f, -0.809446f, -0.809413f,
--0.80938f, -0.809347f, -0.809314f, -0.809281f, -0.809248f, -0.809215f, -0.809182f, -0.809149f, -0.809116f, -0.809083f, -0.809049f, -0.809016f, -0.808983f, -0.80895f, -0.808917f, -0.808884f, -0.80885f, -0.808817f, -0.808784f, -0.808751f,
--0.808717f, -0.808684f, -0.808651f, -0.808618f, -0.808584f, -0.808551f, -0.808518f, -0.808485f, -0.808451f, -0.808418f, -0.808384f, -0.808351f, -0.808318f, -0.808284f, -0.808251f, -0.808218f, -0.808184f, -0.808151f, -0.808117f, -0.808084f,
--0.80805f, -0.808017f, -0.807983f, -0.80795f, -0.807916f, -0.807883f, -0.807849f, -0.807816f, -0.807782f, -0.807749f, -0.807715f, -0.807682f, -0.807648f, -0.807614f, -0.807581f, -0.807547f, -0.807514f, -0.80748f, -0.807446f, -0.807413f,
--0.807379f, -0.807345f, -0.807312f, -0.807278f, -0.807244f, -0.80721f, -0.807177f, -0.807143f, -0.807109f, -0.807075f, -0.807042f, -0.807008f, -0.806974f, -0.80694f, -0.806906f, -0.806872f, -0.806839f, -0.806805f, -0.806771f, -0.806737f,
--0.806703f, -0.806669f, -0.806635f, -0.806601f, -0.806567f, -0.806533f, -0.806499f, -0.806465f, -0.806431f, -0.806397f, -0.806363f, -0.806329f, -0.806295f, -0.806261f, -0.806227f, -0.806193f, -0.806159f, -0.806125f, -0.806091f, -0.806057f,
--0.806023f, -0.805989f, -0.805954f, -0.80592f, -0.805886f, -0.805852f, -0.805818f, -0.805784f, -0.805749f, -0.805715f, -0.805681f, -0.805647f, -0.805612f, -0.805578f, -0.805544f, -0.80551f, -0.805475f, -0.805441f, -0.805407f, -0.805372f,
--0.805338f, -0.805304f, -0.805269f, -0.805235f, -0.805201f, -0.805166f, -0.805132f, -0.805097f, -0.805063f, -0.805029f, -0.804994f, -0.80496f, -0.804925f, -0.804891f, -0.804856f, -0.804822f, -0.804787f, -0.804753f, -0.804718f, -0.804684f,
--0.804649f, -0.804614f, -0.80458f, -0.804545f, -0.804511f, -0.804476f, -0.804441f, -0.804407f, -0.804372f, -0.804337f, -0.804303f, -0.804268f, -0.804233f, -0.804199f, -0.804164f, -0.804129f, -0.804095f, -0.80406f, -0.804025f, -0.80399f,
--0.803956f, -0.803921f, -0.803886f, -0.803851f, -0.803816f, -0.803781f, -0.803747f, -0.803712f, -0.803677f, -0.803642f, -0.803607f, -0.803572f, -0.803537f, -0.803502f, -0.803468f, -0.803433f, -0.803398f, -0.803363f, -0.803328f, -0.803293f,
--0.803258f, -0.803223f, -0.803188f, -0.803153f, -0.803118f, -0.803083f, -0.803048f, -0.803012f, -0.802977f, -0.802942f, -0.802907f, -0.802872f, -0.802837f, -0.802802f, -0.802767f, -0.802731f, -0.802696f, -0.802661f, -0.802626f, -0.802591f,
--0.802556f, -0.80252f, -0.802485f, -0.80245f, -0.802415f, -0.802379f, -0.802344f, -0.802309f, -0.802273f, -0.802238f, -0.802203f, -0.802167f, -0.802132f, -0.802097f, -0.802061f, -0.802026f, -0.801991f, -0.801955f, -0.80192f, -0.801884f,
--0.801849f, -0.801813f, -0.801778f, -0.801743f, -0.801707f, -0.801672f, -0.801636f, -0.801601f, -0.801565f, -0.80153f, -0.801494f, -0.801458f, -0.801423f, -0.801387f, -0.801352f, -0.801316f, -0.801281f, -0.801245f, -0.801209f, -0.801174f,
--0.801138f, -0.801102f, -0.801067f, -0.801031f, -0.800995f, -0.80096f, -0.800924f, -0.800888f, -0.800852f, -0.800817f, -0.800781f, -0.800745f, -0.800709f, -0.800674f, -0.800638f, -0.800602f, -0.800566f, -0.80053f, -0.800494f, -0.800459f,
--0.800423f, -0.800387f, -0.800351f, -0.800315f, -0.800279f, -0.800243f, -0.800207f, -0.800171f, -0.800135f, -0.800099f, -0.800063f, -0.800027f, -0.799991f, -0.799955f, -0.799919f, -0.799883f, -0.799847f, -0.799811f, -0.799775f, -0.799739f,
--0.799703f, -0.799667f, -0.799631f, -0.799595f, -0.799559f, -0.799522f, -0.799486f, -0.79945f, -0.799414f, -0.799378f, -0.799342f, -0.799305f, -0.799269f, -0.799233f, -0.799197f, -0.79916f, -0.799124f, -0.799088f, -0.799052f, -0.799015f,
--0.798979f, -0.798943f, -0.798906f, -0.79887f, -0.798834f, -0.798797f, -0.798761f, -0.798725f, -0.798688f, -0.798652f, -0.798615f, -0.798579f, -0.798542f, -0.798506f, -0.79847f, -0.798433f, -0.798397f, -0.79836f, -0.798324f, -0.798287f,
--0.798251f, -0.798214f, -0.798178f, -0.798141f, -0.798104f, -0.798068f, -0.798031f, -0.797995f, -0.797958f, -0.797921f, -0.797885f, -0.797848f, -0.797812f, -0.797775f, -0.797738f, -0.797701f, -0.797665f, -0.797628f, -0.797591f, -0.797555f,
--0.797518f, -0.797481f, -0.797444f, -0.797408f, -0.797371f, -0.797334f, -0.797297f, -0.79726f, -0.797224f, -0.797187f, -0.79715f, -0.797113f, -0.797076f, -0.797039f, -0.797002f, -0.796966f, -0.796929f, -0.796892f, -0.796855f, -0.796818f,
--0.796781f, -0.796744f, -0.796707f, -0.79667f, -0.796633f, -0.796596f, -0.796559f, -0.796522f, -0.796485f, -0.796448f, -0.796411f, -0.796374f, -0.796337f, -0.796299f, -0.796262f, -0.796225f, -0.796188f, -0.796151f, -0.796114f, -0.796077f,
--0.796039f, -0.796002f, -0.795965f, -0.795928f, -0.795891f, -0.795853f, -0.795816f, -0.795779f, -0.795742f, -0.795704f, -0.795667f, -0.79563f, -0.795592f, -0.795555f, -0.795518f, -0.795481f, -0.795443f, -0.795406f, -0.795368f, -0.795331f,
--0.795294f, -0.795256f, -0.795219f, -0.795181f, -0.795144f, -0.795107f, -0.795069f, -0.795032f, -0.794994f, -0.794957f, -0.794919f, -0.794882f, -0.794844f, -0.794807f, -0.794769f, -0.794732f, -0.794694f, -0.794656f, -0.794619f, -0.794581f,
--0.794544f, -0.794506f, -0.794468f, -0.794431f, -0.794393f, -0.794355f, -0.794318f, -0.79428f, -0.794242f, -0.794205f, -0.794167f, -0.794129f, -0.794091f, -0.794054f, -0.794016f, -0.793978f, -0.79394f, -0.793903f, -0.793865f, -0.793827f,
--0.793789f, -0.793751f, -0.793713f, -0.793676f, -0.793638f, -0.7936f, -0.793562f, -0.793524f, -0.793486f, -0.793448f, -0.79341f, -0.793372f, -0.793334f, -0.793296f, -0.793259f, -0.793221f, -0.793183f, -0.793145f, -0.793106f, -0.793068f,
--0.79303f, -0.792992f, -0.792954f, -0.792916f, -0.792878f, -0.79284f, -0.792802f, -0.792764f, -0.792726f, -0.792688f, -0.792649f, -0.792611f, -0.792573f, -0.792535f, -0.792497f, -0.792459f, -0.79242f, -0.792382f, -0.792344f, -0.792306f,
--0.792267f, -0.792229f, -0.792191f, -0.792153f, -0.792114f, -0.792076f, -0.792038f, -0.791999f, -0.791961f, -0.791923f, -0.791884f, -0.791846f, -0.791807f, -0.791769f, -0.791731f, -0.791692f, -0.791654f, -0.791615f, -0.791577f, -0.791538f,
--0.7915f, -0.791462f, -0.791423f, -0.791385f, -0.791346f, -0.791307f, -0.791269f, -0.79123f, -0.791192f, -0.791153f, -0.791115f, -0.791076f, -0.791037f, -0.790999f, -0.79096f, -0.790922f, -0.790883f, -0.790844f, -0.790806f, -0.790767f,
--0.790728f, -0.79069f, -0.790651f, -0.790612f, -0.790573f, -0.790535f, -0.790496f, -0.790457f, -0.790418f, -0.79038f, -0.790341f, -0.790302f, -0.790263f, -0.790224f, -0.790186f, -0.790147f, -0.790108f, -0.790069f, -0.79003f, -0.789991f,
--0.789952f, -0.789913f, -0.789874f, -0.789836f, -0.789797f, -0.789758f, -0.789719f, -0.78968f, -0.789641f, -0.789602f, -0.789563f, -0.789524f, -0.789485f, -0.789446f, -0.789407f, -0.789367f, -0.789328f, -0.789289f, -0.78925f, -0.789211f,
--0.789172f, -0.789133f, -0.789094f, -0.789055f, -0.789015f, -0.788976f, -0.788937f, -0.788898f, -0.788859f, -0.788819f, -0.78878f, -0.788741f, -0.788702f, -0.788662f, -0.788623f, -0.788584f, -0.788545f, -0.788505f, -0.788466f, -0.788427f,
--0.788387f, -0.788348f, -0.788309f, -0.788269f, -0.78823f, -0.788191f, -0.788151f, -0.788112f, -0.788072f, -0.788033f, -0.787993f, -0.787954f, -0.787915f, -0.787875f, -0.787836f, -0.787796f, -0.787757f, -0.787717f, -0.787678f, -0.787638f,
--0.787598f, -0.787559f, -0.787519f, -0.78748f, -0.78744f, -0.787401f, -0.787361f, -0.787321f, -0.787282f, -0.787242f, -0.787202f, -0.787163f, -0.787123f, -0.787083f, -0.787044f, -0.787004f, -0.786964f, -0.786924f, -0.786885f, -0.786845f,
--0.786805f, -0.786765f, -0.786726f, -0.786686f, -0.786646f, -0.786606f, -0.786566f, -0.786527f, -0.786487f, -0.786447f, -0.786407f, -0.786367f, -0.786327f, -0.786287f, -0.786247f, -0.786208f, -0.786168f, -0.786128f, -0.786088f, -0.786048f,
--0.786008f, -0.785968f, -0.785928f, -0.785888f, -0.785848f, -0.785808f, -0.785768f, -0.785728f, -0.785688f, -0.785647f, -0.785607f, -0.785567f, -0.785527f, -0.785487f, -0.785447f, -0.785407f, -0.785367f, -0.785326f, -0.785286f, -0.785246f,
--0.785206f, -0.785166f, -0.785126f, -0.785085f, -0.785045f, -0.785005f, -0.784965f, -0.784924f, -0.784884f, -0.784844f, -0.784803f, -0.784763f, -0.784723f, -0.784682f, -0.784642f, -0.784602f, -0.784561f, -0.784521f, -0.784481f, -0.78444f,
--0.7844f, -0.784359f, -0.784319f, -0.784279f, -0.784238f, -0.784198f, -0.784157f, -0.784117f, -0.784076f, -0.784036f, -0.783995f, -0.783955f, -0.783914f, -0.783874f, -0.783833f, -0.783793f, -0.783752f, -0.783711f, -0.783671f, -0.78363f,
--0.78359f, -0.783549f, -0.783508f, -0.783468f, -0.783427f, -0.783386f, -0.783346f, -0.783305f, -0.783264f, -0.783223f, -0.783183f, -0.783142f, -0.783101f, -0.783061f, -0.78302f, -0.782979f, -0.782938f, -0.782897f, -0.782857f, -0.782816f,
--0.782775f, -0.782734f, -0.782693f, -0.782652f, -0.782611f, -0.782571f, -0.78253f, -0.782489f, -0.782448f, -0.782407f, -0.782366f, -0.782325f, -0.782284f, -0.782243f, -0.782202f, -0.782161f, -0.78212f, -0.782079f, -0.782038f, -0.781997f,
--0.781956f, -0.781915f, -0.781874f, -0.781833f, -0.781792f, -0.781751f, -0.78171f, -0.781668f, -0.781627f, -0.781586f, -0.781545f, -0.781504f, -0.781463f, -0.781421f, -0.78138f, -0.781339f, -0.781298f, -0.781257f, -0.781215f, -0.781174f,
--0.781133f, -0.781092f, -0.78105f, -0.781009f, -0.780968f, -0.780926f, -0.780885f, -0.780844f, -0.780802f, -0.780761f, -0.78072f, -0.780678f, -0.780637f, -0.780596f, -0.780554f, -0.780513f, -0.780471f, -0.78043f, -0.780388f, -0.780347f,
--0.780305f, -0.780264f, -0.780223f, -0.780181f, -0.780139f, -0.780098f, -0.780056f, -0.780015f, -0.779973f, -0.779932f, -0.77989f, -0.779849f, -0.779807f, -0.779765f, -0.779724f, -0.779682f, -0.77964f, -0.779599f, -0.779557f, -0.779516f,
--0.779474f, -0.779432f, -0.77939f, -0.779349f, -0.779307f, -0.779265f, -0.779223f, -0.779182f, -0.77914f, -0.779098f, -0.779056f, -0.779015f, -0.778973f, -0.778931f, -0.778889f, -0.778847f, -0.778805f, -0.778764f, -0.778722f, -0.77868f,
--0.778638f, -0.778596f, -0.778554f, -0.778512f, -0.77847f, -0.778428f, -0.778386f, -0.778344f, -0.778302f, -0.77826f, -0.778218f, -0.778176f, -0.778134f, -0.778092f, -0.77805f, -0.778008f, -0.777966f, -0.777924f, -0.777882f, -0.77784f,
--0.777798f, -0.777756f, -0.777713f, -0.777671f, -0.777629f, -0.777587f, -0.777545f, -0.777503f, -0.77746f, -0.777418f, -0.777376f, -0.777334f, -0.777292f, -0.777249f, -0.777207f, -0.777165f, -0.777123f, -0.77708f, -0.777038f, -0.776996f,
--0.776953f, -0.776911f, -0.776869f, -0.776826f, -0.776784f, -0.776742f, -0.776699f, -0.776657f, -0.776614f, -0.776572f, -0.77653f, -0.776487f, -0.776445f, -0.776402f, -0.77636f, -0.776317f, -0.776275f, -0.776232f, -0.77619f, -0.776147f,
--0.776105f, -0.776062f, -0.77602f, -0.775977f, -0.775934f, -0.775892f, -0.775849f, -0.775807f, -0.775764f, -0.775721f, -0.775679f, -0.775636f, -0.775593f, -0.775551f, -0.775508f, -0.775465f, -0.775423f, -0.77538f, -0.775337f, -0.775295f,
--0.775252f, -0.775209f, -0.775166f, -0.775124f, -0.775081f, -0.775038f, -0.774995f, -0.774952f, -0.774909f, -0.774867f, -0.774824f, -0.774781f, -0.774738f, -0.774695f, -0.774652f, -0.774609f, -0.774566f, -0.774524f, -0.774481f, -0.774438f,
--0.774395f, -0.774352f, -0.774309f, -0.774266f, -0.774223f, -0.77418f, -0.774137f, -0.774094f, -0.774051f, -0.774008f, -0.773965f, -0.773921f, -0.773878f, -0.773835f, -0.773792f, -0.773749f, -0.773706f, -0.773663f, -0.77362f, -0.773577f,
--0.773533f, -0.77349f, -0.773447f, -0.773404f, -0.773361f, -0.773317f, -0.773274f, -0.773231f, -0.773188f, -0.773144f, -0.773101f, -0.773058f, -0.773015f, -0.772971f, -0.772928f, -0.772885f, -0.772841f, -0.772798f, -0.772755f, -0.772711f,
--0.772668f, -0.772624f, -0.772581f, -0.772538f, -0.772494f, -0.772451f, -0.772407f, -0.772364f, -0.77232f, -0.772277f, -0.772233f, -0.77219f, -0.772146f, -0.772103f, -0.772059f, -0.772016f, -0.771972f, -0.771929f, -0.771885f, -0.771842f,
--0.771798f, -0.771754f, -0.771711f, -0.771667f, -0.771624f, -0.77158f, -0.771536f, -0.771493f, -0.771449f, -0.771405f, -0.771362f, -0.771318f, -0.771274f, -0.77123f, -0.771187f, -0.771143f, -0.771099f, -0.771055f, -0.771012f, -0.770968f,
--0.770924f, -0.77088f, -0.770836f, -0.770793f, -0.770749f, -0.770705f, -0.770661f, -0.770617f, -0.770573f, -0.770529f, -0.770485f, -0.770442f, -0.770398f, -0.770354f, -0.77031f, -0.770266f, -0.770222f, -0.770178f, -0.770134f, -0.77009f,
--0.770046f, -0.770002f, -0.769958f, -0.769914f, -0.76987f, -0.769826f, -0.769782f, -0.769738f, -0.769693f, -0.769649f, -0.769605f, -0.769561f, -0.769517f, -0.769473f, -0.769429f, -0.769384f, -0.76934f, -0.769296f, -0.769252f, -0.769208f,
--0.769163f, -0.769119f, -0.769075f, -0.769031f, -0.768986f, -0.768942f, -0.768898f, -0.768854f, -0.768809f, -0.768765f, -0.768721f, -0.768676f, -0.768632f, -0.768588f, -0.768543f, -0.768499f, -0.768455f, -0.76841f, -0.768366f, -0.768321f,
--0.768277f, -0.768232f, -0.768188f, -0.768144f, -0.768099f, -0.768055f, -0.76801f, -0.767966f, -0.767921f, -0.767877f, -0.767832f, -0.767787f, -0.767743f, -0.767698f, -0.767654f, -0.767609f, -0.767565f, -0.76752f, -0.767475f, -0.767431f,
--0.767386f, -0.767341f, -0.767297f, -0.767252f, -0.767207f, -0.767163f, -0.767118f, -0.767073f, -0.767029f, -0.766984f, -0.766939f, -0.766894f, -0.76685f, -0.766805f, -0.76676f, -0.766715f, -0.76667f, -0.766626f, -0.766581f, -0.766536f,
--0.766491f, -0.766446f, -0.766401f, -0.766357f, -0.766312f, -0.766267f, -0.766222f, -0.766177f, -0.766132f, -0.766087f, -0.766042f, -0.765997f, -0.765952f, -0.765907f, -0.765862f, -0.765817f, -0.765772f, -0.765727f, -0.765682f, -0.765637f,
--0.765592f, -0.765547f, -0.765502f, -0.765457f, -0.765412f, -0.765367f, -0.765321f, -0.765276f, -0.765231f, -0.765186f, -0.765141f, -0.765096f, -0.76505f, -0.765005f, -0.76496f, -0.764915f, -0.76487f, -0.764824f, -0.764779f, -0.764734f,
--0.764689f, -0.764643f, -0.764598f, -0.764553f, -0.764507f, -0.764462f, -0.764417f, -0.764371f, -0.764326f, -0.764281f, -0.764235f, -0.76419f, -0.764145f, -0.764099f, -0.764054f, -0.764008f, -0.763963f, -0.763918f, -0.763872f, -0.763827f,
--0.763781f, -0.763736f, -0.76369f, -0.763645f, -0.763599f, -0.763554f, -0.763508f, -0.763463f, -0.763417f, -0.763371f, -0.763326f, -0.76328f, -0.763235f, -0.763189f, -0.763143f, -0.763098f, -0.763052f, -0.763006f, -0.762961f, -0.762915f,
--0.762869f, -0.762824f, -0.762778f, -0.762732f, -0.762687f, -0.762641f, -0.762595f, -0.762549f, -0.762504f, -0.762458f, -0.762412f, -0.762366f, -0.76232f, -0.762275f, -0.762229f, -0.762183f, -0.762137f, -0.762091f, -0.762045f, -0.761999f,
--0.761954f, -0.761908f, -0.761862f, -0.761816f, -0.76177f, -0.761724f, -0.761678f, -0.761632f, -0.761586f, -0.76154f, -0.761494f, -0.761448f, -0.761402f, -0.761356f, -0.76131f, -0.761264f, -0.761218f, -0.761172f, -0.761126f, -0.76108f,
--0.761034f, -0.760987f, -0.760941f, -0.760895f, -0.760849f, -0.760803f, -0.760757f, -0.760711f, -0.760664f, -0.760618f, -0.760572f, -0.760526f, -0.76048f, -0.760433f, -0.760387f, -0.760341f, -0.760295f, -0.760248f, -0.760202f, -0.760156f,
--0.760109f, -0.760063f, -0.760017f, -0.75997f, -0.759924f, -0.759878f, -0.759831f, -0.759785f, -0.759739f, -0.759692f, -0.759646f, -0.759599f, -0.759553f, -0.759507f, -0.75946f, -0.759414f, -0.759367f, -0.759321f, -0.759274f, -0.759228f,
--0.759181f, -0.759135f, -0.759088f, -0.759042f, -0.758995f, -0.758948f, -0.758902f, -0.758855f, -0.758809f, -0.758762f, -0.758715f, -0.758669f, -0.758622f, -0.758576f, -0.758529f, -0.758482f, -0.758435f, -0.758389f, -0.758342f, -0.758295f,
--0.758249f, -0.758202f, -0.758155f, -0.758108f, -0.758062f, -0.758015f, -0.757968f, -0.757921f, -0.757875f, -0.757828f, -0.757781f, -0.757734f, -0.757687f, -0.75764f, -0.757593f, -0.757547f, -0.7575f, -0.757453f, -0.757406f, -0.757359f,
--0.757312f, -0.757265f, -0.757218f, -0.757171f, -0.757124f, -0.757077f, -0.75703f, -0.756983f, -0.756936f, -0.756889f, -0.756842f, -0.756795f, -0.756748f, -0.756701f, -0.756654f, -0.756607f, -0.75656f, -0.756513f, -0.756466f, -0.756418f,
--0.756371f, -0.756324f, -0.756277f, -0.75623f, -0.756183f, -0.756136f, -0.756088f, -0.756041f, -0.755994f, -0.755947f, -0.755899f, -0.755852f, -0.755805f, -0.755758f, -0.75571f, -0.755663f, -0.755616f, -0.755568f, -0.755521f, -0.755474f,
--0.755426f, -0.755379f, -0.755332f, -0.755284f, -0.755237f, -0.75519f, -0.755142f, -0.755095f, -0.755047f, -0.755f, -0.754953f, -0.754905f, -0.754858f, -0.75481f, -0.754763f, -0.754715f, -0.754668f, -0.75462f, -0.754573f, -0.754525f,
--0.754477f, -0.75443f, -0.754382f, -0.754335f, -0.754287f, -0.75424f, -0.754192f, -0.754144f, -0.754097f, -0.754049f, -0.754001f, -0.753954f, -0.753906f, -0.753858f, -0.753811f, -0.753763f, -0.753715f, -0.753668f, -0.75362f, -0.753572f,
--0.753524f, -0.753477f, -0.753429f, -0.753381f, -0.753333f, -0.753285f, -0.753238f, -0.75319f, -0.753142f, -0.753094f, -0.753046f, -0.752998f, -0.752951f, -0.752903f, -0.752855f, -0.752807f, -0.752759f, -0.752711f, -0.752663f, -0.752615f,
--0.752567f, -0.752519f, -0.752471f, -0.752423f, -0.752375f, -0.752327f, -0.752279f, -0.752231f, -0.752183f, -0.752135f, -0.752087f, -0.752039f, -0.751991f, -0.751943f, -0.751895f, -0.751847f, -0.751798f, -0.75175f, -0.751702f, -0.751654f,
--0.751606f, -0.751558f, -0.751509f, -0.751461f, -0.751413f, -0.751365f, -0.751317f, -0.751268f, -0.75122f, -0.751172f, -0.751124f, -0.751075f, -0.751027f, -0.750979f, -0.75093f, -0.750882f, -0.750834f, -0.750785f, -0.750737f, -0.750689f,
--0.75064f, -0.750592f, -0.750544f, -0.750495f, -0.750447f, -0.750398f, -0.75035f, -0.750302f, -0.750253f, -0.750205f, -0.750156f, -0.750108f, -0.750059f, -0.750011f, -0.749962f, -0.749914f, -0.749865f, -0.749817f, -0.749768f, -0.749719f,
--0.749671f, -0.749622f, -0.749574f, -0.749525f, -0.749476f, -0.749428f, -0.749379f, -0.749331f, -0.749282f, -0.749233f, -0.749185f, -0.749136f, -0.749087f, -0.749038f, -0.74899f, -0.748941f, -0.748892f, -0.748844f, -0.748795f, -0.748746f,
--0.748697f, -0.748648f, -0.7486f, -0.748551f, -0.748502f, -0.748453f, -0.748404f, -0.748355f, -0.748307f, -0.748258f, -0.748209f, -0.74816f, -0.748111f, -0.748062f, -0.748013f, -0.747964f, -0.747915f, -0.747866f, -0.747817f, -0.747768f,
--0.747719f, -0.74767f, -0.747621f, -0.747572f, -0.747523f, -0.747474f, -0.747425f, -0.747376f, -0.747327f, -0.747278f, -0.747229f, -0.74718f, -0.747131f, -0.747082f, -0.747033f, -0.746984f, -0.746934f, -0.746885f, -0.746836f, -0.746787f,
--0.746738f, -0.746688f, -0.746639f, -0.74659f, -0.746541f, -0.746492f, -0.746442f, -0.746393f, -0.746344f, -0.746295f, -0.746245f, -0.746196f, -0.746147f, -0.746097f, -0.746048f, -0.745999f, -0.745949f, -0.7459f, -0.745851f, -0.745801f,
--0.745752f, -0.745702f, -0.745653f, -0.745604f, -0.745554f, -0.745505f, -0.745455f, -0.745406f, -0.745356f, -0.745307f, -0.745257f, -0.745208f, -0.745158f, -0.745109f, -0.745059f, -0.74501f, -0.74496f, -0.744911f, -0.744861f, -0.744811f,
--0.744762f, -0.744712f, -0.744663f, -0.744613f, -0.744563f, -0.744514f, -0.744464f, -0.744414f, -0.744365f, -0.744315f, -0.744265f, -0.744216f, -0.744166f, -0.744116f, -0.744066f, -0.744017f, -0.743967f, -0.743917f, -0.743867f, -0.743818f,
--0.743768f, -0.743718f, -0.743668f, -0.743618f, -0.743568f, -0.743519f, -0.743469f, -0.743419f, -0.743369f, -0.743319f, -0.743269f, -0.743219f, -0.743169f, -0.743119f, -0.74307f, -0.74302f, -0.74297f, -0.74292f, -0.74287f, -0.74282f,
--0.74277f, -0.74272f, -0.74267f, -0.74262f, -0.74257f, -0.74252f, -0.742469f, -0.742419f, -0.742369f, -0.742319f, -0.742269f, -0.742219f, -0.742169f, -0.742119f, -0.742069f, -0.742018f, -0.741968f, -0.741918f, -0.741868f, -0.741818f,
--0.741767f, -0.741717f, -0.741667f, -0.741617f, -0.741567f, -0.741516f, -0.741466f, -0.741416f, -0.741365f, -0.741315f, -0.741265f, -0.741215f, -0.741164f, -0.741114f, -0.741064f, -0.741013f, -0.740963f, -0.740912f, -0.740862f, -0.740812f,
--0.740761f, -0.740711f, -0.74066f, -0.74061f, -0.74056f, -0.740509f, -0.740459f, -0.740408f, -0.740358f, -0.740307f, -0.740257f, -0.740206f, -0.740156f, -0.740105f, -0.740055f, -0.740004f, -0.739953f, -0.739903f, -0.739852f, -0.739802f,
--0.739751f, -0.7397f, -0.73965f, -0.739599f, -0.739548f, -0.739498f, -0.739447f, -0.739396f, -0.739346f, -0.739295f, -0.739244f, -0.739194f, -0.739143f, -0.739092f, -0.739041f, -0.738991f, -0.73894f, -0.738889f, -0.738838f, -0.738788f,
--0.738737f, -0.738686f, -0.738635f, -0.738584f, -0.738533f, -0.738482f, -0.738432f, -0.738381f, -0.73833f, -0.738279f, -0.738228f, -0.738177f, -0.738126f, -0.738075f, -0.738024f, -0.737973f, -0.737922f, -0.737871f, -0.73782f, -0.737769f,
--0.737718f, -0.737667f, -0.737616f, -0.737565f, -0.737514f, -0.737463f, -0.737412f, -0.737361f, -0.73731f, -0.737259f, -0.737208f, -0.737157f, -0.737105f, -0.737054f, -0.737003f, -0.736952f, -0.736901f, -0.73685f, -0.736798f, -0.736747f,
--0.736696f, -0.736645f, -0.736594f, -0.736542f, -0.736491f, -0.73644f, -0.736388f, -0.736337f, -0.736286f, -0.736235f, -0.736183f, -0.736132f, -0.736081f, -0.736029f, -0.735978f, -0.735927f, -0.735875f, -0.735824f, -0.735772f, -0.735721f,
--0.73567f, -0.735618f, -0.735567f, -0.735515f, -0.735464f, -0.735412f, -0.735361f, -0.735309f, -0.735258f, -0.735206f, -0.735155f, -0.735103f, -0.735052f, -0.735f, -0.734949f, -0.734897f, -0.734846f, -0.734794f, -0.734742f, -0.734691f,
--0.734639f, -0.734588f, -0.734536f, -0.734484f, -0.734433f, -0.734381f, -0.734329f, -0.734278f, -0.734226f, -0.734174f, -0.734122f, -0.734071f, -0.734019f, -0.733967f, -0.733915f, -0.733864f, -0.733812f, -0.73376f, -0.733708f, -0.733657f,
--0.733605f, -0.733553f, -0.733501f, -0.733449f, -0.733397f, -0.733345f, -0.733294f, -0.733242f, -0.73319f, -0.733138f, -0.733086f, -0.733034f, -0.732982f, -0.73293f, -0.732878f, -0.732826f, -0.732774f, -0.732722f, -0.73267f, -0.732618f,
--0.732566f, -0.732514f, -0.732462f, -0.73241f, -0.732358f, -0.732306f, -0.732254f, -0.732202f, -0.73215f, -0.732098f, -0.732046f, -0.731993f, -0.731941f, -0.731889f, -0.731837f, -0.731785f, -0.731733f, -0.73168f, -0.731628f, -0.731576f,
--0.731524f, -0.731472f, -0.731419f, -0.731367f, -0.731315f, -0.731263f, -0.73121f, -0.731158f, -0.731106f, -0.731053f, -0.731001f, -0.730949f, -0.730896f, -0.730844f, -0.730792f, -0.730739f, -0.730687f, -0.730635f, -0.730582f, -0.73053f,
--0.730477f, -0.730425f, -0.730372f, -0.73032f, -0.730268f, -0.730215f, -0.730163f, -0.73011f, -0.730058f, -0.730005f, -0.729953f, -0.7299f, -0.729848f, -0.729795f, -0.729742f, -0.72969f, -0.729637f, -0.729585f, -0.729532f, -0.729479f,
--0.729427f, -0.729374f, -0.729322f, -0.729269f, -0.729216f, -0.729164f, -0.729111f, -0.729058f, -0.729006f, -0.728953f, -0.7289f, -0.728847f, -0.728795f, -0.728742f, -0.728689f, -0.728636f, -0.728584f, -0.728531f, -0.728478f, -0.728425f,
--0.728372f, -0.72832f, -0.728267f, -0.728214f, -0.728161f, -0.728108f, -0.728055f, -0.728002f, -0.72795f, -0.727897f, -0.727844f, -0.727791f, -0.727738f, -0.727685f, -0.727632f, -0.727579f, -0.727526f, -0.727473f, -0.72742f, -0.727367f,
--0.727314f, -0.727261f, -0.727208f, -0.727155f, -0.727102f, -0.727049f, -0.726996f, -0.726943f, -0.726889f, -0.726836f, -0.726783f, -0.72673f, -0.726677f, -0.726624f, -0.726571f, -0.726518f, -0.726464f, -0.726411f, -0.726358f, -0.726305f,
--0.726252f, -0.726198f, -0.726145f, -0.726092f, -0.726039f, -0.725985f, -0.725932f, -0.725879f, -0.725825f, -0.725772f, -0.725719f, -0.725666f, -0.725612f, -0.725559f, -0.725506f, -0.725452f, -0.725399f, -0.725345f, -0.725292f, -0.725239f,
--0.725185f, -0.725132f, -0.725078f, -0.725025f, -0.724971f, -0.724918f, -0.724865f, -0.724811f, -0.724758f, -0.724704f, -0.724651f, -0.724597f, -0.724543f, -0.72449f, -0.724436f, -0.724383f, -0.724329f, -0.724276f, -0.724222f, -0.724168f,
--0.724115f, -0.724061f, -0.724008f, -0.723954f, -0.7239f, -0.723847f, -0.723793f, -0.723739f, -0.723686f, -0.723632f, -0.723578f, -0.723524f, -0.723471f, -0.723417f, -0.723363f, -0.723309f, -0.723256f, -0.723202f, -0.723148f, -0.723094f,
--0.723041f, -0.722987f, -0.722933f, -0.722879f, -0.722825f, -0.722771f, -0.722717f, -0.722664f, -0.72261f, -0.722556f, -0.722502f, -0.722448f, -0.722394f, -0.72234f, -0.722286f, -0.722232f, -0.722178f, -0.722124f, -0.72207f, -0.722016f,
--0.721962f, -0.721908f, -0.721854f, -0.7218f, -0.721746f, -0.721692f, -0.721638f, -0.721584f, -0.72153f, -0.721476f, -0.721422f, -0.721368f, -0.721313f, -0.721259f, -0.721205f, -0.721151f, -0.721097f, -0.721043f, -0.720988f, -0.720934f,
--0.72088f, -0.720826f, -0.720772f, -0.720717f, -0.720663f, -0.720609f, -0.720555f, -0.7205f, -0.720446f, -0.720392f, -0.720337f, -0.720283f, -0.720229f, -0.720174f, -0.72012f, -0.720066f, -0.720011f, -0.719957f, -0.719903f, -0.719848f,
--0.719794f, -0.719739f, -0.719685f, -0.719631f, -0.719576f, -0.719522f, -0.719467f, -0.719413f, -0.719358f, -0.719304f, -0.719249f, -0.719195f, -0.71914f, -0.719086f, -0.719031f, -0.718977f, -0.718922f, -0.718868f, -0.718813f, -0.718758f,
--0.718704f, -0.718649f, -0.718595f, -0.71854f, -0.718485f, -0.718431f, -0.718376f, -0.718321f, -0.718267f, -0.718212f, -0.718157f, -0.718103f, -0.718048f, -0.717993f, -0.717938f, -0.717884f, -0.717829f, -0.717774f, -0.717719f, -0.717665f,
--0.71761f, -0.717555f, -0.7175f, -0.717445f, -0.71739f, -0.717336f, -0.717281f, -0.717226f, -0.717171f, -0.717116f, -0.717061f, -0.717006f, -0.716951f, -0.716897f, -0.716842f, -0.716787f, -0.716732f, -0.716677f, -0.716622f, -0.716567f,
--0.716512f, -0.716457f, -0.716402f, -0.716347f, -0.716292f, -0.716237f, -0.716182f, -0.716127f, -0.716072f, -0.716016f, -0.715961f, -0.715906f, -0.715851f, -0.715796f, -0.715741f, -0.715686f, -0.715631f, -0.715575f, -0.71552f, -0.715465f,
--0.71541f, -0.715355f, -0.7153f, -0.715244f, -0.715189f, -0.715134f, -0.715079f, -0.715023f, -0.714968f, -0.714913f, -0.714858f, -0.714802f, -0.714747f, -0.714692f, -0.714636f, -0.714581f, -0.714526f, -0.71447f, -0.714415f, -0.71436f,
--0.714304f, -0.714249f, -0.714193f, -0.714138f, -0.714083f, -0.714027f, -0.713972f, -0.713916f, -0.713861f, -0.713805f, -0.71375f, -0.713694f, -0.713639f, -0.713583f, -0.713528f, -0.713472f, -0.713417f, -0.713361f, -0.713306f, -0.71325f,
--0.713194f, -0.713139f, -0.713083f, -0.713028f, -0.712972f, -0.712916f, -0.712861f, -0.712805f, -0.712749f, -0.712694f, -0.712638f, -0.712582f, -0.712527f, -0.712471f, -0.712415f, -0.71236f, -0.712304f, -0.712248f, -0.712192f, -0.712137f,
--0.712081f, -0.712025f, -0.711969f, -0.711913f, -0.711858f, -0.711802f, -0.711746f, -0.71169f, -0.711634f, -0.711578f, -0.711523f, -0.711467f, -0.711411f, -0.711355f, -0.711299f, -0.711243f, -0.711187f, -0.711131f, -0.711075f, -0.711019f,
--0.710963f, -0.710907f, -0.710851f, -0.710795f, -0.710739f, -0.710683f, -0.710627f, -0.710571f, -0.710515f, -0.710459f, -0.710403f, -0.710347f, -0.710291f, -0.710235f, -0.710179f, -0.710123f, -0.710067f, -0.71001f, -0.709954f, -0.709898f,
--0.709842f, -0.709786f, -0.70973f, -0.709673f, -0.709617f, -0.709561f, -0.709505f, -0.709449f, -0.709392f, -0.709336f, -0.70928f, -0.709223f, -0.709167f, -0.709111f, -0.709055f, -0.708998f, -0.708942f, -0.708886f, -0.708829f, -0.708773f,
--0.708717f, -0.70866f, -0.708604f, -0.708548f, -0.708491f, -0.708435f, -0.708378f, -0.708322f, -0.708265f, -0.708209f, -0.708153f, -0.708096f, -0.70804f, -0.707983f, -0.707927f, -0.70787f, -0.707814f, -0.707757f, -0.707701f, -0.707644f,
--0.707587f, -0.707531f, -0.707474f, -0.707418f, -0.707361f, -0.707305f, -0.707248f, -0.707191f, -0.707135f, -0.707078f, -0.707021f, -0.706965f, -0.706908f, -0.706851f, -0.706795f, -0.706738f, -0.706681f, -0.706625f, -0.706568f, -0.706511f,
--0.706454f, -0.706398f, -0.706341f, -0.706284f, -0.706227f, -0.706171f, -0.706114f, -0.706057f, -0.706f, -0.705943f, -0.705886f, -0.70583f, -0.705773f, -0.705716f, -0.705659f, -0.705602f, -0.705545f, -0.705488f, -0.705431f, -0.705374f,
--0.705318f, -0.705261f, -0.705204f, -0.705147f, -0.70509f, -0.705033f, -0.704976f, -0.704919f, -0.704862f, -0.704805f, -0.704748f, -0.704691f, -0.704634f, -0.704576f, -0.704519f, -0.704462f, -0.704405f, -0.704348f, -0.704291f, -0.704234f,
--0.704177f, -0.70412f, -0.704062f, -0.704005f, -0.703948f, -0.703891f, -0.703834f, -0.703777f, -0.703719f, -0.703662f, -0.703605f, -0.703548f, -0.70349f, -0.703433f, -0.703376f, -0.703319f, -0.703261f, -0.703204f, -0.703147f, -0.703089f,
--0.703032f, -0.702975f, -0.702917f, -0.70286f, -0.702803f, -0.702745f, -0.702688f, -0.702631f, -0.702573f, -0.702516f, -0.702458f, -0.702401f, -0.702344f, -0.702286f, -0.702229f, -0.702171f, -0.702114f, -0.702056f, -0.701999f, -0.701941f,
--0.701884f, -0.701826f, -0.701769f, -0.701711f, -0.701653f, -0.701596f, -0.701538f, -0.701481f, -0.701423f, -0.701366f, -0.701308f, -0.70125f, -0.701193f, -0.701135f, -0.701077f, -0.70102f, -0.700962f, -0.700904f, -0.700847f, -0.700789f,
--0.700731f, -0.700674f, -0.700616f, -0.700558f, -0.7005f, -0.700443f, -0.700385f, -0.700327f, -0.700269f, -0.700212f, -0.700154f, -0.700096f, -0.700038f, -0.69998f, -0.699922f, -0.699865f, -0.699807f, -0.699749f, -0.699691f, -0.699633f,
--0.699575f, -0.699517f, -0.699459f, -0.699401f, -0.699343f, -0.699286f, -0.699228f, -0.69917f, -0.699112f, -0.699054f, -0.698996f, -0.698938f, -0.69888f, -0.698822f, -0.698764f, -0.698706f, -0.698647f, -0.698589f, -0.698531f, -0.698473f,
--0.698415f, -0.698357f, -0.698299f, -0.698241f, -0.698183f, -0.698125f, -0.698066f, -0.698008f, -0.69795f, -0.697892f, -0.697834f, -0.697776f, -0.697717f, -0.697659f, -0.697601f, -0.697543f, -0.697484f, -0.697426f, -0.697368f, -0.69731f,
--0.697251f, -0.697193f, -0.697135f, -0.697076f, -0.697018f, -0.69696f, -0.696901f, -0.696843f, -0.696785f, -0.696726f, -0.696668f, -0.69661f, -0.696551f, -0.696493f, -0.696434f, -0.696376f, -0.696318f, -0.696259f, -0.696201f, -0.696142f,
--0.696084f, -0.696025f, -0.695967f, -0.695908f, -0.69585f, -0.695791f, -0.695733f, -0.695674f, -0.695616f, -0.695557f, -0.695498f, -0.69544f, -0.695381f, -0.695323f, -0.695264f, -0.695206f, -0.695147f, -0.695088f, -0.69503f, -0.694971f,
--0.694912f, -0.694854f, -0.694795f, -0.694736f, -0.694678f, -0.694619f, -0.69456f, -0.694501f, -0.694443f, -0.694384f, -0.694325f, -0.694266f, -0.694208f, -0.694149f, -0.69409f, -0.694031f, -0.693972f, -0.693914f, -0.693855f, -0.693796f,
--0.693737f, -0.693678f, -0.693619f, -0.69356f, -0.693502f, -0.693443f, -0.693384f, -0.693325f, -0.693266f, -0.693207f, -0.693148f, -0.693089f, -0.69303f, -0.692971f, -0.692912f, -0.692853f, -0.692794f, -0.692735f, -0.692676f, -0.692617f,
--0.692558f, -0.692499f, -0.69244f, -0.692381f, -0.692322f, -0.692263f, -0.692204f, -0.692144f, -0.692085f, -0.692026f, -0.691967f, -0.691908f, -0.691849f, -0.69179f, -0.69173f, -0.691671f, -0.691612f, -0.691553f, -0.691494f, -0.691434f,
--0.691375f, -0.691316f, -0.691257f, -0.691197f, -0.691138f, -0.691079f, -0.69102f, -0.69096f, -0.690901f, -0.690842f, -0.690782f, -0.690723f, -0.690664f, -0.690604f, -0.690545f, -0.690485f, -0.690426f, -0.690367f, -0.690307f, -0.690248f,
--0.690188f, -0.690129f, -0.69007f, -0.69001f, -0.689951f, -0.689891f, -0.689832f, -0.689772f, -0.689713f, -0.689653f, -0.689594f, -0.689534f, -0.689475f, -0.689415f, -0.689356f, -0.689296f, -0.689236f, -0.689177f, -0.689117f, -0.689058f,
--0.688998f, -0.688938f, -0.688879f, -0.688819f, -0.68876f, -0.6887f, -0.68864f, -0.688581f, -0.688521f, -0.688461f, -0.688401f, -0.688342f, -0.688282f, -0.688222f, -0.688162f, -0.688103f, -0.688043f, -0.687983f, -0.687923f, -0.687864f,
--0.687804f, -0.687744f, -0.687684f, -0.687624f, -0.687565f, -0.687505f, -0.687445f, -0.687385f, -0.687325f, -0.687265f, -0.687205f, -0.687145f, -0.687086f, -0.687026f, -0.686966f, -0.686906f, -0.686846f, -0.686786f, -0.686726f, -0.686666f,
--0.686606f, -0.686546f, -0.686486f, -0.686426f, -0.686366f, -0.686306f, -0.686246f, -0.686186f, -0.686126f, -0.686066f, -0.686005f, -0.685945f, -0.685885f, -0.685825f, -0.685765f, -0.685705f, -0.685645f, -0.685585f, -0.685524f, -0.685464f,
--0.685404f, -0.685344f, -0.685284f, -0.685224f, -0.685163f, -0.685103f, -0.685043f, -0.684983f, -0.684922f, -0.684862f, -0.684802f, -0.684742f, -0.684681f, -0.684621f, -0.684561f, -0.6845f, -0.68444f, -0.68438f, -0.684319f, -0.684259f,
--0.684199f, -0.684138f, -0.684078f, -0.684017f, -0.683957f, -0.683897f, -0.683836f, -0.683776f, -0.683715f, -0.683655f, -0.683594f, -0.683534f, -0.683474f, -0.683413f, -0.683353f, -0.683292f, -0.683232f, -0.683171f, -0.68311f, -0.68305f,
--0.682989f, -0.682929f, -0.682868f, -0.682808f, -0.682747f, -0.682687f, -0.682626f, -0.682565f, -0.682505f, -0.682444f, -0.682383f, -0.682323f, -0.682262f, -0.682201f, -0.682141f, -0.68208f, -0.682019f, -0.681959f, -0.681898f, -0.681837f,
--0.681776f, -0.681716f, -0.681655f, -0.681594f, -0.681533f, -0.681473f, -0.681412f, -0.681351f, -0.68129f, -0.681229f, -0.681169f, -0.681108f, -0.681047f, -0.680986f, -0.680925f, -0.680864f, -0.680803f, -0.680742f, -0.680682f, -0.680621f,
--0.68056f, -0.680499f, -0.680438f, -0.680377f, -0.680316f, -0.680255f, -0.680194f, -0.680133f, -0.680072f, -0.680011f, -0.67995f, -0.679889f, -0.679828f, -0.679767f, -0.679706f, -0.679645f, -0.679584f, -0.679523f, -0.679461f, -0.6794f,
--0.679339f, -0.679278f, -0.679217f, -0.679156f, -0.679095f, -0.679034f, -0.678972f, -0.678911f, -0.67885f, -0.678789f, -0.678728f, -0.678666f, -0.678605f, -0.678544f, -0.678483f, -0.678421f, -0.67836f, -0.678299f, -0.678238f, -0.678176f,
--0.678115f, -0.678054f, -0.677992f, -0.677931f, -0.67787f, -0.677808f, -0.677747f, -0.677686f, -0.677624f, -0.677563f, -0.677502f, -0.67744f, -0.677379f, -0.677317f, -0.677256f, -0.677194f, -0.677133f, -0.677072f, -0.67701f, -0.676949f,
--0.676887f, -0.676826f, -0.676764f, -0.676703f, -0.676641f, -0.67658f, -0.676518f, -0.676456f, -0.676395f, -0.676333f, -0.676272f, -0.67621f, -0.676149f, -0.676087f, -0.676025f, -0.675964f, -0.675902f, -0.67584f, -0.675779f, -0.675717f,
--0.675656f, -0.675594f, -0.675532f, -0.67547f, -0.675409f, -0.675347f, -0.675285f, -0.675224f, -0.675162f, -0.6751f, -0.675038f, -0.674977f, -0.674915f, -0.674853f, -0.674791f, -0.674729f, -0.674668f, -0.674606f, -0.674544f, -0.674482f,
--0.67442f, -0.674358f, -0.674296f, -0.674235f, -0.674173f, -0.674111f, -0.674049f, -0.673987f, -0.673925f, -0.673863f, -0.673801f, -0.673739f, -0.673677f, -0.673615f, -0.673553f, -0.673491f, -0.673429f, -0.673367f, -0.673305f, -0.673243f,
--0.673181f, -0.673119f, -0.673057f, -0.672995f, -0.672933f, -0.672871f, -0.672809f, -0.672747f, -0.672685f, -0.672622f, -0.67256f, -0.672498f, -0.672436f, -0.672374f, -0.672312f, -0.672249f, -0.672187f, -0.672125f, -0.672063f, -0.672001f,
--0.671938f, -0.671876f, -0.671814f, -0.671752f, -0.671689f, -0.671627f, -0.671565f, -0.671503f, -0.67144f, -0.671378f, -0.671316f, -0.671253f, -0.671191f, -0.671129f, -0.671066f, -0.671004f, -0.670942f, -0.670879f, -0.670817f, -0.670754f,
--0.670692f, -0.67063f, -0.670567f, -0.670505f, -0.670442f, -0.67038f, -0.670317f, -0.670255f, -0.670192f, -0.67013f, -0.670067f, -0.670005f, -0.669942f, -0.66988f, -0.669817f, -0.669755f, -0.669692f, -0.66963f, -0.669567f, -0.669505f,
--0.669442f, -0.669379f, -0.669317f, -0.669254f, -0.669192f, -0.669129f, -0.669066f, -0.669004f, -0.668941f, -0.668878f, -0.668816f, -0.668753f, -0.66869f, -0.668627f, -0.668565f, -0.668502f, -0.668439f, -0.668377f, -0.668314f, -0.668251f,
--0.668188f, -0.668125f, -0.668063f, -0.668f, -0.667937f, -0.667874f, -0.667811f, -0.667749f, -0.667686f, -0.667623f, -0.66756f, -0.667497f, -0.667434f, -0.667371f, -0.667308f, -0.667246f, -0.667183f, -0.66712f, -0.667057f, -0.666994f,
--0.666931f, -0.666868f, -0.666805f, -0.666742f, -0.666679f, -0.666616f, -0.666553f, -0.66649f, -0.666427f, -0.666364f, -0.666301f, -0.666238f, -0.666175f, -0.666112f, -0.666048f, -0.665985f, -0.665922f, -0.665859f, -0.665796f, -0.665733f,
--0.66567f, -0.665607f, -0.665543f, -0.66548f, -0.665417f, -0.665354f, -0.665291f, -0.665227f, -0.665164f, -0.665101f, -0.665038f, -0.664975f, -0.664911f, -0.664848f, -0.664785f, -0.664722f, -0.664658f, -0.664595f, -0.664532f, -0.664468f,
--0.664405f, -0.664342f, -0.664278f, -0.664215f, -0.664152f, -0.664088f, -0.664025f, -0.663961f, -0.663898f, -0.663835f, -0.663771f, -0.663708f, -0.663644f, -0.663581f, -0.663518f, -0.663454f, -0.663391f, -0.663327f, -0.663264f, -0.6632f,
--0.663137f, -0.663073f, -0.66301f, -0.662946f, -0.662882f, -0.662819f, -0.662755f, -0.662692f, -0.662628f, -0.662565f, -0.662501f, -0.662437f, -0.662374f, -0.66231f, -0.662247f, -0.662183f, -0.662119f, -0.662056f, -0.661992f, -0.661928f,
--0.661865f, -0.661801f, -0.661737f, -0.661673f, -0.66161f, -0.661546f, -0.661482f, -0.661419f, -0.661355f, -0.661291f, -0.661227f, -0.661163f, -0.6611f, -0.661036f, -0.660972f, -0.660908f, -0.660844f, -0.660781f, -0.660717f, -0.660653f,
--0.660589f, -0.660525f, -0.660461f, -0.660397f, -0.660333f, -0.660269f, -0.660206f, -0.660142f, -0.660078f, -0.660014f, -0.65995f, -0.659886f, -0.659822f, -0.659758f, -0.659694f, -0.65963f, -0.659566f, -0.659502f, -0.659438f, -0.659374f,
--0.65931f, -0.659246f, -0.659182f, -0.659117f, -0.659053f, -0.658989f, -0.658925f, -0.658861f, -0.658797f, -0.658733f, -0.658669f, -0.658605f, -0.65854f, -0.658476f, -0.658412f, -0.658348f, -0.658284f, -0.658219f, -0.658155f, -0.658091f,
--0.658027f, -0.657963f, -0.657898f, -0.657834f, -0.65777f, -0.657705f, -0.657641f, -0.657577f, -0.657513f, -0.657448f, -0.657384f, -0.65732f, -0.657255f, -0.657191f, -0.657127f, -0.657062f, -0.656998f, -0.656933f, -0.656869f, -0.656805f,
--0.65674f, -0.656676f, -0.656611f, -0.656547f, -0.656482f, -0.656418f, -0.656354f, -0.656289f, -0.656225f, -0.65616f, -0.656096f, -0.656031f, -0.655967f, -0.655902f, -0.655838f, -0.655773f, -0.655708f, -0.655644f, -0.655579f, -0.655515f,
--0.65545f, -0.655386f, -0.655321f, -0.655256f, -0.655192f, -0.655127f, -0.655062f, -0.654998f, -0.654933f, -0.654868f, -0.654804f, -0.654739f, -0.654674f, -0.65461f, -0.654545f, -0.65448f, -0.654415f, -0.654351f, -0.654286f, -0.654221f,
--0.654156f, -0.654092f, -0.654027f, -0.653962f, -0.653897f, -0.653832f, -0.653768f, -0.653703f, -0.653638f, -0.653573f, -0.653508f, -0.653443f, -0.653378f, -0.653314f, -0.653249f, -0.653184f, -0.653119f, -0.653054f, -0.652989f, -0.652924f,
--0.652859f, -0.652794f, -0.652729f, -0.652664f, -0.652599f, -0.652534f, -0.652469f, -0.652404f, -0.652339f, -0.652274f, -0.652209f, -0.652144f, -0.652079f, -0.652014f, -0.651949f, -0.651884f, -0.651819f, -0.651754f, -0.651688f, -0.651623f,
--0.651558f, -0.651493f, -0.651428f, -0.651363f, -0.651298f, -0.651232f, -0.651167f, -0.651102f, -0.651037f, -0.650972f, -0.650906f, -0.650841f, -0.650776f, -0.650711f, -0.650645f, -0.65058f, -0.650515f, -0.65045f, -0.650384f, -0.650319f,
--0.650254f, -0.650188f, -0.650123f, -0.650058f, -0.649992f, -0.649927f, -0.649862f, -0.649796f, -0.649731f, -0.649666f, -0.6496f, -0.649535f, -0.649469f, -0.649404f, -0.649338f, -0.649273f, -0.649208f, -0.649142f, -0.649077f, -0.649011f,
--0.648946f, -0.64888f, -0.648815f, -0.648749f, -0.648684f, -0.648618f, -0.648553f, -0.648487f, -0.648421f, -0.648356f, -0.64829f, -0.648225f, -0.648159f, -0.648094f, -0.648028f, -0.647962f, -0.647897f, -0.647831f, -0.647765f, -0.6477f,
--0.647634f, -0.647568f, -0.647503f, -0.647437f, -0.647371f, -0.647306f, -0.64724f, -0.647174f, -0.647108f, -0.647043f, -0.646977f, -0.646911f, -0.646845f, -0.64678f, -0.646714f, -0.646648f, -0.646582f, -0.646516f, -0.646451f, -0.646385f,
--0.646319f, -0.646253f, -0.646187f, -0.646121f, -0.646055f, -0.64599f, -0.645924f, -0.645858f, -0.645792f, -0.645726f, -0.64566f, -0.645594f, -0.645528f, -0.645462f, -0.645396f, -0.64533f, -0.645264f, -0.645198f, -0.645132f, -0.645066f,
--0.645f, -0.644934f, -0.644868f, -0.644802f, -0.644736f, -0.64467f, -0.644604f, -0.644538f, -0.644472f, -0.644406f, -0.644339f, -0.644273f, -0.644207f, -0.644141f, -0.644075f, -0.644009f, -0.643943f, -0.643876f, -0.64381f, -0.643744f,
--0.643678f, -0.643612f, -0.643545f, -0.643479f, -0.643413f, -0.643347f, -0.64328f, -0.643214f, -0.643148f, -0.643082f, -0.643015f, -0.642949f, -0.642883f, -0.642816f, -0.64275f, -0.642684f, -0.642617f, -0.642551f, -0.642485f, -0.642418f,
--0.642352f, -0.642286f, -0.642219f, -0.642153f, -0.642086f, -0.64202f, -0.641954f, -0.641887f, -0.641821f, -0.641754f, -0.641688f, -0.641621f, -0.641555f, -0.641488f, -0.641422f, -0.641355f, -0.641289f, -0.641222f, -0.641156f, -0.641089f,
--0.641023f, -0.640956f, -0.64089f, -0.640823f, -0.640756f, -0.64069f, -0.640623f, -0.640557f, -0.64049f, -0.640423f, -0.640357f, -0.64029f, -0.640223f, -0.640157f, -0.64009f, -0.640023f, -0.639957f, -0.63989f, -0.639823f, -0.639757f,
--0.63969f, -0.639623f, -0.639556f, -0.63949f, -0.639423f, -0.639356f, -0.639289f, -0.639223f, -0.639156f, -0.639089f, -0.639022f, -0.638955f, -0.638888f, -0.638822f, -0.638755f, -0.638688f, -0.638621f, -0.638554f, -0.638487f, -0.63842f,
--0.638353f, -0.638287f, -0.63822f, -0.638153f, -0.638086f, -0.638019f, -0.637952f, -0.637885f, -0.637818f, -0.637751f, -0.637684f, -0.637617f, -0.63755f, -0.637483f, -0.637416f, -0.637349f, -0.637282f, -0.637215f, -0.637148f, -0.637081f,
--0.637014f, -0.636946f, -0.636879f, -0.636812f, -0.636745f, -0.636678f, -0.636611f, -0.636544f, -0.636477f, -0.636409f, -0.636342f, -0.636275f, -0.636208f, -0.636141f, -0.636074f, -0.636006f, -0.635939f, -0.635872f, -0.635805f, -0.635737f,
--0.63567f, -0.635603f, -0.635536f, -0.635468f, -0.635401f, -0.635334f, -0.635266f, -0.635199f, -0.635132f, -0.635065f, -0.634997f, -0.63493f, -0.634862f, -0.634795f, -0.634728f, -0.63466f, -0.634593f, -0.634526f, -0.634458f, -0.634391f,
--0.634323f, -0.634256f, -0.634188f, -0.634121f, -0.634054f, -0.633986f, -0.633919f, -0.633851f, -0.633784f, -0.633716f, -0.633649f, -0.633581f, -0.633514f, -0.633446f, -0.633378f, -0.633311f, -0.633243f, -0.633176f, -0.633108f, -0.633041f,
--0.632973f, -0.632905f, -0.632838f, -0.63277f, -0.632702f, -0.632635f, -0.632567f, -0.632499f, -0.632432f, -0.632364f, -0.632296f, -0.632229f, -0.632161f, -0.632093f, -0.632026f, -0.631958f, -0.63189f, -0.631822f, -0.631755f, -0.631687f,
--0.631619f, -0.631551f, -0.631484f, -0.631416f, -0.631348f, -0.63128f, -0.631212f, -0.631144f, -0.631077f, -0.631009f, -0.630941f, -0.630873f, -0.630805f, -0.630737f, -0.630669f, -0.630601f, -0.630533f, -0.630466f, -0.630398f, -0.63033f,
--0.630262f, -0.630194f, -0.630126f, -0.630058f, -0.62999f, -0.629922f, -0.629854f, -0.629786f, -0.629718f, -0.62965f, -0.629582f, -0.629514f, -0.629446f, -0.629378f, -0.62931f, -0.629241f, -0.629173f, -0.629105f, -0.629037f, -0.628969f,
--0.628901f, -0.628833f, -0.628765f, -0.628697f, -0.628628f, -0.62856f, -0.628492f, -0.628424f, -0.628356f, -0.628287f, -0.628219f, -0.628151f, -0.628083f, -0.628015f, -0.627946f, -0.627878f, -0.62781f, -0.627742f, -0.627673f, -0.627605f,
--0.627537f, -0.627468f, -0.6274f, -0.627332f, -0.627263f, -0.627195f, -0.627127f, -0.627058f, -0.62699f, -0.626922f, -0.626853f, -0.626785f, -0.626716f, -0.626648f, -0.62658f, -0.626511f, -0.626443f, -0.626374f, -0.626306f, -0.626237f,
--0.626169f, -0.626101f, -0.626032f, -0.625964f, -0.625895f, -0.625827f, -0.625758f, -0.625689f, -0.625621f, -0.625552f, -0.625484f, -0.625415f, -0.625347f, -0.625278f, -0.62521f, -0.625141f, -0.625072f, -0.625004f, -0.624935f, -0.624866f,
--0.624798f, -0.624729f, -0.624661f, -0.624592f, -0.624523f, -0.624455f, -0.624386f, -0.624317f, -0.624248f, -0.62418f, -0.624111f, -0.624042f, -0.623973f, -0.623905f, -0.623836f, -0.623767f, -0.623698f, -0.62363f, -0.623561f, -0.623492f,
--0.623423f, -0.623354f, -0.623286f, -0.623217f, -0.623148f, -0.623079f, -0.62301f, -0.622941f, -0.622872f, -0.622804f, -0.622735f, -0.622666f, -0.622597f, -0.622528f, -0.622459f, -0.62239f, -0.622321f, -0.622252f, -0.622183f, -0.622114f,
--0.622045f, -0.621976f, -0.621907f, -0.621838f, -0.621769f, -0.6217f, -0.621631f, -0.621562f, -0.621493f, -0.621424f, -0.621355f, -0.621286f, -0.621217f, -0.621148f, -0.621079f, -0.621009f, -0.62094f, -0.620871f, -0.620802f, -0.620733f,
--0.620664f, -0.620595f, -0.620525f, -0.620456f, -0.620387f, -0.620318f, -0.620249f, -0.620179f, -0.62011f, -0.620041f, -0.619972f, -0.619903f, -0.619833f, -0.619764f, -0.619695f, -0.619625f, -0.619556f, -0.619487f, -0.619418f, -0.619348f,
--0.619279f, -0.61921f, -0.61914f, -0.619071f, -0.619002f, -0.618932f, -0.618863f, -0.618793f, -0.618724f, -0.618655f, -0.618585f, -0.618516f, -0.618446f, -0.618377f, -0.618307f, -0.618238f, -0.618169f, -0.618099f, -0.61803f, -0.61796f,
--0.617891f, -0.617821f, -0.617752f, -0.617682f, -0.617613f, -0.617543f, -0.617473f, -0.617404f, -0.617334f, -0.617265f, -0.617195f, -0.617126f, -0.617056f, -0.616986f, -0.616917f, -0.616847f, -0.616778f, -0.616708f, -0.616638f, -0.616569f,
--0.616499f, -0.616429f, -0.61636f, -0.61629f, -0.61622f, -0.616151f, -0.616081f, -0.616011f, -0.615941f, -0.615872f, -0.615802f, -0.615732f, -0.615662f, -0.615593f, -0.615523f, -0.615453f, -0.615383f, -0.615313f, -0.615244f, -0.615174f,
--0.615104f, -0.615034f, -0.614964f, -0.614894f, -0.614824f, -0.614755f, -0.614685f, -0.614615f, -0.614545f, -0.614475f, -0.614405f, -0.614335f, -0.614265f, -0.614195f, -0.614125f, -0.614055f, -0.613985f, -0.613915f, -0.613845f, -0.613775f,
--0.613705f, -0.613635f, -0.613565f, -0.613495f, -0.613425f, -0.613355f, -0.613285f, -0.613215f, -0.613145f, -0.613075f, -0.613005f, -0.612935f, -0.612865f, -0.612795f, -0.612725f, -0.612654f, -0.612584f, -0.612514f, -0.612444f, -0.612374f,
--0.612304f, -0.612233f, -0.612163f, -0.612093f, -0.612023f, -0.611953f, -0.611882f, -0.611812f, -0.611742f, -0.611672f, -0.611601f, -0.611531f, -0.611461f, -0.611391f, -0.61132f, -0.61125f, -0.61118f, -0.611109f, -0.611039f, -0.610969f,
--0.610898f, -0.610828f, -0.610758f, -0.610687f, -0.610617f, -0.610547f, -0.610476f, -0.610406f, -0.610335f, -0.610265f, -0.610195f, -0.610124f, -0.610054f, -0.609983f, -0.609913f, -0.609842f, -0.609772f, -0.609701f, -0.609631f, -0.60956f,
--0.60949f, -0.609419f, -0.609349f, -0.609278f, -0.609208f, -0.609137f, -0.609067f, -0.608996f, -0.608925f, -0.608855f, -0.608784f, -0.608714f, -0.608643f, -0.608572f, -0.608502f, -0.608431f, -0.608361f, -0.60829f, -0.608219f, -0.608149f,
--0.608078f, -0.608007f, -0.607937f, -0.607866f, -0.607795f, -0.607724f, -0.607654f, -0.607583f, -0.607512f, -0.607441f, -0.607371f, -0.6073f, -0.607229f, -0.607158f, -0.607088f, -0.607017f, -0.606946f, -0.606875f, -0.606804f, -0.606733f,
--0.606663f, -0.606592f, -0.606521f, -0.60645f, -0.606379f, -0.606308f, -0.606237f, -0.606166f, -0.606096f, -0.606025f, -0.605954f, -0.605883f, -0.605812f, -0.605741f, -0.60567f, -0.605599f, -0.605528f, -0.605457f, -0.605386f, -0.605315f,
--0.605244f, -0.605173f, -0.605102f, -0.605031f, -0.60496f, -0.604889f, -0.604818f, -0.604747f, -0.604676f, -0.604605f, -0.604533f, -0.604462f, -0.604391f, -0.60432f, -0.604249f, -0.604178f, -0.604107f, -0.604036f, -0.603964f, -0.603893f,
--0.603822f, -0.603751f, -0.60368f, -0.603608f, -0.603537f, -0.603466f, -0.603395f, -0.603324f, -0.603252f, -0.603181f, -0.60311f, -0.603039f, -0.602967f, -0.602896f, -0.602825f, -0.602753f, -0.602682f, -0.602611f, -0.602539f, -0.602468f,
--0.602397f, -0.602325f, -0.602254f, -0.602183f, -0.602111f, -0.60204f, -0.601969f, -0.601897f, -0.601826f, -0.601754f, -0.601683f, -0.601611f, -0.60154f, -0.601469f, -0.601397f, -0.601326f, -0.601254f, -0.601183f, -0.601111f, -0.60104f,
--0.600968f, -0.600897f, -0.600825f, -0.600754f, -0.600682f, -0.60061f, -0.600539f, -0.600467f, -0.600396f, -0.600324f, -0.600253f, -0.600181f, -0.600109f, -0.600038f, -0.599966f, -0.599895f, -0.599823f, -0.599751f, -0.59968f, -0.599608f,
--0.599536f, -0.599465f, -0.599393f, -0.599321f, -0.599249f, -0.599178f, -0.599106f, -0.599034f, -0.598963f, -0.598891f, -0.598819f, -0.598747f, -0.598676f, -0.598604f, -0.598532f, -0.59846f, -0.598388f, -0.598317f, -0.598245f, -0.598173f,
--0.598101f, -0.598029f, -0.597957f, -0.597885f, -0.597814f, -0.597742f, -0.59767f, -0.597598f, -0.597526f, -0.597454f, -0.597382f, -0.59731f, -0.597238f, -0.597166f, -0.597094f, -0.597022f, -0.59695f, -0.596878f, -0.596806f, -0.596735f,
--0.596662f, -0.59659f, -0.596518f, -0.596446f, -0.596374f, -0.596302f, -0.59623f, -0.596158f, -0.596086f, -0.596014f, -0.595942f, -0.59587f, -0.595798f, -0.595726f, -0.595654f, -0.595581f, -0.595509f, -0.595437f, -0.595365f, -0.595293f,
--0.595221f, -0.595149f, -0.595076f, -0.595004f, -0.594932f, -0.59486f, -0.594788f, -0.594715f, -0.594643f, -0.594571f, -0.594499f, -0.594426f, -0.594354f, -0.594282f, -0.594209f, -0.594137f, -0.594065f, -0.593993f, -0.59392f, -0.593848f,
--0.593776f, -0.593703f, -0.593631f, -0.593559f, -0.593486f, -0.593414f, -0.593341f, -0.593269f, -0.593197f, -0.593124f, -0.593052f, -0.592979f, -0.592907f, -0.592835f, -0.592762f, -0.59269f, -0.592617f, -0.592545f, -0.592472f, -0.5924f,
--0.592327f, -0.592255f, -0.592182f, -0.59211f, -0.592037f, -0.591965f, -0.591892f, -0.59182f, -0.591747f, -0.591674f, -0.591602f, -0.591529f, -0.591457f, -0.591384f, -0.591311f, -0.591239f, -0.591166f, -0.591094f, -0.591021f, -0.590948f,
--0.590876f, -0.590803f, -0.59073f, -0.590658f, -0.590585f, -0.590512f, -0.590439f, -0.590367f, -0.590294f, -0.590221f, -0.590149f, -0.590076f, -0.590003f, -0.58993f, -0.589858f, -0.589785f, -0.589712f, -0.589639f, -0.589566f, -0.589494f,
--0.589421f, -0.589348f, -0.589275f, -0.589202f, -0.589129f, -0.589056f, -0.588984f, -0.588911f, -0.588838f, -0.588765f, -0.588692f, -0.588619f, -0.588546f, -0.588473f, -0.5884f, -0.588327f, -0.588254f, -0.588181f, -0.588109f, -0.588036f,
--0.587963f, -0.58789f, -0.587817f, -0.587744f, -0.587671f, -0.587598f, -0.587524f, -0.587451f, -0.587378f, -0.587305f, -0.587232f, -0.587159f, -0.587086f, -0.587013f, -0.58694f, -0.586867f, -0.586794f, -0.586721f, -0.586647f, -0.586574f,
--0.586501f, -0.586428f, -0.586355f, -0.586282f, -0.586209f, -0.586135f, -0.586062f, -0.585989f, -0.585916f, -0.585842f, -0.585769f, -0.585696f, -0.585623f, -0.58555f, -0.585476f, -0.585403f, -0.58533f, -0.585256f, -0.585183f, -0.58511f,
--0.585037f, -0.584963f, -0.58489f, -0.584817f, -0.584743f, -0.58467f, -0.584597f, -0.584523f, -0.58445f, -0.584376f, -0.584303f, -0.58423f, -0.584156f, -0.584083f, -0.584009f, -0.583936f, -0.583863f, -0.583789f, -0.583716f, -0.583642f,
--0.583569f, -0.583495f, -0.583422f, -0.583348f, -0.583275f, -0.583201f, -0.583128f, -0.583054f, -0.582981f, -0.582907f, -0.582834f, -0.58276f, -0.582686f, -0.582613f, -0.582539f, -0.582466f, -0.582392f, -0.582318f, -0.582245f, -0.582171f,
--0.582098f, -0.582024f, -0.58195f, -0.581877f, -0.581803f, -0.581729f, -0.581656f, -0.581582f, -0.581508f, -0.581435f, -0.581361f, -0.581287f, -0.581213f, -0.58114f, -0.581066f, -0.580992f, -0.580918f, -0.580845f, -0.580771f, -0.580697f,
--0.580623f, -0.58055f, -0.580476f, -0.580402f, -0.580328f, -0.580254f, -0.58018f, -0.580107f, -0.580033f, -0.579959f, -0.579885f, -0.579811f, -0.579737f, -0.579663f, -0.579589f, -0.579516f, -0.579442f, -0.579368f, -0.579294f, -0.57922f,
--0.579146f, -0.579072f, -0.578998f, -0.578924f, -0.57885f, -0.578776f, -0.578702f, -0.578628f, -0.578554f, -0.57848f, -0.578406f, -0.578332f, -0.578258f, -0.578184f, -0.57811f, -0.578036f, -0.577962f, -0.577887f, -0.577813f, -0.577739f,
--0.577665f, -0.577591f, -0.577517f, -0.577443f, -0.577369f, -0.577294f, -0.57722f, -0.577146f, -0.577072f, -0.576998f, -0.576924f, -0.576849f, -0.576775f, -0.576701f, -0.576627f, -0.576553f, -0.576478f, -0.576404f, -0.57633f, -0.576256f,
--0.576181f, -0.576107f, -0.576033f, -0.575958f, -0.575884f, -0.57581f, -0.575735f, -0.575661f, -0.575587f, -0.575512f, -0.575438f, -0.575364f, -0.575289f, -0.575215f, -0.575141f, -0.575066f, -0.574992f, -0.574917f, -0.574843f, -0.574769f,
--0.574694f, -0.57462f, -0.574545f, -0.574471f, -0.574396f, -0.574322f, -0.574247f, -0.574173f, -0.574098f, -0.574024f, -0.573949f, -0.573875f, -0.5738f, -0.573726f, -0.573651f, -0.573577f, -0.573502f, -0.573428f, -0.573353f, -0.573279f,
--0.573204f, -0.573129f, -0.573055f, -0.57298f, -0.572906f, -0.572831f, -0.572756f, -0.572682f, -0.572607f, -0.572532f, -0.572458f, -0.572383f, -0.572308f, -0.572234f, -0.572159f, -0.572084f, -0.572009f, -0.571935f, -0.57186f, -0.571785f,
--0.571711f, -0.571636f, -0.571561f, -0.571486f, -0.571412f, -0.571337f, -0.571262f, -0.571187f, -0.571112f, -0.571038f, -0.570963f, -0.570888f, -0.570813f, -0.570738f, -0.570663f, -0.570588f, -0.570514f, -0.570439f, -0.570364f, -0.570289f,
--0.570214f, -0.570139f, -0.570064f, -0.569989f, -0.569914f, -0.569839f, -0.569764f, -0.569689f, -0.569614f, -0.56954f, -0.569465f, -0.56939f, -0.569315f, -0.56924f, -0.569165f, -0.56909f, -0.569014f, -0.568939f, -0.568864f, -0.568789f,
--0.568714f, -0.568639f, -0.568564f, -0.568489f, -0.568414f, -0.568339f, -0.568264f, -0.568189f, -0.568114f, -0.568038f, -0.567963f, -0.567888f, -0.567813f, -0.567738f, -0.567663f, -0.567587f, -0.567512f, -0.567437f, -0.567362f, -0.567287f,
--0.567211f, -0.567136f, -0.567061f, -0.566986f, -0.56691f, -0.566835f, -0.56676f, -0.566685f, -0.566609f, -0.566534f, -0.566459f, -0.566384f, -0.566308f, -0.566233f, -0.566158f, -0.566082f, -0.566007f, -0.565932f, -0.565856f, -0.565781f,
--0.565705f, -0.56563f, -0.565555f, -0.565479f, -0.565404f, -0.565328f, -0.565253f, -0.565178f, -0.565102f, -0.565027f, -0.564951f, -0.564876f, -0.5648f, -0.564725f, -0.564649f, -0.564574f, -0.564498f, -0.564423f, -0.564347f, -0.564272f,
--0.564196f, -0.564121f, -0.564045f, -0.56397f, -0.563894f, -0.563819f, -0.563743f, -0.563667f, -0.563592f, -0.563516f, -0.563441f, -0.563365f, -0.563289f, -0.563214f, -0.563138f, -0.563062f, -0.562987f, -0.562911f, -0.562835f, -0.56276f,
--0.562684f, -0.562608f, -0.562533f, -0.562457f, -0.562381f, -0.562306f, -0.56223f, -0.562154f, -0.562078f, -0.562003f, -0.561927f, -0.561851f, -0.561775f, -0.561699f, -0.561624f, -0.561548f, -0.561472f, -0.561396f, -0.56132f, -0.561245f,
--0.561169f, -0.561093f, -0.561017f, -0.560941f, -0.560865f, -0.560789f, -0.560714f, -0.560638f, -0.560562f, -0.560486f, -0.56041f, -0.560334f, -0.560258f, -0.560182f, -0.560106f, -0.56003f, -0.559954f, -0.559878f, -0.559802f, -0.559726f,
--0.55965f, -0.559574f, -0.559498f, -0.559422f, -0.559346f, -0.55927f, -0.559194f, -0.559118f, -0.559042f, -0.558966f, -0.55889f, -0.558814f, -0.558738f, -0.558662f, -0.558586f, -0.558509f, -0.558433f, -0.558357f, -0.558281f, -0.558205f,
--0.558129f, -0.558053f, -0.557976f, -0.5579f, -0.557824f, -0.557748f, -0.557672f, -0.557595f, -0.557519f, -0.557443f, -0.557367f, -0.557291f, -0.557214f, -0.557138f, -0.557062f, -0.556986f, -0.556909f, -0.556833f, -0.556757f, -0.55668f,
--0.556604f, -0.556528f, -0.556451f, -0.556375f, -0.556299f, -0.556222f, -0.556146f, -0.55607f, -0.555993f, -0.555917f, -0.555841f, -0.555764f, -0.555688f, -0.555611f, -0.555535f, -0.555459f, -0.555382f, -0.555306f, -0.555229f, -0.555153f,
--0.555076f, -0.555f, -0.554923f, -0.554847f, -0.554771f, -0.554694f, -0.554617f, -0.554541f, -0.554464f, -0.554388f, -0.554311f, -0.554235f, -0.554158f, -0.554082f, -0.554005f, -0.553929f, -0.553852f, -0.553775f, -0.553699f, -0.553622f,
--0.553546f, -0.553469f, -0.553392f, -0.553316f, -0.553239f, -0.553162f, -0.553086f, -0.553009f, -0.552932f, -0.552856f, -0.552779f, -0.552702f, -0.552626f, -0.552549f, -0.552472f, -0.552396f, -0.552319f, -0.552242f, -0.552165f, -0.552089f,
--0.552012f, -0.551935f, -0.551858f, -0.551781f, -0.551705f, -0.551628f, -0.551551f, -0.551474f, -0.551397f, -0.551321f, -0.551244f, -0.551167f, -0.55109f, -0.551013f, -0.550936f, -0.550859f, -0.550783f, -0.550706f, -0.550629f, -0.550552f,
--0.550475f, -0.550398f, -0.550321f, -0.550244f, -0.550167f, -0.55009f, -0.550013f, -0.549936f, -0.549859f, -0.549782f, -0.549705f, -0.549628f, -0.549551f, -0.549474f, -0.549397f, -0.54932f, -0.549243f, -0.549166f, -0.549089f, -0.549012f,
--0.548935f, -0.548858f, -0.548781f, -0.548704f, -0.548627f, -0.548549f, -0.548472f, -0.548395f, -0.548318f, -0.548241f, -0.548164f, -0.548087f, -0.54801f, -0.547932f, -0.547855f, -0.547778f, -0.547701f, -0.547624f, -0.547546f, -0.547469f,
--0.547392f, -0.547315f, -0.547237f, -0.54716f, -0.547083f, -0.547006f, -0.546928f, -0.546851f, -0.546774f, -0.546697f, -0.546619f, -0.546542f, -0.546465f, -0.546387f, -0.54631f, -0.546233f, -0.546155f, -0.546078f, -0.546001f, -0.545923f,
--0.545846f, -0.545769f, -0.545691f, -0.545614f, -0.545536f, -0.545459f, -0.545382f, -0.545304f, -0.545227f, -0.545149f, -0.545072f, -0.544994f, -0.544917f, -0.544839f, -0.544762f, -0.544684f, -0.544607f, -0.544529f, -0.544452f, -0.544374f,
--0.544297f, -0.544219f, -0.544142f, -0.544064f, -0.543987f, -0.543909f, -0.543832f, -0.543754f, -0.543676f, -0.543599f, -0.543521f, -0.543444f, -0.543366f, -0.543288f, -0.543211f, -0.543133f, -0.543056f, -0.542978f, -0.5429f, -0.542823f,
--0.542745f, -0.542667f, -0.542589f, -0.542512f, -0.542434f, -0.542356f, -0.542279f, -0.542201f, -0.542123f, -0.542045f, -0.541968f, -0.54189f, -0.541812f, -0.541734f, -0.541657f, -0.541579f, -0.541501f, -0.541423f, -0.541345f, -0.541268f,
--0.54119f, -0.541112f, -0.541034f, -0.540956f, -0.540878f, -0.540801f, -0.540723f, -0.540645f, -0.540567f, -0.540489f, -0.540411f, -0.540333f, -0.540255f, -0.540177f, -0.540099f, -0.540022f, -0.539944f, -0.539866f, -0.539788f, -0.53971f,
--0.539632f, -0.539554f, -0.539476f, -0.539398f, -0.53932f, -0.539242f, -0.539164f, -0.539086f, -0.539008f, -0.53893f, -0.538852f, -0.538774f, -0.538695f, -0.538617f, -0.538539f, -0.538461f, -0.538383f, -0.538305f, -0.538227f, -0.538149f,
--0.538071f, -0.537993f, -0.537914f, -0.537836f, -0.537758f, -0.53768f, -0.537602f, -0.537524f, -0.537445f, -0.537367f, -0.537289f, -0.537211f, -0.537133f, -0.537054f, -0.536976f, -0.536898f, -0.53682f, -0.536741f, -0.536663f, -0.536585f,
--0.536507f, -0.536428f, -0.53635f, -0.536272f, -0.536194f, -0.536115f, -0.536037f, -0.535959f, -0.53588f, -0.535802f, -0.535724f, -0.535645f, -0.535567f, -0.535488f, -0.53541f, -0.535332f, -0.535253f, -0.535175f, -0.535096f, -0.535018f,
--0.53494f, -0.534861f, -0.534783f, -0.534704f, -0.534626f, -0.534547f, -0.534469f, -0.534391f, -0.534312f, -0.534234f, -0.534155f, -0.534077f, -0.533998f, -0.53392f, -0.533841f, -0.533762f, -0.533684f, -0.533605f, -0.533527f, -0.533448f,
--0.53337f, -0.533291f, -0.533213f, -0.533134f, -0.533055f, -0.532977f, -0.532898f, -0.53282f, -0.532741f, -0.532662f, -0.532584f, -0.532505f, -0.532426f, -0.532348f, -0.532269f, -0.53219f, -0.532112f, -0.532033f, -0.531954f, -0.531875f,
--0.531797f, -0.531718f, -0.531639f, -0.531561f, -0.531482f, -0.531403f, -0.531324f, -0.531246f, -0.531167f, -0.531088f, -0.531009f, -0.53093f, -0.530852f, -0.530773f, -0.530694f, -0.530615f, -0.530536f, -0.530457f, -0.530379f, -0.5303f,
--0.530221f, -0.530142f, -0.530063f, -0.529984f, -0.529905f, -0.529826f, -0.529748f, -0.529669f, -0.52959f, -0.529511f, -0.529432f, -0.529353f, -0.529274f, -0.529195f, -0.529116f, -0.529037f, -0.528958f, -0.528879f, -0.5288f, -0.528721f,
--0.528642f, -0.528563f, -0.528484f, -0.528405f, -0.528326f, -0.528247f, -0.528168f, -0.528089f, -0.52801f, -0.527931f, -0.527852f, -0.527772f, -0.527693f, -0.527614f, -0.527535f, -0.527456f, -0.527377f, -0.527298f, -0.527219f, -0.52714f,
--0.52706f, -0.526981f, -0.526902f, -0.526823f, -0.526744f, -0.526664f, -0.526585f, -0.526506f, -0.526427f, -0.526348f, -0.526268f, -0.526189f, -0.52611f, -0.526031f, -0.525951f, -0.525872f, -0.525793f, -0.525714f, -0.525634f, -0.525555f,
--0.525476f, -0.525396f, -0.525317f, -0.525238f, -0.525158f, -0.525079f, -0.525f, -0.52492f, -0.524841f, -0.524762f, -0.524682f, -0.524603f, -0.524523f, -0.524444f, -0.524365f, -0.524285f, -0.524206f, -0.524126f, -0.524047f, -0.523968f,
--0.523888f, -0.523809f, -0.523729f, -0.52365f, -0.52357f, -0.523491f, -0.523411f, -0.523332f, -0.523252f, -0.523173f, -0.523093f, -0.523014f, -0.522934f, -0.522855f, -0.522775f, -0.522696f, -0.522616f, -0.522536f, -0.522457f, -0.522377f,
--0.522298f, -0.522218f, -0.522138f, -0.522059f, -0.521979f, -0.5219f, -0.52182f, -0.52174f, -0.521661f, -0.521581f, -0.521501f, -0.521422f, -0.521342f, -0.521262f, -0.521183f, -0.521103f, -0.521023f, -0.520943f, -0.520864f, -0.520784f,
--0.520704f, -0.520624f, -0.520545f, -0.520465f, -0.520385f, -0.520305f, -0.520226f, -0.520146f, -0.520066f, -0.519986f, -0.519906f, -0.519827f, -0.519747f, -0.519667f, -0.519587f, -0.519507f, -0.519427f, -0.519348f, -0.519268f, -0.519188f,
--0.519108f, -0.519028f, -0.518948f, -0.518868f, -0.518788f, -0.518708f, -0.518629f, -0.518549f, -0.518469f, -0.518389f, -0.518309f, -0.518229f, -0.518149f, -0.518069f, -0.517989f, -0.517909f, -0.517829f, -0.517749f, -0.517669f, -0.517589f,
--0.517509f, -0.517429f, -0.517349f, -0.517269f, -0.517189f, -0.517109f, -0.517028f, -0.516948f, -0.516868f, -0.516788f, -0.516708f, -0.516628f, -0.516548f, -0.516468f, -0.516388f, -0.516308f, -0.516227f, -0.516147f, -0.516067f, -0.515987f,
--0.515907f, -0.515827f, -0.515746f, -0.515666f, -0.515586f, -0.515506f, -0.515426f, -0.515345f, -0.515265f, -0.515185f, -0.515105f, -0.515024f, -0.514944f, -0.514864f, -0.514784f, -0.514703f, -0.514623f, -0.514543f, -0.514462f, -0.514382f,
--0.514302f, -0.514222f, -0.514141f, -0.514061f, -0.513981f, -0.5139f, -0.51382f, -0.513739f, -0.513659f, -0.513579f, -0.513498f, -0.513418f, -0.513338f, -0.513257f, -0.513177f, -0.513096f, -0.513016f, -0.512935f, -0.512855f, -0.512775f,
--0.512694f, -0.512614f, -0.512533f, -0.512453f, -0.512372f, -0.512292f, -0.512211f, -0.512131f, -0.51205f, -0.51197f, -0.511889f, -0.511809f, -0.511728f, -0.511648f, -0.511567f, -0.511486f, -0.511406f, -0.511325f, -0.511245f, -0.511164f,
--0.511084f, -0.511003f, -0.510922f, -0.510842f, -0.510761f, -0.51068f, -0.5106f, -0.510519f, -0.510438f, -0.510358f, -0.510277f, -0.510196f, -0.510116f, -0.510035f, -0.509954f, -0.509874f, -0.509793f, -0.509712f, -0.509632f, -0.509551f,
--0.50947f, -0.509389f, -0.509309f, -0.509228f, -0.509147f, -0.509066f, -0.508985f, -0.508905f, -0.508824f, -0.508743f, -0.508662f, -0.508581f, -0.508501f, -0.50842f, -0.508339f, -0.508258f, -0.508177f, -0.508096f, -0.508016f, -0.507935f,
--0.507854f, -0.507773f, -0.507692f, -0.507611f, -0.50753f, -0.507449f, -0.507368f, -0.507287f, -0.507206f, -0.507126f, -0.507045f, -0.506964f, -0.506883f, -0.506802f, -0.506721f, -0.50664f, -0.506559f, -0.506478f, -0.506397f, -0.506316f,
--0.506235f, -0.506154f, -0.506073f, -0.505992f, -0.505911f, -0.505829f, -0.505748f, -0.505667f, -0.505586f, -0.505505f, -0.505424f, -0.505343f, -0.505262f, -0.505181f, -0.5051f, -0.505019f, -0.504937f, -0.504856f, -0.504775f, -0.504694f,
--0.504613f, -0.504532f, -0.50445f, -0.504369f, -0.504288f, -0.504207f, -0.504126f, -0.504044f, -0.503963f, -0.503882f, -0.503801f, -0.50372f, -0.503638f, -0.503557f, -0.503476f, -0.503395f, -0.503313f, -0.503232f, -0.503151f, -0.503069f,
--0.502988f, -0.502907f, -0.502825f, -0.502744f, -0.502663f, -0.502581f, -0.5025f, -0.502419f, -0.502337f, -0.502256f, -0.502175f, -0.502093f, -0.502012f, -0.501931f, -0.501849f, -0.501768f, -0.501686f, -0.501605f, -0.501523f, -0.501442f,
--0.501361f, -0.501279f, -0.501198f, -0.501116f, -0.501035f, -0.500953f, -0.500872f, -0.50079f, -0.500709f, -0.500627f, -0.500546f, -0.500464f, -0.500383f, -0.500301f, -0.50022f, -0.500138f, -0.500057f, -0.499975f, -0.499893f, -0.499812f,
--0.49973f, -0.499649f, -0.499567f, -0.499485f, -0.499404f, -0.499322f, -0.499241f, -0.499159f, -0.499077f, -0.498996f, -0.498914f, -0.498832f, -0.498751f, -0.498669f, -0.498587f, -0.498506f, -0.498424f, -0.498342f, -0.498261f, -0.498179f,
--0.498097f, -0.498015f, -0.497934f, -0.497852f, -0.49777f, -0.497688f, -0.497607f, -0.497525f, -0.497443f, -0.497361f, -0.49728f, -0.497198f, -0.497116f, -0.497034f, -0.496952f, -0.496871f, -0.496789f, -0.496707f, -0.496625f, -0.496543f,
--0.496461f, -0.496379f, -0.496298f, -0.496216f, -0.496134f, -0.496052f, -0.49597f, -0.495888f, -0.495806f, -0.495724f, -0.495642f, -0.49556f, -0.495479f, -0.495397f, -0.495315f, -0.495233f, -0.495151f, -0.495069f, -0.494987f, -0.494905f,
--0.494823f, -0.494741f, -0.494659f, -0.494577f, -0.494495f, -0.494413f, -0.494331f, -0.494249f, -0.494167f, -0.494084f, -0.494002f, -0.49392f, -0.493838f, -0.493756f, -0.493674f, -0.493592f, -0.49351f, -0.493428f, -0.493346f, -0.493263f,
--0.493181f, -0.493099f, -0.493017f, -0.492935f, -0.492853f, -0.492771f, -0.492688f, -0.492606f, -0.492524f, -0.492442f, -0.49236f, -0.492277f, -0.492195f, -0.492113f, -0.492031f, -0.491949f, -0.491866f, -0.491784f, -0.491702f, -0.49162f,
--0.491537f, -0.491455f, -0.491373f, -0.49129f, -0.491208f, -0.491126f, -0.491043f, -0.490961f, -0.490879f, -0.490796f, -0.490714f, -0.490632f, -0.490549f, -0.490467f, -0.490385f, -0.490302f, -0.49022f, -0.490138f, -0.490055f, -0.489973f,
--0.48989f, -0.489808f, -0.489726f, -0.489643f, -0.489561f, -0.489478f, -0.489396f, -0.489313f, -0.489231f, -0.489148f, -0.489066f, -0.488983f, -0.488901f, -0.488818f, -0.488736f, -0.488653f, -0.488571f, -0.488488f, -0.488406f, -0.488323f,
--0.488241f, -0.488158f, -0.488076f, -0.487993f, -0.487911f, -0.487828f, -0.487745f, -0.487663f, -0.48758f, -0.487498f, -0.487415f, -0.487332f, -0.48725f, -0.487167f, -0.487084f, -0.487002f, -0.486919f, -0.486837f, -0.486754f, -0.486671f,
--0.486589f, -0.486506f, -0.486423f, -0.48634f, -0.486258f, -0.486175f, -0.486092f, -0.48601f, -0.485927f, -0.485844f, -0.485761f, -0.485679f, -0.485596f, -0.485513f, -0.48543f, -0.485348f, -0.485265f, -0.485182f, -0.485099f, -0.485016f,
--0.484934f, -0.484851f, -0.484768f, -0.484685f, -0.484602f, -0.484519f, -0.484436f, -0.484354f, -0.484271f, -0.484188f, -0.484105f, -0.484022f, -0.483939f, -0.483856f, -0.483773f, -0.48369f, -0.483608f, -0.483525f, -0.483442f, -0.483359f,
--0.483276f, -0.483193f, -0.48311f, -0.483027f, -0.482944f, -0.482861f, -0.482778f, -0.482695f, -0.482612f, -0.482529f, -0.482446f, -0.482363f, -0.48228f, -0.482197f, -0.482114f, -0.482031f, -0.481948f, -0.481865f, -0.481782f, -0.481698f,
--0.481615f, -0.481532f, -0.481449f, -0.481366f, -0.481283f, -0.4812f, -0.481117f, -0.481034f, -0.48095f, -0.480867f, -0.480784f, -0.480701f, -0.480618f, -0.480535f, -0.480452f, -0.480368f, -0.480285f, -0.480202f, -0.480119f, -0.480036f,
--0.479952f, -0.479869f, -0.479786f, -0.479703f, -0.479619f, -0.479536f, -0.479453f, -0.47937f, -0.479286f, -0.479203f, -0.47912f, -0.479036f, -0.478953f, -0.47887f, -0.478787f, -0.478703f, -0.47862f, -0.478537f, -0.478453f, -0.47837f,
--0.478287f, -0.478203f, -0.47812f, -0.478036f, -0.477953f, -0.47787f, -0.477786f, -0.477703f, -0.477619f, -0.477536f, -0.477453f, -0.477369f, -0.477286f, -0.477202f, -0.477119f, -0.477035f, -0.476952f, -0.476869f, -0.476785f, -0.476702f,
--0.476618f, -0.476535f, -0.476451f, -0.476368f, -0.476284f, -0.476201f, -0.476117f, -0.476034f, -0.47595f, -0.475866f, -0.475783f, -0.475699f, -0.475616f, -0.475532f, -0.475449f, -0.475365f, -0.475281f, -0.475198f, -0.475114f, -0.475031f,
--0.474947f, -0.474863f, -0.47478f, -0.474696f, -0.474612f, -0.474529f, -0.474445f, -0.474362f, -0.474278f, -0.474194f, -0.47411f, -0.474027f, -0.473943f, -0.473859f, -0.473776f, -0.473692f, -0.473608f, -0.473525f, -0.473441f, -0.473357f,
--0.473273f, -0.47319f, -0.473106f, -0.473022f, -0.472938f, -0.472854f, -0.472771f, -0.472687f, -0.472603f, -0.472519f, -0.472435f, -0.472352f, -0.472268f, -0.472184f, -0.4721f, -0.472016f, -0.471932f, -0.471849f, -0.471765f, -0.471681f,
--0.471597f, -0.471513f, -0.471429f, -0.471345f, -0.471261f, -0.471177f, -0.471093f, -0.47101f, -0.470926f, -0.470842f, -0.470758f, -0.470674f, -0.47059f, -0.470506f, -0.470422f, -0.470338f, -0.470254f, -0.47017f, -0.470086f, -0.470002f,
--0.469918f, -0.469834f, -0.46975f, -0.469666f, -0.469582f, -0.469498f, -0.469414f, -0.46933f, -0.469246f, -0.469161f, -0.469077f, -0.468993f, -0.468909f, -0.468825f, -0.468741f, -0.468657f, -0.468573f, -0.468489f, -0.468405f, -0.46832f,
--0.468236f, -0.468152f, -0.468068f, -0.467984f, -0.4679f, -0.467815f, -0.467731f, -0.467647f, -0.467563f, -0.467479f, -0.467394f, -0.46731f, -0.467226f, -0.467142f, -0.467058f, -0.466973f, -0.466889f, -0.466805f, -0.466721f, -0.466636f,
--0.466552f, -0.466468f, -0.466383f, -0.466299f, -0.466215f, -0.466131f, -0.466046f, -0.465962f, -0.465878f, -0.465793f, -0.465709f, -0.465625f, -0.46554f, -0.465456f, -0.465371f, -0.465287f, -0.465203f, -0.465118f, -0.465034f, -0.46495f,
--0.464865f, -0.464781f, -0.464696f, -0.464612f, -0.464527f, -0.464443f, -0.464359f, -0.464274f, -0.46419f, -0.464105f, -0.464021f, -0.463936f, -0.463852f, -0.463767f, -0.463683f, -0.463598f, -0.463514f, -0.463429f, -0.463345f, -0.46326f,
--0.463176f, -0.463091f, -0.463007f, -0.462922f, -0.462837f, -0.462753f, -0.462668f, -0.462584f, -0.462499f, -0.462415f, -0.46233f, -0.462245f, -0.462161f, -0.462076f, -0.461992f, -0.461907f, -0.461822f, -0.461738f, -0.461653f, -0.461568f,
--0.461484f, -0.461399f, -0.461314f, -0.46123f, -0.461145f, -0.46106f, -0.460976f, -0.460891f, -0.460806f, -0.460721f, -0.460637f, -0.460552f, -0.460467f, -0.460382f, -0.460298f, -0.460213f, -0.460128f, -0.460043f, -0.459959f, -0.459874f,
--0.459789f, -0.459704f, -0.459619f, -0.459535f, -0.45945f, -0.459365f, -0.45928f, -0.459195f, -0.45911f, -0.459026f, -0.458941f, -0.458856f, -0.458771f, -0.458686f, -0.458601f, -0.458516f, -0.458431f, -0.458347f, -0.458262f, -0.458177f,
--0.458092f, -0.458007f, -0.457922f, -0.457837f, -0.457752f, -0.457667f, -0.457582f, -0.457497f, -0.457412f, -0.457327f, -0.457242f, -0.457157f, -0.457072f, -0.456987f, -0.456902f, -0.456817f, -0.456732f, -0.456647f, -0.456562f, -0.456477f,
--0.456392f, -0.456307f, -0.456222f, -0.456137f, -0.456052f, -0.455967f, -0.455882f, -0.455797f, -0.455711f, -0.455626f, -0.455541f, -0.455456f, -0.455371f, -0.455286f, -0.455201f, -0.455116f, -0.45503f, -0.454945f, -0.45486f, -0.454775f,
--0.45469f, -0.454605f, -0.454519f, -0.454434f, -0.454349f, -0.454264f, -0.454179f, -0.454093f, -0.454008f, -0.453923f, -0.453838f, -0.453752f, -0.453667f, -0.453582f, -0.453497f, -0.453411f, -0.453326f, -0.453241f, -0.453156f, -0.45307f,
--0.452985f, -0.4529f, -0.452814f, -0.452729f, -0.452644f, -0.452558f, -0.452473f, -0.452388f, -0.452302f, -0.452217f, -0.452132f, -0.452046f, -0.451961f, -0.451875f, -0.45179f, -0.451705f, -0.451619f, -0.451534f, -0.451448f, -0.451363f,
--0.451278f, -0.451192f, -0.451107f, -0.451021f, -0.450936f, -0.45085f, -0.450765f, -0.450679f, -0.450594f, -0.450508f, -0.450423f, -0.450337f, -0.450252f, -0.450166f, -0.450081f, -0.449995f, -0.44991f, -0.449824f, -0.449739f, -0.449653f,
--0.449568f, -0.449482f, -0.449397f, -0.449311f, -0.449225f, -0.44914f, -0.449054f, -0.448969f, -0.448883f, -0.448797f, -0.448712f, -0.448626f, -0.44854f, -0.448455f, -0.448369f, -0.448284f, -0.448198f, -0.448112f, -0.448027f, -0.447941f,
--0.447855f, -0.44777f, -0.447684f, -0.447598f, -0.447512f, -0.447427f, -0.447341f, -0.447255f, -0.44717f, -0.447084f, -0.446998f, -0.446912f, -0.446827f, -0.446741f, -0.446655f, -0.446569f, -0.446483f, -0.446398f, -0.446312f, -0.446226f,
--0.44614f, -0.446054f, -0.445969f, -0.445883f, -0.445797f, -0.445711f, -0.445625f, -0.445539f, -0.445454f, -0.445368f, -0.445282f, -0.445196f, -0.44511f, -0.445024f, -0.444938f, -0.444852f, -0.444767f, -0.444681f, -0.444595f, -0.444509f,
--0.444423f, -0.444337f, -0.444251f, -0.444165f, -0.444079f, -0.443993f, -0.443907f, -0.443821f, -0.443735f, -0.443649f, -0.443563f, -0.443477f, -0.443391f, -0.443305f, -0.443219f, -0.443133f, -0.443047f, -0.442961f, -0.442875f, -0.442789f,
--0.442703f, -0.442617f, -0.442531f, -0.442445f, -0.442359f, -0.442273f, -0.442186f, -0.4421f, -0.442014f, -0.441928f, -0.441842f, -0.441756f, -0.44167f, -0.441584f, -0.441498f, -0.441411f, -0.441325f, -0.441239f, -0.441153f, -0.441067f,
--0.440981f, -0.440894f, -0.440808f, -0.440722f, -0.440636f, -0.44055f, -0.440463f, -0.440377f, -0.440291f, -0.440205f, -0.440118f, -0.440032f, -0.439946f, -0.43986f, -0.439773f, -0.439687f, -0.439601f, -0.439515f, -0.439428f, -0.439342f,
--0.439256f, -0.439169f, -0.439083f, -0.438997f, -0.43891f, -0.438824f, -0.438738f, -0.438651f, -0.438565f, -0.438479f, -0.438392f, -0.438306f, -0.43822f, -0.438133f, -0.438047f, -0.43796f, -0.437874f, -0.437788f, -0.437701f, -0.437615f,
--0.437528f, -0.437442f, -0.437355f, -0.437269f, -0.437183f, -0.437096f, -0.43701f, -0.436923f, -0.436837f, -0.43675f, -0.436664f, -0.436577f, -0.436491f, -0.436404f, -0.436318f, -0.436231f, -0.436145f, -0.436058f, -0.435972f, -0.435885f,
--0.435799f, -0.435712f, -0.435625f, -0.435539f, -0.435452f, -0.435366f, -0.435279f, -0.435193f, -0.435106f, -0.435019f, -0.434933f, -0.434846f, -0.43476f, -0.434673f, -0.434586f, -0.4345f, -0.434413f, -0.434326f, -0.43424f, -0.434153f,
--0.434066f, -0.43398f, -0.433893f, -0.433806f, -0.43372f, -0.433633f, -0.433546f, -0.433459f, -0.433373f, -0.433286f, -0.433199f, -0.433113f, -0.433026f, -0.432939f, -0.432852f, -0.432766f, -0.432679f, -0.432592f, -0.432505f, -0.432418f,
--0.432332f, -0.432245f, -0.432158f, -0.432071f, -0.431984f, -0.431898f, -0.431811f, -0.431724f, -0.431637f, -0.43155f, -0.431463f, -0.431377f, -0.43129f, -0.431203f, -0.431116f, -0.431029f, -0.430942f, -0.430855f, -0.430768f, -0.430681f,
--0.430595f, -0.430508f, -0.430421f, -0.430334f, -0.430247f, -0.43016f, -0.430073f, -0.429986f, -0.429899f, -0.429812f, -0.429725f, -0.429638f, -0.429551f, -0.429464f, -0.429377f, -0.42929f, -0.429203f, -0.429116f, -0.429029f, -0.428942f,
--0.428855f, -0.428768f, -0.428681f, -0.428594f, -0.428507f, -0.42842f, -0.428333f, -0.428246f, -0.428159f, -0.428072f, -0.427984f, -0.427897f, -0.42781f, -0.427723f, -0.427636f, -0.427549f, -0.427462f, -0.427375f, -0.427287f, -0.4272f,
--0.427113f, -0.427026f, -0.426939f, -0.426852f, -0.426764f, -0.426677f, -0.42659f, -0.426503f, -0.426416f, -0.426329f, -0.426241f, -0.426154f, -0.426067f, -0.42598f, -0.425892f, -0.425805f, -0.425718f, -0.425631f, -0.425543f, -0.425456f,
--0.425369f, -0.425282f, -0.425194f, -0.425107f, -0.42502f, -0.424932f, -0.424845f, -0.424758f, -0.42467f, -0.424583f, -0.424496f, -0.424408f, -0.424321f, -0.424234f, -0.424146f, -0.424059f, -0.423972f, -0.423884f, -0.423797f, -0.42371f,
--0.423622f, -0.423535f, -0.423447f, -0.42336f, -0.423273f, -0.423185f, -0.423098f, -0.42301f, -0.422923f, -0.422835f, -0.422748f, -0.42266f, -0.422573f, -0.422486f, -0.422398f, -0.422311f, -0.422223f, -0.422136f, -0.422048f, -0.421961f,
--0.421873f, -0.421786f, -0.421698f, -0.421611f, -0.421523f, -0.421435f, -0.421348f, -0.42126f, -0.421173f, -0.421085f, -0.420998f, -0.42091f, -0.420822f, -0.420735f, -0.420647f, -0.42056f, -0.420472f, -0.420384f, -0.420297f, -0.420209f,
--0.420122f, -0.420034f, -0.419946f, -0.419859f, -0.419771f, -0.419683f, -0.419596f, -0.419508f, -0.41942f, -0.419333f, -0.419245f, -0.419157f, -0.41907f, -0.418982f, -0.418894f, -0.418806f, -0.418719f, -0.418631f, -0.418543f, -0.418456f,
--0.418368f, -0.41828f, -0.418192f, -0.418105f, -0.418017f, -0.417929f, -0.417841f, -0.417753f, -0.417666f, -0.417578f, -0.41749f, -0.417402f, -0.417314f, -0.417227f, -0.417139f, -0.417051f, -0.416963f, -0.416875f, -0.416787f, -0.416699f,
--0.416612f, -0.416524f, -0.416436f, -0.416348f, -0.41626f, -0.416172f, -0.416084f, -0.415996f, -0.415909f, -0.415821f, -0.415733f, -0.415645f, -0.415557f, -0.415469f, -0.415381f, -0.415293f, -0.415205f, -0.415117f, -0.415029f, -0.414941f,
--0.414853f, -0.414765f, -0.414677f, -0.414589f, -0.414501f, -0.414413f, -0.414325f, -0.414237f, -0.414149f, -0.414061f, -0.413973f, -0.413885f, -0.413797f, -0.413709f, -0.413621f, -0.413533f, -0.413445f, -0.413357f, -0.413268f, -0.41318f,
--0.413092f, -0.413004f, -0.412916f, -0.412828f, -0.41274f, -0.412652f, -0.412564f, -0.412475f, -0.412387f, -0.412299f, -0.412211f, -0.412123f, -0.412035f, -0.411946f, -0.411858f, -0.41177f, -0.411682f, -0.411594f, -0.411506f, -0.411417f,
--0.411329f, -0.411241f, -0.411153f, -0.411064f, -0.410976f, -0.410888f, -0.4108f, -0.410711f, -0.410623f, -0.410535f, -0.410447f, -0.410358f, -0.41027f, -0.410182f, -0.410094f, -0.410005f, -0.409917f, -0.409829f, -0.40974f, -0.409652f,
--0.409564f, -0.409475f, -0.409387f, -0.409299f, -0.40921f, -0.409122f, -0.409034f, -0.408945f, -0.408857f, -0.408768f, -0.40868f, -0.408592f, -0.408503f, -0.408415f, -0.408326f, -0.408238f, -0.40815f, -0.408061f, -0.407973f, -0.407884f,
--0.407796f, -0.407707f, -0.407619f, -0.40753f, -0.407442f, -0.407354f, -0.407265f, -0.407177f, -0.407088f, -0.407f, -0.406911f, -0.406823f, -0.406734f, -0.406646f, -0.406557f, -0.406468f, -0.40638f, -0.406291f, -0.406203f, -0.406114f,
--0.406026f, -0.405937f, -0.405849f, -0.40576f, -0.405671f, -0.405583f, -0.405494f, -0.405406f, -0.405317f, -0.405228f, -0.40514f, -0.405051f, -0.404963f, -0.404874f, -0.404785f, -0.404697f, -0.404608f, -0.404519f, -0.404431f, -0.404342f,
--0.404253f, -0.404165f, -0.404076f, -0.403987f, -0.403899f, -0.40381f, -0.403721f, -0.403632f, -0.403544f, -0.403455f, -0.403366f, -0.403278f, -0.403189f, -0.4031f, -0.403011f, -0.402923f, -0.402834f, -0.402745f, -0.402656f, -0.402567f,
--0.402479f, -0.40239f, -0.402301f, -0.402212f, -0.402123f, -0.402035f, -0.401946f, -0.401857f, -0.401768f, -0.401679f, -0.401591f, -0.401502f, -0.401413f, -0.401324f, -0.401235f, -0.401146f, -0.401057f, -0.400968f, -0.40088f, -0.400791f,
--0.400702f, -0.400613f, -0.400524f, -0.400435f, -0.400346f, -0.400257f, -0.400168f, -0.400079f, -0.39999f, -0.399901f, -0.399812f, -0.399724f, -0.399635f, -0.399546f, -0.399457f, -0.399368f, -0.399279f, -0.39919f, -0.399101f, -0.399012f,
--0.398923f, -0.398834f, -0.398745f, -0.398656f, -0.398566f, -0.398477f, -0.398388f, -0.398299f, -0.39821f, -0.398121f, -0.398032f, -0.397943f, -0.397854f, -0.397765f, -0.397676f, -0.397587f, -0.397498f, -0.397409f, -0.397319f, -0.39723f,
--0.397141f, -0.397052f, -0.396963f, -0.396874f, -0.396785f, -0.396695f, -0.396606f, -0.396517f, -0.396428f, -0.396339f, -0.39625f, -0.39616f, -0.396071f, -0.395982f, -0.395893f, -0.395804f, -0.395714f, -0.395625f, -0.395536f, -0.395447f,
--0.395357f, -0.395268f, -0.395179f, -0.39509f, -0.395f, -0.394911f, -0.394822f, -0.394733f, -0.394643f, -0.394554f, -0.394465f, -0.394376f, -0.394286f, -0.394197f, -0.394108f, -0.394018f, -0.393929f, -0.39384f, -0.39375f, -0.393661f,
--0.393572f, -0.393482f, -0.393393f, -0.393303f, -0.393214f, -0.393125f, -0.393035f, -0.392946f, -0.392857f, -0.392767f, -0.392678f, -0.392588f, -0.392499f, -0.39241f, -0.39232f, -0.392231f, -0.392141f, -0.392052f, -0.391962f, -0.391873f,
--0.391783f, -0.391694f, -0.391605f, -0.391515f, -0.391426f, -0.391336f, -0.391247f, -0.391157f, -0.391068f, -0.390978f, -0.390889f, -0.390799f, -0.390709f, -0.39062f, -0.39053f, -0.390441f, -0.390351f, -0.390262f, -0.390172f, -0.390083f,
--0.389993f, -0.389904f, -0.389814f, -0.389724f, -0.389635f, -0.389545f, -0.389456f, -0.389366f, -0.389276f, -0.389187f, -0.389097f, -0.389007f, -0.388918f, -0.388828f, -0.388739f, -0.388649f, -0.388559f, -0.38847f, -0.38838f, -0.38829f,
--0.388201f, -0.388111f, -0.388021f, -0.387931f, -0.387842f, -0.387752f, -0.387662f, -0.387573f, -0.387483f, -0.387393f, -0.387303f, -0.387214f, -0.387124f, -0.387034f, -0.386944f, -0.386855f, -0.386765f, -0.386675f, -0.386585f, -0.386496f,
--0.386406f, -0.386316f, -0.386226f, -0.386136f, -0.386047f, -0.385957f, -0.385867f, -0.385777f, -0.385687f, -0.385597f, -0.385508f, -0.385418f, -0.385328f, -0.385238f, -0.385148f, -0.385058f, -0.384968f, -0.384879f, -0.384789f, -0.384699f,
--0.384609f, -0.384519f, -0.384429f, -0.384339f, -0.384249f, -0.384159f, -0.384069f, -0.383979f, -0.383889f, -0.3838f, -0.38371f, -0.38362f, -0.38353f, -0.38344f, -0.38335f, -0.38326f, -0.38317f, -0.38308f, -0.38299f, -0.3829f,
--0.38281f, -0.38272f, -0.38263f, -0.38254f, -0.38245f, -0.38236f, -0.38227f, -0.38218f, -0.38209f, -0.381999f, -0.381909f, -0.381819f, -0.381729f, -0.381639f, -0.381549f, -0.381459f, -0.381369f, -0.381279f, -0.381189f, -0.381099f,
--0.381008f, -0.380918f, -0.380828f, -0.380738f, -0.380648f, -0.380558f, -0.380468f, -0.380378f, -0.380287f, -0.380197f, -0.380107f, -0.380017f, -0.379927f, -0.379837f, -0.379746f, -0.379656f, -0.379566f, -0.379476f, -0.379386f, -0.379295f,
--0.379205f, -0.379115f, -0.379025f, -0.378934f, -0.378844f, -0.378754f, -0.378664f, -0.378573f, -0.378483f, -0.378393f, -0.378303f, -0.378212f, -0.378122f, -0.378032f, -0.377941f, -0.377851f, -0.377761f, -0.37767f, -0.37758f, -0.37749f,
--0.377399f, -0.377309f, -0.377219f, -0.377128f, -0.377038f, -0.376948f, -0.376857f, -0.376767f, -0.376677f, -0.376586f, -0.376496f, -0.376406f, -0.376315f, -0.376225f, -0.376134f, -0.376044f, -0.375953f, -0.375863f, -0.375773f, -0.375682f,
--0.375592f, -0.375501f, -0.375411f, -0.37532f, -0.37523f, -0.37514f, -0.375049f, -0.374959f, -0.374868f, -0.374778f, -0.374687f, -0.374597f, -0.374506f, -0.374416f, -0.374325f, -0.374235f, -0.374144f, -0.374054f, -0.373963f, -0.373872f,
--0.373782f, -0.373691f, -0.373601f, -0.37351f, -0.37342f, -0.373329f, -0.373239f, -0.373148f, -0.373057f, -0.372967f, -0.372876f, -0.372786f, -0.372695f, -0.372604f, -0.372514f, -0.372423f, -0.372333f, -0.372242f, -0.372151f, -0.372061f,
--0.37197f, -0.371879f, -0.371789f, -0.371698f, -0.371607f, -0.371517f, -0.371426f, -0.371335f, -0.371245f, -0.371154f, -0.371063f, -0.370973f, -0.370882f, -0.370791f, -0.3707f, -0.37061f, -0.370519f, -0.370428f, -0.370337f, -0.370247f,
--0.370156f, -0.370065f, -0.369974f, -0.369884f, -0.369793f, -0.369702f, -0.369611f, -0.36952f, -0.36943f, -0.369339f, -0.369248f, -0.369157f, -0.369066f, -0.368976f, -0.368885f, -0.368794f, -0.368703f, -0.368612f, -0.368521f, -0.368431f,
--0.36834f, -0.368249f, -0.368158f, -0.368067f, -0.367976f, -0.367885f, -0.367794f, -0.367704f, -0.367613f, -0.367522f, -0.367431f, -0.36734f, -0.367249f, -0.367158f, -0.367067f, -0.366976f, -0.366885f, -0.366794f, -0.366703f, -0.366612f,
--0.366521f, -0.366431f, -0.36634f, -0.366249f, -0.366158f, -0.366067f, -0.365976f, -0.365885f, -0.365794f, -0.365703f, -0.365612f, -0.365521f, -0.36543f, -0.365339f, -0.365247f, -0.365156f, -0.365065f, -0.364974f, -0.364883f, -0.364792f,
--0.364701f, -0.36461f, -0.364519f, -0.364428f, -0.364337f, -0.364246f, -0.364155f, -0.364064f, -0.363972f, -0.363881f, -0.36379f, -0.363699f, -0.363608f, -0.363517f, -0.363426f, -0.363335f, -0.363243f, -0.363152f, -0.363061f, -0.36297f,
--0.362879f, -0.362788f, -0.362696f, -0.362605f, -0.362514f, -0.362423f, -0.362332f, -0.36224f, -0.362149f, -0.362058f, -0.361967f, -0.361876f, -0.361784f, -0.361693f, -0.361602f, -0.361511f, -0.361419f, -0.361328f, -0.361237f, -0.361146f,
--0.361054f, -0.360963f, -0.360872f, -0.36078f, -0.360689f, -0.360598f, -0.360507f, -0.360415f, -0.360324f, -0.360233f, -0.360141f, -0.36005f, -0.359959f, -0.359867f, -0.359776f, -0.359685f, -0.359593f, -0.359502f, -0.35941f, -0.359319f,
--0.359228f, -0.359136f, -0.359045f, -0.358954f, -0.358862f, -0.358771f, -0.358679f, -0.358588f, -0.358497f, -0.358405f, -0.358314f, -0.358222f, -0.358131f, -0.358039f, -0.357948f, -0.357857f, -0.357765f, -0.357674f, -0.357582f, -0.357491f,
--0.357399f, -0.357308f, -0.357216f, -0.357125f, -0.357033f, -0.356942f, -0.35685f, -0.356759f, -0.356667f, -0.356576f, -0.356484f, -0.356393f, -0.356301f, -0.35621f, -0.356118f, -0.356026f, -0.355935f, -0.355843f, -0.355752f, -0.35566f,
--0.355569f, -0.355477f, -0.355385f, -0.355294f, -0.355202f, -0.355111f, -0.355019f, -0.354927f, -0.354836f, -0.354744f, -0.354653f, -0.354561f, -0.354469f, -0.354378f, -0.354286f, -0.354194f, -0.354103f, -0.354011f, -0.353919f, -0.353828f,
--0.353736f, -0.353644f, -0.353553f, -0.353461f, -0.353369f, -0.353277f, -0.353186f, -0.353094f, -0.353002f, -0.352911f, -0.352819f, -0.352727f, -0.352635f, -0.352544f, -0.352452f, -0.35236f, -0.352268f, -0.352177f, -0.352085f, -0.351993f,
--0.351901f, -0.35181f, -0.351718f, -0.351626f, -0.351534f, -0.351442f, -0.351351f, -0.351259f, -0.351167f, -0.351075f, -0.350983f, -0.350891f, -0.3508f, -0.350708f, -0.350616f, -0.350524f, -0.350432f, -0.35034f, -0.350248f, -0.350157f,
--0.350065f, -0.349973f, -0.349881f, -0.349789f, -0.349697f, -0.349605f, -0.349513f, -0.349421f, -0.349329f, -0.349238f, -0.349146f, -0.349054f, -0.348962f, -0.34887f, -0.348778f, -0.348686f, -0.348594f, -0.348502f, -0.34841f, -0.348318f,
--0.348226f, -0.348134f, -0.348042f, -0.34795f, -0.347858f, -0.347766f, -0.347674f, -0.347582f, -0.34749f, -0.347398f, -0.347306f, -0.347214f, -0.347122f, -0.34703f, -0.346938f, -0.346846f, -0.346754f, -0.346662f, -0.34657f, -0.346477f,
--0.346385f, -0.346293f, -0.346201f, -0.346109f, -0.346017f, -0.345925f, -0.345833f, -0.345741f, -0.345649f, -0.345556f, -0.345464f, -0.345372f, -0.34528f, -0.345188f, -0.345096f, -0.345004f, -0.344911f, -0.344819f, -0.344727f, -0.344635f,
--0.344543f, -0.344451f, -0.344358f, -0.344266f, -0.344174f, -0.344082f, -0.34399f, -0.343897f, -0.343805f, -0.343713f, -0.343621f, -0.343529f, -0.343436f, -0.343344f, -0.343252f, -0.34316f, -0.343067f, -0.342975f, -0.342883f, -0.342791f,
--0.342698f, -0.342606f, -0.342514f, -0.342421f, -0.342329f, -0.342237f, -0.342145f, -0.342052f, -0.34196f, -0.341868f, -0.341775f, -0.341683f, -0.341591f, -0.341498f, -0.341406f, -0.341314f, -0.341221f, -0.341129f, -0.341036f, -0.340944f,
--0.340852f, -0.340759f, -0.340667f, -0.340575f, -0.340482f, -0.34039f, -0.340297f, -0.340205f, -0.340113f, -0.34002f, -0.339928f, -0.339835f, -0.339743f, -0.33965f, -0.339558f, -0.339466f, -0.339373f, -0.339281f, -0.339188f, -0.339096f,
--0.339003f, -0.338911f, -0.338818f, -0.338726f, -0.338633f, -0.338541f, -0.338448f, -0.338356f, -0.338263f, -0.338171f, -0.338078f, -0.337986f, -0.337893f, -0.337801f, -0.337708f, -0.337616f, -0.337523f, -0.337431f, -0.337338f, -0.337245f,
--0.337153f, -0.33706f, -0.336968f, -0.336875f, -0.336783f, -0.33669f, -0.336597f, -0.336505f, -0.336412f, -0.33632f, -0.336227f, -0.336134f, -0.336042f, -0.335949f, -0.335856f, -0.335764f, -0.335671f, -0.335579f, -0.335486f, -0.335393f,
--0.335301f, -0.335208f, -0.335115f, -0.335023f, -0.33493f, -0.334837f, -0.334744f, -0.334652f, -0.334559f, -0.334466f, -0.334374f, -0.334281f, -0.334188f, -0.334096f, -0.334003f, -0.33391f, -0.333817f, -0.333725f, -0.333632f, -0.333539f,
--0.333446f, -0.333354f, -0.333261f, -0.333168f, -0.333075f, -0.332982f, -0.33289f, -0.332797f, -0.332704f, -0.332611f, -0.332518f, -0.332426f, -0.332333f, -0.33224f, -0.332147f, -0.332054f, -0.331962f, -0.331869f, -0.331776f, -0.331683f,
--0.33159f, -0.331497f, -0.331404f, -0.331312f, -0.331219f, -0.331126f, -0.331033f, -0.33094f, -0.330847f, -0.330754f, -0.330661f, -0.330568f, -0.330476f, -0.330383f, -0.33029f, -0.330197f, -0.330104f, -0.330011f, -0.329918f, -0.329825f,
--0.329732f, -0.329639f, -0.329546f, -0.329453f, -0.32936f, -0.329267f, -0.329174f, -0.329081f, -0.328988f, -0.328895f, -0.328802f, -0.328709f, -0.328616f, -0.328523f, -0.32843f, -0.328337f, -0.328244f, -0.328151f, -0.328058f, -0.327965f,
--0.327872f, -0.327779f, -0.327686f, -0.327593f, -0.3275f, -0.327407f, -0.327314f, -0.327221f, -0.327128f, -0.327035f, -0.326941f, -0.326848f, -0.326755f, -0.326662f, -0.326569f, -0.326476f, -0.326383f, -0.32629f, -0.326197f, -0.326103f,
--0.32601f, -0.325917f, -0.325824f, -0.325731f, -0.325638f, -0.325545f, -0.325451f, -0.325358f, -0.325265f, -0.325172f, -0.325079f, -0.324986f, -0.324892f, -0.324799f, -0.324706f, -0.324613f, -0.32452f, -0.324426f, -0.324333f, -0.32424f,
--0.324147f, -0.324053f, -0.32396f, -0.323867f, -0.323774f, -0.32368f, -0.323587f, -0.323494f, -0.323401f, -0.323307f, -0.323214f, -0.323121f, -0.323028f, -0.322934f, -0.322841f, -0.322748f, -0.322654f, -0.322561f, -0.322468f, -0.322374f,
--0.322281f, -0.322188f, -0.322094f, -0.322001f, -0.321908f, -0.321814f, -0.321721f, -0.321628f, -0.321534f, -0.321441f, -0.321348f, -0.321254f, -0.321161f, -0.321068f, -0.320974f, -0.320881f, -0.320787f, -0.320694f, -0.320601f, -0.320507f,
--0.320414f, -0.32032f, -0.320227f, -0.320133f, -0.32004f, -0.319947f, -0.319853f, -0.31976f, -0.319666f, -0.319573f, -0.319479f, -0.319386f, -0.319292f, -0.319199f, -0.319105f, -0.319012f, -0.318918f, -0.318825f, -0.318731f, -0.318638f,
--0.318544f, -0.318451f, -0.318357f, -0.318264f, -0.31817f, -0.318077f, -0.317983f, -0.31789f, -0.317796f, -0.317703f, -0.317609f, -0.317516f, -0.317422f, -0.317329f, -0.317235f, -0.317141f, -0.317048f, -0.316954f, -0.316861f, -0.316767f,
--0.316673f, -0.31658f, -0.316486f, -0.316393f, -0.316299f, -0.316205f, -0.316112f, -0.316018f, -0.315924f, -0.315831f, -0.315737f, -0.315644f, -0.31555f, -0.315456f, -0.315363f, -0.315269f, -0.315175f, -0.315082f, -0.314988f, -0.314894f,
--0.314801f, -0.314707f, -0.314613f, -0.314519f, -0.314426f, -0.314332f, -0.314238f, -0.314145f, -0.314051f, -0.313957f, -0.313863f, -0.31377f, -0.313676f, -0.313582f, -0.313488f, -0.313395f, -0.313301f, -0.313207f, -0.313113f, -0.31302f,
--0.312926f, -0.312832f, -0.312738f, -0.312644f, -0.312551f, -0.312457f, -0.312363f, -0.312269f, -0.312175f, -0.312082f, -0.311988f, -0.311894f, -0.3118f, -0.311706f, -0.311613f, -0.311519f, -0.311425f, -0.311331f, -0.311237f, -0.311143f,
--0.311049f, -0.310955f, -0.310862f, -0.310768f, -0.310674f, -0.31058f, -0.310486f, -0.310392f, -0.310298f, -0.310204f, -0.31011f, -0.310017f, -0.309923f, -0.309829f, -0.309735f, -0.309641f, -0.309547f, -0.309453f, -0.309359f, -0.309265f,
--0.309171f, -0.309077f, -0.308983f, -0.308889f, -0.308795f, -0.308701f, -0.308607f, -0.308513f, -0.308419f, -0.308325f, -0.308231f, -0.308137f, -0.308043f, -0.307949f, -0.307855f, -0.307761f, -0.307667f, -0.307573f, -0.307479f, -0.307385f,
--0.307291f, -0.307197f, -0.307103f, -0.307009f, -0.306915f, -0.306821f, -0.306727f, -0.306633f, -0.306539f, -0.306444f, -0.30635f, -0.306256f, -0.306162f, -0.306068f, -0.305974f, -0.30588f, -0.305786f, -0.305692f, -0.305597f, -0.305503f,
--0.305409f, -0.305315f, -0.305221f, -0.305127f, -0.305033f, -0.304938f, -0.304844f, -0.30475f, -0.304656f, -0.304562f, -0.304468f, -0.304373f, -0.304279f, -0.304185f, -0.304091f, -0.303997f, -0.303902f, -0.303808f, -0.303714f, -0.30362f,
--0.303526f, -0.303431f, -0.303337f, -0.303243f, -0.303149f, -0.303054f, -0.30296f, -0.302866f, -0.302772f, -0.302677f, -0.302583f, -0.302489f, -0.302395f, -0.3023f, -0.302206f, -0.302112f, -0.302017f, -0.301923f, -0.301829f, -0.301735f,
--0.30164f, -0.301546f, -0.301452f, -0.301357f, -0.301263f, -0.301169f, -0.301074f, -0.30098f, -0.300886f, -0.300791f, -0.300697f, -0.300603f, -0.300508f, -0.300414f, -0.300319f, -0.300225f, -0.300131f, -0.300036f, -0.299942f, -0.299848f,
--0.299753f, -0.299659f, -0.299564f, -0.29947f, -0.299376f, -0.299281f, -0.299187f, -0.299092f, -0.298998f, -0.298903f, -0.298809f, -0.298715f, -0.29862f, -0.298526f, -0.298431f, -0.298337f, -0.298242f, -0.298148f, -0.298053f, -0.297959f,
--0.297864f, -0.29777f, -0.297675f, -0.297581f, -0.297486f, -0.297392f, -0.297297f, -0.297203f, -0.297108f, -0.297014f, -0.296919f, -0.296825f, -0.29673f, -0.296636f, -0.296541f, -0.296447f, -0.296352f, -0.296258f, -0.296163f, -0.296068f,
--0.295974f, -0.295879f, -0.295785f, -0.29569f, -0.295596f, -0.295501f, -0.295406f, -0.295312f, -0.295217f, -0.295123f, -0.295028f, -0.294933f, -0.294839f, -0.294744f, -0.294649f, -0.294555f, -0.29446f, -0.294366f, -0.294271f, -0.294176f,
--0.294082f, -0.293987f, -0.293892f, -0.293798f, -0.293703f, -0.293608f, -0.293514f, -0.293419f, -0.293324f, -0.293229f, -0.293135f, -0.29304f, -0.292945f, -0.292851f, -0.292756f, -0.292661f, -0.292567f, -0.292472f, -0.292377f, -0.292282f,
--0.292188f, -0.292093f, -0.291998f, -0.291903f, -0.291809f, -0.291714f, -0.291619f, -0.291524f, -0.29143f, -0.291335f, -0.29124f, -0.291145f, -0.29105f, -0.290956f, -0.290861f, -0.290766f, -0.290671f, -0.290576f, -0.290482f, -0.290387f,
--0.290292f, -0.290197f, -0.290102f, -0.290007f, -0.289913f, -0.289818f, -0.289723f, -0.289628f, -0.289533f, -0.289438f, -0.289344f, -0.289249f, -0.289154f, -0.289059f, -0.288964f, -0.288869f, -0.288774f, -0.288679f, -0.288584f, -0.28849f,
--0.288395f, -0.2883f, -0.288205f, -0.28811f, -0.288015f, -0.28792f, -0.287825f, -0.28773f, -0.287635f, -0.28754f, -0.287445f, -0.28735f, -0.287255f, -0.28716f, -0.287066f, -0.286971f, -0.286876f, -0.286781f, -0.286686f, -0.286591f,
--0.286496f, -0.286401f, -0.286306f, -0.286211f, -0.286116f, -0.286021f, -0.285926f, -0.285831f, -0.285736f, -0.285641f, -0.285546f, -0.28545f, -0.285355f, -0.28526f, -0.285165f, -0.28507f, -0.284975f, -0.28488f, -0.284785f, -0.28469f,
--0.284595f, -0.2845f, -0.284405f, -0.28431f, -0.284215f, -0.28412f, -0.284024f, -0.283929f, -0.283834f, -0.283739f, -0.283644f, -0.283549f, -0.283454f, -0.283359f, -0.283264f, -0.283168f, -0.283073f, -0.282978f, -0.282883f, -0.282788f,
--0.282693f, -0.282598f, -0.282502f, -0.282407f, -0.282312f, -0.282217f, -0.282122f, -0.282026f, -0.281931f, -0.281836f, -0.281741f, -0.281646f, -0.281551f, -0.281455f, -0.28136f, -0.281265f, -0.28117f, -0.281074f, -0.280979f, -0.280884f,
--0.280789f, -0.280693f, -0.280598f, -0.280503f, -0.280408f, -0.280312f, -0.280217f, -0.280122f, -0.280027f, -0.279931f, -0.279836f, -0.279741f, -0.279646f, -0.27955f, -0.279455f, -0.27936f, -0.279264f, -0.279169f, -0.279074f, -0.278978f,
--0.278883f, -0.278788f, -0.278693f, -0.278597f, -0.278502f, -0.278407f, -0.278311f, -0.278216f, -0.27812f, -0.278025f, -0.27793f, -0.277834f, -0.277739f, -0.277644f, -0.277548f, -0.277453f, -0.277358f, -0.277262f, -0.277167f, -0.277071f,
--0.276976f, -0.276881f, -0.276785f, -0.27669f, -0.276594f, -0.276499f, -0.276403f, -0.276308f, -0.276213f, -0.276117f, -0.276022f, -0.275926f, -0.275831f, -0.275735f, -0.27564f, -0.275544f, -0.275449f, -0.275354f, -0.275258f, -0.275163f,
--0.275067f, -0.274972f, -0.274876f, -0.274781f, -0.274685f, -0.27459f, -0.274494f, -0.274399f, -0.274303f, -0.274208f, -0.274112f, -0.274017f, -0.273921f, -0.273826f, -0.27373f, -0.273634f, -0.273539f, -0.273443f, -0.273348f, -0.273252f,
--0.273157f, -0.273061f, -0.272966f, -0.27287f, -0.272774f, -0.272679f, -0.272583f, -0.272488f, -0.272392f, -0.272297f, -0.272201f, -0.272105f, -0.27201f, -0.271914f, -0.271818f, -0.271723f, -0.271627f, -0.271532f, -0.271436f, -0.27134f,
--0.271245f, -0.271149f, -0.271053f, -0.270958f, -0.270862f, -0.270766f, -0.270671f, -0.270575f, -0.270479f, -0.270384f, -0.270288f, -0.270192f, -0.270097f, -0.270001f, -0.269905f, -0.26981f, -0.269714f, -0.269618f, -0.269523f, -0.269427f,
--0.269331f, -0.269235f, -0.26914f, -0.269044f, -0.268948f, -0.268852f, -0.268757f, -0.268661f, -0.268565f, -0.268469f, -0.268374f, -0.268278f, -0.268182f, -0.268086f, -0.267991f, -0.267895f, -0.267799f, -0.267703f, -0.267608f, -0.267512f,
--0.267416f, -0.26732f, -0.267224f, -0.267129f, -0.267033f, -0.266937f, -0.266841f, -0.266745f, -0.266649f, -0.266554f, -0.266458f, -0.266362f, -0.266266f, -0.26617f, -0.266074f, -0.265979f, -0.265883f, -0.265787f, -0.265691f, -0.265595f,
--0.265499f, -0.265403f, -0.265307f, -0.265212f, -0.265116f, -0.26502f, -0.264924f, -0.264828f, -0.264732f, -0.264636f, -0.26454f, -0.264444f, -0.264348f, -0.264253f, -0.264157f, -0.264061f, -0.263965f, -0.263869f, -0.263773f, -0.263677f,
--0.263581f, -0.263485f, -0.263389f, -0.263293f, -0.263197f, -0.263101f, -0.263005f, -0.262909f, -0.262813f, -0.262717f, -0.262621f, -0.262525f, -0.262429f, -0.262333f, -0.262237f, -0.262141f, -0.262045f, -0.261949f, -0.261853f, -0.261757f,
--0.261661f, -0.261565f, -0.261469f, -0.261373f, -0.261277f, -0.261181f, -0.261085f, -0.260989f, -0.260893f, -0.260797f, -0.260701f, -0.260605f, -0.260509f, -0.260412f, -0.260316f, -0.26022f, -0.260124f, -0.260028f, -0.259932f, -0.259836f,
--0.25974f, -0.259644f, -0.259548f, -0.259451f, -0.259355f, -0.259259f, -0.259163f, -0.259067f, -0.258971f, -0.258875f, -0.258779f, -0.258682f, -0.258586f, -0.25849f, -0.258394f, -0.258298f, -0.258202f, -0.258105f, -0.258009f, -0.257913f,
--0.257817f, -0.257721f, -0.257625f, -0.257528f, -0.257432f, -0.257336f, -0.25724f, -0.257144f, -0.257047f, -0.256951f, -0.256855f, -0.256759f, -0.256662f, -0.256566f, -0.25647f, -0.256374f, -0.256278f, -0.256181f, -0.256085f, -0.255989f,
--0.255893f, -0.255796f, -0.2557f, -0.255604f, -0.255507f, -0.255411f, -0.255315f, -0.255219f, -0.255122f, -0.255026f, -0.25493f, -0.254833f, -0.254737f, -0.254641f, -0.254545f, -0.254448f, -0.254352f, -0.254256f, -0.254159f, -0.254063f,
--0.253967f, -0.25387f, -0.253774f, -0.253678f, -0.253581f, -0.253485f, -0.253389f, -0.253292f, -0.253196f, -0.2531f, -0.253003f, -0.252907f, -0.25281f, -0.252714f, -0.252618f, -0.252521f, -0.252425f, -0.252328f, -0.252232f, -0.252136f,
--0.252039f, -0.251943f, -0.251846f, -0.25175f, -0.251654f, -0.251557f, -0.251461f, -0.251364f, -0.251268f, -0.251171f, -0.251075f, -0.250979f, -0.250882f, -0.250786f, -0.250689f, -0.250593f, -0.250496f, -0.2504f, -0.250303f, -0.250207f,
--0.25011f, -0.250014f, -0.249917f, -0.249821f, -0.249724f, -0.249628f, -0.249531f, -0.249435f, -0.249338f, -0.249242f, -0.249145f, -0.249049f, -0.248952f, -0.248856f, -0.248759f, -0.248663f, -0.248566f, -0.24847f, -0.248373f, -0.248277f,
--0.24818f, -0.248084f, -0.247987f, -0.24789f, -0.247794f, -0.247697f, -0.247601f, -0.247504f, -0.247408f, -0.247311f, -0.247214f, -0.247118f, -0.247021f, -0.246925f, -0.246828f, -0.246731f, -0.246635f, -0.246538f, -0.246442f, -0.246345f,
--0.246248f, -0.246152f, -0.246055f, -0.245958f, -0.245862f, -0.245765f, -0.245668f, -0.245572f, -0.245475f, -0.245379f, -0.245282f, -0.245185f, -0.245089f, -0.244992f, -0.244895f, -0.244798f, -0.244702f, -0.244605f, -0.244508f, -0.244412f,
--0.244315f, -0.244218f, -0.244122f, -0.244025f, -0.243928f, -0.243832f, -0.243735f, -0.243638f, -0.243541f, -0.243445f, -0.243348f, -0.243251f, -0.243154f, -0.243058f, -0.242961f, -0.242864f, -0.242767f, -0.242671f, -0.242574f, -0.242477f,
--0.24238f, -0.242284f, -0.242187f, -0.24209f, -0.241993f, -0.241896f, -0.2418f, -0.241703f, -0.241606f, -0.241509f, -0.241412f, -0.241316f, -0.241219f, -0.241122f, -0.241025f, -0.240928f, -0.240832f, -0.240735f, -0.240638f, -0.240541f,
--0.240444f, -0.240347f, -0.240251f, -0.240154f, -0.240057f, -0.23996f, -0.239863f, -0.239766f, -0.239669f, -0.239573f, -0.239476f, -0.239379f, -0.239282f, -0.239185f, -0.239088f, -0.238991f, -0.238894f, -0.238797f, -0.238701f, -0.238604f,
--0.238507f, -0.23841f, -0.238313f, -0.238216f, -0.238119f, -0.238022f, -0.237925f, -0.237828f, -0.237731f, -0.237634f, -0.237537f, -0.23744f, -0.237344f, -0.237247f, -0.23715f, -0.237053f, -0.236956f, -0.236859f, -0.236762f, -0.236665f,
--0.236568f, -0.236471f, -0.236374f, -0.236277f, -0.23618f, -0.236083f, -0.235986f, -0.235889f, -0.235792f, -0.235695f, -0.235598f, -0.235501f, -0.235404f, -0.235307f, -0.23521f, -0.235113f, -0.235016f, -0.234919f, -0.234822f, -0.234724f,
--0.234627f, -0.23453f, -0.234433f, -0.234336f, -0.234239f, -0.234142f, -0.234045f, -0.233948f, -0.233851f, -0.233754f, -0.233657f, -0.23356f, -0.233463f, -0.233365f, -0.233268f, -0.233171f, -0.233074f, -0.232977f, -0.23288f, -0.232783f,
--0.232686f, -0.232589f, -0.232491f, -0.232394f, -0.232297f, -0.2322f, -0.232103f, -0.232006f, -0.231909f, -0.231811f, -0.231714f, -0.231617f, -0.23152f, -0.231423f, -0.231326f, -0.231228f, -0.231131f, -0.231034f, -0.230937f, -0.23084f,
--0.230743f, -0.230645f, -0.230548f, -0.230451f, -0.230354f, -0.230257f, -0.230159f, -0.230062f, -0.229965f, -0.229868f, -0.22977f, -0.229673f, -0.229576f, -0.229479f, -0.229382f, -0.229284f, -0.229187f, -0.22909f, -0.228993f, -0.228895f,
--0.228798f, -0.228701f, -0.228604f, -0.228506f, -0.228409f, -0.228312f, -0.228214f, -0.228117f, -0.22802f, -0.227923f, -0.227825f, -0.227728f, -0.227631f, -0.227533f, -0.227436f, -0.227339f, -0.227241f, -0.227144f, -0.227047f, -0.22695f,
--0.226852f, -0.226755f, -0.226658f, -0.22656f, -0.226463f, -0.226366f, -0.226268f, -0.226171f, -0.226074f, -0.225976f, -0.225879f, -0.225781f, -0.225684f, -0.225587f, -0.225489f, -0.225392f, -0.225295f, -0.225197f, -0.2251f, -0.225002f,
--0.224905f, -0.224808f, -0.22471f, -0.224613f, -0.224515f, -0.224418f, -0.224321f, -0.224223f, -0.224126f, -0.224028f, -0.223931f, -0.223833f, -0.223736f, -0.223639f, -0.223541f, -0.223444f, -0.223346f, -0.223249f, -0.223151f, -0.223054f,
--0.222956f, -0.222859f, -0.222762f, -0.222664f, -0.222567f, -0.222469f, -0.222372f, -0.222274f, -0.222177f, -0.222079f, -0.221982f, -0.221884f, -0.221787f, -0.221689f, -0.221592f, -0.221494f, -0.221397f, -0.221299f, -0.221202f, -0.221104f,
--0.221007f, -0.220909f, -0.220812f, -0.220714f, -0.220616f, -0.220519f, -0.220421f, -0.220324f, -0.220226f, -0.220129f, -0.220031f, -0.219934f, -0.219836f, -0.219738f, -0.219641f, -0.219543f, -0.219446f, -0.219348f, -0.219251f, -0.219153f,
--0.219055f, -0.218958f, -0.21886f, -0.218763f, -0.218665f, -0.218567f, -0.21847f, -0.218372f, -0.218275f, -0.218177f, -0.218079f, -0.217982f, -0.217884f, -0.217786f, -0.217689f, -0.217591f, -0.217494f, -0.217396f, -0.217298f, -0.217201f,
--0.217103f, -0.217005f, -0.216908f, -0.21681f, -0.216712f, -0.216615f, -0.216517f, -0.216419f, -0.216322f, -0.216224f, -0.216126f, -0.216029f, -0.215931f, -0.215833f, -0.215735f, -0.215638f, -0.21554f, -0.215442f, -0.215345f, -0.215247f,
--0.215149f, -0.215051f, -0.214954f, -0.214856f, -0.214758f, -0.21466f, -0.214563f, -0.214465f, -0.214367f, -0.21427f, -0.214172f, -0.214074f, -0.213976f, -0.213878f, -0.213781f, -0.213683f, -0.213585f, -0.213487f, -0.21339f, -0.213292f,
--0.213194f, -0.213096f, -0.212998f, -0.212901f, -0.212803f, -0.212705f, -0.212607f, -0.212509f, -0.212412f, -0.212314f, -0.212216f, -0.212118f, -0.21202f, -0.211923f, -0.211825f, -0.211727f, -0.211629f, -0.211531f, -0.211433f, -0.211336f,
--0.211238f, -0.21114f, -0.211042f, -0.210944f, -0.210846f, -0.210748f, -0.210651f, -0.210553f, -0.210455f, -0.210357f, -0.210259f, -0.210161f, -0.210063f, -0.209965f, -0.209867f, -0.20977f, -0.209672f, -0.209574f, -0.209476f, -0.209378f,
--0.20928f, -0.209182f, -0.209084f, -0.208986f, -0.208888f, -0.20879f, -0.208693f, -0.208595f, -0.208497f, -0.208399f, -0.208301f, -0.208203f, -0.208105f, -0.208007f, -0.207909f, -0.207811f, -0.207713f, -0.207615f, -0.207517f, -0.207419f,
--0.207321f, -0.207223f, -0.207125f, -0.207027f, -0.206929f, -0.206831f, -0.206733f, -0.206635f, -0.206537f, -0.206439f, -0.206341f, -0.206243f, -0.206145f, -0.206047f, -0.205949f, -0.205851f, -0.205753f, -0.205655f, -0.205557f, -0.205459f,
--0.205361f, -0.205263f, -0.205165f, -0.205067f, -0.204969f, -0.204871f, -0.204773f, -0.204675f, -0.204577f, -0.204479f, -0.204381f, -0.204282f, -0.204184f, -0.204086f, -0.203988f, -0.20389f, -0.203792f, -0.203694f, -0.203596f, -0.203498f,
--0.2034f, -0.203302f, -0.203203f, -0.203105f, -0.203007f, -0.202909f, -0.202811f, -0.202713f, -0.202615f, -0.202517f, -0.202419f, -0.20232f, -0.202222f, -0.202124f, -0.202026f, -0.201928f, -0.20183f, -0.201732f, -0.201633f, -0.201535f,
--0.201437f, -0.201339f, -0.201241f, -0.201143f, -0.201044f, -0.200946f, -0.200848f, -0.20075f, -0.200652f, -0.200554f, -0.200455f, -0.200357f, -0.200259f, -0.200161f, -0.200063f, -0.199964f, -0.199866f, -0.199768f, -0.19967f, -0.199571f,
--0.199473f, -0.199375f, -0.199277f, -0.199179f, -0.19908f, -0.198982f, -0.198884f, -0.198786f, -0.198687f, -0.198589f, -0.198491f, -0.198393f, -0.198294f, -0.198196f, -0.198098f, -0.198f, -0.197901f, -0.197803f, -0.197705f, -0.197607f,
--0.197508f, -0.19741f, -0.197312f, -0.197213f, -0.197115f, -0.197017f, -0.196919f, -0.19682f, -0.196722f, -0.196624f, -0.196525f, -0.196427f, -0.196329f, -0.19623f, -0.196132f, -0.196034f, -0.195935f, -0.195837f, -0.195739f, -0.19564f,
--0.195542f, -0.195444f, -0.195345f, -0.195247f, -0.195149f, -0.19505f, -0.194952f, -0.194854f, -0.194755f, -0.194657f, -0.194558f, -0.19446f, -0.194362f, -0.194263f, -0.194165f, -0.194067f, -0.193968f, -0.19387f, -0.193771f, -0.193673f,
--0.193575f, -0.193476f, -0.193378f, -0.193279f, -0.193181f, -0.193083f, -0.192984f, -0.192886f, -0.192787f, -0.192689f, -0.19259f, -0.192492f, -0.192394f, -0.192295f, -0.192197f, -0.192098f, -0.192f, -0.191901f, -0.191803f, -0.191704f,
--0.191606f, -0.191508f, -0.191409f, -0.191311f, -0.191212f, -0.191114f, -0.191015f, -0.190917f, -0.190818f, -0.19072f, -0.190621f, -0.190523f, -0.190424f, -0.190326f, -0.190227f, -0.190129f, -0.19003f, -0.189932f, -0.189833f, -0.189735f,
--0.189636f, -0.189538f, -0.189439f, -0.189341f, -0.189242f, -0.189144f, -0.189045f, -0.188947f, -0.188848f, -0.18875f, -0.188651f, -0.188552f, -0.188454f, -0.188355f, -0.188257f, -0.188158f, -0.18806f, -0.187961f, -0.187863f, -0.187764f,
--0.187665f, -0.187567f, -0.187468f, -0.18737f, -0.187271f, -0.187172f, -0.187074f, -0.186975f, -0.186877f, -0.186778f, -0.18668f, -0.186581f, -0.186482f, -0.186384f, -0.186285f, -0.186186f, -0.186088f, -0.185989f, -0.185891f, -0.185792f,
--0.185693f, -0.185595f, -0.185496f, -0.185397f, -0.185299f, -0.1852f, -0.185102f, -0.185003f, -0.184904f, -0.184806f, -0.184707f, -0.184608f, -0.18451f, -0.184411f, -0.184312f, -0.184214f, -0.184115f, -0.184016f, -0.183918f, -0.183819f,
--0.18372f, -0.183621f, -0.183523f, -0.183424f, -0.183325f, -0.183227f, -0.183128f, -0.183029f, -0.182931f, -0.182832f, -0.182733f, -0.182634f, -0.182536f, -0.182437f, -0.182338f, -0.18224f, -0.182141f, -0.182042f, -0.181943f, -0.181845f,
--0.181746f, -0.181647f, -0.181548f, -0.18145f, -0.181351f, -0.181252f, -0.181153f, -0.181055f, -0.180956f, -0.180857f, -0.180758f, -0.18066f, -0.180561f, -0.180462f, -0.180363f, -0.180264f, -0.180166f, -0.180067f, -0.179968f, -0.179869f,
--0.17977f, -0.179672f, -0.179573f, -0.179474f, -0.179375f, -0.179276f, -0.179178f, -0.179079f, -0.17898f, -0.178881f, -0.178782f, -0.178683f, -0.178585f, -0.178486f, -0.178387f, -0.178288f, -0.178189f, -0.17809f, -0.177992f, -0.177893f,
--0.177794f, -0.177695f, -0.177596f, -0.177497f, -0.177398f, -0.1773f, -0.177201f, -0.177102f, -0.177003f, -0.176904f, -0.176805f, -0.176706f, -0.176607f, -0.176509f, -0.17641f, -0.176311f, -0.176212f, -0.176113f, -0.176014f, -0.175915f,
--0.175816f, -0.175717f, -0.175618f, -0.17552f, -0.175421f, -0.175322f, -0.175223f, -0.175124f, -0.175025f, -0.174926f, -0.174827f, -0.174728f, -0.174629f, -0.17453f, -0.174431f, -0.174332f, -0.174233f, -0.174134f, -0.174036f, -0.173937f,
--0.173838f, -0.173739f, -0.17364f, -0.173541f, -0.173442f, -0.173343f, -0.173244f, -0.173145f, -0.173046f, -0.172947f, -0.172848f, -0.172749f, -0.17265f, -0.172551f, -0.172452f, -0.172353f, -0.172254f, -0.172155f, -0.172056f, -0.171957f,
--0.171858f, -0.171759f, -0.17166f, -0.171561f, -0.171462f, -0.171363f, -0.171264f, -0.171165f, -0.171066f, -0.170967f, -0.170868f, -0.170768f, -0.170669f, -0.17057f, -0.170471f, -0.170372f, -0.170273f, -0.170174f, -0.170075f, -0.169976f,
--0.169877f, -0.169778f, -0.169679f, -0.16958f, -0.169481f, -0.169382f, -0.169283f, -0.169183f, -0.169084f, -0.168985f, -0.168886f, -0.168787f, -0.168688f, -0.168589f, -0.16849f, -0.168391f, -0.168292f, -0.168192f, -0.168093f, -0.167994f,
--0.167895f, -0.167796f, -0.167697f, -0.167598f, -0.167499f, -0.167399f, -0.1673f, -0.167201f, -0.167102f, -0.167003f, -0.166904f, -0.166805f, -0.166705f, -0.166606f, -0.166507f, -0.166408f, -0.166309f, -0.16621f, -0.166111f, -0.166011f,
--0.165912f, -0.165813f, -0.165714f, -0.165615f, -0.165515f, -0.165416f, -0.165317f, -0.165218f, -0.165119f, -0.16502f, -0.16492f, -0.164821f, -0.164722f, -0.164623f, -0.164524f, -0.164424f, -0.164325f, -0.164226f, -0.164127f, -0.164027f,
--0.163928f, -0.163829f, -0.16373f, -0.163631f, -0.163531f, -0.163432f, -0.163333f, -0.163234f, -0.163134f, -0.163035f, -0.162936f, -0.162837f, -0.162737f, -0.162638f, -0.162539f, -0.16244f, -0.16234f, -0.162241f, -0.162142f, -0.162043f,
--0.161943f, -0.161844f, -0.161745f, -0.161645f, -0.161546f, -0.161447f, -0.161348f, -0.161248f, -0.161149f, -0.16105f, -0.16095f, -0.160851f, -0.160752f, -0.160652f, -0.160553f, -0.160454f, -0.160355f, -0.160255f, -0.160156f, -0.160057f,
--0.159957f, -0.159858f, -0.159759f, -0.159659f, -0.15956f, -0.159461f, -0.159361f, -0.159262f, -0.159163f, -0.159063f, -0.158964f, -0.158865f, -0.158765f, -0.158666f, -0.158566f, -0.158467f, -0.158368f, -0.158268f, -0.158169f, -0.15807f,
--0.15797f, -0.157871f, -0.157771f, -0.157672f, -0.157573f, -0.157473f, -0.157374f, -0.157275f, -0.157175f, -0.157076f, -0.156976f, -0.156877f, -0.156778f, -0.156678f, -0.156579f, -0.156479f, -0.15638f, -0.156281f, -0.156181f, -0.156082f,
--0.155982f, -0.155883f, -0.155783f, -0.155684f, -0.155585f, -0.155485f, -0.155386f, -0.155286f, -0.155187f, -0.155087f, -0.154988f, -0.154888f, -0.154789f, -0.15469f, -0.15459f, -0.154491f, -0.154391f, -0.154292f, -0.154192f, -0.154093f,
--0.153993f, -0.153894f, -0.153794f, -0.153695f, -0.153595f, -0.153496f, -0.153396f, -0.153297f, -0.153197f, -0.153098f, -0.152998f, -0.152899f, -0.152799f, -0.1527f, -0.1526f, -0.152501f, -0.152401f, -0.152302f, -0.152202f, -0.152103f,
--0.152003f, -0.151904f, -0.151804f, -0.151705f, -0.151605f, -0.151506f, -0.151406f, -0.151307f, -0.151207f, -0.151108f, -0.151008f, -0.150908f, -0.150809f, -0.150709f, -0.15061f, -0.15051f, -0.150411f, -0.150311f, -0.150212f, -0.150112f,
--0.150012f, -0.149913f, -0.149813f, -0.149714f, -0.149614f, -0.149515f, -0.149415f, -0.149315f, -0.149216f, -0.149116f, -0.149017f, -0.148917f, -0.148817f, -0.148718f, -0.148618f, -0.148519f, -0.148419f, -0.148319f, -0.14822f, -0.14812f,
--0.148021f, -0.147921f, -0.147821f, -0.147722f, -0.147622f, -0.147523f, -0.147423f, -0.147323f, -0.147224f, -0.147124f, -0.147024f, -0.146925f, -0.146825f, -0.146725f, -0.146626f, -0.146526f, -0.146426f, -0.146327f, -0.146227f, -0.146128f,
--0.146028f, -0.145928f, -0.145829f, -0.145729f, -0.145629f, -0.14553f, -0.14543f, -0.14533f, -0.14523f, -0.145131f, -0.145031f, -0.144931f, -0.144832f, -0.144732f, -0.144632f, -0.144533f, -0.144433f, -0.144333f, -0.144234f, -0.144134f,
--0.144034f, -0.143934f, -0.143835f, -0.143735f, -0.143635f, -0.143536f, -0.143436f, -0.143336f, -0.143236f, -0.143137f, -0.143037f, -0.142937f, -0.142838f, -0.142738f, -0.142638f, -0.142538f, -0.142439f, -0.142339f, -0.142239f, -0.142139f,
--0.14204f, -0.14194f, -0.14184f, -0.14174f, -0.141641f, -0.141541f, -0.141441f, -0.141341f, -0.141241f, -0.141142f, -0.141042f, -0.140942f, -0.140842f, -0.140743f, -0.140643f, -0.140543f, -0.140443f, -0.140343f, -0.140244f, -0.140144f,
--0.140044f, -0.139944f, -0.139844f, -0.139745f, -0.139645f, -0.139545f, -0.139445f, -0.139345f, -0.139246f, -0.139146f, -0.139046f, -0.138946f, -0.138846f, -0.138746f, -0.138647f, -0.138547f, -0.138447f, -0.138347f, -0.138247f, -0.138147f,
--0.138048f, -0.137948f, -0.137848f, -0.137748f, -0.137648f, -0.137548f, -0.137448f, -0.137349f, -0.137249f, -0.137149f, -0.137049f, -0.136949f, -0.136849f, -0.136749f, -0.13665f, -0.13655f, -0.13645f, -0.13635f, -0.13625f, -0.13615f,
--0.13605f, -0.13595f, -0.135851f, -0.135751f, -0.135651f, -0.135551f, -0.135451f, -0.135351f, -0.135251f, -0.135151f, -0.135051f, -0.134951f, -0.134851f, -0.134752f, -0.134652f, -0.134552f, -0.134452f, -0.134352f, -0.134252f, -0.134152f,
--0.134052f, -0.133952f, -0.133852f, -0.133752f, -0.133652f, -0.133552f, -0.133452f, -0.133353f, -0.133253f, -0.133153f, -0.133053f, -0.132953f, -0.132853f, -0.132753f, -0.132653f, -0.132553f, -0.132453f, -0.132353f, -0.132253f, -0.132153f,
--0.132053f, -0.131953f, -0.131853f, -0.131753f, -0.131653f, -0.131553f, -0.131453f, -0.131353f, -0.131253f, -0.131153f, -0.131053f, -0.130953f, -0.130853f, -0.130753f, -0.130653f, -0.130553f, -0.130453f, -0.130353f, -0.130253f, -0.130153f,
--0.130053f, -0.129953f, -0.129853f, -0.129753f, -0.129653f, -0.129553f, -0.129453f, -0.129353f, -0.129253f, -0.129153f, -0.129053f, -0.128953f, -0.128853f, -0.128753f, -0.128653f, -0.128553f, -0.128453f, -0.128353f, -0.128253f, -0.128152f,
--0.128052f, -0.127952f, -0.127852f, -0.127752f, -0.127652f, -0.127552f, -0.127452f, -0.127352f, -0.127252f, -0.127152f, -0.127052f, -0.126952f, -0.126852f, -0.126751f, -0.126651f, -0.126551f, -0.126451f, -0.126351f, -0.126251f, -0.126151f,
--0.126051f, -0.125951f, -0.125851f, -0.125751f, -0.12565f, -0.12555f, -0.12545f, -0.12535f, -0.12525f, -0.12515f, -0.12505f, -0.12495f, -0.124849f, -0.124749f, -0.124649f, -0.124549f, -0.124449f, -0.124349f, -0.124249f, -0.124149f,
--0.124048f, -0.123948f, -0.123848f, -0.123748f, -0.123648f, -0.123548f, -0.123448f, -0.123347f, -0.123247f, -0.123147f, -0.123047f, -0.122947f, -0.122847f, -0.122746f, -0.122646f, -0.122546f, -0.122446f, -0.122346f, -0.122246f, -0.122145f,
--0.122045f, -0.121945f, -0.121845f, -0.121745f, -0.121644f, -0.121544f, -0.121444f, -0.121344f, -0.121244f, -0.121143f, -0.121043f, -0.120943f, -0.120843f, -0.120743f, -0.120642f, -0.120542f, -0.120442f, -0.120342f, -0.120242f, -0.120141f,
--0.120041f, -0.119941f, -0.119841f, -0.119741f, -0.11964f, -0.11954f, -0.11944f, -0.11934f, -0.119239f, -0.119139f, -0.119039f, -0.118939f, -0.118838f, -0.118738f, -0.118638f, -0.118538f, -0.118437f, -0.118337f, -0.118237f, -0.118137f,
--0.118036f, -0.117936f, -0.117836f, -0.117736f, -0.117635f, -0.117535f, -0.117435f, -0.117335f, -0.117234f, -0.117134f, -0.117034f, -0.116933f, -0.116833f, -0.116733f, -0.116633f, -0.116532f, -0.116432f, -0.116332f, -0.116231f, -0.116131f,
--0.116031f, -0.11593f, -0.11583f, -0.11573f, -0.11563f, -0.115529f, -0.115429f, -0.115329f, -0.115228f, -0.115128f, -0.115028f, -0.114927f, -0.114827f, -0.114727f, -0.114626f, -0.114526f, -0.114426f, -0.114325f, -0.114225f, -0.114125f,
--0.114024f, -0.113924f, -0.113824f, -0.113723f, -0.113623f, -0.113523f, -0.113422f, -0.113322f, -0.113222f, -0.113121f, -0.113021f, -0.112921f, -0.11282f, -0.11272f, -0.11262f, -0.112519f, -0.112419f, -0.112318f, -0.112218f, -0.112118f,
--0.112017f, -0.111917f, -0.111817f, -0.111716f, -0.111616f, -0.111515f, -0.111415f, -0.111315f, -0.111214f, -0.111114f, -0.111013f, -0.110913f, -0.110813f, -0.110712f, -0.110612f, -0.110511f, -0.110411f, -0.110311f, -0.11021f, -0.11011f,
--0.110009f, -0.109909f, -0.109809f, -0.109708f, -0.109608f, -0.109507f, -0.109407f, -0.109306f, -0.109206f, -0.109106f, -0.109005f, -0.108905f, -0.108804f, -0.108704f, -0.108603f, -0.108503f, -0.108403f, -0.108302f, -0.108202f, -0.108101f,
--0.108001f, -0.1079f, -0.1078f, -0.107699f, -0.107599f, -0.107499f, -0.107398f, -0.107298f, -0.107197f, -0.107097f, -0.106996f, -0.106896f, -0.106795f, -0.106695f, -0.106594f, -0.106494f, -0.106393f, -0.106293f, -0.106192f, -0.106092f,
--0.105991f, -0.105891f, -0.10579f, -0.10569f, -0.10559f, -0.105489f, -0.105389f, -0.105288f, -0.105188f, -0.105087f, -0.104987f, -0.104886f, -0.104786f, -0.104685f, -0.104584f, -0.104484f, -0.104383f, -0.104283f, -0.104182f, -0.104082f,
--0.103981f, -0.103881f, -0.10378f, -0.10368f, -0.103579f, -0.103479f, -0.103378f, -0.103278f, -0.103177f, -0.103077f, -0.102976f, -0.102876f, -0.102775f, -0.102674f, -0.102574f, -0.102473f, -0.102373f, -0.102272f, -0.102172f, -0.102071f,
--0.101971f, -0.10187f, -0.10177f, -0.101669f, -0.101568f, -0.101468f, -0.101367f, -0.101267f, -0.101166f, -0.101066f, -0.100965f, -0.100864f, -0.100764f, -0.100663f, -0.100563f, -0.100462f, -0.100362f, -0.100261f, -0.10016f, -0.10006f,
--0.099959f, -0.099859f, -0.099758f, -0.099657f, -0.099557f, -0.099456f, -0.099356f, -0.099255f, -0.099154f, -0.099054f, -0.098953f, -0.098853f, -0.098752f, -0.098651f, -0.098551f, -0.09845f, -0.09835f, -0.098249f, -0.098148f, -0.098048f,
--0.097947f, -0.097846f, -0.097746f, -0.097645f, -0.097545f, -0.097444f, -0.097343f, -0.097243f, -0.097142f, -0.097041f, -0.096941f, -0.09684f, -0.096739f, -0.096639f, -0.096538f, -0.096437f, -0.096337f, -0.096236f, -0.096136f, -0.096035f,
--0.095934f, -0.095834f, -0.095733f, -0.095632f, -0.095532f, -0.095431f, -0.09533f, -0.09523f, -0.095129f, -0.095028f, -0.094928f, -0.094827f, -0.094726f, -0.094625f, -0.094525f, -0.094424f, -0.094323f, -0.094223f, -0.094122f, -0.094021f,
--0.093921f, -0.09382f, -0.093719f, -0.093619f, -0.093518f, -0.093417f, -0.093317f, -0.093216f, -0.093115f, -0.093014f, -0.092914f, -0.092813f, -0.092712f, -0.092612f, -0.092511f, -0.09241f, -0.092309f, -0.092209f, -0.092108f, -0.092007f,
--0.091907f, -0.091806f, -0.091705f, -0.091604f, -0.091504f, -0.091403f, -0.091302f, -0.091201f, -0.091101f, -0.091f, -0.090899f, -0.090798f, -0.090698f, -0.090597f, -0.090496f, -0.090396f, -0.090295f, -0.090194f, -0.090093f, -0.089993f,
--0.089892f, -0.089791f, -0.08969f, -0.089589f, -0.089489f, -0.089388f, -0.089287f, -0.089186f, -0.089086f, -0.088985f, -0.088884f, -0.088783f, -0.088683f, -0.088582f, -0.088481f, -0.08838f, -0.088279f, -0.088179f, -0.088078f, -0.087977f,
--0.087876f, -0.087776f, -0.087675f, -0.087574f, -0.087473f, -0.087372f, -0.087272f, -0.087171f, -0.08707f, -0.086969f, -0.086868f, -0.086768f, -0.086667f, -0.086566f, -0.086465f, -0.086364f, -0.086264f, -0.086163f, -0.086062f, -0.085961f,
--0.08586f, -0.085759f, -0.085659f, -0.085558f, -0.085457f, -0.085356f, -0.085255f, -0.085154f, -0.085054f, -0.084953f, -0.084852f, -0.084751f, -0.08465f, -0.084549f, -0.084449f, -0.084348f, -0.084247f, -0.084146f, -0.084045f, -0.083944f,
--0.083844f, -0.083743f, -0.083642f, -0.083541f, -0.08344f, -0.083339f, -0.083238f, -0.083138f, -0.083037f, -0.082936f, -0.082835f, -0.082734f, -0.082633f, -0.082532f, -0.082432f, -0.082331f, -0.08223f, -0.082129f, -0.082028f, -0.081927f,
--0.081826f, -0.081725f, -0.081625f, -0.081524f, -0.081423f, -0.081322f, -0.081221f, -0.08112f, -0.081019f, -0.080918f, -0.080817f, -0.080717f, -0.080616f, -0.080515f, -0.080414f, -0.080313f, -0.080212f, -0.080111f, -0.08001f, -0.079909f,
--0.079808f, -0.079708f, -0.079607f, -0.079506f, -0.079405f, -0.079304f, -0.079203f, -0.079102f, -0.079001f, -0.0789f, -0.078799f, -0.078698f, -0.078597f, -0.078497f, -0.078396f, -0.078295f, -0.078194f, -0.078093f, -0.077992f, -0.077891f,
--0.07779f, -0.077689f, -0.077588f, -0.077487f, -0.077386f, -0.077285f, -0.077184f, -0.077083f, -0.076982f, -0.076882f, -0.076781f, -0.07668f, -0.076579f, -0.076478f, -0.076377f, -0.076276f, -0.076175f, -0.076074f, -0.075973f, -0.075872f,
--0.075771f, -0.07567f, -0.075569f, -0.075468f, -0.075367f, -0.075266f, -0.075165f, -0.075064f, -0.074963f, -0.074862f, -0.074761f, -0.07466f, -0.074559f, -0.074458f, -0.074357f, -0.074256f, -0.074155f, -0.074054f, -0.073953f, -0.073852f,
--0.073751f, -0.07365f, -0.073549f, -0.073448f, -0.073347f, -0.073246f, -0.073145f, -0.073044f, -0.072943f, -0.072842f, -0.072741f, -0.07264f, -0.072539f, -0.072438f, -0.072337f, -0.072236f, -0.072135f, -0.072034f, -0.071933f, -0.071832f,
--0.071731f, -0.07163f, -0.071529f, -0.071428f, -0.071327f, -0.071226f, -0.071125f, -0.071024f, -0.070923f, -0.070822f, -0.070721f, -0.07062f, -0.070519f, -0.070418f, -0.070317f, -0.070216f, -0.070115f, -0.070014f, -0.069913f, -0.069812f,
--0.069711f, -0.06961f, -0.069509f, -0.069407f, -0.069306f, -0.069205f, -0.069104f, -0.069003f, -0.068902f, -0.068801f, -0.0687f, -0.068599f, -0.068498f, -0.068397f, -0.068296f, -0.068195f, -0.068094f, -0.067993f, -0.067892f, -0.067791f,
--0.067689f, -0.067588f, -0.067487f, -0.067386f, -0.067285f, -0.067184f, -0.067083f, -0.066982f, -0.066881f, -0.06678f, -0.066679f, -0.066578f, -0.066476f, -0.066375f, -0.066274f, -0.066173f, -0.066072f, -0.065971f, -0.06587f, -0.065769f,
--0.065668f, -0.065567f, -0.065466f, -0.065364f, -0.065263f, -0.065162f, -0.065061f, -0.06496f, -0.064859f, -0.064758f, -0.064657f, -0.064556f, -0.064454f, -0.064353f, -0.064252f, -0.064151f, -0.06405f, -0.063949f, -0.063848f, -0.063747f,
--0.063646f, -0.063544f, -0.063443f, -0.063342f, -0.063241f, -0.06314f, -0.063039f, -0.062938f, -0.062836f, -0.062735f, -0.062634f, -0.062533f, -0.062432f, -0.062331f, -0.06223f, -0.062129f, -0.062027f, -0.061926f, -0.061825f, -0.061724f,
--0.061623f, -0.061522f, -0.06142f, -0.061319f, -0.061218f, -0.061117f, -0.061016f, -0.060915f, -0.060814f, -0.060712f, -0.060611f, -0.06051f, -0.060409f, -0.060308f, -0.060207f, -0.060105f, -0.060004f, -0.059903f, -0.059802f, -0.059701f,
--0.0596f, -0.059498f, -0.059397f, -0.059296f, -0.059195f, -0.059094f, -0.058993f, -0.058891f, -0.05879f, -0.058689f, -0.058588f, -0.058487f, -0.058385f, -0.058284f, -0.058183f, -0.058082f, -0.057981f, -0.057879f, -0.057778f, -0.057677f,
--0.057576f, -0.057475f, -0.057374f, -0.057272f, -0.057171f, -0.05707f, -0.056969f, -0.056867f, -0.056766f, -0.056665f, -0.056564f, -0.056463f, -0.056361f, -0.05626f, -0.056159f, -0.056058f, -0.055957f, -0.055855f, -0.055754f, -0.055653f,
--0.055552f, -0.055451f, -0.055349f, -0.055248f, -0.055147f, -0.055046f, -0.054944f, -0.054843f, -0.054742f, -0.054641f, -0.05454f, -0.054438f, -0.054337f, -0.054236f, -0.054135f, -0.054033f, -0.053932f, -0.053831f, -0.05373f, -0.053628f,
--0.053527f, -0.053426f, -0.053325f, -0.053223f, -0.053122f, -0.053021f, -0.05292f, -0.052818f, -0.052717f, -0.052616f, -0.052515f, -0.052413f, -0.052312f, -0.052211f, -0.05211f, -0.052008f, -0.051907f, -0.051806f, -0.051705f, -0.051603f,
--0.051502f, -0.051401f, -0.0513f, -0.051198f, -0.051097f, -0.050996f, -0.050894f, -0.050793f, -0.050692f, -0.050591f, -0.050489f, -0.050388f, -0.050287f, -0.050186f, -0.050084f, -0.049983f, -0.049882f, -0.04978f, -0.049679f, -0.049578f,
--0.049477f, -0.049375f, -0.049274f, -0.049173f, -0.049071f, -0.04897f, -0.048869f, -0.048768f, -0.048666f, -0.048565f, -0.048464f, -0.048362f, -0.048261f, -0.04816f, -0.048059f, -0.047957f, -0.047856f, -0.047755f, -0.047653f, -0.047552f,
--0.047451f, -0.047349f, -0.047248f, -0.047147f, -0.047045f, -0.046944f, -0.046843f, -0.046742f, -0.04664f, -0.046539f, -0.046438f, -0.046336f, -0.046235f, -0.046134f, -0.046032f, -0.045931f, -0.04583f, -0.045728f, -0.045627f, -0.045526f,
--0.045424f, -0.045323f, -0.045222f, -0.04512f, -0.045019f, -0.044918f, -0.044816f, -0.044715f, -0.044614f, -0.044512f, -0.044411f, -0.04431f, -0.044208f, -0.044107f, -0.044006f, -0.043904f, -0.043803f, -0.043702f, -0.0436f, -0.043499f,
--0.043398f, -0.043296f, -0.043195f, -0.043094f, -0.042992f, -0.042891f, -0.04279f, -0.042688f, -0.042587f, -0.042486f, -0.042384f, -0.042283f, -0.042181f, -0.04208f, -0.041979f, -0.041877f, -0.041776f, -0.041675f, -0.041573f, -0.041472f,
--0.041371f, -0.041269f, -0.041168f, -0.041066f, -0.040965f, -0.040864f, -0.040762f, -0.040661f, -0.04056f, -0.040458f, -0.040357f, -0.040255f, -0.040154f, -0.040053f, -0.039951f, -0.03985f, -0.039749f, -0.039647f, -0.039546f, -0.039444f,
--0.039343f, -0.039242f, -0.03914f, -0.039039f, -0.038938f, -0.038836f, -0.038735f, -0.038633f, -0.038532f, -0.038431f, -0.038329f, -0.038228f, -0.038126f, -0.038025f, -0.037924f, -0.037822f, -0.037721f, -0.037619f, -0.037518f, -0.037417f,
--0.037315f, -0.037214f, -0.037112f, -0.037011f, -0.03691f, -0.036808f, -0.036707f, -0.036605f, -0.036504f, -0.036403f, -0.036301f, -0.0362f, -0.036098f, -0.035997f, -0.035895f, -0.035794f, -0.035693f, -0.035591f, -0.03549f, -0.035388f,
--0.035287f, -0.035186f, -0.035084f, -0.034983f, -0.034881f, -0.03478f, -0.034678f, -0.034577f, -0.034476f, -0.034374f, -0.034273f, -0.034171f, -0.03407f, -0.033968f, -0.033867f, -0.033766f, -0.033664f, -0.033563f, -0.033461f, -0.03336f,
--0.033258f, -0.033157f, -0.033056f, -0.032954f, -0.032853f, -0.032751f, -0.03265f, -0.032548f, -0.032447f, -0.032345f, -0.032244f, -0.032143f, -0.032041f, -0.03194f, -0.031838f, -0.031737f, -0.031635f, -0.031534f, -0.031432f, -0.031331f,
--0.031229f, -0.031128f, -0.031027f, -0.030925f, -0.030824f, -0.030722f, -0.030621f, -0.030519f, -0.030418f, -0.030316f, -0.030215f, -0.030113f, -0.030012f, -0.029911f, -0.029809f, -0.029708f, -0.029606f, -0.029505f, -0.029403f, -0.029302f,
--0.0292f, -0.029099f, -0.028997f, -0.028896f, -0.028794f, -0.028693f, -0.028591f, -0.02849f, -0.028388f, -0.028287f, -0.028186f, -0.028084f, -0.027983f, -0.027881f, -0.02778f, -0.027678f, -0.027577f, -0.027475f, -0.027374f, -0.027272f,
--0.027171f, -0.027069f, -0.026968f, -0.026866f, -0.026765f, -0.026663f, -0.026562f, -0.02646f, -0.026359f, -0.026257f, -0.026156f, -0.026054f, -0.025953f, -0.025851f, -0.02575f, -0.025648f, -0.025547f, -0.025445f, -0.025344f, -0.025242f,
--0.025141f, -0.025039f, -0.024938f, -0.024836f, -0.024735f, -0.024633f, -0.024532f, -0.02443f, -0.024329f, -0.024227f, -0.024126f, -0.024024f, -0.023923f, -0.023821f, -0.02372f, -0.023618f, -0.023517f, -0.023415f, -0.023314f, -0.023212f,
--0.023111f, -0.023009f, -0.022908f, -0.022806f, -0.022705f, -0.022603f, -0.022502f, -0.0224f, -0.022299f, -0.022197f, -0.022095f, -0.021994f, -0.021892f, -0.021791f, -0.021689f, -0.021588f, -0.021486f, -0.021385f, -0.021283f, -0.021182f,
--0.02108f, -0.020979f, -0.020877f, -0.020776f, -0.020674f, -0.020573f, -0.020471f, -0.020369f, -0.020268f, -0.020166f, -0.020065f, -0.019963f, -0.019862f, -0.01976f, -0.019659f, -0.019557f, -0.019456f, -0.019354f, -0.019253f, -0.019151f,
--0.019049f, -0.018948f, -0.018846f, -0.018745f, -0.018643f, -0.018542f, -0.01844f, -0.018339f, -0.018237f, -0.018136f, -0.018034f, -0.017932f, -0.017831f, -0.017729f, -0.017628f, -0.017526f, -0.017425f, -0.017323f, -0.017222f, -0.01712f,
--0.017018f, -0.016917f, -0.016815f, -0.016714f, -0.016612f, -0.016511f, -0.016409f, -0.016308f, -0.016206f, -0.016104f, -0.016003f, -0.015901f, -0.0158f, -0.015698f, -0.015597f, -0.015495f, -0.015394f, -0.015292f, -0.01519f, -0.015089f,
--0.014987f, -0.014886f, -0.014784f, -0.014683f, -0.014581f, -0.014479f, -0.014378f, -0.014276f, -0.014175f, -0.014073f, -0.013972f, -0.01387f, -0.013768f, -0.013667f, -0.013565f, -0.013464f, -0.013362f, -0.01326f, -0.013159f, -0.013057f,
--0.012956f, -0.012854f, -0.012753f, -0.012651f, -0.012549f, -0.012448f, -0.012346f, -0.012245f, -0.012143f, -0.012042f, -0.01194f, -0.011838f, -0.011737f, -0.011635f, -0.011534f, -0.011432f, -0.01133f, -0.011229f, -0.011127f, -0.011026f,
--0.010924f, -0.010822f, -0.010721f, -0.010619f, -0.010518f, -0.010416f, -0.010314f, -0.010213f, -0.010111f, -0.01001f, -0.009908f, -0.009806f, -0.009705f, -0.009603f, -0.009502f, -0.0094f, -0.009299f, -0.009197f, -0.009095f, -0.008994f,
--0.008892f, -0.00879f, -0.008689f, -0.008587f, -0.008486f, -0.008384f, -0.008282f, -0.008181f, -0.008079f, -0.007978f, -0.007876f, -0.007774f, -0.007673f, -0.007571f, -0.00747f, -0.007368f, -0.007266f, -0.007165f, -0.007063f, -0.006962f,
--0.00686f, -0.006758f, -0.006657f, -0.006555f, -0.006453f, -0.006352f, -0.00625f, -0.006149f, -0.006047f, -0.005945f, -0.005844f, -0.005742f, -0.005641f, -0.005539f, -0.005437f, -0.005336f, -0.005234f, -0.005132f, -0.005031f, -0.004929f,
--0.004828f, -0.004726f, -0.004624f, -0.004523f, -0.004421f, -0.004319f, -0.004218f, -0.004116f, -0.004015f, -0.003913f, -0.003811f, -0.00371f, -0.003608f, -0.003506f, -0.003405f, -0.003303f, -0.003202f, -0.0031f, -0.002998f, -0.002897f,
--0.002795f, -0.002693f, -0.002592f, -0.00249f, -0.002389f, -0.002287f, -0.002185f, -0.002084f, -0.001982f, -0.00188f, -0.001779f, -0.001677f, -0.001575f, -0.001474f, -0.001372f, -0.001271f, -0.001169f, -0.001067f, -0.000966f, -0.000864f,
--0.000762f, -0.000661f, -0.000559f, -0.000457f, -0.000356f, -0.000254f, -0.000152f, -5.1e-05f, 5.1e-05f, 0.000152f, 0.000254f, 0.000356f, 0.000457f, 0.000559f, 0.000661f, 0.000762f, 0.000864f, 0.000966f, 0.001067f, 0.001169f,
-0.001271f, 0.001372f, 0.001474f, 0.001576f, 0.001677f, 0.001779f, 0.00188f, 0.001982f, 0.002084f, 0.002185f, 0.002287f, 0.002389f, 0.00249f, 0.002592f, 0.002694f, 0.002795f, 0.002897f, 0.002999f, 0.0031f, 0.003202f,
-0.003304f, 0.003405f, 0.003507f, 0.003609f, 0.00371f, 0.003812f, 0.003914f, 0.004015f, 0.004117f, 0.004219f, 0.00432f, 0.004422f, 0.004524f, 0.004625f, 0.004727f, 0.004829f, 0.00493f, 0.005032f, 0.005134f, 0.005235f,
-0.005337f, 0.005438f, 0.00554f, 0.005642f, 0.005743f, 0.005845f, 0.005947f, 0.006048f, 0.00615f, 0.006252f, 0.006353f, 0.006455f, 0.006557f, 0.006658f, 0.00676f, 0.006862f, 0.006963f, 0.007065f, 0.007167f, 0.007269f,
-0.00737f, 0.007472f, 0.007574f, 0.007675f, 0.007777f, 0.007879f, 0.00798f, 0.008082f, 0.008184f, 0.008285f, 0.008387f, 0.008489f, 0.00859f, 0.008692f, 0.008794f, 0.008895f, 0.008997f, 0.009099f, 0.0092f, 0.009302f,
-0.009404f, 0.009505f, 0.009607f, 0.009709f, 0.00981f, 0.009912f, 0.010014f, 0.010115f, 0.010217f, 0.010319f, 0.01042f, 0.010522f, 0.010624f, 0.010725f, 0.010827f, 0.010929f, 0.011031f, 0.011132f, 0.011234f, 0.011336f,
-0.011437f, 0.011539f, 0.011641f, 0.011742f, 0.011844f, 0.011946f, 0.012047f, 0.012149f, 0.012251f, 0.012352f, 0.012454f, 0.012556f, 0.012657f, 0.012759f, 0.012861f, 0.012962f, 0.013064f, 0.013166f, 0.013268f, 0.013369f,
-0.013471f, 0.013573f, 0.013674f, 0.013776f, 0.013878f, 0.013979f, 0.014081f, 0.014183f, 0.014284f, 0.014386f, 0.014488f, 0.014589f, 0.014691f, 0.014793f, 0.014895f, 0.014996f, 0.015098f, 0.0152f, 0.015301f, 0.015403f,
-0.015505f, 0.015606f, 0.015708f, 0.01581f, 0.015911f, 0.016013f, 0.016115f, 0.016217f, 0.016318f, 0.01642f, 0.016522f, 0.016623f, 0.016725f, 0.016827f, 0.016928f, 0.01703f, 0.017132f, 0.017233f, 0.017335f, 0.017437f,
-0.017539f, 0.01764f, 0.017742f, 0.017844f, 0.017945f, 0.018047f, 0.018149f, 0.01825f, 0.018352f, 0.018454f, 0.018556f, 0.018657f, 0.018759f, 0.018861f, 0.018962f, 0.019064f, 0.019166f, 0.019267f, 0.019369f, 0.019471f,
-0.019573f, 0.019674f, 0.019776f, 0.019878f, 0.019979f, 0.020081f, 0.020183f, 0.020284f, 0.020386f, 0.020488f, 0.02059f, 0.020691f, 0.020793f, 0.020895f, 0.020996f, 0.021098f, 0.0212f, 0.021301f, 0.021403f, 0.021505f,
-0.021607f, 0.021708f, 0.02181f, 0.021912f, 0.022013f, 0.022115f, 0.022217f, 0.022318f, 0.02242f, 0.022522f, 0.022624f, 0.022725f, 0.022827f, 0.022929f, 0.02303f, 0.023132f, 0.023234f, 0.023335f, 0.023437f, 0.023539f,
-0.023641f, 0.023742f, 0.023844f, 0.023946f, 0.024047f, 0.024149f, 0.024251f, 0.024353f, 0.024454f, 0.024556f, 0.024658f, 0.024759f, 0.024861f, 0.024963f, 0.025064f, 0.025166f, 0.025268f, 0.02537f, 0.025471f, 0.025573f,
-0.025675f, 0.025776f, 0.025878f, 0.02598f, 0.026082f, 0.026183f, 0.026285f, 0.026387f, 0.026488f, 0.02659f, 0.026692f, 0.026793f, 0.026895f, 0.026997f, 0.027099f, 0.0272f, 0.027302f, 0.027404f, 0.027505f, 0.027607f,
-0.027709f, 0.027811f, 0.027912f, 0.028014f, 0.028116f, 0.028217f, 0.028319f, 0.028421f, 0.028522f, 0.028624f, 0.028726f, 0.028828f, 0.028929f, 0.029031f, 0.029133f, 0.029234f, 0.029336f, 0.029438f, 0.02954f, 0.029641f,
-0.029743f, 0.029845f, 0.029946f, 0.030048f, 0.03015f, 0.030252f, 0.030353f, 0.030455f, 0.030557f, 0.030658f, 0.03076f, 0.030862f, 0.030963f, 0.031065f, 0.031167f, 0.031269f, 0.03137f, 0.031472f, 0.031574f, 0.031675f,
-0.031777f, 0.031879f, 0.031981f, 0.032082f, 0.032184f, 0.032286f, 0.032387f, 0.032489f, 0.032591f, 0.032693f, 0.032794f, 0.032896f, 0.032998f, 0.033099f, 0.033201f, 0.033303f, 0.033404f, 0.033506f, 0.033608f, 0.03371f,
-0.033811f, 0.033913f, 0.034015f, 0.034116f, 0.034218f, 0.03432f, 0.034422f, 0.034523f, 0.034625f, 0.034727f, 0.034828f, 0.03493f, 0.035032f, 0.035133f, 0.035235f, 0.035337f, 0.035439f, 0.03554f, 0.035642f, 0.035744f,
-0.035845f, 0.035947f, 0.036049f, 0.036151f, 0.036252f, 0.036354f, 0.036456f, 0.036557f, 0.036659f, 0.036761f, 0.036863f, 0.036964f, 0.037066f, 0.037168f, 0.037269f, 0.037371f, 0.037473f, 0.037574f, 0.037676f, 0.037778f,
-0.03788f, 0.037981f, 0.038083f, 0.038185f, 0.038286f, 0.038388f, 0.03849f, 0.038592f, 0.038693f, 0.038795f, 0.038897f, 0.038998f, 0.0391f, 0.039202f, 0.039303f, 0.039405f, 0.039507f, 0.039609f, 0.03971f, 0.039812f,
-0.039914f, 0.040015f, 0.040117f, 0.040219f, 0.04032f, 0.040422f, 0.040524f, 0.040626f, 0.040727f, 0.040829f, 0.040931f, 0.041032f, 0.041134f, 0.041236f, 0.041338f, 0.041439f, 0.041541f, 0.041643f, 0.041744f, 0.041846f,
-0.041948f, 0.042049f, 0.042151f, 0.042253f, 0.042355f, 0.042456f, 0.042558f, 0.04266f, 0.042761f, 0.042863f, 0.042965f, 0.043066f, 0.043168f, 0.04327f, 0.043372f, 0.043473f, 0.043575f, 0.043677f, 0.043778f, 0.04388f,
-0.043982f, 0.044083f, 0.044185f, 0.044287f, 0.044389f, 0.04449f, 0.044592f, 0.044694f, 0.044795f, 0.044897f, 0.044999f, 0.0451f, 0.045202f, 0.045304f, 0.045406f, 0.045507f, 0.045609f, 0.045711f, 0.045812f, 0.045914f,
-0.046016f, 0.046117f, 0.046219f, 0.046321f, 0.046422f, 0.046524f, 0.046626f, 0.046728f, 0.046829f, 0.046931f, 0.047033f, 0.047134f, 0.047236f, 0.047338f, 0.047439f, 0.047541f, 0.047643f, 0.047744f, 0.047846f, 0.047948f,
-0.04805f, 0.048151f, 0.048253f, 0.048355f, 0.048456f, 0.048558f, 0.04866f, 0.048761f, 0.048863f, 0.048965f, 0.049066f, 0.049168f, 0.04927f, 0.049372f, 0.049473f, 0.049575f, 0.049677f, 0.049778f, 0.04988f, 0.049982f,
-0.050083f, 0.050185f, 0.050287f, 0.050388f, 0.05049f, 0.050592f, 0.050693f, 0.050795f, 0.050897f, 0.050998f, 0.0511f, 0.051202f, 0.051304f, 0.051405f, 0.051507f, 0.051609f, 0.05171f, 0.051812f, 0.051914f, 0.052015f,
-0.052117f, 0.052219f, 0.05232f, 0.052422f, 0.052524f, 0.052625f, 0.052727f, 0.052829f, 0.05293f, 0.053032f, 0.053134f, 0.053235f, 0.053337f, 0.053439f, 0.053541f, 0.053642f, 0.053744f, 0.053846f, 0.053947f, 0.054049f,
-0.054151f, 0.054252f, 0.054354f, 0.054456f, 0.054557f, 0.054659f, 0.054761f, 0.054862f, 0.054964f, 0.055066f, 0.055167f, 0.055269f, 0.055371f, 0.055472f, 0.055574f, 0.055676f, 0.055777f, 0.055879f, 0.055981f, 0.056082f,
-0.056184f, 0.056286f, 0.056387f, 0.056489f, 0.056591f, 0.056692f, 0.056794f, 0.056896f, 0.056997f, 0.057099f, 0.057201f, 0.057302f, 0.057404f, 0.057506f, 0.057607f, 0.057709f, 0.057811f, 0.057912f, 0.058014f, 0.058116f,
-0.058217f, 0.058319f, 0.058421f, 0.058522f, 0.058624f, 0.058726f, 0.058827f, 0.058929f, 0.059031f, 0.059132f, 0.059234f, 0.059336f, 0.059437f, 0.059539f, 0.059641f, 0.059742f, 0.059844f, 0.059946f, 0.060047f, 0.060149f,
-0.060251f, 0.060352f, 0.060454f, 0.060556f, 0.060657f, 0.060759f, 0.060861f, 0.060962f, 0.061064f, 0.061165f, 0.061267f, 0.061369f, 0.06147f, 0.061572f, 0.061674f, 0.061775f, 0.061877f, 0.061979f, 0.06208f, 0.062182f,
-0.062284f, 0.062385f, 0.062487f, 0.062589f, 0.06269f, 0.062792f, 0.062894f, 0.062995f, 0.063097f, 0.063198f, 0.0633f, 0.063402f, 0.063503f, 0.063605f, 0.063707f, 0.063808f, 0.06391f, 0.064012f, 0.064113f, 0.064215f,
-0.064317f, 0.064418f, 0.06452f, 0.064621f, 0.064723f, 0.064825f, 0.064926f, 0.065028f, 0.06513f, 0.065231f, 0.065333f, 0.065435f, 0.065536f, 0.065638f, 0.065739f, 0.065841f, 0.065943f, 0.066044f, 0.066146f, 0.066248f,
-0.066349f, 0.066451f, 0.066552f, 0.066654f, 0.066756f, 0.066857f, 0.066959f, 0.067061f, 0.067162f, 0.067264f, 0.067366f, 0.067467f, 0.067569f, 0.06767f, 0.067772f, 0.067874f, 0.067975f, 0.068077f, 0.068179f, 0.06828f,
-0.068382f, 0.068483f, 0.068585f, 0.068687f, 0.068788f, 0.06889f, 0.068991f, 0.069093f, 0.069195f, 0.069296f, 0.069398f, 0.0695f, 0.069601f, 0.069703f, 0.069804f, 0.069906f, 0.070008f, 0.070109f, 0.070211f, 0.070312f,
-0.070414f, 0.070516f, 0.070617f, 0.070719f, 0.070821f, 0.070922f, 0.071024f, 0.071125f, 0.071227f, 0.071329f, 0.07143f, 0.071532f, 0.071633f, 0.071735f, 0.071837f, 0.071938f, 0.07204f, 0.072141f, 0.072243f, 0.072345f,
-0.072446f, 0.072548f, 0.072649f, 0.072751f, 0.072853f, 0.072954f, 0.073056f, 0.073157f, 0.073259f, 0.073361f, 0.073462f, 0.073564f, 0.073665f, 0.073767f, 0.073869f, 0.07397f, 0.074072f, 0.074173f, 0.074275f, 0.074377f,
-0.074478f, 0.07458f, 0.074681f, 0.074783f, 0.074885f, 0.074986f, 0.075088f, 0.075189f, 0.075291f, 0.075392f, 0.075494f, 0.075596f, 0.075697f, 0.075799f, 0.0759f, 0.076002f, 0.076104f, 0.076205f, 0.076307f, 0.076408f,
-0.07651f, 0.076611f, 0.076713f, 0.076815f, 0.076916f, 0.077018f, 0.077119f, 0.077221f, 0.077323f, 0.077424f, 0.077526f, 0.077627f, 0.077729f, 0.07783f, 0.077932f, 0.078034f, 0.078135f, 0.078237f, 0.078338f, 0.07844f,
-0.078541f, 0.078643f, 0.078744f, 0.078846f, 0.078948f, 0.079049f, 0.079151f, 0.079252f, 0.079354f, 0.079455f, 0.079557f, 0.079659f, 0.07976f, 0.079862f, 0.079963f, 0.080065f, 0.080166f, 0.080268f, 0.080369f, 0.080471f,
-0.080573f, 0.080674f, 0.080776f, 0.080877f, 0.080979f, 0.08108f, 0.081182f, 0.081283f, 0.081385f, 0.081487f, 0.081588f, 0.08169f, 0.081791f, 0.081893f, 0.081994f, 0.082096f, 0.082197f, 0.082299f, 0.0824f, 0.082502f,
-0.082604f, 0.082705f, 0.082807f, 0.082908f, 0.08301f, 0.083111f, 0.083213f, 0.083314f, 0.083416f, 0.083517f, 0.083619f, 0.08372f, 0.083822f, 0.083924f, 0.084025f, 0.084127f, 0.084228f, 0.08433f, 0.084431f, 0.084533f,
-0.084634f, 0.084736f, 0.084837f, 0.084939f, 0.08504f, 0.085142f, 0.085243f, 0.085345f, 0.085446f, 0.085548f, 0.08565f, 0.085751f, 0.085853f, 0.085954f, 0.086056f, 0.086157f, 0.086259f, 0.08636f, 0.086462f, 0.086563f,
-0.086665f, 0.086766f, 0.086868f, 0.086969f, 0.087071f, 0.087172f, 0.087274f, 0.087375f, 0.087477f, 0.087578f, 0.08768f, 0.087781f, 0.087883f, 0.087984f, 0.088086f, 0.088187f, 0.088289f, 0.08839f, 0.088492f, 0.088593f,
-0.088695f, 0.088796f, 0.088898f, 0.088999f, 0.089101f, 0.089202f, 0.089304f, 0.089405f, 0.089507f, 0.089608f, 0.08971f, 0.089811f, 0.089913f, 0.090014f, 0.090116f, 0.090217f, 0.090319f, 0.09042f, 0.090522f, 0.090623f,
-0.090725f, 0.090826f, 0.090928f, 0.091029f, 0.091131f, 0.091232f, 0.091334f, 0.091435f, 0.091537f, 0.091638f, 0.09174f, 0.091841f, 0.091942f, 0.092044f, 0.092145f, 0.092247f, 0.092348f, 0.09245f, 0.092551f, 0.092653f,
-0.092754f, 0.092856f, 0.092957f, 0.093059f, 0.09316f, 0.093262f, 0.093363f, 0.093465f, 0.093566f, 0.093667f, 0.093769f, 0.09387f, 0.093972f, 0.094073f, 0.094175f, 0.094276f, 0.094378f, 0.094479f, 0.094581f, 0.094682f,
-0.094783f, 0.094885f, 0.094986f, 0.095088f, 0.095189f, 0.095291f, 0.095392f, 0.095494f, 0.095595f, 0.095697f, 0.095798f, 0.095899f, 0.096001f, 0.096102f, 0.096204f, 0.096305f, 0.096407f, 0.096508f, 0.09661f, 0.096711f,
-0.096812f, 0.096914f, 0.097015f, 0.097117f, 0.097218f, 0.09732f, 0.097421f, 0.097522f, 0.097624f, 0.097725f, 0.097827f, 0.097928f, 0.09803f, 0.098131f, 0.098232f, 0.098334f, 0.098435f, 0.098537f, 0.098638f, 0.09874f,
-0.098841f, 0.098942f, 0.099044f, 0.099145f, 0.099247f, 0.099348f, 0.099449f, 0.099551f, 0.099652f, 0.099754f, 0.099855f, 0.099956f, 0.100058f, 0.100159f, 0.100261f, 0.100362f, 0.100464f, 0.100565f, 0.100666f, 0.100768f,
-0.100869f, 0.100971f, 0.101072f, 0.101173f, 0.101275f, 0.101376f, 0.101478f, 0.101579f, 0.10168f, 0.101782f, 0.101883f, 0.101985f, 0.102086f, 0.102187f, 0.102289f, 0.10239f, 0.102491f, 0.102593f, 0.102694f, 0.102796f,
-0.102897f, 0.102998f, 0.1031f, 0.103201f, 0.103303f, 0.103404f, 0.103505f, 0.103607f, 0.103708f, 0.103809f, 0.103911f, 0.104012f, 0.104114f, 0.104215f, 0.104316f, 0.104418f, 0.104519f, 0.10462f, 0.104722f, 0.104823f,
-0.104924f, 0.105026f, 0.105127f, 0.105229f, 0.10533f, 0.105431f, 0.105533f, 0.105634f, 0.105735f, 0.105837f, 0.105938f, 0.106039f, 0.106141f, 0.106242f, 0.106343f, 0.106445f, 0.106546f, 0.106648f, 0.106749f, 0.10685f,
-0.106952f, 0.107053f, 0.107154f, 0.107256f, 0.107357f, 0.107458f, 0.10756f, 0.107661f, 0.107762f, 0.107864f, 0.107965f, 0.108066f, 0.108168f, 0.108269f, 0.10837f, 0.108472f, 0.108573f, 0.108674f, 0.108776f, 0.108877f,
-0.108978f, 0.10908f, 0.109181f, 0.109282f, 0.109384f, 0.109485f, 0.109586f, 0.109688f, 0.109789f, 0.10989f, 0.109991f, 0.110093f, 0.110194f, 0.110295f, 0.110397f, 0.110498f, 0.110599f, 0.110701f, 0.110802f, 0.110903f,
-0.111005f, 0.111106f, 0.111207f, 0.111308f, 0.11141f, 0.111511f, 0.111612f, 0.111714f, 0.111815f, 0.111916f, 0.112018f, 0.112119f, 0.11222f, 0.112321f, 0.112423f, 0.112524f, 0.112625f, 0.112727f, 0.112828f, 0.112929f,
-0.11303f, 0.113132f, 0.113233f, 0.113334f, 0.113436f, 0.113537f, 0.113638f, 0.113739f, 0.113841f, 0.113942f, 0.114043f, 0.114145f, 0.114246f, 0.114347f, 0.114448f, 0.11455f, 0.114651f, 0.114752f, 0.114853f, 0.114955f,
-0.115056f, 0.115157f, 0.115258f, 0.11536f, 0.115461f, 0.115562f, 0.115663f, 0.115765f, 0.115866f, 0.115967f, 0.116068f, 0.11617f, 0.116271f, 0.116372f, 0.116473f, 0.116575f, 0.116676f, 0.116777f, 0.116878f, 0.11698f,
-0.117081f, 0.117182f, 0.117283f, 0.117385f, 0.117486f, 0.117587f, 0.117688f, 0.11779f, 0.117891f, 0.117992f, 0.118093f, 0.118195f, 0.118296f, 0.118397f, 0.118498f, 0.118599f, 0.118701f, 0.118802f, 0.118903f, 0.119004f,
-0.119106f, 0.119207f, 0.119308f, 0.119409f, 0.11951f, 0.119612f, 0.119713f, 0.119814f, 0.119915f, 0.120016f, 0.120118f, 0.120219f, 0.12032f, 0.120421f, 0.120522f, 0.120624f, 0.120725f, 0.120826f, 0.120927f, 0.121028f,
-0.12113f, 0.121231f, 0.121332f, 0.121433f, 0.121534f, 0.121636f, 0.121737f, 0.121838f, 0.121939f, 0.12204f, 0.122142f, 0.122243f, 0.122344f, 0.122445f, 0.122546f, 0.122647f, 0.122749f, 0.12285f, 0.122951f, 0.123052f,
-0.123153f, 0.123254f, 0.123356f, 0.123457f, 0.123558f, 0.123659f, 0.12376f, 0.123861f, 0.123963f, 0.124064f, 0.124165f, 0.124266f, 0.124367f, 0.124468f, 0.12457f, 0.124671f, 0.124772f, 0.124873f, 0.124974f, 0.125075f,
-0.125176f, 0.125278f, 0.125379f, 0.12548f, 0.125581f, 0.125682f, 0.125783f, 0.125884f, 0.125986f, 0.126087f, 0.126188f, 0.126289f, 0.12639f, 0.126491f, 0.126592f, 0.126694f, 0.126795f, 0.126896f, 0.126997f, 0.127098f,
-0.127199f, 0.1273f, 0.127401f, 0.127503f, 0.127604f, 0.127705f, 0.127806f, 0.127907f, 0.128008f, 0.128109f, 0.12821f, 0.128311f, 0.128413f, 0.128514f, 0.128615f, 0.128716f, 0.128817f, 0.128918f, 0.129019f, 0.12912f,
-0.129221f, 0.129322f, 0.129424f, 0.129525f, 0.129626f, 0.129727f, 0.129828f, 0.129929f, 0.13003f, 0.130131f, 0.130232f, 0.130333f, 0.130434f, 0.130536f, 0.130637f, 0.130738f, 0.130839f, 0.13094f, 0.131041f, 0.131142f,
-0.131243f, 0.131344f, 0.131445f, 0.131546f, 0.131647f, 0.131748f, 0.131849f, 0.131951f, 0.132052f, 0.132153f, 0.132254f, 0.132355f, 0.132456f, 0.132557f, 0.132658f, 0.132759f, 0.13286f, 0.132961f, 0.133062f, 0.133163f,
-0.133264f, 0.133365f, 0.133466f, 0.133567f, 0.133668f, 0.133769f, 0.13387f, 0.133972f, 0.134073f, 0.134174f, 0.134275f, 0.134376f, 0.134477f, 0.134578f, 0.134679f, 0.13478f, 0.134881f, 0.134982f, 0.135083f, 0.135184f,
-0.135285f, 0.135386f, 0.135487f, 0.135588f, 0.135689f, 0.13579f, 0.135891f, 0.135992f, 0.136093f, 0.136194f, 0.136295f, 0.136396f, 0.136497f, 0.136598f, 0.136699f, 0.1368f, 0.136901f, 0.137002f, 0.137103f, 0.137204f,
-0.137305f, 0.137406f, 0.137507f, 0.137608f, 0.137709f, 0.13781f, 0.137911f, 0.138012f, 0.138113f, 0.138214f, 0.138315f, 0.138416f, 0.138517f, 0.138618f, 0.138719f, 0.13882f, 0.138921f, 0.139022f, 0.139123f, 0.139224f,
-0.139325f, 0.139425f, 0.139526f, 0.139627f, 0.139728f, 0.139829f, 0.13993f, 0.140031f, 0.140132f, 0.140233f, 0.140334f, 0.140435f, 0.140536f, 0.140637f, 0.140738f, 0.140839f, 0.14094f, 0.141041f, 0.141142f, 0.141243f,
-0.141344f, 0.141444f, 0.141545f, 0.141646f, 0.141747f, 0.141848f, 0.141949f, 0.14205f, 0.142151f, 0.142252f, 0.142353f, 0.142454f, 0.142555f, 0.142656f, 0.142756f, 0.142857f, 0.142958f, 0.143059f, 0.14316f, 0.143261f,
-0.143362f, 0.143463f, 0.143564f, 0.143665f, 0.143766f, 0.143866f, 0.143967f, 0.144068f, 0.144169f, 0.14427f, 0.144371f, 0.144472f, 0.144573f, 0.144674f, 0.144774f, 0.144875f, 0.144976f, 0.145077f, 0.145178f, 0.145279f,
-0.14538f, 0.145481f, 0.145582f, 0.145682f, 0.145783f, 0.145884f, 0.145985f, 0.146086f, 0.146187f, 0.146288f, 0.146388f, 0.146489f, 0.14659f, 0.146691f, 0.146792f, 0.146893f, 0.146994f, 0.147094f, 0.147195f, 0.147296f,
-0.147397f, 0.147498f, 0.147599f, 0.1477f, 0.1478f, 0.147901f, 0.148002f, 0.148103f, 0.148204f, 0.148305f, 0.148405f, 0.148506f, 0.148607f, 0.148708f, 0.148809f, 0.14891f, 0.14901f, 0.149111f, 0.149212f, 0.149313f,
-0.149414f, 0.149514f, 0.149615f, 0.149716f, 0.149817f, 0.149918f, 0.150019f, 0.150119f, 0.15022f, 0.150321f, 0.150422f, 0.150523f, 0.150623f, 0.150724f, 0.150825f, 0.150926f, 0.151027f, 0.151127f, 0.151228f, 0.151329f,
-0.15143f, 0.15153f, 0.151631f, 0.151732f, 0.151833f, 0.151934f, 0.152034f, 0.152135f, 0.152236f, 0.152337f, 0.152437f, 0.152538f, 0.152639f, 0.15274f, 0.152841f, 0.152941f, 0.153042f, 0.153143f, 0.153244f, 0.153344f,
-0.153445f, 0.153546f, 0.153647f, 0.153747f, 0.153848f, 0.153949f, 0.15405f, 0.15415f, 0.154251f, 0.154352f, 0.154453f, 0.154553f, 0.154654f, 0.154755f, 0.154855f, 0.154956f, 0.155057f, 0.155158f, 0.155258f, 0.155359f,
-0.15546f, 0.155561f, 0.155661f, 0.155762f, 0.155863f, 0.155963f, 0.156064f, 0.156165f, 0.156266f, 0.156366f, 0.156467f, 0.156568f, 0.156668f, 0.156769f, 0.15687f, 0.156971f, 0.157071f, 0.157172f, 0.157273f, 0.157373f,
-0.157474f, 0.157575f, 0.157675f, 0.157776f, 0.157877f, 0.157977f, 0.158078f, 0.158179f, 0.158279f, 0.15838f, 0.158481f, 0.158581f, 0.158682f, 0.158783f, 0.158883f, 0.158984f, 0.159085f, 0.159185f, 0.159286f, 0.159387f,
-0.159487f, 0.159588f, 0.159689f, 0.159789f, 0.15989f, 0.159991f, 0.160091f, 0.160192f, 0.160293f, 0.160393f, 0.160494f, 0.160595f, 0.160695f, 0.160796f, 0.160896f, 0.160997f, 0.161098f, 0.161198f, 0.161299f, 0.1614f,
-0.1615f, 0.161601f, 0.161701f, 0.161802f, 0.161903f, 0.162003f, 0.162104f, 0.162205f, 0.162305f, 0.162406f, 0.162506f, 0.162607f, 0.162708f, 0.162808f, 0.162909f, 0.163009f, 0.16311f, 0.163211f, 0.163311f, 0.163412f,
-0.163512f, 0.163613f, 0.163714f, 0.163814f, 0.163915f, 0.164015f, 0.164116f, 0.164216f, 0.164317f, 0.164418f, 0.164518f, 0.164619f, 0.164719f, 0.16482f, 0.16492f, 0.165021f, 0.165122f, 0.165222f, 0.165323f, 0.165423f,
-0.165524f, 0.165624f, 0.165725f, 0.165825f, 0.165926f, 0.166027f, 0.166127f, 0.166228f, 0.166328f, 0.166429f, 0.166529f, 0.16663f, 0.16673f, 0.166831f, 0.166931f, 0.167032f, 0.167132f, 0.167233f, 0.167334f, 0.167434f,
-0.167535f, 0.167635f, 0.167736f, 0.167836f, 0.167937f, 0.168037f, 0.168138f, 0.168238f, 0.168339f, 0.168439f, 0.16854f, 0.16864f, 0.168741f, 0.168841f, 0.168942f, 0.169042f, 0.169143f, 0.169243f, 0.169344f, 0.169444f,
-0.169545f, 0.169645f, 0.169746f, 0.169846f, 0.169947f, 0.170047f, 0.170147f, 0.170248f, 0.170348f, 0.170449f, 0.170549f, 0.17065f, 0.17075f, 0.170851f, 0.170951f, 0.171052f, 0.171152f, 0.171253f, 0.171353f, 0.171453f,
-0.171554f, 0.171654f, 0.171755f, 0.171855f, 0.171956f, 0.172056f, 0.172157f, 0.172257f, 0.172357f, 0.172458f, 0.172558f, 0.172659f, 0.172759f, 0.17286f, 0.17296f, 0.17306f, 0.173161f, 0.173261f, 0.173362f, 0.173462f,
-0.173562f, 0.173663f, 0.173763f, 0.173864f, 0.173964f, 0.174065f, 0.174165f, 0.174265f, 0.174366f, 0.174466f, 0.174567f, 0.174667f, 0.174767f, 0.174868f, 0.174968f, 0.175068f, 0.175169f, 0.175269f, 0.17537f, 0.17547f,
-0.17557f, 0.175671f, 0.175771f, 0.175871f, 0.175972f, 0.176072f, 0.176173f, 0.176273f, 0.176373f, 0.176474f, 0.176574f, 0.176674f, 0.176775f, 0.176875f, 0.176975f, 0.177076f, 0.177176f, 0.177276f, 0.177377f, 0.177477f,
-0.177577f, 0.177678f, 0.177778f, 0.177878f, 0.177979f, 0.178079f, 0.178179f, 0.17828f, 0.17838f, 0.17848f, 0.178581f, 0.178681f, 0.178781f, 0.178882f, 0.178982f, 0.179082f, 0.179183f, 0.179283f, 0.179383f, 0.179483f,
-0.179584f, 0.179684f, 0.179784f, 0.179885f, 0.179985f, 0.180085f, 0.180186f, 0.180286f, 0.180386f, 0.180486f, 0.180587f, 0.180687f, 0.180787f, 0.180887f, 0.180988f, 0.181088f, 0.181188f, 0.181289f, 0.181389f, 0.181489f,
-0.181589f, 0.18169f, 0.18179f, 0.18189f, 0.18199f, 0.182091f, 0.182191f, 0.182291f, 0.182391f, 0.182492f, 0.182592f, 0.182692f, 0.182792f, 0.182893f, 0.182993f, 0.183093f, 0.183193f, 0.183293f, 0.183394f, 0.183494f,
-0.183594f, 0.183694f, 0.183795f, 0.183895f, 0.183995f, 0.184095f, 0.184195f, 0.184296f, 0.184396f, 0.184496f, 0.184596f, 0.184696f, 0.184797f, 0.184897f, 0.184997f, 0.185097f, 0.185197f, 0.185298f, 0.185398f, 0.185498f,
-0.185598f, 0.185698f, 0.185798f, 0.185899f, 0.185999f, 0.186099f, 0.186199f, 0.186299f, 0.186399f, 0.1865f, 0.1866f, 0.1867f, 0.1868f, 0.1869f, 0.187f, 0.187101f, 0.187201f, 0.187301f, 0.187401f, 0.187501f,
-0.187601f, 0.187701f, 0.187802f, 0.187902f, 0.188002f, 0.188102f, 0.188202f, 0.188302f, 0.188402f, 0.188502f, 0.188603f, 0.188703f, 0.188803f, 0.188903f, 0.189003f, 0.189103f, 0.189203f, 0.189303f, 0.189403f, 0.189504f,
-0.189604f, 0.189704f, 0.189804f, 0.189904f, 0.190004f, 0.190104f, 0.190204f, 0.190304f, 0.190404f, 0.190504f, 0.190605f, 0.190705f, 0.190805f, 0.190905f, 0.191005f, 0.191105f, 0.191205f, 0.191305f, 0.191405f, 0.191505f,
-0.191605f, 0.191705f, 0.191805f, 0.191905f, 0.192005f, 0.192105f, 0.192206f, 0.192306f, 0.192406f, 0.192506f, 0.192606f, 0.192706f, 0.192806f, 0.192906f, 0.193006f, 0.193106f, 0.193206f, 0.193306f, 0.193406f, 0.193506f,
-0.193606f, 0.193706f, 0.193806f, 0.193906f, 0.194006f, 0.194106f, 0.194206f, 0.194306f, 0.194406f, 0.194506f, 0.194606f, 0.194706f, 0.194806f, 0.194906f, 0.195006f, 0.195106f, 0.195206f, 0.195306f, 0.195406f, 0.195506f,
-0.195606f, 0.195706f, 0.195806f, 0.195906f, 0.196006f, 0.196106f, 0.196206f, 0.196306f, 0.196406f, 0.196505f, 0.196605f, 0.196705f, 0.196805f, 0.196905f, 0.197005f, 0.197105f, 0.197205f, 0.197305f, 0.197405f, 0.197505f,
-0.197605f, 0.197705f, 0.197805f, 0.197905f, 0.198005f, 0.198104f, 0.198204f, 0.198304f, 0.198404f, 0.198504f, 0.198604f, 0.198704f, 0.198804f, 0.198904f, 0.199004f, 0.199104f, 0.199203f, 0.199303f, 0.199403f, 0.199503f,
-0.199603f, 0.199703f, 0.199803f, 0.199903f, 0.200003f, 0.200102f, 0.200202f, 0.200302f, 0.200402f, 0.200502f, 0.200602f, 0.200702f, 0.200801f, 0.200901f, 0.201001f, 0.201101f, 0.201201f, 0.201301f, 0.201401f, 0.2015f,
-0.2016f, 0.2017f, 0.2018f, 0.2019f, 0.202f, 0.202099f, 0.202199f, 0.202299f, 0.202399f, 0.202499f, 0.202599f, 0.202698f, 0.202798f, 0.202898f, 0.202998f, 0.203098f, 0.203197f, 0.203297f, 0.203397f, 0.203497f,
-0.203597f, 0.203696f, 0.203796f, 0.203896f, 0.203996f, 0.204096f, 0.204195f, 0.204295f, 0.204395f, 0.204495f, 0.204595f, 0.204694f, 0.204794f, 0.204894f, 0.204994f, 0.205093f, 0.205193f, 0.205293f, 0.205393f, 0.205492f,
-0.205592f, 0.205692f, 0.205792f, 0.205891f, 0.205991f, 0.206091f, 0.206191f, 0.20629f, 0.20639f, 0.20649f, 0.20659f, 0.206689f, 0.206789f, 0.206889f, 0.206988f, 0.207088f, 0.207188f, 0.207288f, 0.207387f, 0.207487f,
-0.207587f, 0.207686f, 0.207786f, 0.207886f, 0.207986f, 0.208085f, 0.208185f, 0.208285f, 0.208384f, 0.208484f, 0.208584f, 0.208683f, 0.208783f, 0.208883f, 0.208982f, 0.209082f, 0.209182f, 0.209281f, 0.209381f, 0.209481f,
-0.20958f, 0.20968f, 0.20978f, 0.209879f, 0.209979f, 0.210079f, 0.210178f, 0.210278f, 0.210378f, 0.210477f, 0.210577f, 0.210677f, 0.210776f, 0.210876f, 0.210975f, 0.211075f, 0.211175f, 0.211274f, 0.211374f, 0.211474f,
-0.211573f, 0.211673f, 0.211772f, 0.211872f, 0.211972f, 0.212071f, 0.212171f, 0.21227f, 0.21237f, 0.21247f, 0.212569f, 0.212669f, 0.212768f, 0.212868f, 0.212968f, 0.213067f, 0.213167f, 0.213266f, 0.213366f, 0.213465f,
-0.213565f, 0.213665f, 0.213764f, 0.213864f, 0.213963f, 0.214063f, 0.214162f, 0.214262f, 0.214361f, 0.214461f, 0.214561f, 0.21466f, 0.21476f, 0.214859f, 0.214959f, 0.215058f, 0.215158f, 0.215257f, 0.215357f, 0.215456f,
-0.215556f, 0.215655f, 0.215755f, 0.215854f, 0.215954f, 0.216053f, 0.216153f, 0.216252f, 0.216352f, 0.216451f, 0.216551f, 0.21665f, 0.21675f, 0.216849f, 0.216949f, 0.217048f, 0.217148f, 0.217247f, 0.217347f, 0.217446f,
-0.217546f, 0.217645f, 0.217745f, 0.217844f, 0.217944f, 0.218043f, 0.218143f, 0.218242f, 0.218341f, 0.218441f, 0.21854f, 0.21864f, 0.218739f, 0.218839f, 0.218938f, 0.219038f, 0.219137f, 0.219236f, 0.219336f, 0.219435f,
-0.219535f, 0.219634f, 0.219734f, 0.219833f, 0.219932f, 0.220032f, 0.220131f, 0.220231f, 0.22033f, 0.220429f, 0.220529f, 0.220628f, 0.220728f, 0.220827f, 0.220926f, 0.221026f, 0.221125f, 0.221225f, 0.221324f, 0.221423f,
-0.221523f, 0.221622f, 0.221721f, 0.221821f, 0.22192f, 0.222019f, 0.222119f, 0.222218f, 0.222318f, 0.222417f, 0.222516f, 0.222616f, 0.222715f, 0.222814f, 0.222914f, 0.223013f, 0.223112f, 0.223212f, 0.223311f, 0.22341f,
-0.22351f, 0.223609f, 0.223708f, 0.223808f, 0.223907f, 0.224006f, 0.224106f, 0.224205f, 0.224304f, 0.224403f, 0.224503f, 0.224602f, 0.224701f, 0.224801f, 0.2249f, 0.224999f, 0.225098f, 0.225198f, 0.225297f, 0.225396f,
-0.225496f, 0.225595f, 0.225694f, 0.225793f, 0.225893f, 0.225992f, 0.226091f, 0.22619f, 0.22629f, 0.226389f, 0.226488f, 0.226587f, 0.226687f, 0.226786f, 0.226885f, 0.226984f, 0.227084f, 0.227183f, 0.227282f, 0.227381f,
-0.227481f, 0.22758f, 0.227679f, 0.227778f, 0.227877f, 0.227977f, 0.228076f, 0.228175f, 0.228274f, 0.228373f, 0.228473f, 0.228572f, 0.228671f, 0.22877f, 0.228869f, 0.228969f, 0.229068f, 0.229167f, 0.229266f, 0.229365f,
-0.229464f, 0.229564f, 0.229663f, 0.229762f, 0.229861f, 0.22996f, 0.230059f, 0.230159f, 0.230258f, 0.230357f, 0.230456f, 0.230555f, 0.230654f, 0.230753f, 0.230853f, 0.230952f, 0.231051f, 0.23115f, 0.231249f, 0.231348f,
-0.231447f, 0.231546f, 0.231646f, 0.231745f, 0.231844f, 0.231943f, 0.232042f, 0.232141f, 0.23224f, 0.232339f, 0.232438f, 0.232538f, 0.232637f, 0.232736f, 0.232835f, 0.232934f, 0.233033f, 0.233132f, 0.233231f, 0.23333f,
-0.233429f, 0.233528f, 0.233627f, 0.233726f, 0.233825f, 0.233925f, 0.234024f, 0.234123f, 0.234222f, 0.234321f, 0.23442f, 0.234519f, 0.234618f, 0.234717f, 0.234816f, 0.234915f, 0.235014f, 0.235113f, 0.235212f, 0.235311f,
-0.23541f, 0.235509f, 0.235608f, 0.235707f, 0.235806f, 0.235905f, 0.236004f, 0.236103f, 0.236202f, 0.236301f, 0.2364f, 0.236499f, 0.236598f, 0.236697f, 0.236796f, 0.236895f, 0.236994f, 0.237093f, 0.237192f, 0.237291f,
-0.23739f, 0.237489f, 0.237588f, 0.237687f, 0.237786f, 0.237885f, 0.237984f, 0.238082f, 0.238181f, 0.23828f, 0.238379f, 0.238478f, 0.238577f, 0.238676f, 0.238775f, 0.238874f, 0.238973f, 0.239072f, 0.239171f, 0.23927f,
-0.239368f, 0.239467f, 0.239566f, 0.239665f, 0.239764f, 0.239863f, 0.239962f, 0.240061f, 0.24016f, 0.240259f, 0.240357f, 0.240456f, 0.240555f, 0.240654f, 0.240753f, 0.240852f, 0.240951f, 0.241049f, 0.241148f, 0.241247f,
-0.241346f, 0.241445f, 0.241544f, 0.241643f, 0.241741f, 0.24184f, 0.241939f, 0.242038f, 0.242137f, 0.242236f, 0.242334f, 0.242433f, 0.242532f, 0.242631f, 0.24273f, 0.242829f, 0.242927f, 0.243026f, 0.243125f, 0.243224f,
-0.243323f, 0.243421f, 0.24352f, 0.243619f, 0.243718f, 0.243817f, 0.243915f, 0.244014f, 0.244113f, 0.244212f, 0.24431f, 0.244409f, 0.244508f, 0.244607f, 0.244705f, 0.244804f, 0.244903f, 0.245002f, 0.2451f, 0.245199f,
-0.245298f, 0.245397f, 0.245495f, 0.245594f, 0.245693f, 0.245792f, 0.24589f, 0.245989f, 0.246088f, 0.246187f, 0.246285f, 0.246384f, 0.246483f, 0.246581f, 0.24668f, 0.246779f, 0.246877f, 0.246976f, 0.247075f, 0.247174f,
-0.247272f, 0.247371f, 0.24747f, 0.247568f, 0.247667f, 0.247766f, 0.247864f, 0.247963f, 0.248062f, 0.24816f, 0.248259f, 0.248358f, 0.248456f, 0.248555f, 0.248654f, 0.248752f, 0.248851f, 0.24895f, 0.249048f, 0.249147f,
-0.249245f, 0.249344f, 0.249443f, 0.249541f, 0.24964f, 0.249739f, 0.249837f, 0.249936f, 0.250034f, 0.250133f, 0.250232f, 0.25033f, 0.250429f, 0.250527f, 0.250626f, 0.250725f, 0.250823f, 0.250922f, 0.25102f, 0.251119f,
-0.251217f, 0.251316f, 0.251415f, 0.251513f, 0.251612f, 0.25171f, 0.251809f, 0.251907f, 0.252006f, 0.252104f, 0.252203f, 0.252302f, 0.2524f, 0.252499f, 0.252597f, 0.252696f, 0.252794f, 0.252893f, 0.252991f, 0.25309f,
-0.253188f, 0.253287f, 0.253385f, 0.253484f, 0.253582f, 0.253681f, 0.253779f, 0.253878f, 0.253976f, 0.254075f, 0.254173f, 0.254272f, 0.25437f, 0.254469f, 0.254567f, 0.254666f, 0.254764f, 0.254863f, 0.254961f, 0.25506f,
-0.255158f, 0.255257f, 0.255355f, 0.255453f, 0.255552f, 0.25565f, 0.255749f, 0.255847f, 0.255946f, 0.256044f, 0.256142f, 0.256241f, 0.256339f, 0.256438f, 0.256536f, 0.256635f, 0.256733f, 0.256831f, 0.25693f, 0.257028f,
-0.257127f, 0.257225f, 0.257323f, 0.257422f, 0.25752f, 0.257619f, 0.257717f, 0.257815f, 0.257914f, 0.258012f, 0.25811f, 0.258209f, 0.258307f, 0.258406f, 0.258504f, 0.258602f, 0.258701f, 0.258799f, 0.258897f, 0.258996f,
-0.259094f, 0.259192f, 0.259291f, 0.259389f, 0.259487f, 0.259586f, 0.259684f, 0.259782f, 0.259881f, 0.259979f, 0.260077f, 0.260176f, 0.260274f, 0.260372f, 0.26047f, 0.260569f, 0.260667f, 0.260765f, 0.260864f, 0.260962f,
-0.26106f, 0.261158f, 0.261257f, 0.261355f, 0.261453f, 0.261552f, 0.26165f, 0.261748f, 0.261846f, 0.261945f, 0.262043f, 0.262141f, 0.262239f, 0.262338f, 0.262436f, 0.262534f, 0.262632f, 0.262731f, 0.262829f, 0.262927f,
-0.263025f, 0.263123f, 0.263222f, 0.26332f, 0.263418f, 0.263516f, 0.263614f, 0.263713f, 0.263811f, 0.263909f, 0.264007f, 0.264105f, 0.264204f, 0.264302f, 0.2644f, 0.264498f, 0.264596f, 0.264695f, 0.264793f, 0.264891f,
-0.264989f, 0.265087f, 0.265185f, 0.265283f, 0.265382f, 0.26548f, 0.265578f, 0.265676f, 0.265774f, 0.265872f, 0.26597f, 0.266069f, 0.266167f, 0.266265f, 0.266363f, 0.266461f, 0.266559f, 0.266657f, 0.266755f, 0.266853f,
-0.266952f, 0.26705f, 0.267148f, 0.267246f, 0.267344f, 0.267442f, 0.26754f, 0.267638f, 0.267736f, 0.267834f, 0.267932f, 0.26803f, 0.268129f, 0.268227f, 0.268325f, 0.268423f, 0.268521f, 0.268619f, 0.268717f, 0.268815f,
-0.268913f, 0.269011f, 0.269109f, 0.269207f, 0.269305f, 0.269403f, 0.269501f, 0.269599f, 0.269697f, 0.269795f, 0.269893f, 0.269991f, 0.270089f, 0.270187f, 0.270285f, 0.270383f, 0.270481f, 0.270579f, 0.270677f, 0.270775f,
-0.270873f, 0.270971f, 0.271069f, 0.271167f, 0.271265f, 0.271363f, 0.271461f, 0.271559f, 0.271657f, 0.271755f, 0.271853f, 0.271951f, 0.272049f, 0.272146f, 0.272244f, 0.272342f, 0.27244f, 0.272538f, 0.272636f, 0.272734f,
-0.272832f, 0.27293f, 0.273028f, 0.273126f, 0.273224f, 0.273321f, 0.273419f, 0.273517f, 0.273615f, 0.273713f, 0.273811f, 0.273909f, 0.274007f, 0.274105f, 0.274202f, 0.2743f, 0.274398f, 0.274496f, 0.274594f, 0.274692f,
-0.27479f, 0.274887f, 0.274985f, 0.275083f, 0.275181f, 0.275279f, 0.275377f, 0.275474f, 0.275572f, 0.27567f, 0.275768f, 0.275866f, 0.275964f, 0.276061f, 0.276159f, 0.276257f, 0.276355f, 0.276453f, 0.27655f, 0.276648f,
-0.276746f, 0.276844f, 0.276941f, 0.277039f, 0.277137f, 0.277235f, 0.277333f, 0.27743f, 0.277528f, 0.277626f, 0.277724f, 0.277821f, 0.277919f, 0.278017f, 0.278115f, 0.278212f, 0.27831f, 0.278408f, 0.278506f, 0.278603f,
-0.278701f, 0.278799f, 0.278896f, 0.278994f, 0.279092f, 0.27919f, 0.279287f, 0.279385f, 0.279483f, 0.27958f, 0.279678f, 0.279776f, 0.279873f, 0.279971f, 0.280069f, 0.280166f, 0.280264f, 0.280362f, 0.280459f, 0.280557f,
-0.280655f, 0.280752f, 0.28085f, 0.280948f, 0.281045f, 0.281143f, 0.281241f, 0.281338f, 0.281436f, 0.281534f, 0.281631f, 0.281729f, 0.281826f, 0.281924f, 0.282022f, 0.282119f, 0.282217f, 0.282314f, 0.282412f, 0.28251f,
-0.282607f, 0.282705f, 0.282802f, 0.2829f, 0.282998f, 0.283095f, 0.283193f, 0.28329f, 0.283388f, 0.283485f, 0.283583f, 0.283681f, 0.283778f, 0.283876f, 0.283973f, 0.284071f, 0.284168f, 0.284266f, 0.284363f, 0.284461f,
-0.284558f, 0.284656f, 0.284753f, 0.284851f, 0.284949f, 0.285046f, 0.285144f, 0.285241f, 0.285339f, 0.285436f, 0.285534f, 0.285631f, 0.285729f, 0.285826f, 0.285923f, 0.286021f, 0.286118f, 0.286216f, 0.286313f, 0.286411f,
-0.286508f, 0.286606f, 0.286703f, 0.286801f, 0.286898f, 0.286996f, 0.287093f, 0.28719f, 0.287288f, 0.287385f, 0.287483f, 0.28758f, 0.287678f, 0.287775f, 0.287872f, 0.28797f, 0.288067f, 0.288165f, 0.288262f, 0.288359f,
-0.288457f, 0.288554f, 0.288652f, 0.288749f, 0.288846f, 0.288944f, 0.289041f, 0.289138f, 0.289236f, 0.289333f, 0.289431f, 0.289528f, 0.289625f, 0.289723f, 0.28982f, 0.289917f, 0.290015f, 0.290112f, 0.290209f, 0.290307f,
-0.290404f, 0.290501f, 0.290599f, 0.290696f, 0.290793f, 0.290891f, 0.290988f, 0.291085f, 0.291183f, 0.29128f, 0.291377f, 0.291474f, 0.291572f, 0.291669f, 0.291766f, 0.291864f, 0.291961f, 0.292058f, 0.292155f, 0.292253f,
-0.29235f, 0.292447f, 0.292544f, 0.292642f, 0.292739f, 0.292836f, 0.292933f, 0.293031f, 0.293128f, 0.293225f, 0.293322f, 0.29342f, 0.293517f, 0.293614f, 0.293711f, 0.293808f, 0.293906f, 0.294003f, 0.2941f, 0.294197f,
-0.294294f, 0.294392f, 0.294489f, 0.294586f, 0.294683f, 0.29478f, 0.294877f, 0.294975f, 0.295072f, 0.295169f, 0.295266f, 0.295363f, 0.29546f, 0.295558f, 0.295655f, 0.295752f, 0.295849f, 0.295946f, 0.296043f, 0.29614f,
-0.296237f, 0.296335f, 0.296432f, 0.296529f, 0.296626f, 0.296723f, 0.29682f, 0.296917f, 0.297014f, 0.297111f, 0.297209f, 0.297306f, 0.297403f, 0.2975f, 0.297597f, 0.297694f, 0.297791f, 0.297888f, 0.297985f, 0.298082f,
-0.298179f, 0.298276f, 0.298373f, 0.29847f, 0.298567f, 0.298664f, 0.298761f, 0.298858f, 0.298956f, 0.299053f, 0.29915f, 0.299247f, 0.299344f, 0.299441f, 0.299538f, 0.299635f, 0.299732f, 0.299829f, 0.299926f, 0.300023f,
-0.30012f, 0.300217f, 0.300314f, 0.30041f, 0.300507f, 0.300604f, 0.300701f, 0.300798f, 0.300895f, 0.300992f, 0.301089f, 0.301186f, 0.301283f, 0.30138f, 0.301477f, 0.301574f, 0.301671f, 0.301768f, 0.301865f, 0.301962f,
-0.302059f, 0.302155f, 0.302252f, 0.302349f, 0.302446f, 0.302543f, 0.30264f, 0.302737f, 0.302834f, 0.302931f, 0.303027f, 0.303124f, 0.303221f, 0.303318f, 0.303415f, 0.303512f, 0.303609f, 0.303706f, 0.303802f, 0.303899f,
-0.303996f, 0.304093f, 0.30419f, 0.304287f, 0.304383f, 0.30448f, 0.304577f, 0.304674f, 0.304771f, 0.304867f, 0.304964f, 0.305061f, 0.305158f, 0.305255f, 0.305351f, 0.305448f, 0.305545f, 0.305642f, 0.305739f, 0.305835f,
-0.305932f, 0.306029f, 0.306126f, 0.306222f, 0.306319f, 0.306416f, 0.306513f, 0.306609f, 0.306706f, 0.306803f, 0.3069f, 0.306996f, 0.307093f, 0.30719f, 0.307287f, 0.307383f, 0.30748f, 0.307577f, 0.307673f, 0.30777f,
-0.307867f, 0.307964f, 0.30806f, 0.308157f, 0.308254f, 0.30835f, 0.308447f, 0.308544f, 0.30864f, 0.308737f, 0.308834f, 0.30893f, 0.309027f, 0.309124f, 0.30922f, 0.309317f, 0.309414f, 0.30951f, 0.309607f, 0.309703f,
-0.3098f, 0.309897f, 0.309993f, 0.31009f, 0.310187f, 0.310283f, 0.31038f, 0.310476f, 0.310573f, 0.31067f, 0.310766f, 0.310863f, 0.310959f, 0.311056f, 0.311153f, 0.311249f, 0.311346f, 0.311442f, 0.311539f, 0.311635f,
-0.311732f, 0.311828f, 0.311925f, 0.312022f, 0.312118f, 0.312215f, 0.312311f, 0.312408f, 0.312504f, 0.312601f, 0.312697f, 0.312794f, 0.31289f, 0.312987f, 0.313083f, 0.31318f, 0.313276f, 0.313373f, 0.313469f, 0.313566f,
-0.313662f, 0.313759f, 0.313855f, 0.313952f, 0.314048f, 0.314145f, 0.314241f, 0.314338f, 0.314434f, 0.31453f, 0.314627f, 0.314723f, 0.31482f, 0.314916f, 0.315013f, 0.315109f, 0.315205f, 0.315302f, 0.315398f, 0.315495f,
-0.315591f, 0.315688f, 0.315784f, 0.31588f, 0.315977f, 0.316073f, 0.316169f, 0.316266f, 0.316362f, 0.316459f, 0.316555f, 0.316651f, 0.316748f, 0.316844f, 0.31694f, 0.317037f, 0.317133f, 0.317229f, 0.317326f, 0.317422f,
-0.317519f, 0.317615f, 0.317711f, 0.317807f, 0.317904f, 0.318f, 0.318096f, 0.318193f, 0.318289f, 0.318385f, 0.318482f, 0.318578f, 0.318674f, 0.318771f, 0.318867f, 0.318963f, 0.319059f, 0.319156f, 0.319252f, 0.319348f,
-0.319444f, 0.319541f, 0.319637f, 0.319733f, 0.319829f, 0.319926f, 0.320022f, 0.320118f, 0.320214f, 0.320311f, 0.320407f, 0.320503f, 0.320599f, 0.320695f, 0.320792f, 0.320888f, 0.320984f, 0.32108f, 0.321176f, 0.321273f,
-0.321369f, 0.321465f, 0.321561f, 0.321657f, 0.321754f, 0.32185f, 0.321946f, 0.322042f, 0.322138f, 0.322234f, 0.32233f, 0.322427f, 0.322523f, 0.322619f, 0.322715f, 0.322811f, 0.322907f, 0.323003f, 0.323099f, 0.323196f,
-0.323292f, 0.323388f, 0.323484f, 0.32358f, 0.323676f, 0.323772f, 0.323868f, 0.323964f, 0.32406f, 0.324157f, 0.324253f, 0.324349f, 0.324445f, 0.324541f, 0.324637f, 0.324733f, 0.324829f, 0.324925f, 0.325021f, 0.325117f,
-0.325213f, 0.325309f, 0.325405f, 0.325501f, 0.325597f, 0.325693f, 0.325789f, 0.325885f, 0.325981f, 0.326077f, 0.326173f, 0.326269f, 0.326365f, 0.326461f, 0.326557f, 0.326653f, 0.326749f, 0.326845f, 0.326941f, 0.327037f,
-0.327133f, 0.327229f, 0.327325f, 0.327421f, 0.327517f, 0.327613f, 0.327709f, 0.327804f, 0.3279f, 0.327996f, 0.328092f, 0.328188f, 0.328284f, 0.32838f, 0.328476f, 0.328572f, 0.328668f, 0.328764f, 0.328859f, 0.328955f,
-0.329051f, 0.329147f, 0.329243f, 0.329339f, 0.329435f, 0.329531f, 0.329626f, 0.329722f, 0.329818f, 0.329914f, 0.33001f, 0.330106f, 0.330201f, 0.330297f, 0.330393f, 0.330489f, 0.330585f, 0.330681f, 0.330776f, 0.330872f,
-0.330968f, 0.331064f, 0.33116f, 0.331255f, 0.331351f, 0.331447f, 0.331543f, 0.331638f, 0.331734f, 0.33183f, 0.331926f, 0.332022f, 0.332117f, 0.332213f, 0.332309f, 0.332404f, 0.3325f, 0.332596f, 0.332692f, 0.332787f,
-0.332883f, 0.332979f, 0.333075f, 0.33317f, 0.333266f, 0.333362f, 0.333457f, 0.333553f, 0.333649f, 0.333744f, 0.33384f, 0.333936f, 0.334032f, 0.334127f, 0.334223f, 0.334319f, 0.334414f, 0.33451f, 0.334605f, 0.334701f,
-0.334797f, 0.334892f, 0.334988f, 0.335084f, 0.335179f, 0.335275f, 0.335371f, 0.335466f, 0.335562f, 0.335657f, 0.335753f, 0.335849f, 0.335944f, 0.33604f, 0.336135f, 0.336231f, 0.336327f, 0.336422f, 0.336518f, 0.336613f,
-0.336709f, 0.336804f, 0.3369f, 0.336995f, 0.337091f, 0.337187f, 0.337282f, 0.337378f, 0.337473f, 0.337569f, 0.337664f, 0.33776f, 0.337855f, 0.337951f, 0.338046f, 0.338142f, 0.338237f, 0.338333f, 0.338428f, 0.338524f,
-0.338619f, 0.338715f, 0.33881f, 0.338906f, 0.339001f, 0.339097f, 0.339192f, 0.339288f, 0.339383f, 0.339478f, 0.339574f, 0.339669f, 0.339765f, 0.33986f, 0.339956f, 0.340051f, 0.340146f, 0.340242f, 0.340337f, 0.340433f,
-0.340528f, 0.340624f, 0.340719f, 0.340814f, 0.34091f, 0.341005f, 0.3411f, 0.341196f, 0.341291f, 0.341387f, 0.341482f, 0.341577f, 0.341673f, 0.341768f, 0.341863f, 0.341959f, 0.342054f, 0.342149f, 0.342245f, 0.34234f,
-0.342435f, 0.342531f, 0.342626f, 0.342721f, 0.342817f, 0.342912f, 0.343007f, 0.343102f, 0.343198f, 0.343293f, 0.343388f, 0.343484f, 0.343579f, 0.343674f, 0.343769f, 0.343865f, 0.34396f, 0.344055f, 0.34415f, 0.344246f,
-0.344341f, 0.344436f, 0.344531f, 0.344627f, 0.344722f, 0.344817f, 0.344912f, 0.345008f, 0.345103f, 0.345198f, 0.345293f, 0.345388f, 0.345484f, 0.345579f, 0.345674f, 0.345769f, 0.345864f, 0.345959f, 0.346055f, 0.34615f,
-0.346245f, 0.34634f, 0.346435f, 0.34653f, 0.346626f, 0.346721f, 0.346816f, 0.346911f, 0.347006f, 0.347101f, 0.347196f, 0.347291f, 0.347387f, 0.347482f, 0.347577f, 0.347672f, 0.347767f, 0.347862f, 0.347957f, 0.348052f,
-0.348147f, 0.348242f, 0.348337f, 0.348433f, 0.348528f, 0.348623f, 0.348718f, 0.348813f, 0.348908f, 0.349003f, 0.349098f, 0.349193f, 0.349288f, 0.349383f, 0.349478f, 0.349573f, 0.349668f, 0.349763f, 0.349858f, 0.349953f,
-0.350048f, 0.350143f, 0.350238f, 0.350333f, 0.350428f, 0.350523f, 0.350618f, 0.350713f, 0.350808f, 0.350903f, 0.350998f, 0.351093f, 0.351188f, 0.351283f, 0.351377f, 0.351472f, 0.351567f, 0.351662f, 0.351757f, 0.351852f,
-0.351947f, 0.352042f, 0.352137f, 0.352232f, 0.352327f, 0.352422f, 0.352516f, 0.352611f, 0.352706f, 0.352801f, 0.352896f, 0.352991f, 0.353086f, 0.353181f, 0.353275f, 0.35337f, 0.353465f, 0.35356f, 0.353655f, 0.35375f,
-0.353844f, 0.353939f, 0.354034f, 0.354129f, 0.354224f, 0.354318f, 0.354413f, 0.354508f, 0.354603f, 0.354698f, 0.354792f, 0.354887f, 0.354982f, 0.355077f, 0.355172f, 0.355266f, 0.355361f, 0.355456f, 0.355551f, 0.355645f,
-0.35574f, 0.355835f, 0.35593f, 0.356024f, 0.356119f, 0.356214f, 0.356308f, 0.356403f, 0.356498f, 0.356593f, 0.356687f, 0.356782f, 0.356877f, 0.356971f, 0.357066f, 0.357161f, 0.357255f, 0.35735f, 0.357445f, 0.357539f,
-0.357634f, 0.357729f, 0.357823f, 0.357918f, 0.358013f, 0.358107f, 0.358202f, 0.358297f, 0.358391f, 0.358486f, 0.35858f, 0.358675f, 0.35877f, 0.358864f, 0.358959f, 0.359053f, 0.359148f, 0.359243f, 0.359337f, 0.359432f,
-0.359526f, 0.359621f, 0.359716f, 0.35981f, 0.359905f, 0.359999f, 0.360094f, 0.360188f, 0.360283f, 0.360377f, 0.360472f, 0.360566f, 0.360661f, 0.360755f, 0.36085f, 0.360944f, 0.361039f, 0.361133f, 0.361228f, 0.361322f,
-0.361417f, 0.361511f, 0.361606f, 0.3617f, 0.361795f, 0.361889f, 0.361984f, 0.362078f, 0.362173f, 0.362267f, 0.362362f, 0.362456f, 0.362551f, 0.362645f, 0.362739f, 0.362834f, 0.362928f, 0.363023f, 0.363117f, 0.363211f,
-0.363306f, 0.3634f, 0.363495f, 0.363589f, 0.363683f, 0.363778f, 0.363872f, 0.363967f, 0.364061f, 0.364155f, 0.36425f, 0.364344f, 0.364438f, 0.364533f, 0.364627f, 0.364721f, 0.364816f, 0.36491f, 0.365004f, 0.365099f,
-0.365193f, 0.365287f, 0.365382f, 0.365476f, 0.36557f, 0.365665f, 0.365759f, 0.365853f, 0.365947f, 0.366042f, 0.366136f, 0.36623f, 0.366324f, 0.366419f, 0.366513f, 0.366607f, 0.366701f, 0.366796f, 0.36689f, 0.366984f,
-0.367078f, 0.367173f, 0.367267f, 0.367361f, 0.367455f, 0.367549f, 0.367644f, 0.367738f, 0.367832f, 0.367926f, 0.36802f, 0.368115f, 0.368209f, 0.368303f, 0.368397f, 0.368491f, 0.368585f, 0.36868f, 0.368774f, 0.368868f,
-0.368962f, 0.369056f, 0.36915f, 0.369244f, 0.369339f, 0.369433f, 0.369527f, 0.369621f, 0.369715f, 0.369809f, 0.369903f, 0.369997f, 0.370091f, 0.370185f, 0.37028f, 0.370374f, 0.370468f, 0.370562f, 0.370656f, 0.37075f,
-0.370844f, 0.370938f, 0.371032f, 0.371126f, 0.37122f, 0.371314f, 0.371408f, 0.371502f, 0.371596f, 0.37169f, 0.371784f, 0.371878f, 0.371972f, 0.372066f, 0.37216f, 0.372254f, 0.372348f, 0.372442f, 0.372536f, 0.37263f,
-0.372724f, 0.372818f, 0.372912f, 0.373006f, 0.3731f, 0.373194f, 0.373288f, 0.373382f, 0.373476f, 0.37357f, 0.373663f, 0.373757f, 0.373851f, 0.373945f, 0.374039f, 0.374133f, 0.374227f, 0.374321f, 0.374415f, 0.374509f,
-0.374602f, 0.374696f, 0.37479f, 0.374884f, 0.374978f, 0.375072f, 0.375166f, 0.375259f, 0.375353f, 0.375447f, 0.375541f, 0.375635f, 0.375729f, 0.375822f, 0.375916f, 0.37601f, 0.376104f, 0.376198f, 0.376291f, 0.376385f,
-0.376479f, 0.376573f, 0.376667f, 0.37676f, 0.376854f, 0.376948f, 0.377042f, 0.377135f, 0.377229f, 0.377323f, 0.377417f, 0.37751f, 0.377604f, 0.377698f, 0.377792f, 0.377885f, 0.377979f, 0.378073f, 0.378166f, 0.37826f,
-0.378354f, 0.378447f, 0.378541f, 0.378635f, 0.378728f, 0.378822f, 0.378916f, 0.379009f, 0.379103f, 0.379197f, 0.37929f, 0.379384f, 0.379478f, 0.379571f, 0.379665f, 0.379759f, 0.379852f, 0.379946f, 0.380039f, 0.380133f,
-0.380227f, 0.38032f, 0.380414f, 0.380507f, 0.380601f, 0.380695f, 0.380788f, 0.380882f, 0.380975f, 0.381069f, 0.381162f, 0.381256f, 0.38135f, 0.381443f, 0.381537f, 0.38163f, 0.381724f, 0.381817f, 0.381911f, 0.382004f,
-0.382098f, 0.382191f, 0.382285f, 0.382378f, 0.382472f, 0.382565f, 0.382659f, 0.382752f, 0.382846f, 0.382939f, 0.383033f, 0.383126f, 0.38322f, 0.383313f, 0.383407f, 0.3835f, 0.383593f, 0.383687f, 0.38378f, 0.383874f,
-0.383967f, 0.384061f, 0.384154f, 0.384247f, 0.384341f, 0.384434f, 0.384528f, 0.384621f, 0.384714f, 0.384808f, 0.384901f, 0.384994f, 0.385088f, 0.385181f, 0.385275f, 0.385368f, 0.385461f, 0.385555f, 0.385648f, 0.385741f,
-0.385835f, 0.385928f, 0.386021f, 0.386115f, 0.386208f, 0.386301f, 0.386395f, 0.386488f, 0.386581f, 0.386674f, 0.386768f, 0.386861f, 0.386954f, 0.387047f, 0.387141f, 0.387234f, 0.387327f, 0.387421f, 0.387514f, 0.387607f,
-0.3877f, 0.387793f, 0.387887f, 0.38798f, 0.388073f, 0.388166f, 0.38826f, 0.388353f, 0.388446f, 0.388539f, 0.388632f, 0.388726f, 0.388819f, 0.388912f, 0.389005f, 0.389098f, 0.389191f, 0.389285f, 0.389378f, 0.389471f,
-0.389564f, 0.389657f, 0.38975f, 0.389843f, 0.389937f, 0.39003f, 0.390123f, 0.390216f, 0.390309f, 0.390402f, 0.390495f, 0.390588f, 0.390681f, 0.390774f, 0.390868f, 0.390961f, 0.391054f, 0.391147f, 0.39124f, 0.391333f,
-0.391426f, 0.391519f, 0.391612f, 0.391705f, 0.391798f, 0.391891f, 0.391984f, 0.392077f, 0.39217f, 0.392263f, 0.392356f, 0.392449f, 0.392542f, 0.392635f, 0.392728f, 0.392821f, 0.392914f, 0.393007f, 0.3931f, 0.393193f,
-0.393286f, 0.393379f, 0.393472f, 0.393565f, 0.393658f, 0.393751f, 0.393844f, 0.393937f, 0.394029f, 0.394122f, 0.394215f, 0.394308f, 0.394401f, 0.394494f, 0.394587f, 0.39468f, 0.394773f, 0.394866f, 0.394958f, 0.395051f,
-0.395144f, 0.395237f, 0.39533f, 0.395423f, 0.395516f, 0.395608f, 0.395701f, 0.395794f, 0.395887f, 0.39598f, 0.396072f, 0.396165f, 0.396258f, 0.396351f, 0.396444f, 0.396536f, 0.396629f, 0.396722f, 0.396815f, 0.396908f,
-0.397f, 0.397093f, 0.397186f, 0.397279f, 0.397371f, 0.397464f, 0.397557f, 0.39765f, 0.397742f, 0.397835f, 0.397928f, 0.39802f, 0.398113f, 0.398206f, 0.398299f, 0.398391f, 0.398484f, 0.398577f, 0.398669f, 0.398762f,
-0.398855f, 0.398947f, 0.39904f, 0.399133f, 0.399225f, 0.399318f, 0.399411f, 0.399503f, 0.399596f, 0.399689f, 0.399781f, 0.399874f, 0.399966f, 0.400059f, 0.400152f, 0.400244f, 0.400337f, 0.400429f, 0.400522f, 0.400615f,
-0.400707f, 0.4008f, 0.400892f, 0.400985f, 0.401077f, 0.40117f, 0.401262f, 0.401355f, 0.401448f, 0.40154f, 0.401633f, 0.401725f, 0.401818f, 0.40191f, 0.402003f, 0.402095f, 0.402188f, 0.40228f, 0.402373f, 0.402465f,
-0.402558f, 0.40265f, 0.402743f, 0.402835f, 0.402928f, 0.40302f, 0.403112f, 0.403205f, 0.403297f, 0.40339f, 0.403482f, 0.403575f, 0.403667f, 0.403759f, 0.403852f, 0.403944f, 0.404037f, 0.404129f, 0.404221f, 0.404314f,
-0.404406f, 0.404499f, 0.404591f, 0.404683f, 0.404776f, 0.404868f, 0.40496f, 0.405053f, 0.405145f, 0.405237f, 0.40533f, 0.405422f, 0.405514f, 0.405607f, 0.405699f, 0.405791f, 0.405884f, 0.405976f, 0.406068f, 0.406161f,
-0.406253f, 0.406345f, 0.406437f, 0.40653f, 0.406622f, 0.406714f, 0.406806f, 0.406899f, 0.406991f, 0.407083f, 0.407175f, 0.407268f, 0.40736f, 0.407452f, 0.407544f, 0.407637f, 0.407729f, 0.407821f, 0.407913f, 0.408005f,
-0.408098f, 0.40819f, 0.408282f, 0.408374f, 0.408466f, 0.408558f, 0.408651f, 0.408743f, 0.408835f, 0.408927f, 0.409019f, 0.409111f, 0.409203f, 0.409296f, 0.409388f, 0.40948f, 0.409572f, 0.409664f, 0.409756f, 0.409848f,
-0.40994f, 0.410032f, 0.410124f, 0.410216f, 0.410309f, 0.410401f, 0.410493f, 0.410585f, 0.410677f, 0.410769f, 0.410861f, 0.410953f, 0.411045f, 0.411137f, 0.411229f, 0.411321f, 0.411413f, 0.411505f, 0.411597f, 0.411689f,
-0.411781f, 0.411873f, 0.411965f, 0.412057f, 0.412149f, 0.412241f, 0.412333f, 0.412425f, 0.412517f, 0.412609f, 0.412701f, 0.412793f, 0.412884f, 0.412976f, 0.413068f, 0.41316f, 0.413252f, 0.413344f, 0.413436f, 0.413528f,
-0.41362f, 0.413712f, 0.413804f, 0.413895f, 0.413987f, 0.414079f, 0.414171f, 0.414263f, 0.414355f, 0.414447f, 0.414538f, 0.41463f, 0.414722f, 0.414814f, 0.414906f, 0.414998f, 0.415089f, 0.415181f, 0.415273f, 0.415365f,
-0.415457f, 0.415548f, 0.41564f, 0.415732f, 0.415824f, 0.415915f, 0.416007f, 0.416099f, 0.416191f, 0.416282f, 0.416374f, 0.416466f, 0.416558f, 0.416649f, 0.416741f, 0.416833f, 0.416924f, 0.417016f, 0.417108f, 0.4172f,
-0.417291f, 0.417383f, 0.417475f, 0.417566f, 0.417658f, 0.41775f, 0.417841f, 0.417933f, 0.418025f, 0.418116f, 0.418208f, 0.4183f, 0.418391f, 0.418483f, 0.418574f, 0.418666f, 0.418758f, 0.418849f, 0.418941f, 0.419032f,
-0.419124f, 0.419216f, 0.419307f, 0.419399f, 0.41949f, 0.419582f, 0.419673f, 0.419765f, 0.419857f, 0.419948f, 0.42004f, 0.420131f, 0.420223f, 0.420314f, 0.420406f, 0.420497f, 0.420589f, 0.42068f, 0.420772f, 0.420863f,
-0.420955f, 0.421046f, 0.421138f, 0.421229f, 0.421321f, 0.421412f, 0.421504f, 0.421595f, 0.421687f, 0.421778f, 0.421869f, 0.421961f, 0.422052f, 0.422144f, 0.422235f, 0.422327f, 0.422418f, 0.422509f, 0.422601f, 0.422692f,
-0.422783f, 0.422875f, 0.422966f, 0.423058f, 0.423149f, 0.42324f, 0.423332f, 0.423423f, 0.423514f, 0.423606f, 0.423697f, 0.423788f, 0.42388f, 0.423971f, 0.424062f, 0.424154f, 0.424245f, 0.424336f, 0.424428f, 0.424519f,
-0.42461f, 0.424701f, 0.424793f, 0.424884f, 0.424975f, 0.425067f, 0.425158f, 0.425249f, 0.42534f, 0.425431f, 0.425523f, 0.425614f, 0.425705f, 0.425796f, 0.425888f, 0.425979f, 0.42607f, 0.426161f, 0.426252f, 0.426344f,
-0.426435f, 0.426526f, 0.426617f, 0.426708f, 0.426799f, 0.426891f, 0.426982f, 0.427073f, 0.427164f, 0.427255f, 0.427346f, 0.427437f, 0.427529f, 0.42762f, 0.427711f, 0.427802f, 0.427893f, 0.427984f, 0.428075f, 0.428166f,
-0.428257f, 0.428348f, 0.428439f, 0.428531f, 0.428622f, 0.428713f, 0.428804f, 0.428895f, 0.428986f, 0.429077f, 0.429168f, 0.429259f, 0.42935f, 0.429441f, 0.429532f, 0.429623f, 0.429714f, 0.429805f, 0.429896f, 0.429987f,
-0.430078f, 0.430169f, 0.43026f, 0.430351f, 0.430442f, 0.430533f, 0.430624f, 0.430715f, 0.430805f, 0.430896f, 0.430987f, 0.431078f, 0.431169f, 0.43126f, 0.431351f, 0.431442f, 0.431533f, 0.431624f, 0.431714f, 0.431805f,
-0.431896f, 0.431987f, 0.432078f, 0.432169f, 0.43226f, 0.432351f, 0.432441f, 0.432532f, 0.432623f, 0.432714f, 0.432805f, 0.432895f, 0.432986f, 0.433077f, 0.433168f, 0.433259f, 0.433349f, 0.43344f, 0.433531f, 0.433622f,
-0.433713f, 0.433803f, 0.433894f, 0.433985f, 0.434076f, 0.434166f, 0.434257f, 0.434348f, 0.434439f, 0.434529f, 0.43462f, 0.434711f, 0.434801f, 0.434892f, 0.434983f, 0.435073f, 0.435164f, 0.435255f, 0.435345f, 0.435436f,
-0.435527f, 0.435617f, 0.435708f, 0.435799f, 0.435889f, 0.43598f, 0.436071f, 0.436161f, 0.436252f, 0.436343f, 0.436433f, 0.436524f, 0.436614f, 0.436705f, 0.436796f, 0.436886f, 0.436977f, 0.437067f, 0.437158f, 0.437248f,
-0.437339f, 0.437429f, 0.43752f, 0.437611f, 0.437701f, 0.437792f, 0.437882f, 0.437973f, 0.438063f, 0.438154f, 0.438244f, 0.438335f, 0.438425f, 0.438516f, 0.438606f, 0.438697f, 0.438787f, 0.438878f, 0.438968f, 0.439058f,
-0.439149f, 0.439239f, 0.43933f, 0.43942f, 0.439511f, 0.439601f, 0.439692f, 0.439782f, 0.439872f, 0.439963f, 0.440053f, 0.440144f, 0.440234f, 0.440324f, 0.440415f, 0.440505f, 0.440595f, 0.440686f, 0.440776f, 0.440866f,
-0.440957f, 0.441047f, 0.441137f, 0.441228f, 0.441318f, 0.441408f, 0.441499f, 0.441589f, 0.441679f, 0.44177f, 0.44186f, 0.44195f, 0.442041f, 0.442131f, 0.442221f, 0.442311f, 0.442402f, 0.442492f, 0.442582f, 0.442672f,
-0.442763f, 0.442853f, 0.442943f, 0.443033f, 0.443123f, 0.443214f, 0.443304f, 0.443394f, 0.443484f, 0.443574f, 0.443665f, 0.443755f, 0.443845f, 0.443935f, 0.444025f, 0.444115f, 0.444206f, 0.444296f, 0.444386f, 0.444476f,
-0.444566f, 0.444656f, 0.444746f, 0.444837f, 0.444927f, 0.445017f, 0.445107f, 0.445197f, 0.445287f, 0.445377f, 0.445467f, 0.445557f, 0.445647f, 0.445737f, 0.445827f, 0.445917f, 0.446008f, 0.446098f, 0.446188f, 0.446278f,
-0.446368f, 0.446458f, 0.446548f, 0.446638f, 0.446728f, 0.446818f, 0.446908f, 0.446998f, 0.447088f, 0.447178f, 0.447268f, 0.447358f, 0.447447f, 0.447537f, 0.447627f, 0.447717f, 0.447807f, 0.447897f, 0.447987f, 0.448077f,
-0.448167f, 0.448257f, 0.448347f, 0.448437f, 0.448527f, 0.448616f, 0.448706f, 0.448796f, 0.448886f, 0.448976f, 0.449066f, 0.449156f, 0.449245f, 0.449335f, 0.449425f, 0.449515f, 0.449605f, 0.449695f, 0.449784f, 0.449874f,
-0.449964f, 0.450054f, 0.450144f, 0.450233f, 0.450323f, 0.450413f, 0.450503f, 0.450593f, 0.450682f, 0.450772f, 0.450862f, 0.450952f, 0.451041f, 0.451131f, 0.451221f, 0.45131f, 0.4514f, 0.45149f, 0.45158f, 0.451669f,
-0.451759f, 0.451849f, 0.451938f, 0.452028f, 0.452118f, 0.452207f, 0.452297f, 0.452387f, 0.452476f, 0.452566f, 0.452656f, 0.452745f, 0.452835f, 0.452925f, 0.453014f, 0.453104f, 0.453193f, 0.453283f, 0.453373f, 0.453462f,
-0.453552f, 0.453641f, 0.453731f, 0.45382f, 0.45391f, 0.454f, 0.454089f, 0.454179f, 0.454268f, 0.454358f, 0.454447f, 0.454537f, 0.454626f, 0.454716f, 0.454805f, 0.454895f, 0.454984f, 0.455074f, 0.455163f, 0.455253f,
-0.455342f, 0.455432f, 0.455521f, 0.455611f, 0.4557f, 0.45579f, 0.455879f, 0.455968f, 0.456058f, 0.456147f, 0.456237f, 0.456326f, 0.456416f, 0.456505f, 0.456594f, 0.456684f, 0.456773f, 0.456863f, 0.456952f, 0.457041f,
-0.457131f, 0.45722f, 0.457309f, 0.457399f, 0.457488f, 0.457577f, 0.457667f, 0.457756f, 0.457845f, 0.457935f, 0.458024f, 0.458113f, 0.458203f, 0.458292f, 0.458381f, 0.45847f, 0.45856f, 0.458649f, 0.458738f, 0.458827f,
-0.458917f, 0.459006f, 0.459095f, 0.459184f, 0.459274f, 0.459363f, 0.459452f, 0.459541f, 0.459631f, 0.45972f, 0.459809f, 0.459898f, 0.459987f, 0.460077f, 0.460166f, 0.460255f, 0.460344f, 0.460433f, 0.460522f, 0.460611f,
-0.460701f, 0.46079f, 0.460879f, 0.460968f, 0.461057f, 0.461146f, 0.461235f, 0.461324f, 0.461414f, 0.461503f, 0.461592f, 0.461681f, 0.46177f, 0.461859f, 0.461948f, 0.462037f, 0.462126f, 0.462215f, 0.462304f, 0.462393f,
-0.462482f, 0.462571f, 0.46266f, 0.462749f, 0.462838f, 0.462927f, 0.463016f, 0.463105f, 0.463194f, 0.463283f, 0.463372f, 0.463461f, 0.46355f, 0.463639f, 0.463728f, 0.463817f, 0.463906f, 0.463995f, 0.464084f, 0.464173f,
-0.464262f, 0.464351f, 0.46444f, 0.464528f, 0.464617f, 0.464706f, 0.464795f, 0.464884f, 0.464973f, 0.465062f, 0.465151f, 0.465239f, 0.465328f, 0.465417f, 0.465506f, 0.465595f, 0.465684f, 0.465772f, 0.465861f, 0.46595f,
-0.466039f, 0.466128f, 0.466216f, 0.466305f, 0.466394f, 0.466483f, 0.466572f, 0.46666f, 0.466749f, 0.466838f, 0.466927f, 0.467015f, 0.467104f, 0.467193f, 0.467282f, 0.46737f, 0.467459f, 0.467548f, 0.467636f, 0.467725f,
-0.467814f, 0.467902f, 0.467991f, 0.46808f, 0.468168f, 0.468257f, 0.468346f, 0.468434f, 0.468523f, 0.468612f, 0.4687f, 0.468789f, 0.468878f, 0.468966f, 0.469055f, 0.469143f, 0.469232f, 0.469321f, 0.469409f, 0.469498f,
-0.469586f, 0.469675f, 0.469763f, 0.469852f, 0.469941f, 0.470029f, 0.470118f, 0.470206f, 0.470295f, 0.470383f, 0.470472f, 0.47056f, 0.470649f, 0.470737f, 0.470826f, 0.470914f, 0.471003f, 0.471091f, 0.47118f, 0.471268f,
-0.471357f, 0.471445f, 0.471534f, 0.471622f, 0.47171f, 0.471799f, 0.471887f, 0.471976f, 0.472064f, 0.472153f, 0.472241f, 0.472329f, 0.472418f, 0.472506f, 0.472595f, 0.472683f, 0.472771f, 0.47286f, 0.472948f, 0.473036f,
-0.473125f, 0.473213f, 0.473301f, 0.47339f, 0.473478f, 0.473566f, 0.473655f, 0.473743f, 0.473831f, 0.47392f, 0.474008f, 0.474096f, 0.474184f, 0.474273f, 0.474361f, 0.474449f, 0.474538f, 0.474626f, 0.474714f, 0.474802f,
-0.47489f, 0.474979f, 0.475067f, 0.475155f, 0.475243f, 0.475332f, 0.47542f, 0.475508f, 0.475596f, 0.475684f, 0.475772f, 0.475861f, 0.475949f, 0.476037f, 0.476125f, 0.476213f, 0.476301f, 0.47639f, 0.476478f, 0.476566f,
-0.476654f, 0.476742f, 0.47683f, 0.476918f, 0.477006f, 0.477094f, 0.477182f, 0.477271f, 0.477359f, 0.477447f, 0.477535f, 0.477623f, 0.477711f, 0.477799f, 0.477887f, 0.477975f, 0.478063f, 0.478151f, 0.478239f, 0.478327f,
-0.478415f, 0.478503f, 0.478591f, 0.478679f, 0.478767f, 0.478855f, 0.478943f, 0.479031f, 0.479119f, 0.479207f, 0.479295f, 0.479383f, 0.479471f, 0.479558f, 0.479646f, 0.479734f, 0.479822f, 0.47991f, 0.479998f, 0.480086f,
-0.480174f, 0.480262f, 0.48035f, 0.480437f, 0.480525f, 0.480613f, 0.480701f, 0.480789f, 0.480877f, 0.480964f, 0.481052f, 0.48114f, 0.481228f, 0.481316f, 0.481404f, 0.481491f, 0.481579f, 0.481667f, 0.481755f, 0.481842f,
-0.48193f, 0.482018f, 0.482106f, 0.482193f, 0.482281f, 0.482369f, 0.482457f, 0.482544f, 0.482632f, 0.48272f, 0.482808f, 0.482895f, 0.482983f, 0.483071f, 0.483158f, 0.483246f, 0.483334f, 0.483421f, 0.483509f, 0.483597f,
-0.483684f, 0.483772f, 0.48386f, 0.483947f, 0.484035f, 0.484122f, 0.48421f, 0.484298f, 0.484385f, 0.484473f, 0.48456f, 0.484648f, 0.484736f, 0.484823f, 0.484911f, 0.484998f, 0.485086f, 0.485173f, 0.485261f, 0.485348f,
-0.485436f, 0.485524f, 0.485611f, 0.485699f, 0.485786f, 0.485874f, 0.485961f, 0.486049f, 0.486136f, 0.486224f, 0.486311f, 0.486398f, 0.486486f, 0.486573f, 0.486661f, 0.486748f, 0.486836f, 0.486923f, 0.487011f, 0.487098f,
-0.487185f, 0.487273f, 0.48736f, 0.487448f, 0.487535f, 0.487622f, 0.48771f, 0.487797f, 0.487884f, 0.487972f, 0.488059f, 0.488147f, 0.488234f, 0.488321f, 0.488409f, 0.488496f, 0.488583f, 0.48867f, 0.488758f, 0.488845f,
-0.488932f, 0.48902f, 0.489107f, 0.489194f, 0.489281f, 0.489369f, 0.489456f, 0.489543f, 0.48963f, 0.489718f, 0.489805f, 0.489892f, 0.489979f, 0.490067f, 0.490154f, 0.490241f, 0.490328f, 0.490415f, 0.490503f, 0.49059f,
-0.490677f, 0.490764f, 0.490851f, 0.490938f, 0.491026f, 0.491113f, 0.4912f, 0.491287f, 0.491374f, 0.491461f, 0.491548f, 0.491635f, 0.491723f, 0.49181f, 0.491897f, 0.491984f, 0.492071f, 0.492158f, 0.492245f, 0.492332f,
-0.492419f, 0.492506f, 0.492593f, 0.49268f, 0.492767f, 0.492854f, 0.492941f, 0.493028f, 0.493115f, 0.493202f, 0.493289f, 0.493376f, 0.493463f, 0.49355f, 0.493637f, 0.493724f, 0.493811f, 0.493898f, 0.493985f, 0.494072f,
-0.494159f, 0.494246f, 0.494333f, 0.49442f, 0.494507f, 0.494594f, 0.49468f, 0.494767f, 0.494854f, 0.494941f, 0.495028f, 0.495115f, 0.495202f, 0.495289f, 0.495375f, 0.495462f, 0.495549f, 0.495636f, 0.495723f, 0.49581f,
-0.495896f, 0.495983f, 0.49607f, 0.496157f, 0.496244f, 0.49633f, 0.496417f, 0.496504f, 0.496591f, 0.496677f, 0.496764f, 0.496851f, 0.496938f, 0.497024f, 0.497111f, 0.497198f, 0.497285f, 0.497371f, 0.497458f, 0.497545f,
-0.497631f, 0.497718f, 0.497805f, 0.497891f, 0.497978f, 0.498065f, 0.498151f, 0.498238f, 0.498325f, 0.498411f, 0.498498f, 0.498585f, 0.498671f, 0.498758f, 0.498844f, 0.498931f, 0.499018f, 0.499104f, 0.499191f, 0.499277f,
-0.499364f, 0.49945f, 0.499537f, 0.499624f, 0.49971f, 0.499797f, 0.499883f, 0.49997f, 0.500056f, 0.500143f, 0.500229f, 0.500316f, 0.500402f, 0.500489f, 0.500575f, 0.500662f, 0.500748f, 0.500835f, 0.500921f, 0.501008f,
-0.501094f, 0.50118f, 0.501267f, 0.501353f, 0.50144f, 0.501526f, 0.501613f, 0.501699f, 0.501785f, 0.501872f, 0.501958f, 0.502045f, 0.502131f, 0.502217f, 0.502304f, 0.50239f, 0.502476f, 0.502563f, 0.502649f, 0.502735f,
-0.502822f, 0.502908f, 0.502994f, 0.503081f, 0.503167f, 0.503253f, 0.503339f, 0.503426f, 0.503512f, 0.503598f, 0.503685f, 0.503771f, 0.503857f, 0.503943f, 0.50403f, 0.504116f, 0.504202f, 0.504288f, 0.504374f, 0.504461f,
-0.504547f, 0.504633f, 0.504719f, 0.504805f, 0.504892f, 0.504978f, 0.505064f, 0.50515f, 0.505236f, 0.505322f, 0.505409f, 0.505495f, 0.505581f, 0.505667f, 0.505753f, 0.505839f, 0.505925f, 0.506011f, 0.506097f, 0.506184f,
-0.50627f, 0.506356f, 0.506442f, 0.506528f, 0.506614f, 0.5067f, 0.506786f, 0.506872f, 0.506958f, 0.507044f, 0.50713f, 0.507216f, 0.507302f, 0.507388f, 0.507474f, 0.50756f, 0.507646f, 0.507732f, 0.507818f, 0.507904f,
-0.50799f, 0.508076f, 0.508162f, 0.508248f, 0.508334f, 0.50842f, 0.508505f, 0.508591f, 0.508677f, 0.508763f, 0.508849f, 0.508935f, 0.509021f, 0.509107f, 0.509193f, 0.509278f, 0.509364f, 0.50945f, 0.509536f, 0.509622f,
-0.509708f, 0.509793f, 0.509879f, 0.509965f, 0.510051f, 0.510137f, 0.510222f, 0.510308f, 0.510394f, 0.51048f, 0.510566f, 0.510651f, 0.510737f, 0.510823f, 0.510909f, 0.510994f, 0.51108f, 0.511166f, 0.511251f, 0.511337f,
-0.511423f, 0.511509f, 0.511594f, 0.51168f, 0.511766f, 0.511851f, 0.511937f, 0.512023f, 0.512108f, 0.512194f, 0.51228f, 0.512365f, 0.512451f, 0.512536f, 0.512622f, 0.512708f, 0.512793f, 0.512879f, 0.512965f, 0.51305f,
-0.513136f, 0.513221f, 0.513307f, 0.513392f, 0.513478f, 0.513563f, 0.513649f, 0.513735f, 0.51382f, 0.513906f, 0.513991f, 0.514077f, 0.514162f, 0.514248f, 0.514333f, 0.514419f, 0.514504f, 0.51459f, 0.514675f, 0.51476f,
-0.514846f, 0.514931f, 0.515017f, 0.515102f, 0.515188f, 0.515273f, 0.515359f, 0.515444f, 0.515529f, 0.515615f, 0.5157f, 0.515786f, 0.515871f, 0.515956f, 0.516042f, 0.516127f, 0.516212f, 0.516298f, 0.516383f, 0.516468f,
-0.516554f, 0.516639f, 0.516724f, 0.51681f, 0.516895f, 0.51698f, 0.517066f, 0.517151f, 0.517236f, 0.517321f, 0.517407f, 0.517492f, 0.517577f, 0.517662f, 0.517748f, 0.517833f, 0.517918f, 0.518003f, 0.518089f, 0.518174f,
-0.518259f, 0.518344f, 0.518429f, 0.518514f, 0.5186f, 0.518685f, 0.51877f, 0.518855f, 0.51894f, 0.519025f, 0.519111f, 0.519196f, 0.519281f, 0.519366f, 0.519451f, 0.519536f, 0.519621f, 0.519706f, 0.519791f, 0.519877f,
-0.519962f, 0.520047f, 0.520132f, 0.520217f, 0.520302f, 0.520387f, 0.520472f, 0.520557f, 0.520642f, 0.520727f, 0.520812f, 0.520897f, 0.520982f, 0.521067f, 0.521152f, 0.521237f, 0.521322f, 0.521407f, 0.521492f, 0.521577f,
-0.521662f, 0.521747f, 0.521832f, 0.521917f, 0.522001f, 0.522086f, 0.522171f, 0.522256f, 0.522341f, 0.522426f, 0.522511f, 0.522596f, 0.522681f, 0.522765f, 0.52285f, 0.522935f, 0.52302f, 0.523105f, 0.52319f, 0.523274f,
-0.523359f, 0.523444f, 0.523529f, 0.523614f, 0.523699f, 0.523783f, 0.523868f, 0.523953f, 0.524038f, 0.524122f, 0.524207f, 0.524292f, 0.524377f, 0.524461f, 0.524546f, 0.524631f, 0.524716f, 0.5248f, 0.524885f, 0.52497f,
-0.525054f, 0.525139f, 0.525224f, 0.525308f, 0.525393f, 0.525478f, 0.525562f, 0.525647f, 0.525732f, 0.525816f, 0.525901f, 0.525985f, 0.52607f, 0.526155f, 0.526239f, 0.526324f, 0.526408f, 0.526493f, 0.526578f, 0.526662f,
-0.526747f, 0.526831f, 0.526916f, 0.527f, 0.527085f, 0.527169f, 0.527254f, 0.527338f, 0.527423f, 0.527508f, 0.527592f, 0.527676f, 0.527761f, 0.527845f, 0.52793f, 0.528014f, 0.528099f, 0.528183f, 0.528268f, 0.528352f,
-0.528437f, 0.528521f, 0.528605f, 0.52869f, 0.528774f, 0.528859f, 0.528943f, 0.529027f, 0.529112f, 0.529196f, 0.529281f, 0.529365f, 0.529449f, 0.529534f, 0.529618f, 0.529702f, 0.529787f, 0.529871f, 0.529955f, 0.53004f,
-0.530124f, 0.530208f, 0.530292f, 0.530377f, 0.530461f, 0.530545f, 0.53063f, 0.530714f, 0.530798f, 0.530882f, 0.530967f, 0.531051f, 0.531135f, 0.531219f, 0.531303f, 0.531388f, 0.531472f, 0.531556f, 0.53164f, 0.531724f,
-0.531809f, 0.531893f, 0.531977f, 0.532061f, 0.532145f, 0.532229f, 0.532313f, 0.532398f, 0.532482f, 0.532566f, 0.53265f, 0.532734f, 0.532818f, 0.532902f, 0.532986f, 0.53307f, 0.533154f, 0.533238f, 0.533323f, 0.533407f,
-0.533491f, 0.533575f, 0.533659f, 0.533743f, 0.533827f, 0.533911f, 0.533995f, 0.534079f, 0.534163f, 0.534247f, 0.534331f, 0.534415f, 0.534499f, 0.534583f, 0.534666f, 0.53475f, 0.534834f, 0.534918f, 0.535002f, 0.535086f,
-0.53517f, 0.535254f, 0.535338f, 0.535422f, 0.535506f, 0.535589f, 0.535673f, 0.535757f, 0.535841f, 0.535925f, 0.536009f, 0.536093f, 0.536176f, 0.53626f, 0.536344f, 0.536428f, 0.536512f, 0.536596f, 0.536679f, 0.536763f,
-0.536847f, 0.536931f, 0.537014f, 0.537098f, 0.537182f, 0.537266f, 0.537349f, 0.537433f, 0.537517f, 0.537601f, 0.537684f, 0.537768f, 0.537852f, 0.537935f, 0.538019f, 0.538103f, 0.538186f, 0.53827f, 0.538354f, 0.538437f,
-0.538521f, 0.538605f, 0.538688f, 0.538772f, 0.538856f, 0.538939f, 0.539023f, 0.539106f, 0.53919f, 0.539274f, 0.539357f, 0.539441f, 0.539524f, 0.539608f, 0.539691f, 0.539775f, 0.539858f, 0.539942f, 0.540026f, 0.540109f,
-0.540193f, 0.540276f, 0.54036f, 0.540443f, 0.540527f, 0.54061f, 0.540694f, 0.540777f, 0.54086f, 0.540944f, 0.541027f, 0.541111f, 0.541194f, 0.541278f, 0.541361f, 0.541444f, 0.541528f, 0.541611f, 0.541695f, 0.541778f,
-0.541861f, 0.541945f, 0.542028f, 0.542112f, 0.542195f, 0.542278f, 0.542362f, 0.542445f, 0.542528f, 0.542612f, 0.542695f, 0.542778f, 0.542862f, 0.542945f, 0.543028f, 0.543111f, 0.543195f, 0.543278f, 0.543361f, 0.543444f,
-0.543528f, 0.543611f, 0.543694f, 0.543777f, 0.543861f, 0.543944f, 0.544027f, 0.54411f, 0.544193f, 0.544277f, 0.54436f, 0.544443f, 0.544526f, 0.544609f, 0.544692f, 0.544776f, 0.544859f, 0.544942f, 0.545025f, 0.545108f,
-0.545191f, 0.545274f, 0.545357f, 0.545441f, 0.545524f, 0.545607f, 0.54569f, 0.545773f, 0.545856f, 0.545939f, 0.546022f, 0.546105f, 0.546188f, 0.546271f, 0.546354f, 0.546437f, 0.54652f, 0.546603f, 0.546686f, 0.546769f,
-0.546852f, 0.546935f, 0.547018f, 0.547101f, 0.547184f, 0.547267f, 0.54735f, 0.547433f, 0.547516f, 0.547599f, 0.547682f, 0.547764f, 0.547847f, 0.54793f, 0.548013f, 0.548096f, 0.548179f, 0.548262f, 0.548345f, 0.548427f,
-0.54851f, 0.548593f, 0.548676f, 0.548759f, 0.548842f, 0.548924f, 0.549007f, 0.54909f, 0.549173f, 0.549256f, 0.549338f, 0.549421f, 0.549504f, 0.549587f, 0.549669f, 0.549752f, 0.549835f, 0.549918f, 0.55f, 0.550083f,
-0.550166f, 0.550249f, 0.550331f, 0.550414f, 0.550497f, 0.550579f, 0.550662f, 0.550745f, 0.550827f, 0.55091f, 0.550993f, 0.551075f, 0.551158f, 0.55124f, 0.551323f, 0.551406f, 0.551488f, 0.551571f, 0.551653f, 0.551736f,
-0.551819f, 0.551901f, 0.551984f, 0.552066f, 0.552149f, 0.552231f, 0.552314f, 0.552396f, 0.552479f, 0.552561f, 0.552644f, 0.552726f, 0.552809f, 0.552891f, 0.552974f, 0.553056f, 0.553139f, 0.553221f, 0.553304f, 0.553386f,
-0.553469f, 0.553551f, 0.553634f, 0.553716f, 0.553798f, 0.553881f, 0.553963f, 0.554046f, 0.554128f, 0.55421f, 0.554293f, 0.554375f, 0.554457f, 0.55454f, 0.554622f, 0.554704f, 0.554787f, 0.554869f, 0.554951f, 0.555034f,
-0.555116f, 0.555198f, 0.555281f, 0.555363f, 0.555445f, 0.555527f, 0.55561f, 0.555692f, 0.555774f, 0.555856f, 0.555939f, 0.556021f, 0.556103f, 0.556185f, 0.556268f, 0.55635f, 0.556432f, 0.556514f, 0.556596f, 0.556678f,
-0.556761f, 0.556843f, 0.556925f, 0.557007f, 0.557089f, 0.557171f, 0.557253f, 0.557336f, 0.557418f, 0.5575f, 0.557582f, 0.557664f, 0.557746f, 0.557828f, 0.55791f, 0.557992f, 0.558074f, 0.558156f, 0.558238f, 0.55832f,
-0.558403f, 0.558485f, 0.558567f, 0.558649f, 0.558731f, 0.558813f, 0.558895f, 0.558977f, 0.559059f, 0.55914f, 0.559222f, 0.559304f, 0.559386f, 0.559468f, 0.55955f, 0.559632f, 0.559714f, 0.559796f, 0.559878f, 0.55996f,
-0.560042f, 0.560124f, 0.560205f, 0.560287f, 0.560369f, 0.560451f, 0.560533f, 0.560615f, 0.560697f, 0.560778f, 0.56086f, 0.560942f, 0.561024f, 0.561106f, 0.561187f, 0.561269f, 0.561351f, 0.561433f, 0.561515f, 0.561596f,
-0.561678f, 0.56176f, 0.561842f, 0.561923f, 0.562005f, 0.562087f, 0.562168f, 0.56225f, 0.562332f, 0.562414f, 0.562495f, 0.562577f, 0.562659f, 0.56274f, 0.562822f, 0.562904f, 0.562985f, 0.563067f, 0.563148f, 0.56323f,
-0.563312f, 0.563393f, 0.563475f, 0.563556f, 0.563638f, 0.56372f, 0.563801f, 0.563883f, 0.563964f, 0.564046f, 0.564127f, 0.564209f, 0.56429f, 0.564372f, 0.564454f, 0.564535f, 0.564617f, 0.564698f, 0.56478f, 0.564861f,
-0.564942f, 0.565024f, 0.565105f, 0.565187f, 0.565268f, 0.56535f, 0.565431f, 0.565513f, 0.565594f, 0.565675f, 0.565757f, 0.565838f, 0.56592f, 0.566001f, 0.566082f, 0.566164f, 0.566245f, 0.566327f, 0.566408f, 0.566489f,
-0.566571f, 0.566652f, 0.566733f, 0.566815f, 0.566896f, 0.566977f, 0.567058f, 0.56714f, 0.567221f, 0.567302f, 0.567384f, 0.567465f, 0.567546f, 0.567627f, 0.567709f, 0.56779f, 0.567871f, 0.567952f, 0.568033f, 0.568115f,
-0.568196f, 0.568277f, 0.568358f, 0.568439f, 0.568521f, 0.568602f, 0.568683f, 0.568764f, 0.568845f, 0.568926f, 0.569007f, 0.569089f, 0.56917f, 0.569251f, 0.569332f, 0.569413f, 0.569494f, 0.569575f, 0.569656f, 0.569737f,
-0.569818f, 0.569899f, 0.56998f, 0.570061f, 0.570142f, 0.570223f, 0.570304f, 0.570386f, 0.570467f, 0.570547f, 0.570628f, 0.570709f, 0.57079f, 0.570871f, 0.570952f, 0.571033f, 0.571114f, 0.571195f, 0.571276f, 0.571357f,
-0.571438f, 0.571519f, 0.5716f, 0.571681f, 0.571762f, 0.571842f, 0.571923f, 0.572004f, 0.572085f, 0.572166f, 0.572247f, 0.572328f, 0.572408f, 0.572489f, 0.57257f, 0.572651f, 0.572732f, 0.572812f, 0.572893f, 0.572974f,
-0.573055f, 0.573136f, 0.573216f, 0.573297f, 0.573378f, 0.573459f, 0.573539f, 0.57362f, 0.573701f, 0.573781f, 0.573862f, 0.573943f, 0.574024f, 0.574104f, 0.574185f, 0.574266f, 0.574346f, 0.574427f, 0.574508f, 0.574588f,
-0.574669f, 0.574749f, 0.57483f, 0.574911f, 0.574991f, 0.575072f, 0.575152f, 0.575233f, 0.575314f, 0.575394f, 0.575475f, 0.575555f, 0.575636f, 0.575716f, 0.575797f, 0.575878f, 0.575958f, 0.576039f, 0.576119f, 0.5762f,
-0.57628f, 0.576361f, 0.576441f, 0.576521f, 0.576602f, 0.576682f, 0.576763f, 0.576843f, 0.576924f, 0.577004f, 0.577085f, 0.577165f, 0.577245f, 0.577326f, 0.577406f, 0.577487f, 0.577567f, 0.577647f, 0.577728f, 0.577808f,
-0.577888f, 0.577969f, 0.578049f, 0.578129f, 0.57821f, 0.57829f, 0.57837f, 0.578451f, 0.578531f, 0.578611f, 0.578691f, 0.578772f, 0.578852f, 0.578932f, 0.579013f, 0.579093f, 0.579173f, 0.579253f, 0.579333f, 0.579414f,
-0.579494f, 0.579574f, 0.579654f, 0.579734f, 0.579815f, 0.579895f, 0.579975f, 0.580055f, 0.580135f, 0.580215f, 0.580296f, 0.580376f, 0.580456f, 0.580536f, 0.580616f, 0.580696f, 0.580776f, 0.580856f, 0.580936f, 0.581016f,
-0.581097f, 0.581177f, 0.581257f, 0.581337f, 0.581417f, 0.581497f, 0.581577f, 0.581657f, 0.581737f, 0.581817f, 0.581897f, 0.581977f, 0.582057f, 0.582137f, 0.582217f, 0.582297f, 0.582377f, 0.582457f, 0.582536f, 0.582616f,
-0.582696f, 0.582776f, 0.582856f, 0.582936f, 0.583016f, 0.583096f, 0.583176f, 0.583256f, 0.583335f, 0.583415f, 0.583495f, 0.583575f, 0.583655f, 0.583735f, 0.583814f, 0.583894f, 0.583974f, 0.584054f, 0.584134f, 0.584213f,
-0.584293f, 0.584373f, 0.584453f, 0.584533f, 0.584612f, 0.584692f, 0.584772f, 0.584851f, 0.584931f, 0.585011f, 0.585091f, 0.58517f, 0.58525f, 0.58533f, 0.585409f, 0.585489f, 0.585569f, 0.585648f, 0.585728f, 0.585808f,
-0.585887f, 0.585967f, 0.586046f, 0.586126f, 0.586206f, 0.586285f, 0.586365f, 0.586444f, 0.586524f, 0.586604f, 0.586683f, 0.586763f, 0.586842f, 0.586922f, 0.587001f, 0.587081f, 0.58716f, 0.58724f, 0.587319f, 0.587399f,
-0.587478f, 0.587558f, 0.587637f, 0.587717f, 0.587796f, 0.587876f, 0.587955f, 0.588035f, 0.588114f, 0.588193f, 0.588273f, 0.588352f, 0.588432f, 0.588511f, 0.58859f, 0.58867f, 0.588749f, 0.588829f, 0.588908f, 0.588987f,
-0.589067f, 0.589146f, 0.589225f, 0.589305f, 0.589384f, 0.589463f, 0.589543f, 0.589622f, 0.589701f, 0.58978f, 0.58986f, 0.589939f, 0.590018f, 0.590097f, 0.590177f, 0.590256f, 0.590335f, 0.590414f, 0.590494f, 0.590573f,
-0.590652f, 0.590731f, 0.59081f, 0.590889f, 0.590969f, 0.591048f, 0.591127f, 0.591206f, 0.591285f, 0.591364f, 0.591443f, 0.591523f, 0.591602f, 0.591681f, 0.59176f, 0.591839f, 0.591918f, 0.591997f, 0.592076f, 0.592155f,
-0.592234f, 0.592313f, 0.592392f, 0.592471f, 0.59255f, 0.592629f, 0.592708f, 0.592787f, 0.592866f, 0.592945f, 0.593024f, 0.593103f, 0.593182f, 0.593261f, 0.59334f, 0.593419f, 0.593498f, 0.593577f, 0.593656f, 0.593735f,
-0.593814f, 0.593893f, 0.593972f, 0.59405f, 0.594129f, 0.594208f, 0.594287f, 0.594366f, 0.594445f, 0.594524f, 0.594602f, 0.594681f, 0.59476f, 0.594839f, 0.594918f, 0.594997f, 0.595075f, 0.595154f, 0.595233f, 0.595312f,
-0.59539f, 0.595469f, 0.595548f, 0.595627f, 0.595705f, 0.595784f, 0.595863f, 0.595941f, 0.59602f, 0.596099f, 0.596178f, 0.596256f, 0.596335f, 0.596414f, 0.596492f, 0.596571f, 0.596649f, 0.596728f, 0.596807f, 0.596885f,
-0.596964f, 0.597043f, 0.597121f, 0.5972f, 0.597278f, 0.597357f, 0.597435f, 0.597514f, 0.597593f, 0.597671f, 0.59775f, 0.597828f, 0.597907f, 0.597985f, 0.598064f, 0.598142f, 0.598221f, 0.598299f, 0.598378f, 0.598456f,
-0.598535f, 0.598613f, 0.598692f, 0.59877f, 0.598848f, 0.598927f, 0.599005f, 0.599084f, 0.599162f, 0.59924f, 0.599319f, 0.599397f, 0.599476f, 0.599554f, 0.599632f, 0.599711f, 0.599789f, 0.599867f, 0.599946f, 0.600024f,
-0.600102f, 0.600181f, 0.600259f, 0.600337f, 0.600416f, 0.600494f, 0.600572f, 0.60065f, 0.600729f, 0.600807f, 0.600885f, 0.600963f, 0.601042f, 0.60112f, 0.601198f, 0.601276f, 0.601354f, 0.601433f, 0.601511f, 0.601589f,
-0.601667f, 0.601745f, 0.601823f, 0.601902f, 0.60198f, 0.602058f, 0.602136f, 0.602214f, 0.602292f, 0.60237f, 0.602448f, 0.602526f, 0.602605f, 0.602683f, 0.602761f, 0.602839f, 0.602917f, 0.602995f, 0.603073f, 0.603151f,
-0.603229f, 0.603307f, 0.603385f, 0.603463f, 0.603541f, 0.603619f, 0.603697f, 0.603775f, 0.603853f, 0.603931f, 0.604009f, 0.604087f, 0.604164f, 0.604242f, 0.60432f, 0.604398f, 0.604476f, 0.604554f, 0.604632f, 0.60471f,
-0.604788f, 0.604866f, 0.604943f, 0.605021f, 0.605099f, 0.605177f, 0.605255f, 0.605333f, 0.60541f, 0.605488f, 0.605566f, 0.605644f, 0.605721f, 0.605799f, 0.605877f, 0.605955f, 0.606033f, 0.60611f, 0.606188f, 0.606266f,
-0.606343f, 0.606421f, 0.606499f, 0.606577f, 0.606654f, 0.606732f, 0.60681f, 0.606887f, 0.606965f, 0.607043f, 0.60712f, 0.607198f, 0.607275f, 0.607353f, 0.607431f, 0.607508f, 0.607586f, 0.607664f, 0.607741f, 0.607819f,
-0.607896f, 0.607974f, 0.608051f, 0.608129f, 0.608206f, 0.608284f, 0.608361f, 0.608439f, 0.608517f, 0.608594f, 0.608672f, 0.608749f, 0.608826f, 0.608904f, 0.608981f, 0.609059f, 0.609136f, 0.609214f, 0.609291f, 0.609369f,
-0.609446f, 0.609523f, 0.609601f, 0.609678f, 0.609756f, 0.609833f, 0.60991f, 0.609988f, 0.610065f, 0.610142f, 0.61022f, 0.610297f, 0.610374f, 0.610452f, 0.610529f, 0.610606f, 0.610684f, 0.610761f, 0.610838f, 0.610916f,
-0.610993f, 0.61107f, 0.611147f, 0.611225f, 0.611302f, 0.611379f, 0.611456f, 0.611533f, 0.611611f, 0.611688f, 0.611765f, 0.611842f, 0.611919f, 0.611997f, 0.612074f, 0.612151f, 0.612228f, 0.612305f, 0.612382f, 0.612459f,
-0.612537f, 0.612614f, 0.612691f, 0.612768f, 0.612845f, 0.612922f, 0.612999f, 0.613076f, 0.613153f, 0.61323f, 0.613307f, 0.613384f, 0.613461f, 0.613538f, 0.613615f, 0.613692f, 0.613769f, 0.613846f, 0.613923f, 0.614f,
-0.614077f, 0.614154f, 0.614231f, 0.614308f, 0.614385f, 0.614462f, 0.614539f, 0.614616f, 0.614693f, 0.61477f, 0.614847f, 0.614923f, 0.615f, 0.615077f, 0.615154f, 0.615231f, 0.615308f, 0.615385f, 0.615461f, 0.615538f,
-0.615615f, 0.615692f, 0.615769f, 0.615845f, 0.615922f, 0.615999f, 0.616076f, 0.616152f, 0.616229f, 0.616306f, 0.616383f, 0.616459f, 0.616536f, 0.616613f, 0.61669f, 0.616766f, 0.616843f, 0.61692f, 0.616996f, 0.617073f,
-0.61715f, 0.617226f, 0.617303f, 0.61738f, 0.617456f, 0.617533f, 0.617609f, 0.617686f, 0.617763f, 0.617839f, 0.617916f, 0.617992f, 0.618069f, 0.618145f, 0.618222f, 0.618299f, 0.618375f, 0.618452f, 0.618528f, 0.618605f,
-0.618681f, 0.618758f, 0.618834f, 0.618911f, 0.618987f, 0.619064f, 0.61914f, 0.619217f, 0.619293f, 0.619369f, 0.619446f, 0.619522f, 0.619599f, 0.619675f, 0.619751f, 0.619828f, 0.619904f, 0.619981f, 0.620057f, 0.620133f,
-0.62021f, 0.620286f, 0.620362f, 0.620439f, 0.620515f, 0.620591f, 0.620668f, 0.620744f, 0.62082f, 0.620897f, 0.620973f, 0.621049f, 0.621125f, 0.621202f, 0.621278f, 0.621354f, 0.62143f, 0.621507f, 0.621583f, 0.621659f,
-0.621735f, 0.621811f, 0.621888f, 0.621964f, 0.62204f, 0.622116f, 0.622192f, 0.622268f, 0.622344f, 0.622421f, 0.622497f, 0.622573f, 0.622649f, 0.622725f, 0.622801f, 0.622877f, 0.622953f, 0.623029f, 0.623105f, 0.623181f,
-0.623258f, 0.623334f, 0.62341f, 0.623486f, 0.623562f, 0.623638f, 0.623714f, 0.62379f, 0.623866f, 0.623942f, 0.624018f, 0.624094f, 0.624169f, 0.624245f, 0.624321f, 0.624397f, 0.624473f, 0.624549f, 0.624625f, 0.624701f,
-0.624777f, 0.624853f, 0.624929f, 0.625004f, 0.62508f, 0.625156f, 0.625232f, 0.625308f, 0.625384f, 0.62546f, 0.625535f, 0.625611f, 0.625687f, 0.625763f, 0.625838f, 0.625914f, 0.62599f, 0.626066f, 0.626142f, 0.626217f,
-0.626293f, 0.626369f, 0.626444f, 0.62652f, 0.626596f, 0.626672f, 0.626747f, 0.626823f, 0.626899f, 0.626974f, 0.62705f, 0.627126f, 0.627201f, 0.627277f, 0.627353f, 0.627428f, 0.627504f, 0.627579f, 0.627655f, 0.627731f,
-0.627806f, 0.627882f, 0.627957f, 0.628033f, 0.628108f, 0.628184f, 0.628259f, 0.628335f, 0.62841f, 0.628486f, 0.628561f, 0.628637f, 0.628712f, 0.628788f, 0.628863f, 0.628939f, 0.629014f, 0.62909f, 0.629165f, 0.629241f,
-0.629316f, 0.629392f, 0.629467f, 0.629542f, 0.629618f, 0.629693f, 0.629768f, 0.629844f, 0.629919f, 0.629995f, 0.63007f, 0.630145f, 0.630221f, 0.630296f, 0.630371f, 0.630447f, 0.630522f, 0.630597f, 0.630672f, 0.630748f,
-0.630823f, 0.630898f, 0.630973f, 0.631049f, 0.631124f, 0.631199f, 0.631274f, 0.63135f, 0.631425f, 0.6315f, 0.631575f, 0.63165f, 0.631726f, 0.631801f, 0.631876f, 0.631951f, 0.632026f, 0.632101f, 0.632176f, 0.632252f,
-0.632327f, 0.632402f, 0.632477f, 0.632552f, 0.632627f, 0.632702f, 0.632777f, 0.632852f, 0.632927f, 0.633002f, 0.633077f, 0.633152f, 0.633227f, 0.633302f, 0.633377f, 0.633452f, 0.633527f, 0.633602f, 0.633677f, 0.633752f,
-0.633827f, 0.633902f, 0.633977f, 0.634052f, 0.634127f, 0.634202f, 0.634277f, 0.634352f, 0.634427f, 0.634502f, 0.634576f, 0.634651f, 0.634726f, 0.634801f, 0.634876f, 0.634951f, 0.635026f, 0.6351f, 0.635175f, 0.63525f,
-0.635325f, 0.6354f, 0.635474f, 0.635549f, 0.635624f, 0.635699f, 0.635773f, 0.635848f, 0.635923f, 0.635998f, 0.636072f, 0.636147f, 0.636222f, 0.636296f, 0.636371f, 0.636446f, 0.63652f, 0.636595f, 0.63667f, 0.636744f,
-0.636819f, 0.636894f, 0.636968f, 0.637043f, 0.637118f, 0.637192f, 0.637267f, 0.637341f, 0.637416f, 0.63749f, 0.637565f, 0.63764f, 0.637714f, 0.637789f, 0.637863f, 0.637938f, 0.638012f, 0.638087f, 0.638161f, 0.638236f,
-0.63831f, 0.638385f, 0.638459f, 0.638534f, 0.638608f, 0.638683f, 0.638757f, 0.638831f, 0.638906f, 0.63898f, 0.639055f, 0.639129f, 0.639203f, 0.639278f, 0.639352f, 0.639427f, 0.639501f, 0.639575f, 0.63965f, 0.639724f,
-0.639798f, 0.639873f, 0.639947f, 0.640021f, 0.640095f, 0.64017f, 0.640244f, 0.640318f, 0.640393f, 0.640467f, 0.640541f, 0.640615f, 0.64069f, 0.640764f, 0.640838f, 0.640912f, 0.640986f, 0.641061f, 0.641135f, 0.641209f,
-0.641283f, 0.641357f, 0.641431f, 0.641506f, 0.64158f, 0.641654f, 0.641728f, 0.641802f, 0.641876f, 0.64195f, 0.642024f, 0.642098f, 0.642172f, 0.642246f, 0.642321f, 0.642395f, 0.642469f, 0.642543f, 0.642617f, 0.642691f,
-0.642765f, 0.642839f, 0.642913f, 0.642987f, 0.643061f, 0.643135f, 0.643209f, 0.643283f, 0.643356f, 0.64343f, 0.643504f, 0.643578f, 0.643652f, 0.643726f, 0.6438f, 0.643874f, 0.643948f, 0.644022f, 0.644095f, 0.644169f,
-0.644243f, 0.644317f, 0.644391f, 0.644465f, 0.644538f, 0.644612f, 0.644686f, 0.64476f, 0.644834f, 0.644907f, 0.644981f, 0.645055f, 0.645129f, 0.645202f, 0.645276f, 0.64535f, 0.645424f, 0.645497f, 0.645571f, 0.645645f,
-0.645718f, 0.645792f, 0.645866f, 0.645939f, 0.646013f, 0.646087f, 0.64616f, 0.646234f, 0.646308f, 0.646381f, 0.646455f, 0.646528f, 0.646602f, 0.646676f, 0.646749f, 0.646823f, 0.646896f, 0.64697f, 0.647043f, 0.647117f,
-0.64719f, 0.647264f, 0.647337f, 0.647411f, 0.647484f, 0.647558f, 0.647631f, 0.647705f, 0.647778f, 0.647852f, 0.647925f, 0.647999f, 0.648072f, 0.648146f, 0.648219f, 0.648292f, 0.648366f, 0.648439f, 0.648513f, 0.648586f,
-0.648659f, 0.648733f, 0.648806f, 0.648879f, 0.648953f, 0.649026f, 0.649099f, 0.649173f, 0.649246f, 0.649319f, 0.649393f, 0.649466f, 0.649539f, 0.649612f, 0.649686f, 0.649759f, 0.649832f, 0.649905f, 0.649978f, 0.650052f,
-0.650125f, 0.650198f, 0.650271f, 0.650344f, 0.650418f, 0.650491f, 0.650564f, 0.650637f, 0.65071f, 0.650783f, 0.650857f, 0.65093f, 0.651003f, 0.651076f, 0.651149f, 0.651222f, 0.651295f, 0.651368f, 0.651441f, 0.651514f,
-0.651587f, 0.65166f, 0.651733f, 0.651806f, 0.651879f, 0.651952f, 0.652025f, 0.652098f, 0.652171f, 0.652244f, 0.652317f, 0.65239f, 0.652463f, 0.652536f, 0.652609f, 0.652682f, 0.652755f, 0.652828f, 0.652901f, 0.652974f,
-0.653046f, 0.653119f, 0.653192f, 0.653265f, 0.653338f, 0.653411f, 0.653484f, 0.653556f, 0.653629f, 0.653702f, 0.653775f, 0.653848f, 0.65392f, 0.653993f, 0.654066f, 0.654139f, 0.654211f, 0.654284f, 0.654357f, 0.65443f,
-0.654502f, 0.654575f, 0.654648f, 0.65472f, 0.654793f, 0.654866f, 0.654939f, 0.655011f, 0.655084f, 0.655156f, 0.655229f, 0.655302f, 0.655374f, 0.655447f, 0.65552f, 0.655592f, 0.655665f, 0.655737f, 0.65581f, 0.655882f,
-0.655955f, 0.656028f, 0.6561f, 0.656173f, 0.656245f, 0.656318f, 0.65639f, 0.656463f, 0.656535f, 0.656608f, 0.65668f, 0.656753f, 0.656825f, 0.656898f, 0.65697f, 0.657042f, 0.657115f, 0.657187f, 0.65726f, 0.657332f,
-0.657404f, 0.657477f, 0.657549f, 0.657622f, 0.657694f, 0.657766f, 0.657839f, 0.657911f, 0.657983f, 0.658056f, 0.658128f, 0.6582f, 0.658273f, 0.658345f, 0.658417f, 0.658489f, 0.658562f, 0.658634f, 0.658706f, 0.658778f,
-0.658851f, 0.658923f, 0.658995f, 0.659067f, 0.659139f, 0.659212f, 0.659284f, 0.659356f, 0.659428f, 0.6595f, 0.659572f, 0.659645f, 0.659717f, 0.659789f, 0.659861f, 0.659933f, 0.660005f, 0.660077f, 0.660149f, 0.660221f,
-0.660293f, 0.660366f, 0.660438f, 0.66051f, 0.660582f, 0.660654f, 0.660726f, 0.660798f, 0.66087f, 0.660942f, 0.661014f, 0.661086f, 0.661158f, 0.66123f, 0.661302f, 0.661373f, 0.661445f, 0.661517f, 0.661589f, 0.661661f,
-0.661733f, 0.661805f, 0.661877f, 0.661949f, 0.662021f, 0.662092f, 0.662164f, 0.662236f, 0.662308f, 0.66238f, 0.662452f, 0.662523f, 0.662595f, 0.662667f, 0.662739f, 0.662811f, 0.662882f, 0.662954f, 0.663026f, 0.663098f,
-0.663169f, 0.663241f, 0.663313f, 0.663385f, 0.663456f, 0.663528f, 0.6636f, 0.663671f, 0.663743f, 0.663815f, 0.663886f, 0.663958f, 0.66403f, 0.664101f, 0.664173f, 0.664244f, 0.664316f, 0.664388f, 0.664459f, 0.664531f,
-0.664602f, 0.664674f, 0.664746f, 0.664817f, 0.664889f, 0.66496f, 0.665032f, 0.665103f, 0.665175f, 0.665246f, 0.665318f, 0.665389f, 0.665461f, 0.665532f, 0.665604f, 0.665675f, 0.665746f, 0.665818f, 0.665889f, 0.665961f,
-0.666032f, 0.666104f, 0.666175f, 0.666246f, 0.666318f, 0.666389f, 0.66646f, 0.666532f, 0.666603f, 0.666674f, 0.666746f, 0.666817f, 0.666888f, 0.66696f, 0.667031f, 0.667102f, 0.667173f, 0.667245f, 0.667316f, 0.667387f,
-0.667459f, 0.66753f, 0.667601f, 0.667672f, 0.667743f, 0.667815f, 0.667886f, 0.667957f, 0.668028f, 0.668099f, 0.66817f, 0.668242f, 0.668313f, 0.668384f, 0.668455f, 0.668526f, 0.668597f, 0.668668f, 0.668739f, 0.668811f,
-0.668882f, 0.668953f, 0.669024f, 0.669095f, 0.669166f, 0.669237f, 0.669308f, 0.669379f, 0.66945f, 0.669521f, 0.669592f, 0.669663f, 0.669734f, 0.669805f, 0.669876f, 0.669947f, 0.670018f, 0.670089f, 0.67016f, 0.67023f,
-0.670301f, 0.670372f, 0.670443f, 0.670514f, 0.670585f, 0.670656f, 0.670727f, 0.670797f, 0.670868f, 0.670939f, 0.67101f, 0.671081f, 0.671152f, 0.671222f, 0.671293f, 0.671364f, 0.671435f, 0.671506f, 0.671576f, 0.671647f,
-0.671718f, 0.671789f, 0.671859f, 0.67193f, 0.672001f, 0.672071f, 0.672142f, 0.672213f, 0.672283f, 0.672354f, 0.672425f, 0.672495f, 0.672566f, 0.672637f, 0.672707f, 0.672778f, 0.672849f, 0.672919f, 0.67299f, 0.67306f,
-0.673131f, 0.673201f, 0.673272f, 0.673343f, 0.673413f, 0.673484f, 0.673554f, 0.673625f, 0.673695f, 0.673766f, 0.673836f, 0.673907f, 0.673977f, 0.674048f, 0.674118f, 0.674188f, 0.674259f, 0.674329f, 0.6744f, 0.67447f,
-0.674541f, 0.674611f, 0.674681f, 0.674752f, 0.674822f, 0.674893f, 0.674963f, 0.675033f, 0.675104f, 0.675174f, 0.675244f, 0.675315f, 0.675385f, 0.675455f, 0.675525f, 0.675596f, 0.675666f, 0.675736f, 0.675807f, 0.675877f,
-0.675947f, 0.676017f, 0.676087f, 0.676158f, 0.676228f, 0.676298f, 0.676368f, 0.676438f, 0.676509f, 0.676579f, 0.676649f, 0.676719f, 0.676789f, 0.676859f, 0.676929f, 0.677f, 0.67707f, 0.67714f, 0.67721f, 0.67728f,
-0.67735f, 0.67742f, 0.67749f, 0.67756f, 0.67763f, 0.6777f, 0.67777f, 0.67784f, 0.67791f, 0.67798f, 0.67805f, 0.67812f, 0.67819f, 0.67826f, 0.67833f, 0.6784f, 0.67847f, 0.67854f, 0.67861f, 0.67868f,
-0.67875f, 0.67882f, 0.678889f, 0.678959f, 0.679029f, 0.679099f, 0.679169f, 0.679239f, 0.679309f, 0.679378f, 0.679448f, 0.679518f, 0.679588f, 0.679658f, 0.679727f, 0.679797f, 0.679867f, 0.679937f, 0.680006f, 0.680076f,
-0.680146f, 0.680216f, 0.680285f, 0.680355f, 0.680425f, 0.680495f, 0.680564f, 0.680634f, 0.680704f, 0.680773f, 0.680843f, 0.680912f, 0.680982f, 0.681052f, 0.681121f, 0.681191f, 0.681261f, 0.68133f, 0.6814f, 0.681469f,
-0.681539f, 0.681608f, 0.681678f, 0.681748f, 0.681817f, 0.681887f, 0.681956f, 0.682026f, 0.682095f, 0.682165f, 0.682234f, 0.682304f, 0.682373f, 0.682442f, 0.682512f, 0.682581f, 0.682651f, 0.68272f, 0.68279f, 0.682859f,
-0.682928f, 0.682998f, 0.683067f, 0.683137f, 0.683206f, 0.683275f, 0.683345f, 0.683414f, 0.683483f, 0.683553f, 0.683622f, 0.683691f, 0.68376f, 0.68383f, 0.683899f, 0.683968f, 0.684038f, 0.684107f, 0.684176f, 0.684245f,
-0.684314f, 0.684384f, 0.684453f, 0.684522f, 0.684591f, 0.68466f, 0.68473f, 0.684799f, 0.684868f, 0.684937f, 0.685006f, 0.685075f, 0.685145f, 0.685214f, 0.685283f, 0.685352f, 0.685421f, 0.68549f, 0.685559f, 0.685628f,
-0.685697f, 0.685766f, 0.685835f, 0.685904f, 0.685973f, 0.686042f, 0.686111f, 0.68618f, 0.686249f, 0.686318f, 0.686387f, 0.686456f, 0.686525f, 0.686594f, 0.686663f, 0.686732f, 0.686801f, 0.68687f, 0.686939f, 0.687008f,
-0.687076f, 0.687145f, 0.687214f, 0.687283f, 0.687352f, 0.687421f, 0.68749f, 0.687558f, 0.687627f, 0.687696f, 0.687765f, 0.687834f, 0.687902f, 0.687971f, 0.68804f, 0.688109f, 0.688177f, 0.688246f, 0.688315f, 0.688384f,
-0.688452f, 0.688521f, 0.68859f, 0.688658f, 0.688727f, 0.688796f, 0.688864f, 0.688933f, 0.689002f, 0.68907f, 0.689139f, 0.689208f, 0.689276f, 0.689345f, 0.689413f, 0.689482f, 0.689551f, 0.689619f, 0.689688f, 0.689756f,
-0.689825f, 0.689893f, 0.689962f, 0.69003f, 0.690099f, 0.690167f, 0.690236f, 0.690304f, 0.690373f, 0.690441f, 0.69051f, 0.690578f, 0.690647f, 0.690715f, 0.690783f, 0.690852f, 0.69092f, 0.690989f, 0.691057f, 0.691125f,
-0.691194f, 0.691262f, 0.691331f, 0.691399f, 0.691467f, 0.691536f, 0.691604f, 0.691672f, 0.69174f, 0.691809f, 0.691877f, 0.691945f, 0.692014f, 0.692082f, 0.69215f, 0.692218f, 0.692287f, 0.692355f, 0.692423f, 0.692491f,
-0.692559f, 0.692628f, 0.692696f, 0.692764f, 0.692832f, 0.6929f, 0.692968f, 0.693037f, 0.693105f, 0.693173f, 0.693241f, 0.693309f, 0.693377f, 0.693445f, 0.693513f, 0.693581f, 0.693649f, 0.693717f, 0.693785f, 0.693853f,
-0.693922f, 0.69399f, 0.694058f, 0.694126f, 0.694194f, 0.694261f, 0.694329f, 0.694397f, 0.694465f, 0.694533f, 0.694601f, 0.694669f, 0.694737f, 0.694805f, 0.694873f, 0.694941f, 0.695009f, 0.695077f, 0.695144f, 0.695212f,
-0.69528f, 0.695348f, 0.695416f, 0.695484f, 0.695551f, 0.695619f, 0.695687f, 0.695755f, 0.695823f, 0.69589f, 0.695958f, 0.696026f, 0.696094f, 0.696161f, 0.696229f, 0.696297f, 0.696365f, 0.696432f, 0.6965f, 0.696568f,
-0.696635f, 0.696703f, 0.696771f, 0.696838f, 0.696906f, 0.696974f, 0.697041f, 0.697109f, 0.697176f, 0.697244f, 0.697312f, 0.697379f, 0.697447f, 0.697514f, 0.697582f, 0.69765f, 0.697717f, 0.697785f, 0.697852f, 0.69792f,
-0.697987f, 0.698055f, 0.698122f, 0.69819f, 0.698257f, 0.698325f, 0.698392f, 0.698459f, 0.698527f, 0.698594f, 0.698662f, 0.698729f, 0.698796f, 0.698864f, 0.698931f, 0.698999f, 0.699066f, 0.699133f, 0.699201f, 0.699268f,
-0.699335f, 0.699403f, 0.69947f, 0.699537f, 0.699605f, 0.699672f, 0.699739f, 0.699806f, 0.699874f, 0.699941f, 0.700008f, 0.700075f, 0.700143f, 0.70021f, 0.700277f, 0.700344f, 0.700411f, 0.700479f, 0.700546f, 0.700613f,
-0.70068f, 0.700747f, 0.700814f, 0.700882f, 0.700949f, 0.701016f, 0.701083f, 0.70115f, 0.701217f, 0.701284f, 0.701351f, 0.701418f, 0.701485f, 0.701552f, 0.701619f, 0.701686f, 0.701753f, 0.70182f, 0.701887f, 0.701954f,
-0.702021f, 0.702088f, 0.702155f, 0.702222f, 0.702289f, 0.702356f, 0.702423f, 0.70249f, 0.702557f, 0.702624f, 0.702691f, 0.702758f, 0.702825f, 0.702891f, 0.702958f, 0.703025f, 0.703092f, 0.703159f, 0.703226f, 0.703292f,
-0.703359f, 0.703426f, 0.703493f, 0.70356f, 0.703626f, 0.703693f, 0.70376f, 0.703827f, 0.703893f, 0.70396f, 0.704027f, 0.704094f, 0.70416f, 0.704227f, 0.704294f, 0.70436f, 0.704427f, 0.704494f, 0.70456f, 0.704627f,
-0.704694f, 0.70476f, 0.704827f, 0.704893f, 0.70496f, 0.705027f, 0.705093f, 0.70516f, 0.705226f, 0.705293f, 0.705359f, 0.705426f, 0.705492f, 0.705559f, 0.705625f, 0.705692f, 0.705758f, 0.705825f, 0.705891f, 0.705958f,
-0.706024f, 0.706091f, 0.706157f, 0.706224f, 0.70629f, 0.706356f, 0.706423f, 0.706489f, 0.706556f, 0.706622f, 0.706688f, 0.706755f, 0.706821f, 0.706887f, 0.706954f, 0.70702f, 0.707086f, 0.707153f, 0.707219f, 0.707285f,
-0.707352f, 0.707418f, 0.707484f, 0.70755f, 0.707617f, 0.707683f, 0.707749f, 0.707815f, 0.707881f, 0.707948f, 0.708014f, 0.70808f, 0.708146f, 0.708212f, 0.708279f, 0.708345f, 0.708411f, 0.708477f, 0.708543f, 0.708609f,
-0.708675f, 0.708741f, 0.708807f, 0.708874f, 0.70894f, 0.709006f, 0.709072f, 0.709138f, 0.709204f, 0.70927f, 0.709336f, 0.709402f, 0.709468f, 0.709534f, 0.7096f, 0.709666f, 0.709732f, 0.709798f, 0.709864f, 0.70993f,
-0.709995f, 0.710061f, 0.710127f, 0.710193f, 0.710259f, 0.710325f, 0.710391f, 0.710457f, 0.710523f, 0.710588f, 0.710654f, 0.71072f, 0.710786f, 0.710852f, 0.710917f, 0.710983f, 0.711049f, 0.711115f, 0.711181f, 0.711246f,
-0.711312f, 0.711378f, 0.711444f, 0.711509f, 0.711575f, 0.711641f, 0.711706f, 0.711772f, 0.711838f, 0.711903f, 0.711969f, 0.712035f, 0.7121f, 0.712166f, 0.712232f, 0.712297f, 0.712363f, 0.712428f, 0.712494f, 0.71256f,
-0.712625f, 0.712691f, 0.712756f, 0.712822f, 0.712887f, 0.712953f, 0.713018f, 0.713084f, 0.713149f, 0.713215f, 0.71328f, 0.713346f, 0.713411f, 0.713477f, 0.713542f, 0.713608f, 0.713673f, 0.713739f, 0.713804f, 0.713869f,
-0.713935f, 0.714f, 0.714066f, 0.714131f, 0.714196f, 0.714262f, 0.714327f, 0.714392f, 0.714458f, 0.714523f, 0.714588f, 0.714654f, 0.714719f, 0.714784f, 0.714849f, 0.714915f, 0.71498f, 0.715045f, 0.71511f, 0.715176f,
-0.715241f, 0.715306f, 0.715371f, 0.715436f, 0.715502f, 0.715567f, 0.715632f, 0.715697f, 0.715762f, 0.715827f, 0.715892f, 0.715958f, 0.716023f, 0.716088f, 0.716153f, 0.716218f, 0.716283f, 0.716348f, 0.716413f, 0.716478f,
-0.716543f, 0.716608f, 0.716673f, 0.716738f, 0.716803f, 0.716868f, 0.716933f, 0.716998f, 0.717063f, 0.717128f, 0.717193f, 0.717258f, 0.717323f, 0.717388f, 0.717453f, 0.717518f, 0.717583f, 0.717647f, 0.717712f, 0.717777f,
-0.717842f, 0.717907f, 0.717972f, 0.718037f, 0.718101f, 0.718166f, 0.718231f, 0.718296f, 0.718361f, 0.718425f, 0.71849f, 0.718555f, 0.71862f, 0.718684f, 0.718749f, 0.718814f, 0.718879f, 0.718943f, 0.719008f, 0.719073f,
-0.719137f, 0.719202f, 0.719267f, 0.719331f, 0.719396f, 0.719461f, 0.719525f, 0.71959f, 0.719654f, 0.719719f, 0.719784f, 0.719848f, 0.719913f, 0.719977f, 0.720042f, 0.720106f, 0.720171f, 0.720236f, 0.7203f, 0.720365f,
-0.720429f, 0.720494f, 0.720558f, 0.720622f, 0.720687f, 0.720751f, 0.720816f, 0.72088f, 0.720945f, 0.721009f, 0.721074f, 0.721138f, 0.721202f, 0.721267f, 0.721331f, 0.721395f, 0.72146f, 0.721524f, 0.721588f, 0.721653f,
-0.721717f, 0.721781f, 0.721846f, 0.72191f, 0.721974f, 0.722039f, 0.722103f, 0.722167f, 0.722231f, 0.722296f, 0.72236f, 0.722424f, 0.722488f, 0.722552f, 0.722617f, 0.722681f, 0.722745f, 0.722809f, 0.722873f, 0.722937f,
-0.723002f, 0.723066f, 0.72313f, 0.723194f, 0.723258f, 0.723322f, 0.723386f, 0.72345f, 0.723514f, 0.723578f, 0.723643f, 0.723707f, 0.723771f, 0.723835f, 0.723899f, 0.723963f, 0.724027f, 0.724091f, 0.724155f, 0.724219f,
-0.724283f, 0.724346f, 0.72441f, 0.724474f, 0.724538f, 0.724602f, 0.724666f, 0.72473f, 0.724794f, 0.724858f, 0.724922f, 0.724985f, 0.725049f, 0.725113f, 0.725177f, 0.725241f, 0.725305f, 0.725368f, 0.725432f, 0.725496f,
-0.72556f, 0.725624f, 0.725687f, 0.725751f, 0.725815f, 0.725879f, 0.725942f, 0.726006f, 0.72607f, 0.726133f, 0.726197f, 0.726261f, 0.726324f, 0.726388f, 0.726452f, 0.726515f, 0.726579f, 0.726643f, 0.726706f, 0.72677f,
-0.726833f, 0.726897f, 0.726961f, 0.727024f, 0.727088f, 0.727151f, 0.727215f, 0.727278f, 0.727342f, 0.727405f, 0.727469f, 0.727532f, 0.727596f, 0.727659f, 0.727723f, 0.727786f, 0.72785f, 0.727913f, 0.727977f, 0.72804f,
-0.728103f, 0.728167f, 0.72823f, 0.728294f, 0.728357f, 0.72842f, 0.728484f, 0.728547f, 0.72861f, 0.728674f, 0.728737f, 0.7288f, 0.728864f, 0.728927f, 0.72899f, 0.729054f, 0.729117f, 0.72918f, 0.729243f, 0.729307f,
-0.72937f, 0.729433f, 0.729496f, 0.72956f, 0.729623f, 0.729686f, 0.729749f, 0.729812f, 0.729875f, 0.729939f, 0.730002f, 0.730065f, 0.730128f, 0.730191f, 0.730254f, 0.730317f, 0.73038f, 0.730443f, 0.730507f, 0.73057f,
-0.730633f, 0.730696f, 0.730759f, 0.730822f, 0.730885f, 0.730948f, 0.731011f, 0.731074f, 0.731137f, 0.7312f, 0.731263f, 0.731326f, 0.731389f, 0.731451f, 0.731514f, 0.731577f, 0.73164f, 0.731703f, 0.731766f, 0.731829f,
-0.731892f, 0.731955f, 0.732017f, 0.73208f, 0.732143f, 0.732206f, 0.732269f, 0.732332f, 0.732394f, 0.732457f, 0.73252f, 0.732583f, 0.732645f, 0.732708f, 0.732771f, 0.732834f, 0.732896f, 0.732959f, 0.733022f, 0.733085f,
-0.733147f, 0.73321f, 0.733273f, 0.733335f, 0.733398f, 0.73346f, 0.733523f, 0.733586f, 0.733648f, 0.733711f, 0.733774f, 0.733836f, 0.733899f, 0.733961f, 0.734024f, 0.734086f, 0.734149f, 0.734211f, 0.734274f, 0.734336f,
-0.734399f, 0.734461f, 0.734524f, 0.734586f, 0.734649f, 0.734711f, 0.734774f, 0.734836f, 0.734899f, 0.734961f, 0.735024f, 0.735086f, 0.735148f, 0.735211f, 0.735273f, 0.735335f, 0.735398f, 0.73546f, 0.735522f, 0.735585f,
-0.735647f, 0.735709f, 0.735772f, 0.735834f, 0.735896f, 0.735959f, 0.736021f, 0.736083f, 0.736145f, 0.736208f, 0.73627f, 0.736332f, 0.736394f, 0.736456f, 0.736519f, 0.736581f, 0.736643f, 0.736705f, 0.736767f, 0.736829f,
-0.736892f, 0.736954f, 0.737016f, 0.737078f, 0.73714f, 0.737202f, 0.737264f, 0.737326f, 0.737388f, 0.73745f, 0.737512f, 0.737574f, 0.737636f, 0.737699f, 0.737761f, 0.737823f, 0.737884f, 0.737946f, 0.738008f, 0.73807f,
-0.738132f, 0.738194f, 0.738256f, 0.738318f, 0.73838f, 0.738442f, 0.738504f, 0.738566f, 0.738628f, 0.73869f, 0.738751f, 0.738813f, 0.738875f, 0.738937f, 0.738999f, 0.739061f, 0.739122f, 0.739184f, 0.739246f, 0.739308f,
-0.739369f, 0.739431f, 0.739493f, 0.739555f, 0.739616f, 0.739678f, 0.73974f, 0.739802f, 0.739863f, 0.739925f, 0.739987f, 0.740048f, 0.74011f, 0.740172f, 0.740233f, 0.740295f, 0.740356f, 0.740418f, 0.74048f, 0.740541f,
-0.740603f, 0.740664f, 0.740726f, 0.740788f, 0.740849f, 0.740911f, 0.740972f, 0.741034f, 0.741095f, 0.741157f, 0.741218f, 0.74128f, 0.741341f, 0.741403f, 0.741464f, 0.741525f, 0.741587f, 0.741648f, 0.74171f, 0.741771f,
-0.741833f, 0.741894f, 0.741955f, 0.742017f, 0.742078f, 0.742139f, 0.742201f, 0.742262f, 0.742323f, 0.742385f, 0.742446f, 0.742507f, 0.742569f, 0.74263f, 0.742691f, 0.742752f, 0.742814f, 0.742875f, 0.742936f, 0.742997f,
-0.743059f, 0.74312f, 0.743181f, 0.743242f, 0.743303f, 0.743364f, 0.743426f, 0.743487f, 0.743548f, 0.743609f, 0.74367f, 0.743731f, 0.743792f, 0.743853f, 0.743915f, 0.743976f, 0.744037f, 0.744098f, 0.744159f, 0.74422f,
-0.744281f, 0.744342f, 0.744403f, 0.744464f, 0.744525f, 0.744586f, 0.744647f, 0.744708f, 0.744769f, 0.74483f, 0.744891f, 0.744951f, 0.745012f, 0.745073f, 0.745134f, 0.745195f, 0.745256f, 0.745317f, 0.745378f, 0.745439f,
-0.745499f, 0.74556f, 0.745621f, 0.745682f, 0.745743f, 0.745803f, 0.745864f, 0.745925f, 0.745986f, 0.746047f, 0.746107f, 0.746168f, 0.746229f, 0.746289f, 0.74635f, 0.746411f, 0.746472f, 0.746532f, 0.746593f, 0.746654f,
-0.746714f, 0.746775f, 0.746836f, 0.746896f, 0.746957f, 0.747017f, 0.747078f, 0.747139f, 0.747199f, 0.74726f, 0.74732f, 0.747381f, 0.747441f, 0.747502f, 0.747562f, 0.747623f, 0.747683f, 0.747744f, 0.747804f, 0.747865f,
-0.747925f, 0.747986f, 0.748046f, 0.748107f, 0.748167f, 0.748228f, 0.748288f, 0.748348f, 0.748409f, 0.748469f, 0.748529f, 0.74859f, 0.74865f, 0.748711f, 0.748771f, 0.748831f, 0.748892f, 0.748952f, 0.749012f, 0.749072f,
-0.749133f, 0.749193f, 0.749253f, 0.749314f, 0.749374f, 0.749434f, 0.749494f, 0.749554f, 0.749615f, 0.749675f, 0.749735f, 0.749795f, 0.749855f, 0.749916f, 0.749976f, 0.750036f, 0.750096f, 0.750156f, 0.750216f, 0.750276f,
-0.750336f, 0.750396f, 0.750457f, 0.750517f, 0.750577f, 0.750637f, 0.750697f, 0.750757f, 0.750817f, 0.750877f, 0.750937f, 0.750997f, 0.751057f, 0.751117f, 0.751177f, 0.751237f, 0.751297f, 0.751356f, 0.751416f, 0.751476f,
-0.751536f, 0.751596f, 0.751656f, 0.751716f, 0.751776f, 0.751836f, 0.751895f, 0.751955f, 0.752015f, 0.752075f, 0.752135f, 0.752195f, 0.752254f, 0.752314f, 0.752374f, 0.752434f, 0.752493f, 0.752553f, 0.752613f, 0.752673f,
-0.752732f, 0.752792f, 0.752852f, 0.752911f, 0.752971f, 0.753031f, 0.75309f, 0.75315f, 0.75321f, 0.753269f, 0.753329f, 0.753389f, 0.753448f, 0.753508f, 0.753567f, 0.753627f, 0.753687f, 0.753746f, 0.753806f, 0.753865f,
-0.753925f, 0.753984f, 0.754044f, 0.754103f, 0.754163f, 0.754222f, 0.754282f, 0.754341f, 0.754401f, 0.75446f, 0.754519f, 0.754579f, 0.754638f, 0.754698f, 0.754757f, 0.754817f, 0.754876f, 0.754935f, 0.754995f, 0.755054f,
-0.755113f, 0.755173f, 0.755232f, 0.755291f, 0.755351f, 0.75541f, 0.755469f, 0.755528f, 0.755588f, 0.755647f, 0.755706f, 0.755765f, 0.755825f, 0.755884f, 0.755943f, 0.756002f, 0.756061f, 0.756121f, 0.75618f, 0.756239f,
-0.756298f, 0.756357f, 0.756416f, 0.756476f, 0.756535f, 0.756594f, 0.756653f, 0.756712f, 0.756771f, 0.75683f, 0.756889f, 0.756948f, 0.757007f, 0.757066f, 0.757125f, 0.757184f, 0.757243f, 0.757302f, 0.757361f, 0.75742f,
-0.757479f, 0.757538f, 0.757597f, 0.757656f, 0.757715f, 0.757774f, 0.757833f, 0.757892f, 0.757951f, 0.758009f, 0.758068f, 0.758127f, 0.758186f, 0.758245f, 0.758304f, 0.758362f, 0.758421f, 0.75848f, 0.758539f, 0.758598f,
-0.758656f, 0.758715f, 0.758774f, 0.758833f, 0.758891f, 0.75895f, 0.759009f, 0.759068f, 0.759126f, 0.759185f, 0.759244f, 0.759302f, 0.759361f, 0.75942f, 0.759478f, 0.759537f, 0.759596f, 0.759654f, 0.759713f, 0.759771f,
-0.75983f, 0.759888f, 0.759947f, 0.760006f, 0.760064f, 0.760123f, 0.760181f, 0.76024f, 0.760298f, 0.760357f, 0.760415f, 0.760474f, 0.760532f, 0.760591f, 0.760649f, 0.760708f, 0.760766f, 0.760824f, 0.760883f, 0.760941f,
-0.761f, 0.761058f, 0.761116f, 0.761175f, 0.761233f, 0.761291f, 0.76135f, 0.761408f, 0.761466f, 0.761525f, 0.761583f, 0.761641f, 0.7617f, 0.761758f, 0.761816f, 0.761874f, 0.761933f, 0.761991f, 0.762049f, 0.762107f,
-0.762165f, 0.762224f, 0.762282f, 0.76234f, 0.762398f, 0.762456f, 0.762514f, 0.762573f, 0.762631f, 0.762689f, 0.762747f, 0.762805f, 0.762863f, 0.762921f, 0.762979f, 0.763037f, 0.763095f, 0.763153f, 0.763211f, 0.763269f,
-0.763327f, 0.763385f, 0.763443f, 0.763501f, 0.763559f, 0.763617f, 0.763675f, 0.763733f, 0.763791f, 0.763849f, 0.763907f, 0.763965f, 0.764023f, 0.764081f, 0.764139f, 0.764196f, 0.764254f, 0.764312f, 0.76437f, 0.764428f,
-0.764486f, 0.764544f, 0.764601f, 0.764659f, 0.764717f, 0.764775f, 0.764832f, 0.76489f, 0.764948f, 0.765006f, 0.765063f, 0.765121f, 0.765179f, 0.765236f, 0.765294f, 0.765352f, 0.76541f, 0.765467f, 0.765525f, 0.765582f,
-0.76564f, 0.765698f, 0.765755f, 0.765813f, 0.765871f, 0.765928f, 0.765986f, 0.766043f, 0.766101f, 0.766158f, 0.766216f, 0.766273f, 0.766331f, 0.766388f, 0.766446f, 0.766503f, 0.766561f, 0.766618f, 0.766676f, 0.766733f,
-0.766791f, 0.766848f, 0.766906f, 0.766963f, 0.76702f, 0.767078f, 0.767135f, 0.767192f, 0.76725f, 0.767307f, 0.767365f, 0.767422f, 0.767479f, 0.767537f, 0.767594f, 0.767651f, 0.767708f, 0.767766f, 0.767823f, 0.76788f,
-0.767937f, 0.767995f, 0.768052f, 0.768109f, 0.768166f, 0.768224f, 0.768281f, 0.768338f, 0.768395f, 0.768452f, 0.768509f, 0.768567f, 0.768624f, 0.768681f, 0.768738f, 0.768795f, 0.768852f, 0.768909f, 0.768966f, 0.769023f,
-0.76908f, 0.769137f, 0.769194f, 0.769251f, 0.769308f, 0.769365f, 0.769422f, 0.769479f, 0.769536f, 0.769593f, 0.76965f, 0.769707f, 0.769764f, 0.769821f, 0.769878f, 0.769935f, 0.769992f, 0.770049f, 0.770106f, 0.770163f,
-0.770219f, 0.770276f, 0.770333f, 0.77039f, 0.770447f, 0.770504f, 0.77056f, 0.770617f, 0.770674f, 0.770731f, 0.770787f, 0.770844f, 0.770901f, 0.770958f, 0.771014f, 0.771071f, 0.771128f, 0.771185f, 0.771241f, 0.771298f,
-0.771355f, 0.771411f, 0.771468f, 0.771525f, 0.771581f, 0.771638f, 0.771694f, 0.771751f, 0.771808f, 0.771864f, 0.771921f, 0.771977f, 0.772034f, 0.77209f, 0.772147f, 0.772203f, 0.77226f, 0.772316f, 0.772373f, 0.772429f,
-0.772486f, 0.772542f, 0.772599f, 0.772655f, 0.772712f, 0.772768f, 0.772825f, 0.772881f, 0.772937f, 0.772994f, 0.77305f, 0.773107f, 0.773163f, 0.773219f, 0.773276f, 0.773332f, 0.773388f, 0.773445f, 0.773501f, 0.773557f,
-0.773613f, 0.77367f, 0.773726f, 0.773782f, 0.773838f, 0.773895f, 0.773951f, 0.774007f, 0.774063f, 0.77412f, 0.774176f, 0.774232f, 0.774288f, 0.774344f, 0.7744f, 0.774456f, 0.774513f, 0.774569f, 0.774625f, 0.774681f,
-0.774737f, 0.774793f, 0.774849f, 0.774905f, 0.774961f, 0.775017f, 0.775073f, 0.775129f, 0.775185f, 0.775241f, 0.775297f, 0.775353f, 0.775409f, 0.775465f, 0.775521f, 0.775577f, 0.775633f, 0.775689f, 0.775745f, 0.775801f,
-0.775857f, 0.775913f, 0.775969f, 0.776024f, 0.77608f, 0.776136f, 0.776192f, 0.776248f, 0.776304f, 0.776359f, 0.776415f, 0.776471f, 0.776527f, 0.776582f, 0.776638f, 0.776694f, 0.77675f, 0.776805f, 0.776861f, 0.776917f,
-0.776973f, 0.777028f, 0.777084f, 0.77714f, 0.777195f, 0.777251f, 0.777307f, 0.777362f, 0.777418f, 0.777473f, 0.777529f, 0.777585f, 0.77764f, 0.777696f, 0.777751f, 0.777807f, 0.777862f, 0.777918f, 0.777974f, 0.778029f,
-0.778085f, 0.77814f, 0.778196f, 0.778251f, 0.778306f, 0.778362f, 0.778417f, 0.778473f, 0.778528f, 0.778584f, 0.778639f, 0.778694f, 0.77875f, 0.778805f, 0.778861f, 0.778916f, 0.778971f, 0.779027f, 0.779082f, 0.779137f,
-0.779193f, 0.779248f, 0.779303f, 0.779359f, 0.779414f, 0.779469f, 0.779524f, 0.77958f, 0.779635f, 0.77969f, 0.779745f, 0.7798f, 0.779856f, 0.779911f, 0.779966f, 0.780021f, 0.780076f, 0.780131f, 0.780187f, 0.780242f,
-0.780297f, 0.780352f, 0.780407f, 0.780462f, 0.780517f, 0.780572f, 0.780627f, 0.780682f, 0.780737f, 0.780792f, 0.780847f, 0.780902f, 0.780957f, 0.781012f, 0.781067f, 0.781122f, 0.781177f, 0.781232f, 0.781287f, 0.781342f,
-0.781397f, 0.781452f, 0.781507f, 0.781562f, 0.781617f, 0.781672f, 0.781726f, 0.781781f, 0.781836f, 0.781891f, 0.781946f, 0.782001f, 0.782055f, 0.78211f, 0.782165f, 0.78222f, 0.782274f, 0.782329f, 0.782384f, 0.782439f,
-0.782493f, 0.782548f, 0.782603f, 0.782658f, 0.782712f, 0.782767f, 0.782822f, 0.782876f, 0.782931f, 0.782986f, 0.78304f, 0.783095f, 0.783149f, 0.783204f, 0.783259f, 0.783313f, 0.783368f, 0.783422f, 0.783477f, 0.783531f,
-0.783586f, 0.78364f, 0.783695f, 0.783749f, 0.783804f, 0.783858f, 0.783913f, 0.783967f, 0.784022f, 0.784076f, 0.784131f, 0.784185f, 0.784239f, 0.784294f, 0.784348f, 0.784403f, 0.784457f, 0.784511f, 0.784566f, 0.78462f,
-0.784674f, 0.784729f, 0.784783f, 0.784837f, 0.784892f, 0.784946f, 0.785f, 0.785054f, 0.785109f, 0.785163f, 0.785217f, 0.785271f, 0.785326f, 0.78538f, 0.785434f, 0.785488f, 0.785542f, 0.785597f, 0.785651f, 0.785705f,
-0.785759f, 0.785813f, 0.785867f, 0.785921f, 0.785975f, 0.786029f, 0.786084f, 0.786138f, 0.786192f, 0.786246f, 0.7863f, 0.786354f, 0.786408f, 0.786462f, 0.786516f, 0.78657f, 0.786624f, 0.786678f, 0.786732f, 0.786786f,
-0.78684f, 0.786894f, 0.786947f, 0.787001f, 0.787055f, 0.787109f, 0.787163f, 0.787217f, 0.787271f, 0.787325f, 0.787378f, 0.787432f, 0.787486f, 0.78754f, 0.787594f, 0.787648f, 0.787701f, 0.787755f, 0.787809f, 0.787863f,
-0.787916f, 0.78797f, 0.788024f, 0.788077f, 0.788131f, 0.788185f, 0.788239f, 0.788292f, 0.788346f, 0.7884f, 0.788453f, 0.788507f, 0.78856f, 0.788614f, 0.788668f, 0.788721f, 0.788775f, 0.788828f, 0.788882f, 0.788936f,
-0.788989f, 0.789043f, 0.789096f, 0.78915f, 0.789203f, 0.789257f, 0.78931f, 0.789364f, 0.789417f, 0.789471f, 0.789524f, 0.789577f, 0.789631f, 0.789684f, 0.789738f, 0.789791f, 0.789844f, 0.789898f, 0.789951f, 0.790005f,
-0.790058f, 0.790111f, 0.790165f, 0.790218f, 0.790271f, 0.790325f, 0.790378f, 0.790431f, 0.790484f, 0.790538f, 0.790591f, 0.790644f, 0.790697f, 0.790751f, 0.790804f, 0.790857f, 0.79091f, 0.790963f, 0.791016f, 0.79107f,
-0.791123f, 0.791176f, 0.791229f, 0.791282f, 0.791335f, 0.791388f, 0.791441f, 0.791495f, 0.791548f, 0.791601f, 0.791654f, 0.791707f, 0.79176f, 0.791813f, 0.791866f, 0.791919f, 0.791972f, 0.792025f, 0.792078f, 0.792131f,
-0.792184f, 0.792237f, 0.79229f, 0.792342f, 0.792395f, 0.792448f, 0.792501f, 0.792554f, 0.792607f, 0.79266f, 0.792713f, 0.792765f, 0.792818f, 0.792871f, 0.792924f, 0.792977f, 0.79303f, 0.793082f, 0.793135f, 0.793188f,
-0.793241f, 0.793293f, 0.793346f, 0.793399f, 0.793452f, 0.793504f, 0.793557f, 0.79361f, 0.793662f, 0.793715f, 0.793768f, 0.79382f, 0.793873f, 0.793925f, 0.793978f, 0.794031f, 0.794083f, 0.794136f, 0.794188f, 0.794241f,
-0.794294f, 0.794346f, 0.794399f, 0.794451f, 0.794504f, 0.794556f, 0.794609f, 0.794661f, 0.794714f, 0.794766f, 0.794819f, 0.794871f, 0.794923f, 0.794976f, 0.795028f, 0.795081f, 0.795133f, 0.795185f, 0.795238f, 0.79529f,
-0.795343f, 0.795395f, 0.795447f, 0.7955f, 0.795552f, 0.795604f, 0.795656f, 0.795709f, 0.795761f, 0.795813f, 0.795866f, 0.795918f, 0.79597f, 0.796022f, 0.796074f, 0.796127f, 0.796179f, 0.796231f, 0.796283f, 0.796335f,
-0.796388f, 0.79644f, 0.796492f, 0.796544f, 0.796596f, 0.796648f, 0.7967f, 0.796752f, 0.796804f, 0.796857f, 0.796909f, 0.796961f, 0.797013f, 0.797065f, 0.797117f, 0.797169f, 0.797221f, 0.797273f, 0.797325f, 0.797377f,
-0.797429f, 0.797481f, 0.797532f, 0.797584f, 0.797636f, 0.797688f, 0.79774f, 0.797792f, 0.797844f, 0.797896f, 0.797948f, 0.797999f, 0.798051f, 0.798103f, 0.798155f, 0.798207f, 0.798259f, 0.79831f, 0.798362f, 0.798414f,
-0.798466f, 0.798517f, 0.798569f, 0.798621f, 0.798673f, 0.798724f, 0.798776f, 0.798828f, 0.798879f, 0.798931f, 0.798983f, 0.799034f, 0.799086f, 0.799138f, 0.799189f, 0.799241f, 0.799292f, 0.799344f, 0.799395f, 0.799447f,
-0.799499f, 0.79955f, 0.799602f, 0.799653f, 0.799705f, 0.799756f, 0.799808f, 0.799859f, 0.799911f, 0.799962f, 0.800014f, 0.800065f, 0.800117f, 0.800168f, 0.800219f, 0.800271f, 0.800322f, 0.800374f, 0.800425f, 0.800476f,
-0.800528f, 0.800579f, 0.80063f, 0.800682f, 0.800733f, 0.800784f, 0.800836f, 0.800887f, 0.800938f, 0.800989f, 0.801041f, 0.801092f, 0.801143f, 0.801194f, 0.801246f, 0.801297f, 0.801348f, 0.801399f, 0.80145f, 0.801501f,
-0.801553f, 0.801604f, 0.801655f, 0.801706f, 0.801757f, 0.801808f, 0.801859f, 0.80191f, 0.801962f, 0.802013f, 0.802064f, 0.802115f, 0.802166f, 0.802217f, 0.802268f, 0.802319f, 0.80237f, 0.802421f, 0.802472f, 0.802523f,
-0.802574f, 0.802625f, 0.802675f, 0.802726f, 0.802777f, 0.802828f, 0.802879f, 0.80293f, 0.802981f, 0.803032f, 0.803083f, 0.803133f, 0.803184f, 0.803235f, 0.803286f, 0.803337f, 0.803388f, 0.803438f, 0.803489f, 0.80354f,
-0.803591f, 0.803641f, 0.803692f, 0.803743f, 0.803793f, 0.803844f, 0.803895f, 0.803946f, 0.803996f, 0.804047f, 0.804098f, 0.804148f, 0.804199f, 0.804249f, 0.8043f, 0.804351f, 0.804401f, 0.804452f, 0.804502f, 0.804553f,
-0.804604f, 0.804654f, 0.804705f, 0.804755f, 0.804806f, 0.804856f, 0.804907f, 0.804957f, 0.805008f, 0.805058f, 0.805108f, 0.805159f, 0.805209f, 0.80526f, 0.80531f, 0.805361f, 0.805411f, 0.805461f, 0.805512f, 0.805562f,
-0.805612f, 0.805663f, 0.805713f, 0.805763f, 0.805814f, 0.805864f, 0.805914f, 0.805965f, 0.806015f, 0.806065f, 0.806115f, 0.806166f, 0.806216f, 0.806266f, 0.806316f, 0.806366f, 0.806417f, 0.806467f, 0.806517f, 0.806567f,
-0.806617f, 0.806667f, 0.806718f, 0.806768f, 0.806818f, 0.806868f, 0.806918f, 0.806968f, 0.807018f, 0.807068f, 0.807118f, 0.807168f, 0.807218f, 0.807268f, 0.807318f, 0.807368f, 0.807418f, 0.807468f, 0.807518f, 0.807568f,
-0.807618f, 0.807668f, 0.807718f, 0.807768f, 0.807818f, 0.807868f, 0.807918f, 0.807967f, 0.808017f, 0.808067f, 0.808117f, 0.808167f, 0.808217f, 0.808267f, 0.808316f, 0.808366f, 0.808416f, 0.808466f, 0.808515f, 0.808565f,
-0.808615f, 0.808665f, 0.808714f, 0.808764f, 0.808814f, 0.808863f, 0.808913f, 0.808963f, 0.809013f, 0.809062f, 0.809112f, 0.809161f, 0.809211f, 0.809261f, 0.80931f, 0.80936f, 0.809409f, 0.809459f, 0.809509f, 0.809558f,
-0.809608f, 0.809657f, 0.809707f, 0.809756f, 0.809806f, 0.809855f, 0.809905f, 0.809954f, 0.810004f, 0.810053f, 0.810103f, 0.810152f, 0.810201f, 0.810251f, 0.8103f, 0.81035f, 0.810399f, 0.810448f, 0.810498f, 0.810547f,
-0.810596f, 0.810646f, 0.810695f, 0.810744f, 0.810794f, 0.810843f, 0.810892f, 0.810941f, 0.810991f, 0.81104f, 0.811089f, 0.811138f, 0.811188f, 0.811237f, 0.811286f, 0.811335f, 0.811384f, 0.811434f, 0.811483f, 0.811532f,
-0.811581f, 0.81163f, 0.811679f, 0.811728f, 0.811777f, 0.811826f, 0.811876f, 0.811925f, 0.811974f, 0.812023f, 0.812072f, 0.812121f, 0.81217f, 0.812219f, 0.812268f, 0.812317f, 0.812366f, 0.812415f, 0.812464f, 0.812513f,
-0.812562f, 0.81261f, 0.812659f, 0.812708f, 0.812757f, 0.812806f, 0.812855f, 0.812904f, 0.812953f, 0.813001f, 0.81305f, 0.813099f, 0.813148f, 0.813197f, 0.813245f, 0.813294f, 0.813343f, 0.813392f, 0.813441f, 0.813489f,
-0.813538f, 0.813587f, 0.813635f, 0.813684f, 0.813733f, 0.813781f, 0.81383f, 0.813879f, 0.813927f, 0.813976f, 0.814025f, 0.814073f, 0.814122f, 0.814171f, 0.814219f, 0.814268f, 0.814316f, 0.814365f, 0.814413f, 0.814462f,
-0.81451f, 0.814559f, 0.814607f, 0.814656f, 0.814704f, 0.814753f, 0.814801f, 0.81485f, 0.814898f, 0.814947f, 0.814995f, 0.815043f, 0.815092f, 0.81514f, 0.815189f, 0.815237f, 0.815285f, 0.815334f, 0.815382f, 0.81543f,
-0.815479f, 0.815527f, 0.815575f, 0.815624f, 0.815672f, 0.81572f, 0.815768f, 0.815817f, 0.815865f, 0.815913f, 0.815961f, 0.81601f, 0.816058f, 0.816106f, 0.816154f, 0.816202f, 0.81625f, 0.816299f, 0.816347f, 0.816395f,
-0.816443f, 0.816491f, 0.816539f, 0.816587f, 0.816635f, 0.816683f, 0.816731f, 0.816779f, 0.816827f, 0.816875f, 0.816924f, 0.816972f, 0.817019f, 0.817067f, 0.817115f, 0.817163f, 0.817211f, 0.817259f, 0.817307f, 0.817355f,
-0.817403f, 0.817451f, 0.817499f, 0.817547f, 0.817595f, 0.817642f, 0.81769f, 0.817738f, 0.817786f, 0.817834f, 0.817882f, 0.817929f, 0.817977f, 0.818025f, 0.818073f, 0.81812f, 0.818168f, 0.818216f, 0.818264f, 0.818311f,
-0.818359f, 0.818407f, 0.818454f, 0.818502f, 0.81855f, 0.818597f, 0.818645f, 0.818693f, 0.81874f, 0.818788f, 0.818836f, 0.818883f, 0.818931f, 0.818978f, 0.819026f, 0.819073f, 0.819121f, 0.819169f, 0.819216f, 0.819264f,
-0.819311f, 0.819359f, 0.819406f, 0.819453f, 0.819501f, 0.819548f, 0.819596f, 0.819643f, 0.819691f, 0.819738f, 0.819785f, 0.819833f, 0.81988f, 0.819928f, 0.819975f, 0.820022f, 0.82007f, 0.820117f, 0.820164f, 0.820212f,
-0.820259f, 0.820306f, 0.820353f, 0.820401f, 0.820448f, 0.820495f, 0.820542f, 0.82059f, 0.820637f, 0.820684f, 0.820731f, 0.820778f, 0.820826f, 0.820873f, 0.82092f, 0.820967f, 0.821014f, 0.821061f, 0.821108f, 0.821155f,
-0.821203f, 0.82125f, 0.821297f, 0.821344f, 0.821391f, 0.821438f, 0.821485f, 0.821532f, 0.821579f, 0.821626f, 0.821673f, 0.82172f, 0.821767f, 0.821814f, 0.821861f, 0.821908f, 0.821955f, 0.822002f, 0.822048f, 0.822095f,
-0.822142f, 0.822189f, 0.822236f, 0.822283f, 0.82233f, 0.822376f, 0.822423f, 0.82247f, 0.822517f, 0.822564f, 0.82261f, 0.822657f, 0.822704f, 0.822751f, 0.822797f, 0.822844f, 0.822891f, 0.822938f, 0.822984f, 0.823031f,
-0.823078f, 0.823124f, 0.823171f, 0.823218f, 0.823264f, 0.823311f, 0.823358f, 0.823404f, 0.823451f, 0.823497f, 0.823544f, 0.82359f, 0.823637f, 0.823684f, 0.82373f, 0.823777f, 0.823823f, 0.82387f, 0.823916f, 0.823963f,
-0.824009f, 0.824055f, 0.824102f, 0.824148f, 0.824195f, 0.824241f, 0.824288f, 0.824334f, 0.82438f, 0.824427f, 0.824473f, 0.824519f, 0.824566f, 0.824612f, 0.824659f, 0.824705f, 0.824751f, 0.824797f, 0.824844f, 0.82489f,
-0.824936f, 0.824982f, 0.825029f, 0.825075f, 0.825121f, 0.825167f, 0.825214f, 0.82526f, 0.825306f, 0.825352f, 0.825398f, 0.825444f, 0.825491f, 0.825537f, 0.825583f, 0.825629f, 0.825675f, 0.825721f, 0.825767f, 0.825813f,
-0.825859f, 0.825905f, 0.825951f, 0.825997f, 0.826043f, 0.826089f, 0.826135f, 0.826181f, 0.826227f, 0.826273f, 0.826319f, 0.826365f, 0.826411f, 0.826457f, 0.826503f, 0.826549f, 0.826595f, 0.826641f, 0.826687f, 0.826732f,
-0.826778f, 0.826824f, 0.82687f, 0.826916f, 0.826962f, 0.827007f, 0.827053f, 0.827099f, 0.827145f, 0.82719f, 0.827236f, 0.827282f, 0.827328f, 0.827373f, 0.827419f, 0.827465f, 0.82751f, 0.827556f, 0.827602f, 0.827647f,
-0.827693f, 0.827739f, 0.827784f, 0.82783f, 0.827876f, 0.827921f, 0.827967f, 0.828012f, 0.828058f, 0.828103f, 0.828149f, 0.828194f, 0.82824f, 0.828285f, 0.828331f, 0.828376f, 0.828422f, 0.828467f, 0.828513f, 0.828558f,
-0.828604f, 0.828649f, 0.828695f, 0.82874f, 0.828785f, 0.828831f, 0.828876f, 0.828921f, 0.828967f, 0.829012f, 0.829057f, 0.829103f, 0.829148f, 0.829193f, 0.829239f, 0.829284f, 0.829329f, 0.829374f, 0.82942f, 0.829465f,
-0.82951f, 0.829555f, 0.829601f, 0.829646f, 0.829691f, 0.829736f, 0.829781f, 0.829826f, 0.829872f, 0.829917f, 0.829962f, 0.830007f, 0.830052f, 0.830097f, 0.830142f, 0.830187f, 0.830232f, 0.830277f, 0.830322f, 0.830368f,
-0.830413f, 0.830458f, 0.830503f, 0.830548f, 0.830592f, 0.830637f, 0.830682f, 0.830727f, 0.830772f, 0.830817f, 0.830862f, 0.830907f, 0.830952f, 0.830997f, 0.831042f, 0.831087f, 0.831131f, 0.831176f, 0.831221f, 0.831266f,
-0.831311f, 0.831355f, 0.8314f, 0.831445f, 0.83149f, 0.831535f, 0.831579f, 0.831624f, 0.831669f, 0.831714f, 0.831758f, 0.831803f, 0.831848f, 0.831892f, 0.831937f, 0.831982f, 0.832026f, 0.832071f, 0.832115f, 0.83216f,
-0.832205f, 0.832249f, 0.832294f, 0.832338f, 0.832383f, 0.832428f, 0.832472f, 0.832517f, 0.832561f, 0.832606f, 0.83265f, 0.832695f, 0.832739f, 0.832784f, 0.832828f, 0.832872f, 0.832917f, 0.832961f, 0.833006f, 0.83305f,
-0.833095f, 0.833139f, 0.833183f, 0.833228f, 0.833272f, 0.833316f, 0.833361f, 0.833405f, 0.833449f, 0.833494f, 0.833538f, 0.833582f, 0.833626f, 0.833671f, 0.833715f, 0.833759f, 0.833803f, 0.833848f, 0.833892f, 0.833936f,
-0.83398f, 0.834024f, 0.834069f, 0.834113f, 0.834157f, 0.834201f, 0.834245f, 0.834289f, 0.834333f, 0.834377f, 0.834421f, 0.834465f, 0.83451f, 0.834554f, 0.834598f, 0.834642f, 0.834686f, 0.83473f, 0.834774f, 0.834818f,
-0.834862f, 0.834906f, 0.83495f, 0.834993f, 0.835037f, 0.835081f, 0.835125f, 0.835169f, 0.835213f, 0.835257f, 0.835301f, 0.835345f, 0.835389f, 0.835432f, 0.835476f, 0.83552f, 0.835564f, 0.835608f, 0.835651f, 0.835695f,
-0.835739f, 0.835783f, 0.835826f, 0.83587f, 0.835914f, 0.835958f, 0.836001f, 0.836045f, 0.836089f, 0.836132f, 0.836176f, 0.83622f, 0.836263f, 0.836307f, 0.836351f, 0.836394f, 0.836438f, 0.836481f, 0.836525f, 0.836568f,
-0.836612f, 0.836656f, 0.836699f, 0.836743f, 0.836786f, 0.83683f, 0.836873f, 0.836917f, 0.83696f, 0.837004f, 0.837047f, 0.83709f, 0.837134f, 0.837177f, 0.837221f, 0.837264f, 0.837307f, 0.837351f, 0.837394f, 0.837438f,
-0.837481f, 0.837524f, 0.837568f, 0.837611f, 0.837654f, 0.837697f, 0.837741f, 0.837784f, 0.837827f, 0.837871f, 0.837914f, 0.837957f, 0.838f, 0.838043f, 0.838087f, 0.83813f, 0.838173f, 0.838216f, 0.838259f, 0.838302f,
-0.838346f, 0.838389f, 0.838432f, 0.838475f, 0.838518f, 0.838561f, 0.838604f, 0.838647f, 0.83869f, 0.838733f, 0.838776f, 0.838819f, 0.838862f, 0.838905f, 0.838948f, 0.838991f, 0.839034f, 0.839077f, 0.83912f, 0.839163f,
-0.839206f, 0.839249f, 0.839292f, 0.839335f, 0.839378f, 0.839421f, 0.839463f, 0.839506f, 0.839549f, 0.839592f, 0.839635f, 0.839678f, 0.83972f, 0.839763f, 0.839806f, 0.839849f, 0.839891f, 0.839934f, 0.839977f, 0.84002f,
-0.840062f, 0.840105f, 0.840148f, 0.84019f, 0.840233f, 0.840276f, 0.840318f, 0.840361f, 0.840404f, 0.840446f, 0.840489f, 0.840531f, 0.840574f, 0.840617f, 0.840659f, 0.840702f, 0.840744f, 0.840787f, 0.840829f, 0.840872f,
-0.840914f, 0.840957f, 0.840999f, 0.841042f, 0.841084f, 0.841127f, 0.841169f, 0.841212f, 0.841254f, 0.841296f, 0.841339f, 0.841381f, 0.841424f, 0.841466f, 0.841508f, 0.841551f, 0.841593f, 0.841635f, 0.841678f, 0.84172f,
-0.841762f, 0.841805f, 0.841847f, 0.841889f, 0.841931f, 0.841974f, 0.842016f, 0.842058f, 0.8421f, 0.842142f, 0.842185f, 0.842227f, 0.842269f, 0.842311f, 0.842353f, 0.842395f, 0.842437f, 0.84248f, 0.842522f, 0.842564f,
-0.842606f, 0.842648f, 0.84269f, 0.842732f, 0.842774f, 0.842816f, 0.842858f, 0.8429f, 0.842942f, 0.842984f, 0.843026f, 0.843068f, 0.84311f, 0.843152f, 0.843194f, 0.843236f, 0.843278f, 0.84332f, 0.843362f, 0.843403f,
-0.843445f, 0.843487f, 0.843529f, 0.843571f, 0.843613f, 0.843654f, 0.843696f, 0.843738f, 0.84378f, 0.843822f, 0.843863f, 0.843905f, 0.843947f, 0.843989f, 0.84403f, 0.844072f, 0.844114f, 0.844155f, 0.844197f, 0.844239f,
-0.84428f, 0.844322f, 0.844364f, 0.844405f, 0.844447f, 0.844489f, 0.84453f, 0.844572f, 0.844613f, 0.844655f, 0.844696f, 0.844738f, 0.844779f, 0.844821f, 0.844863f, 0.844904f, 0.844945f, 0.844987f, 0.845028f, 0.84507f,
-0.845111f, 0.845153f, 0.845194f, 0.845236f, 0.845277f, 0.845318f, 0.84536f, 0.845401f, 0.845443f, 0.845484f, 0.845525f, 0.845567f, 0.845608f, 0.845649f, 0.84569f, 0.845732f, 0.845773f, 0.845814f, 0.845856f, 0.845897f,
-0.845938f, 0.845979f, 0.84602f, 0.846062f, 0.846103f, 0.846144f, 0.846185f, 0.846226f, 0.846268f, 0.846309f, 0.84635f, 0.846391f, 0.846432f, 0.846473f, 0.846514f, 0.846555f, 0.846596f, 0.846637f, 0.846678f, 0.846719f,
-0.84676f, 0.846801f, 0.846842f, 0.846883f, 0.846924f, 0.846965f, 0.847006f, 0.847047f, 0.847088f, 0.847129f, 0.84717f, 0.847211f, 0.847252f, 0.847293f, 0.847334f, 0.847375f, 0.847415f, 0.847456f, 0.847497f, 0.847538f,
-0.847579f, 0.847619f, 0.84766f, 0.847701f, 0.847742f, 0.847783f, 0.847823f, 0.847864f, 0.847905f, 0.847945f, 0.847986f, 0.848027f, 0.848068f, 0.848108f, 0.848149f, 0.84819f, 0.84823f, 0.848271f, 0.848311f, 0.848352f,
-0.848393f, 0.848433f, 0.848474f, 0.848514f, 0.848555f, 0.848595f, 0.848636f, 0.848676f, 0.848717f, 0.848757f, 0.848798f, 0.848838f, 0.848879f, 0.848919f, 0.84896f, 0.849f, 0.849041f, 0.849081f, 0.849122f, 0.849162f,
-0.849202f, 0.849243f, 0.849283f, 0.849323f, 0.849364f, 0.849404f, 0.849444f, 0.849485f, 0.849525f, 0.849565f, 0.849606f, 0.849646f, 0.849686f, 0.849726f, 0.849767f, 0.849807f, 0.849847f, 0.849887f, 0.849927f, 0.849968f,
-0.850008f, 0.850048f, 0.850088f, 0.850128f, 0.850168f, 0.850208f, 0.850249f, 0.850289f, 0.850329f, 0.850369f, 0.850409f, 0.850449f, 0.850489f, 0.850529f, 0.850569f, 0.850609f, 0.850649f, 0.850689f, 0.850729f, 0.850769f,
-0.850809f, 0.850849f, 0.850889f, 0.850929f, 0.850969f, 0.851008f, 0.851048f, 0.851088f, 0.851128f, 0.851168f, 0.851208f, 0.851248f, 0.851288f, 0.851327f, 0.851367f, 0.851407f, 0.851447f, 0.851487f, 0.851526f, 0.851566f,
-0.851606f, 0.851645f, 0.851685f, 0.851725f, 0.851765f, 0.851804f, 0.851844f, 0.851884f, 0.851923f, 0.851963f, 0.852003f, 0.852042f, 0.852082f, 0.852121f, 0.852161f, 0.852201f, 0.85224f, 0.85228f, 0.852319f, 0.852359f,
-0.852398f, 0.852438f, 0.852477f, 0.852517f, 0.852556f, 0.852596f, 0.852635f, 0.852675f, 0.852714f, 0.852754f, 0.852793f, 0.852832f, 0.852872f, 0.852911f, 0.852951f, 0.85299f, 0.853029f, 0.853069f, 0.853108f, 0.853147f,
-0.853187f, 0.853226f, 0.853265f, 0.853305f, 0.853344f, 0.853383f, 0.853422f, 0.853462f, 0.853501f, 0.85354f, 0.853579f, 0.853618f, 0.853658f, 0.853697f, 0.853736f, 0.853775f, 0.853814f, 0.853853f, 0.853893f, 0.853932f,
-0.853971f, 0.85401f, 0.854049f, 0.854088f, 0.854127f, 0.854166f, 0.854205f, 0.854244f, 0.854283f, 0.854322f, 0.854361f, 0.8544f, 0.854439f, 0.854478f, 0.854517f, 0.854556f, 0.854595f, 0.854634f, 0.854673f, 0.854712f,
-0.854751f, 0.854789f, 0.854828f, 0.854867f, 0.854906f, 0.854945f, 0.854984f, 0.855022f, 0.855061f, 0.8551f, 0.855139f, 0.855178f, 0.855216f, 0.855255f, 0.855294f, 0.855333f, 0.855371f, 0.85541f, 0.855449f, 0.855487f,
-0.855526f, 0.855565f, 0.855603f, 0.855642f, 0.855681f, 0.855719f, 0.855758f, 0.855796f, 0.855835f, 0.855874f, 0.855912f, 0.855951f, 0.855989f, 0.856028f, 0.856066f, 0.856105f, 0.856143f, 0.856182f, 0.85622f, 0.856259f,
-0.856297f, 0.856336f, 0.856374f, 0.856413f, 0.856451f, 0.856489f, 0.856528f, 0.856566f, 0.856605f, 0.856643f, 0.856681f, 0.85672f, 0.856758f, 0.856796f, 0.856835f, 0.856873f, 0.856911f, 0.856949f, 0.856988f, 0.857026f,
-0.857064f, 0.857102f, 0.857141f, 0.857179f, 0.857217f, 0.857255f, 0.857293f, 0.857332f, 0.85737f, 0.857408f, 0.857446f, 0.857484f, 0.857522f, 0.85756f, 0.857598f, 0.857636f, 0.857675f, 0.857713f, 0.857751f, 0.857789f,
-0.857827f, 0.857865f, 0.857903f, 0.857941f, 0.857979f, 0.858017f, 0.858055f, 0.858093f, 0.858131f, 0.858168f, 0.858206f, 0.858244f, 0.858282f, 0.85832f, 0.858358f, 0.858396f, 0.858434f, 0.858472f, 0.858509f, 0.858547f,
-0.858585f, 0.858623f, 0.858661f, 0.858698f, 0.858736f, 0.858774f, 0.858812f, 0.858849f, 0.858887f, 0.858925f, 0.858963f, 0.859f, 0.859038f, 0.859076f, 0.859113f, 0.859151f, 0.859189f, 0.859226f, 0.859264f, 0.859301f,
-0.859339f, 0.859377f, 0.859414f, 0.859452f, 0.859489f, 0.859527f, 0.859564f, 0.859602f, 0.859639f, 0.859677f, 0.859714f, 0.859752f, 0.859789f, 0.859827f, 0.859864f, 0.859902f, 0.859939f, 0.859977f, 0.860014f, 0.860051f,
-0.860089f, 0.860126f, 0.860163f, 0.860201f, 0.860238f, 0.860275f, 0.860313f, 0.86035f, 0.860387f, 0.860425f, 0.860462f, 0.860499f, 0.860536f, 0.860574f, 0.860611f, 0.860648f, 0.860685f, 0.860723f, 0.86076f, 0.860797f,
-0.860834f, 0.860871f, 0.860908f, 0.860945f, 0.860983f, 0.86102f, 0.861057f, 0.861094f, 0.861131f, 0.861168f, 0.861205f, 0.861242f, 0.861279f, 0.861316f, 0.861353f, 0.86139f, 0.861427f, 0.861464f, 0.861501f, 0.861538f,
-0.861575f, 0.861612f, 0.861649f, 0.861686f, 0.861723f, 0.86176f, 0.861797f, 0.861833f, 0.86187f, 0.861907f, 0.861944f, 0.861981f, 0.862018f, 0.862054f, 0.862091f, 0.862128f, 0.862165f, 0.862202f, 0.862238f, 0.862275f,
-0.862312f, 0.862349f, 0.862385f, 0.862422f, 0.862459f, 0.862495f, 0.862532f, 0.862569f, 0.862605f, 0.862642f, 0.862679f, 0.862715f, 0.862752f, 0.862788f, 0.862825f, 0.862861f, 0.862898f, 0.862935f, 0.862971f, 0.863008f,
-0.863044f, 0.863081f, 0.863117f, 0.863154f, 0.86319f, 0.863227f, 0.863263f, 0.863299f, 0.863336f, 0.863372f, 0.863409f, 0.863445f, 0.863482f, 0.863518f, 0.863554f, 0.863591f, 0.863627f, 0.863663f, 0.8637f, 0.863736f,
-0.863772f, 0.863809f, 0.863845f, 0.863881f, 0.863917f, 0.863954f, 0.86399f, 0.864026f, 0.864062f, 0.864098f, 0.864135f, 0.864171f, 0.864207f, 0.864243f, 0.864279f, 0.864315f, 0.864352f, 0.864388f, 0.864424f, 0.86446f,
-0.864496f, 0.864532f, 0.864568f, 0.864604f, 0.86464f, 0.864676f, 0.864712f, 0.864748f, 0.864784f, 0.86482f, 0.864856f, 0.864892f, 0.864928f, 0.864964f, 0.865f, 0.865036f, 0.865072f, 0.865108f, 0.865144f, 0.865179f,
-0.865215f, 0.865251f, 0.865287f, 0.865323f, 0.865359f, 0.865394f, 0.86543f, 0.865466f, 0.865502f, 0.865538f, 0.865573f, 0.865609f, 0.865645f, 0.865681f, 0.865716f, 0.865752f, 0.865788f, 0.865823f, 0.865859f, 0.865895f,
-0.86593f, 0.865966f, 0.866002f, 0.866037f, 0.866073f, 0.866108f, 0.866144f, 0.86618f, 0.866215f, 0.866251f, 0.866286f, 0.866322f, 0.866357f, 0.866393f, 0.866428f, 0.866464f, 0.866499f, 0.866535f, 0.86657f, 0.866606f,
-0.866641f, 0.866676f, 0.866712f, 0.866747f, 0.866783f, 0.866818f, 0.866853f, 0.866889f, 0.866924f, 0.866959f, 0.866995f, 0.86703f, 0.867065f, 0.867101f, 0.867136f, 0.867171f, 0.867206f, 0.867242f, 0.867277f, 0.867312f,
-0.867347f, 0.867383f, 0.867418f, 0.867453f, 0.867488f, 0.867523f, 0.867558f, 0.867594f, 0.867629f, 0.867664f, 0.867699f, 0.867734f, 0.867769f, 0.867804f, 0.867839f, 0.867874f, 0.867909f, 0.867944f, 0.867979f, 0.868014f,
-0.868049f, 0.868084f, 0.868119f, 0.868154f, 0.868189f, 0.868224f, 0.868259f, 0.868294f, 0.868329f, 0.868364f, 0.868399f, 0.868434f, 0.868468f, 0.868503f, 0.868538f, 0.868573f, 0.868608f, 0.868643f, 0.868677f, 0.868712f,
-0.868747f, 0.868782f, 0.868817f, 0.868851f, 0.868886f, 0.868921f, 0.868955f, 0.86899f, 0.869025f, 0.86906f, 0.869094f, 0.869129f, 0.869164f, 0.869198f, 0.869233f, 0.869267f, 0.869302f, 0.869337f, 0.869371f, 0.869406f,
-0.86944f, 0.869475f, 0.869509f, 0.869544f, 0.869578f, 0.869613f, 0.869647f, 0.869682f, 0.869716f, 0.869751f, 0.869785f, 0.86982f, 0.869854f, 0.869889f, 0.869923f, 0.869957f, 0.869992f, 0.870026f, 0.870061f, 0.870095f,
-0.870129f, 0.870164f, 0.870198f, 0.870232f, 0.870266f, 0.870301f, 0.870335f, 0.870369f, 0.870404f, 0.870438f, 0.870472f, 0.870506f, 0.87054f, 0.870575f, 0.870609f, 0.870643f, 0.870677f, 0.870711f, 0.870745f, 0.87078f,
-0.870814f, 0.870848f, 0.870882f, 0.870916f, 0.87095f, 0.870984f, 0.871018f, 0.871052f, 0.871086f, 0.87112f, 0.871154f, 0.871188f, 0.871222f, 0.871256f, 0.87129f, 0.871324f, 0.871358f, 0.871392f, 0.871426f, 0.87146f,
-0.871494f, 0.871528f, 0.871562f, 0.871596f, 0.871629f, 0.871663f, 0.871697f, 0.871731f, 0.871765f, 0.871799f, 0.871832f, 0.871866f, 0.8719f, 0.871934f, 0.871967f, 0.872001f, 0.872035f, 0.872069f, 0.872102f, 0.872136f,
-0.87217f, 0.872203f, 0.872237f, 0.872271f, 0.872304f, 0.872338f, 0.872372f, 0.872405f, 0.872439f, 0.872472f, 0.872506f, 0.87254f, 0.872573f, 0.872607f, 0.87264f, 0.872674f, 0.872707f, 0.872741f, 0.872774f, 0.872808f,
-0.872841f, 0.872875f, 0.872908f, 0.872941f, 0.872975f, 0.873008f, 0.873042f, 0.873075f, 0.873108f, 0.873142f, 0.873175f, 0.873209f, 0.873242f, 0.873275f, 0.873309f, 0.873342f, 0.873375f, 0.873408f, 0.873442f, 0.873475f,
-0.873508f, 0.873541f, 0.873575f, 0.873608f, 0.873641f, 0.873674f, 0.873707f, 0.873741f, 0.873774f, 0.873807f, 0.87384f, 0.873873f, 0.873906f, 0.873939f, 0.873973f, 0.874006f, 0.874039f, 0.874072f, 0.874105f, 0.874138f,
-0.874171f, 0.874204f, 0.874237f, 0.87427f, 0.874303f, 0.874336f, 0.874369f, 0.874402f, 0.874435f, 0.874468f, 0.874501f, 0.874533f, 0.874566f, 0.874599f, 0.874632f, 0.874665f, 0.874698f, 0.874731f, 0.874763f, 0.874796f,
-0.874829f, 0.874862f, 0.874895f, 0.874927f, 0.87496f, 0.874993f, 0.875026f, 0.875058f, 0.875091f, 0.875124f, 0.875157f, 0.875189f, 0.875222f, 0.875255f, 0.875287f, 0.87532f, 0.875353f, 0.875385f, 0.875418f, 0.87545f,
-0.875483f, 0.875516f, 0.875548f, 0.875581f, 0.875613f, 0.875646f, 0.875678f, 0.875711f, 0.875743f, 0.875776f, 0.875808f, 0.875841f, 0.875873f, 0.875906f, 0.875938f, 0.875971f, 0.876003f, 0.876035f, 0.876068f, 0.8761f,
-0.876132f, 0.876165f, 0.876197f, 0.87623f, 0.876262f, 0.876294f, 0.876326f, 0.876359f, 0.876391f, 0.876423f, 0.876456f, 0.876488f, 0.87652f, 0.876552f, 0.876585f, 0.876617f, 0.876649f, 0.876681f, 0.876713f, 0.876745f,
-0.876778f, 0.87681f, 0.876842f, 0.876874f, 0.876906f, 0.876938f, 0.87697f, 0.877002f, 0.877034f, 0.877066f, 0.877098f, 0.877131f, 0.877163f, 0.877195f, 0.877227f, 0.877259f, 0.87729f, 0.877322f, 0.877354f, 0.877386f,
-0.877418f, 0.87745f, 0.877482f, 0.877514f, 0.877546f, 0.877578f, 0.87761f, 0.877641f, 0.877673f, 0.877705f, 0.877737f, 0.877769f, 0.877801f, 0.877832f, 0.877864f, 0.877896f, 0.877928f, 0.877959f, 0.877991f, 0.878023f,
-0.878055f, 0.878086f, 0.878118f, 0.87815f, 0.878181f, 0.878213f, 0.878245f, 0.878276f, 0.878308f, 0.878339f, 0.878371f, 0.878403f, 0.878434f, 0.878466f, 0.878497f, 0.878529f, 0.87856f, 0.878592f, 0.878623f, 0.878655f,
-0.878686f, 0.878718f, 0.878749f, 0.878781f, 0.878812f, 0.878844f, 0.878875f, 0.878907f, 0.878938f, 0.878969f, 0.879001f, 0.879032f, 0.879063f, 0.879095f, 0.879126f, 0.879157f, 0.879189f, 0.87922f, 0.879251f, 0.879283f,
-0.879314f, 0.879345f, 0.879376f, 0.879408f, 0.879439f, 0.87947f, 0.879501f, 0.879533f, 0.879564f, 0.879595f, 0.879626f, 0.879657f, 0.879688f, 0.879719f, 0.879751f, 0.879782f, 0.879813f, 0.879844f, 0.879875f, 0.879906f,
-0.879937f, 0.879968f, 0.879999f, 0.88003f, 0.880061f, 0.880092f, 0.880123f, 0.880154f, 0.880185f, 0.880216f, 0.880247f, 0.880278f, 0.880309f, 0.88034f, 0.880371f, 0.880401f, 0.880432f, 0.880463f, 0.880494f, 0.880525f,
-0.880556f, 0.880586f, 0.880617f, 0.880648f, 0.880679f, 0.88071f, 0.88074f, 0.880771f, 0.880802f, 0.880833f, 0.880863f, 0.880894f, 0.880925f, 0.880955f, 0.880986f, 0.881017f, 0.881047f, 0.881078f, 0.881109f, 0.881139f,
-0.88117f, 0.8812f, 0.881231f, 0.881262f, 0.881292f, 0.881323f, 0.881353f, 0.881384f, 0.881414f, 0.881445f, 0.881475f, 0.881506f, 0.881536f, 0.881567f, 0.881597f, 0.881628f, 0.881658f, 0.881688f, 0.881719f, 0.881749f,
-0.88178f, 0.88181f, 0.88184f, 0.881871f, 0.881901f, 0.881931f, 0.881962f, 0.881992f, 0.882022f, 0.882053f, 0.882083f, 0.882113f, 0.882143f, 0.882174f, 0.882204f, 0.882234f, 0.882264f, 0.882295f, 0.882325f, 0.882355f,
-0.882385f, 0.882415f, 0.882445f, 0.882475f, 0.882506f, 0.882536f, 0.882566f, 0.882596f, 0.882626f, 0.882656f, 0.882686f, 0.882716f, 0.882746f, 0.882776f, 0.882806f, 0.882836f, 0.882866f, 0.882896f, 0.882926f, 0.882956f,
-0.882986f, 0.883016f, 0.883046f, 0.883076f, 0.883106f, 0.883136f, 0.883165f, 0.883195f, 0.883225f, 0.883255f, 0.883285f, 0.883315f, 0.883344f, 0.883374f, 0.883404f, 0.883434f, 0.883464f, 0.883493f, 0.883523f, 0.883553f,
-0.883583f, 0.883612f, 0.883642f, 0.883672f, 0.883701f, 0.883731f, 0.883761f, 0.88379f, 0.88382f, 0.883849f, 0.883879f, 0.883909f, 0.883938f, 0.883968f, 0.883997f, 0.884027f, 0.884057f, 0.884086f, 0.884116f, 0.884145f,
-0.884175f, 0.884204f, 0.884234f, 0.884263f, 0.884292f, 0.884322f, 0.884351f, 0.884381f, 0.88441f, 0.88444f, 0.884469f, 0.884498f, 0.884528f, 0.884557f, 0.884586f, 0.884616f, 0.884645f, 0.884674f, 0.884704f, 0.884733f,
-0.884762f, 0.884792f, 0.884821f, 0.88485f, 0.884879f, 0.884908f, 0.884938f, 0.884967f, 0.884996f, 0.885025f, 0.885054f, 0.885084f, 0.885113f, 0.885142f, 0.885171f, 0.8852f, 0.885229f, 0.885258f, 0.885287f, 0.885316f,
-0.885345f, 0.885374f, 0.885404f, 0.885433f, 0.885462f, 0.885491f, 0.88552f, 0.885549f, 0.885577f, 0.885606f, 0.885635f, 0.885664f, 0.885693f, 0.885722f, 0.885751f, 0.88578f, 0.885809f, 0.885838f, 0.885867f, 0.885895f,
-0.885924f, 0.885953f, 0.885982f, 0.886011f, 0.886039f, 0.886068f, 0.886097f, 0.886126f, 0.886154f, 0.886183f, 0.886212f, 0.886241f, 0.886269f, 0.886298f, 0.886327f, 0.886355f, 0.886384f, 0.886413f, 0.886441f, 0.88647f,
-0.886499f, 0.886527f, 0.886556f, 0.886584f, 0.886613f, 0.886641f, 0.88667f, 0.886699f, 0.886727f, 0.886756f, 0.886784f, 0.886813f, 0.886841f, 0.886869f, 0.886898f, 0.886926f, 0.886955f, 0.886983f, 0.887012f, 0.88704f,
-0.887068f, 0.887097f, 0.887125f, 0.887154f, 0.887182f, 0.88721f, 0.887239f, 0.887267f, 0.887295f, 0.887323f, 0.887352f, 0.88738f, 0.887408f, 0.887436f, 0.887465f, 0.887493f, 0.887521f, 0.887549f, 0.887577f, 0.887606f,
-0.887634f, 0.887662f, 0.88769f, 0.887718f, 0.887746f, 0.887774f, 0.887803f, 0.887831f, 0.887859f, 0.887887f, 0.887915f, 0.887943f, 0.887971f, 0.887999f, 0.888027f, 0.888055f, 0.888083f, 0.888111f, 0.888139f, 0.888167f,
-0.888195f, 0.888223f, 0.888251f, 0.888279f, 0.888306f, 0.888334f, 0.888362f, 0.88839f, 0.888418f, 0.888446f, 0.888474f, 0.888501f, 0.888529f, 0.888557f, 0.888585f, 0.888613f, 0.88864f, 0.888668f, 0.888696f, 0.888724f,
-0.888751f, 0.888779f, 0.888807f, 0.888834f, 0.888862f, 0.88889f, 0.888917f, 0.888945f, 0.888973f, 0.889f, 0.889028f, 0.889055f, 0.889083f, 0.889111f, 0.889138f, 0.889166f, 0.889193f, 0.889221f, 0.889248f, 0.889276f,
-0.889303f, 0.889331f, 0.889358f, 0.889386f, 0.889413f, 0.889441f, 0.889468f, 0.889496f, 0.889523f, 0.88955f, 0.889578f, 0.889605f, 0.889632f, 0.88966f, 0.889687f, 0.889714f, 0.889742f, 0.889769f, 0.889796f, 0.889824f,
-0.889851f, 0.889878f, 0.889905f, 0.889933f, 0.88996f, 0.889987f, 0.890014f, 0.890042f, 0.890069f, 0.890096f, 0.890123f, 0.89015f, 0.890177f, 0.890204f, 0.890232f, 0.890259f, 0.890286f, 0.890313f, 0.89034f, 0.890367f,
-0.890394f, 0.890421f, 0.890448f, 0.890475f, 0.890502f, 0.890529f, 0.890556f, 0.890583f, 0.89061f, 0.890637f, 0.890664f, 0.890691f, 0.890718f, 0.890745f, 0.890772f, 0.890798f, 0.890825f, 0.890852f, 0.890879f, 0.890906f,
-0.890933f, 0.89096f, 0.890986f, 0.891013f, 0.89104f, 0.891067f, 0.891093f, 0.89112f, 0.891147f, 0.891174f, 0.8912f, 0.891227f, 0.891254f, 0.89128f, 0.891307f, 0.891334f, 0.89136f, 0.891387f, 0.891414f, 0.89144f,
-0.891467f, 0.891494f, 0.89152f, 0.891547f, 0.891573f, 0.8916f, 0.891626f, 0.891653f, 0.891679f, 0.891706f, 0.891732f, 0.891759f, 0.891785f, 0.891812f, 0.891838f, 0.891865f, 0.891891f, 0.891917f, 0.891944f, 0.89197f,
-0.891997f, 0.892023f, 0.892049f, 0.892076f, 0.892102f, 0.892128f, 0.892155f, 0.892181f, 0.892207f, 0.892234f, 0.89226f, 0.892286f, 0.892312f, 0.892339f, 0.892365f, 0.892391f, 0.892417f, 0.892443f, 0.89247f, 0.892496f,
-0.892522f, 0.892548f, 0.892574f, 0.8926f, 0.892626f, 0.892652f, 0.892679f, 0.892705f, 0.892731f, 0.892757f, 0.892783f, 0.892809f, 0.892835f, 0.892861f, 0.892887f, 0.892913f, 0.892939f, 0.892965f, 0.892991f, 0.893017f,
-0.893043f, 0.893069f, 0.893094f, 0.89312f, 0.893146f, 0.893172f, 0.893198f, 0.893224f, 0.89325f, 0.893276f, 0.893301f, 0.893327f, 0.893353f, 0.893379f, 0.893405f, 0.89343f, 0.893456f, 0.893482f, 0.893508f, 0.893533f,
-0.893559f, 0.893585f, 0.89361f, 0.893636f, 0.893662f, 0.893687f, 0.893713f, 0.893739f, 0.893764f, 0.89379f, 0.893815f, 0.893841f, 0.893867f, 0.893892f, 0.893918f, 0.893943f, 0.893969f, 0.893994f, 0.89402f, 0.894045f,
-0.894071f, 0.894096f, 0.894122f, 0.894147f, 0.894173f, 0.894198f, 0.894223f, 0.894249f, 0.894274f, 0.8943f, 0.894325f, 0.89435f, 0.894376f, 0.894401f, 0.894426f, 0.894452f, 0.894477f, 0.894502f, 0.894528f, 0.894553f,
-0.894578f, 0.894603f, 0.894629f, 0.894654f, 0.894679f, 0.894704f, 0.894729f, 0.894755f, 0.89478f, 0.894805f, 0.89483f, 0.894855f, 0.89488f, 0.894905f, 0.89493f, 0.894956f, 0.894981f, 0.895006f, 0.895031f, 0.895056f,
-0.895081f, 0.895106f, 0.895131f, 0.895156f, 0.895181f, 0.895206f, 0.895231f, 0.895256f, 0.895281f, 0.895306f, 0.895331f, 0.895356f, 0.89538f, 0.895405f, 0.89543f, 0.895455f, 0.89548f, 0.895505f, 0.89553f, 0.895554f,
-0.895579f, 0.895604f, 0.895629f, 0.895654f, 0.895678f, 0.895703f, 0.895728f, 0.895753f, 0.895777f, 0.895802f, 0.895827f, 0.895851f, 0.895876f, 0.895901f, 0.895925f, 0.89595f, 0.895975f, 0.895999f, 0.896024f, 0.896048f,
-0.896073f, 0.896098f, 0.896122f, 0.896147f, 0.896171f, 0.896196f, 0.89622f, 0.896245f, 0.896269f, 0.896294f, 0.896318f, 0.896343f, 0.896367f, 0.896392f, 0.896416f, 0.89644f, 0.896465f, 0.896489f, 0.896514f, 0.896538f,
-0.896562f, 0.896587f, 0.896611f, 0.896635f, 0.89666f, 0.896684f, 0.896708f, 0.896733f, 0.896757f, 0.896781f, 0.896805f, 0.89683f, 0.896854f, 0.896878f, 0.896902f, 0.896926f, 0.896951f, 0.896975f, 0.896999f, 0.897023f,
-0.897047f, 0.897071f, 0.897095f, 0.89712f, 0.897144f, 0.897168f, 0.897192f, 0.897216f, 0.89724f, 0.897264f, 0.897288f, 0.897312f, 0.897336f, 0.89736f, 0.897384f, 0.897408f, 0.897432f, 0.897456f, 0.89748f, 0.897504f,
-0.897528f, 0.897552f, 0.897575f, 0.897599f, 0.897623f, 0.897647f, 0.897671f, 0.897695f, 0.897718f, 0.897742f, 0.897766f, 0.89779f, 0.897814f, 0.897837f, 0.897861f, 0.897885f, 0.897909f, 0.897932f, 0.897956f, 0.89798f,
-0.898003f, 0.898027f, 0.898051f, 0.898074f, 0.898098f, 0.898122f, 0.898145f, 0.898169f, 0.898193f, 0.898216f, 0.89824f, 0.898263f, 0.898287f, 0.89831f, 0.898334f, 0.898357f, 0.898381f, 0.898404f, 0.898428f, 0.898451f,
-0.898475f, 0.898498f, 0.898522f, 0.898545f, 0.898569f, 0.898592f, 0.898615f, 0.898639f, 0.898662f, 0.898685f, 0.898709f, 0.898732f, 0.898755f, 0.898779f, 0.898802f, 0.898825f, 0.898849f, 0.898872f, 0.898895f, 0.898918f,
-0.898942f, 0.898965f, 0.898988f, 0.899011f, 0.899034f, 0.899058f, 0.899081f, 0.899104f, 0.899127f, 0.89915f, 0.899173f, 0.899196f, 0.89922f, 0.899243f, 0.899266f, 0.899289f, 0.899312f, 0.899335f, 0.899358f, 0.899381f,
-0.899404f, 0.899427f, 0.89945f, 0.899473f, 0.899496f, 0.899519f, 0.899542f, 0.899565f, 0.899588f, 0.899611f, 0.899633f, 0.899656f, 0.899679f, 0.899702f, 0.899725f, 0.899748f, 0.899771f, 0.899793f, 0.899816f, 0.899839f,
-0.899862f, 0.899885f, 0.899907f, 0.89993f, 0.899953f, 0.899976f, 0.899998f, 0.900021f, 0.900044f, 0.900066f, 0.900089f, 0.900112f, 0.900134f, 0.900157f, 0.90018f, 0.900202f, 0.900225f, 0.900247f, 0.90027f, 0.900293f,
-0.900315f, 0.900338f, 0.90036f, 0.900383f, 0.900405f, 0.900428f, 0.90045f, 0.900473f, 0.900495f, 0.900518f, 0.90054f, 0.900563f, 0.900585f, 0.900607f, 0.90063f, 0.900652f, 0.900675f, 0.900697f, 0.900719f, 0.900742f,
-0.900764f, 0.900786f, 0.900809f, 0.900831f, 0.900853f, 0.900875f, 0.900898f, 0.90092f, 0.900942f, 0.900964f, 0.900987f, 0.901009f, 0.901031f, 0.901053f, 0.901075f, 0.901098f, 0.90112f, 0.901142f, 0.901164f, 0.901186f,
-0.901208f, 0.90123f, 0.901252f, 0.901274f, 0.901296f, 0.901319f, 0.901341f, 0.901363f, 0.901385f, 0.901407f, 0.901429f, 0.901451f, 0.901473f, 0.901495f, 0.901516f, 0.901538f, 0.90156f, 0.901582f, 0.901604f, 0.901626f,
-0.901648f, 0.90167f, 0.901692f, 0.901714f, 0.901735f, 0.901757f, 0.901779f, 0.901801f, 0.901823f, 0.901844f, 0.901866f, 0.901888f, 0.90191f, 0.901931f, 0.901953f, 0.901975f, 0.901996f, 0.902018f, 0.90204f, 0.902062f,
-0.902083f, 0.902105f, 0.902126f, 0.902148f, 0.90217f, 0.902191f, 0.902213f, 0.902234f, 0.902256f, 0.902278f, 0.902299f, 0.902321f, 0.902342f, 0.902364f, 0.902385f, 0.902407f, 0.902428f, 0.90245f, 0.902471f, 0.902492f,
-0.902514f, 0.902535f, 0.902557f, 0.902578f, 0.902599f, 0.902621f, 0.902642f, 0.902664f, 0.902685f, 0.902706f, 0.902728f, 0.902749f, 0.90277f, 0.902791f, 0.902813f, 0.902834f, 0.902855f, 0.902876f, 0.902898f, 0.902919f,
-0.90294f, 0.902961f, 0.902982f, 0.903004f, 0.903025f, 0.903046f, 0.903067f, 0.903088f, 0.903109f, 0.90313f, 0.903151f, 0.903173f, 0.903194f, 0.903215f, 0.903236f, 0.903257f, 0.903278f, 0.903299f, 0.90332f, 0.903341f,
-0.903362f, 0.903383f, 0.903404f, 0.903425f, 0.903446f, 0.903466f, 0.903487f, 0.903508f, 0.903529f, 0.90355f, 0.903571f, 0.903592f, 0.903613f, 0.903633f, 0.903654f, 0.903675f, 0.903696f, 0.903717f, 0.903737f, 0.903758f,
-0.903779f, 0.9038f, 0.90382f, 0.903841f, 0.903862f, 0.903882f, 0.903903f, 0.903924f, 0.903944f, 0.903965f, 0.903986f, 0.904006f, 0.904027f, 0.904048f, 0.904068f, 0.904089f, 0.904109f, 0.90413f, 0.90415f, 0.904171f,
-0.904191f, 0.904212f, 0.904232f, 0.904253f, 0.904273f, 0.904294f, 0.904314f, 0.904335f, 0.904355f, 0.904376f, 0.904396f, 0.904416f, 0.904437f, 0.904457f, 0.904478f, 0.904498f, 0.904518f, 0.904539f, 0.904559f, 0.904579f,
-0.9046f, 0.90462f, 0.90464f, 0.90466f, 0.904681f, 0.904701f, 0.904721f, 0.904741f, 0.904761f, 0.904782f, 0.904802f, 0.904822f, 0.904842f, 0.904862f, 0.904882f, 0.904903f, 0.904923f, 0.904943f, 0.904963f, 0.904983f,
-0.905003f, 0.905023f, 0.905043f, 0.905063f, 0.905083f, 0.905103f, 0.905123f, 0.905143f, 0.905163f, 0.905183f, 0.905203f, 0.905223f, 0.905243f, 0.905263f, 0.905283f, 0.905303f, 0.905323f, 0.905342f, 0.905362f, 0.905382f,
-0.905402f, 0.905422f, 0.905442f, 0.905461f, 0.905481f, 0.905501f, 0.905521f, 0.905541f, 0.90556f, 0.90558f, 0.9056f, 0.90562f, 0.905639f, 0.905659f, 0.905679f, 0.905698f, 0.905718f, 0.905738f, 0.905757f, 0.905777f,
-0.905796f, 0.905816f, 0.905836f, 0.905855f, 0.905875f, 0.905894f, 0.905914f, 0.905933f, 0.905953f, 0.905973f, 0.905992f, 0.906012f, 0.906031f, 0.90605f, 0.90607f, 0.906089f, 0.906109f, 0.906128f, 0.906148f, 0.906167f,
-0.906186f, 0.906206f, 0.906225f, 0.906244f, 0.906264f, 0.906283f, 0.906302f, 0.906322f, 0.906341f, 0.90636f, 0.90638f, 0.906399f, 0.906418f, 0.906437f, 0.906457f, 0.906476f, 0.906495f, 0.906514f, 0.906533f, 0.906553f,
-0.906572f, 0.906591f, 0.90661f, 0.906629f, 0.906648f, 0.906667f, 0.906686f, 0.906706f, 0.906725f, 0.906744f, 0.906763f, 0.906782f, 0.906801f, 0.90682f, 0.906839f, 0.906858f, 0.906877f, 0.906896f, 0.906915f, 0.906934f,
-0.906953f, 0.906972f, 0.90699f, 0.907009f, 0.907028f, 0.907047f, 0.907066f, 0.907085f, 0.907104f, 0.907122f, 0.907141f, 0.90716f, 0.907179f, 0.907198f, 0.907216f, 0.907235f, 0.907254f, 0.907273f, 0.907291f, 0.90731f,
-0.907329f, 0.907348f, 0.907366f, 0.907385f, 0.907404f, 0.907422f, 0.907441f, 0.90746f, 0.907478f, 0.907497f, 0.907515f, 0.907534f, 0.907552f, 0.907571f, 0.90759f, 0.907608f, 0.907627f, 0.907645f, 0.907664f, 0.907682f,
-0.907701f, 0.907719f, 0.907738f, 0.907756f, 0.907774f, 0.907793f, 0.907811f, 0.90783f, 0.907848f, 0.907866f, 0.907885f, 0.907903f, 0.907921f, 0.90794f, 0.907958f, 0.907976f, 0.907995f, 0.908013f, 0.908031f, 0.90805f,
-0.908068f, 0.908086f, 0.908104f, 0.908122f, 0.908141f, 0.908159f, 0.908177f, 0.908195f, 0.908213f, 0.908232f, 0.90825f, 0.908268f, 0.908286f, 0.908304f, 0.908322f, 0.90834f, 0.908358f, 0.908376f, 0.908394f, 0.908412f,
-0.90843f, 0.908448f, 0.908466f, 0.908484f, 0.908502f, 0.90852f, 0.908538f, 0.908556f, 0.908574f, 0.908592f, 0.90861f, 0.908628f, 0.908646f, 0.908664f, 0.908682f, 0.908699f, 0.908717f, 0.908735f, 0.908753f, 0.908771f,
-0.908789f, 0.908806f, 0.908824f, 0.908842f, 0.90886f, 0.908877f, 0.908895f, 0.908913f, 0.90893f, 0.908948f, 0.908966f, 0.908984f, 0.909001f, 0.909019f, 0.909036f, 0.909054f, 0.909072f, 0.909089f, 0.909107f, 0.909124f,
-0.909142f, 0.90916f, 0.909177f, 0.909195f, 0.909212f, 0.90923f, 0.909247f, 0.909265f, 0.909282f, 0.9093f, 0.909317f, 0.909335f, 0.909352f, 0.909369f, 0.909387f, 0.909404f, 0.909422f, 0.909439f, 0.909456f, 0.909474f,
-0.909491f, 0.909508f, 0.909526f, 0.909543f, 0.90956f, 0.909578f, 0.909595f, 0.909612f, 0.909629f, 0.909647f, 0.909664f, 0.909681f, 0.909698f, 0.909715f, 0.909733f, 0.90975f, 0.909767f, 0.909784f, 0.909801f, 0.909818f,
-0.909835f, 0.909853f, 0.90987f, 0.909887f, 0.909904f, 0.909921f, 0.909938f, 0.909955f, 0.909972f, 0.909989f, 0.910006f, 0.910023f, 0.91004f, 0.910057f, 0.910074f, 0.910091f, 0.910108f, 0.910125f, 0.910141f, 0.910158f,
-0.910175f, 0.910192f, 0.910209f, 0.910226f, 0.910243f, 0.91026f, 0.910276f, 0.910293f, 0.91031f, 0.910327f, 0.910343f, 0.91036f, 0.910377f, 0.910394f, 0.91041f, 0.910427f, 0.910444f, 0.910461f, 0.910477f, 0.910494f,
-0.910511f, 0.910527f, 0.910544f, 0.91056f, 0.910577f, 0.910594f, 0.91061f, 0.910627f, 0.910643f, 0.91066f, 0.910676f, 0.910693f, 0.91071f, 0.910726f, 0.910743f, 0.910759f, 0.910776f, 0.910792f, 0.910808f, 0.910825f,
-0.910841f, 0.910858f, 0.910874f, 0.910891f, 0.910907f, 0.910923f, 0.91094f, 0.910956f, 0.910972f, 0.910989f, 0.911005f, 0.911021f, 0.911038f, 0.911054f, 0.91107f, 0.911086f, 0.911103f, 0.911119f, 0.911135f, 0.911151f,
-0.911167f, 0.911184f, 0.9112f, 0.911216f, 0.911232f, 0.911248f, 0.911264f, 0.911281f, 0.911297f, 0.911313f, 0.911329f, 0.911345f, 0.911361f, 0.911377f, 0.911393f, 0.911409f, 0.911425f, 0.911441f, 0.911457f, 0.911473f,
-0.911489f, 0.911505f, 0.911521f, 0.911537f, 0.911553f, 0.911569f, 0.911585f, 0.911601f, 0.911616f, 0.911632f, 0.911648f, 0.911664f, 0.91168f, 0.911696f, 0.911711f, 0.911727f, 0.911743f, 0.911759f, 0.911775f, 0.91179f,
-0.911806f, 0.911822f, 0.911838f, 0.911853f, 0.911869f, 0.911885f, 0.9119f, 0.911916f, 0.911932f, 0.911947f, 0.911963f, 0.911979f, 0.911994f, 0.91201f, 0.912025f, 0.912041f, 0.912056f, 0.912072f, 0.912088f, 0.912103f,
-0.912119f, 0.912134f, 0.91215f, 0.912165f, 0.912181f, 0.912196f, 0.912211f, 0.912227f, 0.912242f, 0.912258f, 0.912273f, 0.912288f, 0.912304f, 0.912319f, 0.912335f, 0.91235f, 0.912365f, 0.912381f, 0.912396f, 0.912411f,
-0.912426f, 0.912442f, 0.912457f, 0.912472f, 0.912488f, 0.912503f, 0.912518f, 0.912533f, 0.912548f, 0.912564f, 0.912579f, 0.912594f, 0.912609f, 0.912624f, 0.912639f, 0.912654f, 0.91267f, 0.912685f, 0.9127f, 0.912715f,
-0.91273f, 0.912745f, 0.91276f, 0.912775f, 0.91279f, 0.912805f, 0.91282f, 0.912835f, 0.91285f, 0.912865f, 0.91288f, 0.912895f, 0.91291f, 0.912925f, 0.912939f, 0.912954f, 0.912969f, 0.912984f, 0.912999f, 0.913014f,
-0.913029f, 0.913043f, 0.913058f, 0.913073f, 0.913088f, 0.913103f, 0.913117f, 0.913132f, 0.913147f, 0.913162f, 0.913176f, 0.913191f, 0.913206f, 0.91322f, 0.913235f, 0.91325f, 0.913264f, 0.913279f, 0.913294f, 0.913308f,
-0.913323f, 0.913337f, 0.913352f, 0.913366f, 0.913381f, 0.913396f, 0.91341f, 0.913425f, 0.913439f, 0.913454f, 0.913468f, 0.913483f, 0.913497f, 0.913512f, 0.913526f, 0.91354f, 0.913555f, 0.913569f, 0.913584f, 0.913598f,
-0.913612f, 0.913627f, 0.913641f, 0.913655f, 0.91367f, 0.913684f, 0.913698f, 0.913713f, 0.913727f, 0.913741f, 0.913755f, 0.91377f, 0.913784f, 0.913798f, 0.913812f, 0.913827f, 0.913841f, 0.913855f, 0.913869f, 0.913883f,
-0.913897f, 0.913912f, 0.913926f, 0.91394f, 0.913954f, 0.913968f, 0.913982f, 0.913996f, 0.91401f, 0.914024f, 0.914038f, 0.914052f, 0.914066f, 0.91408f, 0.914094f, 0.914108f, 0.914122f, 0.914136f, 0.91415f, 0.914164f,
-0.914178f, 0.914192f, 0.914206f, 0.91422f, 0.914233f, 0.914247f, 0.914261f, 0.914275f, 0.914289f, 0.914303f, 0.914316f, 0.91433f, 0.914344f, 0.914358f, 0.914371f, 0.914385f, 0.914399f, 0.914413f, 0.914426f, 0.91444f,
-0.914454f, 0.914467f, 0.914481f, 0.914495f, 0.914508f, 0.914522f, 0.914536f, 0.914549f, 0.914563f, 0.914576f, 0.91459f, 0.914604f, 0.914617f, 0.914631f, 0.914644f, 0.914658f, 0.914671f, 0.914685f, 0.914698f, 0.914712f,
-0.914725f, 0.914738f, 0.914752f, 0.914765f, 0.914779f, 0.914792f, 0.914806f, 0.914819f, 0.914832f, 0.914846f, 0.914859f, 0.914872f, 0.914886f, 0.914899f, 0.914912f, 0.914926f, 0.914939f, 0.914952f, 0.914965f, 0.914979f,
-0.914992f, 0.915005f, 0.915018f, 0.915031f, 0.915045f, 0.915058f, 0.915071f, 0.915084f, 0.915097f, 0.91511f, 0.915123f, 0.915137f, 0.91515f, 0.915163f, 0.915176f, 0.915189f, 0.915202f, 0.915215f, 0.915228f, 0.915241f,
-0.915254f, 0.915267f, 0.91528f, 0.915293f, 0.915306f, 0.915319f, 0.915332f, 0.915345f, 0.915357f, 0.91537f, 0.915383f, 0.915396f, 0.915409f, 0.915422f, 0.915435f, 0.915448f, 0.91546f, 0.915473f, 0.915486f, 0.915499f,
-0.915511f, 0.915524f, 0.915537f, 0.91555f, 0.915562f, 0.915575f, 0.915588f, 0.915601f, 0.915613f, 0.915626f, 0.915639f, 0.915651f, 0.915664f, 0.915676f, 0.915689f, 0.915702f, 0.915714f, 0.915727f, 0.915739f, 0.915752f,
-0.915764f, 0.915777f, 0.91579f, 0.915802f, 0.915815f, 0.915827f, 0.915839f, 0.915852f, 0.915864f, 0.915877f, 0.915889f, 0.915902f, 0.915914f, 0.915926f, 0.915939f, 0.915951f, 0.915964f, 0.915976f, 0.915988f, 0.916001f,
-0.916013f, 0.916025f, 0.916037f, 0.91605f, 0.916062f, 0.916074f, 0.916086f, 0.916099f, 0.916111f, 0.916123f, 0.916135f, 0.916148f, 0.91616f, 0.916172f, 0.916184f, 0.916196f, 0.916208f, 0.91622f, 0.916232f, 0.916245f,
-0.916257f, 0.916269f, 0.916281f, 0.916293f, 0.916305f, 0.916317f, 0.916329f, 0.916341f, 0.916353f, 0.916365f, 0.916377f, 0.916389f, 0.916401f, 0.916413f, 0.916425f, 0.916437f, 0.916448f, 0.91646f, 0.916472f, 0.916484f,
-0.916496f, 0.916508f, 0.91652f, 0.916531f, 0.916543f, 0.916555f, 0.916567f, 0.916579f, 0.91659f, 0.916602f, 0.916614f, 0.916626f, 0.916637f, 0.916649f, 0.916661f, 0.916672f, 0.916684f, 0.916696f, 0.916707f, 0.916719f,
-0.916731f, 0.916742f, 0.916754f, 0.916765f, 0.916777f, 0.916788f, 0.9168f, 0.916812f, 0.916823f, 0.916835f, 0.916846f, 0.916858f, 0.916869f, 0.916881f, 0.916892f, 0.916903f, 0.916915f, 0.916926f, 0.916938f, 0.916949f,
-0.916961f, 0.916972f, 0.916983f, 0.916995f, 0.917006f, 0.917017f, 0.917029f, 0.91704f, 0.917051f, 0.917063f, 0.917074f, 0.917085f, 0.917096f, 0.917108f, 0.917119f, 0.91713f, 0.917141f, 0.917153f, 0.917164f, 0.917175f,
-0.917186f, 0.917197f, 0.917208f, 0.917219f, 0.917231f, 0.917242f, 0.917253f, 0.917264f, 0.917275f, 0.917286f, 0.917297f, 0.917308f, 0.917319f, 0.91733f, 0.917341f, 0.917352f, 0.917363f, 0.917374f, 0.917385f, 0.917396f,
-0.917407f, 0.917418f, 0.917429f, 0.91744f, 0.917451f, 0.917461f, 0.917472f, 0.917483f, 0.917494f, 0.917505f, 0.917516f, 0.917526f, 0.917537f, 0.917548f, 0.917559f, 0.91757f, 0.91758f, 0.917591f, 0.917602f, 0.917612f,
-0.917623f, 0.917634f, 0.917645f, 0.917655f, 0.917666f, 0.917677f, 0.917687f, 0.917698f, 0.917708f, 0.917719f, 0.91773f, 0.91774f, 0.917751f, 0.917761f, 0.917772f, 0.917782f, 0.917793f, 0.917803f, 0.917814f, 0.917824f,
-0.917835f, 0.917845f, 0.917856f, 0.917866f, 0.917877f, 0.917887f, 0.917897f, 0.917908f, 0.917918f, 0.917929f, 0.917939f, 0.917949f, 0.91796f, 0.91797f, 0.91798f, 0.917991f, 0.918001f, 0.918011f, 0.918021f, 0.918032f,
-0.918042f, 0.918052f, 0.918062f, 0.918073f, 0.918083f, 0.918093f, 0.918103f, 0.918113f, 0.918124f, 0.918134f, 0.918144f, 0.918154f, 0.918164f, 0.918174f, 0.918184f, 0.918194f, 0.918204f, 0.918214f, 0.918224f, 0.918234f,
-0.918244f, 0.918254f, 0.918264f, 0.918274f, 0.918284f, 0.918294f, 0.918304f, 0.918314f, 0.918324f, 0.918334f, 0.918344f, 0.918354f, 0.918364f, 0.918374f, 0.918384f, 0.918393f, 0.918403f, 0.918413f, 0.918423f, 0.918433f,
-0.918442f, 0.918452f, 0.918462f, 0.918472f, 0.918481f, 0.918491f, 0.918501f, 0.918511f, 0.91852f, 0.91853f, 0.91854f, 0.918549f, 0.918559f, 0.918569f, 0.918578f, 0.918588f, 0.918597f, 0.918607f, 0.918617f, 0.918626f,
-0.918636f, 0.918645f, 0.918655f, 0.918664f, 0.918674f, 0.918683f, 0.918693f, 0.918702f, 0.918712f, 0.918721f, 0.918731f, 0.91874f, 0.91875f, 0.918759f, 0.918768f, 0.918778f, 0.918787f, 0.918796f, 0.918806f, 0.918815f,
-0.918824f, 0.918834f, 0.918843f, 0.918852f, 0.918862f, 0.918871f, 0.91888f, 0.918889f, 0.918899f, 0.918908f, 0.918917f, 0.918926f, 0.918935f, 0.918945f, 0.918954f, 0.918963f, 0.918972f, 0.918981f, 0.91899f, 0.918999f,
-0.919009f, 0.919018f, 0.919027f, 0.919036f, 0.919045f, 0.919054f, 0.919063f, 0.919072f, 0.919081f, 0.91909f, 0.919099f, 0.919108f, 0.919117f, 0.919126f, 0.919135f, 0.919144f, 0.919153f, 0.919161f, 0.91917f, 0.919179f,
-0.919188f, 0.919197f, 0.919206f, 0.919215f, 0.919223f, 0.919232f, 0.919241f, 0.91925f, 0.919259f, 0.919267f, 0.919276f, 0.919285f, 0.919294f, 0.919302f, 0.919311f, 0.91932f, 0.919328f, 0.919337f, 0.919346f, 0.919354f,
-0.919363f, 0.919372f, 0.91938f, 0.919389f, 0.919397f, 0.919406f, 0.919415f, 0.919423f, 0.919432f, 0.91944f, 0.919449f, 0.919457f, 0.919466f, 0.919474f, 0.919483f, 0.919491f, 0.9195f, 0.919508f, 0.919517f, 0.919525f,
-0.919533f, 0.919542f, 0.91955f, 0.919559f, 0.919567f, 0.919575f, 0.919584f, 0.919592f, 0.9196f, 0.919609f, 0.919617f, 0.919625f, 0.919633f, 0.919642f, 0.91965f, 0.919658f, 0.919666f, 0.919675f, 0.919683f, 0.919691f,
-0.919699f, 0.919707f, 0.919715f, 0.919724f, 0.919732f, 0.91974f, 0.919748f, 0.919756f, 0.919764f, 0.919772f, 0.91978f, 0.919788f, 0.919796f, 0.919804f, 0.919812f, 0.91982f, 0.919828f, 0.919836f, 0.919844f, 0.919852f,
-0.91986f, 0.919868f, 0.919876f, 0.919884f, 0.919892f, 0.9199f, 0.919908f, 0.919916f, 0.919923f, 0.919931f, 0.919939f, 0.919947f, 0.919955f, 0.919963f, 0.91997f, 0.919978f, 0.919986f, 0.919994f, 0.920001f, 0.920009f,
-0.920017f, 0.920025f, 0.920032f, 0.92004f, 0.920048f, 0.920055f, 0.920063f, 0.920071f, 0.920078f, 0.920086f, 0.920093f, 0.920101f, 0.920109f, 0.920116f, 0.920124f, 0.920131f, 0.920139f, 0.920146f, 0.920154f, 0.920161f,
-0.920169f, 0.920176f, 0.920184f, 0.920191f, 0.920199f, 0.920206f, 0.920213f, 0.920221f, 0.920228f, 0.920236f, 0.920243f, 0.92025f, 0.920258f, 0.920265f, 0.920272f, 0.92028f, 0.920287f, 0.920294f, 0.920302f, 0.920309f,
-0.920316f, 0.920323f, 0.920331f, 0.920338f, 0.920345f, 0.920352f, 0.920359f, 0.920367f, 0.920374f, 0.920381f, 0.920388f, 0.920395f, 0.920402f, 0.920409f, 0.920417f, 0.920424f, 0.920431f, 0.920438f, 0.920445f, 0.920452f,
-0.920459f, 0.920466f, 0.920473f, 0.92048f, 0.920487f, 0.920494f, 0.920501f, 0.920508f, 0.920515f, 0.920522f, 0.920529f, 0.920535f, 0.920542f, 0.920549f, 0.920556f, 0.920563f, 0.92057f, 0.920577f, 0.920583f, 0.92059f,
-0.920597f, 0.920604f, 0.920611f, 0.920617f, 0.920624f, 0.920631f, 0.920638f, 0.920644f, 0.920651f, 0.920658f, 0.920664f, 0.920671f, 0.920678f, 0.920684f, 0.920691f, 0.920698f, 0.920704f, 0.920711f, 0.920717f, 0.920724f,
-0.920731f, 0.920737f, 0.920744f, 0.92075f, 0.920757f, 0.920763f, 0.92077f, 0.920776f, 0.920783f, 0.920789f, 0.920796f, 0.920802f, 0.920809f, 0.920815f, 0.920821f, 0.920828f, 0.920834f, 0.92084f, 0.920847f, 0.920853f,
-0.92086f, 0.920866f, 0.920872f, 0.920878f, 0.920885f, 0.920891f, 0.920897f, 0.920904f, 0.92091f, 0.920916f, 0.920922f, 0.920928f, 0.920935f, 0.920941f, 0.920947f, 0.920953f, 0.920959f, 0.920966f, 0.920972f, 0.920978f,
-0.920984f, 0.92099f, 0.920996f, 0.921002f, 0.921008f, 0.921014f, 0.92102f, 0.921026f, 0.921032f, 0.921038f, 0.921044f, 0.92105f, 0.921056f, 0.921062f, 0.921068f, 0.921074f, 0.92108f, 0.921086f, 0.921092f, 0.921098f,
-0.921104f, 0.921109f, 0.921115f, 0.921121f, 0.921127f, 0.921133f, 0.921139f, 0.921144f, 0.92115f, 0.921156f, 0.921162f, 0.921168f, 0.921173f, 0.921179f, 0.921185f, 0.92119f, 0.921196f, 0.921202f, 0.921207f, 0.921213f,
-0.921219f, 0.921224f, 0.92123f, 0.921236f, 0.921241f, 0.921247f, 0.921252f, 0.921258f, 0.921264f, 0.921269f, 0.921275f, 0.92128f, 0.921286f, 0.921291f, 0.921297f, 0.921302f, 0.921308f, 0.921313f, 0.921318f, 0.921324f,
-0.921329f, 0.921335f, 0.92134f, 0.921346f, 0.921351f, 0.921356f, 0.921362f, 0.921367f, 0.921372f, 0.921378f, 0.921383f, 0.921388f, 0.921393f, 0.921399f, 0.921404f, 0.921409f, 0.921414f, 0.92142f, 0.921425f, 0.92143f,
-0.921435f, 0.92144f, 0.921446f, 0.921451f, 0.921456f, 0.921461f, 0.921466f, 0.921471f, 0.921476f, 0.921481f, 0.921487f, 0.921492f, 0.921497f, 0.921502f, 0.921507f, 0.921512f, 0.921517f, 0.921522f, 0.921527f, 0.921532f,
-0.921537f, 0.921542f, 0.921546f, 0.921551f, 0.921556f, 0.921561f, 0.921566f, 0.921571f, 0.921576f, 0.921581f, 0.921586f, 0.92159f, 0.921595f, 0.9216f, 0.921605f, 0.92161f, 0.921614f, 0.921619f, 0.921624f, 0.921629f,
-0.921633f, 0.921638f, 0.921643f, 0.921647f, 0.921652f, 0.921657f, 0.921661f, 0.921666f, 0.921671f, 0.921675f, 0.92168f, 0.921685f, 0.921689f, 0.921694f, 0.921698f, 0.921703f, 0.921707f, 0.921712f, 0.921716f, 0.921721f,
-0.921725f, 0.92173f, 0.921734f, 0.921739f, 0.921743f, 0.921748f, 0.921752f, 0.921757f, 0.921761f, 0.921765f, 0.92177f, 0.921774f, 0.921779f, 0.921783f, 0.921787f, 0.921792f, 0.921796f, 0.9218f, 0.921804f, 0.921809f,
-0.921813f, 0.921817f, 0.921822f, 0.921826f, 0.92183f, 0.921834f, 0.921838f, 0.921843f, 0.921847f, 0.921851f, 0.921855f, 0.921859f, 0.921863f, 0.921867f, 0.921872f, 0.921876f, 0.92188f, 0.921884f, 0.921888f, 0.921892f,
-0.921896f, 0.9219f, 0.921904f, 0.921908f, 0.921912f, 0.921916f, 0.92192f, 0.921924f, 0.921928f, 0.921932f, 0.921936f, 0.92194f, 0.921944f, 0.921947f, 0.921951f, 0.921955f, 0.921959f, 0.921963f, 0.921967f, 0.92197f,
-0.921974f, 0.921978f, 0.921982f, 0.921986f, 0.921989f, 0.921993f, 0.921997f, 0.922001f, 0.922004f, 0.922008f, 0.922012f, 0.922015f, 0.922019f, 0.922023f, 0.922026f, 0.92203f, 0.922034f, 0.922037f, 0.922041f, 0.922044f,
-0.922048f, 0.922052f, 0.922055f, 0.922059f, 0.922062f, 0.922066f, 0.922069f, 0.922073f, 0.922076f, 0.92208f, 0.922083f, 0.922087f, 0.92209f, 0.922093f, 0.922097f, 0.9221f, 0.922104f, 0.922107f, 0.92211f, 0.922114f,
-0.922117f, 0.92212f, 0.922124f, 0.922127f, 0.92213f, 0.922134f, 0.922137f, 0.92214f, 0.922143f, 0.922147f, 0.92215f, 0.922153f, 0.922156f, 0.92216f, 0.922163f, 0.922166f, 0.922169f, 0.922172f, 0.922175f, 0.922179f,
-0.922182f, 0.922185f, 0.922188f, 0.922191f, 0.922194f, 0.922197f, 0.9222f, 0.922203f, 0.922206f, 0.922209f, 0.922212f, 0.922215f, 0.922218f, 0.922221f, 0.922224f, 0.922227f, 0.92223f, 0.922233f, 0.922236f, 0.922239f,
-0.922242f, 0.922244f, 0.922247f, 0.92225f, 0.922253f, 0.922256f, 0.922259f, 0.922261f, 0.922264f, 0.922267f, 0.92227f, 0.922273f, 0.922275f, 0.922278f, 0.922281f, 0.922284f, 0.922286f, 0.922289f, 0.922292f, 0.922294f,
-0.922297f, 0.9223f, 0.922302f, 0.922305f, 0.922307f, 0.92231f, 0.922313f, 0.922315f, 0.922318f, 0.92232f, 0.922323f, 0.922325f, 0.922328f, 0.92233f, 0.922333f, 0.922335f, 0.922338f, 0.92234f, 0.922343f, 0.922345f,
-0.922348f, 0.92235f, 0.922352f, 0.922355f, 0.922357f, 0.92236f, 0.922362f, 0.922364f, 0.922367f, 0.922369f, 0.922371f, 0.922374f, 0.922376f, 0.922378f, 0.92238f, 0.922383f, 0.922385f, 0.922387f, 0.922389f, 0.922392f,
-0.922394f, 0.922396f, 0.922398f, 0.9224f, 0.922402f, 0.922405f, 0.922407f, 0.922409f, 0.922411f, 0.922413f, 0.922415f, 0.922417f, 0.922419f, 0.922421f, 0.922423f, 0.922425f, 0.922427f, 0.922429f, 0.922431f, 0.922433f,
-0.922435f, 0.922437f, 0.922439f, 0.922441f, 0.922443f, 0.922445f, 0.922447f, 0.922449f, 0.922451f, 0.922452f, 0.922454f, 0.922456f, 0.922458f, 0.92246f, 0.922462f, 0.922463f, 0.922465f, 0.922467f, 0.922469f, 0.92247f,
-0.922472f, 0.922474f, 0.922476f, 0.922477f, 0.922479f, 0.922481f, 0.922482f, 0.922484f, 0.922486f, 0.922487f, 0.922489f, 0.922491f, 0.922492f, 0.922494f, 0.922495f, 0.922497f, 0.922498f, 0.9225f, 0.922501f, 0.922503f,
-0.922504f, 0.922506f, 0.922507f, 0.922509f, 0.92251f, 0.922512f, 0.922513f, 0.922515f, 0.922516f, 0.922518f, 0.922519f, 0.92252f, 0.922522f, 0.922523f, 0.922524f, 0.922526f, 0.922527f, 0.922528f, 0.92253f, 0.922531f,
-0.922532f, 0.922533f, 0.922535f, 0.922536f, 0.922537f, 0.922538f, 0.92254f, 0.922541f, 0.922542f, 0.922543f, 0.922544f, 0.922545f, 0.922547f, 0.922548f, 0.922549f, 0.92255f, 0.922551f, 0.922552f, 0.922553f, 0.922554f,
-0.922555f, 0.922556f, 0.922557f, 0.922558f, 0.922559f, 0.92256f, 0.922561f, 0.922562f, 0.922563f, 0.922564f, 0.922565f, 0.922566f, 0.922567f, 0.922568f, 0.922569f, 0.92257f, 0.92257f, 0.922571f, 0.922572f, 0.922573f,
-0.922574f, 0.922575f, 0.922575f, 0.922576f, 0.922577f, 0.922578f, 0.922578f, 0.922579f, 0.92258f, 0.922581f, 0.922581f, 0.922582f, 0.922583f, 0.922583f, 0.922584f, 0.922585f, 0.922585f, 0.922586f, 0.922587f, 0.922587f,
-0.922588f, 0.922588f, 0.922589f, 0.922589f, 0.92259f, 0.92259f, 0.922591f, 0.922592f, 0.922592f, 0.922592f, 0.922593f, 0.922593f, 0.922594f, 0.922594f, 0.922595f, 0.922595f, 0.922596f, 0.922596f, 0.922596f, 0.922597f,
-0.922597f, 0.922597f, 0.922598f, 0.922598f, 0.922598f, 0.922599f, 0.922599f, 0.922599f, 0.922599f, 0.9226f, 0.9226f, 0.9226f, 0.9226f, 0.922601f, 0.922601f, 0.922601f, 0.922601f, 0.922601f, 0.922602f, 0.922602f,
-0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922602f,
-0.922602f, 0.922602f, 0.922602f, 0.922602f, 0.922601f, 0.922601f, 0.922601f, 0.922601f, 0.922601f, 0.9226f, 0.9226f, 0.9226f, 0.9226f, 0.922599f, 0.922599f, 0.922599f, 0.922599f, 0.922598f, 0.922598f, 0.922598f,
-0.922597f, 0.922597f, 0.922597f, 0.922596f, 0.922596f, 0.922596f, 0.922595f, 0.922595f, 0.922594f, 0.922594f, 0.922593f, 0.922593f, 0.922593f, 0.922592f, 0.922592f, 0.922591f, 0.922591f, 0.92259f, 0.922589f, 0.922589f,
-0.922588f, 0.922588f, 0.922587f, 0.922587f, 0.922586f, 0.922585f, 0.922585f, 0.922584f, 0.922583f, 0.922583f, 0.922582f, 0.922581f, 0.922581f, 0.92258f, 0.922579f, 0.922579f, 0.922578f, 0.922577f, 0.922576f, 0.922575f,
-0.922575f, 0.922574f, 0.922573f, 0.922572f, 0.922571f, 0.922571f, 0.92257f, 0.922569f, 0.922568f, 0.922567f, 0.922566f, 0.922565f, 0.922564f, 0.922563f, 0.922562f, 0.922561f, 0.92256f, 0.922559f, 0.922558f, 0.922557f,
-0.922556f, 0.922555f, 0.922554f, 0.922553f, 0.922552f, 0.922551f, 0.92255f, 0.922549f, 0.922548f, 0.922547f, 0.922546f, 0.922544f, 0.922543f, 0.922542f, 0.922541f, 0.92254f, 0.922538f, 0.922537f, 0.922536f, 0.922535f,
-0.922534f, 0.922532f, 0.922531f, 0.92253f, 0.922528f, 0.922527f, 0.922526f, 0.922524f, 0.922523f, 0.922522f, 0.92252f, 0.922519f, 0.922518f, 0.922516f, 0.922515f, 0.922513f, 0.922512f, 0.92251f, 0.922509f, 0.922508f,
-0.922506f, 0.922505f, 0.922503f, 0.922502f, 0.9225f, 0.922498f, 0.922497f, 0.922495f, 0.922494f, 0.922492f, 0.922491f, 0.922489f, 0.922487f, 0.922486f, 0.922484f, 0.922482f, 0.922481f, 0.922479f, 0.922477f, 0.922476f,
-0.922474f, 0.922472f, 0.922471f, 0.922469f, 0.922467f, 0.922465f, 0.922463f, 0.922462f, 0.92246f, 0.922458f, 0.922456f, 0.922454f, 0.922453f, 0.922451f, 0.922449f, 0.922447f, 0.922445f, 0.922443f, 0.922441f, 0.922439f,
-0.922437f, 0.922435f, 0.922433f, 0.922431f, 0.922429f, 0.922427f, 0.922425f, 0.922423f, 0.922421f, 0.922419f, 0.922417f, 0.922415f, 0.922413f, 0.922411f, 0.922409f, 0.922407f, 0.922405f, 0.922403f, 0.9224f, 0.922398f,
-0.922396f, 0.922394f, 0.922392f, 0.92239f, 0.922387f, 0.922385f, 0.922383f, 0.922381f, 0.922378f, 0.922376f, 0.922374f, 0.922371f, 0.922369f, 0.922367f, 0.922365f, 0.922362f, 0.92236f, 0.922357f, 0.922355f, 0.922353f,
-0.92235f, 0.922348f, 0.922345f, 0.922343f, 0.922341f, 0.922338f, 0.922336f, 0.922333f, 0.922331f, 0.922328f, 0.922326f, 0.922323f, 0.922321f, 0.922318f, 0.922315f, 0.922313f, 0.92231f, 0.922308f, 0.922305f, 0.922302f,
-0.9223f, 0.922297f, 0.922295f, 0.922292f, 0.922289f, 0.922287f, 0.922284f, 0.922281f, 0.922278f, 0.922276f, 0.922273f, 0.92227f, 0.922267f, 0.922265f, 0.922262f, 0.922259f, 0.922256f, 0.922253f, 0.922251f, 0.922248f,
-0.922245f, 0.922242f, 0.922239f, 0.922236f, 0.922233f, 0.92223f, 0.922227f, 0.922224f, 0.922222f, 0.922219f, 0.922216f, 0.922213f, 0.92221f, 0.922207f, 0.922204f, 0.922201f, 0.922198f, 0.922194f, 0.922191f, 0.922188f,
-0.922185f, 0.922182f, 0.922179f, 0.922176f, 0.922173f, 0.92217f, 0.922166f, 0.922163f, 0.92216f, 0.922157f, 0.922154f, 0.92215f, 0.922147f, 0.922144f, 0.922141f, 0.922138f, 0.922134f, 0.922131f, 0.922128f, 0.922124f,
-0.922121f, 0.922118f, 0.922114f, 0.922111f, 0.922108f, 0.922104f, 0.922101f, 0.922097f, 0.922094f, 0.922091f, 0.922087f, 0.922084f, 0.92208f, 0.922077f, 0.922073f, 0.92207f, 0.922066f, 0.922063f, 0.922059f, 0.922056f,
-0.922052f, 0.922049f, 0.922045f, 0.922042f, 0.922038f, 0.922034f, 0.922031f, 0.922027f, 0.922023f, 0.92202f, 0.922016f, 0.922012f, 0.922009f, 0.922005f, 0.922001f, 0.921998f, 0.921994f, 0.92199f, 0.921986f, 0.921983f,
-0.921979f, 0.921975f, 0.921971f, 0.921967f, 0.921964f, 0.92196f, 0.921956f, 0.921952f, 0.921948f, 0.921944f, 0.92194f, 0.921937f, 0.921933f, 0.921929f, 0.921925f, 0.921921f, 0.921917f, 0.921913f, 0.921909f, 0.921905f,
-0.921901f, 0.921897f, 0.921893f, 0.921889f, 0.921885f, 0.921881f, 0.921877f, 0.921873f, 0.921868f, 0.921864f, 0.92186f, 0.921856f, 0.921852f, 0.921848f, 0.921844f, 0.921839f, 0.921835f, 0.921831f, 0.921827f, 0.921823f,
-0.921818f, 0.921814f, 0.92181f, 0.921806f, 0.921801f, 0.921797f, 0.921793f, 0.921788f, 0.921784f, 0.92178f, 0.921775f, 0.921771f, 0.921767f, 0.921762f, 0.921758f, 0.921753f, 0.921749f, 0.921745f, 0.92174f, 0.921736f,
-0.921731f, 0.921727f, 0.921722f, 0.921718f, 0.921713f, 0.921709f, 0.921704f, 0.9217f, 0.921695f, 0.921691f, 0.921686f, 0.921681f, 0.921677f, 0.921672f, 0.921668f, 0.921663f, 0.921658f, 0.921654f, 0.921649f, 0.921644f,
-0.92164f, 0.921635f, 0.92163f, 0.921625f, 0.921621f, 0.921616f, 0.921611f, 0.921606f, 0.921602f, 0.921597f, 0.921592f, 0.921587f, 0.921582f, 0.921577f, 0.921573f, 0.921568f, 0.921563f, 0.921558f, 0.921553f, 0.921548f,
-0.921543f, 0.921538f, 0.921533f, 0.921528f, 0.921523f, 0.921518f, 0.921513f, 0.921508f, 0.921503f, 0.921498f, 0.921493f, 0.921488f, 0.921483f, 0.921478f, 0.921473f, 0.921468f, 0.921463f, 0.921458f, 0.921453f, 0.921448f,
-0.921442f, 0.921437f, 0.921432f, 0.921427f, 0.921422f, 0.921416f, 0.921411f, 0.921406f, 0.921401f, 0.921395f, 0.92139f, 0.921385f, 0.92138f, 0.921374f, 0.921369f, 0.921364f, 0.921358f, 0.921353f, 0.921348f, 0.921342f,
-0.921337f, 0.921332f, 0.921326f, 0.921321f, 0.921315f, 0.92131f, 0.921304f, 0.921299f, 0.921293f, 0.921288f, 0.921282f, 0.921277f, 0.921271f, 0.921266f, 0.92126f, 0.921255f, 0.921249f, 0.921244f, 0.921238f, 0.921232f,
-0.921227f, 0.921221f, 0.921216f, 0.92121f, 0.921204f,