that it works! Added new TeensyVariablePlayback library.dev
parent
c9b90347d8
commit
66243bcd7b
@ -1,31 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.5) |
||||
project(teensy-variable-playback) |
||||
if (NOT DEFINED TEENSY_VERSION) |
||||
set(BUILD_FOR_LINUX 1) |
||||
add_definitions(-DBUILD_FOR_LINUX) |
||||
set(CMAKE_BUILD_TYPE Debug) |
||||
endif() |
||||
|
||||
if (NOT DEFINED BUILD_FOR_LINUX) |
||||
import_arduino_library(cores ${COREPATH} avr debug util) |
||||
import_arduino_library(SPI ${DEPSPATH}/SPI) |
||||
import_arduino_library(SdFat ${DEPSPATH}/SdFat/src common DigitalIO ExFatLib FatLib FsLib iostream SdCard SpiDriver) |
||||
import_arduino_library(SD ${DEPSPATH}/SD/src) |
||||
import_arduino_library(SerialFlash ${DEPSPATH}/SerialFlash util) |
||||
import_arduino_library(Wire ${DEPSPATH}/Wire utility) |
||||
import_arduino_library(arm_math ${DEPSPATH}/arm_math/src) |
||||
import_arduino_library(Audio ${DEPSPATH}/Audio utility) |
||||
import_arduino_library(LittleFS ${DEPSPATH}/LittleFS/src littlefs) |
||||
add_subdirectory(src) |
||||
add_subdirectory(examples) |
||||
else() |
||||
add_subdirectory(src) |
||||
add_subdirectory(test) |
||||
#add_subdirectory(extras/soundio/playqueue) |
||||
add_subdirectory(extras/soundio/save_raw) |
||||
add_subdirectory(extras/soundio/save_raw_sd) |
||||
add_subdirectory(extras/soundio/save_wav) |
||||
add_subdirectory(extras/soundio/sd_play_all) |
||||
add_subdirectory(extras/linux/array) |
||||
add_subdirectory(extras/linux/sd_raw) |
||||
endif() |
@ -1,21 +0,0 @@ |
||||
MIT License |
||||
|
||||
Copyright (c) 2020 Nic Newdigate |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
@ -1,291 +0,0 @@ |
||||
# variable rate playback for teensy audio library |
||||
[![Teensy 4.1](https://img.shields.io/badge/project-4.1-brightgreen.svg?label=Teensy&colorA=555555&colorB=ff8aff&logo=)](https://www.pjrc.com/store/teensy41.html) |
||||
[![lib-teensy41](https://github.com/newdigate/teensy-variable-playback/actions/workflows/teensy41_lib.yml/badge.svg)](https://github.com/newdigate/teensy-variable-playback/actions/workflows/teensy41_lib.yml) |
||||
[![Ubuntu-x64](https://github.com/newdigate/teensy-variable-playback/workflows/Ubuntu-x64/badge.svg)](https://github.com/newdigate/teensy-variable-playback/actions) |
||||
[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) |
||||
[![CMake](https://img.shields.io/badge/project-CMake-brightgreen.svg?label=built%20with&colorA=555555&colorB=8a8fff&logo=)](CMakelists.txt) |
||||
[![made-for-VSCode](https://img.shields.io/badge/Made%20for-VSCode-1f425f.svg)](https://code.visualstudio.com/) |
||||
[![Contributors](https://img.shields.io/github/contributors/newdigate/teensy-variable-playback)](https://github.com/newdigate/teensy-variable-playback/graphs/contributors) |
||||
[![Commits](https://img.shields.io/github/commit-activity/m/newdigate/teensy-variable-playback)](https://github.com/newdigate/teensy-variable-playback/graphs/contributors) |
||||
![s](https://img.shields.io/badge/dynamic/json?color=%23e85b46&label=Patreon&query=data.attributes.patron_count&suffix=%20patrons&url=https%3A%2F%2Fwww.patreon.com%2Fapi%2Fcampaigns%2F4105381) |
||||
|
||||
play 16-bit PCM raw or wav audio samples at variable playback rates on teensy |
||||
* **Note** : this library only works with signed 16-bit integer samples. Floating point samples will not play. |
||||
|
||||
* for best performance, use SDXC UHS 30MB/sec Application Performance Class 2 (A2) class micro sd-card. |
||||
* [sd classes on wikipedia](https://en.wikipedia.org/wiki/SD_card#cite_ref-93) |
||||
|
||||
## updates |
||||
* 26/02/2022: v1.0.16: |
||||
* add option for starting sample at begining or at loop start |
||||
``` c |
||||
typedef enum play_start { |
||||
play_start_sample, |
||||
play_start_loop, |
||||
}; |
||||
|
||||
wave.setPlayStart(play_start::play_start_loop); |
||||
``` |
||||
* 26/02/2022: v1.0.15: |
||||
* added support for dual playback head for seemless looping |
||||
* enable dual playback using linear crossfading |
||||
* set crossfade duration in number of samples |
||||
``` c |
||||
AudioPlaySdResmp wave; |
||||
wave.setUseDualPlaybackHead(true); |
||||
wave.setCrossfadeDurationInSamples(1000); |
||||
wave.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
wave.setLoopStart(0); |
||||
wave.setLoopFinish(3000); |
||||
``` |
||||
* 16/06/2022: v1.0.14: |
||||
* refactored code to generic classes |
||||
* improve memory leaks |
||||
* remove calls to StartUsingSPI(), StopUsingSPI(), __disable_irq(), __enable_irq() |
||||
* intergated with SerialFlash and LittleFS |
||||
* 25/09/2021: v1.0.13: positionMillis() implemented for AudioPlaySdResmp |
||||
* 25/08/2021: v1.0.12: Skip over RIFF tags in .wav header |
||||
* 12/08/2021: v1.0.11: When playing a mono sample, transmit on both channels (credit to @atoktoto) |
||||
* 28/07/2021: v1.0.10: Fix issues when starting playback in reverse |
||||
* 23/07/2021: v1.0.9: Fix issue which crashes teensy when playing multiple files from SD card using array of filenames |
||||
* 21/07/2021: v1.0.8: **Breaking changes** |
||||
* ```AudioPlaySdRawResmp``` and ```AudioPlaySdWaveResmp``` merged into a single class ```AudioPlaySdResmp``` |
||||
* ```play(...)``` method changed to ```playRaw(...)``` and ```playWav(...)```, specify number of channels in parameters of playRaw |
||||
* 13/07/2021: v1.0.7: added multi-channel resampling |
||||
* 07/07/2021: v1.0.6: changed to using optimised floating point interpolation, sounds much better |
||||
* 30/06/2021: v1.0.5: Optimised quadratic interpolation to use fixed pipeline of 4 samples and use integers instead of floating point |
||||
* 25/06/2021: Quadratic interpolation is now working, but is disabled by default |
||||
|
||||
## contents |
||||
* [code structure](#code-structure) |
||||
* [requirements](#requirements) |
||||
* [usage](#usage) |
||||
* [example usage](#example-usage) |
||||
|
||||
## code structure |
||||
| folder | target | description | |
||||
|--------|--------------------|------------------------------------------------------------------------------------------------------------------------| |
||||
| ```examples``` | ```teensy``` | basic example how to use | |
||||
| ```extras``` | ```linux``` | some utils to make life easier | |
||||
| ```src``` | ```teensy``` / ```linux``` | extends teensy audio library<br/> * adds ```AudioPlaySdResmp``` <br/> * adds ```AudioPlayArrayResmp``` | |
||||
| ```test``` | ```linux``` | unit tests that run on linux | |
||||
|
||||
## requirements |
||||
<details> |
||||
<summary>teensy 3.x & 4.x boards</summary> |
||||
|
||||
|
||||
<details> |
||||
<summary>with Teensyduino</summary> |
||||
|
||||
```Teensyduino```[^](https://www.pjrc.com/teensy/teensyduino.html) |
||||
* This library is built on top of teensy audio library, intended for use with Teensy 3.x and Teensy 4.x boards. |
||||
* Install using arduino/teensyduino library manager gui - search ```TeensyVariablePlayback``` |
||||
* ![install using arduino library manager](docs/InstallArduino.gif) |
||||
</details> |
||||
|
||||
|
||||
<details> |
||||
<summary>without Teensyduino (for development)</summary> |
||||
|
||||
```cmake``` ```gcc-arm-none-eabi```[^](https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/RC2.1) ```teensy-cmake-macros```[^](https://github.com/newdigate/teensy-cmake-macros) ```cores```[^](https://github.com/PaulStoffregen/cores) ```Audio```[^](https://github.com/PaulStoffregen/Audio) ```SD```[^](https://github.com/PaulStoffregen/SD/tree/Juse_Use_SdFat) ```Wire```[^](https://github.com/PaulStoffregen/Wire) ```SPI```[^](https://github.com/PaulStoffregen/SPI) ```SerialFlash```[^](https://github.com/PaulStoffregen/SerialFlash) ```arm_math```[^](https://github.com/PaulStoffregen/arm_math) ```SDFat```[^](https://github.com/greiman/SdFat) |
||||
* using [teensy-cmake-macros](https://github.com/newdigate/teensy-cmake-macros), this library can be compiled for teensy 3 and 4 boards without needing Teensyduino. This is mainly used to build the library when a commit is pushed, to verify there are no compile errors. |
||||
|
||||
|
||||
<details> |
||||
<summary>dependencies (click to expand image) </summary> |
||||
|
||||
![dependencies](docs/dependencies.png) |
||||
|
||||
<details> |
||||
<summary>graphvis (click to expand) </summary> |
||||
|
||||
```dot |
||||
graph G { |
||||
graph[rankdir="LR"] |
||||
"teensy variable playback" -- "teensy-cmake-macros" -- "cmake" [label="dev"] |
||||
"teensy-cmake-macros" -- "arm-none-eabi-gcc" [label="dev"] |
||||
"PaulStoffregen/Audio.git" -- "PaulStoffregen/cores.git" |
||||
"teensy variable playback" -- "PaulStoffregen/Audio.git" |
||||
"PaulStoffregen/Audio.git" -- "PaulStoffregen/SD.git@Juse_Use_SdFat" |
||||
"PaulStoffregen/SD.git@Juse_Use_SdFat" -- "PaulStoffregen/SPI.git" |
||||
"PaulStoffregen/SD.git@Juse_Use_SdFat" -- "greiman/SdFat.git" |
||||
"PaulStoffregen/Audio.git" -- "PaulStoffregen/Wire.git" |
||||
"PaulStoffregen/Audio.git" -- "PaulStoffregen/SerialFlash.git" |
||||
"PaulStoffregen/Audio.git" -- "PaulStoffregen/arm_math.git" |
||||
} |
||||
``` |
||||
</details> |
||||
|
||||
</details> |
||||
|
||||
|
||||
|
||||
</details> |
||||
|
||||
|
||||
|
||||
|
||||
</details> |
||||
|
||||
<details> |
||||
<summary>linux</summary> |
||||
You can run and test this code on your linux computer. You can write a teensy sketch, and with a few modifications, you can redirect the audio input and output to and from your soundcard. [Soundio](https://github.com/newdigate/teensy-audio-x86-stubs/tree/main/extras/soundio) bindings are optional, you can also run sketches and tests with no audio input or output. |
||||
You will need to install the following libraries. |
||||
|
||||
```cmake``` ```gcc or llvm``` ```teensy-x86-stubs```[^](https://github.com/newdigate/teensy-x86-stubs) ```teensy-audio-x86-stubs```[^](https://github.com/newdigate/teensy-audio-x86-stubs) ```teensy-x86-sd-stubs```[^](https://github.com/newdigate/teensy-x86-sd-stubs) ```boost-test``` |
||||
|
||||
* install boost unit-test library: |
||||
* linux: ```sudo apt-get install -yq libboost-test-dev``` |
||||
* macos: ```brew install boost``` |
||||
|
||||
</details> |
||||
|
||||
|
||||
## usage |
||||
<details> |
||||
<summary>Using with Teensyduino</summary> |
||||
|
||||
* To install the library, use the library manager in Teensyduino (search for ```TeensyVariablePlayback```). Teensyduino should already have all the necessary dependencies pre-installed. |
||||
|
||||
* Have a look at the examples in the file menu to get started... |
||||
</details> |
||||
|
||||
<details> |
||||
<summary>Developing with vscode</summary> |
||||
|
||||
* [Visual Studio Code](https://code.visualstudio.com) |
||||
|
||||
### clone repo |
||||
``` sh |
||||
> git clone https://github.com/newdigate/teensy-variable-playback.git |
||||
> cd teensy-variable-playback |
||||
``` |
||||
|
||||
## teensy build |
||||
You don't need to download or install Teensyduino or Arduino to build the library or examples. Just clone the cores library and any dependencies to a common folder, denoted by ```DEPSPATH``` (in this case ```/home/nic/teensy_libraries```). |
||||
<details> |
||||
<summary>clone dependencies (click to expand) </summary> |
||||
|
||||
``` sh |
||||
> cd /home/nic/teensy_libraries |
||||
> git clone https://github.com/PaulStoffregen/cores.git |
||||
> git clone https://github.com/PaulStoffregen/Audio.git |
||||
> git clone -b Juse_Use_SdFat https://github.com/PaulStoffregen/SD.git |
||||
> git clone https://github.com/PaulStoffregen/Wire.git |
||||
> git clone https://github.com/PaulStoffregen/SPI.git |
||||
> git clone https://github.com/PaulStoffregen/SerialFlash.git |
||||
> git clone https://github.com/PaulStoffregen/arm_math.git |
||||
> git clone https://github.com/greiman/SdFat.git |
||||
``` |
||||
|
||||
</details> |
||||
|
||||
<details> |
||||
<summary>update COMPILERPATH and DEPSPATH in cmake/toolchains/teensy41.cmake</summary> |
||||
|
||||
``` cmake |
||||
set(COMPILERPATH "/Applications/Arm/bin/") |
||||
set(DEPSPATH "/home/nic/teensy_libraries") |
||||
set(COREPATH "${DEPSPATH}/cores/teensy4/") |
||||
``` |
||||
|
||||
</details> |
||||
|
||||
<details> |
||||
<summary>build hex file</summary> |
||||
|
||||
* If you run the commands below from the root repository directory, it will build the teensy-variable-playback library and all the examples. |
||||
* If you run them from a sub-directory, it will build everything under the sub-directory. (You might need to adjust relative path in ```-DCMAKE_TOOLCHAIN_FILE:FILEPATH``` below) |
||||
``` sh |
||||
> cd /home/nic/teensy-variable-playback |
||||
> mkdir cmake-build-debug |
||||
> cd cmake-build-debug |
||||
> cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE:FILEPATH="../cmake/toolchains/teensy41.cmake" .. |
||||
> make |
||||
``` |
||||
|
||||
</details> |
||||
|
||||
## linux build |
||||
### build tests on linux |
||||
``` sh |
||||
> ./build-linux.sh |
||||
``` |
||||
|
||||
### build tests on win |
||||
``` sh |
||||
> mkdir cmake-build-debug |
||||
> cd cmake-build-debug |
||||
> cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE:FILEPATH="../cmake/toolchains/linux.cmake" .. |
||||
> make |
||||
``` |
||||
|
||||
### run tests |
||||
``` sh |
||||
> cmake-build-debug/test/test_suite1 |
||||
``` |
||||
|
||||
## visual studio code |
||||
* download vs code |
||||
* required extensions |
||||
* ms-vscode.cpptools |
||||
* optional extensions |
||||
* ms-vscode.cmake-tools |
||||
* hbenl.vscode-test-explorer |
||||
* ms-vscode.test-adapter-converter |
||||
* nicnewdigate.boost-test-adapter-debug |
||||
* open root folder of repository in visual studio code |
||||
* open terminal in visual studio code build, build as above |
||||
* (add breakpoint) |
||||
* launch |
||||
|
||||
</details> |
||||
|
||||
## example usage |
||||
|
||||
<details> |
||||
<summary>example (click to expand) </summary> |
||||
|
||||
```c++ |
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
// GUItool: begin automatically generated code |
||||
AudioPlayArrayResmp rraw_a1; //xy=321,513 |
||||
AudioOutputI2S i2s1; //xy=675,518 |
||||
AudioConnection patchCord1(rraw_a1, 0, i2s1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, i2s1, 1); |
||||
AudioControlSGTL5000 sgtl5000_1; //xy=521,588 |
||||
// GUItool: end automatically generated code |
||||
|
||||
unsigned char kick_raw[] = { |
||||
// ... little-endian 16-bit mono 44100 raw data, generated using linux cmd 'xxd -i kick.raw', raw file saved in Audacity |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
// ... continued ... |
||||
}; |
||||
unsigned int kick_raw_len = 6350; // length in bytes == numsamples * 2 |
||||
|
||||
void setup() { |
||||
AudioMemory(20); |
||||
sgtl5000_1.enable(); |
||||
sgtl5000_1.volume(0.5f, 0.5f); |
||||
rraw_a1.setPlaybackRate(0.5); |
||||
rraw_a1.enableInterpolation(true); |
||||
} |
||||
|
||||
void loop() { |
||||
if (!rraw_a1.isPlaying()) { |
||||
delay(1000); |
||||
rraw_a1.playRaw((int16_t *)kick_raw, kick_raw_len/2, 1); //note: we give number of samples - NOT number of bytes!!!! 1 is for mono (2 for stereo, etc) |
||||
} |
||||
} |
||||
``` |
||||
|
||||
</details> |
||||
|
||||
# credits |
||||
* convert boost test report to junit xml format: [Stuart Lange](https://stackoverflow.com/a/2975928/4634140) |
@ -1,6 +0,0 @@ |
||||
#!/bin/bash |
||||
rm -rf cmake-build-debug |
||||
mkdir cmake-build-debug |
||||
cd cmake-build-debug |
||||
cmake -DCMAKE_BUILD_TYPE=Debug .. |
||||
make |
@ -1,6 +0,0 @@ |
||||
#!/bin/bash |
||||
rm -rf cmake-build-debug |
||||
mkdir cmake-build-debug |
||||
cd cmake-build-debug |
||||
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE:FILEPATH="cmake/toolchains/teensy41.cmake" .. |
||||
make |
@ -1,31 +0,0 @@ |
||||
message("installing ardiuno library") |
||||
set(ARDUINO_LIBRARY_TARGET "~/Documents/Arduino/Libraries/teensy_variable_playback") |
||||
|
||||
get_filename_component(DIR_ONE_ABOVE ../../ ABSOLUTE) |
||||
message(STATUS ${DIR_ONE_ABOVE}) |
||||
set(ARDUINO_LIBRARY_SOURCE ${DIR_ONE_ABOVE}/src/) |
||||
set(INSTALL_ARDUINO_CMD "ln -s ${ARDUINO_LIBRARY_SOURCE} ${ARDUINO_LIBRARY_TARGET}") |
||||
set(UNINSTALL_ARDUINO_CMD "unlink ${ARDUINO_LIBRARY_TARGET}") |
||||
|
||||
message(${UNINSTALL_ARDUINO_CMD}) |
||||
exec_program( |
||||
${UNINSTALL_ARDUINO_CMD} |
||||
OUTPUT_VARIABLE stdout |
||||
RETURN_VALUE result |
||||
) |
||||
message(STATUS ${stdout}) |
||||
message(STATUS ${result}) |
||||
|
||||
message(${INSTALL_ARDUINO_CMD}) |
||||
exec_program( |
||||
${INSTALL_ARDUINO_CMD} |
||||
OUTPUT_VARIABLE stdout |
||||
RETURN_VALUE result |
||||
) |
||||
message(STATUS ${stdout}) |
||||
message(STATUS ${result}) |
||||
if (${result} STREQUAL 0) |
||||
message("Success...") |
||||
else() |
||||
message(FATAL_ERROR "Unable to create symbolic link in ${ARDUINO_LIBRARY_TARGET}") |
||||
endif() |
@ -1,9 +0,0 @@ |
||||
set(teensy_variable_playback_VERSION "@teensy_variable_playback_VERSION@") |
||||
set(teensy_variable_playback_LIBS teensy_variable_playback -L@LIB_INSTALL_DIR@) |
||||
|
||||
@PACKAGE_INIT@ |
||||
|
||||
set_and_check(teensy_variable_playback_INCLUDE_DIR "@INCLUDE_INSTALL_DIR@") |
||||
set_and_check(teensy_variable_playback_DIR "@LIB_INSTALL_DIR@") |
||||
|
||||
check_required_components(teensy_variable_playback) |
@ -1,11 +0,0 @@ |
||||
set(TEENSY_VERSION 41 CACHE STRING "Set to the Teensy version corresponding to your board (30 or 31 allowed)" FORCE) |
||||
set(CPU_CORE_SPEED 600000000 CACHE STRING "Set to 24000000, 48000000, 72000000 or 96000000 to set CPU core speed" FORCE) # Derived variables |
||||
set(CMAKE_EXE_LINKER_FLAGS "--specs=nosys.specs" CACHE INTERNAL "") |
||||
#teensy compiler options |
||||
set(COMPILERPATH "/opt/gcc-arm-none-eabi-9-2019-q4-major/bin/") |
||||
#set(COMPILERPATH "/Applications/ARM/bin/") |
||||
set(DEPSPATH "/home/runner/work/teensy-variable-playback/teensy-variable-playback/deps") |
||||
#set(DEPSPATH "/Users/nicholasnewdigate/Development/github/newdigate/temp_dep") |
||||
set(COREPATH "${DEPSPATH}/cores/teensy4/") |
||||
|
||||
find_package(teensy_cmake_macros) |
@ -1,24 +0,0 @@ |
||||
set(MANIFEST "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt") |
||||
|
||||
if(NOT EXISTS ${MANIFEST}) |
||||
message(FATAL_ERROR "Cannot find install manifest: '${MANIFEST}'") |
||||
endif() |
||||
|
||||
file(STRINGS ${MANIFEST} files) |
||||
foreach(file ${files}) |
||||
if(EXISTS ${file}) |
||||
message(STATUS "Removing file: '${file}'") |
||||
|
||||
exec_program( |
||||
${CMAKE_COMMAND} ARGS "-E remove ${file}" |
||||
OUTPUT_VARIABLE stdout |
||||
RETURN_VALUE result |
||||
) |
||||
|
||||
if(NOT "${result}" STREQUAL 0) |
||||
message(FATAL_ERROR "Failed to remove file: '${file}'.") |
||||
endif() |
||||
else() |
||||
MESSAGE(STATUS "File '${file}' does not exist.") |
||||
endif() |
||||
endforeach(file) |
Before Width: | Height: | Size: 826 KiB |
Before Width: | Height: | Size: 98 KiB |
@ -1,8 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.5) |
||||
add_subdirectory(array) |
||||
add_subdirectory(LittleFS) |
||||
add_subdirectory(sampleloader) |
||||
add_subdirectory(sd_play_all) |
||||
add_subdirectory(sd_raw) |
||||
add_subdirectory(sd_wav) |
||||
add_subdirectory(SerialFlash) |
@ -1,7 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sd_raw) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
add_definitions(-DPROG_FLASH_SIZE=10000) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(littlefs_raw littlefs_raw.ino) |
||||
teensy_target_link_libraries(littlefs_raw teensy_variable_playback SD SdFat Audio LittleFS SPI SerialFlash cores Wire arm_math) |
@ -1,95 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example requires an uSD-card inserted to teensy 3.6 with a file called DEMO.RAW
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <LittleFS.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
LittleFS_Program myfs; |
||||
#define PROG_FLASH_SIZE 1024 * 1024 * 1 // Specify size to use of onboard Teensy Program Flash chip
|
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayLfsResmp playLfsRaw1(myfs); //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playLfsRaw1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playLfsRaw1, 0, i2s2, 1); |
||||
AudioControlSGTL5000 audioShield; |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
|
||||
const char* _filename = "DEMO.RAW"; |
||||
const int analogInPin = A14; |
||||
unsigned long lastSamplePlayed = 0; |
||||
uint32_t diskSize; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
// see if the Flash is present and can be initialized:
|
||||
// lets check to see if the T4 is setup for security first
|
||||
#if ARDUINO_TEENSY40 |
||||
if ((IOMUXC_GPR_GPR11 & 0x100) == 0x100) { |
||||
//if security is active max disk size is 960x1024
|
||||
if (PROG_FLASH_SIZE > 960 * 1024) { |
||||
diskSize = 960 * 1024; |
||||
Serial.printf("Security Enables defaulted to %u bytes\n", diskSize); |
||||
} else { |
||||
diskSize = PROG_FLASH_SIZE; |
||||
Serial.printf("Security Not Enabled using %u bytes\n", diskSize); |
||||
} |
||||
} |
||||
#else |
||||
diskSize = PROG_FLASH_SIZE; |
||||
#endif |
||||
|
||||
// checks that the LittFS program has started with the disk size specified
|
||||
if (!myfs.begin(diskSize)) { |
||||
Serial.printf("Error starting %s\n", "PROGRAM FLASH DISK"); |
||||
while (1) { |
||||
// Error, so don't do anything more - stay stuck here
|
||||
} |
||||
} |
||||
Serial.println("LittleFS initialized."); |
||||
|
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playLfsRaw1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playLfsRaw1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
AudioMemory(24); |
||||
} |
||||
|
||||
void loop() { |
||||
|
||||
int newsensorValue = analogRead(analogInPin); |
||||
playLfsRaw1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!playLfsRaw1.isPlaying()) { |
||||
playLfsRaw1.playRaw(_filename, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
|
||||
namespace std { |
||||
void __throw_bad_function_call() {} |
||||
void __throw_length_error(char const*) {} |
||||
} |
@ -1,7 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(serialflash_raw) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
add_definitions(-DPROG_FLASH_SIZE=10000) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(serialflash serialflash.ino) |
||||
teensy_target_link_libraries(serialflash teensy_variable_playback Audio SerialFlash SPI cores Wire arm_math) |
@ -1,79 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example requires an uSD-card inserted to teensy 3.6 with a file called DEMO.RAW
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <SerialFlash.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
#define CSPIN 6 |
||||
|
||||
SerialFlashChip myfs; |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySerialFlashResmp playSerialFlash1(myfs); //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playSerialFlash1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playSerialFlash1, 0, i2s2, 1); |
||||
AudioControlSGTL5000 audioShield; |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
|
||||
const char* _filename = "DEMO.RAW"; |
||||
const int analogInPin = A14; |
||||
unsigned long lastSamplePlayed = 0; |
||||
uint32_t diskSize; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
|
||||
if (!SerialFlash.begin(CSPIN)) { |
||||
while (1) { |
||||
Serial.println(F("Unable to access SPI Flash chip")); |
||||
delay(1000); |
||||
} |
||||
} |
||||
Serial.println("SerialFlash initialized."); |
||||
|
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playSerialFlash1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSerialFlash1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
AudioMemory(24); |
||||
} |
||||
|
||||
void loop() { |
||||
|
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSerialFlash1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!playSerialFlash1.isPlaying()) { |
||||
playSerialFlash1.playRaw(_filename, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
|
||||
namespace std { |
||||
void __throw_bad_function_call() {} |
||||
void __throw_length_error(char const*) {} |
||||
} |
@ -1,6 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(array) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(array array.ino) |
||||
teensy_target_link_libraries(array Audio teensy_variable_playback cores arm_math SD SPI Wire SerialFlash ) |
@ -1,594 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=321,513
|
||||
AudioOutputI2S i2s1; //xy=675,518
|
||||
AudioConnection patchCord1(rraw_a1, 0, i2s1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, i2s1, 1); |
||||
AudioControlSGTL5000 sgtl5000_1; //xy=521,588
|
||||
// GUItool: end automatically generated code
|
||||
#define A14 10 |
||||
|
||||
extern unsigned int kick_raw_len; |
||||
extern unsigned char kick_raw[]; |
||||
unsigned long lastSamplePlayed = 0; |
||||
const int analogInPin = A14; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(9600); |
||||
sgtl5000_1.enable(); |
||||
sgtl5000_1.volume(0.5f, 0.5f); |
||||
|
||||
rraw_a1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
AudioMemory(20); |
||||
Serial.println("setup done"); |
||||
} |
||||
|
||||
void loop() { |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!rraw_a1.isPlaying()) { |
||||
rraw_a1.playRaw((int16_t *)kick_raw, kick_raw_len/2, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
//created using linux command xxd -i kick.raw (44100Hz little-endian 16-bit/sample )
|
||||
unsigned char kick_raw[] = { |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
0x51, 0x08, 0x01, 0x08, 0x25, 0x08, 0x70, 0x08, 0xc3, 0x08, 0x23, 0x09, |
||||
0x95, 0x09, 0x19, 0x0a, 0x83, 0x0a, 0x7e, 0x0a, 0xd0, 0x0a, 0x65, 0x0b, |
||||
0xf6, 0x0b, 0x89, 0x0c, 0xd1, 0x0c, 0xcf, 0x0c, 0x1a, 0x0d, 0xe5, 0x0d, |
||||
0x5e, 0x0e, 0xbb, 0x0e, 0xec, 0x0e, 0xd9, 0x0e, 0x07, 0x0f, 0xc8, 0x0f, |
||||
0x2a, 0x10, 0x04, 0x10, 0x28, 0x10, 0x54, 0x11, 0x8e, 0x13, 0x4b, 0x16, |
||||
0x09, 0x19, 0x91, 0x1b, 0xf7, 0x1d, 0x55, 0x20, 0xd1, 0x22, 0xcb, 0x25, |
||||
0x4d, 0x29, 0xa8, 0x2c, 0x7f, 0x2f, 0xda, 0x31, 0xac, 0x34, 0x0a, 0x3a, |
||||
0x24, 0x47, 0x9d, 0x5b, 0xe9, 0x67, 0x29, 0x67, 0x24, 0x66, 0x26, 0x66, |
||||
0xd2, 0x65, 0x9c, 0x65, 0x38, 0x65, 0x05, 0x65, 0x9f, 0x64, 0x64, 0x64, |
||||
0x12, 0x64, 0xce, 0x63, 0x7c, 0x63, 0x32, 0x63, 0xe6, 0x62, 0x97, 0x62, |
||||
0x49, 0x62, 0x01, 0x62, 0xb3, 0x61, 0x63, 0x61, 0x15, 0x61, 0xc4, 0x60, |
||||
0x75, 0x60, 0x20, 0x60, 0xce, 0x5f, 0x7a, 0x5f, 0x28, 0x5f, 0xd5, 0x5e, |
||||
0x81, 0x5e, 0x2d, 0x5e, 0xd3, 0x5d, 0x80, 0x5d, 0x2e, 0x5d, 0xe6, 0x5c, |
||||
0x1a, 0x5c, 0x16, 0x5a, 0x01, 0x58, 0xb9, 0x56, 0x6d, 0x55, 0xf4, 0x53, |
||||
0x49, 0x52, 0x83, 0x50, 0x87, 0x4e, 0x5f, 0x4c, 0x68, 0x4a, 0x5c, 0x48, |
||||
0x62, 0x46, 0x5a, 0x44, 0xe2, 0x41, 0x08, 0x3f, 0x1c, 0x3c, 0x44, 0x39, |
||||
0x35, 0x36, 0xcb, 0x32, 0xaf, 0x2f, 0xc8, 0x2c, 0xf8, 0x29, 0x55, 0x27, |
||||
0x6a, 0x24, 0x0f, 0x21, 0x5e, 0x1d, 0xc3, 0x19, 0x7b, 0x16, 0x71, 0x13, |
||||
0x6c, 0x10, 0x00, 0x0d, 0xd2, 0x08, 0x7f, 0x04, 0x7a, 0x01, 0x43, 0xff, |
||||
0xb9, 0xfc, 0xfa, 0xf9, 0x3b, 0xf7, 0xcb, 0xf4, 0x2b, 0xf2, 0x02, 0xef, |
||||
0x0c, 0xec, 0x3d, 0xe9, 0x21, 0xe6, 0xa6, 0xe2, 0x8a, 0xdf, 0x00, 0xdd, |
||||
0xbc, 0xda, 0x9e, 0xd8, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd2, 0xad, 0xd0, |
||||
0x5f, 0xce, 0xf0, 0xcb, 0xe9, 0xc9, 0x61, 0xc8, 0x75, 0xc7, 0x97, 0xc6, |
||||
0x3e, 0xc5, 0x07, 0xc4, 0x8e, 0xc3, 0x18, 0xc3, 0x3a, 0xc2, 0x15, 0xc1, |
||||
0x0e, 0xc0, 0xb3, 0xbf, 0xcf, 0xbf, 0xf8, 0xbf, 0xcc, 0xbf, 0x72, 0xbf, |
||||
0x41, 0xbf, 0x2b, 0xbf, 0xe2, 0xbe, 0x99, 0xbe, 0x4e, 0xbe, 0x0e, 0xbe, |
||||
0xcd, 0xbd, 0x7c, 0xbd, 0x8a, 0xbd, 0x88, 0xbd, 0x04, 0xbd, 0x0c, 0xbc, |
||||
0xb3, 0xbb, 0xf6, 0xbb, 0xf1, 0xbb, 0x12, 0xbc, 0x6f, 0xbc, 0xcb, 0xbc, |
||||
0xe4, 0xbc, 0x33, 0xbd, 0x1b, 0xbe, 0xac, 0xbe, 0x1e, 0xbf, 0x91, 0xbf, |
||||
0x50, 0xc0, 0x40, 0xc1, 0x3d, 0xc2, 0x32, 0xc3, 0xdf, 0xc3, 0xad, 0xc4, |
||||
0x77, 0xc5, 0xbe, 0xc6, 0xc7, 0xc8, 0x1d, 0xcb, 0x0e, 0xcd, 0x83, 0xce, |
||||
0xf1, 0xcf, 0xb4, 0xd1, 0x7d, 0xd3, 0x86, 0xd5, 0x89, 0xd7, 0xd2, 0xd9, |
||||
0x34, 0xdc, 0x28, 0xde, 0x23, 0xe0, 0x33, 0xe2, 0x0a, 0xe4, 0x59, 0xe5, |
||||
0xfc, 0xe6, 0x98, 0xe9, 0x30, 0xec, 0x91, 0xee, 0xc2, 0xf0, 0x0d, 0xf3, |
||||
0x35, 0xf5, 0xf3, 0xf6, 0xc4, 0xf8, 0xcb, 0xfa, 0xef, 0xfc, 0x65, 0xff, |
||||
0x05, 0x02, 0x7c, 0x04, 0xde, 0x06, 0x75, 0x09, 0x2b, 0x0c, 0x9b, 0x0e, |
||||
0xf3, 0x10, 0xb3, 0x13, 0x3a, 0x16, 0xeb, 0x18, 0x55, 0x1c, 0xad, 0x1f, |
||||
0xa8, 0x22, 0x54, 0x25, 0xae, 0x27, 0x33, 0x2a, 0x16, 0x2d, 0x36, 0x30, |
||||
0x84, 0x33, 0x94, 0x36, 0xbd, 0x38, 0xa2, 0x3a, 0x7d, 0x3c, 0x06, 0x3e, |
||||
0x24, 0x3f, 0x27, 0x40, 0x7c, 0x41, 0xef, 0x42, 0x14, 0x44, 0xeb, 0x44, |
||||
0x06, 0x46, 0x53, 0x47, 0x47, 0x48, 0x9b, 0x48, 0xaf, 0x48, 0xd7, 0x48, |
||||
0x4c, 0x49, 0xa0, 0x49, 0xbe, 0x49, 0xd4, 0x49, 0xfa, 0x49, 0x5e, 0x4a, |
||||
0xcc, 0x4a, 0x14, 0x4b, 0xfe, 0x4a, 0x22, 0x4b, 0x10, 0x4c, 0x0c, 0x4d, |
||||
0xb2, 0x4d, 0x4c, 0x4e, 0x3e, 0x4e, 0x77, 0x4d, 0x98, 0x4c, 0xf6, 0x4b, |
||||
0x67, 0x4b, 0xf0, 0x4a, 0x2a, 0x4a, 0xea, 0x48, 0x06, 0x48, 0x47, 0x47, |
||||
0xb2, 0x46, 0xda, 0x45, 0xad, 0x44, 0x5c, 0x43, 0x43, 0x42, 0x9e, 0x41, |
||||
0x0a, 0x41, 0x49, 0x40, 0xa6, 0x3f, 0x9d, 0x3e, 0x3c, 0x3d, 0xc6, 0x3b, |
||||
0xf6, 0x39, 0x87, 0x37, 0xf6, 0x34, 0x87, 0x32, 0x2b, 0x30, 0x6f, 0x2d, |
||||
0xfa, 0x2a, 0x3d, 0x29, 0x48, 0x27, 0xc2, 0x24, 0x49, 0x22, 0xca, 0x1f, |
||||
0xa0, 0x1c, 0x7c, 0x19, 0x06, 0x17, 0xbf, 0x14, 0x9f, 0x12, 0x96, 0x10, |
||||
0xf9, 0x0d, 0x3e, 0x0b, 0xe8, 0x08, 0x5c, 0x06, 0xe7, 0x02, 0x6e, 0xff, |
||||
0xca, 0xfc, 0x5b, 0xfa, 0xa0, 0xf7, 0xe9, 0xf4, 0x9c, 0xf2, 0x66, 0xf0, |
||||
0xaf, 0xed, 0xfd, 0xea, 0xcc, 0xe8, 0x6e, 0xe6, 0x82, 0xe3, 0x97, 0xe0, |
||||
0xed, 0xdd, 0x62, 0xdb, 0x7b, 0xd8, 0xd3, 0xd5, 0x5f, 0xd3, 0x1a, 0xd1, |
||||
0x44, 0xcf, 0xeb, 0xcd, 0x89, 0xcc, 0xca, 0xca, 0x4d, 0xc9, 0x35, 0xc8, |
||||
0x53, 0xc7, 0x0c, 0xc6, 0x06, 0xc4, 0xca, 0xc1, 0x09, 0xc0, 0x9c, 0xbe, |
||||
0xa8, 0xbd, 0xfd, 0xbc, 0xf2, 0xbb, 0x9b, 0xba, 0x20, 0xb9, 0xe4, 0xb7, |
||||
0xc1, 0xb6, 0xcd, 0xb5, 0x12, 0xb5, 0x55, 0xb4, 0xd1, 0xb3, 0x86, 0xb3, |
||||
0x19, 0xb3, 0xe8, 0xb2, 0xd7, 0xb2, 0x72, 0xb2, 0x27, 0xb2, 0xb7, 0xb1, |
||||
0x67, 0xb1, 0x65, 0xb1, 0xae, 0xb1, 0x6b, 0xb1, 0xf2, 0xb0, 0xeb, 0xb0, |
||||
0x0f, 0xb1, 0xfe, 0xb0, 0xeb, 0xb0, 0xcf, 0xb0, 0x94, 0xb0, 0x3e, 0xb0, |
||||
0x29, 0xb0, 0x56, 0xb0, 0x0c, 0xb0, 0xb7, 0xaf, 0xfb, 0xaf, 0x37, 0xb0, |
||||
0x96, 0xb0, 0x42, 0xb1, 0xe8, 0xb1, 0xb5, 0xb2, 0xc5, 0xb3, 0x93, 0xb4, |
||||
0x93, 0xb4, 0xee, 0xb4, 0x59, 0xb6, 0xca, 0xb7, 0x87, 0xb8, 0x6f, 0xb8, |
||||
0x33, 0xb8, 0xaf, 0xb8, 0x4a, 0xb9, 0x9d, 0xb9, 0xf2, 0xb9, 0x48, 0xba, |
||||
0xd0, 0xba, 0xe5, 0xbb, 0x4e, 0xbd, 0xaf, 0xbe, 0xe9, 0xbf, 0xba, 0xc1, |
||||
0xc2, 0xc3, 0x73, 0xc5, 0xa6, 0xc6, 0x6a, 0xc7, 0x83, 0xc8, 0x42, 0xca, |
||||
0xc8, 0xcb, 0x34, 0xcd, 0x94, 0xce, 0xcc, 0xcf, 0x31, 0xd1, 0x27, 0xd3, |
||||
0x8c, 0xd5, 0x61, 0xd7, 0x78, 0xd9, 0x3b, 0xdc, 0x40, 0xdf, 0xdd, 0xe1, |
||||
0x0c, 0xe4, 0xe4, 0xe5, 0xd0, 0xe7, 0x65, 0xea, 0xc9, 0xec, 0xd7, 0xee, |
||||
0xfc, 0xf0, 0x7c, 0xf3, 0xf6, 0xf5, 0x09, 0xf8, 0xde, 0xf9, 0xca, 0xfb, |
||||
0xac, 0xfd, 0xc3, 0xff, 0x33, 0x02, 0xb1, 0x04, 0x24, 0x07, 0x57, 0x09, |
||||
0x5f, 0x0b, 0xe6, 0x0d, 0xd1, 0x10, 0x6d, 0x13, 0x8f, 0x15, 0xfb, 0x17, |
||||
0x43, 0x1a, 0x8e, 0x1c, 0x1a, 0x1f, 0x69, 0x21, 0x80, 0x23, 0x74, 0x25, |
||||
0x62, 0x27, 0x07, 0x29, 0xa1, 0x2a, 0xa5, 0x2c, 0xdf, 0x2e, 0x57, 0x31, |
||||
0xff, 0x33, 0xd1, 0x36, 0x6e, 0x39, 0x8a, 0x3b, 0x58, 0x3d, 0x32, 0x3f, |
||||
0xc8, 0x40, 0x1b, 0x42, 0x22, 0x43, 0x1a, 0x44, 0x25, 0x45, 0xe5, 0x45, |
||||
0x43, 0x46, 0x9b, 0x46, 0x6a, 0x47, 0x6f, 0x48, 0x69, 0x49, 0x6f, 0x4a, |
||||
0xc7, 0x4b, 0x0e, 0x4d, 0x03, 0x4e, 0x78, 0x4e, 0xdf, 0x4e, 0x0b, 0x4f, |
||||
0xea, 0x4e, 0xcb, 0x4e, 0x1b, 0x4f, 0x6e, 0x4f, 0xc3, 0x4f, 0xdc, 0x4f, |
||||
0xcb, 0x4f, 0xd2, 0x4f, 0x16, 0x50, 0x24, 0x50, 0xf2, 0x4f, 0x00, 0x50, |
||||
0x37, 0x50, 0x4e, 0x50, 0x5e, 0x50, 0x7c, 0x50, 0xab, 0x50, 0x69, 0x50, |
||||
0xad, 0x4f, 0xa3, 0x4e, 0xe6, 0x4d, 0x42, 0x4d, 0xdc, 0x4c, 0x7c, 0x4c, |
||||
0xbe, 0x4b, 0x08, 0x4b, 0x7b, 0x4a, 0xe4, 0x49, 0x14, 0x49, 0x07, 0x48, |
||||
0x98, 0x46, 0x2f, 0x45, 0x16, 0x44, 0x23, 0x43, 0x55, 0x42, 0xac, 0x41, |
||||
0x06, 0x41, 0x4b, 0x40, 0x8f, 0x3f, 0xde, 0x3e, 0xe1, 0x3d, 0x75, 0x3c, |
||||
0xc0, 0x3a, 0xe4, 0x38, 0x83, 0x37, 0x9a, 0x36, 0xe5, 0x35, 0xc0, 0x34, |
||||
0xf9, 0x32, 0xe1, 0x30, 0xfa, 0x2e, 0xd4, 0x2c, 0x4d, 0x2a, 0xed, 0x27, |
||||
0xb9, 0x25, 0xb2, 0x23, 0x7d, 0x21, 0xfd, 0x1e, 0x89, 0x1c, 0x38, 0x1a, |
||||
0xe2, 0x17, 0x67, 0x15, 0xf3, 0x12, 0xb3, 0x10, 0x9e, 0x0e, 0x79, 0x0c, |
||||
0xea, 0x09, 0x54, 0x07, 0x26, 0x05, 0x0a, 0x03, 0xd7, 0x00, 0x98, 0xfe, |
||||
0x41, 0xfc, 0x8d, 0xf9, 0x3c, 0xf7, 0x4f, 0xf5, 0x73, 0xf3, 0x7b, 0xf1, |
||||
0x68, 0xef, 0x6f, 0xed, 0x7a, 0xeb, 0x87, 0xe9, 0x48, 0xe7, 0xc6, 0xe4, |
||||
0x65, 0xe2, 0xf6, 0xdf, 0x86, 0xdd, 0x9f, 0xdb, 0x1b, 0xda, 0xa6, 0xd8, |
||||
0xce, 0xd6, 0xe4, 0xd4, 0xe3, 0xd2, 0x84, 0xd0, 0xec, 0xcd, 0x08, 0xcc, |
||||
0x89, 0xca, 0x1b, 0xc9, 0xe2, 0xc7, 0x9d, 0xc6, 0xe5, 0xc4, 0x79, 0xc3, |
||||
0x6d, 0xc2, 0xe3, 0xc0, 0x3c, 0xbf, 0xd3, 0xbd, 0x41, 0xbc, 0xd2, 0xba, |
||||
0x6a, 0xb9, 0xa1, 0xb7, 0xa9, 0xb5, 0x47, 0xb4, 0x91, 0xb3, 0xd5, 0xb2, |
||||
0xb7, 0xb1, 0x51, 0xb0, 0x14, 0xaf, 0xf5, 0xad, 0x95, 0xac, 0x34, 0xab, |
||||
0x05, 0xaa, 0xe1, 0xa8, 0xb3, 0xa7, 0xd9, 0xa6, 0x25, 0xa6, 0x6e, 0xa5, |
||||
0x2b, 0xa5, 0x7b, 0xa5, 0x9a, 0xa5, 0x88, 0xa5, 0xc3, 0xa5, 0xe7, 0xa5, |
||||
0xaf, 0xa5, 0x8b, 0xa5, 0x80, 0xa5, 0x65, 0xa5, 0x8c, 0xa5, 0x7e, 0xa5, |
||||
0x22, 0xa5, 0x40, 0xa5, 0xed, 0xa5, 0x27, 0xa6, 0x2b, 0xa6, 0x1c, 0xa6, |
||||
0xe5, 0xa5, 0x7b, 0xa5, 0x45, 0xa5, 0x37, 0xa5, 0x04, 0xa5, 0x91, 0xa4, |
||||
0x8d, 0xa4, 0x2d, 0xa5, 0x9f, 0xa5, 0xf6, 0xa5, 0x7e, 0xa6, 0x34, 0xa7, |
||||
0x14, 0xa8, 0x7e, 0xa8, 0x87, 0xa8, 0xc4, 0xa8, 0x51, 0xa9, 0xec, 0xa9, |
||||
0x74, 0xaa, 0xf7, 0xaa, 0x40, 0xab, 0xd9, 0xab, 0xca, 0xac, 0x6b, 0xad, |
||||
0xb3, 0xad, 0x08, 0xae, 0x10, 0xaf, 0x2c, 0xb0, 0xcb, 0xb0, 0x23, 0xb1, |
||||
0xac, 0xb1, 0x0e, 0xb2, 0x42, 0xb2, 0xd7, 0xb2, 0xef, 0xb3, 0x21, 0xb5, |
||||
0x30, 0xb6, 0xe9, 0xb6, 0x54, 0xb7, 0xf0, 0xb7, 0x9e, 0xb8, 0x2e, 0xb9, |
||||
0x03, 0xba, 0x55, 0xbb, 0xdf, 0xbc, 0x5f, 0xbe, 0xb8, 0xbf, 0x01, 0xc1, |
||||
0x83, 0xc2, 0x0c, 0xc4, 0x65, 0xc5, 0x7e, 0xc6, 0x86, 0xc7, 0xba, 0xc8, |
||||
0x11, 0xca, 0x66, 0xcb, 0x28, 0xcd, 0x4d, 0xcf, 0x60, 0xd1, 0x69, 0xd3, |
||||
0x7b, 0xd5, 0x5f, 0xd7, 0xe3, 0xd8, 0xca, 0xda, 0xda, 0xdc, 0xda, 0xde, |
||||
0xab, 0xe0, 0x59, 0xe2, 0x3b, 0xe4, 0x21, 0xe6, 0xfc, 0xe7, 0xcb, 0xe9, |
||||
0xbe, 0xeb, 0x9c, 0xed, 0x47, 0xef, 0x0b, 0xf1, 0xd3, 0xf2, 0xbc, 0xf4, |
||||
0x9c, 0xf6, 0x67, 0xf8, 0x2a, 0xfa, 0xc1, 0xfb, 0x7f, 0xfd, 0x41, 0xff, |
||||
0x12, 0x01, 0xd2, 0x02, 0xfc, 0x04, 0xe8, 0x06, 0x9a, 0x08, 0x59, 0x0a, |
||||
0x48, 0x0c, 0x36, 0x0e, 0x37, 0x10, 0x36, 0x12, 0x59, 0x14, 0x62, 0x16, |
||||
0x86, 0x18, 0xb9, 0x1a, 0xc2, 0x1c, 0xcd, 0x1e, 0xf1, 0x20, 0x27, 0x23, |
||||
0x7a, 0x25, 0xf9, 0x27, 0x2a, 0x2a, 0x1f, 0x2c, 0xf8, 0x2d, 0xa3, 0x2f, |
||||
0x23, 0x31, 0xf4, 0x32, 0x2c, 0x35, 0x40, 0x37, 0x23, 0x39, 0xfe, 0x3a, |
||||
0x11, 0x3d, 0x2c, 0x3f, 0xe8, 0x40, 0x8c, 0x42, 0x55, 0x44, 0x37, 0x46, |
||||
0x99, 0x47, 0xcb, 0x48, 0x12, 0x4a, 0x60, 0x4b, 0x86, 0x4c, 0x9b, 0x4d, |
||||
0xc8, 0x4e, 0xec, 0x4f, 0xe3, 0x50, 0x8a, 0x51, 0x23, 0x52, 0xd8, 0x52, |
||||
0x68, 0x53, 0x9b, 0x53, 0xb1, 0x53, 0x11, 0x54, 0x94, 0x54, 0xf7, 0x54, |
||||
0x4f, 0x55, 0xa4, 0x55, 0x03, 0x56, 0x51, 0x56, 0x92, 0x56, 0xfa, 0x56, |
||||
0x59, 0x57, 0xad, 0x57, 0xcd, 0x57, 0xc5, 0x57, 0xa8, 0x57, 0x64, 0x57, |
||||
0x49, 0x57, 0x63, 0x57, 0x64, 0x57, 0x40, 0x57, 0xf6, 0x56, 0xfc, 0x56, |
||||
0x36, 0x57, 0x3b, 0x57, 0x1e, 0x57, 0x1c, 0x57, 0x03, 0x57, 0xee, 0x56, |
||||
0xa5, 0x56, 0x80, 0x56, 0xd4, 0x56, 0xe4, 0x56, 0x92, 0x56, 0xf0, 0x55, |
||||
0x02, 0x55, 0xab, 0x53, 0xb5, 0x52, 0x51, 0x52, 0x08, 0x52, 0x80, 0x51, |
||||
0xb4, 0x50, 0xde, 0x4f, 0x27, 0x4f, 0x63, 0x4e, 0x58, 0x4d, 0x72, 0x4c, |
||||
0x82, 0x4b, 0x81, 0x4a, 0x87, 0x49, 0xb4, 0x48, 0xb1, 0x47, 0x99, 0x46, |
||||
0xb4, 0x45, 0x34, 0x45, 0xb8, 0x44, 0x2f, 0x44, 0x7f, 0x43, 0xa0, 0x42, |
||||
0xcb, 0x41, 0xd1, 0x40, 0xeb, 0x3f, 0x28, 0x3f, 0x3d, 0x3e, 0x09, 0x3d, |
||||
0x9d, 0x3b, 0x40, 0x3a, 0x1c, 0x39, 0xeb, 0x37, 0xd1, 0x36, 0xb3, 0x35, |
||||
0x8b, 0x34, 0x0b, 0x33, 0x51, 0x31, 0xfb, 0x2f, 0xb9, 0x2e, 0x54, 0x2d, |
||||
0xaf, 0x2b, 0xdf, 0x29, 0xf1, 0x27, 0x3a, 0x26, 0x6f, 0x24, 0x56, 0x22, |
||||
0x20, 0x20, 0x0a, 0x1e, 0x3b, 0x1c, 0x55, 0x1a, 0x6c, 0x18, 0xaa, 0x16, |
||||
0xef, 0x14, 0x0a, 0x13, 0x17, 0x11, 0x1c, 0x0f, 0x22, 0x0d, 0x46, 0x0b, |
||||
0x53, 0x09, 0x46, 0x07, 0x46, 0x05, 0x4d, 0x03, 0x1a, 0x01, 0xd3, 0xfe, |
||||
0x94, 0xfc, 0x8c, 0xfa, 0x8f, 0xf8, 0xc1, 0xf6, 0x27, 0xf5, 0x8f, 0xf3, |
||||
0xf2, 0xf1, 0x74, 0xf0, 0xfa, 0xee, 0x4d, 0xed, 0x9e, 0xeb, 0xa2, 0xe9, |
||||
0x73, 0xe7, 0xa9, 0xe5, 0x2d, 0xe4, 0xa3, 0xe2, 0xf9, 0xe0, 0x50, 0xdf, |
||||
0xb9, 0xdd, 0x34, 0xdc, 0xad, 0xda, 0x0b, 0xd9, 0x77, 0xd7, 0xb9, 0xd5, |
||||
0x37, 0xd4, 0xff, 0xd2, 0x8a, 0xd1, 0x14, 0xd0, 0xba, 0xce, 0x7d, 0xcd, |
||||
0x2c, 0xcc, 0xa1, 0xca, 0x22, 0xc9, 0xa9, 0xc7, 0x0e, 0xc6, 0x66, 0xc4, |
||||
0xfc, 0xc2, 0xa5, 0xc1, 0x4a, 0xc0, 0xff, 0xbe, 0xf7, 0xbd, 0x0e, 0xbd, |
||||
0x1d, 0xbc, 0x16, 0xbb, 0xad, 0xb9, 0x44, 0xb8, 0xd7, 0xb6, 0x9e, 0xb5, |
||||
0x9f, 0xb4, 0x97, 0xb3, 0x72, 0xb2, 0x5f, 0xb1, 0x67, 0xb0, 0x89, 0xaf, |
||||
0x9d, 0xae, 0xbe, 0xad, 0x08, 0xad, 0x5d, 0xac, 0x8b, 0xab, 0xad, 0xaa, |
||||
0xe4, 0xa9, 0x59, 0xa9, 0xc4, 0xa8, 0x02, 0xa8, 0x4d, 0xa7, 0xc2, 0xa6, |
||||
0x4a, 0xa6, 0x09, 0xa6, 0xd2, 0xa5, 0x50, 0xa5, 0xec, 0xa4, 0xc2, 0xa4, |
||||
0xd9, 0xa4, 0xbd, 0xa4, 0x97, 0xa4, 0xa5, 0xa4, 0xbf, 0xa4, 0xb4, 0xa4, |
||||
0x8f, 0xa4, 0x31, 0xa4, 0x39, 0xa4, 0x7d, 0xa4, 0xab, 0xa4, 0xc7, 0xa4, |
||||
0xb3, 0xa4, 0xab, 0xa4, 0xca, 0xa4, 0x05, 0xa5, 0x1e, 0xa5, 0x2a, 0xa5, |
||||
0x2c, 0xa5, 0x18, 0xa5, 0x01, 0xa5, 0x33, 0xa5, 0x8c, 0xa5, 0xb2, 0xa5, |
||||
0x81, 0xa5, 0x5c, 0xa5, 0x6e, 0xa5, 0x79, 0xa5, 0x4e, 0xa5, 0x17, 0xa5, |
||||
0xff, 0xa4, 0x1c, 0xa5, 0x45, 0xa5, 0x8a, 0xa5, 0xbf, 0xa5, 0xdb, 0xa5, |
||||
0x41, 0xa6, 0xfb, 0xa6, 0xc6, 0xa7, 0x86, 0xa8, 0x29, 0xa9, 0x97, 0xa9, |
||||
0x27, 0xaa, 0xd7, 0xaa, 0x6d, 0xab, 0xf4, 0xab, 0x34, 0xac, 0x69, 0xac, |
||||
0xc6, 0xac, 0x37, 0xad, 0xaa, 0xad, 0x34, 0xae, 0xd3, 0xae, 0x81, 0xaf, |
||||
0x16, 0xb0, 0x72, 0xb0, 0xc8, 0xb0, 0x36, 0xb1, 0x91, 0xb1, 0xe0, 0xb1, |
||||
0x3b, 0xb2, 0x8e, 0xb2, 0xe0, 0xb2, 0x2a, 0xb3, 0xab, 0xb3, 0x3a, 0xb4, |
||||
0xf1, 0xb4, 0xc0, 0xb5, 0xae, 0xb6, 0x91, 0xb7, 0x82, 0xb8, 0x98, 0xb9, |
||||
0x8f, 0xba, 0x88, 0xbb, 0x65, 0xbc, 0x20, 0xbd, 0xcb, 0xbd, 0xaf, 0xbe, |
||||
0x94, 0xbf, 0x84, 0xc0, 0x85, 0xc1, 0x7b, 0xc2, 0x67, 0xc3, 0x66, 0xc4, |
||||
0x7f, 0xc5, 0x89, 0xc6, 0x6b, 0xc7, 0x38, 0xc8, 0x29, 0xc9, 0x4a, 0xca, |
||||
0x82, 0xcb, 0xc1, 0xcc, 0x12, 0xce, 0x5e, 0xcf, 0xb0, 0xd0, 0x25, 0xd2, |
||||
0x66, 0xd3, 0xde, 0xd4, 0x6c, 0xd6, 0x28, 0xd8, 0xd7, 0xd9, 0x80, 0xdb, |
||||
0xf7, 0xdc, 0x6f, 0xde, 0xd0, 0xdf, 0x22, 0xe1, 0x7a, 0xe2, 0xe5, 0xe3, |
||||
0x7a, 0xe5, 0xea, 0xe6, 0x51, 0xe8, 0xeb, 0xe9, 0x70, 0xeb, 0xb3, 0xec, |
||||
0x01, 0xee, 0x60, 0xef, 0xcb, 0xf0, 0x1d, 0xf2, 0x7b, 0xf3, 0xcf, 0xf4, |
||||
0x39, 0xf6, 0xc8, 0xf7, 0x82, 0xf9, 0x4a, 0xfb, 0xf2, 0xfc, 0x8c, 0xfe, |
||||
0x01, 0x00, 0x68, 0x01, 0x15, 0x03, 0xe6, 0x04, 0xbc, 0x06, 0x42, 0x08, |
||||
0xbb, 0x09, 0x2b, 0x0b, 0xc7, 0x0c, 0x35, 0x0e, 0x94, 0x0f, 0xf2, 0x10, |
||||
0x59, 0x12, 0xbc, 0x13, 0x34, 0x15, 0xac, 0x16, 0x1c, 0x18, 0x79, 0x19, |
||||
0xdc, 0x1a, 0x6d, 0x1c, 0x21, 0x1e, 0xca, 0x1f, 0x70, 0x21, 0x02, 0x23, |
||||
0x6c, 0x24, 0x9e, 0x25, 0x45, 0x27, 0x02, 0x29, 0x95, 0x2a, 0xff, 0x2b, |
||||
0x72, 0x2d, 0xe8, 0x2e, 0x48, 0x30, 0x7c, 0x31, 0xd2, 0x32, 0x3d, 0x34, |
||||
0xac, 0x35, 0x26, 0x37, 0xbc, 0x38, 0x4c, 0x3a, 0x90, 0x3b, 0xef, 0x3c, |
||||
0x61, 0x3e, 0xe8, 0x3f, 0x59, 0x41, 0xab, 0x42, 0xf7, 0x43, 0x2d, 0x45, |
||||
0x6c, 0x46, 0x78, 0x47, 0xb4, 0x48, 0x2e, 0x4a, 0x8e, 0x4b, 0xd7, 0x4c, |
||||
0xf4, 0x4d, 0xee, 0x4e, 0xcb, 0x4f, 0xc3, 0x50, 0xc2, 0x51, 0xac, 0x52, |
||||
0x61, 0x53, 0xf3, 0x53, 0xac, 0x54, 0x5f, 0x55, 0xf4, 0x55, 0x7f, 0x56, |
||||
0x04, 0x57, 0x9c, 0x57, 0x1f, 0x58, 0x7c, 0x58, 0xbc, 0x58, 0x0b, 0x59, |
||||
0x71, 0x59, 0xc1, 0x59, 0x0b, 0x5a, 0x3e, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, |
||||
0xa9, 0x5a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4c, 0x5a, 0x39, 0x5a, 0x32, 0x5a, |
||||
0x40, 0x5a, 0x33, 0x5a, 0x44, 0x5a, 0x58, 0x5a, 0x79, 0x5a, 0x7a, 0x5a, |
||||
0x69, 0x5a, 0x49, 0x5a, 0x54, 0x5a, 0x78, 0x5a, 0x72, 0x5a, 0x5f, 0x5a, |
||||
0x31, 0x5a, 0x11, 0x5a, 0xf9, 0x59, 0xea, 0x59, 0xd1, 0x59, 0xa1, 0x59, |
||||
0x48, 0x59, 0xf0, 0x58, 0xa2, 0x58, 0x6e, 0x58, 0x60, 0x58, 0x46, 0x58, |
||||
0x3f, 0x58, 0x47, 0x58, 0x40, 0x58, 0x08, 0x58, 0x9c, 0x57, 0x11, 0x57, |
||||
0x83, 0x56, 0xd7, 0x55, 0x42, 0x55, 0xab, 0x54, 0x06, 0x54, 0x63, 0x53, |
||||
0xa6, 0x52, 0xf0, 0x51, 0x55, 0x51, 0xbc, 0x50, 0x1e, 0x50, 0x8e, 0x4f, |
||||
0xf3, 0x4e, 0x34, 0x4e, 0x6b, 0x4d, 0xc9, 0x4c, 0x30, 0x4c, 0x7d, 0x4b, |
||||
0xd8, 0x4a, 0x49, 0x4a, 0xad, 0x49, 0x11, 0x49, 0x6c, 0x48, 0xa4, 0x47, |
||||
0xec, 0x46, 0x6c, 0x46, 0xde, 0x45, 0x5d, 0x45, 0xbc, 0x44, 0xf1, 0x43, |
||||
0x34, 0x43, 0x8c, 0x42, 0xf8, 0x41, 0x47, 0x41, 0x6a, 0x40, 0x72, 0x3f, |
||||
0x8b, 0x3e, 0xb3, 0x3d, 0xf2, 0x3c, 0x2f, 0x3c, 0x5c, 0x3b, 0x96, 0x3a, |
||||
0xbc, 0x39, 0xb2, 0x38, 0x91, 0x37, 0x8c, 0x36, 0x75, 0x35, 0x63, 0x34, |
||||
0x5e, 0x33, 0x63, 0x32, 0x4b, 0x31, 0x3c, 0x30, 0x1e, 0x2f, 0x07, 0x2e, |
||||
0xd0, 0x2c, 0xb2, 0x2b, 0x84, 0x2a, 0x4d, 0x29, 0xfc, 0x27, 0xa5, 0x26, |
||||
0x2f, 0x25, 0x95, 0x23, 0x1f, 0x22, 0xad, 0x20, 0x3a, 0x1f, 0x9e, 0x1d, |
||||
0x10, 0x1c, 0x6e, 0x1a, 0xe3, 0x18, 0x56, 0x17, 0xdb, 0x15, 0x58, 0x14, |
||||
0xba, 0x12, 0x2a, 0x11, 0x8b, 0x0f, 0xf4, 0x0d, 0x5b, 0x0c, 0xd3, 0x0a, |
||||
0x5f, 0x09, 0xe5, 0x07, 0x4a, 0x06, 0xc0, 0x04, 0x3e, 0x03, 0xb6, 0x01, |
||||
0x37, 0x00, 0xca, 0xfe, 0x74, 0xfd, 0x00, 0xfc, 0xa5, 0xfa, 0x4a, 0xf9, |
||||
0xd1, 0xf7, 0x7e, 0xf6, 0x1c, 0xf5, 0x9d, 0xf3, 0x4f, 0xf2, 0x0e, 0xf1, |
||||
0xc0, 0xef, 0x3a, 0xee, 0xd8, 0xec, 0x69, 0xeb, 0x0c, 0xea, 0xad, 0xe8, |
||||
0x56, 0xe7, 0xf8, 0xe5, 0xbe, 0xe4, 0x98, 0xe3, 0x61, 0xe2, 0x03, 0xe1, |
||||
0x99, 0xdf, 0x4d, 0xde, 0x0e, 0xdd, 0xde, 0xdb, 0xad, 0xda, 0x84, 0xd9, |
||||
0x62, 0xd8, 0x32, 0xd7, 0x01, 0xd6, 0xb7, 0xd4, 0x87, 0xd3, 0x97, 0xd2, |
||||
0x89, 0xd1, 0x89, 0xd0, 0x6e, 0xcf, 0x65, 0xce, 0x5d, 0xcd, 0x44, 0xcc, |
||||
0x13, 0xcb, 0xf2, 0xc9, 0xd3, 0xc8, 0xad, 0xc7, 0x9b, 0xc6, 0x94, 0xc5, |
||||
0x8e, 0xc4, 0x7b, 0xc3, 0x92, 0xc2, 0xad, 0xc1, 0xb2, 0xc0, 0xb9, 0xbf, |
||||
0xb3, 0xbe, 0xc0, 0xbd, 0xd5, 0xbc, 0xf2, 0xbb, 0xe1, 0xba, 0xc7, 0xb9, |
||||
0xc7, 0xb8, 0xe8, 0xb7, 0x09, 0xb7, 0x2c, 0xb6, 0x66, 0xb5, 0xb1, 0xb4, |
||||
0xf6, 0xb3, 0x32, 0xb3, 0x53, 0xb2, 0x92, 0xb1, 0xdb, 0xb0, 0x0d, 0xb0, |
||||
0x46, 0xaf, 0x62, 0xae, 0x98, 0xad, 0xd1, 0xac, 0x3f, 0xac, 0xb0, 0xab, |
||||
0x34, 0xab, 0xb1, 0xaa, 0x45, 0xaa, 0xda, 0xa9, 0x6a, 0xa9, 0xf1, 0xa8, |
||||
0x7d, 0xa8, 0x04, 0xa8, 0xbb, 0xa7, 0x80, 0xa7, 0x41, 0xa7, 0x02, 0xa7, |
||||
0xb6, 0xa6, 0x68, 0xa6, 0x3b, 0xa6, 0x1c, 0xa6, 0x0d, 0xa6, 0xfc, 0xa5, |
||||
0xd4, 0xa5, 0xa6, 0xa5, 0x81, 0xa5, 0x76, 0xa5, 0x61, 0xa5, 0x54, 0xa5, |
||||
0x48, 0xa5, 0x47, 0xa5, 0x4b, 0xa5, 0x49, 0xa5, 0x38, 0xa5, 0x4b, 0xa5, |
||||
0x6c, 0xa5, 0xa3, 0xa5, 0xda, 0xa5, 0xfe, 0xa5, 0x21, 0xa6, 0x4a, 0xa6, |
||||
0x8a, 0xa6, 0xb4, 0xa6, 0xe0, 0xa6, 0xf3, 0xa6, 0x1b, 0xa7, 0x17, 0xa7, |
||||
0x40, 0xa7, 0x8e, 0xa7, 0xcd, 0xa7, 0x06, 0xa8, 0x3e, 0xa8, 0x86, 0xa8, |
||||
0xbd, 0xa8, 0xde, 0xa8, 0xf6, 0xa8, 0x1c, 0xa9, 0x49, 0xa9, 0x5c, 0xa9, |
||||
0x79, 0xa9, 0x93, 0xa9, 0xab, 0xa9, 0xe6, 0xa9, 0x2c, 0xaa, 0x82, 0xaa, |
||||
0xbc, 0xaa, 0xec, 0xaa, 0x32, 0xab, 0x69, 0xab, 0xa7, 0xab, 0xde, 0xab, |
||||
0x19, 0xac, 0x53, 0xac, 0xbb, 0xac, 0x14, 0xad, 0x8a, 0xad, 0xeb, 0xad, |
||||
0x6c, 0xae, 0xe1, 0xae, 0x62, 0xaf, 0xd9, 0xaf, 0x58, 0xb0, 0xc0, 0xb0, |
||||
0x36, 0xb1, 0x99, 0xb1, 0x11, 0xb2, 0x71, 0xb2, 0xdc, 0xb2, 0x58, 0xb3, |
||||
0xbb, 0xb3, 0x37, 0xb4, 0xb6, 0xb4, 0x46, 0xb5, 0xca, 0xb5, 0x50, 0xb6, |
||||
0xd9, 0xb6, 0x6c, 0xb7, 0x03, 0xb8, 0x7e, 0xb8, 0xf0, 0xb8, 0x64, 0xb9, |
||||
0xcf, 0xb9, 0x47, 0xba, 0xd3, 0xba, 0x60, 0xbb, 0xe8, 0xbb, 0x70, 0xbc, |
||||
0xf3, 0xbc, 0x82, 0xbd, 0x05, 0xbe, 0xa1, 0xbe, 0x2a, 0xbf, 0xae, 0xbf, |
||||
0x25, 0xc0, 0xac, 0xc0, 0x52, 0xc1, 0xde, 0xc1, 0x75, 0xc2, 0x11, 0xc3, |
||||
0xb5, 0xc3, 0x42, 0xc4, 0xc5, 0xc4, 0x6d, 0xc5, 0x0b, 0xc6, 0xb2, 0xc6, |
||||
0x4b, 0xc7, 0xf6, 0xc7, 0x9b, 0xc8, 0x4f, 0xc9, 0x17, 0xca, 0xf3, 0xca, |
||||
0xc6, 0xcb, 0x9a, 0xcc, 0x7b, 0xcd, 0x54, 0xce, 0x32, 0xcf, 0x09, 0xd0, |
||||
0xd7, 0xd0, 0xc9, 0xd1, 0xc1, 0xd2, 0xb8, 0xd3, 0xb6, 0xd4, 0xae, 0xd5, |
||||
0xbc, 0xd6, 0xca, 0xd7, 0xd2, 0xd8, 0xca, 0xd9, 0xbd, 0xda, 0xc8, 0xdb, |
||||
0xd8, 0xdc, 0xf9, 0xdd, 0x08, 0xdf, 0x1e, 0xe0, 0x39, 0xe1, 0x4e, 0xe2, |
||||
0x60, 0xe3, 0x7a, 0xe4, 0x96, 0xe5, 0xc1, 0xe6, 0xde, 0xe7, 0x0e, 0xe9, |
||||
0x2a, 0xea, 0x42, 0xeb, 0x7a, 0xec, 0x9f, 0xed, 0xbb, 0xee, 0xd6, 0xef, |
||||
0xef, 0xf0, 0x0e, 0xf2, 0x30, 0xf3, 0x55, 0xf4, 0x68, 0xf5, 0x7e, 0xf6, |
||||
0xa4, 0xf7, 0xc0, 0xf8, 0xea, 0xf9, 0x10, 0xfb, 0x41, 0xfc, 0x7d, 0xfd, |
||||
0xad, 0xfe, 0xe3, 0xff, 0x10, 0x01, 0x27, 0x02, 0x58, 0x03, 0x74, 0x04, |
||||
0xa4, 0x05, 0xd5, 0x06, 0x0b, 0x08, 0x36, 0x09, 0x5c, 0x0a, 0x76, 0x0b, |
||||
0x9a, 0x0c, 0xc1, 0x0d, 0xd8, 0x0e, 0xf5, 0x0f, 0x15, 0x11, 0x3f, 0x12, |
||||
0x70, 0x13, 0x8e, 0x14, 0xcc, 0x15, 0xf2, 0x16, 0x31, 0x18, 0x4b, 0x19, |
||||
0x82, 0x1a, 0xa1, 0x1b, 0xbc, 0x1c, 0xde, 0x1d, 0xe9, 0x1e, 0x13, 0x20, |
||||
0x33, 0x21, 0x6c, 0x22, 0x80, 0x23, 0xa7, 0x24, 0xbc, 0x25, 0xde, 0x26, |
||||
0xe7, 0x27, 0x07, 0x29, 0x28, 0x2a, 0x36, 0x2b, 0x4d, 0x2c, 0x71, 0x2d, |
||||
0x91, 0x2e, 0xbe, 0x2f, 0xd6, 0x30, 0xfb, 0x31, 0x20, 0x33, 0x46, 0x34, |
||||
0x59, 0x35, 0x7a, 0x36, 0xa1, 0x37, 0xc2, 0x38, 0xdf, 0x39, 0x01, 0x3b, |
||||
0x0f, 0x3c, 0x27, 0x3d, 0x1f, 0x3e, 0x2e, 0x3f, 0x43, 0x40, 0x5b, 0x41, |
||||
0x73, 0x42, 0x8e, 0x43, 0xaf, 0x44, 0xbc, 0x45, 0xcc, 0x46, 0xd8, 0x47, |
||||
0xec, 0x48, 0xe1, 0x49, 0xd1, 0x4a, 0xc4, 0x4b, 0xb6, 0x4c, 0xa9, 0x4d, |
||||
0x9d, 0x4e, 0x88, 0x4f, 0x75, 0x50, 0x4c, 0x51, 0x3b, 0x52, 0x05, 0x53, |
||||
0xd9, 0x53, 0xa1, 0x54, 0x6f, 0x55, 0x33, 0x56, 0xe5, 0x56, 0x7d, 0x57, |
||||
0x15, 0x58, 0xb3, 0x58, 0x4e, 0x59, 0xdb, 0x59, 0x55, 0x5a, 0xc8, 0x5a, |
||||
0x36, 0x5b, 0xa9, 0x5b, 0x09, 0x5c, 0x5a, 0x5c, 0xab, 0x5c, 0xf1, 0x5c, |
||||
0x34, 0x5d, 0x6a, 0x5d, 0x9e, 0x5d, 0xc1, 0x5d, 0xea, 0x5d, 0x0b, 0x5e, |
||||
0x28, 0x5e, 0x3d, 0x5e, 0x41, 0x5e, 0x51, 0x5e, 0x5f, 0x5e, 0x69, 0x5e, |
||||
0x79, 0x5e, 0x6a, 0x5e, 0x78, 0x5e, 0x76, 0x5e, 0x7f, 0x5e, 0x72, 0x5e, |
||||
0x70, 0x5e, 0x61, 0x5e, 0x61, 0x5e, 0x42, 0x5e, 0x36, 0x5e, 0x2f, 0x5e, |
||||
0x2c, 0x5e, 0x1a, 0x5e, 0xec, 0x5d, 0xbf, 0x5d, 0x94, 0x5d, 0x71, 0x5d, |
||||
0x4c, 0x5d, 0x24, 0x5d, 0xfa, 0x5c, 0xc3, 0x5c, 0x8c, 0x5c, 0x59, 0x5c, |
||||
0x3e, 0x5c, 0x0c, 0x5c, 0xd3, 0x5b, 0xb1, 0x5b, 0x78, 0x5b, 0x45, 0x5b, |
||||
0x14, 0x5b, 0xed, 0x5a, 0xc0, 0x5a, 0x89, 0x5a, 0x4f, 0x5a, 0x16, 0x5a, |
||||
0xe5, 0x59, 0xb5, 0x59, 0x84, 0x59, 0x4e, 0x59, 0x0d, 0x59, 0xcf, 0x58, |
||||
0xa6, 0x58, 0x79, 0x58, 0x3e, 0x58, 0xf8, 0x57, 0xc0, 0x57, 0x83, 0x57, |
||||
0x38, 0x57, 0x03, 0x57, 0xc1, 0x56, 0x65, 0x56, 0xe0, 0x55, 0x52, 0x55, |
||||
0xd0, 0x54, 0x4c, 0x54, 0xbe, 0x53, 0x32, 0x53, 0xa7, 0x52, 0x2a, 0x52, |
||||
0x95, 0x51, 0x09, 0x51, 0x76, 0x50, 0xe9, 0x4f, 0x69, 0x4f, 0xe2, 0x4e, |
||||
0x49, 0x4e, 0xc0, 0x4d, 0x38, 0x4d, 0xbd, 0x4c, 0x2d, 0x4c, 0x98, 0x4b, |
||||
0x07, 0x4b, 0x76, 0x4a, 0xdc, 0x49, 0x4a, 0x49, 0xb9, 0x48, 0x2d, 0x48, |
||||
0x9c, 0x47, 0x19, 0x47, 0x80, 0x46, 0xf9, 0x45, 0x66, 0x45, 0xd6, 0x44, |
||||
0x47, 0x44, 0xb5, 0x43, 0x14, 0x43, 0x74, 0x42, 0xd4, 0x41, 0x42, 0x41, |
||||
0xa4, 0x40, 0x18, 0x40, 0x85, 0x3f, 0xeb, 0x3e, 0x52, 0x3e, 0xb2, 0x3d, |
||||
0x0c, 0x3d, 0x7a, 0x3c, 0xdb, 0x3b, 0x3a, 0x3b, 0x87, 0x3a, 0xe0, 0x39, |
||||
0x29, 0x39, 0x88, 0x38, 0xd1, 0x37, 0x16, 0x37, 0x4d, 0x36, 0x9e, 0x35, |
||||
0xdc, 0x34, 0x19, 0x34, 0x4a, 0x33, 0x83, 0x32, 0xb7, 0x31, 0xec, 0x30, |
||||
0x1c, 0x30, 0x47, 0x2f, 0x71, 0x2e, 0x88, 0x2d, 0xa6, 0x2c, 0xbb, 0x2b, |
||||
0xd0, 0x2a, 0xd8, 0x29, 0xdb, 0x28, 0xe3, 0x27, 0xf5, 0x26, 0xf1, 0x25, |
||||
0xf8, 0x24, 0xdc, 0x23, 0xdb, 0x22, 0xca, 0x21, 0xa7, 0x20, 0x85, 0x1f, |
||||
0x5a, 0x1e, 0x30, 0x1d, 0x0a, 0x1c, 0xd5, 0x1a, 0xa6, 0x19, 0x6d, 0x18, |
||||
0x3d, 0x17, 0xff, 0x15, 0xbf, 0x14, 0x81, 0x13, 0x57, 0x12, 0x15, 0x11, |
||||
0xe0, 0x0f, 0xa2, 0x0e, 0x65, 0x0d, 0x27, 0x0c, 0xf1, 0x0a, 0xb2, 0x09, |
||||
0x77, 0x08, 0x4b, 0x07, 0x0a, 0x06, 0xc9, 0x04, 0x97, 0x03, 0x65, 0x02, |
||||
0x3b, 0x01, 0x03, 0x00, 0xd2, 0xfe, 0x95, 0xfd, 0x6f, 0xfc, 0x50, 0xfb, |
||||
0x19, 0xfa, 0xf0, 0xf8, 0xb8, 0xf7, 0x97, 0xf6, 0x65, 0xf5, 0x48, 0xf4, |
||||
0x24, 0xf3, 0xfe, 0xf1, 0xec, 0xf0, 0xd2, 0xef, 0xa9, 0xee, 0x95, 0xed, |
||||
0x76, 0xec, 0x64, 0xeb, 0x61, 0xea, 0x43, 0xe9, 0x3a, 0xe8, 0x21, 0xe7, |
||||
0x14, 0xe6, 0xff, 0xe4, 0x06, 0xe4, 0x04, 0xe3, 0x04, 0xe2, 0x01, 0xe1, |
||||
0x02, 0xe0, 0x04, 0xdf, 0x16, 0xde, 0x1f, 0xdd, 0x29, 0xdc, 0x2d, 0xdb, |
||||
0x3d, 0xda, 0x45, 0xd9, 0x5a, 0xd8, 0x6f, 0xd7, 0x74, 0xd6, 0x8a, 0xd5, |
||||
0x91, 0xd4, 0xa5, 0xd3, 0xbb, 0xd2, 0xdb, 0xd1, 0x01, 0xd1, 0x17, 0xd0, |
||||
0x42, 0xcf, 0x5e, 0xce, 0x94, 0xcd, 0xb1, 0xcc, 0xe8, 0xcb, 0x04, 0xcb, |
||||
0x29, 0xca, 0x4e, 0xc9, 0x78, 0xc8, 0x99, 0xc7, 0xc4, 0xc6, 0xff, 0xc5, |
||||
0x3d, 0xc5, 0x76, 0xc4, 0xa6, 0xc3, 0xe4, 0xc2, 0x17, 0xc2, 0x4e, 0xc1, |
||||
0x8a, 0xc0, 0xc5, 0xbf, 0x0b, 0xbf, 0x42, 0xbe, 0x8e, 0xbd, 0xd8, 0xbc, |
||||
0x20, 0xbc, 0x60, 0xbb, 0xbb, 0xba, 0x08, 0xba, 0x5a, 0xb9, 0xba, 0xb8, |
||||
0x08, 0xb8, 0x64, 0xb7, 0xb1, 0xb6, 0x0c, 0xb6, 0x5d, 0xb5, 0xbf, 0xb4, |
||||
0x10, 0xb4, 0x7b, 0xb3, 0xd0, 0xb2, 0x3d, 0xb2, 0xa1, 0xb1, 0x0f, 0xb1, |
||||
0x84, 0xb0, 0xf2, 0xaf, 0x63, 0xaf, 0xd3, 0xae, 0x50, 0xae, 0xbd, 0xad, |
||||
0x49, 0xad, 0xc1, 0xac, 0x4d, 0xac, 0xc6, 0xab, 0x56, 0xab, 0xe4, 0xaa, |
||||
0x83, 0xaa, 0x0d, 0xaa, 0xac, 0xa9, 0x49, 0xa9, 0xf3, 0xa8, 0x9e, 0xa8, |
||||
0x4e, 0xa8, 0x07, 0xa8, 0xc5, 0xa7, 0x8d, 0xa7, 0x56, 0xa7, 0x1d, 0xa7, |
||||
0xf6, 0xa6, 0xc7, 0xa6, 0xad, 0xa6, 0x8c, 0xa6, 0x74, 0xa6, 0x58, 0xa6, |
||||
0x47, 0xa6, 0x2d, 0xa6, 0x24, 0xa6, 0x23, 0xa6, 0x21, 0xa6, 0x19, 0xa6, |
||||
0x20, 0xa6, 0x1f, 0xa6, 0x28, 0xa6, 0x3c, 0xa6, 0x4e, 0xa6, 0x59, 0xa6, |
||||
0x6e, 0xa6, 0x84, 0xa6, 0x9a, 0xa6, 0xb7, 0xa6, 0xd4, 0xa6, 0xef, 0xa6, |
||||
0x0a, 0xa7, 0x2f, 0xa7, 0x53, 0xa7, 0x77, 0xa7, 0x9c, 0xa7, 0xbc, 0xa7, |
||||
0xe5, 0xa7, 0x10, 0xa8, 0x35, 0xa8, 0x6d, 0xa8, 0x9b, 0xa8, 0xcb, 0xa8, |
||||
0xf5, 0xa8, 0x23, 0xa9, 0x5a, 0xa9, 0x80, 0xa9, 0xb7, 0xa9, 0xee, 0xa9, |
||||
0x1c, 0xaa, 0x46, 0xaa, 0x78, 0xaa, 0xb2, 0xaa, 0xeb, 0xaa, 0x1a, 0xab, |
||||
0x57, 0xab, 0x84, 0xab, 0xba, 0xab, 0xef, 0xab, 0x22, 0xac, 0x55, 0xac, |
||||
0x88, 0xac, 0xc1, 0xac, 0xf5, 0xac, 0x2a, 0xad, 0x67, 0xad, 0x9f, 0xad, |
||||
0xe0, 0xad, 0x14, 0xae, 0x4c, 0xae, 0x82, 0xae, 0xb8, 0xae, 0xf8, 0xae, |
||||
0x2c, 0xaf, 0x6a, 0xaf, 0x9d, 0xaf, 0xd4, 0xaf, 0x05, 0xb0, 0x38, 0xb0, |
||||
0x77, 0xb0, 0xb2, 0xb0, 0xf8, 0xb0, 0x3c, 0xb1, 0x97, 0xb1, 0x05, 0xb2, |
||||
0x6f, 0xb2, 0xdf, 0xb2, 0x48, 0xb3, 0xb2, 0xb3, 0x16, 0xb4, 0x7b, 0xb4, |
||||
0xe5, 0xb4, 0x54, 0xb5, 0xc3, 0xb5, 0x26, 0xb6, 0x97, 0xb6, 0x03, 0xb7, |
||||
0x68, 0xb7, 0xce, 0xb7, 0x44, 0xb8, 0xae, 0xb8, 0x20, 0xb9, 0x87, 0xb9, |
||||
0xf1, 0xb9, 0x5d, 0xba, 0xc6, 0xba, 0x24, 0xbb, 0xa1, 0xbb, 0x05, 0xbc, |
||||
0x79, 0xbc, 0xdc, 0xbc, 0x4b, 0xbd, 0xba, 0xbd, 0x24, 0xbe, 0x9b, 0xbe, |
||||
0x07, 0xbf, 0x72, 0xbf, 0xe5, 0xbf, 0x46, 0xc0, 0xc3, 0xc0, 0x1f, 0xc1, |
||||
0x91, 0xc1, 0x01, 0xc2, 0x79, 0xc2, 0xf1, 0xc2, 0x66, 0xc3, 0xe5, 0xc3, |
||||
0x55, 0xc4, 0xc8, 0xc4, 0x3e, 0xc5, 0xb3, 0xc5, 0x2d, 0xc6, 0xa7, 0xc6, |
||||
0x27, 0xc7, 0x97, 0xc7, 0x1f, 0xc8, 0xa0, 0xc8, 0x29, 0xc9, 0xad, 0xc9, |
||||
0x36, 0xca, 0xad, 0xca, 0x3d, 0xcb, 0xc0, 0xcb, 0x47, 0xcc, 0xe9, 0xcc, |
||||
0x6f, 0xcd, 0x06, 0xce, 0x84, 0xce, 0x1a, 0xcf, 0xbb, 0xcf, 0x55, 0xd0, |
||||
0xf6, 0xd0, 0x8b, 0xd1, 0x30, 0xd2, 0xd2, 0xd2, 0x79, 0xd3, 0x1c, 0xd4, |
||||
0xcf, 0xd4, 0x83, 0xd5, 0x36, 0xd6, 0xe1, 0xd6, 0x96, 0xd7, 0x5f, 0xd8, |
||||
0x1c, 0xd9, 0xe2, 0xd9, 0xa8, 0xda, 0x6c, 0xdb, 0x43, 0xdc, 0x04, 0xdd, |
||||
0xd8, 0xdd, 0xac, 0xde, 0x8a, 0xdf, 0x5b, 0xe0, 0x39, 0xe1, 0x0b, 0xe2, |
||||
0xf5, 0xe2, 0xde, 0xe3, 0xbc, 0xe4, 0x9e, 0xe5, 0x83, 0xe6, 0x62, 0xe7, |
||||
0x51, 0xe8, 0x34, 0xe9, 0x1e, 0xea, 0x12, 0xeb, 0xf7, 0xeb, 0xe5, 0xec, |
||||
0xc5, 0xed, 0xc2, 0xee, 0xb1, 0xef, 0xa6, 0xf0, 0x90, 0xf1, 0x7e, 0xf2, |
||||
0x6f, 0xf3, 0x56, 0xf4, 0x48, 0xf5, 0x35, 0xf6, 0x29, 0xf7, 0x17, 0xf8, |
||||
0x0a, 0xf9, 0x00, 0xfa, 0xe7, 0xfa, 0xde, 0xfb, 0xc9, 0xfc, 0xc1, 0xfd, |
||||
0xac, 0xfe, 0xae, 0xff, 0xa2, 0x00, 0x8d, 0x01, 0x70, 0x02, 0x62, 0x03, |
||||
0x4e, 0x04, 0x3a, 0x05, 0x26, 0x06, 0x16, 0x07, 0xff, 0x07, 0xf3, 0x08, |
||||
0xda, 0x09, 0xbe, 0x0a, 0xb9, 0x0b, 0xa1, 0x0c, 0x9b, 0x0d, 0x7d, 0x0e, |
||||
0x66, 0x0f, 0x54, 0x10, 0x36, 0x11, 0x20, 0x12, 0x11, 0x13, 0xf3, 0x13, |
||||
0xea, 0x14, 0xd1, 0x15, 0xb6, 0x16, 0x9b, 0x17, 0x83, 0x18, 0x7f, 0x19, |
||||
0x58, 0x1a, 0x53, 0x1b, 0x37, 0x1c, 0x22, 0x1d, 0x0a, 0x1e, 0xf3, 0x1e, |
||||
0xda, 0x1f, 0xca, 0x20, 0xb1, 0x21, 0x96, 0x22, 0x70, 0x23, 0x55, 0x24, |
||||
0x39, 0x25, 0x39, 0x26, 0x1a, 0x27, 0x07, 0x28, 0xe1, 0x28, 0xc5, 0x29, |
||||
0xa7, 0x2a, 0x85, 0x2b, 0x70, 0x2c, 0x4e, 0x2d, 0x3e, 0x2e, 0x19, 0x2f, |
||||
0xf3, 0x2f, 0xdf, 0x30, 0xc0, 0x31, 0xaf, 0x32, 0x93, 0x33, 0x77, 0x34, |
||||
0x48, 0x35, 0x2a, 0x36, 0x0f, 0x37, 0xf8, 0x37, 0xd9, 0x38, 0xbe, 0x39, |
||||
0x8b, 0x3a, 0x74, 0x3b, 0x48, 0x3c, 0x2d, 0x3d, 0xfa, 0x3d, 0xe7, 0x3e, |
||||
0xb0, 0x3f, 0x98, 0x40, 0x67, 0x41, 0x3a, 0x42, 0x16, 0x43, 0xf4, 0x43, |
||||
0xd8, 0x44, 0xa4, 0x45, 0x7c, 0x46, 0x4c, 0x47, 0x2a, 0x48, 0x06, 0x49, |
||||
0xce, 0x49, 0xa5, 0x4a, 0x77, 0x4b, 0x4e, 0x4c, 0x13, 0x4d, 0xdf, 0x4d, |
||||
0xaa, 0x4e, 0x74, 0x4f, 0x3d, 0x50, 0xfc, 0x50, 0xbd, 0x51, 0x8c, 0x52, |
||||
0x3e, 0x53, 0xfe, 0x53, 0x99, 0x54, 0x57, 0x55, 0xfc, 0x55, 0xab, 0x56, |
||||
0x45, 0x57, 0xd6, 0x57, 0x87, 0x58, 0x2f, 0x59, 0xbf, 0x59, 0x48, 0x5a, |
||||
0xc7, 0x5a, 0x54, 0x5b, 0xc8, 0x5b, 0x45, 0x5c, 0xb4, 0x5c, 0x25, 0x5d, |
||||
0x7e, 0x5d, 0xda, 0x5d, 0x36, 0x5e, 0xa5, 0x5e, 0xe9, 0x5e, 0x37, 0x5f, |
||||
0x72, 0x5f, 0xab, 0x5f, 0xe5, 0x5f, 0x1d, 0x60, 0x4f, 0x60, 0x81, 0x60, |
||||
0x9c, 0x60, 0xc3, 0x60, 0xdc, 0x60, 0xf7, 0x60, 0x04, 0x61, 0x16, 0x61, |
||||
0x1b, 0x61, 0x21, 0x61, 0x20, 0x61, 0x0d, 0x61, 0x0b, 0x61, 0xf0, 0x60, |
||||
0xe5, 0x60, 0xc7, 0x60, 0xb3, 0x60, 0x98, 0x60, 0x7c, 0x60, 0x59, 0x60, |
||||
0x4c, 0x60, 0x24, 0x60, 0x0d, 0x60, 0xdf, 0x5f, 0xb7, 0x5f, 0x87, 0x5f, |
||||
0x6b, 0x5f, 0x44, 0x5f, 0x28, 0x5f, 0xf5, 0x5e, 0xbd, 0x5e, 0x8f, 0x5e, |
||||
0x5c, 0x5e, 0x2a, 0x5e, 0xfe, 0x5d, 0xcd, 0x5d, 0xa4, 0x5d, 0x75, 0x5d, |
||||
0x4d, 0x5d, 0x11, 0x5d, 0xdf, 0x5c, 0xa9, 0x5c, 0x78, 0x5c, 0x42, 0x5c, |
||||
0x13, 0x5c, 0xde, 0x5b, 0xaf, 0x5b, 0x75, 0x5b, 0x3e, 0x5b, 0xfd, 0x5a, |
||||
0xbc, 0x5a, 0x90, 0x5a, 0x54, 0x5a, 0x1f, 0x5a, 0xe5, 0x59, 0xc2, 0x59, |
||||
0x80, 0x59, 0x39, 0x59, 0x0a, 0x59, 0xd6, 0x58, 0x96, 0x58, 0x55, 0x58, |
||||
0x1e, 0x58, 0xf1, 0x57, 0xc8, 0x57, 0x7e, 0x57, 0x44, 0x57, 0x11, 0x57, |
||||
0xd4, 0x56, 0x93, 0x56, 0x4c, 0x56, 0x11, 0x56, 0xd7, 0x55, 0xae, 0x55, |
||||
0x72, 0x55, 0x3c, 0x55, 0x0c, 0x55, 0xd1, 0x54, 0x98, 0x54, 0x63, 0x54, |
||||
0x2b, 0x54, 0xf8, 0x53, 0xc6, 0x53, 0x81, 0x53, 0x4b, 0x53, 0x19, 0x53, |
||||
0xea, 0x52, 0xb2, 0x52, 0x7e, 0x52, 0x30, 0x52, 0xc5, 0x51, 0x46, 0x51, |
||||
0xca, 0x50, 0x55, 0x50, 0xd7, 0x4f, 0x5d, 0x4f, 0xe4, 0x4e, 0x79, 0x4e, |
||||
0xfb, 0x4d, 0x83, 0x4d, 0x02, 0x4d, 0x8a, 0x4c, 0x1f, 0x4c, 0x98, 0x4b, |
||||
0x20, 0x4b, 0xa7, 0x4a, 0x36, 0x4a, 0xc0, 0x49, 0x44, 0x49, 0xc3, 0x48, |
||||
0x44, 0x48, 0xd5, 0x47, 0x59, 0x47, 0xe6, 0x46, 0x63, 0x46, 0xf8, 0x45, |
||||
0x79, 0x45, 0xfa, 0x44, 0x80, 0x44, 0x01, 0x44, 0x7a, 0x43, 0x04, 0x43, |
||||
0x85, 0x42, 0x07, 0x42, 0x92, 0x41, 0x17, 0x41, 0x94, 0x40, 0x16, 0x40, |
||||
0x9f, 0x3f, 0x20, 0x3f, 0x9c, 0x3e, 0x29, 0x3e, 0x9c, 0x3d, 0x20, 0x3d, |
||||
0x88, 0x3c, 0x0c, 0x3c, 0x87, 0x3b, 0x07, 0x3b, 0x89, 0x3a, 0xfb, 0x39, |
||||
0x6f, 0x39, 0xe7, 0x38, 0x55, 0x38, 0xcf, 0x37, 0x43, 0x37, 0xb5, 0x36, |
||||
0x2a, 0x36, 0x9c, 0x35, 0x0a, 0x35, 0x83, 0x34, 0xe6, 0x33, 0x53, 0x33, |
||||
0xba, 0x32, 0x1d, 0x32, 0x78, 0x31, 0xcb, 0x30, 0x34, 0x30, 0x8e, 0x2f, |
||||
0xf6, 0x2e, 0x56, 0x2e, 0xab, 0x2d, 0xfe, 0x2c, 0x4c, 0x2c, 0x9f, 0x2b, |
||||
0xed, 0x2a, 0x36, 0x2a, 0x7b, 0x29, 0xb9, 0x28, 0x02, 0x28, 0x41, 0x27, |
||||
0x81, 0x26, 0xb9, 0x25, 0xfb, 0x24, 0x2d, 0x24, 0x66, 0x23, 0x98, 0x22, |
||||
0xc6, 0x21, 0xe9, 0x20, 0x0d, 0x20, 0x28, 0x1f, 0x4c, 0x1e, 0x64, 0x1d, |
||||
0x66, 0x1c, 0x8c, 0x1b, 0x96, 0x1a, 0xac, 0x19, 0xb2, 0x18, 0xbb, 0x17, |
||||
0xc2, 0x16, 0xc7, 0x15, 0xcb, 0x14, 0xcd, 0x13, 0xc4, 0x12, 0xca, 0x11, |
||||
0xb6, 0x10, 0xb8, 0x0f, 0xa3, 0x0e, 0x9e, 0x0d, 0x88, 0x0c, 0x86, 0x0b, |
||||
0x7b, 0x0a, 0x7c, 0x09, 0x6d, 0x08, 0x5b, 0x07, 0x4a, 0x06, 0x38, 0x05, |
||||
0x2f, 0x04, 0x1c, 0x03, 0x10, 0x02, 0xf6, 0x00, 0xe9, 0xff, 0xe5, 0xfe, |
||||
0xcf, 0xfd, 0xc8, 0xfc, 0xb1, 0xfb, 0xa7, 0xfa, 0x8d, 0xf9, 0x7b, 0xf8, |
||||
0x7e, 0xf7, 0x77, 0xf6, 0x68, 0xf5, 0x62, 0xf4, 0x49, 0xf3, 0x42, 0xf2, |
||||
0x41, 0xf1, 0x3e, 0xf0, 0x49, 0xef, 0x47, 0xee, 0x56, 0xed, 0x46, 0xec, |
||||
0x56, 0xeb, 0x5c, 0xea, 0x6c, 0xe9, 0x7d, 0xe8, 0x9c, 0xe7, 0x99, 0xe6, |
||||
0xbf, 0xe5, 0xc9, 0xe4, 0xe5, 0xe3, 0xfd, 0xe2, 0x17, 0xe2, 0x26, 0xe1, |
||||
0x44, 0xe0, 0x6d, 0xdf, 0x9f, 0xde, 0xc5, 0xdd, 0xec, 0xdc, 0x26, 0xdc, |
||||
0x58, 0xdb, 0x91, 0xda, 0xb7, 0xd9, 0xf5, 0xd8, 0x27, 0xd8, 0x63, 0xd7, |
||||
0x96, 0xd6, 0xd5, 0xd5, 0x1a, 0xd5, 0x52, 0xd4, 0x9d, 0xd3, 0xde, 0xd2, |
||||
0x27, 0xd2, 0x6c, 0xd1, 0xb3, 0xd0, 0xf6, 0xcf, 0x51, 0xcf, 0x98, 0xce, |
||||
0xe9, 0xcd, 0x2f, 0xcd, 0x88, 0xcc, 0xdc, 0xcb, 0x41, 0xcb, 0x9f, 0xca, |
||||
0x01, 0xca, 0x60, 0xc9, 0xc4, 0xc8, 0x13, 0xc8, 0x7e, 0xc7, 0xe2, 0xc6, |
||||
0x51, 0xc6, 0xb6, 0xc5, 0x1a, 0xc5, 0x8e, 0xc4, 0xf6, 0xc3, 0x74, 0xc3, |
||||
0xdf, 0xc2, 0x59, 0xc2, 0xd2, 0xc1, 0x47, 0xc1, 0xbe, 0xc0, 0x3b, 0xc0, |
||||
0xbe, 0xbf, 0x3e, 0xbf, 0xc4, 0xbe, 0x39, 0xbe, 0xbf, 0xbd, 0x3e, 0xbd, |
||||
0xd7, 0xbc, 0x5d, 0xbc, 0xec, 0xbb, 0x73, 0xbb, 0x07, 0xbb, 0x96, 0xba, |
||||
0x24, 0xba, 0xb5, 0xb9, 0x49, 0xb9, 0xdd, 0xb8, 0x76, 0xb8, 0x02, 0xb8, |
||||
0xa8, 0xb7, 0x3c, 0xb7, 0xee, 0xb6, 0x82, 0xb6, 0x2b, 0xb6, 0xc3, 0xb5, |
||||
0x6e, 0xb5, 0x14, 0xb5, 0xc4, 0xb4, 0x6b, 0xb4, 0x20, 0xb4, 0xd2, 0xb3, |
||||
0x78, 0xb3, 0x2c, 0xb3, 0xe6, 0xb2, 0x9e, 0xb2, 0x58, 0xb2, 0x1a, 0xb2, |
||||
0xea, 0xb1, 0xa6, 0xb1, 0x63, 0xb1, 0x2b, 0xb1, 0xf3, 0xb0, 0xb8, 0xb0, |
||||
0x7b, 0xb0, 0x4e, 0xb0, 0x20, 0xb0, 0xf9, 0xaf, 0xc6, 0xaf, 0xa2, 0xaf, |
||||
0x84, 0xaf, 0x5e, 0xaf, 0x44, 0xaf, 0x21, 0xaf, 0x06, 0xaf, 0xe9, 0xae, |
||||
0xe2, 0xae, 0xd0, 0xae, 0xc3, 0xae, 0xba, 0xae, 0xc1, 0xae, 0xaf, 0xae, |
||||
0xbc, 0xae, 0xb5, 0xae, 0xc0, 0xae, 0xc3, 0xae, 0xd7, 0xae, 0xdd, 0xae, |
||||
0xfb, 0xae, 0x0a, 0xaf, 0x16, 0xaf, 0x37, 0xaf, 0x4a, 0xaf, 0x70, 0xaf, |
||||
0x86, 0xaf, 0xa9, 0xaf, 0xc7, 0xaf, 0xec, 0xaf, 0x12, 0xb0, 0x42, 0xb0, |
||||
0x66, 0xb0, 0x91, 0xb0, 0xc0, 0xb0, 0xee, 0xb0, 0x1a, 0xb1, 0x4c, 0xb1, |
||||
0x77, 0xb1, 0xb3, 0xb1, 0xdd, 0xb1, 0x10, 0xb2, 0x47, 0xb2, 0x70, 0xb2, |
||||
0xb8, 0xb2, 0xef, 0xb2, 0x26, 0xb3, 0x64, 0xb3, 0x90, 0xb3, 0xd8, 0xb3, |
||||
0x07, 0xb4, 0x4b, 0xb4, 0x83, 0xb4, 0xc7, 0xb4, 0xf4, 0xb4, 0x35, 0xb5, |
||||
0x70, 0xb5, 0xbc, 0xb5, 0xf0, 0xb5, 0x39, 0xb6, 0x7d, 0xb6, 0xb7, 0xb6, |
||||
0xfa, 0xb6, 0x2e, 0xb7, 0x7d, 0xb7, 0xbb, 0xb7, 0x01, 0xb8, 0x39, 0xb8, |
||||
0x80, 0xb8, 0xbd, 0xb8, 0x05, 0xb9, 0x46, 0xb9, 0x94, 0xb9, 0xcd, 0xb9, |
||||
0x17, 0xba, 0x5b, 0xba, 0x9e, 0xba, 0xdf, 0xba, 0x27, 0xbb, 0x6a, 0xbb, |
||||
0xbc, 0xbb, 0xf6, 0xbb, 0x3a, 0xbc, 0x83, 0xbc, 0xc3, 0xbc, 0x16, 0xbd, |
||||
0x58, 0xbd, 0xa2, 0xbd, 0xe0, 0xbd, 0x24, 0xbe, 0x70, 0xbe, 0xa1, 0xbe, |
||||
0xfa, 0xbe, 0x37, 0xbf, 0x8d, 0xbf, 0xc9, 0xbf, 0x1d, 0xc0, 0x5d, 0xc0, |
||||
0xa6, 0xc0, 0xe6, 0xc0, 0x2f, 0xc1, 0x7a, 0xc1, 0xcb, 0xc1, 0x2f, 0xc2, |
||||
0x95, 0xc2, 0xfa, 0xc2, 0x55, 0xc3, 0xbb, 0xc3, 0x1e, 0xc4, 0x86, 0xc4, |
||||
0xec, 0xc4, 0x4b, 0xc5, 0xab, 0xc5, 0x04, 0xc6, 0x72, 0xc6, 0xc6, 0xc6, |
||||
0x3a, 0xc7, 0x8e, 0xc7, 0xfd, 0xc7, 0x5a, 0xc8, 0xc0, 0xc8, 0x17, 0xc9, |
||||
0x79, 0xc9, 0xd5, 0xc9, 0x43, 0xca, 0x98, 0xca, 0x05, 0xcb, 0x64, 0xcb, |
||||
0xc3, 0xcb, 0x1e, 0xcc, 0x81, 0xcc, 0xe3, 0xcc, 0x40, 0xcd, 0xa6, 0xcd, |
||||
0x0a, 0xce, 0x6a, 0xce, 0xc0, 0xce, 0x26, 0xcf, 0x81, 0xcf, 0xf0, 0xcf, |
||||
0x48, 0xd0, 0xad, 0xd0, 0x07, 0xd1, 0x71, 0xd1, 0xca, 0xd1, 0x2b, 0xd2, |
||||
0x8a, 0xd2, 0xed, 0xd2, 0x50, 0xd3, 0xa1, 0xd3, 0x0f, 0xd4, 0x6f, 0xd4, |
||||
0xd6, 0xd4, 0x30, 0xd5, 0x93, 0xd5, 0xf6, 0xd5, 0x55, 0xd6, 0xb5, 0xd6, |
||||
0x12, 0xd7, 0x7b, 0xd7, 0xde, 0xd7, 0x34, 0xd8, 0x93, 0xd8, 0xe9, 0xd8, |
||||
0x61, 0xd9, 0xbb, 0xd9, 0x2b, 0xda, 0x88, 0xda, 0xeb, 0xda, 0x4f, 0xdb, |
||||
0xb9, 0xdb, 0x21, 0xdc, 0x80, 0xdc, 0xf7, 0xdc, 0x53, 0xdd, 0xbb, 0xdd, |
||||
0x2b, 0xde, 0xa4, 0xde, 0x05, 0xdf, 0x74, 0xdf, 0xd8, 0xdf, 0x44, 0xe0, |
||||
0xb4, 0xe0, 0x26, 0xe1, 0x91, 0xe1, 0x01, 0xe2, 0x77, 0xe2, 0xeb, 0xe2, |
||||
0x5e, 0xe3, 0xc7, 0xe3, 0x44, 0xe4, 0xb2, 0xe4, 0x25, 0xe5, 0xa3, 0xe5, |
||||
0x15, 0xe6, 0x97, 0xe6, 0x0b, 0xe7, 0x8b, 0xe7, 0x10, 0xe8, 0x7d, 0xe8, |
||||
0x06, 0xe9, 0x74, 0xe9, 0xff, 0xe9, 0x82, 0xea, 0x01, 0xeb, 0x85, 0xeb, |
||||
0xfa, 0xeb, 0x91, 0xec, 0x07, 0xed, 0x8f, 0xed, 0x15, 0xee, 0x9a, 0xee, |
||||
0x26, 0xef, 0xa5, 0xef, 0x26, 0xf0, 0xb2, 0xf0, 0x3e, 0xf1, 0xca, 0xf1, |
||||
0x45, 0xf2, 0xcc, 0xf2, 0x51, 0xf3, 0xdc, 0xf3, 0x5c, 0xf4, 0xe8, 0xf4, |
||||
0x6e, 0xf5, 0xf9, 0xf5, 0x79, 0xf6, 0xf9, 0xf6, 0x7d, 0xf7, 0x08, 0xf8, |
||||
0x91, 0xf8, 0x18, 0xf9, 0x95, 0xf9, 0x18, 0xfa, 0xa5, 0xfa, 0x21, 0xfb, |
||||
0xa9, 0xfb, 0x2a, 0xfc, 0xa7, 0xfc, 0x23, 0xfd, 0xa3, 0xfd, 0x2b, 0xfe, |
||||
0x9c, 0xfe, 0x2b, 0xff, 0xa0, 0xff, 0x1c, 0x00, 0x9a, 0x00, 0x11, 0x01, |
||||
0x9a, 0x01, 0x14, 0x02, 0x8c, 0x02, 0x07, 0x03, 0x84, 0x03, 0xf7, 0x03, |
||||
0x75, 0x04, 0xf3, 0x04, 0x65, 0x05, 0xe8, 0x05, 0x54, 0x06, 0xd3, 0x06, |
||||
0x48, 0x07, 0xc2, 0x07, 0x38, 0x08, 0xad, 0x08, 0x28, 0x09, 0x99, 0x09, |
||||
0x11, 0x0a, 0x79, 0x0a, 0xf5, 0x0a, 0x5c, 0x0b, 0xd1, 0x0b, 0x3f, 0x0c, |
||||
0xb5, 0x0c, 0x2c, 0x0d, 0x9a, 0x0d, 0x0b, 0x0e, 0x74, 0x0e, 0xe6, 0x0e, |
||||
0x45, 0x0f, 0xbd, 0x0f, 0x2f, 0x10, 0x9a, 0x10, 0x05, 0x11, 0x6c, 0x11, |
||||
0xdb, 0x11, 0x40, 0x12, 0xaa, 0x12, 0x14, 0x13, 0x81, 0x13, 0xe9, 0x13, |
||||
0x4d, 0x14, 0xb9, 0x14, 0x18, 0x15, 0x88, 0x15, 0xe6, 0x15, 0x58, 0x16, |
||||
0xb9, 0x16, 0x1c, 0x17, 0x7e, 0x17, 0xe3, 0x17, 0x43, 0x18, 0xac, 0x18, |
||||
0x08, 0x19, 0x6d, 0x19, 0xce, 0x19, 0x34, 0x1a, 0x90, 0x1a, 0xf5, 0x1a, |
||||
0x53, 0x1b, 0xbb, 0x1b, 0x07, 0x1c, 0x6f, 0x1c, 0xc2, 0x1c, 0x28, 0x1d, |
||||
0x84, 0x1d, 0xe8, 0x1d, 0x35, 0x1e, 0xa2, 0x1e, 0xf8, 0x1e, 0x59, 0x1f, |
||||
0xb8, 0x1f, 0x0c, 0x20, 0x69, 0x20, 0xbe, 0x20, 0x19, 0x21, 0x66, 0x21, |
||||
0xc6, 0x21, 0x1f, 0x22, 0x70, 0x22, 0xbe, 0x22, 0x18, 0x23, 0x72, 0x23, |
||||
0xbf, 0x23, 0x0f, 0x24, 0x67, 0x24, 0xc0, 0x24, 0x08, 0x25, 0x51, 0x25, |
||||
0xa6, 0x25, 0xf4, 0x25, 0x42, 0x26, 0x93, 0x26, 0xd6, 0x26, 0x25, 0x27, |
||||
0x6c, 0x27, 0xb7, 0x27, 0x07, 0x28, 0x49, 0x28, 0x96, 0x28, 0xda, 0x28, |
||||
0x22, 0x29, 0x66, 0x29, 0xa4, 0x29, 0xe8, 0x29, 0x20, 0x2a, 0x62, 0x2a, |
||||
0xa9, 0x2a, 0xe5, 0x2a, 0x21, 0x2b, 0x5a, 0x2b, 0x97, 0x2b, 0xc1, 0x2b, |
||||
0xfe, 0x2b, 0x28, 0x2c, 0x57, 0x2c, 0x88, 0x2c, 0xae, 0x2c, 0xd3, 0x2c, |
||||
0xfa, 0x2c, 0x17, 0x2d, 0x33, 0x2d, 0x4b, 0x2d, 0x5d, 0x2d, 0x68, 0x2d, |
||||
0x81, 0x2d, 0x92, 0x2d, 0x9e, 0x2d, 0xa9, 0x2d, 0xbb, 0x2d, 0xc3, 0x2d, |
||||
0xcd, 0x2d, 0xd5, 0x2d, 0xcd, 0x2d, 0xdc, 0x2d, 0xe3, 0x2d, 0xe1, 0x2d, |
||||
0xdd, 0x2d, 0xd9, 0x2d, 0xd7, 0x2d, 0xcf, 0x2d, 0xe0, 0x2d, 0xd2, 0x2d, |
||||
0xd2, 0x2d, 0xcb, 0x2d, 0xb7, 0x2d, 0xb6, 0x2d, 0xa1, 0x2d, 0x9e, 0x2d, |
||||
0x8b, 0x2d, 0x84, 0x2d, 0x68, 0x2d, 0x6a, 0x2d, 0x4e, 0x2d, 0x45, 0x2d, |
||||
0x2f, 0x2d, 0x18, 0x2d, 0x15, 0x2d, 0xef, 0x2c, 0xe8, 0x2c, 0xc9, 0x2c, |
||||
0xc7, 0x2c, 0xaa, 0x2c, 0x9b, 0x2c, 0x7c, 0x2c, 0x64, 0x2c, 0x3c, 0x2c, |
||||
0x2e, 0x2c, 0x16, 0x2c, 0x05, 0x2c, 0xe1, 0x2b, 0xc8, 0x2b, 0xb5, 0x2b, |
||||
0x9a, 0x2b, 0x7c, 0x2b, 0x61, 0x2b, 0x3f, 0x2b, 0x21, 0x2b, 0x01, 0x2b, |
||||
0xee, 0x2a, 0xd0, 0x2a, 0xb3, 0x2a, 0x95, 0x2a, 0x6d, 0x2a, 0x50, 0x2a, |
||||
0x2b, 0x2a, 0x0b, 0x2a, 0xe9, 0x29, 0xd1, 0x29, 0xa8, 0x29, 0x97, 0x29, |
||||
0x6c, 0x29, 0x51, 0x29, 0x24, 0x29, 0x03, 0x29, 0xe6, 0x28, 0xbe, 0x28, |
||||
0xa1, 0x28, 0x80, 0x28, 0x64, 0x28, 0x38, 0x28, 0x12, 0x28, 0xf0, 0x27, |
||||
0xd3, 0x27, 0xac, 0x27, 0x94, 0x27, 0x67, 0x27, 0x4a, 0x27, 0x1c, 0x27, |
||||
0xf7, 0x26, 0xd1, 0x26, 0xb6, 0x26, 0x8d, 0x26, 0x6e, 0x26, 0x4b, 0x26, |
||||
0x25, 0x26, 0x02, 0x26, 0xd8, 0x25, 0xbe, 0x25, 0x93, 0x25, 0x7c, 0x25, |
||||
0x4a, 0x25, 0x27, 0x25, 0x07, 0x25, 0xdc, 0x24, 0xbb, 0x24, 0x9a, 0x24, |
||||
0x78, 0x24, 0x4c, 0x24, 0x26, 0x24, 0x00, 0x24, 0xd7, 0x23, 0xc0, 0x23, |
||||
0x94, 0x23, 0x71, 0x23, 0x45, 0x23, 0x1c, 0x23, 0x00, 0x23, 0xd4, 0x22, |
||||
0xb5, 0x22, 0x8e, 0x22, 0x67, 0x22, 0x39, 0x22, 0x00, 0x22, 0xbd, 0x21, |
||||
0x87, 0x21, 0x46, 0x21, 0x01, 0x21, 0xca, 0x20, 0x89, 0x20, 0x4a, 0x20, |
||||
0x17, 0x20, 0xd6, 0x1f, 0x9a, 0x1f, 0x5e, 0x1f, 0x20, 0x1f, 0xe0, 0x1e, |
||||
0xa3, 0x1e, 0x5f, 0x1e, 0x29, 0x1e, 0xf0, 0x1d, 0xb8, 0x1d, 0x78, 0x1d, |
||||
0x36, 0x1d, 0x04, 0x1d, 0xc6, 0x1c, 0x8b, 0x1c, 0x4d, 0x1c, 0x18, 0x1c, |
||||
0xd9, 0x1b, 0x97, 0x1b, 0x5c, 0x1b, 0x2b, 0x1b, 0xf4, 0x1a, 0xb1, 0x1a, |
||||
0x7c, 0x1a, 0x32, 0x1a, 0x02, 0x1a, 0xc6, 0x19, 0x8b, 0x19, 0x59, 0x19, |
||||
0x10, 0x19, 0xd7, 0x18, 0x9c, 0x18, 0x62, 0x18, 0x22, 0x18, 0xe8, 0x17, |
||||
0xb1, 0x17, 0x7c, 0x17, 0x34, 0x17, 0xf9, 0x16, 0xc0, 0x16, 0x8b, 0x16, |
||||
0x55, 0x16, 0x14, 0x16, 0xdd, 0x15, 0x9f, 0x15, 0x65, 0x15, 0x2b, 0x15, |
||||
0xea, 0x14, 0xb9, 0x14, 0x70, 0x14, 0x3d, 0x14, 0x05, 0x14, 0xc1, 0x13, |
||||
0x86, 0x13, 0x45, 0x13, 0x09, 0x13, 0xca, 0x12, 0x90, 0x12, 0x57, 0x12, |
||||
0x1a, 0x12, 0xe1, 0x11, 0x9b, 0x11, 0x61, 0x11, 0x1d, 0x11, 0xe1, 0x10, |
||||
0x9d, 0x10, 0x64, 0x10, 0x17, 0x10, 0xde, 0x0f, 0xa1, 0x0f, 0x60, 0x0f, |
||||
0x1b, 0x0f, 0xd8, 0x0e, 0x90, 0x0e, 0x5b, 0x0e, 0x0e, 0x0e, 0xd3, 0x0d, |
||||
0x86, 0x0d, 0x4d, 0x0d, 0xf5, 0x0c, 0xba, 0x0c, 0x68, 0x0c, 0x2a, 0x0c, |
||||
0xde, 0x0b, 0x94, 0x0b, 0x4e, 0x0b, 0x07, 0x0b, 0xbb, 0x0a, 0x6c, 0x0a, |
||||
0x25, 0x0a, 0xd4, 0x09, 0x89, 0x09, 0x39, 0x09, 0xe6, 0x08, 0xa3, 0x08, |
||||
0x4f, 0x08, 0x02, 0x08, 0xa7, 0x07, 0x5f, 0x07, 0x08, 0x07, 0xba, 0x06, |
||||
0x68, 0x06, 0x1f, 0x06, 0xc5, 0x05, 0x7a, 0x05, 0x1f, 0x05, 0xd7, 0x04, |
||||
0x85, 0x04, 0x31, 0x04, 0xde, 0x03, 0x89, 0x03, 0x3a, 0x03, 0xe9, 0x02, |
||||
0x96, 0x02, 0x47, 0x02, 0xf7, 0x01, 0xa4, 0x01, 0x5d, 0x01, 0x06, 0x01, |
||||
0xb9, 0x00 |
||||
}; |
||||
unsigned int kick_raw_len = 6350; |
@ -1,10 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sampleloader) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
|
||||
import_arduino_library(sampleflashloader ${DEPSPATH}/teensy-sample-flashloader/src) |
||||
import_arduino_library(midi ${DEPSPATH}/MIDI/src) |
||||
|
||||
teensy_add_executable(sampleloader sampleloader.ino) |
||||
teensy_target_link_libraries(sampleloader midi sampleflashloader SD SdFat Audio teensy_variable_playback cores arm_math SPI Wire SerialFlash ) |
@ -1,87 +0,0 @@ |
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
#include <MIDI.h> |
||||
#include "flashloader.h" |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=321,513
|
||||
AudioOutputI2S i2s1; //xy=675,518
|
||||
AudioConnection patchCord1(rraw_a1, 0, i2s1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, i2s1, 1); |
||||
AudioControlSGTL5000 sgtl5000_1; //xy=521,588
|
||||
// GUItool: end automatically generated code
|
||||
#define A14 10 |
||||
|
||||
MIDI_CREATE_DEFAULT_INSTANCE(); |
||||
const int analogInPin = A14; |
||||
newdigate::audiosample *sample; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
float calcFrequency(uint8_t note) { |
||||
float result = 440.0 * powf(2.0, (note-69) / 12.0); |
||||
return result; |
||||
} |
||||
|
||||
void handleNoteOn(uint8_t channel, uint8_t pitch, uint8_t velocity) |
||||
{ |
||||
rraw_a1.setLoopType(loop_type::looptype_repeat); |
||||
float freq = calcFrequency(pitch); |
||||
uint32_t numSamples = 44100 / freq; |
||||
rraw_a1.startLoop(numSamples); |
||||
} |
||||
|
||||
void handleNoteOff(uint8_t channel, uint8_t pitch, uint8_t velocity) |
||||
{ |
||||
rraw_a1.setLoopType(loop_type::looptype_none); |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(9600); |
||||
while (!SD.begin(BUILTIN_SDCARD)) { |
||||
Serial.println("initialization failed!"); |
||||
delay(1000); |
||||
} |
||||
|
||||
MIDI.setHandleNoteOn(handleNoteOn);
|
||||
MIDI.setHandleNoteOff(handleNoteOff); |
||||
MIDI.begin(MIDI_CHANNEL_OMNI); |
||||
|
||||
sgtl5000_1.enable(); |
||||
sgtl5000_1.volume(0.5f, 0.5f); |
||||
|
||||
rraw_a1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
newdigate::flashloader loader; |
||||
sample = loader.loadSample("MONKS.RAW"); |
||||
|
||||
AudioMemory(50); |
||||
Serial.println("setup done"); |
||||
} |
||||
|
||||
void loop() { |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!rraw_a1.isPlaying()) { |
||||
rraw_a1.play(sample->sampledata, sample->samplesize/2); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
@ -1,9 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sampleloader) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
|
||||
import_arduino_library(sampleflashloader ${DEPSPATH}/teensy-sample-flashloader/src) |
||||
|
||||
teensy_add_executable(sampleloader sampleloader.ino) |
||||
teensy_target_link_libraries(sampleloader sampleflashloader SD SdFat Audio teensy_variable_playback cores arm_math SPI Wire SerialFlash ) |
@ -1 +0,0 @@ |
||||
this example uses [teensy-sample-flashloader](https://github.com/newdigate/teensy-sample-flashloader) to copy samples from the uSD card to the external flash memory |
@ -1,66 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
#include "flashloader.h" |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=321,513
|
||||
AudioOutputI2S i2s1; //xy=675,518
|
||||
AudioConnection patchCord1(rraw_a1, 0, i2s1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, i2s1, 1); |
||||
AudioControlSGTL5000 sgtl5000_1; //xy=521,588
|
||||
// GUItool: end automatically generated code
|
||||
#define A14 10 |
||||
|
||||
unsigned long lastSamplePlayed = 0; |
||||
const int analogInPin = A14; |
||||
newdigate::audiosample *sample; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(9600); |
||||
while (!SD.begin(BUILTIN_SDCARD)) { |
||||
Serial.println("initialization failed!"); |
||||
delay(1000); |
||||
} |
||||
|
||||
sgtl5000_1.enable(); |
||||
sgtl5000_1.volume(0.5f, 0.5f); |
||||
|
||||
rraw_a1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
newdigate::flashloader loader; |
||||
sample = loader.loadSample("KICK.RAW"); |
||||
|
||||
AudioMemory(20); |
||||
Serial.println("setup done"); |
||||
} |
||||
|
||||
void loop() { |
||||
int newsensorValue = analogRead(analogInPin); |
||||
rraw_a1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!rraw_a1.isPlaying()) { |
||||
rraw_a1.playRaw(sample->sampledata, sample->samplesize/2, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
@ -1,6 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sd_play_all) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(sd_play_all sd_play_all.ino) |
||||
teensy_target_link_libraries(sd_play_all SD SdFat teensy_variable_playback Audio SPI SerialFlash cores Wire arm_math) |
@ -1,147 +0,0 @@ |
||||
// Plays all WAV files from the root directory on the SD card
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <SD.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp playSd1; //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playSd1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playSd1, 1, i2s2, 1); |
||||
AudioControlSGTL5000 audioShield; |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
|
||||
char** _filenames = nullptr; |
||||
uint16_t _fileIndex = 0; |
||||
uint16_t _numWaveFiles = 0; |
||||
|
||||
const int analogInPin = A14; |
||||
unsigned long lastSamplePlayed = 0; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
uint16_t getNumWavFilesInDirectory(char *directory); |
||||
void populateFilenames(char *directory, char **filenames); |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(57600); |
||||
|
||||
if (!(SD.begin(BUILTIN_SDCARD))) { |
||||
// stop here if no SD card, but print a message
|
||||
while (1) { |
||||
Serial.println("Unable to access the SD card"); |
||||
delay(500); |
||||
} |
||||
} |
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playSd1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSd1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
_numWaveFiles = getNumWavFilesInDirectory("/"); |
||||
Serial.printf("Num wave files: %d\n", _numWaveFiles); |
||||
_filenames = new char*[_numWaveFiles]; |
||||
populateFilenames("/", _filenames); |
||||
|
||||
AudioMemory(24); |
||||
} |
||||
|
||||
void loop() { |
||||
|
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSd1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 1000) { |
||||
if (!playSd1.isPlaying()) { |
||||
|
||||
if (playSd1.playWav(_filenames[_fileIndex])) { |
||||
lastSamplePlayed = currentMillis; |
||||
Serial.printf("playing %s\n", _filenames[_fileIndex]); |
||||
} |
||||
_fileIndex++; |
||||
_fileIndex %= _numWaveFiles; |
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
uint16_t getNumWavFilesInDirectory(char *directory) { |
||||
File dir = SD.open(directory); |
||||
uint16_t numWaveFiles = 0; |
||||
|
||||
while (true) {
|
||||
|
||||
File files = dir.openNextFile(); |
||||
if (!files) { |
||||
//If no more files, break out.
|
||||
break; |
||||
} |
||||
|
||||
String curfile = files.name(); //put file in string
|
||||
|
||||
int m = curfile.lastIndexOf(".WAV"); |
||||
int a = curfile.lastIndexOf(".wav"); |
||||
int underscore = curfile.indexOf("_"); |
||||
|
||||
// if returned results is more then 0 add them to the list.
|
||||
if ((m > 0 || a > 0) && (underscore != 0)) {
|
||||
numWaveFiles++; |
||||
} |
||||
|
||||
files.close(); |
||||
} |
||||
// close
|
||||
dir.close(); |
||||
return numWaveFiles; |
||||
} |
||||
|
||||
void populateFilenames(char *directory, char **filenames) { |
||||
File dir = SD.open(directory); |
||||
uint16_t index = 0; |
||||
|
||||
while (true) {
|
||||
|
||||
File files = dir.openNextFile(); |
||||
if (!files) { |
||||
//If no more files, break out.
|
||||
break; |
||||
} |
||||
|
||||
String curfile = files.name(); //put file in string
|
||||
|
||||
int m = curfile.lastIndexOf(".WAV"); |
||||
int a = curfile.lastIndexOf(".wav"); |
||||
int underscore = curfile.indexOf("_"); |
||||
|
||||
// if returned results is more then 0 add them to the list.
|
||||
if ((m > 0 || a > 0) && (underscore != 0)) {
|
||||
filenames[index] = new char[curfile.length()+1] {0}; |
||||
memcpy(filenames[index], curfile.c_str(), curfile.length()); |
||||
index++; |
||||
}
|
||||
files.close(); |
||||
} |
||||
// close
|
||||
dir.close(); |
||||
} |
||||
|
||||
namespace std { |
||||
void __throw_bad_function_call() {} |
||||
void __throw_length_error(char const*) {} |
||||
} |
@ -1,6 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sd_raw) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(sd_raw sd_raw.ino) |
||||
teensy_target_link_libraries(sd_raw SD SdFat teensy_variable_playback Audio SPI SerialFlash cores Wire arm_math) |
@ -1,74 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example requires an uSD-card inserted to teensy 3.6 with a file called DEMO.RAW
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <SD.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp playSdRaw1; //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playSdRaw1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playSdRaw1, 0, i2s2, 1); |
||||
AudioControlSGTL5000 audioShield; |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
|
||||
const char* _filename = "DEMO.RAW"; |
||||
const int analogInPin = A14; |
||||
unsigned long lastSamplePlayed = 0; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(57600); |
||||
|
||||
if (!(SD.begin(BUILTIN_SDCARD))) { |
||||
// stop here if no SD card, but print a message
|
||||
while (1) { |
||||
Serial.println("Unable to access the SD card"); |
||||
delay(500); |
||||
} |
||||
} |
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playSdRaw1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSdRaw1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
AudioMemory(24); |
||||
} |
||||
|
||||
void loop() { |
||||
|
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSdRaw1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!playSdRaw1.isPlaying()) { |
||||
playSdRaw1.playRaw(_filename, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
|
||||
namespace std { |
||||
void __throw_bad_function_call() {} |
||||
void __throw_length_error(char const*) {} |
||||
} |
@ -1,6 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sd_wav) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
teensy_include_directories(../../src) |
||||
teensy_add_executable(sd_wav sd_wav.ino) |
||||
teensy_target_link_libraries(sd_wav SD SdFat teensy_variable_playback Audio SPI SerialFlash cores Wire arm_math) |
@ -1,81 +0,0 @@ |
||||
// Plays a Wav (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example requires an uSD-card inserted to teensy 3.6 with a file called DEMO.WAV
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <SD.h> |
||||
#include <TeensyVariablePlayback.h> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp playSdWav1; //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playSdWav1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playSdWav1, 0, i2s2, 1); |
||||
AudioControlSGTL5000 audioShield; |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
|
||||
char* _filename = "DEMO.WAV"; |
||||
const int analogInPin = A14; |
||||
unsigned long lastSamplePlayed = 0; |
||||
|
||||
double getPlaybackRate(int16_t analog) { //analog: 0..1023
|
||||
return (analog - 512.0) / 512.0; |
||||
} |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT_DISABLE); // i.e. Analog
|
||||
|
||||
Serial.begin(57600); |
||||
|
||||
if (!(SD.begin(BUILTIN_SDCARD))) { |
||||
// stop here if no SD card, but print a message
|
||||
while (1) { |
||||
Serial.println("Unable to access the SD card"); |
||||
delay(500); |
||||
} |
||||
} |
||||
|
||||
AudioMemory(24); |
||||
|
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playSdWav1.enableInterpolation(true); |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSdWav1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
Serial.println("playing..."); |
||||
} |
||||
|
||||
void loop() { |
||||
int newsensorValue = analogRead(analogInPin); |
||||
playSdWav1.setPlaybackRate(getPlaybackRate(newsensorValue)); |
||||
|
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 500) { |
||||
if (!playSdWav1.isPlaying()) { |
||||
playSdWav1.playWav(_filename); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("all="); |
||||
Serial.print(AudioProcessorUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioProcessorUsageMax()); |
||||
Serial.print(" "); |
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
delay(10); |
||||
} |
||||
|
||||
|
||||
namespace std { |
||||
void __throw_bad_function_call() {} |
||||
void __throw_length_error(char const*) {} |
||||
} |
@ -1,21 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(array) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
include_directories(../../../src) |
||||
|
||||
add_executable(array array.cpp) |
||||
|
||||
target_link_libraries(array ${teensy_x86_stubs_LIBS}) |
||||
target_link_libraries(array ${teensy_audio_x86_stubs_LIBS}) |
||||
target_link_libraries(array ${teensy_x86_sd_stubs_LIBS}) |
||||
target_link_libraries(array teensy_variable_playback) |
@ -1,579 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include "playarrayresmp.h" |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=321,513
|
||||
AudioOutputI2S i2s1; //xy=675,518
|
||||
AudioConnection patchCord1(rraw_a1, 0, i2s1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, i2s1, 1); |
||||
AudioControlSGTL5000 sgtl5000_1; //xy=521,588
|
||||
// GUItool: end automatically generated code
|
||||
|
||||
extern unsigned int kick_raw_len; |
||||
extern unsigned char kick_raw[]; |
||||
|
||||
void setup() { |
||||
Serial.begin(9600); |
||||
AudioMemory(20); |
||||
sgtl5000_1.enable(); |
||||
sgtl5000_1.volume(0.5f, 0.5f); |
||||
|
||||
rraw_a1.setPlaybackRate(0.5); |
||||
rraw_a1.playRaw((int16_t*)kick_raw, kick_raw_len/2, 1);
|
||||
Serial.println("setup done"); |
||||
} |
||||
|
||||
void loop() { |
||||
if (!rraw_a1.isPlaying()) { |
||||
delay(1000); |
||||
rraw_a1.playRaw((int16_t*)kick_raw, kick_raw_len/2, 1);
|
||||
} else |
||||
delay(100); |
||||
} |
||||
|
||||
#ifdef BUILD_FOR_LINUX |
||||
int main() { |
||||
initialize_mock_arduino(); |
||||
setup(); |
||||
while(true){ |
||||
loop(); |
||||
} |
||||
} |
||||
#endif |
||||
|
||||
unsigned char kick_raw[] = { |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
0x51, 0x08, 0x01, 0x08, 0x25, 0x08, 0x70, 0x08, 0xc3, 0x08, 0x23, 0x09, |
||||
0x95, 0x09, 0x19, 0x0a, 0x83, 0x0a, 0x7e, 0x0a, 0xd0, 0x0a, 0x65, 0x0b, |
||||
0xf6, 0x0b, 0x89, 0x0c, 0xd1, 0x0c, 0xcf, 0x0c, 0x1a, 0x0d, 0xe5, 0x0d, |
||||
0x5e, 0x0e, 0xbb, 0x0e, 0xec, 0x0e, 0xd9, 0x0e, 0x07, 0x0f, 0xc8, 0x0f, |
||||
0x2a, 0x10, 0x04, 0x10, 0x28, 0x10, 0x54, 0x11, 0x8e, 0x13, 0x4b, 0x16, |
||||
0x09, 0x19, 0x91, 0x1b, 0xf7, 0x1d, 0x55, 0x20, 0xd1, 0x22, 0xcb, 0x25, |
||||
0x4d, 0x29, 0xa8, 0x2c, 0x7f, 0x2f, 0xda, 0x31, 0xac, 0x34, 0x0a, 0x3a, |
||||
0x24, 0x47, 0x9d, 0x5b, 0xe9, 0x67, 0x29, 0x67, 0x24, 0x66, 0x26, 0x66, |
||||
0xd2, 0x65, 0x9c, 0x65, 0x38, 0x65, 0x05, 0x65, 0x9f, 0x64, 0x64, 0x64, |
||||
0x12, 0x64, 0xce, 0x63, 0x7c, 0x63, 0x32, 0x63, 0xe6, 0x62, 0x97, 0x62, |
||||
0x49, 0x62, 0x01, 0x62, 0xb3, 0x61, 0x63, 0x61, 0x15, 0x61, 0xc4, 0x60, |
||||
0x75, 0x60, 0x20, 0x60, 0xce, 0x5f, 0x7a, 0x5f, 0x28, 0x5f, 0xd5, 0x5e, |
||||
0x81, 0x5e, 0x2d, 0x5e, 0xd3, 0x5d, 0x80, 0x5d, 0x2e, 0x5d, 0xe6, 0x5c, |
||||
0x1a, 0x5c, 0x16, 0x5a, 0x01, 0x58, 0xb9, 0x56, 0x6d, 0x55, 0xf4, 0x53, |
||||
0x49, 0x52, 0x83, 0x50, 0x87, 0x4e, 0x5f, 0x4c, 0x68, 0x4a, 0x5c, 0x48, |
||||
0x62, 0x46, 0x5a, 0x44, 0xe2, 0x41, 0x08, 0x3f, 0x1c, 0x3c, 0x44, 0x39, |
||||
0x35, 0x36, 0xcb, 0x32, 0xaf, 0x2f, 0xc8, 0x2c, 0xf8, 0x29, 0x55, 0x27, |
||||
0x6a, 0x24, 0x0f, 0x21, 0x5e, 0x1d, 0xc3, 0x19, 0x7b, 0x16, 0x71, 0x13, |
||||
0x6c, 0x10, 0x00, 0x0d, 0xd2, 0x08, 0x7f, 0x04, 0x7a, 0x01, 0x43, 0xff, |
||||
0xb9, 0xfc, 0xfa, 0xf9, 0x3b, 0xf7, 0xcb, 0xf4, 0x2b, 0xf2, 0x02, 0xef, |
||||
0x0c, 0xec, 0x3d, 0xe9, 0x21, 0xe6, 0xa6, 0xe2, 0x8a, 0xdf, 0x00, 0xdd, |
||||
0xbc, 0xda, 0x9e, 0xd8, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd2, 0xad, 0xd0, |
||||
0x5f, 0xce, 0xf0, 0xcb, 0xe9, 0xc9, 0x61, 0xc8, 0x75, 0xc7, 0x97, 0xc6, |
||||
0x3e, 0xc5, 0x07, 0xc4, 0x8e, 0xc3, 0x18, 0xc3, 0x3a, 0xc2, 0x15, 0xc1, |
||||
0x0e, 0xc0, 0xb3, 0xbf, 0xcf, 0xbf, 0xf8, 0xbf, 0xcc, 0xbf, 0x72, 0xbf, |
||||
0x41, 0xbf, 0x2b, 0xbf, 0xe2, 0xbe, 0x99, 0xbe, 0x4e, 0xbe, 0x0e, 0xbe, |
||||
0xcd, 0xbd, 0x7c, 0xbd, 0x8a, 0xbd, 0x88, 0xbd, 0x04, 0xbd, 0x0c, 0xbc, |
||||
0xb3, 0xbb, 0xf6, 0xbb, 0xf1, 0xbb, 0x12, 0xbc, 0x6f, 0xbc, 0xcb, 0xbc, |
||||
0xe4, 0xbc, 0x33, 0xbd, 0x1b, 0xbe, 0xac, 0xbe, 0x1e, 0xbf, 0x91, 0xbf, |
||||
0x50, 0xc0, 0x40, 0xc1, 0x3d, 0xc2, 0x32, 0xc3, 0xdf, 0xc3, 0xad, 0xc4, |
||||
0x77, 0xc5, 0xbe, 0xc6, 0xc7, 0xc8, 0x1d, 0xcb, 0x0e, 0xcd, 0x83, 0xce, |
||||
0xf1, 0xcf, 0xb4, 0xd1, 0x7d, 0xd3, 0x86, 0xd5, 0x89, 0xd7, 0xd2, 0xd9, |
||||
0x34, 0xdc, 0x28, 0xde, 0x23, 0xe0, 0x33, 0xe2, 0x0a, 0xe4, 0x59, 0xe5, |
||||
0xfc, 0xe6, 0x98, 0xe9, 0x30, 0xec, 0x91, 0xee, 0xc2, 0xf0, 0x0d, 0xf3, |
||||
0x35, 0xf5, 0xf3, 0xf6, 0xc4, 0xf8, 0xcb, 0xfa, 0xef, 0xfc, 0x65, 0xff, |
||||
0x05, 0x02, 0x7c, 0x04, 0xde, 0x06, 0x75, 0x09, 0x2b, 0x0c, 0x9b, 0x0e, |
||||
0xf3, 0x10, 0xb3, 0x13, 0x3a, 0x16, 0xeb, 0x18, 0x55, 0x1c, 0xad, 0x1f, |
||||
0xa8, 0x22, 0x54, 0x25, 0xae, 0x27, 0x33, 0x2a, 0x16, 0x2d, 0x36, 0x30, |
||||
0x84, 0x33, 0x94, 0x36, 0xbd, 0x38, 0xa2, 0x3a, 0x7d, 0x3c, 0x06, 0x3e, |
||||
0x24, 0x3f, 0x27, 0x40, 0x7c, 0x41, 0xef, 0x42, 0x14, 0x44, 0xeb, 0x44, |
||||
0x06, 0x46, 0x53, 0x47, 0x47, 0x48, 0x9b, 0x48, 0xaf, 0x48, 0xd7, 0x48, |
||||
0x4c, 0x49, 0xa0, 0x49, 0xbe, 0x49, 0xd4, 0x49, 0xfa, 0x49, 0x5e, 0x4a, |
||||
0xcc, 0x4a, 0x14, 0x4b, 0xfe, 0x4a, 0x22, 0x4b, 0x10, 0x4c, 0x0c, 0x4d, |
||||
0xb2, 0x4d, 0x4c, 0x4e, 0x3e, 0x4e, 0x77, 0x4d, 0x98, 0x4c, 0xf6, 0x4b, |
||||
0x67, 0x4b, 0xf0, 0x4a, 0x2a, 0x4a, 0xea, 0x48, 0x06, 0x48, 0x47, 0x47, |
||||
0xb2, 0x46, 0xda, 0x45, 0xad, 0x44, 0x5c, 0x43, 0x43, 0x42, 0x9e, 0x41, |
||||
0x0a, 0x41, 0x49, 0x40, 0xa6, 0x3f, 0x9d, 0x3e, 0x3c, 0x3d, 0xc6, 0x3b, |
||||
0xf6, 0x39, 0x87, 0x37, 0xf6, 0x34, 0x87, 0x32, 0x2b, 0x30, 0x6f, 0x2d, |
||||
0xfa, 0x2a, 0x3d, 0x29, 0x48, 0x27, 0xc2, 0x24, 0x49, 0x22, 0xca, 0x1f, |
||||
0xa0, 0x1c, 0x7c, 0x19, 0x06, 0x17, 0xbf, 0x14, 0x9f, 0x12, 0x96, 0x10, |
||||
0xf9, 0x0d, 0x3e, 0x0b, 0xe8, 0x08, 0x5c, 0x06, 0xe7, 0x02, 0x6e, 0xff, |
||||
0xca, 0xfc, 0x5b, 0xfa, 0xa0, 0xf7, 0xe9, 0xf4, 0x9c, 0xf2, 0x66, 0xf0, |
||||
0xaf, 0xed, 0xfd, 0xea, 0xcc, 0xe8, 0x6e, 0xe6, 0x82, 0xe3, 0x97, 0xe0, |
||||
0xed, 0xdd, 0x62, 0xdb, 0x7b, 0xd8, 0xd3, 0xd5, 0x5f, 0xd3, 0x1a, 0xd1, |
||||
0x44, 0xcf, 0xeb, 0xcd, 0x89, 0xcc, 0xca, 0xca, 0x4d, 0xc9, 0x35, 0xc8, |
||||
0x53, 0xc7, 0x0c, 0xc6, 0x06, 0xc4, 0xca, 0xc1, 0x09, 0xc0, 0x9c, 0xbe, |
||||
0xa8, 0xbd, 0xfd, 0xbc, 0xf2, 0xbb, 0x9b, 0xba, 0x20, 0xb9, 0xe4, 0xb7, |
||||
0xc1, 0xb6, 0xcd, 0xb5, 0x12, 0xb5, 0x55, 0xb4, 0xd1, 0xb3, 0x86, 0xb3, |
||||
0x19, 0xb3, 0xe8, 0xb2, 0xd7, 0xb2, 0x72, 0xb2, 0x27, 0xb2, 0xb7, 0xb1, |
||||
0x67, 0xb1, 0x65, 0xb1, 0xae, 0xb1, 0x6b, 0xb1, 0xf2, 0xb0, 0xeb, 0xb0, |
||||
0x0f, 0xb1, 0xfe, 0xb0, 0xeb, 0xb0, 0xcf, 0xb0, 0x94, 0xb0, 0x3e, 0xb0, |
||||
0x29, 0xb0, 0x56, 0xb0, 0x0c, 0xb0, 0xb7, 0xaf, 0xfb, 0xaf, 0x37, 0xb0, |
||||
0x96, 0xb0, 0x42, 0xb1, 0xe8, 0xb1, 0xb5, 0xb2, 0xc5, 0xb3, 0x93, 0xb4, |
||||
0x93, 0xb4, 0xee, 0xb4, 0x59, 0xb6, 0xca, 0xb7, 0x87, 0xb8, 0x6f, 0xb8, |
||||
0x33, 0xb8, 0xaf, 0xb8, 0x4a, 0xb9, 0x9d, 0xb9, 0xf2, 0xb9, 0x48, 0xba, |
||||
0xd0, 0xba, 0xe5, 0xbb, 0x4e, 0xbd, 0xaf, 0xbe, 0xe9, 0xbf, 0xba, 0xc1, |
||||
0xc2, 0xc3, 0x73, 0xc5, 0xa6, 0xc6, 0x6a, 0xc7, 0x83, 0xc8, 0x42, 0xca, |
||||
0xc8, 0xcb, 0x34, 0xcd, 0x94, 0xce, 0xcc, 0xcf, 0x31, 0xd1, 0x27, 0xd3, |
||||
0x8c, 0xd5, 0x61, 0xd7, 0x78, 0xd9, 0x3b, 0xdc, 0x40, 0xdf, 0xdd, 0xe1, |
||||
0x0c, 0xe4, 0xe4, 0xe5, 0xd0, 0xe7, 0x65, 0xea, 0xc9, 0xec, 0xd7, 0xee, |
||||
0xfc, 0xf0, 0x7c, 0xf3, 0xf6, 0xf5, 0x09, 0xf8, 0xde, 0xf9, 0xca, 0xfb, |
||||
0xac, 0xfd, 0xc3, 0xff, 0x33, 0x02, 0xb1, 0x04, 0x24, 0x07, 0x57, 0x09, |
||||
0x5f, 0x0b, 0xe6, 0x0d, 0xd1, 0x10, 0x6d, 0x13, 0x8f, 0x15, 0xfb, 0x17, |
||||
0x43, 0x1a, 0x8e, 0x1c, 0x1a, 0x1f, 0x69, 0x21, 0x80, 0x23, 0x74, 0x25, |
||||
0x62, 0x27, 0x07, 0x29, 0xa1, 0x2a, 0xa5, 0x2c, 0xdf, 0x2e, 0x57, 0x31, |
||||
0xff, 0x33, 0xd1, 0x36, 0x6e, 0x39, 0x8a, 0x3b, 0x58, 0x3d, 0x32, 0x3f, |
||||
0xc8, 0x40, 0x1b, 0x42, 0x22, 0x43, 0x1a, 0x44, 0x25, 0x45, 0xe5, 0x45, |
||||
0x43, 0x46, 0x9b, 0x46, 0x6a, 0x47, 0x6f, 0x48, 0x69, 0x49, 0x6f, 0x4a, |
||||
0xc7, 0x4b, 0x0e, 0x4d, 0x03, 0x4e, 0x78, 0x4e, 0xdf, 0x4e, 0x0b, 0x4f, |
||||
0xea, 0x4e, 0xcb, 0x4e, 0x1b, 0x4f, 0x6e, 0x4f, 0xc3, 0x4f, 0xdc, 0x4f, |
||||
0xcb, 0x4f, 0xd2, 0x4f, 0x16, 0x50, 0x24, 0x50, 0xf2, 0x4f, 0x00, 0x50, |
||||
0x37, 0x50, 0x4e, 0x50, 0x5e, 0x50, 0x7c, 0x50, 0xab, 0x50, 0x69, 0x50, |
||||
0xad, 0x4f, 0xa3, 0x4e, 0xe6, 0x4d, 0x42, 0x4d, 0xdc, 0x4c, 0x7c, 0x4c, |
||||
0xbe, 0x4b, 0x08, 0x4b, 0x7b, 0x4a, 0xe4, 0x49, 0x14, 0x49, 0x07, 0x48, |
||||
0x98, 0x46, 0x2f, 0x45, 0x16, 0x44, 0x23, 0x43, 0x55, 0x42, 0xac, 0x41, |
||||
0x06, 0x41, 0x4b, 0x40, 0x8f, 0x3f, 0xde, 0x3e, 0xe1, 0x3d, 0x75, 0x3c, |
||||
0xc0, 0x3a, 0xe4, 0x38, 0x83, 0x37, 0x9a, 0x36, 0xe5, 0x35, 0xc0, 0x34, |
||||
0xf9, 0x32, 0xe1, 0x30, 0xfa, 0x2e, 0xd4, 0x2c, 0x4d, 0x2a, 0xed, 0x27, |
||||
0xb9, 0x25, 0xb2, 0x23, 0x7d, 0x21, 0xfd, 0x1e, 0x89, 0x1c, 0x38, 0x1a, |
||||
0xe2, 0x17, 0x67, 0x15, 0xf3, 0x12, 0xb3, 0x10, 0x9e, 0x0e, 0x79, 0x0c, |
||||
0xea, 0x09, 0x54, 0x07, 0x26, 0x05, 0x0a, 0x03, 0xd7, 0x00, 0x98, 0xfe, |
||||
0x41, 0xfc, 0x8d, 0xf9, 0x3c, 0xf7, 0x4f, 0xf5, 0x73, 0xf3, 0x7b, 0xf1, |
||||
0x68, 0xef, 0x6f, 0xed, 0x7a, 0xeb, 0x87, 0xe9, 0x48, 0xe7, 0xc6, 0xe4, |
||||
0x65, 0xe2, 0xf6, 0xdf, 0x86, 0xdd, 0x9f, 0xdb, 0x1b, 0xda, 0xa6, 0xd8, |
||||
0xce, 0xd6, 0xe4, 0xd4, 0xe3, 0xd2, 0x84, 0xd0, 0xec, 0xcd, 0x08, 0xcc, |
||||
0x89, 0xca, 0x1b, 0xc9, 0xe2, 0xc7, 0x9d, 0xc6, 0xe5, 0xc4, 0x79, 0xc3, |
||||
0x6d, 0xc2, 0xe3, 0xc0, 0x3c, 0xbf, 0xd3, 0xbd, 0x41, 0xbc, 0xd2, 0xba, |
||||
0x6a, 0xb9, 0xa1, 0xb7, 0xa9, 0xb5, 0x47, 0xb4, 0x91, 0xb3, 0xd5, 0xb2, |
||||
0xb7, 0xb1, 0x51, 0xb0, 0x14, 0xaf, 0xf5, 0xad, 0x95, 0xac, 0x34, 0xab, |
||||
0x05, 0xaa, 0xe1, 0xa8, 0xb3, 0xa7, 0xd9, 0xa6, 0x25, 0xa6, 0x6e, 0xa5, |
||||
0x2b, 0xa5, 0x7b, 0xa5, 0x9a, 0xa5, 0x88, 0xa5, 0xc3, 0xa5, 0xe7, 0xa5, |
||||
0xaf, 0xa5, 0x8b, 0xa5, 0x80, 0xa5, 0x65, 0xa5, 0x8c, 0xa5, 0x7e, 0xa5, |
||||
0x22, 0xa5, 0x40, 0xa5, 0xed, 0xa5, 0x27, 0xa6, 0x2b, 0xa6, 0x1c, 0xa6, |
||||
0xe5, 0xa5, 0x7b, 0xa5, 0x45, 0xa5, 0x37, 0xa5, 0x04, 0xa5, 0x91, 0xa4, |
||||
0x8d, 0xa4, 0x2d, 0xa5, 0x9f, 0xa5, 0xf6, 0xa5, 0x7e, 0xa6, 0x34, 0xa7, |
||||
0x14, 0xa8, 0x7e, 0xa8, 0x87, 0xa8, 0xc4, 0xa8, 0x51, 0xa9, 0xec, 0xa9, |
||||
0x74, 0xaa, 0xf7, 0xaa, 0x40, 0xab, 0xd9, 0xab, 0xca, 0xac, 0x6b, 0xad, |
||||
0xb3, 0xad, 0x08, 0xae, 0x10, 0xaf, 0x2c, 0xb0, 0xcb, 0xb0, 0x23, 0xb1, |
||||
0xac, 0xb1, 0x0e, 0xb2, 0x42, 0xb2, 0xd7, 0xb2, 0xef, 0xb3, 0x21, 0xb5, |
||||
0x30, 0xb6, 0xe9, 0xb6, 0x54, 0xb7, 0xf0, 0xb7, 0x9e, 0xb8, 0x2e, 0xb9, |
||||
0x03, 0xba, 0x55, 0xbb, 0xdf, 0xbc, 0x5f, 0xbe, 0xb8, 0xbf, 0x01, 0xc1, |
||||
0x83, 0xc2, 0x0c, 0xc4, 0x65, 0xc5, 0x7e, 0xc6, 0x86, 0xc7, 0xba, 0xc8, |
||||
0x11, 0xca, 0x66, 0xcb, 0x28, 0xcd, 0x4d, 0xcf, 0x60, 0xd1, 0x69, 0xd3, |
||||
0x7b, 0xd5, 0x5f, 0xd7, 0xe3, 0xd8, 0xca, 0xda, 0xda, 0xdc, 0xda, 0xde, |
||||
0xab, 0xe0, 0x59, 0xe2, 0x3b, 0xe4, 0x21, 0xe6, 0xfc, 0xe7, 0xcb, 0xe9, |
||||
0xbe, 0xeb, 0x9c, 0xed, 0x47, 0xef, 0x0b, 0xf1, 0xd3, 0xf2, 0xbc, 0xf4, |
||||
0x9c, 0xf6, 0x67, 0xf8, 0x2a, 0xfa, 0xc1, 0xfb, 0x7f, 0xfd, 0x41, 0xff, |
||||
0x12, 0x01, 0xd2, 0x02, 0xfc, 0x04, 0xe8, 0x06, 0x9a, 0x08, 0x59, 0x0a, |
||||
0x48, 0x0c, 0x36, 0x0e, 0x37, 0x10, 0x36, 0x12, 0x59, 0x14, 0x62, 0x16, |
||||
0x86, 0x18, 0xb9, 0x1a, 0xc2, 0x1c, 0xcd, 0x1e, 0xf1, 0x20, 0x27, 0x23, |
||||
0x7a, 0x25, 0xf9, 0x27, 0x2a, 0x2a, 0x1f, 0x2c, 0xf8, 0x2d, 0xa3, 0x2f, |
||||
0x23, 0x31, 0xf4, 0x32, 0x2c, 0x35, 0x40, 0x37, 0x23, 0x39, 0xfe, 0x3a, |
||||
0x11, 0x3d, 0x2c, 0x3f, 0xe8, 0x40, 0x8c, 0x42, 0x55, 0x44, 0x37, 0x46, |
||||
0x99, 0x47, 0xcb, 0x48, 0x12, 0x4a, 0x60, 0x4b, 0x86, 0x4c, 0x9b, 0x4d, |
||||
0xc8, 0x4e, 0xec, 0x4f, 0xe3, 0x50, 0x8a, 0x51, 0x23, 0x52, 0xd8, 0x52, |
||||
0x68, 0x53, 0x9b, 0x53, 0xb1, 0x53, 0x11, 0x54, 0x94, 0x54, 0xf7, 0x54, |
||||
0x4f, 0x55, 0xa4, 0x55, 0x03, 0x56, 0x51, 0x56, 0x92, 0x56, 0xfa, 0x56, |
||||
0x59, 0x57, 0xad, 0x57, 0xcd, 0x57, 0xc5, 0x57, 0xa8, 0x57, 0x64, 0x57, |
||||
0x49, 0x57, 0x63, 0x57, 0x64, 0x57, 0x40, 0x57, 0xf6, 0x56, 0xfc, 0x56, |
||||
0x36, 0x57, 0x3b, 0x57, 0x1e, 0x57, 0x1c, 0x57, 0x03, 0x57, 0xee, 0x56, |
||||
0xa5, 0x56, 0x80, 0x56, 0xd4, 0x56, 0xe4, 0x56, 0x92, 0x56, 0xf0, 0x55, |
||||
0x02, 0x55, 0xab, 0x53, 0xb5, 0x52, 0x51, 0x52, 0x08, 0x52, 0x80, 0x51, |
||||
0xb4, 0x50, 0xde, 0x4f, 0x27, 0x4f, 0x63, 0x4e, 0x58, 0x4d, 0x72, 0x4c, |
||||
0x82, 0x4b, 0x81, 0x4a, 0x87, 0x49, 0xb4, 0x48, 0xb1, 0x47, 0x99, 0x46, |
||||
0xb4, 0x45, 0x34, 0x45, 0xb8, 0x44, 0x2f, 0x44, 0x7f, 0x43, 0xa0, 0x42, |
||||
0xcb, 0x41, 0xd1, 0x40, 0xeb, 0x3f, 0x28, 0x3f, 0x3d, 0x3e, 0x09, 0x3d, |
||||
0x9d, 0x3b, 0x40, 0x3a, 0x1c, 0x39, 0xeb, 0x37, 0xd1, 0x36, 0xb3, 0x35, |
||||
0x8b, 0x34, 0x0b, 0x33, 0x51, 0x31, 0xfb, 0x2f, 0xb9, 0x2e, 0x54, 0x2d, |
||||
0xaf, 0x2b, 0xdf, 0x29, 0xf1, 0x27, 0x3a, 0x26, 0x6f, 0x24, 0x56, 0x22, |
||||
0x20, 0x20, 0x0a, 0x1e, 0x3b, 0x1c, 0x55, 0x1a, 0x6c, 0x18, 0xaa, 0x16, |
||||
0xef, 0x14, 0x0a, 0x13, 0x17, 0x11, 0x1c, 0x0f, 0x22, 0x0d, 0x46, 0x0b, |
||||
0x53, 0x09, 0x46, 0x07, 0x46, 0x05, 0x4d, 0x03, 0x1a, 0x01, 0xd3, 0xfe, |
||||
0x94, 0xfc, 0x8c, 0xfa, 0x8f, 0xf8, 0xc1, 0xf6, 0x27, 0xf5, 0x8f, 0xf3, |
||||
0xf2, 0xf1, 0x74, 0xf0, 0xfa, 0xee, 0x4d, 0xed, 0x9e, 0xeb, 0xa2, 0xe9, |
||||
0x73, 0xe7, 0xa9, 0xe5, 0x2d, 0xe4, 0xa3, 0xe2, 0xf9, 0xe0, 0x50, 0xdf, |
||||
0xb9, 0xdd, 0x34, 0xdc, 0xad, 0xda, 0x0b, 0xd9, 0x77, 0xd7, 0xb9, 0xd5, |
||||
0x37, 0xd4, 0xff, 0xd2, 0x8a, 0xd1, 0x14, 0xd0, 0xba, 0xce, 0x7d, 0xcd, |
||||
0x2c, 0xcc, 0xa1, 0xca, 0x22, 0xc9, 0xa9, 0xc7, 0x0e, 0xc6, 0x66, 0xc4, |
||||
0xfc, 0xc2, 0xa5, 0xc1, 0x4a, 0xc0, 0xff, 0xbe, 0xf7, 0xbd, 0x0e, 0xbd, |
||||
0x1d, 0xbc, 0x16, 0xbb, 0xad, 0xb9, 0x44, 0xb8, 0xd7, 0xb6, 0x9e, 0xb5, |
||||
0x9f, 0xb4, 0x97, 0xb3, 0x72, 0xb2, 0x5f, 0xb1, 0x67, 0xb0, 0x89, 0xaf, |
||||
0x9d, 0xae, 0xbe, 0xad, 0x08, 0xad, 0x5d, 0xac, 0x8b, 0xab, 0xad, 0xaa, |
||||
0xe4, 0xa9, 0x59, 0xa9, 0xc4, 0xa8, 0x02, 0xa8, 0x4d, 0xa7, 0xc2, 0xa6, |
||||
0x4a, 0xa6, 0x09, 0xa6, 0xd2, 0xa5, 0x50, 0xa5, 0xec, 0xa4, 0xc2, 0xa4, |
||||
0xd9, 0xa4, 0xbd, 0xa4, 0x97, 0xa4, 0xa5, 0xa4, 0xbf, 0xa4, 0xb4, 0xa4, |
||||
0x8f, 0xa4, 0x31, 0xa4, 0x39, 0xa4, 0x7d, 0xa4, 0xab, 0xa4, 0xc7, 0xa4, |
||||
0xb3, 0xa4, 0xab, 0xa4, 0xca, 0xa4, 0x05, 0xa5, 0x1e, 0xa5, 0x2a, 0xa5, |
||||
0x2c, 0xa5, 0x18, 0xa5, 0x01, 0xa5, 0x33, 0xa5, 0x8c, 0xa5, 0xb2, 0xa5, |
||||
0x81, 0xa5, 0x5c, 0xa5, 0x6e, 0xa5, 0x79, 0xa5, 0x4e, 0xa5, 0x17, 0xa5, |
||||
0xff, 0xa4, 0x1c, 0xa5, 0x45, 0xa5, 0x8a, 0xa5, 0xbf, 0xa5, 0xdb, 0xa5, |
||||
0x41, 0xa6, 0xfb, 0xa6, 0xc6, 0xa7, 0x86, 0xa8, 0x29, 0xa9, 0x97, 0xa9, |
||||
0x27, 0xaa, 0xd7, 0xaa, 0x6d, 0xab, 0xf4, 0xab, 0x34, 0xac, 0x69, 0xac, |
||||
0xc6, 0xac, 0x37, 0xad, 0xaa, 0xad, 0x34, 0xae, 0xd3, 0xae, 0x81, 0xaf, |
||||
0x16, 0xb0, 0x72, 0xb0, 0xc8, 0xb0, 0x36, 0xb1, 0x91, 0xb1, 0xe0, 0xb1, |
||||
0x3b, 0xb2, 0x8e, 0xb2, 0xe0, 0xb2, 0x2a, 0xb3, 0xab, 0xb3, 0x3a, 0xb4, |
||||
0xf1, 0xb4, 0xc0, 0xb5, 0xae, 0xb6, 0x91, 0xb7, 0x82, 0xb8, 0x98, 0xb9, |
||||
0x8f, 0xba, 0x88, 0xbb, 0x65, 0xbc, 0x20, 0xbd, 0xcb, 0xbd, 0xaf, 0xbe, |
||||
0x94, 0xbf, 0x84, 0xc0, 0x85, 0xc1, 0x7b, 0xc2, 0x67, 0xc3, 0x66, 0xc4, |
||||
0x7f, 0xc5, 0x89, 0xc6, 0x6b, 0xc7, 0x38, 0xc8, 0x29, 0xc9, 0x4a, 0xca, |
||||
0x82, 0xcb, 0xc1, 0xcc, 0x12, 0xce, 0x5e, 0xcf, 0xb0, 0xd0, 0x25, 0xd2, |
||||
0x66, 0xd3, 0xde, 0xd4, 0x6c, 0xd6, 0x28, 0xd8, 0xd7, 0xd9, 0x80, 0xdb, |
||||
0xf7, 0xdc, 0x6f, 0xde, 0xd0, 0xdf, 0x22, 0xe1, 0x7a, 0xe2, 0xe5, 0xe3, |
||||
0x7a, 0xe5, 0xea, 0xe6, 0x51, 0xe8, 0xeb, 0xe9, 0x70, 0xeb, 0xb3, 0xec, |
||||
0x01, 0xee, 0x60, 0xef, 0xcb, 0xf0, 0x1d, 0xf2, 0x7b, 0xf3, 0xcf, 0xf4, |
||||
0x39, 0xf6, 0xc8, 0xf7, 0x82, 0xf9, 0x4a, 0xfb, 0xf2, 0xfc, 0x8c, 0xfe, |
||||
0x01, 0x00, 0x68, 0x01, 0x15, 0x03, 0xe6, 0x04, 0xbc, 0x06, 0x42, 0x08, |
||||
0xbb, 0x09, 0x2b, 0x0b, 0xc7, 0x0c, 0x35, 0x0e, 0x94, 0x0f, 0xf2, 0x10, |
||||
0x59, 0x12, 0xbc, 0x13, 0x34, 0x15, 0xac, 0x16, 0x1c, 0x18, 0x79, 0x19, |
||||
0xdc, 0x1a, 0x6d, 0x1c, 0x21, 0x1e, 0xca, 0x1f, 0x70, 0x21, 0x02, 0x23, |
||||
0x6c, 0x24, 0x9e, 0x25, 0x45, 0x27, 0x02, 0x29, 0x95, 0x2a, 0xff, 0x2b, |
||||
0x72, 0x2d, 0xe8, 0x2e, 0x48, 0x30, 0x7c, 0x31, 0xd2, 0x32, 0x3d, 0x34, |
||||
0xac, 0x35, 0x26, 0x37, 0xbc, 0x38, 0x4c, 0x3a, 0x90, 0x3b, 0xef, 0x3c, |
||||
0x61, 0x3e, 0xe8, 0x3f, 0x59, 0x41, 0xab, 0x42, 0xf7, 0x43, 0x2d, 0x45, |
||||
0x6c, 0x46, 0x78, 0x47, 0xb4, 0x48, 0x2e, 0x4a, 0x8e, 0x4b, 0xd7, 0x4c, |
||||
0xf4, 0x4d, 0xee, 0x4e, 0xcb, 0x4f, 0xc3, 0x50, 0xc2, 0x51, 0xac, 0x52, |
||||
0x61, 0x53, 0xf3, 0x53, 0xac, 0x54, 0x5f, 0x55, 0xf4, 0x55, 0x7f, 0x56, |
||||
0x04, 0x57, 0x9c, 0x57, 0x1f, 0x58, 0x7c, 0x58, 0xbc, 0x58, 0x0b, 0x59, |
||||
0x71, 0x59, 0xc1, 0x59, 0x0b, 0x5a, 0x3e, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, |
||||
0xa9, 0x5a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4c, 0x5a, 0x39, 0x5a, 0x32, 0x5a, |
||||
0x40, 0x5a, 0x33, 0x5a, 0x44, 0x5a, 0x58, 0x5a, 0x79, 0x5a, 0x7a, 0x5a, |
||||
0x69, 0x5a, 0x49, 0x5a, 0x54, 0x5a, 0x78, 0x5a, 0x72, 0x5a, 0x5f, 0x5a, |
||||
0x31, 0x5a, 0x11, 0x5a, 0xf9, 0x59, 0xea, 0x59, 0xd1, 0x59, 0xa1, 0x59, |
||||
0x48, 0x59, 0xf0, 0x58, 0xa2, 0x58, 0x6e, 0x58, 0x60, 0x58, 0x46, 0x58, |
||||
0x3f, 0x58, 0x47, 0x58, 0x40, 0x58, 0x08, 0x58, 0x9c, 0x57, 0x11, 0x57, |
||||
0x83, 0x56, 0xd7, 0x55, 0x42, 0x55, 0xab, 0x54, 0x06, 0x54, 0x63, 0x53, |
||||
0xa6, 0x52, 0xf0, 0x51, 0x55, 0x51, 0xbc, 0x50, 0x1e, 0x50, 0x8e, 0x4f, |
||||
0xf3, 0x4e, 0x34, 0x4e, 0x6b, 0x4d, 0xc9, 0x4c, 0x30, 0x4c, 0x7d, 0x4b, |
||||
0xd8, 0x4a, 0x49, 0x4a, 0xad, 0x49, 0x11, 0x49, 0x6c, 0x48, 0xa4, 0x47, |
||||
0xec, 0x46, 0x6c, 0x46, 0xde, 0x45, 0x5d, 0x45, 0xbc, 0x44, 0xf1, 0x43, |
||||
0x34, 0x43, 0x8c, 0x42, 0xf8, 0x41, 0x47, 0x41, 0x6a, 0x40, 0x72, 0x3f, |
||||
0x8b, 0x3e, 0xb3, 0x3d, 0xf2, 0x3c, 0x2f, 0x3c, 0x5c, 0x3b, 0x96, 0x3a, |
||||
0xbc, 0x39, 0xb2, 0x38, 0x91, 0x37, 0x8c, 0x36, 0x75, 0x35, 0x63, 0x34, |
||||
0x5e, 0x33, 0x63, 0x32, 0x4b, 0x31, 0x3c, 0x30, 0x1e, 0x2f, 0x07, 0x2e, |
||||
0xd0, 0x2c, 0xb2, 0x2b, 0x84, 0x2a, 0x4d, 0x29, 0xfc, 0x27, 0xa5, 0x26, |
||||
0x2f, 0x25, 0x95, 0x23, 0x1f, 0x22, 0xad, 0x20, 0x3a, 0x1f, 0x9e, 0x1d, |
||||
0x10, 0x1c, 0x6e, 0x1a, 0xe3, 0x18, 0x56, 0x17, 0xdb, 0x15, 0x58, 0x14, |
||||
0xba, 0x12, 0x2a, 0x11, 0x8b, 0x0f, 0xf4, 0x0d, 0x5b, 0x0c, 0xd3, 0x0a, |
||||
0x5f, 0x09, 0xe5, 0x07, 0x4a, 0x06, 0xc0, 0x04, 0x3e, 0x03, 0xb6, 0x01, |
||||
0x37, 0x00, 0xca, 0xfe, 0x74, 0xfd, 0x00, 0xfc, 0xa5, 0xfa, 0x4a, 0xf9, |
||||
0xd1, 0xf7, 0x7e, 0xf6, 0x1c, 0xf5, 0x9d, 0xf3, 0x4f, 0xf2, 0x0e, 0xf1, |
||||
0xc0, 0xef, 0x3a, 0xee, 0xd8, 0xec, 0x69, 0xeb, 0x0c, 0xea, 0xad, 0xe8, |
||||
0x56, 0xe7, 0xf8, 0xe5, 0xbe, 0xe4, 0x98, 0xe3, 0x61, 0xe2, 0x03, 0xe1, |
||||
0x99, 0xdf, 0x4d, 0xde, 0x0e, 0xdd, 0xde, 0xdb, 0xad, 0xda, 0x84, 0xd9, |
||||
0x62, 0xd8, 0x32, 0xd7, 0x01, 0xd6, 0xb7, 0xd4, 0x87, 0xd3, 0x97, 0xd2, |
||||
0x89, 0xd1, 0x89, 0xd0, 0x6e, 0xcf, 0x65, 0xce, 0x5d, 0xcd, 0x44, 0xcc, |
||||
0x13, 0xcb, 0xf2, 0xc9, 0xd3, 0xc8, 0xad, 0xc7, 0x9b, 0xc6, 0x94, 0xc5, |
||||
0x8e, 0xc4, 0x7b, 0xc3, 0x92, 0xc2, 0xad, 0xc1, 0xb2, 0xc0, 0xb9, 0xbf, |
||||
0xb3, 0xbe, 0xc0, 0xbd, 0xd5, 0xbc, 0xf2, 0xbb, 0xe1, 0xba, 0xc7, 0xb9, |
||||
0xc7, 0xb8, 0xe8, 0xb7, 0x09, 0xb7, 0x2c, 0xb6, 0x66, 0xb5, 0xb1, 0xb4, |
||||
0xf6, 0xb3, 0x32, 0xb3, 0x53, 0xb2, 0x92, 0xb1, 0xdb, 0xb0, 0x0d, 0xb0, |
||||
0x46, 0xaf, 0x62, 0xae, 0x98, 0xad, 0xd1, 0xac, 0x3f, 0xac, 0xb0, 0xab, |
||||
0x34, 0xab, 0xb1, 0xaa, 0x45, 0xaa, 0xda, 0xa9, 0x6a, 0xa9, 0xf1, 0xa8, |
||||
0x7d, 0xa8, 0x04, 0xa8, 0xbb, 0xa7, 0x80, 0xa7, 0x41, 0xa7, 0x02, 0xa7, |
||||
0xb6, 0xa6, 0x68, 0xa6, 0x3b, 0xa6, 0x1c, 0xa6, 0x0d, 0xa6, 0xfc, 0xa5, |
||||
0xd4, 0xa5, 0xa6, 0xa5, 0x81, 0xa5, 0x76, 0xa5, 0x61, 0xa5, 0x54, 0xa5, |
||||
0x48, 0xa5, 0x47, 0xa5, 0x4b, 0xa5, 0x49, 0xa5, 0x38, 0xa5, 0x4b, 0xa5, |
||||
0x6c, 0xa5, 0xa3, 0xa5, 0xda, 0xa5, 0xfe, 0xa5, 0x21, 0xa6, 0x4a, 0xa6, |
||||
0x8a, 0xa6, 0xb4, 0xa6, 0xe0, 0xa6, 0xf3, 0xa6, 0x1b, 0xa7, 0x17, 0xa7, |
||||
0x40, 0xa7, 0x8e, 0xa7, 0xcd, 0xa7, 0x06, 0xa8, 0x3e, 0xa8, 0x86, 0xa8, |
||||
0xbd, 0xa8, 0xde, 0xa8, 0xf6, 0xa8, 0x1c, 0xa9, 0x49, 0xa9, 0x5c, 0xa9, |
||||
0x79, 0xa9, 0x93, 0xa9, 0xab, 0xa9, 0xe6, 0xa9, 0x2c, 0xaa, 0x82, 0xaa, |
||||
0xbc, 0xaa, 0xec, 0xaa, 0x32, 0xab, 0x69, 0xab, 0xa7, 0xab, 0xde, 0xab, |
||||
0x19, 0xac, 0x53, 0xac, 0xbb, 0xac, 0x14, 0xad, 0x8a, 0xad, 0xeb, 0xad, |
||||
0x6c, 0xae, 0xe1, 0xae, 0x62, 0xaf, 0xd9, 0xaf, 0x58, 0xb0, 0xc0, 0xb0, |
||||
0x36, 0xb1, 0x99, 0xb1, 0x11, 0xb2, 0x71, 0xb2, 0xdc, 0xb2, 0x58, 0xb3, |
||||
0xbb, 0xb3, 0x37, 0xb4, 0xb6, 0xb4, 0x46, 0xb5, 0xca, 0xb5, 0x50, 0xb6, |
||||
0xd9, 0xb6, 0x6c, 0xb7, 0x03, 0xb8, 0x7e, 0xb8, 0xf0, 0xb8, 0x64, 0xb9, |
||||
0xcf, 0xb9, 0x47, 0xba, 0xd3, 0xba, 0x60, 0xbb, 0xe8, 0xbb, 0x70, 0xbc, |
||||
0xf3, 0xbc, 0x82, 0xbd, 0x05, 0xbe, 0xa1, 0xbe, 0x2a, 0xbf, 0xae, 0xbf, |
||||
0x25, 0xc0, 0xac, 0xc0, 0x52, 0xc1, 0xde, 0xc1, 0x75, 0xc2, 0x11, 0xc3, |
||||
0xb5, 0xc3, 0x42, 0xc4, 0xc5, 0xc4, 0x6d, 0xc5, 0x0b, 0xc6, 0xb2, 0xc6, |
||||
0x4b, 0xc7, 0xf6, 0xc7, 0x9b, 0xc8, 0x4f, 0xc9, 0x17, 0xca, 0xf3, 0xca, |
||||
0xc6, 0xcb, 0x9a, 0xcc, 0x7b, 0xcd, 0x54, 0xce, 0x32, 0xcf, 0x09, 0xd0, |
||||
0xd7, 0xd0, 0xc9, 0xd1, 0xc1, 0xd2, 0xb8, 0xd3, 0xb6, 0xd4, 0xae, 0xd5, |
||||
0xbc, 0xd6, 0xca, 0xd7, 0xd2, 0xd8, 0xca, 0xd9, 0xbd, 0xda, 0xc8, 0xdb, |
||||
0xd8, 0xdc, 0xf9, 0xdd, 0x08, 0xdf, 0x1e, 0xe0, 0x39, 0xe1, 0x4e, 0xe2, |
||||
0x60, 0xe3, 0x7a, 0xe4, 0x96, 0xe5, 0xc1, 0xe6, 0xde, 0xe7, 0x0e, 0xe9, |
||||
0x2a, 0xea, 0x42, 0xeb, 0x7a, 0xec, 0x9f, 0xed, 0xbb, 0xee, 0xd6, 0xef, |
||||
0xef, 0xf0, 0x0e, 0xf2, 0x30, 0xf3, 0x55, 0xf4, 0x68, 0xf5, 0x7e, 0xf6, |
||||
0xa4, 0xf7, 0xc0, 0xf8, 0xea, 0xf9, 0x10, 0xfb, 0x41, 0xfc, 0x7d, 0xfd, |
||||
0xad, 0xfe, 0xe3, 0xff, 0x10, 0x01, 0x27, 0x02, 0x58, 0x03, 0x74, 0x04, |
||||
0xa4, 0x05, 0xd5, 0x06, 0x0b, 0x08, 0x36, 0x09, 0x5c, 0x0a, 0x76, 0x0b, |
||||
0x9a, 0x0c, 0xc1, 0x0d, 0xd8, 0x0e, 0xf5, 0x0f, 0x15, 0x11, 0x3f, 0x12, |
||||
0x70, 0x13, 0x8e, 0x14, 0xcc, 0x15, 0xf2, 0x16, 0x31, 0x18, 0x4b, 0x19, |
||||
0x82, 0x1a, 0xa1, 0x1b, 0xbc, 0x1c, 0xde, 0x1d, 0xe9, 0x1e, 0x13, 0x20, |
||||
0x33, 0x21, 0x6c, 0x22, 0x80, 0x23, 0xa7, 0x24, 0xbc, 0x25, 0xde, 0x26, |
||||
0xe7, 0x27, 0x07, 0x29, 0x28, 0x2a, 0x36, 0x2b, 0x4d, 0x2c, 0x71, 0x2d, |
||||
0x91, 0x2e, 0xbe, 0x2f, 0xd6, 0x30, 0xfb, 0x31, 0x20, 0x33, 0x46, 0x34, |
||||
0x59, 0x35, 0x7a, 0x36, 0xa1, 0x37, 0xc2, 0x38, 0xdf, 0x39, 0x01, 0x3b, |
||||
0x0f, 0x3c, 0x27, 0x3d, 0x1f, 0x3e, 0x2e, 0x3f, 0x43, 0x40, 0x5b, 0x41, |
||||
0x73, 0x42, 0x8e, 0x43, 0xaf, 0x44, 0xbc, 0x45, 0xcc, 0x46, 0xd8, 0x47, |
||||
0xec, 0x48, 0xe1, 0x49, 0xd1, 0x4a, 0xc4, 0x4b, 0xb6, 0x4c, 0xa9, 0x4d, |
||||
0x9d, 0x4e, 0x88, 0x4f, 0x75, 0x50, 0x4c, 0x51, 0x3b, 0x52, 0x05, 0x53, |
||||
0xd9, 0x53, 0xa1, 0x54, 0x6f, 0x55, 0x33, 0x56, 0xe5, 0x56, 0x7d, 0x57, |
||||
0x15, 0x58, 0xb3, 0x58, 0x4e, 0x59, 0xdb, 0x59, 0x55, 0x5a, 0xc8, 0x5a, |
||||
0x36, 0x5b, 0xa9, 0x5b, 0x09, 0x5c, 0x5a, 0x5c, 0xab, 0x5c, 0xf1, 0x5c, |
||||
0x34, 0x5d, 0x6a, 0x5d, 0x9e, 0x5d, 0xc1, 0x5d, 0xea, 0x5d, 0x0b, 0x5e, |
||||
0x28, 0x5e, 0x3d, 0x5e, 0x41, 0x5e, 0x51, 0x5e, 0x5f, 0x5e, 0x69, 0x5e, |
||||
0x79, 0x5e, 0x6a, 0x5e, 0x78, 0x5e, 0x76, 0x5e, 0x7f, 0x5e, 0x72, 0x5e, |
||||
0x70, 0x5e, 0x61, 0x5e, 0x61, 0x5e, 0x42, 0x5e, 0x36, 0x5e, 0x2f, 0x5e, |
||||
0x2c, 0x5e, 0x1a, 0x5e, 0xec, 0x5d, 0xbf, 0x5d, 0x94, 0x5d, 0x71, 0x5d, |
||||
0x4c, 0x5d, 0x24, 0x5d, 0xfa, 0x5c, 0xc3, 0x5c, 0x8c, 0x5c, 0x59, 0x5c, |
||||
0x3e, 0x5c, 0x0c, 0x5c, 0xd3, 0x5b, 0xb1, 0x5b, 0x78, 0x5b, 0x45, 0x5b, |
||||
0x14, 0x5b, 0xed, 0x5a, 0xc0, 0x5a, 0x89, 0x5a, 0x4f, 0x5a, 0x16, 0x5a, |
||||
0xe5, 0x59, 0xb5, 0x59, 0x84, 0x59, 0x4e, 0x59, 0x0d, 0x59, 0xcf, 0x58, |
||||
0xa6, 0x58, 0x79, 0x58, 0x3e, 0x58, 0xf8, 0x57, 0xc0, 0x57, 0x83, 0x57, |
||||
0x38, 0x57, 0x03, 0x57, 0xc1, 0x56, 0x65, 0x56, 0xe0, 0x55, 0x52, 0x55, |
||||
0xd0, 0x54, 0x4c, 0x54, 0xbe, 0x53, 0x32, 0x53, 0xa7, 0x52, 0x2a, 0x52, |
||||
0x95, 0x51, 0x09, 0x51, 0x76, 0x50, 0xe9, 0x4f, 0x69, 0x4f, 0xe2, 0x4e, |
||||
0x49, 0x4e, 0xc0, 0x4d, 0x38, 0x4d, 0xbd, 0x4c, 0x2d, 0x4c, 0x98, 0x4b, |
||||
0x07, 0x4b, 0x76, 0x4a, 0xdc, 0x49, 0x4a, 0x49, 0xb9, 0x48, 0x2d, 0x48, |
||||
0x9c, 0x47, 0x19, 0x47, 0x80, 0x46, 0xf9, 0x45, 0x66, 0x45, 0xd6, 0x44, |
||||
0x47, 0x44, 0xb5, 0x43, 0x14, 0x43, 0x74, 0x42, 0xd4, 0x41, 0x42, 0x41, |
||||
0xa4, 0x40, 0x18, 0x40, 0x85, 0x3f, 0xeb, 0x3e, 0x52, 0x3e, 0xb2, 0x3d, |
||||
0x0c, 0x3d, 0x7a, 0x3c, 0xdb, 0x3b, 0x3a, 0x3b, 0x87, 0x3a, 0xe0, 0x39, |
||||
0x29, 0x39, 0x88, 0x38, 0xd1, 0x37, 0x16, 0x37, 0x4d, 0x36, 0x9e, 0x35, |
||||
0xdc, 0x34, 0x19, 0x34, 0x4a, 0x33, 0x83, 0x32, 0xb7, 0x31, 0xec, 0x30, |
||||
0x1c, 0x30, 0x47, 0x2f, 0x71, 0x2e, 0x88, 0x2d, 0xa6, 0x2c, 0xbb, 0x2b, |
||||
0xd0, 0x2a, 0xd8, 0x29, 0xdb, 0x28, 0xe3, 0x27, 0xf5, 0x26, 0xf1, 0x25, |
||||
0xf8, 0x24, 0xdc, 0x23, 0xdb, 0x22, 0xca, 0x21, 0xa7, 0x20, 0x85, 0x1f, |
||||
0x5a, 0x1e, 0x30, 0x1d, 0x0a, 0x1c, 0xd5, 0x1a, 0xa6, 0x19, 0x6d, 0x18, |
||||
0x3d, 0x17, 0xff, 0x15, 0xbf, 0x14, 0x81, 0x13, 0x57, 0x12, 0x15, 0x11, |
||||
0xe0, 0x0f, 0xa2, 0x0e, 0x65, 0x0d, 0x27, 0x0c, 0xf1, 0x0a, 0xb2, 0x09, |
||||
0x77, 0x08, 0x4b, 0x07, 0x0a, 0x06, 0xc9, 0x04, 0x97, 0x03, 0x65, 0x02, |
||||
0x3b, 0x01, 0x03, 0x00, 0xd2, 0xfe, 0x95, 0xfd, 0x6f, 0xfc, 0x50, 0xfb, |
||||
0x19, 0xfa, 0xf0, 0xf8, 0xb8, 0xf7, 0x97, 0xf6, 0x65, 0xf5, 0x48, 0xf4, |
||||
0x24, 0xf3, 0xfe, 0xf1, 0xec, 0xf0, 0xd2, 0xef, 0xa9, 0xee, 0x95, 0xed, |
||||
0x76, 0xec, 0x64, 0xeb, 0x61, 0xea, 0x43, 0xe9, 0x3a, 0xe8, 0x21, 0xe7, |
||||
0x14, 0xe6, 0xff, 0xe4, 0x06, 0xe4, 0x04, 0xe3, 0x04, 0xe2, 0x01, 0xe1, |
||||
0x02, 0xe0, 0x04, 0xdf, 0x16, 0xde, 0x1f, 0xdd, 0x29, 0xdc, 0x2d, 0xdb, |
||||
0x3d, 0xda, 0x45, 0xd9, 0x5a, 0xd8, 0x6f, 0xd7, 0x74, 0xd6, 0x8a, 0xd5, |
||||
0x91, 0xd4, 0xa5, 0xd3, 0xbb, 0xd2, 0xdb, 0xd1, 0x01, 0xd1, 0x17, 0xd0, |
||||
0x42, 0xcf, 0x5e, 0xce, 0x94, 0xcd, 0xb1, 0xcc, 0xe8, 0xcb, 0x04, 0xcb, |
||||
0x29, 0xca, 0x4e, 0xc9, 0x78, 0xc8, 0x99, 0xc7, 0xc4, 0xc6, 0xff, 0xc5, |
||||
0x3d, 0xc5, 0x76, 0xc4, 0xa6, 0xc3, 0xe4, 0xc2, 0x17, 0xc2, 0x4e, 0xc1, |
||||
0x8a, 0xc0, 0xc5, 0xbf, 0x0b, 0xbf, 0x42, 0xbe, 0x8e, 0xbd, 0xd8, 0xbc, |
||||
0x20, 0xbc, 0x60, 0xbb, 0xbb, 0xba, 0x08, 0xba, 0x5a, 0xb9, 0xba, 0xb8, |
||||
0x08, 0xb8, 0x64, 0xb7, 0xb1, 0xb6, 0x0c, 0xb6, 0x5d, 0xb5, 0xbf, 0xb4, |
||||
0x10, 0xb4, 0x7b, 0xb3, 0xd0, 0xb2, 0x3d, 0xb2, 0xa1, 0xb1, 0x0f, 0xb1, |
||||
0x84, 0xb0, 0xf2, 0xaf, 0x63, 0xaf, 0xd3, 0xae, 0x50, 0xae, 0xbd, 0xad, |
||||
0x49, 0xad, 0xc1, 0xac, 0x4d, 0xac, 0xc6, 0xab, 0x56, 0xab, 0xe4, 0xaa, |
||||
0x83, 0xaa, 0x0d, 0xaa, 0xac, 0xa9, 0x49, 0xa9, 0xf3, 0xa8, 0x9e, 0xa8, |
||||
0x4e, 0xa8, 0x07, 0xa8, 0xc5, 0xa7, 0x8d, 0xa7, 0x56, 0xa7, 0x1d, 0xa7, |
||||
0xf6, 0xa6, 0xc7, 0xa6, 0xad, 0xa6, 0x8c, 0xa6, 0x74, 0xa6, 0x58, 0xa6, |
||||
0x47, 0xa6, 0x2d, 0xa6, 0x24, 0xa6, 0x23, 0xa6, 0x21, 0xa6, 0x19, 0xa6, |
||||
0x20, 0xa6, 0x1f, 0xa6, 0x28, 0xa6, 0x3c, 0xa6, 0x4e, 0xa6, 0x59, 0xa6, |
||||
0x6e, 0xa6, 0x84, 0xa6, 0x9a, 0xa6, 0xb7, 0xa6, 0xd4, 0xa6, 0xef, 0xa6, |
||||
0x0a, 0xa7, 0x2f, 0xa7, 0x53, 0xa7, 0x77, 0xa7, 0x9c, 0xa7, 0xbc, 0xa7, |
||||
0xe5, 0xa7, 0x10, 0xa8, 0x35, 0xa8, 0x6d, 0xa8, 0x9b, 0xa8, 0xcb, 0xa8, |
||||
0xf5, 0xa8, 0x23, 0xa9, 0x5a, 0xa9, 0x80, 0xa9, 0xb7, 0xa9, 0xee, 0xa9, |
||||
0x1c, 0xaa, 0x46, 0xaa, 0x78, 0xaa, 0xb2, 0xaa, 0xeb, 0xaa, 0x1a, 0xab, |
||||
0x57, 0xab, 0x84, 0xab, 0xba, 0xab, 0xef, 0xab, 0x22, 0xac, 0x55, 0xac, |
||||
0x88, 0xac, 0xc1, 0xac, 0xf5, 0xac, 0x2a, 0xad, 0x67, 0xad, 0x9f, 0xad, |
||||
0xe0, 0xad, 0x14, 0xae, 0x4c, 0xae, 0x82, 0xae, 0xb8, 0xae, 0xf8, 0xae, |
||||
0x2c, 0xaf, 0x6a, 0xaf, 0x9d, 0xaf, 0xd4, 0xaf, 0x05, 0xb0, 0x38, 0xb0, |
||||
0x77, 0xb0, 0xb2, 0xb0, 0xf8, 0xb0, 0x3c, 0xb1, 0x97, 0xb1, 0x05, 0xb2, |
||||
0x6f, 0xb2, 0xdf, 0xb2, 0x48, 0xb3, 0xb2, 0xb3, 0x16, 0xb4, 0x7b, 0xb4, |
||||
0xe5, 0xb4, 0x54, 0xb5, 0xc3, 0xb5, 0x26, 0xb6, 0x97, 0xb6, 0x03, 0xb7, |
||||
0x68, 0xb7, 0xce, 0xb7, 0x44, 0xb8, 0xae, 0xb8, 0x20, 0xb9, 0x87, 0xb9, |
||||
0xf1, 0xb9, 0x5d, 0xba, 0xc6, 0xba, 0x24, 0xbb, 0xa1, 0xbb, 0x05, 0xbc, |
||||
0x79, 0xbc, 0xdc, 0xbc, 0x4b, 0xbd, 0xba, 0xbd, 0x24, 0xbe, 0x9b, 0xbe, |
||||
0x07, 0xbf, 0x72, 0xbf, 0xe5, 0xbf, 0x46, 0xc0, 0xc3, 0xc0, 0x1f, 0xc1, |
||||
0x91, 0xc1, 0x01, 0xc2, 0x79, 0xc2, 0xf1, 0xc2, 0x66, 0xc3, 0xe5, 0xc3, |
||||
0x55, 0xc4, 0xc8, 0xc4, 0x3e, 0xc5, 0xb3, 0xc5, 0x2d, 0xc6, 0xa7, 0xc6, |
||||
0x27, 0xc7, 0x97, 0xc7, 0x1f, 0xc8, 0xa0, 0xc8, 0x29, 0xc9, 0xad, 0xc9, |
||||
0x36, 0xca, 0xad, 0xca, 0x3d, 0xcb, 0xc0, 0xcb, 0x47, 0xcc, 0xe9, 0xcc, |
||||
0x6f, 0xcd, 0x06, 0xce, 0x84, 0xce, 0x1a, 0xcf, 0xbb, 0xcf, 0x55, 0xd0, |
||||
0xf6, 0xd0, 0x8b, 0xd1, 0x30, 0xd2, 0xd2, 0xd2, 0x79, 0xd3, 0x1c, 0xd4, |
||||
0xcf, 0xd4, 0x83, 0xd5, 0x36, 0xd6, 0xe1, 0xd6, 0x96, 0xd7, 0x5f, 0xd8, |
||||
0x1c, 0xd9, 0xe2, 0xd9, 0xa8, 0xda, 0x6c, 0xdb, 0x43, 0xdc, 0x04, 0xdd, |
||||
0xd8, 0xdd, 0xac, 0xde, 0x8a, 0xdf, 0x5b, 0xe0, 0x39, 0xe1, 0x0b, 0xe2, |
||||
0xf5, 0xe2, 0xde, 0xe3, 0xbc, 0xe4, 0x9e, 0xe5, 0x83, 0xe6, 0x62, 0xe7, |
||||
0x51, 0xe8, 0x34, 0xe9, 0x1e, 0xea, 0x12, 0xeb, 0xf7, 0xeb, 0xe5, 0xec, |
||||
0xc5, 0xed, 0xc2, 0xee, 0xb1, 0xef, 0xa6, 0xf0, 0x90, 0xf1, 0x7e, 0xf2, |
||||
0x6f, 0xf3, 0x56, 0xf4, 0x48, 0xf5, 0x35, 0xf6, 0x29, 0xf7, 0x17, 0xf8, |
||||
0x0a, 0xf9, 0x00, 0xfa, 0xe7, 0xfa, 0xde, 0xfb, 0xc9, 0xfc, 0xc1, 0xfd, |
||||
0xac, 0xfe, 0xae, 0xff, 0xa2, 0x00, 0x8d, 0x01, 0x70, 0x02, 0x62, 0x03, |
||||
0x4e, 0x04, 0x3a, 0x05, 0x26, 0x06, 0x16, 0x07, 0xff, 0x07, 0xf3, 0x08, |
||||
0xda, 0x09, 0xbe, 0x0a, 0xb9, 0x0b, 0xa1, 0x0c, 0x9b, 0x0d, 0x7d, 0x0e, |
||||
0x66, 0x0f, 0x54, 0x10, 0x36, 0x11, 0x20, 0x12, 0x11, 0x13, 0xf3, 0x13, |
||||
0xea, 0x14, 0xd1, 0x15, 0xb6, 0x16, 0x9b, 0x17, 0x83, 0x18, 0x7f, 0x19, |
||||
0x58, 0x1a, 0x53, 0x1b, 0x37, 0x1c, 0x22, 0x1d, 0x0a, 0x1e, 0xf3, 0x1e, |
||||
0xda, 0x1f, 0xca, 0x20, 0xb1, 0x21, 0x96, 0x22, 0x70, 0x23, 0x55, 0x24, |
||||
0x39, 0x25, 0x39, 0x26, 0x1a, 0x27, 0x07, 0x28, 0xe1, 0x28, 0xc5, 0x29, |
||||
0xa7, 0x2a, 0x85, 0x2b, 0x70, 0x2c, 0x4e, 0x2d, 0x3e, 0x2e, 0x19, 0x2f, |
||||
0xf3, 0x2f, 0xdf, 0x30, 0xc0, 0x31, 0xaf, 0x32, 0x93, 0x33, 0x77, 0x34, |
||||
0x48, 0x35, 0x2a, 0x36, 0x0f, 0x37, 0xf8, 0x37, 0xd9, 0x38, 0xbe, 0x39, |
||||
0x8b, 0x3a, 0x74, 0x3b, 0x48, 0x3c, 0x2d, 0x3d, 0xfa, 0x3d, 0xe7, 0x3e, |
||||
0xb0, 0x3f, 0x98, 0x40, 0x67, 0x41, 0x3a, 0x42, 0x16, 0x43, 0xf4, 0x43, |
||||
0xd8, 0x44, 0xa4, 0x45, 0x7c, 0x46, 0x4c, 0x47, 0x2a, 0x48, 0x06, 0x49, |
||||
0xce, 0x49, 0xa5, 0x4a, 0x77, 0x4b, 0x4e, 0x4c, 0x13, 0x4d, 0xdf, 0x4d, |
||||
0xaa, 0x4e, 0x74, 0x4f, 0x3d, 0x50, 0xfc, 0x50, 0xbd, 0x51, 0x8c, 0x52, |
||||
0x3e, 0x53, 0xfe, 0x53, 0x99, 0x54, 0x57, 0x55, 0xfc, 0x55, 0xab, 0x56, |
||||
0x45, 0x57, 0xd6, 0x57, 0x87, 0x58, 0x2f, 0x59, 0xbf, 0x59, 0x48, 0x5a, |
||||
0xc7, 0x5a, 0x54, 0x5b, 0xc8, 0x5b, 0x45, 0x5c, 0xb4, 0x5c, 0x25, 0x5d, |
||||
0x7e, 0x5d, 0xda, 0x5d, 0x36, 0x5e, 0xa5, 0x5e, 0xe9, 0x5e, 0x37, 0x5f, |
||||
0x72, 0x5f, 0xab, 0x5f, 0xe5, 0x5f, 0x1d, 0x60, 0x4f, 0x60, 0x81, 0x60, |
||||
0x9c, 0x60, 0xc3, 0x60, 0xdc, 0x60, 0xf7, 0x60, 0x04, 0x61, 0x16, 0x61, |
||||
0x1b, 0x61, 0x21, 0x61, 0x20, 0x61, 0x0d, 0x61, 0x0b, 0x61, 0xf0, 0x60, |
||||
0xe5, 0x60, 0xc7, 0x60, 0xb3, 0x60, 0x98, 0x60, 0x7c, 0x60, 0x59, 0x60, |
||||
0x4c, 0x60, 0x24, 0x60, 0x0d, 0x60, 0xdf, 0x5f, 0xb7, 0x5f, 0x87, 0x5f, |
||||
0x6b, 0x5f, 0x44, 0x5f, 0x28, 0x5f, 0xf5, 0x5e, 0xbd, 0x5e, 0x8f, 0x5e, |
||||
0x5c, 0x5e, 0x2a, 0x5e, 0xfe, 0x5d, 0xcd, 0x5d, 0xa4, 0x5d, 0x75, 0x5d, |
||||
0x4d, 0x5d, 0x11, 0x5d, 0xdf, 0x5c, 0xa9, 0x5c, 0x78, 0x5c, 0x42, 0x5c, |
||||
0x13, 0x5c, 0xde, 0x5b, 0xaf, 0x5b, 0x75, 0x5b, 0x3e, 0x5b, 0xfd, 0x5a, |
||||
0xbc, 0x5a, 0x90, 0x5a, 0x54, 0x5a, 0x1f, 0x5a, 0xe5, 0x59, 0xc2, 0x59, |
||||
0x80, 0x59, 0x39, 0x59, 0x0a, 0x59, 0xd6, 0x58, 0x96, 0x58, 0x55, 0x58, |
||||
0x1e, 0x58, 0xf1, 0x57, 0xc8, 0x57, 0x7e, 0x57, 0x44, 0x57, 0x11, 0x57, |
||||
0xd4, 0x56, 0x93, 0x56, 0x4c, 0x56, 0x11, 0x56, 0xd7, 0x55, 0xae, 0x55, |
||||
0x72, 0x55, 0x3c, 0x55, 0x0c, 0x55, 0xd1, 0x54, 0x98, 0x54, 0x63, 0x54, |
||||
0x2b, 0x54, 0xf8, 0x53, 0xc6, 0x53, 0x81, 0x53, 0x4b, 0x53, 0x19, 0x53, |
||||
0xea, 0x52, 0xb2, 0x52, 0x7e, 0x52, 0x30, 0x52, 0xc5, 0x51, 0x46, 0x51, |
||||
0xca, 0x50, 0x55, 0x50, 0xd7, 0x4f, 0x5d, 0x4f, 0xe4, 0x4e, 0x79, 0x4e, |
||||
0xfb, 0x4d, 0x83, 0x4d, 0x02, 0x4d, 0x8a, 0x4c, 0x1f, 0x4c, 0x98, 0x4b, |
||||
0x20, 0x4b, 0xa7, 0x4a, 0x36, 0x4a, 0xc0, 0x49, 0x44, 0x49, 0xc3, 0x48, |
||||
0x44, 0x48, 0xd5, 0x47, 0x59, 0x47, 0xe6, 0x46, 0x63, 0x46, 0xf8, 0x45, |
||||
0x79, 0x45, 0xfa, 0x44, 0x80, 0x44, 0x01, 0x44, 0x7a, 0x43, 0x04, 0x43, |
||||
0x85, 0x42, 0x07, 0x42, 0x92, 0x41, 0x17, 0x41, 0x94, 0x40, 0x16, 0x40, |
||||
0x9f, 0x3f, 0x20, 0x3f, 0x9c, 0x3e, 0x29, 0x3e, 0x9c, 0x3d, 0x20, 0x3d, |
||||
0x88, 0x3c, 0x0c, 0x3c, 0x87, 0x3b, 0x07, 0x3b, 0x89, 0x3a, 0xfb, 0x39, |
||||
0x6f, 0x39, 0xe7, 0x38, 0x55, 0x38, 0xcf, 0x37, 0x43, 0x37, 0xb5, 0x36, |
||||
0x2a, 0x36, 0x9c, 0x35, 0x0a, 0x35, 0x83, 0x34, 0xe6, 0x33, 0x53, 0x33, |
||||
0xba, 0x32, 0x1d, 0x32, 0x78, 0x31, 0xcb, 0x30, 0x34, 0x30, 0x8e, 0x2f, |
||||
0xf6, 0x2e, 0x56, 0x2e, 0xab, 0x2d, 0xfe, 0x2c, 0x4c, 0x2c, 0x9f, 0x2b, |
||||
0xed, 0x2a, 0x36, 0x2a, 0x7b, 0x29, 0xb9, 0x28, 0x02, 0x28, 0x41, 0x27, |
||||
0x81, 0x26, 0xb9, 0x25, 0xfb, 0x24, 0x2d, 0x24, 0x66, 0x23, 0x98, 0x22, |
||||
0xc6, 0x21, 0xe9, 0x20, 0x0d, 0x20, 0x28, 0x1f, 0x4c, 0x1e, 0x64, 0x1d, |
||||
0x66, 0x1c, 0x8c, 0x1b, 0x96, 0x1a, 0xac, 0x19, 0xb2, 0x18, 0xbb, 0x17, |
||||
0xc2, 0x16, 0xc7, 0x15, 0xcb, 0x14, 0xcd, 0x13, 0xc4, 0x12, 0xca, 0x11, |
||||
0xb6, 0x10, 0xb8, 0x0f, 0xa3, 0x0e, 0x9e, 0x0d, 0x88, 0x0c, 0x86, 0x0b, |
||||
0x7b, 0x0a, 0x7c, 0x09, 0x6d, 0x08, 0x5b, 0x07, 0x4a, 0x06, 0x38, 0x05, |
||||
0x2f, 0x04, 0x1c, 0x03, 0x10, 0x02, 0xf6, 0x00, 0xe9, 0xff, 0xe5, 0xfe, |
||||
0xcf, 0xfd, 0xc8, 0xfc, 0xb1, 0xfb, 0xa7, 0xfa, 0x8d, 0xf9, 0x7b, 0xf8, |
||||
0x7e, 0xf7, 0x77, 0xf6, 0x68, 0xf5, 0x62, 0xf4, 0x49, 0xf3, 0x42, 0xf2, |
||||
0x41, 0xf1, 0x3e, 0xf0, 0x49, 0xef, 0x47, 0xee, 0x56, 0xed, 0x46, 0xec, |
||||
0x56, 0xeb, 0x5c, 0xea, 0x6c, 0xe9, 0x7d, 0xe8, 0x9c, 0xe7, 0x99, 0xe6, |
||||
0xbf, 0xe5, 0xc9, 0xe4, 0xe5, 0xe3, 0xfd, 0xe2, 0x17, 0xe2, 0x26, 0xe1, |
||||
0x44, 0xe0, 0x6d, 0xdf, 0x9f, 0xde, 0xc5, 0xdd, 0xec, 0xdc, 0x26, 0xdc, |
||||
0x58, 0xdb, 0x91, 0xda, 0xb7, 0xd9, 0xf5, 0xd8, 0x27, 0xd8, 0x63, 0xd7, |
||||
0x96, 0xd6, 0xd5, 0xd5, 0x1a, 0xd5, 0x52, 0xd4, 0x9d, 0xd3, 0xde, 0xd2, |
||||
0x27, 0xd2, 0x6c, 0xd1, 0xb3, 0xd0, 0xf6, 0xcf, 0x51, 0xcf, 0x98, 0xce, |
||||
0xe9, 0xcd, 0x2f, 0xcd, 0x88, 0xcc, 0xdc, 0xcb, 0x41, 0xcb, 0x9f, 0xca, |
||||
0x01, 0xca, 0x60, 0xc9, 0xc4, 0xc8, 0x13, 0xc8, 0x7e, 0xc7, 0xe2, 0xc6, |
||||
0x51, 0xc6, 0xb6, 0xc5, 0x1a, 0xc5, 0x8e, 0xc4, 0xf6, 0xc3, 0x74, 0xc3, |
||||
0xdf, 0xc2, 0x59, 0xc2, 0xd2, 0xc1, 0x47, 0xc1, 0xbe, 0xc0, 0x3b, 0xc0, |
||||
0xbe, 0xbf, 0x3e, 0xbf, 0xc4, 0xbe, 0x39, 0xbe, 0xbf, 0xbd, 0x3e, 0xbd, |
||||
0xd7, 0xbc, 0x5d, 0xbc, 0xec, 0xbb, 0x73, 0xbb, 0x07, 0xbb, 0x96, 0xba, |
||||
0x24, 0xba, 0xb5, 0xb9, 0x49, 0xb9, 0xdd, 0xb8, 0x76, 0xb8, 0x02, 0xb8, |
||||
0xa8, 0xb7, 0x3c, 0xb7, 0xee, 0xb6, 0x82, 0xb6, 0x2b, 0xb6, 0xc3, 0xb5, |
||||
0x6e, 0xb5, 0x14, 0xb5, 0xc4, 0xb4, 0x6b, 0xb4, 0x20, 0xb4, 0xd2, 0xb3, |
||||
0x78, 0xb3, 0x2c, 0xb3, 0xe6, 0xb2, 0x9e, 0xb2, 0x58, 0xb2, 0x1a, 0xb2, |
||||
0xea, 0xb1, 0xa6, 0xb1, 0x63, 0xb1, 0x2b, 0xb1, 0xf3, 0xb0, 0xb8, 0xb0, |
||||
0x7b, 0xb0, 0x4e, 0xb0, 0x20, 0xb0, 0xf9, 0xaf, 0xc6, 0xaf, 0xa2, 0xaf, |
||||
0x84, 0xaf, 0x5e, 0xaf, 0x44, 0xaf, 0x21, 0xaf, 0x06, 0xaf, 0xe9, 0xae, |
||||
0xe2, 0xae, 0xd0, 0xae, 0xc3, 0xae, 0xba, 0xae, 0xc1, 0xae, 0xaf, 0xae, |
||||
0xbc, 0xae, 0xb5, 0xae, 0xc0, 0xae, 0xc3, 0xae, 0xd7, 0xae, 0xdd, 0xae, |
||||
0xfb, 0xae, 0x0a, 0xaf, 0x16, 0xaf, 0x37, 0xaf, 0x4a, 0xaf, 0x70, 0xaf, |
||||
0x86, 0xaf, 0xa9, 0xaf, 0xc7, 0xaf, 0xec, 0xaf, 0x12, 0xb0, 0x42, 0xb0, |
||||
0x66, 0xb0, 0x91, 0xb0, 0xc0, 0xb0, 0xee, 0xb0, 0x1a, 0xb1, 0x4c, 0xb1, |
||||
0x77, 0xb1, 0xb3, 0xb1, 0xdd, 0xb1, 0x10, 0xb2, 0x47, 0xb2, 0x70, 0xb2, |
||||
0xb8, 0xb2, 0xef, 0xb2, 0x26, 0xb3, 0x64, 0xb3, 0x90, 0xb3, 0xd8, 0xb3, |
||||
0x07, 0xb4, 0x4b, 0xb4, 0x83, 0xb4, 0xc7, 0xb4, 0xf4, 0xb4, 0x35, 0xb5, |
||||
0x70, 0xb5, 0xbc, 0xb5, 0xf0, 0xb5, 0x39, 0xb6, 0x7d, 0xb6, 0xb7, 0xb6, |
||||
0xfa, 0xb6, 0x2e, 0xb7, 0x7d, 0xb7, 0xbb, 0xb7, 0x01, 0xb8, 0x39, 0xb8, |
||||
0x80, 0xb8, 0xbd, 0xb8, 0x05, 0xb9, 0x46, 0xb9, 0x94, 0xb9, 0xcd, 0xb9, |
||||
0x17, 0xba, 0x5b, 0xba, 0x9e, 0xba, 0xdf, 0xba, 0x27, 0xbb, 0x6a, 0xbb, |
||||
0xbc, 0xbb, 0xf6, 0xbb, 0x3a, 0xbc, 0x83, 0xbc, 0xc3, 0xbc, 0x16, 0xbd, |
||||
0x58, 0xbd, 0xa2, 0xbd, 0xe0, 0xbd, 0x24, 0xbe, 0x70, 0xbe, 0xa1, 0xbe, |
||||
0xfa, 0xbe, 0x37, 0xbf, 0x8d, 0xbf, 0xc9, 0xbf, 0x1d, 0xc0, 0x5d, 0xc0, |
||||
0xa6, 0xc0, 0xe6, 0xc0, 0x2f, 0xc1, 0x7a, 0xc1, 0xcb, 0xc1, 0x2f, 0xc2, |
||||
0x95, 0xc2, 0xfa, 0xc2, 0x55, 0xc3, 0xbb, 0xc3, 0x1e, 0xc4, 0x86, 0xc4, |
||||
0xec, 0xc4, 0x4b, 0xc5, 0xab, 0xc5, 0x04, 0xc6, 0x72, 0xc6, 0xc6, 0xc6, |
||||
0x3a, 0xc7, 0x8e, 0xc7, 0xfd, 0xc7, 0x5a, 0xc8, 0xc0, 0xc8, 0x17, 0xc9, |
||||
0x79, 0xc9, 0xd5, 0xc9, 0x43, 0xca, 0x98, 0xca, 0x05, 0xcb, 0x64, 0xcb, |
||||
0xc3, 0xcb, 0x1e, 0xcc, 0x81, 0xcc, 0xe3, 0xcc, 0x40, 0xcd, 0xa6, 0xcd, |
||||
0x0a, 0xce, 0x6a, 0xce, 0xc0, 0xce, 0x26, 0xcf, 0x81, 0xcf, 0xf0, 0xcf, |
||||
0x48, 0xd0, 0xad, 0xd0, 0x07, 0xd1, 0x71, 0xd1, 0xca, 0xd1, 0x2b, 0xd2, |
||||
0x8a, 0xd2, 0xed, 0xd2, 0x50, 0xd3, 0xa1, 0xd3, 0x0f, 0xd4, 0x6f, 0xd4, |
||||
0xd6, 0xd4, 0x30, 0xd5, 0x93, 0xd5, 0xf6, 0xd5, 0x55, 0xd6, 0xb5, 0xd6, |
||||
0x12, 0xd7, 0x7b, 0xd7, 0xde, 0xd7, 0x34, 0xd8, 0x93, 0xd8, 0xe9, 0xd8, |
||||
0x61, 0xd9, 0xbb, 0xd9, 0x2b, 0xda, 0x88, 0xda, 0xeb, 0xda, 0x4f, 0xdb, |
||||
0xb9, 0xdb, 0x21, 0xdc, 0x80, 0xdc, 0xf7, 0xdc, 0x53, 0xdd, 0xbb, 0xdd, |
||||
0x2b, 0xde, 0xa4, 0xde, 0x05, 0xdf, 0x74, 0xdf, 0xd8, 0xdf, 0x44, 0xe0, |
||||
0xb4, 0xe0, 0x26, 0xe1, 0x91, 0xe1, 0x01, 0xe2, 0x77, 0xe2, 0xeb, 0xe2, |
||||
0x5e, 0xe3, 0xc7, 0xe3, 0x44, 0xe4, 0xb2, 0xe4, 0x25, 0xe5, 0xa3, 0xe5, |
||||
0x15, 0xe6, 0x97, 0xe6, 0x0b, 0xe7, 0x8b, 0xe7, 0x10, 0xe8, 0x7d, 0xe8, |
||||
0x06, 0xe9, 0x74, 0xe9, 0xff, 0xe9, 0x82, 0xea, 0x01, 0xeb, 0x85, 0xeb, |
||||
0xfa, 0xeb, 0x91, 0xec, 0x07, 0xed, 0x8f, 0xed, 0x15, 0xee, 0x9a, 0xee, |
||||
0x26, 0xef, 0xa5, 0xef, 0x26, 0xf0, 0xb2, 0xf0, 0x3e, 0xf1, 0xca, 0xf1, |
||||
0x45, 0xf2, 0xcc, 0xf2, 0x51, 0xf3, 0xdc, 0xf3, 0x5c, 0xf4, 0xe8, 0xf4, |
||||
0x6e, 0xf5, 0xf9, 0xf5, 0x79, 0xf6, 0xf9, 0xf6, 0x7d, 0xf7, 0x08, 0xf8, |
||||
0x91, 0xf8, 0x18, 0xf9, 0x95, 0xf9, 0x18, 0xfa, 0xa5, 0xfa, 0x21, 0xfb, |
||||
0xa9, 0xfb, 0x2a, 0xfc, 0xa7, 0xfc, 0x23, 0xfd, 0xa3, 0xfd, 0x2b, 0xfe, |
||||
0x9c, 0xfe, 0x2b, 0xff, 0xa0, 0xff, 0x1c, 0x00, 0x9a, 0x00, 0x11, 0x01, |
||||
0x9a, 0x01, 0x14, 0x02, 0x8c, 0x02, 0x07, 0x03, 0x84, 0x03, 0xf7, 0x03, |
||||
0x75, 0x04, 0xf3, 0x04, 0x65, 0x05, 0xe8, 0x05, 0x54, 0x06, 0xd3, 0x06, |
||||
0x48, 0x07, 0xc2, 0x07, 0x38, 0x08, 0xad, 0x08, 0x28, 0x09, 0x99, 0x09, |
||||
0x11, 0x0a, 0x79, 0x0a, 0xf5, 0x0a, 0x5c, 0x0b, 0xd1, 0x0b, 0x3f, 0x0c, |
||||
0xb5, 0x0c, 0x2c, 0x0d, 0x9a, 0x0d, 0x0b, 0x0e, 0x74, 0x0e, 0xe6, 0x0e, |
||||
0x45, 0x0f, 0xbd, 0x0f, 0x2f, 0x10, 0x9a, 0x10, 0x05, 0x11, 0x6c, 0x11, |
||||
0xdb, 0x11, 0x40, 0x12, 0xaa, 0x12, 0x14, 0x13, 0x81, 0x13, 0xe9, 0x13, |
||||
0x4d, 0x14, 0xb9, 0x14, 0x18, 0x15, 0x88, 0x15, 0xe6, 0x15, 0x58, 0x16, |
||||
0xb9, 0x16, 0x1c, 0x17, 0x7e, 0x17, 0xe3, 0x17, 0x43, 0x18, 0xac, 0x18, |
||||
0x08, 0x19, 0x6d, 0x19, 0xce, 0x19, 0x34, 0x1a, 0x90, 0x1a, 0xf5, 0x1a, |
||||
0x53, 0x1b, 0xbb, 0x1b, 0x07, 0x1c, 0x6f, 0x1c, 0xc2, 0x1c, 0x28, 0x1d, |
||||
0x84, 0x1d, 0xe8, 0x1d, 0x35, 0x1e, 0xa2, 0x1e, 0xf8, 0x1e, 0x59, 0x1f, |
||||
0xb8, 0x1f, 0x0c, 0x20, 0x69, 0x20, 0xbe, 0x20, 0x19, 0x21, 0x66, 0x21, |
||||
0xc6, 0x21, 0x1f, 0x22, 0x70, 0x22, 0xbe, 0x22, 0x18, 0x23, 0x72, 0x23, |
||||
0xbf, 0x23, 0x0f, 0x24, 0x67, 0x24, 0xc0, 0x24, 0x08, 0x25, 0x51, 0x25, |
||||
0xa6, 0x25, 0xf4, 0x25, 0x42, 0x26, 0x93, 0x26, 0xd6, 0x26, 0x25, 0x27, |
||||
0x6c, 0x27, 0xb7, 0x27, 0x07, 0x28, 0x49, 0x28, 0x96, 0x28, 0xda, 0x28, |
||||
0x22, 0x29, 0x66, 0x29, 0xa4, 0x29, 0xe8, 0x29, 0x20, 0x2a, 0x62, 0x2a, |
||||
0xa9, 0x2a, 0xe5, 0x2a, 0x21, 0x2b, 0x5a, 0x2b, 0x97, 0x2b, 0xc1, 0x2b, |
||||
0xfe, 0x2b, 0x28, 0x2c, 0x57, 0x2c, 0x88, 0x2c, 0xae, 0x2c, 0xd3, 0x2c, |
||||
0xfa, 0x2c, 0x17, 0x2d, 0x33, 0x2d, 0x4b, 0x2d, 0x5d, 0x2d, 0x68, 0x2d, |
||||
0x81, 0x2d, 0x92, 0x2d, 0x9e, 0x2d, 0xa9, 0x2d, 0xbb, 0x2d, 0xc3, 0x2d, |
||||
0xcd, 0x2d, 0xd5, 0x2d, 0xcd, 0x2d, 0xdc, 0x2d, 0xe3, 0x2d, 0xe1, 0x2d, |
||||
0xdd, 0x2d, 0xd9, 0x2d, 0xd7, 0x2d, 0xcf, 0x2d, 0xe0, 0x2d, 0xd2, 0x2d, |
||||
0xd2, 0x2d, 0xcb, 0x2d, 0xb7, 0x2d, 0xb6, 0x2d, 0xa1, 0x2d, 0x9e, 0x2d, |
||||
0x8b, 0x2d, 0x84, 0x2d, 0x68, 0x2d, 0x6a, 0x2d, 0x4e, 0x2d, 0x45, 0x2d, |
||||
0x2f, 0x2d, 0x18, 0x2d, 0x15, 0x2d, 0xef, 0x2c, 0xe8, 0x2c, 0xc9, 0x2c, |
||||
0xc7, 0x2c, 0xaa, 0x2c, 0x9b, 0x2c, 0x7c, 0x2c, 0x64, 0x2c, 0x3c, 0x2c, |
||||
0x2e, 0x2c, 0x16, 0x2c, 0x05, 0x2c, 0xe1, 0x2b, 0xc8, 0x2b, 0xb5, 0x2b, |
||||
0x9a, 0x2b, 0x7c, 0x2b, 0x61, 0x2b, 0x3f, 0x2b, 0x21, 0x2b, 0x01, 0x2b, |
||||
0xee, 0x2a, 0xd0, 0x2a, 0xb3, 0x2a, 0x95, 0x2a, 0x6d, 0x2a, 0x50, 0x2a, |
||||
0x2b, 0x2a, 0x0b, 0x2a, 0xe9, 0x29, 0xd1, 0x29, 0xa8, 0x29, 0x97, 0x29, |
||||
0x6c, 0x29, 0x51, 0x29, 0x24, 0x29, 0x03, 0x29, 0xe6, 0x28, 0xbe, 0x28, |
||||
0xa1, 0x28, 0x80, 0x28, 0x64, 0x28, 0x38, 0x28, 0x12, 0x28, 0xf0, 0x27, |
||||
0xd3, 0x27, 0xac, 0x27, 0x94, 0x27, 0x67, 0x27, 0x4a, 0x27, 0x1c, 0x27, |
||||
0xf7, 0x26, 0xd1, 0x26, 0xb6, 0x26, 0x8d, 0x26, 0x6e, 0x26, 0x4b, 0x26, |
||||
0x25, 0x26, 0x02, 0x26, 0xd8, 0x25, 0xbe, 0x25, 0x93, 0x25, 0x7c, 0x25, |
||||
0x4a, 0x25, 0x27, 0x25, 0x07, 0x25, 0xdc, 0x24, 0xbb, 0x24, 0x9a, 0x24, |
||||
0x78, 0x24, 0x4c, 0x24, 0x26, 0x24, 0x00, 0x24, 0xd7, 0x23, 0xc0, 0x23, |
||||
0x94, 0x23, 0x71, 0x23, 0x45, 0x23, 0x1c, 0x23, 0x00, 0x23, 0xd4, 0x22, |
||||
0xb5, 0x22, 0x8e, 0x22, 0x67, 0x22, 0x39, 0x22, 0x00, 0x22, 0xbd, 0x21, |
||||
0x87, 0x21, 0x46, 0x21, 0x01, 0x21, 0xca, 0x20, 0x89, 0x20, 0x4a, 0x20, |
||||
0x17, 0x20, 0xd6, 0x1f, 0x9a, 0x1f, 0x5e, 0x1f, 0x20, 0x1f, 0xe0, 0x1e, |
||||
0xa3, 0x1e, 0x5f, 0x1e, 0x29, 0x1e, 0xf0, 0x1d, 0xb8, 0x1d, 0x78, 0x1d, |
||||
0x36, 0x1d, 0x04, 0x1d, 0xc6, 0x1c, 0x8b, 0x1c, 0x4d, 0x1c, 0x18, 0x1c, |
||||
0xd9, 0x1b, 0x97, 0x1b, 0x5c, 0x1b, 0x2b, 0x1b, 0xf4, 0x1a, 0xb1, 0x1a, |
||||
0x7c, 0x1a, 0x32, 0x1a, 0x02, 0x1a, 0xc6, 0x19, 0x8b, 0x19, 0x59, 0x19, |
||||
0x10, 0x19, 0xd7, 0x18, 0x9c, 0x18, 0x62, 0x18, 0x22, 0x18, 0xe8, 0x17, |
||||
0xb1, 0x17, 0x7c, 0x17, 0x34, 0x17, 0xf9, 0x16, 0xc0, 0x16, 0x8b, 0x16, |
||||
0x55, 0x16, 0x14, 0x16, 0xdd, 0x15, 0x9f, 0x15, 0x65, 0x15, 0x2b, 0x15, |
||||
0xea, 0x14, 0xb9, 0x14, 0x70, 0x14, 0x3d, 0x14, 0x05, 0x14, 0xc1, 0x13, |
||||
0x86, 0x13, 0x45, 0x13, 0x09, 0x13, 0xca, 0x12, 0x90, 0x12, 0x57, 0x12, |
||||
0x1a, 0x12, 0xe1, 0x11, 0x9b, 0x11, 0x61, 0x11, 0x1d, 0x11, 0xe1, 0x10, |
||||
0x9d, 0x10, 0x64, 0x10, 0x17, 0x10, 0xde, 0x0f, 0xa1, 0x0f, 0x60, 0x0f, |
||||
0x1b, 0x0f, 0xd8, 0x0e, 0x90, 0x0e, 0x5b, 0x0e, 0x0e, 0x0e, 0xd3, 0x0d, |
||||
0x86, 0x0d, 0x4d, 0x0d, 0xf5, 0x0c, 0xba, 0x0c, 0x68, 0x0c, 0x2a, 0x0c, |
||||
0xde, 0x0b, 0x94, 0x0b, 0x4e, 0x0b, 0x07, 0x0b, 0xbb, 0x0a, 0x6c, 0x0a, |
||||
0x25, 0x0a, 0xd4, 0x09, 0x89, 0x09, 0x39, 0x09, 0xe6, 0x08, 0xa3, 0x08, |
||||
0x4f, 0x08, 0x02, 0x08, 0xa7, 0x07, 0x5f, 0x07, 0x08, 0x07, 0xba, 0x06, |
||||
0x68, 0x06, 0x1f, 0x06, 0xc5, 0x05, 0x7a, 0x05, 0x1f, 0x05, 0xd7, 0x04, |
||||
0x85, 0x04, 0x31, 0x04, 0xde, 0x03, 0x89, 0x03, 0x3a, 0x03, 0xe9, 0x02, |
||||
0x96, 0x02, 0x47, 0x02, 0xf7, 0x01, 0xa4, 0x01, 0x5d, 0x01, 0x06, 0x01, |
||||
0xb9, 0x00 |
||||
}; |
||||
unsigned int kick_raw_len = 6350; |
@ -1,20 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
project(sd_raw) |
||||
set(CMAKE_CXX_STANDARD 14) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
include_directories(../../../src) |
||||
add_executable(sd_raw sd_raw.cpp) |
||||
|
||||
target_link_libraries(sd_raw ${teensy_x86_stubs_LIBS}) |
||||
target_link_libraries(sd_raw ${teensy_audio_x86_stubs_LIBS}) |
||||
target_link_libraries(sd_raw ${teensy_x86_sd_stubs_LIBS}) |
||||
target_link_libraries(sd_raw teensy_variable_playback) |
@ -1,74 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example requires an uSD-card inserted to teensy 3.6 with a file called DEMO.RAW
|
||||
#include <Arduino.h> |
||||
#include <AudioStream.h> |
||||
#include <Audio.h> |
||||
#include "SD.h" |
||||
#include "playsdresmp.h" |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioControlSGTL5000 audioShield; |
||||
AudioPlaySdResmp playSdRaw1; //xy=324,457
|
||||
AudioOutputI2S i2s2; //xy=840.8571472167969,445.5714416503906
|
||||
AudioConnection patchCord1(playSdRaw1, 0, i2s2, 0); |
||||
AudioConnection patchCord2(playSdRaw1, 0, i2s2, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
#define A14 10 |
||||
#define BUILTIN_SDCARD 10 |
||||
|
||||
const char* _filename = "DEMO.RAW"; |
||||
const int analogInPin = A14; |
||||
|
||||
int sensorValue = 0; |
||||
|
||||
void setup() { |
||||
analogReference(0); |
||||
pinMode(analogInPin, INPUT); |
||||
|
||||
Serial.begin(57600); |
||||
|
||||
if (!(SD.begin(BUILTIN_SDCARD))) { |
||||
// stop here if no SD card, but print a message
|
||||
while (1) { |
||||
Serial.println("Unable to access the SD card"); |
||||
delay(500); |
||||
} |
||||
} |
||||
|
||||
AudioMemory(24); |
||||
|
||||
audioShield.enable(); |
||||
audioShield.volume(0.5); |
||||
|
||||
playSdRaw1.playRaw(_filename, 1); |
||||
playSdRaw1.setPlaybackRate(-1); |
||||
Serial.println("playing..."); |
||||
} |
||||
|
||||
void loop() { |
||||
|
||||
int newsensorValue = analogRead(analogInPin); |
||||
if (newsensorValue / 64 != sensorValue / 64) { |
||||
sensorValue = newsensorValue; |
||||
float rate = (sensorValue - 512.0) / 512.0; |
||||
playSdRaw1.setPlaybackRate(rate); |
||||
Serial.printf("rate: %f %x\n", rate, sensorValue); |
||||
} |
||||
|
||||
if (!playSdRaw1.isPlaying()) { |
||||
Serial.println("playing..."); |
||||
playSdRaw1.playRaw(_filename, 1); |
||||
} |
||||
} |
||||
|
||||
#ifdef BUILD_FOR_LINUX |
||||
int main() { |
||||
initialize_mock_arduino(); |
||||
SD.setSDCardFileData("234234234", 5); |
||||
setup(); |
||||
while(true){ |
||||
loop(); |
||||
} |
||||
} |
||||
#endif |
@ -1,51 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
project(save_raw) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs_soundio) |
||||
if(teensy_audio_x86_stubs_soundio_FOUND) |
||||
include_directories(${teensy_audio_x86_stubs_soundio_INCLUDE_DIR}) |
||||
|
||||
include_directories(/usr/local/include) #soundio |
||||
include_directories(../../../src) |
||||
|
||||
add_executable(save_raw save_raw.cpp) |
||||
target_link_libraries(save_raw teensy_variable_playback) |
||||
|
||||
if(WIN32) |
||||
elseif(UNIX AND NOT APPLE) |
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") |
||||
SET(SOUNDIO_LIBS -L/usr/lib/x86_64-linux-gnu -lsoundio) |
||||
elseif(APPLE) |
||||
INCLUDE_DIRECTORIES(/System/Library/Frameworks) |
||||
FIND_LIBRARY(glfw3_LIBRARY glfw) |
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa) |
||||
FIND_LIBRARY(OpenGL_LIBRARY OpenGL) |
||||
FIND_LIBRARY(IOKit_LIBRARY IOKit) |
||||
FIND_LIBRARY(glew_LIBRARY glew) |
||||
FIND_LIBRARY(CoreVideo_LIBRARY CoreVideo) |
||||
MARK_AS_ADVANCED(COCOA_LIBRARY OpenGL_LIBRARY) |
||||
FIND_LIBRARY(FREETYPE_LIBRARIES FreeType) |
||||
SET(APPLE_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${OpenGL_LIBRARY} ${CoreVideo_LIBRARY}) |
||||
SET(APPLE_LIBS ${APPLE_LIBS} ${GLFW3_LIBRARY} ${ASSIMP_LIBRARY} ${FREETYPE_LIBRARIES} ${glfw3_LIBRARY} ${glew_LIBRARY}) |
||||
set(LIBS ${LIBS} ${APPLE_LIBS}) |
||||
target_link_libraries(save_raw |
||||
"-framework CoreServices" |
||||
"-framework CoreAudio" |
||||
"-framework Foundation" |
||||
"-framework AudioUnit") |
||||
SET(SOUNDIO_LIBS /usr/local/lib/libsoundio.a) |
||||
endif() |
||||
|
||||
target_link_libraries(save_raw ${LIBS} ${teensy_x86_stubs_LIBS} ${teensy_x86_sd_stubs_LIBS} ${teensy_audio_x86_stubs_LIBS} ${teensy_audio_x86_stubs_soundio_LIBS} ${teensy_st7735_linux_stubs_LIBS} ${teensy_st7735_linux_extras_opengl_LIBS} ${SOUNDIO_LIBS}) |
||||
#set(CMAKE_VERBOSE_MAKEFILE 1) |
||||
endif() |
@ -1,692 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include "../../../src/playarrayresmp.h" |
||||
#include "output_soundio.h" |
||||
#include <soundio/soundio.h> |
||||
#include <SD.h> |
||||
#include <iostream> |
||||
#include <execinfo.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
#include <string> |
||||
#include <cassert> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=306,225
|
||||
AudioRecordQueue queue1; //xy=609,267
|
||||
AudioOutputSoundIO sio_out1; //xy=612,224
|
||||
AudioConnection patchCord1(rraw_a1, 0, sio_out1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, sio_out1, 1); |
||||
AudioConnection patchCord3(rraw_a1, 0, queue1, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
extern unsigned int kick_raw_len; |
||||
extern unsigned char kick_raw[]; |
||||
|
||||
int16_t buffer[512] = {0}; |
||||
File frec; |
||||
|
||||
unsigned long lastSamplePlayed = 0; |
||||
void my_handler(sig_atomic_t i); |
||||
static char stack_body[64*1024]; |
||||
static stack_t sigseg_stack; |
||||
static struct sigaction sigseg_handler; |
||||
|
||||
void crash_handler(sig_atomic_t i); |
||||
|
||||
void setup() { |
||||
Serial.begin(9600);
|
||||
|
||||
rraw_a1.setPlaybackRate(0.25f); |
||||
rraw_a1.enableInterpolation(true); |
||||
//rraw_a1.play((int16_t*)kick_raw, kick_raw_len/2);
|
||||
Serial.println("setup done"); |
||||
|
||||
if (SD.exists("RECORD.RAW")) { |
||||
// The SD library writes new data to the end of the
|
||||
// file, so to start a new recording, the old file
|
||||
// must be deleted before new data is written.
|
||||
SD.remove("RECORD.RAW"); |
||||
} |
||||
frec = SD.open("RECORD.RAW", O_WRITE); |
||||
|
||||
AudioMemory(120); |
||||
|
||||
if (frec) { |
||||
queue1.begin(); |
||||
Serial.println("startRecording"); |
||||
} else { |
||||
Serial.println("recording failed..."); |
||||
} |
||||
} |
||||
|
||||
void loop() { |
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 1000) { |
||||
if (!rraw_a1.isPlaying()) { |
||||
rraw_a1.playRaw((int16_t *)kick_raw, kick_raw_len/2, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
|
||||
if (queue1.available() >= 1) {
|
||||
int16_t* incomming = queue1.readBuffer(); |
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//if (incomming != NULL && sizeof(incomming) >= 256) {
|
||||
if (incomming != NULL) { |
||||
memcpy(buffer, incomming, 256); |
||||
queue1.freeBuffer(); |
||||
frec.write((unsigned char *)buffer, 256); |
||||
frec.flush(); |
||||
}
|
||||
//else {
|
||||
// arduino_should_exit = true;
|
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//}
|
||||
}
|
||||
delay(1); |
||||
} |
||||
|
||||
int main() { |
||||
signal (SIGINT,my_handler); |
||||
signal (SIGSEGV,crash_handler); |
||||
|
||||
sigseg_stack.ss_sp = stack_body; |
||||
sigseg_stack.ss_flags = SS_ONSTACK; |
||||
sigseg_stack.ss_size = sizeof(stack_body); |
||||
// assert(!sigaltstack(&sigseg_stack, nullptr));
|
||||
sigseg_handler.sa_flags = SA_ONSTACK; |
||||
sigseg_handler.sa_handler = &crash_handler; |
||||
// assert(!sigaction(SIGSEGV, &sigseg_handler, nullptr));
|
||||
|
||||
initialize_mock_arduino(); |
||||
SD.setSDCardFolderPath("."); |
||||
setup(); |
||||
while(!arduino_should_exit){ |
||||
loop(); |
||||
} |
||||
delay(1000); |
||||
frec.close(); |
||||
} |
||||
|
||||
void my_handler(sig_atomic_t i){ |
||||
if ( i== SIGINT) { |
||||
arduino_should_exit = true; |
||||
printf("Caught signal %d\n",i); |
||||
} else
|
||||
{ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
} |
||||
void crash_handler(sig_atomic_t i){ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
|
||||
unsigned char kick_raw[] = { |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
0x51, 0x08, 0x01, 0x08, 0x25, 0x08, 0x70, 0x08, 0xc3, 0x08, 0x23, 0x09, |
||||
0x95, 0x09, 0x19, 0x0a, 0x83, 0x0a, 0x7e, 0x0a, 0xd0, 0x0a, 0x65, 0x0b, |
||||
0xf6, 0x0b, 0x89, 0x0c, 0xd1, 0x0c, 0xcf, 0x0c, 0x1a, 0x0d, 0xe5, 0x0d, |
||||
0x5e, 0x0e, 0xbb, 0x0e, 0xec, 0x0e, 0xd9, 0x0e, 0x07, 0x0f, 0xc8, 0x0f, |
||||
0x2a, 0x10, 0x04, 0x10, 0x28, 0x10, 0x54, 0x11, 0x8e, 0x13, 0x4b, 0x16, |
||||
0x09, 0x19, 0x91, 0x1b, 0xf7, 0x1d, 0x55, 0x20, 0xd1, 0x22, 0xcb, 0x25, |
||||
0x4d, 0x29, 0xa8, 0x2c, 0x7f, 0x2f, 0xda, 0x31, 0xac, 0x34, 0x0a, 0x3a, |
||||
0x24, 0x47, 0x9d, 0x5b, 0xe9, 0x67, 0x29, 0x67, 0x24, 0x66, 0x26, 0x66, |
||||
0xd2, 0x65, 0x9c, 0x65, 0x38, 0x65, 0x05, 0x65, 0x9f, 0x64, 0x64, 0x64, |
||||
0x12, 0x64, 0xce, 0x63, 0x7c, 0x63, 0x32, 0x63, 0xe6, 0x62, 0x97, 0x62, |
||||
0x49, 0x62, 0x01, 0x62, 0xb3, 0x61, 0x63, 0x61, 0x15, 0x61, 0xc4, 0x60, |
||||
0x75, 0x60, 0x20, 0x60, 0xce, 0x5f, 0x7a, 0x5f, 0x28, 0x5f, 0xd5, 0x5e, |
||||
0x81, 0x5e, 0x2d, 0x5e, 0xd3, 0x5d, 0x80, 0x5d, 0x2e, 0x5d, 0xe6, 0x5c, |
||||
0x1a, 0x5c, 0x16, 0x5a, 0x01, 0x58, 0xb9, 0x56, 0x6d, 0x55, 0xf4, 0x53, |
||||
0x49, 0x52, 0x83, 0x50, 0x87, 0x4e, 0x5f, 0x4c, 0x68, 0x4a, 0x5c, 0x48, |
||||
0x62, 0x46, 0x5a, 0x44, 0xe2, 0x41, 0x08, 0x3f, 0x1c, 0x3c, 0x44, 0x39, |
||||
0x35, 0x36, 0xcb, 0x32, 0xaf, 0x2f, 0xc8, 0x2c, 0xf8, 0x29, 0x55, 0x27, |
||||
0x6a, 0x24, 0x0f, 0x21, 0x5e, 0x1d, 0xc3, 0x19, 0x7b, 0x16, 0x71, 0x13, |
||||
0x6c, 0x10, 0x00, 0x0d, 0xd2, 0x08, 0x7f, 0x04, 0x7a, 0x01, 0x43, 0xff, |
||||
0xb9, 0xfc, 0xfa, 0xf9, 0x3b, 0xf7, 0xcb, 0xf4, 0x2b, 0xf2, 0x02, 0xef, |
||||
0x0c, 0xec, 0x3d, 0xe9, 0x21, 0xe6, 0xa6, 0xe2, 0x8a, 0xdf, 0x00, 0xdd, |
||||
0xbc, 0xda, 0x9e, 0xd8, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd2, 0xad, 0xd0, |
||||
0x5f, 0xce, 0xf0, 0xcb, 0xe9, 0xc9, 0x61, 0xc8, 0x75, 0xc7, 0x97, 0xc6, |
||||
0x3e, 0xc5, 0x07, 0xc4, 0x8e, 0xc3, 0x18, 0xc3, 0x3a, 0xc2, 0x15, 0xc1, |
||||
0x0e, 0xc0, 0xb3, 0xbf, 0xcf, 0xbf, 0xf8, 0xbf, 0xcc, 0xbf, 0x72, 0xbf, |
||||
0x41, 0xbf, 0x2b, 0xbf, 0xe2, 0xbe, 0x99, 0xbe, 0x4e, 0xbe, 0x0e, 0xbe, |
||||
0xcd, 0xbd, 0x7c, 0xbd, 0x8a, 0xbd, 0x88, 0xbd, 0x04, 0xbd, 0x0c, 0xbc, |
||||
0xb3, 0xbb, 0xf6, 0xbb, 0xf1, 0xbb, 0x12, 0xbc, 0x6f, 0xbc, 0xcb, 0xbc, |
||||
0xe4, 0xbc, 0x33, 0xbd, 0x1b, 0xbe, 0xac, 0xbe, 0x1e, 0xbf, 0x91, 0xbf, |
||||
0x50, 0xc0, 0x40, 0xc1, 0x3d, 0xc2, 0x32, 0xc3, 0xdf, 0xc3, 0xad, 0xc4, |
||||
0x77, 0xc5, 0xbe, 0xc6, 0xc7, 0xc8, 0x1d, 0xcb, 0x0e, 0xcd, 0x83, 0xce, |
||||
0xf1, 0xcf, 0xb4, 0xd1, 0x7d, 0xd3, 0x86, 0xd5, 0x89, 0xd7, 0xd2, 0xd9, |
||||
0x34, 0xdc, 0x28, 0xde, 0x23, 0xe0, 0x33, 0xe2, 0x0a, 0xe4, 0x59, 0xe5, |
||||
0xfc, 0xe6, 0x98, 0xe9, 0x30, 0xec, 0x91, 0xee, 0xc2, 0xf0, 0x0d, 0xf3, |
||||
0x35, 0xf5, 0xf3, 0xf6, 0xc4, 0xf8, 0xcb, 0xfa, 0xef, 0xfc, 0x65, 0xff, |
||||
0x05, 0x02, 0x7c, 0x04, 0xde, 0x06, 0x75, 0x09, 0x2b, 0x0c, 0x9b, 0x0e, |
||||
0xf3, 0x10, 0xb3, 0x13, 0x3a, 0x16, 0xeb, 0x18, 0x55, 0x1c, 0xad, 0x1f, |
||||
0xa8, 0x22, 0x54, 0x25, 0xae, 0x27, 0x33, 0x2a, 0x16, 0x2d, 0x36, 0x30, |
||||
0x84, 0x33, 0x94, 0x36, 0xbd, 0x38, 0xa2, 0x3a, 0x7d, 0x3c, 0x06, 0x3e, |
||||
0x24, 0x3f, 0x27, 0x40, 0x7c, 0x41, 0xef, 0x42, 0x14, 0x44, 0xeb, 0x44, |
||||
0x06, 0x46, 0x53, 0x47, 0x47, 0x48, 0x9b, 0x48, 0xaf, 0x48, 0xd7, 0x48, |
||||
0x4c, 0x49, 0xa0, 0x49, 0xbe, 0x49, 0xd4, 0x49, 0xfa, 0x49, 0x5e, 0x4a, |
||||
0xcc, 0x4a, 0x14, 0x4b, 0xfe, 0x4a, 0x22, 0x4b, 0x10, 0x4c, 0x0c, 0x4d, |
||||
0xb2, 0x4d, 0x4c, 0x4e, 0x3e, 0x4e, 0x77, 0x4d, 0x98, 0x4c, 0xf6, 0x4b, |
||||
0x67, 0x4b, 0xf0, 0x4a, 0x2a, 0x4a, 0xea, 0x48, 0x06, 0x48, 0x47, 0x47, |
||||
0xb2, 0x46, 0xda, 0x45, 0xad, 0x44, 0x5c, 0x43, 0x43, 0x42, 0x9e, 0x41, |
||||
0x0a, 0x41, 0x49, 0x40, 0xa6, 0x3f, 0x9d, 0x3e, 0x3c, 0x3d, 0xc6, 0x3b, |
||||
0xf6, 0x39, 0x87, 0x37, 0xf6, 0x34, 0x87, 0x32, 0x2b, 0x30, 0x6f, 0x2d, |
||||
0xfa, 0x2a, 0x3d, 0x29, 0x48, 0x27, 0xc2, 0x24, 0x49, 0x22, 0xca, 0x1f, |
||||
0xa0, 0x1c, 0x7c, 0x19, 0x06, 0x17, 0xbf, 0x14, 0x9f, 0x12, 0x96, 0x10, |
||||
0xf9, 0x0d, 0x3e, 0x0b, 0xe8, 0x08, 0x5c, 0x06, 0xe7, 0x02, 0x6e, 0xff, |
||||
0xca, 0xfc, 0x5b, 0xfa, 0xa0, 0xf7, 0xe9, 0xf4, 0x9c, 0xf2, 0x66, 0xf0, |
||||
0xaf, 0xed, 0xfd, 0xea, 0xcc, 0xe8, 0x6e, 0xe6, 0x82, 0xe3, 0x97, 0xe0, |
||||
0xed, 0xdd, 0x62, 0xdb, 0x7b, 0xd8, 0xd3, 0xd5, 0x5f, 0xd3, 0x1a, 0xd1, |
||||
0x44, 0xcf, 0xeb, 0xcd, 0x89, 0xcc, 0xca, 0xca, 0x4d, 0xc9, 0x35, 0xc8, |
||||
0x53, 0xc7, 0x0c, 0xc6, 0x06, 0xc4, 0xca, 0xc1, 0x09, 0xc0, 0x9c, 0xbe, |
||||
0xa8, 0xbd, 0xfd, 0xbc, 0xf2, 0xbb, 0x9b, 0xba, 0x20, 0xb9, 0xe4, 0xb7, |
||||
0xc1, 0xb6, 0xcd, 0xb5, 0x12, 0xb5, 0x55, 0xb4, 0xd1, 0xb3, 0x86, 0xb3, |
||||
0x19, 0xb3, 0xe8, 0xb2, 0xd7, 0xb2, 0x72, 0xb2, 0x27, 0xb2, 0xb7, 0xb1, |
||||
0x67, 0xb1, 0x65, 0xb1, 0xae, 0xb1, 0x6b, 0xb1, 0xf2, 0xb0, 0xeb, 0xb0, |
||||
0x0f, 0xb1, 0xfe, 0xb0, 0xeb, 0xb0, 0xcf, 0xb0, 0x94, 0xb0, 0x3e, 0xb0, |
||||
0x29, 0xb0, 0x56, 0xb0, 0x0c, 0xb0, 0xb7, 0xaf, 0xfb, 0xaf, 0x37, 0xb0, |
||||
0x96, 0xb0, 0x42, 0xb1, 0xe8, 0xb1, 0xb5, 0xb2, 0xc5, 0xb3, 0x93, 0xb4, |
||||
0x93, 0xb4, 0xee, 0xb4, 0x59, 0xb6, 0xca, 0xb7, 0x87, 0xb8, 0x6f, 0xb8, |
||||
0x33, 0xb8, 0xaf, 0xb8, 0x4a, 0xb9, 0x9d, 0xb9, 0xf2, 0xb9, 0x48, 0xba, |
||||
0xd0, 0xba, 0xe5, 0xbb, 0x4e, 0xbd, 0xaf, 0xbe, 0xe9, 0xbf, 0xba, 0xc1, |
||||
0xc2, 0xc3, 0x73, 0xc5, 0xa6, 0xc6, 0x6a, 0xc7, 0x83, 0xc8, 0x42, 0xca, |
||||
0xc8, 0xcb, 0x34, 0xcd, 0x94, 0xce, 0xcc, 0xcf, 0x31, 0xd1, 0x27, 0xd3, |
||||
0x8c, 0xd5, 0x61, 0xd7, 0x78, 0xd9, 0x3b, 0xdc, 0x40, 0xdf, 0xdd, 0xe1, |
||||
0x0c, 0xe4, 0xe4, 0xe5, 0xd0, 0xe7, 0x65, 0xea, 0xc9, 0xec, 0xd7, 0xee, |
||||
0xfc, 0xf0, 0x7c, 0xf3, 0xf6, 0xf5, 0x09, 0xf8, 0xde, 0xf9, 0xca, 0xfb, |
||||
0xac, 0xfd, 0xc3, 0xff, 0x33, 0x02, 0xb1, 0x04, 0x24, 0x07, 0x57, 0x09, |
||||
0x5f, 0x0b, 0xe6, 0x0d, 0xd1, 0x10, 0x6d, 0x13, 0x8f, 0x15, 0xfb, 0x17, |
||||
0x43, 0x1a, 0x8e, 0x1c, 0x1a, 0x1f, 0x69, 0x21, 0x80, 0x23, 0x74, 0x25, |
||||
0x62, 0x27, 0x07, 0x29, 0xa1, 0x2a, 0xa5, 0x2c, 0xdf, 0x2e, 0x57, 0x31, |
||||
0xff, 0x33, 0xd1, 0x36, 0x6e, 0x39, 0x8a, 0x3b, 0x58, 0x3d, 0x32, 0x3f, |
||||
0xc8, 0x40, 0x1b, 0x42, 0x22, 0x43, 0x1a, 0x44, 0x25, 0x45, 0xe5, 0x45, |
||||
0x43, 0x46, 0x9b, 0x46, 0x6a, 0x47, 0x6f, 0x48, 0x69, 0x49, 0x6f, 0x4a, |
||||
0xc7, 0x4b, 0x0e, 0x4d, 0x03, 0x4e, 0x78, 0x4e, 0xdf, 0x4e, 0x0b, 0x4f, |
||||
0xea, 0x4e, 0xcb, 0x4e, 0x1b, 0x4f, 0x6e, 0x4f, 0xc3, 0x4f, 0xdc, 0x4f, |
||||
0xcb, 0x4f, 0xd2, 0x4f, 0x16, 0x50, 0x24, 0x50, 0xf2, 0x4f, 0x00, 0x50, |
||||
0x37, 0x50, 0x4e, 0x50, 0x5e, 0x50, 0x7c, 0x50, 0xab, 0x50, 0x69, 0x50, |
||||
0xad, 0x4f, 0xa3, 0x4e, 0xe6, 0x4d, 0x42, 0x4d, 0xdc, 0x4c, 0x7c, 0x4c, |
||||
0xbe, 0x4b, 0x08, 0x4b, 0x7b, 0x4a, 0xe4, 0x49, 0x14, 0x49, 0x07, 0x48, |
||||
0x98, 0x46, 0x2f, 0x45, 0x16, 0x44, 0x23, 0x43, 0x55, 0x42, 0xac, 0x41, |
||||
0x06, 0x41, 0x4b, 0x40, 0x8f, 0x3f, 0xde, 0x3e, 0xe1, 0x3d, 0x75, 0x3c, |
||||
0xc0, 0x3a, 0xe4, 0x38, 0x83, 0x37, 0x9a, 0x36, 0xe5, 0x35, 0xc0, 0x34, |
||||
0xf9, 0x32, 0xe1, 0x30, 0xfa, 0x2e, 0xd4, 0x2c, 0x4d, 0x2a, 0xed, 0x27, |
||||
0xb9, 0x25, 0xb2, 0x23, 0x7d, 0x21, 0xfd, 0x1e, 0x89, 0x1c, 0x38, 0x1a, |
||||
0xe2, 0x17, 0x67, 0x15, 0xf3, 0x12, 0xb3, 0x10, 0x9e, 0x0e, 0x79, 0x0c, |
||||
0xea, 0x09, 0x54, 0x07, 0x26, 0x05, 0x0a, 0x03, 0xd7, 0x00, 0x98, 0xfe, |
||||
0x41, 0xfc, 0x8d, 0xf9, 0x3c, 0xf7, 0x4f, 0xf5, 0x73, 0xf3, 0x7b, 0xf1, |
||||
0x68, 0xef, 0x6f, 0xed, 0x7a, 0xeb, 0x87, 0xe9, 0x48, 0xe7, 0xc6, 0xe4, |
||||
0x65, 0xe2, 0xf6, 0xdf, 0x86, 0xdd, 0x9f, 0xdb, 0x1b, 0xda, 0xa6, 0xd8, |
||||
0xce, 0xd6, 0xe4, 0xd4, 0xe3, 0xd2, 0x84, 0xd0, 0xec, 0xcd, 0x08, 0xcc, |
||||
0x89, 0xca, 0x1b, 0xc9, 0xe2, 0xc7, 0x9d, 0xc6, 0xe5, 0xc4, 0x79, 0xc3, |
||||
0x6d, 0xc2, 0xe3, 0xc0, 0x3c, 0xbf, 0xd3, 0xbd, 0x41, 0xbc, 0xd2, 0xba, |
||||
0x6a, 0xb9, 0xa1, 0xb7, 0xa9, 0xb5, 0x47, 0xb4, 0x91, 0xb3, 0xd5, 0xb2, |
||||
0xb7, 0xb1, 0x51, 0xb0, 0x14, 0xaf, 0xf5, 0xad, 0x95, 0xac, 0x34, 0xab, |
||||
0x05, 0xaa, 0xe1, 0xa8, 0xb3, 0xa7, 0xd9, 0xa6, 0x25, 0xa6, 0x6e, 0xa5, |
||||
0x2b, 0xa5, 0x7b, 0xa5, 0x9a, 0xa5, 0x88, 0xa5, 0xc3, 0xa5, 0xe7, 0xa5, |
||||
0xaf, 0xa5, 0x8b, 0xa5, 0x80, 0xa5, 0x65, 0xa5, 0x8c, 0xa5, 0x7e, 0xa5, |
||||
0x22, 0xa5, 0x40, 0xa5, 0xed, 0xa5, 0x27, 0xa6, 0x2b, 0xa6, 0x1c, 0xa6, |
||||
0xe5, 0xa5, 0x7b, 0xa5, 0x45, 0xa5, 0x37, 0xa5, 0x04, 0xa5, 0x91, 0xa4, |
||||
0x8d, 0xa4, 0x2d, 0xa5, 0x9f, 0xa5, 0xf6, 0xa5, 0x7e, 0xa6, 0x34, 0xa7, |
||||
0x14, 0xa8, 0x7e, 0xa8, 0x87, 0xa8, 0xc4, 0xa8, 0x51, 0xa9, 0xec, 0xa9, |
||||
0x74, 0xaa, 0xf7, 0xaa, 0x40, 0xab, 0xd9, 0xab, 0xca, 0xac, 0x6b, 0xad, |
||||
0xb3, 0xad, 0x08, 0xae, 0x10, 0xaf, 0x2c, 0xb0, 0xcb, 0xb0, 0x23, 0xb1, |
||||
0xac, 0xb1, 0x0e, 0xb2, 0x42, 0xb2, 0xd7, 0xb2, 0xef, 0xb3, 0x21, 0xb5, |
||||
0x30, 0xb6, 0xe9, 0xb6, 0x54, 0xb7, 0xf0, 0xb7, 0x9e, 0xb8, 0x2e, 0xb9, |
||||
0x03, 0xba, 0x55, 0xbb, 0xdf, 0xbc, 0x5f, 0xbe, 0xb8, 0xbf, 0x01, 0xc1, |
||||
0x83, 0xc2, 0x0c, 0xc4, 0x65, 0xc5, 0x7e, 0xc6, 0x86, 0xc7, 0xba, 0xc8, |
||||
0x11, 0xca, 0x66, 0xcb, 0x28, 0xcd, 0x4d, 0xcf, 0x60, 0xd1, 0x69, 0xd3, |
||||
0x7b, 0xd5, 0x5f, 0xd7, 0xe3, 0xd8, 0xca, 0xda, 0xda, 0xdc, 0xda, 0xde, |
||||
0xab, 0xe0, 0x59, 0xe2, 0x3b, 0xe4, 0x21, 0xe6, 0xfc, 0xe7, 0xcb, 0xe9, |
||||
0xbe, 0xeb, 0x9c, 0xed, 0x47, 0xef, 0x0b, 0xf1, 0xd3, 0xf2, 0xbc, 0xf4, |
||||
0x9c, 0xf6, 0x67, 0xf8, 0x2a, 0xfa, 0xc1, 0xfb, 0x7f, 0xfd, 0x41, 0xff, |
||||
0x12, 0x01, 0xd2, 0x02, 0xfc, 0x04, 0xe8, 0x06, 0x9a, 0x08, 0x59, 0x0a, |
||||
0x48, 0x0c, 0x36, 0x0e, 0x37, 0x10, 0x36, 0x12, 0x59, 0x14, 0x62, 0x16, |
||||
0x86, 0x18, 0xb9, 0x1a, 0xc2, 0x1c, 0xcd, 0x1e, 0xf1, 0x20, 0x27, 0x23, |
||||
0x7a, 0x25, 0xf9, 0x27, 0x2a, 0x2a, 0x1f, 0x2c, 0xf8, 0x2d, 0xa3, 0x2f, |
||||
0x23, 0x31, 0xf4, 0x32, 0x2c, 0x35, 0x40, 0x37, 0x23, 0x39, 0xfe, 0x3a, |
||||
0x11, 0x3d, 0x2c, 0x3f, 0xe8, 0x40, 0x8c, 0x42, 0x55, 0x44, 0x37, 0x46, |
||||
0x99, 0x47, 0xcb, 0x48, 0x12, 0x4a, 0x60, 0x4b, 0x86, 0x4c, 0x9b, 0x4d, |
||||
0xc8, 0x4e, 0xec, 0x4f, 0xe3, 0x50, 0x8a, 0x51, 0x23, 0x52, 0xd8, 0x52, |
||||
0x68, 0x53, 0x9b, 0x53, 0xb1, 0x53, 0x11, 0x54, 0x94, 0x54, 0xf7, 0x54, |
||||
0x4f, 0x55, 0xa4, 0x55, 0x03, 0x56, 0x51, 0x56, 0x92, 0x56, 0xfa, 0x56, |
||||
0x59, 0x57, 0xad, 0x57, 0xcd, 0x57, 0xc5, 0x57, 0xa8, 0x57, 0x64, 0x57, |
||||
0x49, 0x57, 0x63, 0x57, 0x64, 0x57, 0x40, 0x57, 0xf6, 0x56, 0xfc, 0x56, |
||||
0x36, 0x57, 0x3b, 0x57, 0x1e, 0x57, 0x1c, 0x57, 0x03, 0x57, 0xee, 0x56, |
||||
0xa5, 0x56, 0x80, 0x56, 0xd4, 0x56, 0xe4, 0x56, 0x92, 0x56, 0xf0, 0x55, |
||||
0x02, 0x55, 0xab, 0x53, 0xb5, 0x52, 0x51, 0x52, 0x08, 0x52, 0x80, 0x51, |
||||
0xb4, 0x50, 0xde, 0x4f, 0x27, 0x4f, 0x63, 0x4e, 0x58, 0x4d, 0x72, 0x4c, |
||||
0x82, 0x4b, 0x81, 0x4a, 0x87, 0x49, 0xb4, 0x48, 0xb1, 0x47, 0x99, 0x46, |
||||
0xb4, 0x45, 0x34, 0x45, 0xb8, 0x44, 0x2f, 0x44, 0x7f, 0x43, 0xa0, 0x42, |
||||
0xcb, 0x41, 0xd1, 0x40, 0xeb, 0x3f, 0x28, 0x3f, 0x3d, 0x3e, 0x09, 0x3d, |
||||
0x9d, 0x3b, 0x40, 0x3a, 0x1c, 0x39, 0xeb, 0x37, 0xd1, 0x36, 0xb3, 0x35, |
||||
0x8b, 0x34, 0x0b, 0x33, 0x51, 0x31, 0xfb, 0x2f, 0xb9, 0x2e, 0x54, 0x2d, |
||||
0xaf, 0x2b, 0xdf, 0x29, 0xf1, 0x27, 0x3a, 0x26, 0x6f, 0x24, 0x56, 0x22, |
||||
0x20, 0x20, 0x0a, 0x1e, 0x3b, 0x1c, 0x55, 0x1a, 0x6c, 0x18, 0xaa, 0x16, |
||||
0xef, 0x14, 0x0a, 0x13, 0x17, 0x11, 0x1c, 0x0f, 0x22, 0x0d, 0x46, 0x0b, |
||||
0x53, 0x09, 0x46, 0x07, 0x46, 0x05, 0x4d, 0x03, 0x1a, 0x01, 0xd3, 0xfe, |
||||
0x94, 0xfc, 0x8c, 0xfa, 0x8f, 0xf8, 0xc1, 0xf6, 0x27, 0xf5, 0x8f, 0xf3, |
||||
0xf2, 0xf1, 0x74, 0xf0, 0xfa, 0xee, 0x4d, 0xed, 0x9e, 0xeb, 0xa2, 0xe9, |
||||
0x73, 0xe7, 0xa9, 0xe5, 0x2d, 0xe4, 0xa3, 0xe2, 0xf9, 0xe0, 0x50, 0xdf, |
||||
0xb9, 0xdd, 0x34, 0xdc, 0xad, 0xda, 0x0b, 0xd9, 0x77, 0xd7, 0xb9, 0xd5, |
||||
0x37, 0xd4, 0xff, 0xd2, 0x8a, 0xd1, 0x14, 0xd0, 0xba, 0xce, 0x7d, 0xcd, |
||||
0x2c, 0xcc, 0xa1, 0xca, 0x22, 0xc9, 0xa9, 0xc7, 0x0e, 0xc6, 0x66, 0xc4, |
||||
0xfc, 0xc2, 0xa5, 0xc1, 0x4a, 0xc0, 0xff, 0xbe, 0xf7, 0xbd, 0x0e, 0xbd, |
||||
0x1d, 0xbc, 0x16, 0xbb, 0xad, 0xb9, 0x44, 0xb8, 0xd7, 0xb6, 0x9e, 0xb5, |
||||
0x9f, 0xb4, 0x97, 0xb3, 0x72, 0xb2, 0x5f, 0xb1, 0x67, 0xb0, 0x89, 0xaf, |
||||
0x9d, 0xae, 0xbe, 0xad, 0x08, 0xad, 0x5d, 0xac, 0x8b, 0xab, 0xad, 0xaa, |
||||
0xe4, 0xa9, 0x59, 0xa9, 0xc4, 0xa8, 0x02, 0xa8, 0x4d, 0xa7, 0xc2, 0xa6, |
||||
0x4a, 0xa6, 0x09, 0xa6, 0xd2, 0xa5, 0x50, 0xa5, 0xec, 0xa4, 0xc2, 0xa4, |
||||
0xd9, 0xa4, 0xbd, 0xa4, 0x97, 0xa4, 0xa5, 0xa4, 0xbf, 0xa4, 0xb4, 0xa4, |
||||
0x8f, 0xa4, 0x31, 0xa4, 0x39, 0xa4, 0x7d, 0xa4, 0xab, 0xa4, 0xc7, 0xa4, |
||||
0xb3, 0xa4, 0xab, 0xa4, 0xca, 0xa4, 0x05, 0xa5, 0x1e, 0xa5, 0x2a, 0xa5, |
||||
0x2c, 0xa5, 0x18, 0xa5, 0x01, 0xa5, 0x33, 0xa5, 0x8c, 0xa5, 0xb2, 0xa5, |
||||
0x81, 0xa5, 0x5c, 0xa5, 0x6e, 0xa5, 0x79, 0xa5, 0x4e, 0xa5, 0x17, 0xa5, |
||||
0xff, 0xa4, 0x1c, 0xa5, 0x45, 0xa5, 0x8a, 0xa5, 0xbf, 0xa5, 0xdb, 0xa5, |
||||
0x41, 0xa6, 0xfb, 0xa6, 0xc6, 0xa7, 0x86, 0xa8, 0x29, 0xa9, 0x97, 0xa9, |
||||
0x27, 0xaa, 0xd7, 0xaa, 0x6d, 0xab, 0xf4, 0xab, 0x34, 0xac, 0x69, 0xac, |
||||
0xc6, 0xac, 0x37, 0xad, 0xaa, 0xad, 0x34, 0xae, 0xd3, 0xae, 0x81, 0xaf, |
||||
0x16, 0xb0, 0x72, 0xb0, 0xc8, 0xb0, 0x36, 0xb1, 0x91, 0xb1, 0xe0, 0xb1, |
||||
0x3b, 0xb2, 0x8e, 0xb2, 0xe0, 0xb2, 0x2a, 0xb3, 0xab, 0xb3, 0x3a, 0xb4, |
||||
0xf1, 0xb4, 0xc0, 0xb5, 0xae, 0xb6, 0x91, 0xb7, 0x82, 0xb8, 0x98, 0xb9, |
||||
0x8f, 0xba, 0x88, 0xbb, 0x65, 0xbc, 0x20, 0xbd, 0xcb, 0xbd, 0xaf, 0xbe, |
||||
0x94, 0xbf, 0x84, 0xc0, 0x85, 0xc1, 0x7b, 0xc2, 0x67, 0xc3, 0x66, 0xc4, |
||||
0x7f, 0xc5, 0x89, 0xc6, 0x6b, 0xc7, 0x38, 0xc8, 0x29, 0xc9, 0x4a, 0xca, |
||||
0x82, 0xcb, 0xc1, 0xcc, 0x12, 0xce, 0x5e, 0xcf, 0xb0, 0xd0, 0x25, 0xd2, |
||||
0x66, 0xd3, 0xde, 0xd4, 0x6c, 0xd6, 0x28, 0xd8, 0xd7, 0xd9, 0x80, 0xdb, |
||||
0xf7, 0xdc, 0x6f, 0xde, 0xd0, 0xdf, 0x22, 0xe1, 0x7a, 0xe2, 0xe5, 0xe3, |
||||
0x7a, 0xe5, 0xea, 0xe6, 0x51, 0xe8, 0xeb, 0xe9, 0x70, 0xeb, 0xb3, 0xec, |
||||
0x01, 0xee, 0x60, 0xef, 0xcb, 0xf0, 0x1d, 0xf2, 0x7b, 0xf3, 0xcf, 0xf4, |
||||
0x39, 0xf6, 0xc8, 0xf7, 0x82, 0xf9, 0x4a, 0xfb, 0xf2, 0xfc, 0x8c, 0xfe, |
||||
0x01, 0x00, 0x68, 0x01, 0x15, 0x03, 0xe6, 0x04, 0xbc, 0x06, 0x42, 0x08, |
||||
0xbb, 0x09, 0x2b, 0x0b, 0xc7, 0x0c, 0x35, 0x0e, 0x94, 0x0f, 0xf2, 0x10, |
||||
0x59, 0x12, 0xbc, 0x13, 0x34, 0x15, 0xac, 0x16, 0x1c, 0x18, 0x79, 0x19, |
||||
0xdc, 0x1a, 0x6d, 0x1c, 0x21, 0x1e, 0xca, 0x1f, 0x70, 0x21, 0x02, 0x23, |
||||
0x6c, 0x24, 0x9e, 0x25, 0x45, 0x27, 0x02, 0x29, 0x95, 0x2a, 0xff, 0x2b, |
||||
0x72, 0x2d, 0xe8, 0x2e, 0x48, 0x30, 0x7c, 0x31, 0xd2, 0x32, 0x3d, 0x34, |
||||
0xac, 0x35, 0x26, 0x37, 0xbc, 0x38, 0x4c, 0x3a, 0x90, 0x3b, 0xef, 0x3c, |
||||
0x61, 0x3e, 0xe8, 0x3f, 0x59, 0x41, 0xab, 0x42, 0xf7, 0x43, 0x2d, 0x45, |
||||
0x6c, 0x46, 0x78, 0x47, 0xb4, 0x48, 0x2e, 0x4a, 0x8e, 0x4b, 0xd7, 0x4c, |
||||
0xf4, 0x4d, 0xee, 0x4e, 0xcb, 0x4f, 0xc3, 0x50, 0xc2, 0x51, 0xac, 0x52, |
||||
0x61, 0x53, 0xf3, 0x53, 0xac, 0x54, 0x5f, 0x55, 0xf4, 0x55, 0x7f, 0x56, |
||||
0x04, 0x57, 0x9c, 0x57, 0x1f, 0x58, 0x7c, 0x58, 0xbc, 0x58, 0x0b, 0x59, |
||||
0x71, 0x59, 0xc1, 0x59, 0x0b, 0x5a, 0x3e, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, |
||||
0xa9, 0x5a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4c, 0x5a, 0x39, 0x5a, 0x32, 0x5a, |
||||
0x40, 0x5a, 0x33, 0x5a, 0x44, 0x5a, 0x58, 0x5a, 0x79, 0x5a, 0x7a, 0x5a, |
||||
0x69, 0x5a, 0x49, 0x5a, 0x54, 0x5a, 0x78, 0x5a, 0x72, 0x5a, 0x5f, 0x5a, |
||||
0x31, 0x5a, 0x11, 0x5a, 0xf9, 0x59, 0xea, 0x59, 0xd1, 0x59, 0xa1, 0x59, |
||||
0x48, 0x59, 0xf0, 0x58, 0xa2, 0x58, 0x6e, 0x58, 0x60, 0x58, 0x46, 0x58, |
||||
0x3f, 0x58, 0x47, 0x58, 0x40, 0x58, 0x08, 0x58, 0x9c, 0x57, 0x11, 0x57, |
||||
0x83, 0x56, 0xd7, 0x55, 0x42, 0x55, 0xab, 0x54, 0x06, 0x54, 0x63, 0x53, |
||||
0xa6, 0x52, 0xf0, 0x51, 0x55, 0x51, 0xbc, 0x50, 0x1e, 0x50, 0x8e, 0x4f, |
||||
0xf3, 0x4e, 0x34, 0x4e, 0x6b, 0x4d, 0xc9, 0x4c, 0x30, 0x4c, 0x7d, 0x4b, |
||||
0xd8, 0x4a, 0x49, 0x4a, 0xad, 0x49, 0x11, 0x49, 0x6c, 0x48, 0xa4, 0x47, |
||||
0xec, 0x46, 0x6c, 0x46, 0xde, 0x45, 0x5d, 0x45, 0xbc, 0x44, 0xf1, 0x43, |
||||
0x34, 0x43, 0x8c, 0x42, 0xf8, 0x41, 0x47, 0x41, 0x6a, 0x40, 0x72, 0x3f, |
||||
0x8b, 0x3e, 0xb3, 0x3d, 0xf2, 0x3c, 0x2f, 0x3c, 0x5c, 0x3b, 0x96, 0x3a, |
||||
0xbc, 0x39, 0xb2, 0x38, 0x91, 0x37, 0x8c, 0x36, 0x75, 0x35, 0x63, 0x34, |
||||
0x5e, 0x33, 0x63, 0x32, 0x4b, 0x31, 0x3c, 0x30, 0x1e, 0x2f, 0x07, 0x2e, |
||||
0xd0, 0x2c, 0xb2, 0x2b, 0x84, 0x2a, 0x4d, 0x29, 0xfc, 0x27, 0xa5, 0x26, |
||||
0x2f, 0x25, 0x95, 0x23, 0x1f, 0x22, 0xad, 0x20, 0x3a, 0x1f, 0x9e, 0x1d, |
||||
0x10, 0x1c, 0x6e, 0x1a, 0xe3, 0x18, 0x56, 0x17, 0xdb, 0x15, 0x58, 0x14, |
||||
0xba, 0x12, 0x2a, 0x11, 0x8b, 0x0f, 0xf4, 0x0d, 0x5b, 0x0c, 0xd3, 0x0a, |
||||
0x5f, 0x09, 0xe5, 0x07, 0x4a, 0x06, 0xc0, 0x04, 0x3e, 0x03, 0xb6, 0x01, |
||||
0x37, 0x00, 0xca, 0xfe, 0x74, 0xfd, 0x00, 0xfc, 0xa5, 0xfa, 0x4a, 0xf9, |
||||
0xd1, 0xf7, 0x7e, 0xf6, 0x1c, 0xf5, 0x9d, 0xf3, 0x4f, 0xf2, 0x0e, 0xf1, |
||||
0xc0, 0xef, 0x3a, 0xee, 0xd8, 0xec, 0x69, 0xeb, 0x0c, 0xea, 0xad, 0xe8, |
||||
0x56, 0xe7, 0xf8, 0xe5, 0xbe, 0xe4, 0x98, 0xe3, 0x61, 0xe2, 0x03, 0xe1, |
||||
0x99, 0xdf, 0x4d, 0xde, 0x0e, 0xdd, 0xde, 0xdb, 0xad, 0xda, 0x84, 0xd9, |
||||
0x62, 0xd8, 0x32, 0xd7, 0x01, 0xd6, 0xb7, 0xd4, 0x87, 0xd3, 0x97, 0xd2, |
||||
0x89, 0xd1, 0x89, 0xd0, 0x6e, 0xcf, 0x65, 0xce, 0x5d, 0xcd, 0x44, 0xcc, |
||||
0x13, 0xcb, 0xf2, 0xc9, 0xd3, 0xc8, 0xad, 0xc7, 0x9b, 0xc6, 0x94, 0xc5, |
||||
0x8e, 0xc4, 0x7b, 0xc3, 0x92, 0xc2, 0xad, 0xc1, 0xb2, 0xc0, 0xb9, 0xbf, |
||||
0xb3, 0xbe, 0xc0, 0xbd, 0xd5, 0xbc, 0xf2, 0xbb, 0xe1, 0xba, 0xc7, 0xb9, |
||||
0xc7, 0xb8, 0xe8, 0xb7, 0x09, 0xb7, 0x2c, 0xb6, 0x66, 0xb5, 0xb1, 0xb4, |
||||
0xf6, 0xb3, 0x32, 0xb3, 0x53, 0xb2, 0x92, 0xb1, 0xdb, 0xb0, 0x0d, 0xb0, |
||||
0x46, 0xaf, 0x62, 0xae, 0x98, 0xad, 0xd1, 0xac, 0x3f, 0xac, 0xb0, 0xab, |
||||
0x34, 0xab, 0xb1, 0xaa, 0x45, 0xaa, 0xda, 0xa9, 0x6a, 0xa9, 0xf1, 0xa8, |
||||
0x7d, 0xa8, 0x04, 0xa8, 0xbb, 0xa7, 0x80, 0xa7, 0x41, 0xa7, 0x02, 0xa7, |
||||
0xb6, 0xa6, 0x68, 0xa6, 0x3b, 0xa6, 0x1c, 0xa6, 0x0d, 0xa6, 0xfc, 0xa5, |
||||
0xd4, 0xa5, 0xa6, 0xa5, 0x81, 0xa5, 0x76, 0xa5, 0x61, 0xa5, 0x54, 0xa5, |
||||
0x48, 0xa5, 0x47, 0xa5, 0x4b, 0xa5, 0x49, 0xa5, 0x38, 0xa5, 0x4b, 0xa5, |
||||
0x6c, 0xa5, 0xa3, 0xa5, 0xda, 0xa5, 0xfe, 0xa5, 0x21, 0xa6, 0x4a, 0xa6, |
||||
0x8a, 0xa6, 0xb4, 0xa6, 0xe0, 0xa6, 0xf3, 0xa6, 0x1b, 0xa7, 0x17, 0xa7, |
||||
0x40, 0xa7, 0x8e, 0xa7, 0xcd, 0xa7, 0x06, 0xa8, 0x3e, 0xa8, 0x86, 0xa8, |
||||
0xbd, 0xa8, 0xde, 0xa8, 0xf6, 0xa8, 0x1c, 0xa9, 0x49, 0xa9, 0x5c, 0xa9, |
||||
0x79, 0xa9, 0x93, 0xa9, 0xab, 0xa9, 0xe6, 0xa9, 0x2c, 0xaa, 0x82, 0xaa, |
||||
0xbc, 0xaa, 0xec, 0xaa, 0x32, 0xab, 0x69, 0xab, 0xa7, 0xab, 0xde, 0xab, |
||||
0x19, 0xac, 0x53, 0xac, 0xbb, 0xac, 0x14, 0xad, 0x8a, 0xad, 0xeb, 0xad, |
||||
0x6c, 0xae, 0xe1, 0xae, 0x62, 0xaf, 0xd9, 0xaf, 0x58, 0xb0, 0xc0, 0xb0, |
||||
0x36, 0xb1, 0x99, 0xb1, 0x11, 0xb2, 0x71, 0xb2, 0xdc, 0xb2, 0x58, 0xb3, |
||||
0xbb, 0xb3, 0x37, 0xb4, 0xb6, 0xb4, 0x46, 0xb5, 0xca, 0xb5, 0x50, 0xb6, |
||||
0xd9, 0xb6, 0x6c, 0xb7, 0x03, 0xb8, 0x7e, 0xb8, 0xf0, 0xb8, 0x64, 0xb9, |
||||
0xcf, 0xb9, 0x47, 0xba, 0xd3, 0xba, 0x60, 0xbb, 0xe8, 0xbb, 0x70, 0xbc, |
||||
0xf3, 0xbc, 0x82, 0xbd, 0x05, 0xbe, 0xa1, 0xbe, 0x2a, 0xbf, 0xae, 0xbf, |
||||
0x25, 0xc0, 0xac, 0xc0, 0x52, 0xc1, 0xde, 0xc1, 0x75, 0xc2, 0x11, 0xc3, |
||||
0xb5, 0xc3, 0x42, 0xc4, 0xc5, 0xc4, 0x6d, 0xc5, 0x0b, 0xc6, 0xb2, 0xc6, |
||||
0x4b, 0xc7, 0xf6, 0xc7, 0x9b, 0xc8, 0x4f, 0xc9, 0x17, 0xca, 0xf3, 0xca, |
||||
0xc6, 0xcb, 0x9a, 0xcc, 0x7b, 0xcd, 0x54, 0xce, 0x32, 0xcf, 0x09, 0xd0, |
||||
0xd7, 0xd0, 0xc9, 0xd1, 0xc1, 0xd2, 0xb8, 0xd3, 0xb6, 0xd4, 0xae, 0xd5, |
||||
0xbc, 0xd6, 0xca, 0xd7, 0xd2, 0xd8, 0xca, 0xd9, 0xbd, 0xda, 0xc8, 0xdb, |
||||
0xd8, 0xdc, 0xf9, 0xdd, 0x08, 0xdf, 0x1e, 0xe0, 0x39, 0xe1, 0x4e, 0xe2, |
||||
0x60, 0xe3, 0x7a, 0xe4, 0x96, 0xe5, 0xc1, 0xe6, 0xde, 0xe7, 0x0e, 0xe9, |
||||
0x2a, 0xea, 0x42, 0xeb, 0x7a, 0xec, 0x9f, 0xed, 0xbb, 0xee, 0xd6, 0xef, |
||||
0xef, 0xf0, 0x0e, 0xf2, 0x30, 0xf3, 0x55, 0xf4, 0x68, 0xf5, 0x7e, 0xf6, |
||||
0xa4, 0xf7, 0xc0, 0xf8, 0xea, 0xf9, 0x10, 0xfb, 0x41, 0xfc, 0x7d, 0xfd, |
||||
0xad, 0xfe, 0xe3, 0xff, 0x10, 0x01, 0x27, 0x02, 0x58, 0x03, 0x74, 0x04, |
||||
0xa4, 0x05, 0xd5, 0x06, 0x0b, 0x08, 0x36, 0x09, 0x5c, 0x0a, 0x76, 0x0b, |
||||
0x9a, 0x0c, 0xc1, 0x0d, 0xd8, 0x0e, 0xf5, 0x0f, 0x15, 0x11, 0x3f, 0x12, |
||||
0x70, 0x13, 0x8e, 0x14, 0xcc, 0x15, 0xf2, 0x16, 0x31, 0x18, 0x4b, 0x19, |
||||
0x82, 0x1a, 0xa1, 0x1b, 0xbc, 0x1c, 0xde, 0x1d, 0xe9, 0x1e, 0x13, 0x20, |
||||
0x33, 0x21, 0x6c, 0x22, 0x80, 0x23, 0xa7, 0x24, 0xbc, 0x25, 0xde, 0x26, |
||||
0xe7, 0x27, 0x07, 0x29, 0x28, 0x2a, 0x36, 0x2b, 0x4d, 0x2c, 0x71, 0x2d, |
||||
0x91, 0x2e, 0xbe, 0x2f, 0xd6, 0x30, 0xfb, 0x31, 0x20, 0x33, 0x46, 0x34, |
||||
0x59, 0x35, 0x7a, 0x36, 0xa1, 0x37, 0xc2, 0x38, 0xdf, 0x39, 0x01, 0x3b, |
||||
0x0f, 0x3c, 0x27, 0x3d, 0x1f, 0x3e, 0x2e, 0x3f, 0x43, 0x40, 0x5b, 0x41, |
||||
0x73, 0x42, 0x8e, 0x43, 0xaf, 0x44, 0xbc, 0x45, 0xcc, 0x46, 0xd8, 0x47, |
||||
0xec, 0x48, 0xe1, 0x49, 0xd1, 0x4a, 0xc4, 0x4b, 0xb6, 0x4c, 0xa9, 0x4d, |
||||
0x9d, 0x4e, 0x88, 0x4f, 0x75, 0x50, 0x4c, 0x51, 0x3b, 0x52, 0x05, 0x53, |
||||
0xd9, 0x53, 0xa1, 0x54, 0x6f, 0x55, 0x33, 0x56, 0xe5, 0x56, 0x7d, 0x57, |
||||
0x15, 0x58, 0xb3, 0x58, 0x4e, 0x59, 0xdb, 0x59, 0x55, 0x5a, 0xc8, 0x5a, |
||||
0x36, 0x5b, 0xa9, 0x5b, 0x09, 0x5c, 0x5a, 0x5c, 0xab, 0x5c, 0xf1, 0x5c, |
||||
0x34, 0x5d, 0x6a, 0x5d, 0x9e, 0x5d, 0xc1, 0x5d, 0xea, 0x5d, 0x0b, 0x5e, |
||||
0x28, 0x5e, 0x3d, 0x5e, 0x41, 0x5e, 0x51, 0x5e, 0x5f, 0x5e, 0x69, 0x5e, |
||||
0x79, 0x5e, 0x6a, 0x5e, 0x78, 0x5e, 0x76, 0x5e, 0x7f, 0x5e, 0x72, 0x5e, |
||||
0x70, 0x5e, 0x61, 0x5e, 0x61, 0x5e, 0x42, 0x5e, 0x36, 0x5e, 0x2f, 0x5e, |
||||
0x2c, 0x5e, 0x1a, 0x5e, 0xec, 0x5d, 0xbf, 0x5d, 0x94, 0x5d, 0x71, 0x5d, |
||||
0x4c, 0x5d, 0x24, 0x5d, 0xfa, 0x5c, 0xc3, 0x5c, 0x8c, 0x5c, 0x59, 0x5c, |
||||
0x3e, 0x5c, 0x0c, 0x5c, 0xd3, 0x5b, 0xb1, 0x5b, 0x78, 0x5b, 0x45, 0x5b, |
||||
0x14, 0x5b, 0xed, 0x5a, 0xc0, 0x5a, 0x89, 0x5a, 0x4f, 0x5a, 0x16, 0x5a, |
||||
0xe5, 0x59, 0xb5, 0x59, 0x84, 0x59, 0x4e, 0x59, 0x0d, 0x59, 0xcf, 0x58, |
||||
0xa6, 0x58, 0x79, 0x58, 0x3e, 0x58, 0xf8, 0x57, 0xc0, 0x57, 0x83, 0x57, |
||||
0x38, 0x57, 0x03, 0x57, 0xc1, 0x56, 0x65, 0x56, 0xe0, 0x55, 0x52, 0x55, |
||||
0xd0, 0x54, 0x4c, 0x54, 0xbe, 0x53, 0x32, 0x53, 0xa7, 0x52, 0x2a, 0x52, |
||||
0x95, 0x51, 0x09, 0x51, 0x76, 0x50, 0xe9, 0x4f, 0x69, 0x4f, 0xe2, 0x4e, |
||||
0x49, 0x4e, 0xc0, 0x4d, 0x38, 0x4d, 0xbd, 0x4c, 0x2d, 0x4c, 0x98, 0x4b, |
||||
0x07, 0x4b, 0x76, 0x4a, 0xdc, 0x49, 0x4a, 0x49, 0xb9, 0x48, 0x2d, 0x48, |
||||
0x9c, 0x47, 0x19, 0x47, 0x80, 0x46, 0xf9, 0x45, 0x66, 0x45, 0xd6, 0x44, |
||||
0x47, 0x44, 0xb5, 0x43, 0x14, 0x43, 0x74, 0x42, 0xd4, 0x41, 0x42, 0x41, |
||||
0xa4, 0x40, 0x18, 0x40, 0x85, 0x3f, 0xeb, 0x3e, 0x52, 0x3e, 0xb2, 0x3d, |
||||
0x0c, 0x3d, 0x7a, 0x3c, 0xdb, 0x3b, 0x3a, 0x3b, 0x87, 0x3a, 0xe0, 0x39, |
||||
0x29, 0x39, 0x88, 0x38, 0xd1, 0x37, 0x16, 0x37, 0x4d, 0x36, 0x9e, 0x35, |
||||
0xdc, 0x34, 0x19, 0x34, 0x4a, 0x33, 0x83, 0x32, 0xb7, 0x31, 0xec, 0x30, |
||||
0x1c, 0x30, 0x47, 0x2f, 0x71, 0x2e, 0x88, 0x2d, 0xa6, 0x2c, 0xbb, 0x2b, |
||||
0xd0, 0x2a, 0xd8, 0x29, 0xdb, 0x28, 0xe3, 0x27, 0xf5, 0x26, 0xf1, 0x25, |
||||
0xf8, 0x24, 0xdc, 0x23, 0xdb, 0x22, 0xca, 0x21, 0xa7, 0x20, 0x85, 0x1f, |
||||
0x5a, 0x1e, 0x30, 0x1d, 0x0a, 0x1c, 0xd5, 0x1a, 0xa6, 0x19, 0x6d, 0x18, |
||||
0x3d, 0x17, 0xff, 0x15, 0xbf, 0x14, 0x81, 0x13, 0x57, 0x12, 0x15, 0x11, |
||||
0xe0, 0x0f, 0xa2, 0x0e, 0x65, 0x0d, 0x27, 0x0c, 0xf1, 0x0a, 0xb2, 0x09, |
||||
0x77, 0x08, 0x4b, 0x07, 0x0a, 0x06, 0xc9, 0x04, 0x97, 0x03, 0x65, 0x02, |
||||
0x3b, 0x01, 0x03, 0x00, 0xd2, 0xfe, 0x95, 0xfd, 0x6f, 0xfc, 0x50, 0xfb, |
||||
0x19, 0xfa, 0xf0, 0xf8, 0xb8, 0xf7, 0x97, 0xf6, 0x65, 0xf5, 0x48, 0xf4, |
||||
0x24, 0xf3, 0xfe, 0xf1, 0xec, 0xf0, 0xd2, 0xef, 0xa9, 0xee, 0x95, 0xed, |
||||
0x76, 0xec, 0x64, 0xeb, 0x61, 0xea, 0x43, 0xe9, 0x3a, 0xe8, 0x21, 0xe7, |
||||
0x14, 0xe6, 0xff, 0xe4, 0x06, 0xe4, 0x04, 0xe3, 0x04, 0xe2, 0x01, 0xe1, |
||||
0x02, 0xe0, 0x04, 0xdf, 0x16, 0xde, 0x1f, 0xdd, 0x29, 0xdc, 0x2d, 0xdb, |
||||
0x3d, 0xda, 0x45, 0xd9, 0x5a, 0xd8, 0x6f, 0xd7, 0x74, 0xd6, 0x8a, 0xd5, |
||||
0x91, 0xd4, 0xa5, 0xd3, 0xbb, 0xd2, 0xdb, 0xd1, 0x01, 0xd1, 0x17, 0xd0, |
||||
0x42, 0xcf, 0x5e, 0xce, 0x94, 0xcd, 0xb1, 0xcc, 0xe8, 0xcb, 0x04, 0xcb, |
||||
0x29, 0xca, 0x4e, 0xc9, 0x78, 0xc8, 0x99, 0xc7, 0xc4, 0xc6, 0xff, 0xc5, |
||||
0x3d, 0xc5, 0x76, 0xc4, 0xa6, 0xc3, 0xe4, 0xc2, 0x17, 0xc2, 0x4e, 0xc1, |
||||
0x8a, 0xc0, 0xc5, 0xbf, 0x0b, 0xbf, 0x42, 0xbe, 0x8e, 0xbd, 0xd8, 0xbc, |
||||
0x20, 0xbc, 0x60, 0xbb, 0xbb, 0xba, 0x08, 0xba, 0x5a, 0xb9, 0xba, 0xb8, |
||||
0x08, 0xb8, 0x64, 0xb7, 0xb1, 0xb6, 0x0c, 0xb6, 0x5d, 0xb5, 0xbf, 0xb4, |
||||
0x10, 0xb4, 0x7b, 0xb3, 0xd0, 0xb2, 0x3d, 0xb2, 0xa1, 0xb1, 0x0f, 0xb1, |
||||
0x84, 0xb0, 0xf2, 0xaf, 0x63, 0xaf, 0xd3, 0xae, 0x50, 0xae, 0xbd, 0xad, |
||||
0x49, 0xad, 0xc1, 0xac, 0x4d, 0xac, 0xc6, 0xab, 0x56, 0xab, 0xe4, 0xaa, |
||||
0x83, 0xaa, 0x0d, 0xaa, 0xac, 0xa9, 0x49, 0xa9, 0xf3, 0xa8, 0x9e, 0xa8, |
||||
0x4e, 0xa8, 0x07, 0xa8, 0xc5, 0xa7, 0x8d, 0xa7, 0x56, 0xa7, 0x1d, 0xa7, |
||||
0xf6, 0xa6, 0xc7, 0xa6, 0xad, 0xa6, 0x8c, 0xa6, 0x74, 0xa6, 0x58, 0xa6, |
||||
0x47, 0xa6, 0x2d, 0xa6, 0x24, 0xa6, 0x23, 0xa6, 0x21, 0xa6, 0x19, 0xa6, |
||||
0x20, 0xa6, 0x1f, 0xa6, 0x28, 0xa6, 0x3c, 0xa6, 0x4e, 0xa6, 0x59, 0xa6, |
||||
0x6e, 0xa6, 0x84, 0xa6, 0x9a, 0xa6, 0xb7, 0xa6, 0xd4, 0xa6, 0xef, 0xa6, |
||||
0x0a, 0xa7, 0x2f, 0xa7, 0x53, 0xa7, 0x77, 0xa7, 0x9c, 0xa7, 0xbc, 0xa7, |
||||
0xe5, 0xa7, 0x10, 0xa8, 0x35, 0xa8, 0x6d, 0xa8, 0x9b, 0xa8, 0xcb, 0xa8, |
||||
0xf5, 0xa8, 0x23, 0xa9, 0x5a, 0xa9, 0x80, 0xa9, 0xb7, 0xa9, 0xee, 0xa9, |
||||
0x1c, 0xaa, 0x46, 0xaa, 0x78, 0xaa, 0xb2, 0xaa, 0xeb, 0xaa, 0x1a, 0xab, |
||||
0x57, 0xab, 0x84, 0xab, 0xba, 0xab, 0xef, 0xab, 0x22, 0xac, 0x55, 0xac, |
||||
0x88, 0xac, 0xc1, 0xac, 0xf5, 0xac, 0x2a, 0xad, 0x67, 0xad, 0x9f, 0xad, |
||||
0xe0, 0xad, 0x14, 0xae, 0x4c, 0xae, 0x82, 0xae, 0xb8, 0xae, 0xf8, 0xae, |
||||
0x2c, 0xaf, 0x6a, 0xaf, 0x9d, 0xaf, 0xd4, 0xaf, 0x05, 0xb0, 0x38, 0xb0, |
||||
0x77, 0xb0, 0xb2, 0xb0, 0xf8, 0xb0, 0x3c, 0xb1, 0x97, 0xb1, 0x05, 0xb2, |
||||
0x6f, 0xb2, 0xdf, 0xb2, 0x48, 0xb3, 0xb2, 0xb3, 0x16, 0xb4, 0x7b, 0xb4, |
||||
0xe5, 0xb4, 0x54, 0xb5, 0xc3, 0xb5, 0x26, 0xb6, 0x97, 0xb6, 0x03, 0xb7, |
||||
0x68, 0xb7, 0xce, 0xb7, 0x44, 0xb8, 0xae, 0xb8, 0x20, 0xb9, 0x87, 0xb9, |
||||
0xf1, 0xb9, 0x5d, 0xba, 0xc6, 0xba, 0x24, 0xbb, 0xa1, 0xbb, 0x05, 0xbc, |
||||
0x79, 0xbc, 0xdc, 0xbc, 0x4b, 0xbd, 0xba, 0xbd, 0x24, 0xbe, 0x9b, 0xbe, |
||||
0x07, 0xbf, 0x72, 0xbf, 0xe5, 0xbf, 0x46, 0xc0, 0xc3, 0xc0, 0x1f, 0xc1, |
||||
0x91, 0xc1, 0x01, 0xc2, 0x79, 0xc2, 0xf1, 0xc2, 0x66, 0xc3, 0xe5, 0xc3, |
||||
0x55, 0xc4, 0xc8, 0xc4, 0x3e, 0xc5, 0xb3, 0xc5, 0x2d, 0xc6, 0xa7, 0xc6, |
||||
0x27, 0xc7, 0x97, 0xc7, 0x1f, 0xc8, 0xa0, 0xc8, 0x29, 0xc9, 0xad, 0xc9, |
||||
0x36, 0xca, 0xad, 0xca, 0x3d, 0xcb, 0xc0, 0xcb, 0x47, 0xcc, 0xe9, 0xcc, |
||||
0x6f, 0xcd, 0x06, 0xce, 0x84, 0xce, 0x1a, 0xcf, 0xbb, 0xcf, 0x55, 0xd0, |
||||
0xf6, 0xd0, 0x8b, 0xd1, 0x30, 0xd2, 0xd2, 0xd2, 0x79, 0xd3, 0x1c, 0xd4, |
||||
0xcf, 0xd4, 0x83, 0xd5, 0x36, 0xd6, 0xe1, 0xd6, 0x96, 0xd7, 0x5f, 0xd8, |
||||
0x1c, 0xd9, 0xe2, 0xd9, 0xa8, 0xda, 0x6c, 0xdb, 0x43, 0xdc, 0x04, 0xdd, |
||||
0xd8, 0xdd, 0xac, 0xde, 0x8a, 0xdf, 0x5b, 0xe0, 0x39, 0xe1, 0x0b, 0xe2, |
||||
0xf5, 0xe2, 0xde, 0xe3, 0xbc, 0xe4, 0x9e, 0xe5, 0x83, 0xe6, 0x62, 0xe7, |
||||
0x51, 0xe8, 0x34, 0xe9, 0x1e, 0xea, 0x12, 0xeb, 0xf7, 0xeb, 0xe5, 0xec, |
||||
0xc5, 0xed, 0xc2, 0xee, 0xb1, 0xef, 0xa6, 0xf0, 0x90, 0xf1, 0x7e, 0xf2, |
||||
0x6f, 0xf3, 0x56, 0xf4, 0x48, 0xf5, 0x35, 0xf6, 0x29, 0xf7, 0x17, 0xf8, |
||||
0x0a, 0xf9, 0x00, 0xfa, 0xe7, 0xfa, 0xde, 0xfb, 0xc9, 0xfc, 0xc1, 0xfd, |
||||
0xac, 0xfe, 0xae, 0xff, 0xa2, 0x00, 0x8d, 0x01, 0x70, 0x02, 0x62, 0x03, |
||||
0x4e, 0x04, 0x3a, 0x05, 0x26, 0x06, 0x16, 0x07, 0xff, 0x07, 0xf3, 0x08, |
||||
0xda, 0x09, 0xbe, 0x0a, 0xb9, 0x0b, 0xa1, 0x0c, 0x9b, 0x0d, 0x7d, 0x0e, |
||||
0x66, 0x0f, 0x54, 0x10, 0x36, 0x11, 0x20, 0x12, 0x11, 0x13, 0xf3, 0x13, |
||||
0xea, 0x14, 0xd1, 0x15, 0xb6, 0x16, 0x9b, 0x17, 0x83, 0x18, 0x7f, 0x19, |
||||
0x58, 0x1a, 0x53, 0x1b, 0x37, 0x1c, 0x22, 0x1d, 0x0a, 0x1e, 0xf3, 0x1e, |
||||
0xda, 0x1f, 0xca, 0x20, 0xb1, 0x21, 0x96, 0x22, 0x70, 0x23, 0x55, 0x24, |
||||
0x39, 0x25, 0x39, 0x26, 0x1a, 0x27, 0x07, 0x28, 0xe1, 0x28, 0xc5, 0x29, |
||||
0xa7, 0x2a, 0x85, 0x2b, 0x70, 0x2c, 0x4e, 0x2d, 0x3e, 0x2e, 0x19, 0x2f, |
||||
0xf3, 0x2f, 0xdf, 0x30, 0xc0, 0x31, 0xaf, 0x32, 0x93, 0x33, 0x77, 0x34, |
||||
0x48, 0x35, 0x2a, 0x36, 0x0f, 0x37, 0xf8, 0x37, 0xd9, 0x38, 0xbe, 0x39, |
||||
0x8b, 0x3a, 0x74, 0x3b, 0x48, 0x3c, 0x2d, 0x3d, 0xfa, 0x3d, 0xe7, 0x3e, |
||||
0xb0, 0x3f, 0x98, 0x40, 0x67, 0x41, 0x3a, 0x42, 0x16, 0x43, 0xf4, 0x43, |
||||
0xd8, 0x44, 0xa4, 0x45, 0x7c, 0x46, 0x4c, 0x47, 0x2a, 0x48, 0x06, 0x49, |
||||
0xce, 0x49, 0xa5, 0x4a, 0x77, 0x4b, 0x4e, 0x4c, 0x13, 0x4d, 0xdf, 0x4d, |
||||
0xaa, 0x4e, 0x74, 0x4f, 0x3d, 0x50, 0xfc, 0x50, 0xbd, 0x51, 0x8c, 0x52, |
||||
0x3e, 0x53, 0xfe, 0x53, 0x99, 0x54, 0x57, 0x55, 0xfc, 0x55, 0xab, 0x56, |
||||
0x45, 0x57, 0xd6, 0x57, 0x87, 0x58, 0x2f, 0x59, 0xbf, 0x59, 0x48, 0x5a, |
||||
0xc7, 0x5a, 0x54, 0x5b, 0xc8, 0x5b, 0x45, 0x5c, 0xb4, 0x5c, 0x25, 0x5d, |
||||
0x7e, 0x5d, 0xda, 0x5d, 0x36, 0x5e, 0xa5, 0x5e, 0xe9, 0x5e, 0x37, 0x5f, |
||||
0x72, 0x5f, 0xab, 0x5f, 0xe5, 0x5f, 0x1d, 0x60, 0x4f, 0x60, 0x81, 0x60, |
||||
0x9c, 0x60, 0xc3, 0x60, 0xdc, 0x60, 0xf7, 0x60, 0x04, 0x61, 0x16, 0x61, |
||||
0x1b, 0x61, 0x21, 0x61, 0x20, 0x61, 0x0d, 0x61, 0x0b, 0x61, 0xf0, 0x60, |
||||
0xe5, 0x60, 0xc7, 0x60, 0xb3, 0x60, 0x98, 0x60, 0x7c, 0x60, 0x59, 0x60, |
||||
0x4c, 0x60, 0x24, 0x60, 0x0d, 0x60, 0xdf, 0x5f, 0xb7, 0x5f, 0x87, 0x5f, |
||||
0x6b, 0x5f, 0x44, 0x5f, 0x28, 0x5f, 0xf5, 0x5e, 0xbd, 0x5e, 0x8f, 0x5e, |
||||
0x5c, 0x5e, 0x2a, 0x5e, 0xfe, 0x5d, 0xcd, 0x5d, 0xa4, 0x5d, 0x75, 0x5d, |
||||
0x4d, 0x5d, 0x11, 0x5d, 0xdf, 0x5c, 0xa9, 0x5c, 0x78, 0x5c, 0x42, 0x5c, |
||||
0x13, 0x5c, 0xde, 0x5b, 0xaf, 0x5b, 0x75, 0x5b, 0x3e, 0x5b, 0xfd, 0x5a, |
||||
0xbc, 0x5a, 0x90, 0x5a, 0x54, 0x5a, 0x1f, 0x5a, 0xe5, 0x59, 0xc2, 0x59, |
||||
0x80, 0x59, 0x39, 0x59, 0x0a, 0x59, 0xd6, 0x58, 0x96, 0x58, 0x55, 0x58, |
||||
0x1e, 0x58, 0xf1, 0x57, 0xc8, 0x57, 0x7e, 0x57, 0x44, 0x57, 0x11, 0x57, |
||||
0xd4, 0x56, 0x93, 0x56, 0x4c, 0x56, 0x11, 0x56, 0xd7, 0x55, 0xae, 0x55, |
||||
0x72, 0x55, 0x3c, 0x55, 0x0c, 0x55, 0xd1, 0x54, 0x98, 0x54, 0x63, 0x54, |
||||
0x2b, 0x54, 0xf8, 0x53, 0xc6, 0x53, 0x81, 0x53, 0x4b, 0x53, 0x19, 0x53, |
||||
0xea, 0x52, 0xb2, 0x52, 0x7e, 0x52, 0x30, 0x52, 0xc5, 0x51, 0x46, 0x51, |
||||
0xca, 0x50, 0x55, 0x50, 0xd7, 0x4f, 0x5d, 0x4f, 0xe4, 0x4e, 0x79, 0x4e, |
||||
0xfb, 0x4d, 0x83, 0x4d, 0x02, 0x4d, 0x8a, 0x4c, 0x1f, 0x4c, 0x98, 0x4b, |
||||
0x20, 0x4b, 0xa7, 0x4a, 0x36, 0x4a, 0xc0, 0x49, 0x44, 0x49, 0xc3, 0x48, |
||||
0x44, 0x48, 0xd5, 0x47, 0x59, 0x47, 0xe6, 0x46, 0x63, 0x46, 0xf8, 0x45, |
||||
0x79, 0x45, 0xfa, 0x44, 0x80, 0x44, 0x01, 0x44, 0x7a, 0x43, 0x04, 0x43, |
||||
0x85, 0x42, 0x07, 0x42, 0x92, 0x41, 0x17, 0x41, 0x94, 0x40, 0x16, 0x40, |
||||
0x9f, 0x3f, 0x20, 0x3f, 0x9c, 0x3e, 0x29, 0x3e, 0x9c, 0x3d, 0x20, 0x3d, |
||||
0x88, 0x3c, 0x0c, 0x3c, 0x87, 0x3b, 0x07, 0x3b, 0x89, 0x3a, 0xfb, 0x39, |
||||
0x6f, 0x39, 0xe7, 0x38, 0x55, 0x38, 0xcf, 0x37, 0x43, 0x37, 0xb5, 0x36, |
||||
0x2a, 0x36, 0x9c, 0x35, 0x0a, 0x35, 0x83, 0x34, 0xe6, 0x33, 0x53, 0x33, |
||||
0xba, 0x32, 0x1d, 0x32, 0x78, 0x31, 0xcb, 0x30, 0x34, 0x30, 0x8e, 0x2f, |
||||
0xf6, 0x2e, 0x56, 0x2e, 0xab, 0x2d, 0xfe, 0x2c, 0x4c, 0x2c, 0x9f, 0x2b, |
||||
0xed, 0x2a, 0x36, 0x2a, 0x7b, 0x29, 0xb9, 0x28, 0x02, 0x28, 0x41, 0x27, |
||||
0x81, 0x26, 0xb9, 0x25, 0xfb, 0x24, 0x2d, 0x24, 0x66, 0x23, 0x98, 0x22, |
||||
0xc6, 0x21, 0xe9, 0x20, 0x0d, 0x20, 0x28, 0x1f, 0x4c, 0x1e, 0x64, 0x1d, |
||||
0x66, 0x1c, 0x8c, 0x1b, 0x96, 0x1a, 0xac, 0x19, 0xb2, 0x18, 0xbb, 0x17, |
||||
0xc2, 0x16, 0xc7, 0x15, 0xcb, 0x14, 0xcd, 0x13, 0xc4, 0x12, 0xca, 0x11, |
||||
0xb6, 0x10, 0xb8, 0x0f, 0xa3, 0x0e, 0x9e, 0x0d, 0x88, 0x0c, 0x86, 0x0b, |
||||
0x7b, 0x0a, 0x7c, 0x09, 0x6d, 0x08, 0x5b, 0x07, 0x4a, 0x06, 0x38, 0x05, |
||||
0x2f, 0x04, 0x1c, 0x03, 0x10, 0x02, 0xf6, 0x00, 0xe9, 0xff, 0xe5, 0xfe, |
||||
0xcf, 0xfd, 0xc8, 0xfc, 0xb1, 0xfb, 0xa7, 0xfa, 0x8d, 0xf9, 0x7b, 0xf8, |
||||
0x7e, 0xf7, 0x77, 0xf6, 0x68, 0xf5, 0x62, 0xf4, 0x49, 0xf3, 0x42, 0xf2, |
||||
0x41, 0xf1, 0x3e, 0xf0, 0x49, 0xef, 0x47, 0xee, 0x56, 0xed, 0x46, 0xec, |
||||
0x56, 0xeb, 0x5c, 0xea, 0x6c, 0xe9, 0x7d, 0xe8, 0x9c, 0xe7, 0x99, 0xe6, |
||||
0xbf, 0xe5, 0xc9, 0xe4, 0xe5, 0xe3, 0xfd, 0xe2, 0x17, 0xe2, 0x26, 0xe1, |
||||
0x44, 0xe0, 0x6d, 0xdf, 0x9f, 0xde, 0xc5, 0xdd, 0xec, 0xdc, 0x26, 0xdc, |
||||
0x58, 0xdb, 0x91, 0xda, 0xb7, 0xd9, 0xf5, 0xd8, 0x27, 0xd8, 0x63, 0xd7, |
||||
0x96, 0xd6, 0xd5, 0xd5, 0x1a, 0xd5, 0x52, 0xd4, 0x9d, 0xd3, 0xde, 0xd2, |
||||
0x27, 0xd2, 0x6c, 0xd1, 0xb3, 0xd0, 0xf6, 0xcf, 0x51, 0xcf, 0x98, 0xce, |
||||
0xe9, 0xcd, 0x2f, 0xcd, 0x88, 0xcc, 0xdc, 0xcb, 0x41, 0xcb, 0x9f, 0xca, |
||||
0x01, 0xca, 0x60, 0xc9, 0xc4, 0xc8, 0x13, 0xc8, 0x7e, 0xc7, 0xe2, 0xc6, |
||||
0x51, 0xc6, 0xb6, 0xc5, 0x1a, 0xc5, 0x8e, 0xc4, 0xf6, 0xc3, 0x74, 0xc3, |
||||
0xdf, 0xc2, 0x59, 0xc2, 0xd2, 0xc1, 0x47, 0xc1, 0xbe, 0xc0, 0x3b, 0xc0, |
||||
0xbe, 0xbf, 0x3e, 0xbf, 0xc4, 0xbe, 0x39, 0xbe, 0xbf, 0xbd, 0x3e, 0xbd, |
||||
0xd7, 0xbc, 0x5d, 0xbc, 0xec, 0xbb, 0x73, 0xbb, 0x07, 0xbb, 0x96, 0xba, |
||||
0x24, 0xba, 0xb5, 0xb9, 0x49, 0xb9, 0xdd, 0xb8, 0x76, 0xb8, 0x02, 0xb8, |
||||
0xa8, 0xb7, 0x3c, 0xb7, 0xee, 0xb6, 0x82, 0xb6, 0x2b, 0xb6, 0xc3, 0xb5, |
||||
0x6e, 0xb5, 0x14, 0xb5, 0xc4, 0xb4, 0x6b, 0xb4, 0x20, 0xb4, 0xd2, 0xb3, |
||||
0x78, 0xb3, 0x2c, 0xb3, 0xe6, 0xb2, 0x9e, 0xb2, 0x58, 0xb2, 0x1a, 0xb2, |
||||
0xea, 0xb1, 0xa6, 0xb1, 0x63, 0xb1, 0x2b, 0xb1, 0xf3, 0xb0, 0xb8, 0xb0, |
||||
0x7b, 0xb0, 0x4e, 0xb0, 0x20, 0xb0, 0xf9, 0xaf, 0xc6, 0xaf, 0xa2, 0xaf, |
||||
0x84, 0xaf, 0x5e, 0xaf, 0x44, 0xaf, 0x21, 0xaf, 0x06, 0xaf, 0xe9, 0xae, |
||||
0xe2, 0xae, 0xd0, 0xae, 0xc3, 0xae, 0xba, 0xae, 0xc1, 0xae, 0xaf, 0xae, |
||||
0xbc, 0xae, 0xb5, 0xae, 0xc0, 0xae, 0xc3, 0xae, 0xd7, 0xae, 0xdd, 0xae, |
||||
0xfb, 0xae, 0x0a, 0xaf, 0x16, 0xaf, 0x37, 0xaf, 0x4a, 0xaf, 0x70, 0xaf, |
||||
0x86, 0xaf, 0xa9, 0xaf, 0xc7, 0xaf, 0xec, 0xaf, 0x12, 0xb0, 0x42, 0xb0, |
||||
0x66, 0xb0, 0x91, 0xb0, 0xc0, 0xb0, 0xee, 0xb0, 0x1a, 0xb1, 0x4c, 0xb1, |
||||
0x77, 0xb1, 0xb3, 0xb1, 0xdd, 0xb1, 0x10, 0xb2, 0x47, 0xb2, 0x70, 0xb2, |
||||
0xb8, 0xb2, 0xef, 0xb2, 0x26, 0xb3, 0x64, 0xb3, 0x90, 0xb3, 0xd8, 0xb3, |
||||
0x07, 0xb4, 0x4b, 0xb4, 0x83, 0xb4, 0xc7, 0xb4, 0xf4, 0xb4, 0x35, 0xb5, |
||||
0x70, 0xb5, 0xbc, 0xb5, 0xf0, 0xb5, 0x39, 0xb6, 0x7d, 0xb6, 0xb7, 0xb6, |
||||
0xfa, 0xb6, 0x2e, 0xb7, 0x7d, 0xb7, 0xbb, 0xb7, 0x01, 0xb8, 0x39, 0xb8, |
||||
0x80, 0xb8, 0xbd, 0xb8, 0x05, 0xb9, 0x46, 0xb9, 0x94, 0xb9, 0xcd, 0xb9, |
||||
0x17, 0xba, 0x5b, 0xba, 0x9e, 0xba, 0xdf, 0xba, 0x27, 0xbb, 0x6a, 0xbb, |
||||
0xbc, 0xbb, 0xf6, 0xbb, 0x3a, 0xbc, 0x83, 0xbc, 0xc3, 0xbc, 0x16, 0xbd, |
||||
0x58, 0xbd, 0xa2, 0xbd, 0xe0, 0xbd, 0x24, 0xbe, 0x70, 0xbe, 0xa1, 0xbe, |
||||
0xfa, 0xbe, 0x37, 0xbf, 0x8d, 0xbf, 0xc9, 0xbf, 0x1d, 0xc0, 0x5d, 0xc0, |
||||
0xa6, 0xc0, 0xe6, 0xc0, 0x2f, 0xc1, 0x7a, 0xc1, 0xcb, 0xc1, 0x2f, 0xc2, |
||||
0x95, 0xc2, 0xfa, 0xc2, 0x55, 0xc3, 0xbb, 0xc3, 0x1e, 0xc4, 0x86, 0xc4, |
||||
0xec, 0xc4, 0x4b, 0xc5, 0xab, 0xc5, 0x04, 0xc6, 0x72, 0xc6, 0xc6, 0xc6, |
||||
0x3a, 0xc7, 0x8e, 0xc7, 0xfd, 0xc7, 0x5a, 0xc8, 0xc0, 0xc8, 0x17, 0xc9, |
||||
0x79, 0xc9, 0xd5, 0xc9, 0x43, 0xca, 0x98, 0xca, 0x05, 0xcb, 0x64, 0xcb, |
||||
0xc3, 0xcb, 0x1e, 0xcc, 0x81, 0xcc, 0xe3, 0xcc, 0x40, 0xcd, 0xa6, 0xcd, |
||||
0x0a, 0xce, 0x6a, 0xce, 0xc0, 0xce, 0x26, 0xcf, 0x81, 0xcf, 0xf0, 0xcf, |
||||
0x48, 0xd0, 0xad, 0xd0, 0x07, 0xd1, 0x71, 0xd1, 0xca, 0xd1, 0x2b, 0xd2, |
||||
0x8a, 0xd2, 0xed, 0xd2, 0x50, 0xd3, 0xa1, 0xd3, 0x0f, 0xd4, 0x6f, 0xd4, |
||||
0xd6, 0xd4, 0x30, 0xd5, 0x93, 0xd5, 0xf6, 0xd5, 0x55, 0xd6, 0xb5, 0xd6, |
||||
0x12, 0xd7, 0x7b, 0xd7, 0xde, 0xd7, 0x34, 0xd8, 0x93, 0xd8, 0xe9, 0xd8, |
||||
0x61, 0xd9, 0xbb, 0xd9, 0x2b, 0xda, 0x88, 0xda, 0xeb, 0xda, 0x4f, 0xdb, |
||||
0xb9, 0xdb, 0x21, 0xdc, 0x80, 0xdc, 0xf7, 0xdc, 0x53, 0xdd, 0xbb, 0xdd, |
||||
0x2b, 0xde, 0xa4, 0xde, 0x05, 0xdf, 0x74, 0xdf, 0xd8, 0xdf, 0x44, 0xe0, |
||||
0xb4, 0xe0, 0x26, 0xe1, 0x91, 0xe1, 0x01, 0xe2, 0x77, 0xe2, 0xeb, 0xe2, |
||||
0x5e, 0xe3, 0xc7, 0xe3, 0x44, 0xe4, 0xb2, 0xe4, 0x25, 0xe5, 0xa3, 0xe5, |
||||
0x15, 0xe6, 0x97, 0xe6, 0x0b, 0xe7, 0x8b, 0xe7, 0x10, 0xe8, 0x7d, 0xe8, |
||||
0x06, 0xe9, 0x74, 0xe9, 0xff, 0xe9, 0x82, 0xea, 0x01, 0xeb, 0x85, 0xeb, |
||||
0xfa, 0xeb, 0x91, 0xec, 0x07, 0xed, 0x8f, 0xed, 0x15, 0xee, 0x9a, 0xee, |
||||
0x26, 0xef, 0xa5, 0xef, 0x26, 0xf0, 0xb2, 0xf0, 0x3e, 0xf1, 0xca, 0xf1, |
||||
0x45, 0xf2, 0xcc, 0xf2, 0x51, 0xf3, 0xdc, 0xf3, 0x5c, 0xf4, 0xe8, 0xf4, |
||||
0x6e, 0xf5, 0xf9, 0xf5, 0x79, 0xf6, 0xf9, 0xf6, 0x7d, 0xf7, 0x08, 0xf8, |
||||
0x91, 0xf8, 0x18, 0xf9, 0x95, 0xf9, 0x18, 0xfa, 0xa5, 0xfa, 0x21, 0xfb, |
||||
0xa9, 0xfb, 0x2a, 0xfc, 0xa7, 0xfc, 0x23, 0xfd, 0xa3, 0xfd, 0x2b, 0xfe, |
||||
0x9c, 0xfe, 0x2b, 0xff, 0xa0, 0xff, 0x1c, 0x00, 0x9a, 0x00, 0x11, 0x01, |
||||
0x9a, 0x01, 0x14, 0x02, 0x8c, 0x02, 0x07, 0x03, 0x84, 0x03, 0xf7, 0x03, |
||||
0x75, 0x04, 0xf3, 0x04, 0x65, 0x05, 0xe8, 0x05, 0x54, 0x06, 0xd3, 0x06, |
||||
0x48, 0x07, 0xc2, 0x07, 0x38, 0x08, 0xad, 0x08, 0x28, 0x09, 0x99, 0x09, |
||||
0x11, 0x0a, 0x79, 0x0a, 0xf5, 0x0a, 0x5c, 0x0b, 0xd1, 0x0b, 0x3f, 0x0c, |
||||
0xb5, 0x0c, 0x2c, 0x0d, 0x9a, 0x0d, 0x0b, 0x0e, 0x74, 0x0e, 0xe6, 0x0e, |
||||
0x45, 0x0f, 0xbd, 0x0f, 0x2f, 0x10, 0x9a, 0x10, 0x05, 0x11, 0x6c, 0x11, |
||||
0xdb, 0x11, 0x40, 0x12, 0xaa, 0x12, 0x14, 0x13, 0x81, 0x13, 0xe9, 0x13, |
||||
0x4d, 0x14, 0xb9, 0x14, 0x18, 0x15, 0x88, 0x15, 0xe6, 0x15, 0x58, 0x16, |
||||
0xb9, 0x16, 0x1c, 0x17, 0x7e, 0x17, 0xe3, 0x17, 0x43, 0x18, 0xac, 0x18, |
||||
0x08, 0x19, 0x6d, 0x19, 0xce, 0x19, 0x34, 0x1a, 0x90, 0x1a, 0xf5, 0x1a, |
||||
0x53, 0x1b, 0xbb, 0x1b, 0x07, 0x1c, 0x6f, 0x1c, 0xc2, 0x1c, 0x28, 0x1d, |
||||
0x84, 0x1d, 0xe8, 0x1d, 0x35, 0x1e, 0xa2, 0x1e, 0xf8, 0x1e, 0x59, 0x1f, |
||||
0xb8, 0x1f, 0x0c, 0x20, 0x69, 0x20, 0xbe, 0x20, 0x19, 0x21, 0x66, 0x21, |
||||
0xc6, 0x21, 0x1f, 0x22, 0x70, 0x22, 0xbe, 0x22, 0x18, 0x23, 0x72, 0x23, |
||||
0xbf, 0x23, 0x0f, 0x24, 0x67, 0x24, 0xc0, 0x24, 0x08, 0x25, 0x51, 0x25, |
||||
0xa6, 0x25, 0xf4, 0x25, 0x42, 0x26, 0x93, 0x26, 0xd6, 0x26, 0x25, 0x27, |
||||
0x6c, 0x27, 0xb7, 0x27, 0x07, 0x28, 0x49, 0x28, 0x96, 0x28, 0xda, 0x28, |
||||
0x22, 0x29, 0x66, 0x29, 0xa4, 0x29, 0xe8, 0x29, 0x20, 0x2a, 0x62, 0x2a, |
||||
0xa9, 0x2a, 0xe5, 0x2a, 0x21, 0x2b, 0x5a, 0x2b, 0x97, 0x2b, 0xc1, 0x2b, |
||||
0xfe, 0x2b, 0x28, 0x2c, 0x57, 0x2c, 0x88, 0x2c, 0xae, 0x2c, 0xd3, 0x2c, |
||||
0xfa, 0x2c, 0x17, 0x2d, 0x33, 0x2d, 0x4b, 0x2d, 0x5d, 0x2d, 0x68, 0x2d, |
||||
0x81, 0x2d, 0x92, 0x2d, 0x9e, 0x2d, 0xa9, 0x2d, 0xbb, 0x2d, 0xc3, 0x2d, |
||||
0xcd, 0x2d, 0xd5, 0x2d, 0xcd, 0x2d, 0xdc, 0x2d, 0xe3, 0x2d, 0xe1, 0x2d, |
||||
0xdd, 0x2d, 0xd9, 0x2d, 0xd7, 0x2d, 0xcf, 0x2d, 0xe0, 0x2d, 0xd2, 0x2d, |
||||
0xd2, 0x2d, 0xcb, 0x2d, 0xb7, 0x2d, 0xb6, 0x2d, 0xa1, 0x2d, 0x9e, 0x2d, |
||||
0x8b, 0x2d, 0x84, 0x2d, 0x68, 0x2d, 0x6a, 0x2d, 0x4e, 0x2d, 0x45, 0x2d, |
||||
0x2f, 0x2d, 0x18, 0x2d, 0x15, 0x2d, 0xef, 0x2c, 0xe8, 0x2c, 0xc9, 0x2c, |
||||
0xc7, 0x2c, 0xaa, 0x2c, 0x9b, 0x2c, 0x7c, 0x2c, 0x64, 0x2c, 0x3c, 0x2c, |
||||
0x2e, 0x2c, 0x16, 0x2c, 0x05, 0x2c, 0xe1, 0x2b, 0xc8, 0x2b, 0xb5, 0x2b, |
||||
0x9a, 0x2b, 0x7c, 0x2b, 0x61, 0x2b, 0x3f, 0x2b, 0x21, 0x2b, 0x01, 0x2b, |
||||
0xee, 0x2a, 0xd0, 0x2a, 0xb3, 0x2a, 0x95, 0x2a, 0x6d, 0x2a, 0x50, 0x2a, |
||||
0x2b, 0x2a, 0x0b, 0x2a, 0xe9, 0x29, 0xd1, 0x29, 0xa8, 0x29, 0x97, 0x29, |
||||
0x6c, 0x29, 0x51, 0x29, 0x24, 0x29, 0x03, 0x29, 0xe6, 0x28, 0xbe, 0x28, |
||||
0xa1, 0x28, 0x80, 0x28, 0x64, 0x28, 0x38, 0x28, 0x12, 0x28, 0xf0, 0x27, |
||||
0xd3, 0x27, 0xac, 0x27, 0x94, 0x27, 0x67, 0x27, 0x4a, 0x27, 0x1c, 0x27, |
||||
0xf7, 0x26, 0xd1, 0x26, 0xb6, 0x26, 0x8d, 0x26, 0x6e, 0x26, 0x4b, 0x26, |
||||
0x25, 0x26, 0x02, 0x26, 0xd8, 0x25, 0xbe, 0x25, 0x93, 0x25, 0x7c, 0x25, |
||||
0x4a, 0x25, 0x27, 0x25, 0x07, 0x25, 0xdc, 0x24, 0xbb, 0x24, 0x9a, 0x24, |
||||
0x78, 0x24, 0x4c, 0x24, 0x26, 0x24, 0x00, 0x24, 0xd7, 0x23, 0xc0, 0x23, |
||||
0x94, 0x23, 0x71, 0x23, 0x45, 0x23, 0x1c, 0x23, 0x00, 0x23, 0xd4, 0x22, |
||||
0xb5, 0x22, 0x8e, 0x22, 0x67, 0x22, 0x39, 0x22, 0x00, 0x22, 0xbd, 0x21, |
||||
0x87, 0x21, 0x46, 0x21, 0x01, 0x21, 0xca, 0x20, 0x89, 0x20, 0x4a, 0x20, |
||||
0x17, 0x20, 0xd6, 0x1f, 0x9a, 0x1f, 0x5e, 0x1f, 0x20, 0x1f, 0xe0, 0x1e, |
||||
0xa3, 0x1e, 0x5f, 0x1e, 0x29, 0x1e, 0xf0, 0x1d, 0xb8, 0x1d, 0x78, 0x1d, |
||||
0x36, 0x1d, 0x04, 0x1d, 0xc6, 0x1c, 0x8b, 0x1c, 0x4d, 0x1c, 0x18, 0x1c, |
||||
0xd9, 0x1b, 0x97, 0x1b, 0x5c, 0x1b, 0x2b, 0x1b, 0xf4, 0x1a, 0xb1, 0x1a, |
||||
0x7c, 0x1a, 0x32, 0x1a, 0x02, 0x1a, 0xc6, 0x19, 0x8b, 0x19, 0x59, 0x19, |
||||
0x10, 0x19, 0xd7, 0x18, 0x9c, 0x18, 0x62, 0x18, 0x22, 0x18, 0xe8, 0x17, |
||||
0xb1, 0x17, 0x7c, 0x17, 0x34, 0x17, 0xf9, 0x16, 0xc0, 0x16, 0x8b, 0x16, |
||||
0x55, 0x16, 0x14, 0x16, 0xdd, 0x15, 0x9f, 0x15, 0x65, 0x15, 0x2b, 0x15, |
||||
0xea, 0x14, 0xb9, 0x14, 0x70, 0x14, 0x3d, 0x14, 0x05, 0x14, 0xc1, 0x13, |
||||
0x86, 0x13, 0x45, 0x13, 0x09, 0x13, 0xca, 0x12, 0x90, 0x12, 0x57, 0x12, |
||||
0x1a, 0x12, 0xe1, 0x11, 0x9b, 0x11, 0x61, 0x11, 0x1d, 0x11, 0xe1, 0x10, |
||||
0x9d, 0x10, 0x64, 0x10, 0x17, 0x10, 0xde, 0x0f, 0xa1, 0x0f, 0x60, 0x0f, |
||||
0x1b, 0x0f, 0xd8, 0x0e, 0x90, 0x0e, 0x5b, 0x0e, 0x0e, 0x0e, 0xd3, 0x0d, |
||||
0x86, 0x0d, 0x4d, 0x0d, 0xf5, 0x0c, 0xba, 0x0c, 0x68, 0x0c, 0x2a, 0x0c, |
||||
0xde, 0x0b, 0x94, 0x0b, 0x4e, 0x0b, 0x07, 0x0b, 0xbb, 0x0a, 0x6c, 0x0a, |
||||
0x25, 0x0a, 0xd4, 0x09, 0x89, 0x09, 0x39, 0x09, 0xe6, 0x08, 0xa3, 0x08, |
||||
0x4f, 0x08, 0x02, 0x08, 0xa7, 0x07, 0x5f, 0x07, 0x08, 0x07, 0xba, 0x06, |
||||
0x68, 0x06, 0x1f, 0x06, 0xc5, 0x05, 0x7a, 0x05, 0x1f, 0x05, 0xd7, 0x04, |
||||
0x85, 0x04, 0x31, 0x04, 0xde, 0x03, 0x89, 0x03, 0x3a, 0x03, 0xe9, 0x02, |
||||
0x96, 0x02, 0x47, 0x02, 0xf7, 0x01, 0xa4, 0x01, 0x5d, 0x01, 0x06, 0x01, |
||||
0xb9, 0x00, 0x00, 0x00 |
||||
}; |
||||
unsigned int kick_raw_len = 6352; |
@ -1,51 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
project(save_raw_sd) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs_soundio) |
||||
if(teensy_audio_x86_stubs_soundio_FOUND) |
||||
include_directories(${teensy_audio_x86_stubs_soundio_INCLUDE_DIR}) |
||||
|
||||
include_directories(../../../src) |
||||
include_directories(/usr/local/include) #soundio |
||||
|
||||
add_executable(save_raw_sd save_raw_sd.cpp) |
||||
target_link_libraries(save_raw_sd teensy_variable_playback) |
||||
|
||||
if(WIN32) |
||||
elseif(UNIX AND NOT APPLE) |
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") |
||||
SET(SOUNDIO_LIBS -L/usr/lib/x86_64-linux-gnu -lsoundio) |
||||
elseif(APPLE) |
||||
INCLUDE_DIRECTORIES(/System/Library/Frameworks) |
||||
FIND_LIBRARY(glfw3_LIBRARY glfw) |
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa) |
||||
FIND_LIBRARY(OpenGL_LIBRARY OpenGL) |
||||
FIND_LIBRARY(IOKit_LIBRARY IOKit) |
||||
FIND_LIBRARY(glew_LIBRARY glew) |
||||
FIND_LIBRARY(CoreVideo_LIBRARY CoreVideo) |
||||
MARK_AS_ADVANCED(COCOA_LIBRARY OpenGL_LIBRARY) |
||||
FIND_LIBRARY(FREETYPE_LIBRARIES FreeType) |
||||
SET(APPLE_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${OpenGL_LIBRARY} ${CoreVideo_LIBRARY}) |
||||
SET(APPLE_LIBS ${APPLE_LIBS} ${GLFW3_LIBRARY} ${ASSIMP_LIBRARY} ${FREETYPE_LIBRARIES} ${glfw3_LIBRARY} ${glew_LIBRARY}) |
||||
set(LIBS ${LIBS} ${APPLE_LIBS}) |
||||
target_link_libraries(save_raw_sd |
||||
"-framework CoreServices" |
||||
"-framework CoreAudio" |
||||
"-framework Foundation" |
||||
"-framework AudioUnit") |
||||
SET(SOUNDIO_LIBS /usr/local/lib/libsoundio.a) |
||||
endif() |
||||
|
||||
target_link_libraries(save_raw_sd ${LIBS} ${teensy_x86_stubs_LIBS} ${teensy_x86_sd_stubs_LIBS} ${teensy_audio_x86_stubs_LIBS} ${teensy_audio_x86_stubs_soundio_LIBS} ${teensy_st7735_linux_stubs_LIBS} ${teensy_st7735_linux_extras_opengl_LIBS} ${SOUNDIO_LIBS}) |
||||
#set(CMAKE_VERBOSE_MAKEFILE 1) |
||||
endif() |
@ -1,701 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include "playsdresmp.h" |
||||
#include "output_soundio.h" |
||||
#include <soundio/soundio.h> |
||||
#include <SD.h> |
||||
#include <iostream> |
||||
#include <execinfo.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
#include <string> |
||||
#include <cassert> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp playSdRaw1; //xy=306,225
|
||||
AudioRecordQueue queue1; //xy=609,267
|
||||
AudioOutputSoundIO sio_out1; //xy=612,224
|
||||
AudioConnection patchCord1(playSdRaw1, 0, sio_out1, 0); |
||||
AudioConnection patchCord2(playSdRaw1, 0, sio_out1, 1); |
||||
AudioConnection patchCord3(playSdRaw1, 0, queue1, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const char *_filename = "KICK.RAW"; |
||||
extern unsigned int kick_raw_len; |
||||
extern unsigned char kick_raw[]; |
||||
|
||||
int16_t buffer[512] = {0}; |
||||
File frec; |
||||
|
||||
unsigned long lastSamplePlayed = 0; |
||||
void my_handler(sig_atomic_t i); |
||||
static char stack_body[64*1024]; |
||||
static stack_t sigseg_stack; |
||||
static struct sigaction sigseg_handler; |
||||
|
||||
void crash_handler(sig_atomic_t i); |
||||
|
||||
void setup() { |
||||
Serial.begin(9600);
|
||||
|
||||
playSdRaw1.setPlaybackRate(1.4f); |
||||
playSdRaw1.enableInterpolation(true); |
||||
//rraw_a1.play((int16_t*)kick_raw, kick_raw_len/2);
|
||||
Serial.println("setup done"); |
||||
|
||||
if (SD.exists("RECORD_SD.RAW")) { |
||||
// The SD library writes new data to the end of the
|
||||
// file, so to start a new recording, the old file
|
||||
// must be deleted before new data is written.
|
||||
SD.remove("RECORD_SD.RAW"); |
||||
} |
||||
frec = SD.open("RECORD_SD.RAW", O_WRITE); |
||||
|
||||
AudioMemory(120); |
||||
|
||||
if (frec) { |
||||
queue1.begin(); |
||||
Serial.println("startRecording"); |
||||
} else { |
||||
Serial.println("recording failed..."); |
||||
} |
||||
} |
||||
|
||||
void loop() { |
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 1000) { |
||||
if (!playSdRaw1.isPlaying()) { |
||||
playSdRaw1.playRaw(_filename, 1); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
|
||||
if (queue1.available() >= 1) {
|
||||
int16_t* incomming = queue1.readBuffer(); |
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//if (incomming != NULL && sizeof(incomming) >= 256) {
|
||||
if (incomming != NULL) { |
||||
memcpy(buffer, incomming, 256); |
||||
queue1.freeBuffer(); |
||||
frec.write((unsigned char *)buffer, 256); |
||||
frec.flush(); |
||||
}
|
||||
//else {
|
||||
// arduino_should_exit = true;
|
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//}
|
||||
}
|
||||
delay(1); |
||||
} |
||||
|
||||
int main(int numArgs, char **args) { |
||||
|
||||
if (numArgs < 2) |
||||
{ |
||||
std::cout << "usage: " << args[0] << " <path-to-SDCard>"; |
||||
exit(0); |
||||
} |
||||
std::cout << args[1] << std::endl; |
||||
signal (SIGINT,my_handler); |
||||
signal (SIGSEGV,crash_handler);
|
||||
|
||||
sigseg_stack.ss_sp = stack_body; |
||||
sigseg_stack.ss_flags = SS_ONSTACK; |
||||
sigseg_stack.ss_size = sizeof(stack_body); |
||||
// assert(!sigaltstack(&sigseg_stack, nullptr));
|
||||
sigseg_handler.sa_flags = SA_ONSTACK; |
||||
sigseg_handler.sa_handler = &crash_handler; |
||||
// assert(!sigaction(SIGSEGV, &sigseg_handler, nullptr));
|
||||
|
||||
initialize_mock_arduino(); |
||||
//SD.setSDCardFileData((char *) kick_raw, kick_raw_len);
|
||||
SD.setSDCardFolderPath(args[1]); |
||||
setup(); |
||||
while(!arduino_should_exit){ |
||||
loop(); |
||||
} |
||||
delay(1000); |
||||
frec.close(); |
||||
} |
||||
|
||||
void my_handler(sig_atomic_t i){ |
||||
if ( i== SIGINT) { |
||||
arduino_should_exit = true; |
||||
printf("Caught signal %d\n",i); |
||||
} else
|
||||
{ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
} |
||||
void crash_handler(sig_atomic_t i){ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
|
||||
unsigned char kick_raw[] = { |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
0x51, 0x08, 0x01, 0x08, 0x25, 0x08, 0x70, 0x08, 0xc3, 0x08, 0x23, 0x09, |
||||
0x95, 0x09, 0x19, 0x0a, 0x83, 0x0a, 0x7e, 0x0a, 0xd0, 0x0a, 0x65, 0x0b, |
||||
0xf6, 0x0b, 0x89, 0x0c, 0xd1, 0x0c, 0xcf, 0x0c, 0x1a, 0x0d, 0xe5, 0x0d, |
||||
0x5e, 0x0e, 0xbb, 0x0e, 0xec, 0x0e, 0xd9, 0x0e, 0x07, 0x0f, 0xc8, 0x0f, |
||||
0x2a, 0x10, 0x04, 0x10, 0x28, 0x10, 0x54, 0x11, 0x8e, 0x13, 0x4b, 0x16, |
||||
0x09, 0x19, 0x91, 0x1b, 0xf7, 0x1d, 0x55, 0x20, 0xd1, 0x22, 0xcb, 0x25, |
||||
0x4d, 0x29, 0xa8, 0x2c, 0x7f, 0x2f, 0xda, 0x31, 0xac, 0x34, 0x0a, 0x3a, |
||||
0x24, 0x47, 0x9d, 0x5b, 0xe9, 0x67, 0x29, 0x67, 0x24, 0x66, 0x26, 0x66, |
||||
0xd2, 0x65, 0x9c, 0x65, 0x38, 0x65, 0x05, 0x65, 0x9f, 0x64, 0x64, 0x64, |
||||
0x12, 0x64, 0xce, 0x63, 0x7c, 0x63, 0x32, 0x63, 0xe6, 0x62, 0x97, 0x62, |
||||
0x49, 0x62, 0x01, 0x62, 0xb3, 0x61, 0x63, 0x61, 0x15, 0x61, 0xc4, 0x60, |
||||
0x75, 0x60, 0x20, 0x60, 0xce, 0x5f, 0x7a, 0x5f, 0x28, 0x5f, 0xd5, 0x5e, |
||||
0x81, 0x5e, 0x2d, 0x5e, 0xd3, 0x5d, 0x80, 0x5d, 0x2e, 0x5d, 0xe6, 0x5c, |
||||
0x1a, 0x5c, 0x16, 0x5a, 0x01, 0x58, 0xb9, 0x56, 0x6d, 0x55, 0xf4, 0x53, |
||||
0x49, 0x52, 0x83, 0x50, 0x87, 0x4e, 0x5f, 0x4c, 0x68, 0x4a, 0x5c, 0x48, |
||||
0x62, 0x46, 0x5a, 0x44, 0xe2, 0x41, 0x08, 0x3f, 0x1c, 0x3c, 0x44, 0x39, |
||||
0x35, 0x36, 0xcb, 0x32, 0xaf, 0x2f, 0xc8, 0x2c, 0xf8, 0x29, 0x55, 0x27, |
||||
0x6a, 0x24, 0x0f, 0x21, 0x5e, 0x1d, 0xc3, 0x19, 0x7b, 0x16, 0x71, 0x13, |
||||
0x6c, 0x10, 0x00, 0x0d, 0xd2, 0x08, 0x7f, 0x04, 0x7a, 0x01, 0x43, 0xff, |
||||
0xb9, 0xfc, 0xfa, 0xf9, 0x3b, 0xf7, 0xcb, 0xf4, 0x2b, 0xf2, 0x02, 0xef, |
||||
0x0c, 0xec, 0x3d, 0xe9, 0x21, 0xe6, 0xa6, 0xe2, 0x8a, 0xdf, 0x00, 0xdd, |
||||
0xbc, 0xda, 0x9e, 0xd8, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd2, 0xad, 0xd0, |
||||
0x5f, 0xce, 0xf0, 0xcb, 0xe9, 0xc9, 0x61, 0xc8, 0x75, 0xc7, 0x97, 0xc6, |
||||
0x3e, 0xc5, 0x07, 0xc4, 0x8e, 0xc3, 0x18, 0xc3, 0x3a, 0xc2, 0x15, 0xc1, |
||||
0x0e, 0xc0, 0xb3, 0xbf, 0xcf, 0xbf, 0xf8, 0xbf, 0xcc, 0xbf, 0x72, 0xbf, |
||||
0x41, 0xbf, 0x2b, 0xbf, 0xe2, 0xbe, 0x99, 0xbe, 0x4e, 0xbe, 0x0e, 0xbe, |
||||
0xcd, 0xbd, 0x7c, 0xbd, 0x8a, 0xbd, 0x88, 0xbd, 0x04, 0xbd, 0x0c, 0xbc, |
||||
0xb3, 0xbb, 0xf6, 0xbb, 0xf1, 0xbb, 0x12, 0xbc, 0x6f, 0xbc, 0xcb, 0xbc, |
||||
0xe4, 0xbc, 0x33, 0xbd, 0x1b, 0xbe, 0xac, 0xbe, 0x1e, 0xbf, 0x91, 0xbf, |
||||
0x50, 0xc0, 0x40, 0xc1, 0x3d, 0xc2, 0x32, 0xc3, 0xdf, 0xc3, 0xad, 0xc4, |
||||
0x77, 0xc5, 0xbe, 0xc6, 0xc7, 0xc8, 0x1d, 0xcb, 0x0e, 0xcd, 0x83, 0xce, |
||||
0xf1, 0xcf, 0xb4, 0xd1, 0x7d, 0xd3, 0x86, 0xd5, 0x89, 0xd7, 0xd2, 0xd9, |
||||
0x34, 0xdc, 0x28, 0xde, 0x23, 0xe0, 0x33, 0xe2, 0x0a, 0xe4, 0x59, 0xe5, |
||||
0xfc, 0xe6, 0x98, 0xe9, 0x30, 0xec, 0x91, 0xee, 0xc2, 0xf0, 0x0d, 0xf3, |
||||
0x35, 0xf5, 0xf3, 0xf6, 0xc4, 0xf8, 0xcb, 0xfa, 0xef, 0xfc, 0x65, 0xff, |
||||
0x05, 0x02, 0x7c, 0x04, 0xde, 0x06, 0x75, 0x09, 0x2b, 0x0c, 0x9b, 0x0e, |
||||
0xf3, 0x10, 0xb3, 0x13, 0x3a, 0x16, 0xeb, 0x18, 0x55, 0x1c, 0xad, 0x1f, |
||||
0xa8, 0x22, 0x54, 0x25, 0xae, 0x27, 0x33, 0x2a, 0x16, 0x2d, 0x36, 0x30, |
||||
0x84, 0x33, 0x94, 0x36, 0xbd, 0x38, 0xa2, 0x3a, 0x7d, 0x3c, 0x06, 0x3e, |
||||
0x24, 0x3f, 0x27, 0x40, 0x7c, 0x41, 0xef, 0x42, 0x14, 0x44, 0xeb, 0x44, |
||||
0x06, 0x46, 0x53, 0x47, 0x47, 0x48, 0x9b, 0x48, 0xaf, 0x48, 0xd7, 0x48, |
||||
0x4c, 0x49, 0xa0, 0x49, 0xbe, 0x49, 0xd4, 0x49, 0xfa, 0x49, 0x5e, 0x4a, |
||||
0xcc, 0x4a, 0x14, 0x4b, 0xfe, 0x4a, 0x22, 0x4b, 0x10, 0x4c, 0x0c, 0x4d, |
||||
0xb2, 0x4d, 0x4c, 0x4e, 0x3e, 0x4e, 0x77, 0x4d, 0x98, 0x4c, 0xf6, 0x4b, |
||||
0x67, 0x4b, 0xf0, 0x4a, 0x2a, 0x4a, 0xea, 0x48, 0x06, 0x48, 0x47, 0x47, |
||||
0xb2, 0x46, 0xda, 0x45, 0xad, 0x44, 0x5c, 0x43, 0x43, 0x42, 0x9e, 0x41, |
||||
0x0a, 0x41, 0x49, 0x40, 0xa6, 0x3f, 0x9d, 0x3e, 0x3c, 0x3d, 0xc6, 0x3b, |
||||
0xf6, 0x39, 0x87, 0x37, 0xf6, 0x34, 0x87, 0x32, 0x2b, 0x30, 0x6f, 0x2d, |
||||
0xfa, 0x2a, 0x3d, 0x29, 0x48, 0x27, 0xc2, 0x24, 0x49, 0x22, 0xca, 0x1f, |
||||
0xa0, 0x1c, 0x7c, 0x19, 0x06, 0x17, 0xbf, 0x14, 0x9f, 0x12, 0x96, 0x10, |
||||
0xf9, 0x0d, 0x3e, 0x0b, 0xe8, 0x08, 0x5c, 0x06, 0xe7, 0x02, 0x6e, 0xff, |
||||
0xca, 0xfc, 0x5b, 0xfa, 0xa0, 0xf7, 0xe9, 0xf4, 0x9c, 0xf2, 0x66, 0xf0, |
||||
0xaf, 0xed, 0xfd, 0xea, 0xcc, 0xe8, 0x6e, 0xe6, 0x82, 0xe3, 0x97, 0xe0, |
||||
0xed, 0xdd, 0x62, 0xdb, 0x7b, 0xd8, 0xd3, 0xd5, 0x5f, 0xd3, 0x1a, 0xd1, |
||||
0x44, 0xcf, 0xeb, 0xcd, 0x89, 0xcc, 0xca, 0xca, 0x4d, 0xc9, 0x35, 0xc8, |
||||
0x53, 0xc7, 0x0c, 0xc6, 0x06, 0xc4, 0xca, 0xc1, 0x09, 0xc0, 0x9c, 0xbe, |
||||
0xa8, 0xbd, 0xfd, 0xbc, 0xf2, 0xbb, 0x9b, 0xba, 0x20, 0xb9, 0xe4, 0xb7, |
||||
0xc1, 0xb6, 0xcd, 0xb5, 0x12, 0xb5, 0x55, 0xb4, 0xd1, 0xb3, 0x86, 0xb3, |
||||
0x19, 0xb3, 0xe8, 0xb2, 0xd7, 0xb2, 0x72, 0xb2, 0x27, 0xb2, 0xb7, 0xb1, |
||||
0x67, 0xb1, 0x65, 0xb1, 0xae, 0xb1, 0x6b, 0xb1, 0xf2, 0xb0, 0xeb, 0xb0, |
||||
0x0f, 0xb1, 0xfe, 0xb0, 0xeb, 0xb0, 0xcf, 0xb0, 0x94, 0xb0, 0x3e, 0xb0, |
||||
0x29, 0xb0, 0x56, 0xb0, 0x0c, 0xb0, 0xb7, 0xaf, 0xfb, 0xaf, 0x37, 0xb0, |
||||
0x96, 0xb0, 0x42, 0xb1, 0xe8, 0xb1, 0xb5, 0xb2, 0xc5, 0xb3, 0x93, 0xb4, |
||||
0x93, 0xb4, 0xee, 0xb4, 0x59, 0xb6, 0xca, 0xb7, 0x87, 0xb8, 0x6f, 0xb8, |
||||
0x33, 0xb8, 0xaf, 0xb8, 0x4a, 0xb9, 0x9d, 0xb9, 0xf2, 0xb9, 0x48, 0xba, |
||||
0xd0, 0xba, 0xe5, 0xbb, 0x4e, 0xbd, 0xaf, 0xbe, 0xe9, 0xbf, 0xba, 0xc1, |
||||
0xc2, 0xc3, 0x73, 0xc5, 0xa6, 0xc6, 0x6a, 0xc7, 0x83, 0xc8, 0x42, 0xca, |
||||
0xc8, 0xcb, 0x34, 0xcd, 0x94, 0xce, 0xcc, 0xcf, 0x31, 0xd1, 0x27, 0xd3, |
||||
0x8c, 0xd5, 0x61, 0xd7, 0x78, 0xd9, 0x3b, 0xdc, 0x40, 0xdf, 0xdd, 0xe1, |
||||
0x0c, 0xe4, 0xe4, 0xe5, 0xd0, 0xe7, 0x65, 0xea, 0xc9, 0xec, 0xd7, 0xee, |
||||
0xfc, 0xf0, 0x7c, 0xf3, 0xf6, 0xf5, 0x09, 0xf8, 0xde, 0xf9, 0xca, 0xfb, |
||||
0xac, 0xfd, 0xc3, 0xff, 0x33, 0x02, 0xb1, 0x04, 0x24, 0x07, 0x57, 0x09, |
||||
0x5f, 0x0b, 0xe6, 0x0d, 0xd1, 0x10, 0x6d, 0x13, 0x8f, 0x15, 0xfb, 0x17, |
||||
0x43, 0x1a, 0x8e, 0x1c, 0x1a, 0x1f, 0x69, 0x21, 0x80, 0x23, 0x74, 0x25, |
||||
0x62, 0x27, 0x07, 0x29, 0xa1, 0x2a, 0xa5, 0x2c, 0xdf, 0x2e, 0x57, 0x31, |
||||
0xff, 0x33, 0xd1, 0x36, 0x6e, 0x39, 0x8a, 0x3b, 0x58, 0x3d, 0x32, 0x3f, |
||||
0xc8, 0x40, 0x1b, 0x42, 0x22, 0x43, 0x1a, 0x44, 0x25, 0x45, 0xe5, 0x45, |
||||
0x43, 0x46, 0x9b, 0x46, 0x6a, 0x47, 0x6f, 0x48, 0x69, 0x49, 0x6f, 0x4a, |
||||
0xc7, 0x4b, 0x0e, 0x4d, 0x03, 0x4e, 0x78, 0x4e, 0xdf, 0x4e, 0x0b, 0x4f, |
||||
0xea, 0x4e, 0xcb, 0x4e, 0x1b, 0x4f, 0x6e, 0x4f, 0xc3, 0x4f, 0xdc, 0x4f, |
||||
0xcb, 0x4f, 0xd2, 0x4f, 0x16, 0x50, 0x24, 0x50, 0xf2, 0x4f, 0x00, 0x50, |
||||
0x37, 0x50, 0x4e, 0x50, 0x5e, 0x50, 0x7c, 0x50, 0xab, 0x50, 0x69, 0x50, |
||||
0xad, 0x4f, 0xa3, 0x4e, 0xe6, 0x4d, 0x42, 0x4d, 0xdc, 0x4c, 0x7c, 0x4c, |
||||
0xbe, 0x4b, 0x08, 0x4b, 0x7b, 0x4a, 0xe4, 0x49, 0x14, 0x49, 0x07, 0x48, |
||||
0x98, 0x46, 0x2f, 0x45, 0x16, 0x44, 0x23, 0x43, 0x55, 0x42, 0xac, 0x41, |
||||
0x06, 0x41, 0x4b, 0x40, 0x8f, 0x3f, 0xde, 0x3e, 0xe1, 0x3d, 0x75, 0x3c, |
||||
0xc0, 0x3a, 0xe4, 0x38, 0x83, 0x37, 0x9a, 0x36, 0xe5, 0x35, 0xc0, 0x34, |
||||
0xf9, 0x32, 0xe1, 0x30, 0xfa, 0x2e, 0xd4, 0x2c, 0x4d, 0x2a, 0xed, 0x27, |
||||
0xb9, 0x25, 0xb2, 0x23, 0x7d, 0x21, 0xfd, 0x1e, 0x89, 0x1c, 0x38, 0x1a, |
||||
0xe2, 0x17, 0x67, 0x15, 0xf3, 0x12, 0xb3, 0x10, 0x9e, 0x0e, 0x79, 0x0c, |
||||
0xea, 0x09, 0x54, 0x07, 0x26, 0x05, 0x0a, 0x03, 0xd7, 0x00, 0x98, 0xfe, |
||||
0x41, 0xfc, 0x8d, 0xf9, 0x3c, 0xf7, 0x4f, 0xf5, 0x73, 0xf3, 0x7b, 0xf1, |
||||
0x68, 0xef, 0x6f, 0xed, 0x7a, 0xeb, 0x87, 0xe9, 0x48, 0xe7, 0xc6, 0xe4, |
||||
0x65, 0xe2, 0xf6, 0xdf, 0x86, 0xdd, 0x9f, 0xdb, 0x1b, 0xda, 0xa6, 0xd8, |
||||
0xce, 0xd6, 0xe4, 0xd4, 0xe3, 0xd2, 0x84, 0xd0, 0xec, 0xcd, 0x08, 0xcc, |
||||
0x89, 0xca, 0x1b, 0xc9, 0xe2, 0xc7, 0x9d, 0xc6, 0xe5, 0xc4, 0x79, 0xc3, |
||||
0x6d, 0xc2, 0xe3, 0xc0, 0x3c, 0xbf, 0xd3, 0xbd, 0x41, 0xbc, 0xd2, 0xba, |
||||
0x6a, 0xb9, 0xa1, 0xb7, 0xa9, 0xb5, 0x47, 0xb4, 0x91, 0xb3, 0xd5, 0xb2, |
||||
0xb7, 0xb1, 0x51, 0xb0, 0x14, 0xaf, 0xf5, 0xad, 0x95, 0xac, 0x34, 0xab, |
||||
0x05, 0xaa, 0xe1, 0xa8, 0xb3, 0xa7, 0xd9, 0xa6, 0x25, 0xa6, 0x6e, 0xa5, |
||||
0x2b, 0xa5, 0x7b, 0xa5, 0x9a, 0xa5, 0x88, 0xa5, 0xc3, 0xa5, 0xe7, 0xa5, |
||||
0xaf, 0xa5, 0x8b, 0xa5, 0x80, 0xa5, 0x65, 0xa5, 0x8c, 0xa5, 0x7e, 0xa5, |
||||
0x22, 0xa5, 0x40, 0xa5, 0xed, 0xa5, 0x27, 0xa6, 0x2b, 0xa6, 0x1c, 0xa6, |
||||
0xe5, 0xa5, 0x7b, 0xa5, 0x45, 0xa5, 0x37, 0xa5, 0x04, 0xa5, 0x91, 0xa4, |
||||
0x8d, 0xa4, 0x2d, 0xa5, 0x9f, 0xa5, 0xf6, 0xa5, 0x7e, 0xa6, 0x34, 0xa7, |
||||
0x14, 0xa8, 0x7e, 0xa8, 0x87, 0xa8, 0xc4, 0xa8, 0x51, 0xa9, 0xec, 0xa9, |
||||
0x74, 0xaa, 0xf7, 0xaa, 0x40, 0xab, 0xd9, 0xab, 0xca, 0xac, 0x6b, 0xad, |
||||
0xb3, 0xad, 0x08, 0xae, 0x10, 0xaf, 0x2c, 0xb0, 0xcb, 0xb0, 0x23, 0xb1, |
||||
0xac, 0xb1, 0x0e, 0xb2, 0x42, 0xb2, 0xd7, 0xb2, 0xef, 0xb3, 0x21, 0xb5, |
||||
0x30, 0xb6, 0xe9, 0xb6, 0x54, 0xb7, 0xf0, 0xb7, 0x9e, 0xb8, 0x2e, 0xb9, |
||||
0x03, 0xba, 0x55, 0xbb, 0xdf, 0xbc, 0x5f, 0xbe, 0xb8, 0xbf, 0x01, 0xc1, |
||||
0x83, 0xc2, 0x0c, 0xc4, 0x65, 0xc5, 0x7e, 0xc6, 0x86, 0xc7, 0xba, 0xc8, |
||||
0x11, 0xca, 0x66, 0xcb, 0x28, 0xcd, 0x4d, 0xcf, 0x60, 0xd1, 0x69, 0xd3, |
||||
0x7b, 0xd5, 0x5f, 0xd7, 0xe3, 0xd8, 0xca, 0xda, 0xda, 0xdc, 0xda, 0xde, |
||||
0xab, 0xe0, 0x59, 0xe2, 0x3b, 0xe4, 0x21, 0xe6, 0xfc, 0xe7, 0xcb, 0xe9, |
||||
0xbe, 0xeb, 0x9c, 0xed, 0x47, 0xef, 0x0b, 0xf1, 0xd3, 0xf2, 0xbc, 0xf4, |
||||
0x9c, 0xf6, 0x67, 0xf8, 0x2a, 0xfa, 0xc1, 0xfb, 0x7f, 0xfd, 0x41, 0xff, |
||||
0x12, 0x01, 0xd2, 0x02, 0xfc, 0x04, 0xe8, 0x06, 0x9a, 0x08, 0x59, 0x0a, |
||||
0x48, 0x0c, 0x36, 0x0e, 0x37, 0x10, 0x36, 0x12, 0x59, 0x14, 0x62, 0x16, |
||||
0x86, 0x18, 0xb9, 0x1a, 0xc2, 0x1c, 0xcd, 0x1e, 0xf1, 0x20, 0x27, 0x23, |
||||
0x7a, 0x25, 0xf9, 0x27, 0x2a, 0x2a, 0x1f, 0x2c, 0xf8, 0x2d, 0xa3, 0x2f, |
||||
0x23, 0x31, 0xf4, 0x32, 0x2c, 0x35, 0x40, 0x37, 0x23, 0x39, 0xfe, 0x3a, |
||||
0x11, 0x3d, 0x2c, 0x3f, 0xe8, 0x40, 0x8c, 0x42, 0x55, 0x44, 0x37, 0x46, |
||||
0x99, 0x47, 0xcb, 0x48, 0x12, 0x4a, 0x60, 0x4b, 0x86, 0x4c, 0x9b, 0x4d, |
||||
0xc8, 0x4e, 0xec, 0x4f, 0xe3, 0x50, 0x8a, 0x51, 0x23, 0x52, 0xd8, 0x52, |
||||
0x68, 0x53, 0x9b, 0x53, 0xb1, 0x53, 0x11, 0x54, 0x94, 0x54, 0xf7, 0x54, |
||||
0x4f, 0x55, 0xa4, 0x55, 0x03, 0x56, 0x51, 0x56, 0x92, 0x56, 0xfa, 0x56, |
||||
0x59, 0x57, 0xad, 0x57, 0xcd, 0x57, 0xc5, 0x57, 0xa8, 0x57, 0x64, 0x57, |
||||
0x49, 0x57, 0x63, 0x57, 0x64, 0x57, 0x40, 0x57, 0xf6, 0x56, 0xfc, 0x56, |
||||
0x36, 0x57, 0x3b, 0x57, 0x1e, 0x57, 0x1c, 0x57, 0x03, 0x57, 0xee, 0x56, |
||||
0xa5, 0x56, 0x80, 0x56, 0xd4, 0x56, 0xe4, 0x56, 0x92, 0x56, 0xf0, 0x55, |
||||
0x02, 0x55, 0xab, 0x53, 0xb5, 0x52, 0x51, 0x52, 0x08, 0x52, 0x80, 0x51, |
||||
0xb4, 0x50, 0xde, 0x4f, 0x27, 0x4f, 0x63, 0x4e, 0x58, 0x4d, 0x72, 0x4c, |
||||
0x82, 0x4b, 0x81, 0x4a, 0x87, 0x49, 0xb4, 0x48, 0xb1, 0x47, 0x99, 0x46, |
||||
0xb4, 0x45, 0x34, 0x45, 0xb8, 0x44, 0x2f, 0x44, 0x7f, 0x43, 0xa0, 0x42, |
||||
0xcb, 0x41, 0xd1, 0x40, 0xeb, 0x3f, 0x28, 0x3f, 0x3d, 0x3e, 0x09, 0x3d, |
||||
0x9d, 0x3b, 0x40, 0x3a, 0x1c, 0x39, 0xeb, 0x37, 0xd1, 0x36, 0xb3, 0x35, |
||||
0x8b, 0x34, 0x0b, 0x33, 0x51, 0x31, 0xfb, 0x2f, 0xb9, 0x2e, 0x54, 0x2d, |
||||
0xaf, 0x2b, 0xdf, 0x29, 0xf1, 0x27, 0x3a, 0x26, 0x6f, 0x24, 0x56, 0x22, |
||||
0x20, 0x20, 0x0a, 0x1e, 0x3b, 0x1c, 0x55, 0x1a, 0x6c, 0x18, 0xaa, 0x16, |
||||
0xef, 0x14, 0x0a, 0x13, 0x17, 0x11, 0x1c, 0x0f, 0x22, 0x0d, 0x46, 0x0b, |
||||
0x53, 0x09, 0x46, 0x07, 0x46, 0x05, 0x4d, 0x03, 0x1a, 0x01, 0xd3, 0xfe, |
||||
0x94, 0xfc, 0x8c, 0xfa, 0x8f, 0xf8, 0xc1, 0xf6, 0x27, 0xf5, 0x8f, 0xf3, |
||||
0xf2, 0xf1, 0x74, 0xf0, 0xfa, 0xee, 0x4d, 0xed, 0x9e, 0xeb, 0xa2, 0xe9, |
||||
0x73, 0xe7, 0xa9, 0xe5, 0x2d, 0xe4, 0xa3, 0xe2, 0xf9, 0xe0, 0x50, 0xdf, |
||||
0xb9, 0xdd, 0x34, 0xdc, 0xad, 0xda, 0x0b, 0xd9, 0x77, 0xd7, 0xb9, 0xd5, |
||||
0x37, 0xd4, 0xff, 0xd2, 0x8a, 0xd1, 0x14, 0xd0, 0xba, 0xce, 0x7d, 0xcd, |
||||
0x2c, 0xcc, 0xa1, 0xca, 0x22, 0xc9, 0xa9, 0xc7, 0x0e, 0xc6, 0x66, 0xc4, |
||||
0xfc, 0xc2, 0xa5, 0xc1, 0x4a, 0xc0, 0xff, 0xbe, 0xf7, 0xbd, 0x0e, 0xbd, |
||||
0x1d, 0xbc, 0x16, 0xbb, 0xad, 0xb9, 0x44, 0xb8, 0xd7, 0xb6, 0x9e, 0xb5, |
||||
0x9f, 0xb4, 0x97, 0xb3, 0x72, 0xb2, 0x5f, 0xb1, 0x67, 0xb0, 0x89, 0xaf, |
||||
0x9d, 0xae, 0xbe, 0xad, 0x08, 0xad, 0x5d, 0xac, 0x8b, 0xab, 0xad, 0xaa, |
||||
0xe4, 0xa9, 0x59, 0xa9, 0xc4, 0xa8, 0x02, 0xa8, 0x4d, 0xa7, 0xc2, 0xa6, |
||||
0x4a, 0xa6, 0x09, 0xa6, 0xd2, 0xa5, 0x50, 0xa5, 0xec, 0xa4, 0xc2, 0xa4, |
||||
0xd9, 0xa4, 0xbd, 0xa4, 0x97, 0xa4, 0xa5, 0xa4, 0xbf, 0xa4, 0xb4, 0xa4, |
||||
0x8f, 0xa4, 0x31, 0xa4, 0x39, 0xa4, 0x7d, 0xa4, 0xab, 0xa4, 0xc7, 0xa4, |
||||
0xb3, 0xa4, 0xab, 0xa4, 0xca, 0xa4, 0x05, 0xa5, 0x1e, 0xa5, 0x2a, 0xa5, |
||||
0x2c, 0xa5, 0x18, 0xa5, 0x01, 0xa5, 0x33, 0xa5, 0x8c, 0xa5, 0xb2, 0xa5, |
||||
0x81, 0xa5, 0x5c, 0xa5, 0x6e, 0xa5, 0x79, 0xa5, 0x4e, 0xa5, 0x17, 0xa5, |
||||
0xff, 0xa4, 0x1c, 0xa5, 0x45, 0xa5, 0x8a, 0xa5, 0xbf, 0xa5, 0xdb, 0xa5, |
||||
0x41, 0xa6, 0xfb, 0xa6, 0xc6, 0xa7, 0x86, 0xa8, 0x29, 0xa9, 0x97, 0xa9, |
||||
0x27, 0xaa, 0xd7, 0xaa, 0x6d, 0xab, 0xf4, 0xab, 0x34, 0xac, 0x69, 0xac, |
||||
0xc6, 0xac, 0x37, 0xad, 0xaa, 0xad, 0x34, 0xae, 0xd3, 0xae, 0x81, 0xaf, |
||||
0x16, 0xb0, 0x72, 0xb0, 0xc8, 0xb0, 0x36, 0xb1, 0x91, 0xb1, 0xe0, 0xb1, |
||||
0x3b, 0xb2, 0x8e, 0xb2, 0xe0, 0xb2, 0x2a, 0xb3, 0xab, 0xb3, 0x3a, 0xb4, |
||||
0xf1, 0xb4, 0xc0, 0xb5, 0xae, 0xb6, 0x91, 0xb7, 0x82, 0xb8, 0x98, 0xb9, |
||||
0x8f, 0xba, 0x88, 0xbb, 0x65, 0xbc, 0x20, 0xbd, 0xcb, 0xbd, 0xaf, 0xbe, |
||||
0x94, 0xbf, 0x84, 0xc0, 0x85, 0xc1, 0x7b, 0xc2, 0x67, 0xc3, 0x66, 0xc4, |
||||
0x7f, 0xc5, 0x89, 0xc6, 0x6b, 0xc7, 0x38, 0xc8, 0x29, 0xc9, 0x4a, 0xca, |
||||
0x82, 0xcb, 0xc1, 0xcc, 0x12, 0xce, 0x5e, 0xcf, 0xb0, 0xd0, 0x25, 0xd2, |
||||
0x66, 0xd3, 0xde, 0xd4, 0x6c, 0xd6, 0x28, 0xd8, 0xd7, 0xd9, 0x80, 0xdb, |
||||
0xf7, 0xdc, 0x6f, 0xde, 0xd0, 0xdf, 0x22, 0xe1, 0x7a, 0xe2, 0xe5, 0xe3, |
||||
0x7a, 0xe5, 0xea, 0xe6, 0x51, 0xe8, 0xeb, 0xe9, 0x70, 0xeb, 0xb3, 0xec, |
||||
0x01, 0xee, 0x60, 0xef, 0xcb, 0xf0, 0x1d, 0xf2, 0x7b, 0xf3, 0xcf, 0xf4, |
||||
0x39, 0xf6, 0xc8, 0xf7, 0x82, 0xf9, 0x4a, 0xfb, 0xf2, 0xfc, 0x8c, 0xfe, |
||||
0x01, 0x00, 0x68, 0x01, 0x15, 0x03, 0xe6, 0x04, 0xbc, 0x06, 0x42, 0x08, |
||||
0xbb, 0x09, 0x2b, 0x0b, 0xc7, 0x0c, 0x35, 0x0e, 0x94, 0x0f, 0xf2, 0x10, |
||||
0x59, 0x12, 0xbc, 0x13, 0x34, 0x15, 0xac, 0x16, 0x1c, 0x18, 0x79, 0x19, |
||||
0xdc, 0x1a, 0x6d, 0x1c, 0x21, 0x1e, 0xca, 0x1f, 0x70, 0x21, 0x02, 0x23, |
||||
0x6c, 0x24, 0x9e, 0x25, 0x45, 0x27, 0x02, 0x29, 0x95, 0x2a, 0xff, 0x2b, |
||||
0x72, 0x2d, 0xe8, 0x2e, 0x48, 0x30, 0x7c, 0x31, 0xd2, 0x32, 0x3d, 0x34, |
||||
0xac, 0x35, 0x26, 0x37, 0xbc, 0x38, 0x4c, 0x3a, 0x90, 0x3b, 0xef, 0x3c, |
||||
0x61, 0x3e, 0xe8, 0x3f, 0x59, 0x41, 0xab, 0x42, 0xf7, 0x43, 0x2d, 0x45, |
||||
0x6c, 0x46, 0x78, 0x47, 0xb4, 0x48, 0x2e, 0x4a, 0x8e, 0x4b, 0xd7, 0x4c, |
||||
0xf4, 0x4d, 0xee, 0x4e, 0xcb, 0x4f, 0xc3, 0x50, 0xc2, 0x51, 0xac, 0x52, |
||||
0x61, 0x53, 0xf3, 0x53, 0xac, 0x54, 0x5f, 0x55, 0xf4, 0x55, 0x7f, 0x56, |
||||
0x04, 0x57, 0x9c, 0x57, 0x1f, 0x58, 0x7c, 0x58, 0xbc, 0x58, 0x0b, 0x59, |
||||
0x71, 0x59, 0xc1, 0x59, 0x0b, 0x5a, 0x3e, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, |
||||
0xa9, 0x5a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4c, 0x5a, 0x39, 0x5a, 0x32, 0x5a, |
||||
0x40, 0x5a, 0x33, 0x5a, 0x44, 0x5a, 0x58, 0x5a, 0x79, 0x5a, 0x7a, 0x5a, |
||||
0x69, 0x5a, 0x49, 0x5a, 0x54, 0x5a, 0x78, 0x5a, 0x72, 0x5a, 0x5f, 0x5a, |
||||
0x31, 0x5a, 0x11, 0x5a, 0xf9, 0x59, 0xea, 0x59, 0xd1, 0x59, 0xa1, 0x59, |
||||
0x48, 0x59, 0xf0, 0x58, 0xa2, 0x58, 0x6e, 0x58, 0x60, 0x58, 0x46, 0x58, |
||||
0x3f, 0x58, 0x47, 0x58, 0x40, 0x58, 0x08, 0x58, 0x9c, 0x57, 0x11, 0x57, |
||||
0x83, 0x56, 0xd7, 0x55, 0x42, 0x55, 0xab, 0x54, 0x06, 0x54, 0x63, 0x53, |
||||
0xa6, 0x52, 0xf0, 0x51, 0x55, 0x51, 0xbc, 0x50, 0x1e, 0x50, 0x8e, 0x4f, |
||||
0xf3, 0x4e, 0x34, 0x4e, 0x6b, 0x4d, 0xc9, 0x4c, 0x30, 0x4c, 0x7d, 0x4b, |
||||
0xd8, 0x4a, 0x49, 0x4a, 0xad, 0x49, 0x11, 0x49, 0x6c, 0x48, 0xa4, 0x47, |
||||
0xec, 0x46, 0x6c, 0x46, 0xde, 0x45, 0x5d, 0x45, 0xbc, 0x44, 0xf1, 0x43, |
||||
0x34, 0x43, 0x8c, 0x42, 0xf8, 0x41, 0x47, 0x41, 0x6a, 0x40, 0x72, 0x3f, |
||||
0x8b, 0x3e, 0xb3, 0x3d, 0xf2, 0x3c, 0x2f, 0x3c, 0x5c, 0x3b, 0x96, 0x3a, |
||||
0xbc, 0x39, 0xb2, 0x38, 0x91, 0x37, 0x8c, 0x36, 0x75, 0x35, 0x63, 0x34, |
||||
0x5e, 0x33, 0x63, 0x32, 0x4b, 0x31, 0x3c, 0x30, 0x1e, 0x2f, 0x07, 0x2e, |
||||
0xd0, 0x2c, 0xb2, 0x2b, 0x84, 0x2a, 0x4d, 0x29, 0xfc, 0x27, 0xa5, 0x26, |
||||
0x2f, 0x25, 0x95, 0x23, 0x1f, 0x22, 0xad, 0x20, 0x3a, 0x1f, 0x9e, 0x1d, |
||||
0x10, 0x1c, 0x6e, 0x1a, 0xe3, 0x18, 0x56, 0x17, 0xdb, 0x15, 0x58, 0x14, |
||||
0xba, 0x12, 0x2a, 0x11, 0x8b, 0x0f, 0xf4, 0x0d, 0x5b, 0x0c, 0xd3, 0x0a, |
||||
0x5f, 0x09, 0xe5, 0x07, 0x4a, 0x06, 0xc0, 0x04, 0x3e, 0x03, 0xb6, 0x01, |
||||
0x37, 0x00, 0xca, 0xfe, 0x74, 0xfd, 0x00, 0xfc, 0xa5, 0xfa, 0x4a, 0xf9, |
||||
0xd1, 0xf7, 0x7e, 0xf6, 0x1c, 0xf5, 0x9d, 0xf3, 0x4f, 0xf2, 0x0e, 0xf1, |
||||
0xc0, 0xef, 0x3a, 0xee, 0xd8, 0xec, 0x69, 0xeb, 0x0c, 0xea, 0xad, 0xe8, |
||||
0x56, 0xe7, 0xf8, 0xe5, 0xbe, 0xe4, 0x98, 0xe3, 0x61, 0xe2, 0x03, 0xe1, |
||||
0x99, 0xdf, 0x4d, 0xde, 0x0e, 0xdd, 0xde, 0xdb, 0xad, 0xda, 0x84, 0xd9, |
||||
0x62, 0xd8, 0x32, 0xd7, 0x01, 0xd6, 0xb7, 0xd4, 0x87, 0xd3, 0x97, 0xd2, |
||||
0x89, 0xd1, 0x89, 0xd0, 0x6e, 0xcf, 0x65, 0xce, 0x5d, 0xcd, 0x44, 0xcc, |
||||
0x13, 0xcb, 0xf2, 0xc9, 0xd3, 0xc8, 0xad, 0xc7, 0x9b, 0xc6, 0x94, 0xc5, |
||||
0x8e, 0xc4, 0x7b, 0xc3, 0x92, 0xc2, 0xad, 0xc1, 0xb2, 0xc0, 0xb9, 0xbf, |
||||
0xb3, 0xbe, 0xc0, 0xbd, 0xd5, 0xbc, 0xf2, 0xbb, 0xe1, 0xba, 0xc7, 0xb9, |
||||
0xc7, 0xb8, 0xe8, 0xb7, 0x09, 0xb7, 0x2c, 0xb6, 0x66, 0xb5, 0xb1, 0xb4, |
||||
0xf6, 0xb3, 0x32, 0xb3, 0x53, 0xb2, 0x92, 0xb1, 0xdb, 0xb0, 0x0d, 0xb0, |
||||
0x46, 0xaf, 0x62, 0xae, 0x98, 0xad, 0xd1, 0xac, 0x3f, 0xac, 0xb0, 0xab, |
||||
0x34, 0xab, 0xb1, 0xaa, 0x45, 0xaa, 0xda, 0xa9, 0x6a, 0xa9, 0xf1, 0xa8, |
||||
0x7d, 0xa8, 0x04, 0xa8, 0xbb, 0xa7, 0x80, 0xa7, 0x41, 0xa7, 0x02, 0xa7, |
||||
0xb6, 0xa6, 0x68, 0xa6, 0x3b, 0xa6, 0x1c, 0xa6, 0x0d, 0xa6, 0xfc, 0xa5, |
||||
0xd4, 0xa5, 0xa6, 0xa5, 0x81, 0xa5, 0x76, 0xa5, 0x61, 0xa5, 0x54, 0xa5, |
||||
0x48, 0xa5, 0x47, 0xa5, 0x4b, 0xa5, 0x49, 0xa5, 0x38, 0xa5, 0x4b, 0xa5, |
||||
0x6c, 0xa5, 0xa3, 0xa5, 0xda, 0xa5, 0xfe, 0xa5, 0x21, 0xa6, 0x4a, 0xa6, |
||||
0x8a, 0xa6, 0xb4, 0xa6, 0xe0, 0xa6, 0xf3, 0xa6, 0x1b, 0xa7, 0x17, 0xa7, |
||||
0x40, 0xa7, 0x8e, 0xa7, 0xcd, 0xa7, 0x06, 0xa8, 0x3e, 0xa8, 0x86, 0xa8, |
||||
0xbd, 0xa8, 0xde, 0xa8, 0xf6, 0xa8, 0x1c, 0xa9, 0x49, 0xa9, 0x5c, 0xa9, |
||||
0x79, 0xa9, 0x93, 0xa9, 0xab, 0xa9, 0xe6, 0xa9, 0x2c, 0xaa, 0x82, 0xaa, |
||||
0xbc, 0xaa, 0xec, 0xaa, 0x32, 0xab, 0x69, 0xab, 0xa7, 0xab, 0xde, 0xab, |
||||
0x19, 0xac, 0x53, 0xac, 0xbb, 0xac, 0x14, 0xad, 0x8a, 0xad, 0xeb, 0xad, |
||||
0x6c, 0xae, 0xe1, 0xae, 0x62, 0xaf, 0xd9, 0xaf, 0x58, 0xb0, 0xc0, 0xb0, |
||||
0x36, 0xb1, 0x99, 0xb1, 0x11, 0xb2, 0x71, 0xb2, 0xdc, 0xb2, 0x58, 0xb3, |
||||
0xbb, 0xb3, 0x37, 0xb4, 0xb6, 0xb4, 0x46, 0xb5, 0xca, 0xb5, 0x50, 0xb6, |
||||
0xd9, 0xb6, 0x6c, 0xb7, 0x03, 0xb8, 0x7e, 0xb8, 0xf0, 0xb8, 0x64, 0xb9, |
||||
0xcf, 0xb9, 0x47, 0xba, 0xd3, 0xba, 0x60, 0xbb, 0xe8, 0xbb, 0x70, 0xbc, |
||||
0xf3, 0xbc, 0x82, 0xbd, 0x05, 0xbe, 0xa1, 0xbe, 0x2a, 0xbf, 0xae, 0xbf, |
||||
0x25, 0xc0, 0xac, 0xc0, 0x52, 0xc1, 0xde, 0xc1, 0x75, 0xc2, 0x11, 0xc3, |
||||
0xb5, 0xc3, 0x42, 0xc4, 0xc5, 0xc4, 0x6d, 0xc5, 0x0b, 0xc6, 0xb2, 0xc6, |
||||
0x4b, 0xc7, 0xf6, 0xc7, 0x9b, 0xc8, 0x4f, 0xc9, 0x17, 0xca, 0xf3, 0xca, |
||||
0xc6, 0xcb, 0x9a, 0xcc, 0x7b, 0xcd, 0x54, 0xce, 0x32, 0xcf, 0x09, 0xd0, |
||||
0xd7, 0xd0, 0xc9, 0xd1, 0xc1, 0xd2, 0xb8, 0xd3, 0xb6, 0xd4, 0xae, 0xd5, |
||||
0xbc, 0xd6, 0xca, 0xd7, 0xd2, 0xd8, 0xca, 0xd9, 0xbd, 0xda, 0xc8, 0xdb, |
||||
0xd8, 0xdc, 0xf9, 0xdd, 0x08, 0xdf, 0x1e, 0xe0, 0x39, 0xe1, 0x4e, 0xe2, |
||||
0x60, 0xe3, 0x7a, 0xe4, 0x96, 0xe5, 0xc1, 0xe6, 0xde, 0xe7, 0x0e, 0xe9, |
||||
0x2a, 0xea, 0x42, 0xeb, 0x7a, 0xec, 0x9f, 0xed, 0xbb, 0xee, 0xd6, 0xef, |
||||
0xef, 0xf0, 0x0e, 0xf2, 0x30, 0xf3, 0x55, 0xf4, 0x68, 0xf5, 0x7e, 0xf6, |
||||
0xa4, 0xf7, 0xc0, 0xf8, 0xea, 0xf9, 0x10, 0xfb, 0x41, 0xfc, 0x7d, 0xfd, |
||||
0xad, 0xfe, 0xe3, 0xff, 0x10, 0x01, 0x27, 0x02, 0x58, 0x03, 0x74, 0x04, |
||||
0xa4, 0x05, 0xd5, 0x06, 0x0b, 0x08, 0x36, 0x09, 0x5c, 0x0a, 0x76, 0x0b, |
||||
0x9a, 0x0c, 0xc1, 0x0d, 0xd8, 0x0e, 0xf5, 0x0f, 0x15, 0x11, 0x3f, 0x12, |
||||
0x70, 0x13, 0x8e, 0x14, 0xcc, 0x15, 0xf2, 0x16, 0x31, 0x18, 0x4b, 0x19, |
||||
0x82, 0x1a, 0xa1, 0x1b, 0xbc, 0x1c, 0xde, 0x1d, 0xe9, 0x1e, 0x13, 0x20, |
||||
0x33, 0x21, 0x6c, 0x22, 0x80, 0x23, 0xa7, 0x24, 0xbc, 0x25, 0xde, 0x26, |
||||
0xe7, 0x27, 0x07, 0x29, 0x28, 0x2a, 0x36, 0x2b, 0x4d, 0x2c, 0x71, 0x2d, |
||||
0x91, 0x2e, 0xbe, 0x2f, 0xd6, 0x30, 0xfb, 0x31, 0x20, 0x33, 0x46, 0x34, |
||||
0x59, 0x35, 0x7a, 0x36, 0xa1, 0x37, 0xc2, 0x38, 0xdf, 0x39, 0x01, 0x3b, |
||||
0x0f, 0x3c, 0x27, 0x3d, 0x1f, 0x3e, 0x2e, 0x3f, 0x43, 0x40, 0x5b, 0x41, |
||||
0x73, 0x42, 0x8e, 0x43, 0xaf, 0x44, 0xbc, 0x45, 0xcc, 0x46, 0xd8, 0x47, |
||||
0xec, 0x48, 0xe1, 0x49, 0xd1, 0x4a, 0xc4, 0x4b, 0xb6, 0x4c, 0xa9, 0x4d, |
||||
0x9d, 0x4e, 0x88, 0x4f, 0x75, 0x50, 0x4c, 0x51, 0x3b, 0x52, 0x05, 0x53, |
||||
0xd9, 0x53, 0xa1, 0x54, 0x6f, 0x55, 0x33, 0x56, 0xe5, 0x56, 0x7d, 0x57, |
||||
0x15, 0x58, 0xb3, 0x58, 0x4e, 0x59, 0xdb, 0x59, 0x55, 0x5a, 0xc8, 0x5a, |
||||
0x36, 0x5b, 0xa9, 0x5b, 0x09, 0x5c, 0x5a, 0x5c, 0xab, 0x5c, 0xf1, 0x5c, |
||||
0x34, 0x5d, 0x6a, 0x5d, 0x9e, 0x5d, 0xc1, 0x5d, 0xea, 0x5d, 0x0b, 0x5e, |
||||
0x28, 0x5e, 0x3d, 0x5e, 0x41, 0x5e, 0x51, 0x5e, 0x5f, 0x5e, 0x69, 0x5e, |
||||
0x79, 0x5e, 0x6a, 0x5e, 0x78, 0x5e, 0x76, 0x5e, 0x7f, 0x5e, 0x72, 0x5e, |
||||
0x70, 0x5e, 0x61, 0x5e, 0x61, 0x5e, 0x42, 0x5e, 0x36, 0x5e, 0x2f, 0x5e, |
||||
0x2c, 0x5e, 0x1a, 0x5e, 0xec, 0x5d, 0xbf, 0x5d, 0x94, 0x5d, 0x71, 0x5d, |
||||
0x4c, 0x5d, 0x24, 0x5d, 0xfa, 0x5c, 0xc3, 0x5c, 0x8c, 0x5c, 0x59, 0x5c, |
||||
0x3e, 0x5c, 0x0c, 0x5c, 0xd3, 0x5b, 0xb1, 0x5b, 0x78, 0x5b, 0x45, 0x5b, |
||||
0x14, 0x5b, 0xed, 0x5a, 0xc0, 0x5a, 0x89, 0x5a, 0x4f, 0x5a, 0x16, 0x5a, |
||||
0xe5, 0x59, 0xb5, 0x59, 0x84, 0x59, 0x4e, 0x59, 0x0d, 0x59, 0xcf, 0x58, |
||||
0xa6, 0x58, 0x79, 0x58, 0x3e, 0x58, 0xf8, 0x57, 0xc0, 0x57, 0x83, 0x57, |
||||
0x38, 0x57, 0x03, 0x57, 0xc1, 0x56, 0x65, 0x56, 0xe0, 0x55, 0x52, 0x55, |
||||
0xd0, 0x54, 0x4c, 0x54, 0xbe, 0x53, 0x32, 0x53, 0xa7, 0x52, 0x2a, 0x52, |
||||
0x95, 0x51, 0x09, 0x51, 0x76, 0x50, 0xe9, 0x4f, 0x69, 0x4f, 0xe2, 0x4e, |
||||
0x49, 0x4e, 0xc0, 0x4d, 0x38, 0x4d, 0xbd, 0x4c, 0x2d, 0x4c, 0x98, 0x4b, |
||||
0x07, 0x4b, 0x76, 0x4a, 0xdc, 0x49, 0x4a, 0x49, 0xb9, 0x48, 0x2d, 0x48, |
||||
0x9c, 0x47, 0x19, 0x47, 0x80, 0x46, 0xf9, 0x45, 0x66, 0x45, 0xd6, 0x44, |
||||
0x47, 0x44, 0xb5, 0x43, 0x14, 0x43, 0x74, 0x42, 0xd4, 0x41, 0x42, 0x41, |
||||
0xa4, 0x40, 0x18, 0x40, 0x85, 0x3f, 0xeb, 0x3e, 0x52, 0x3e, 0xb2, 0x3d, |
||||
0x0c, 0x3d, 0x7a, 0x3c, 0xdb, 0x3b, 0x3a, 0x3b, 0x87, 0x3a, 0xe0, 0x39, |
||||
0x29, 0x39, 0x88, 0x38, 0xd1, 0x37, 0x16, 0x37, 0x4d, 0x36, 0x9e, 0x35, |
||||
0xdc, 0x34, 0x19, 0x34, 0x4a, 0x33, 0x83, 0x32, 0xb7, 0x31, 0xec, 0x30, |
||||
0x1c, 0x30, 0x47, 0x2f, 0x71, 0x2e, 0x88, 0x2d, 0xa6, 0x2c, 0xbb, 0x2b, |
||||
0xd0, 0x2a, 0xd8, 0x29, 0xdb, 0x28, 0xe3, 0x27, 0xf5, 0x26, 0xf1, 0x25, |
||||
0xf8, 0x24, 0xdc, 0x23, 0xdb, 0x22, 0xca, 0x21, 0xa7, 0x20, 0x85, 0x1f, |
||||
0x5a, 0x1e, 0x30, 0x1d, 0x0a, 0x1c, 0xd5, 0x1a, 0xa6, 0x19, 0x6d, 0x18, |
||||
0x3d, 0x17, 0xff, 0x15, 0xbf, 0x14, 0x81, 0x13, 0x57, 0x12, 0x15, 0x11, |
||||
0xe0, 0x0f, 0xa2, 0x0e, 0x65, 0x0d, 0x27, 0x0c, 0xf1, 0x0a, 0xb2, 0x09, |
||||
0x77, 0x08, 0x4b, 0x07, 0x0a, 0x06, 0xc9, 0x04, 0x97, 0x03, 0x65, 0x02, |
||||
0x3b, 0x01, 0x03, 0x00, 0xd2, 0xfe, 0x95, 0xfd, 0x6f, 0xfc, 0x50, 0xfb, |
||||
0x19, 0xfa, 0xf0, 0xf8, 0xb8, 0xf7, 0x97, 0xf6, 0x65, 0xf5, 0x48, 0xf4, |
||||
0x24, 0xf3, 0xfe, 0xf1, 0xec, 0xf0, 0xd2, 0xef, 0xa9, 0xee, 0x95, 0xed, |
||||
0x76, 0xec, 0x64, 0xeb, 0x61, 0xea, 0x43, 0xe9, 0x3a, 0xe8, 0x21, 0xe7, |
||||
0x14, 0xe6, 0xff, 0xe4, 0x06, 0xe4, 0x04, 0xe3, 0x04, 0xe2, 0x01, 0xe1, |
||||
0x02, 0xe0, 0x04, 0xdf, 0x16, 0xde, 0x1f, 0xdd, 0x29, 0xdc, 0x2d, 0xdb, |
||||
0x3d, 0xda, 0x45, 0xd9, 0x5a, 0xd8, 0x6f, 0xd7, 0x74, 0xd6, 0x8a, 0xd5, |
||||
0x91, 0xd4, 0xa5, 0xd3, 0xbb, 0xd2, 0xdb, 0xd1, 0x01, 0xd1, 0x17, 0xd0, |
||||
0x42, 0xcf, 0x5e, 0xce, 0x94, 0xcd, 0xb1, 0xcc, 0xe8, 0xcb, 0x04, 0xcb, |
||||
0x29, 0xca, 0x4e, 0xc9, 0x78, 0xc8, 0x99, 0xc7, 0xc4, 0xc6, 0xff, 0xc5, |
||||
0x3d, 0xc5, 0x76, 0xc4, 0xa6, 0xc3, 0xe4, 0xc2, 0x17, 0xc2, 0x4e, 0xc1, |
||||
0x8a, 0xc0, 0xc5, 0xbf, 0x0b, 0xbf, 0x42, 0xbe, 0x8e, 0xbd, 0xd8, 0xbc, |
||||
0x20, 0xbc, 0x60, 0xbb, 0xbb, 0xba, 0x08, 0xba, 0x5a, 0xb9, 0xba, 0xb8, |
||||
0x08, 0xb8, 0x64, 0xb7, 0xb1, 0xb6, 0x0c, 0xb6, 0x5d, 0xb5, 0xbf, 0xb4, |
||||
0x10, 0xb4, 0x7b, 0xb3, 0xd0, 0xb2, 0x3d, 0xb2, 0xa1, 0xb1, 0x0f, 0xb1, |
||||
0x84, 0xb0, 0xf2, 0xaf, 0x63, 0xaf, 0xd3, 0xae, 0x50, 0xae, 0xbd, 0xad, |
||||
0x49, 0xad, 0xc1, 0xac, 0x4d, 0xac, 0xc6, 0xab, 0x56, 0xab, 0xe4, 0xaa, |
||||
0x83, 0xaa, 0x0d, 0xaa, 0xac, 0xa9, 0x49, 0xa9, 0xf3, 0xa8, 0x9e, 0xa8, |
||||
0x4e, 0xa8, 0x07, 0xa8, 0xc5, 0xa7, 0x8d, 0xa7, 0x56, 0xa7, 0x1d, 0xa7, |
||||
0xf6, 0xa6, 0xc7, 0xa6, 0xad, 0xa6, 0x8c, 0xa6, 0x74, 0xa6, 0x58, 0xa6, |
||||
0x47, 0xa6, 0x2d, 0xa6, 0x24, 0xa6, 0x23, 0xa6, 0x21, 0xa6, 0x19, 0xa6, |
||||
0x20, 0xa6, 0x1f, 0xa6, 0x28, 0xa6, 0x3c, 0xa6, 0x4e, 0xa6, 0x59, 0xa6, |
||||
0x6e, 0xa6, 0x84, 0xa6, 0x9a, 0xa6, 0xb7, 0xa6, 0xd4, 0xa6, 0xef, 0xa6, |
||||
0x0a, 0xa7, 0x2f, 0xa7, 0x53, 0xa7, 0x77, 0xa7, 0x9c, 0xa7, 0xbc, 0xa7, |
||||
0xe5, 0xa7, 0x10, 0xa8, 0x35, 0xa8, 0x6d, 0xa8, 0x9b, 0xa8, 0xcb, 0xa8, |
||||
0xf5, 0xa8, 0x23, 0xa9, 0x5a, 0xa9, 0x80, 0xa9, 0xb7, 0xa9, 0xee, 0xa9, |
||||
0x1c, 0xaa, 0x46, 0xaa, 0x78, 0xaa, 0xb2, 0xaa, 0xeb, 0xaa, 0x1a, 0xab, |
||||
0x57, 0xab, 0x84, 0xab, 0xba, 0xab, 0xef, 0xab, 0x22, 0xac, 0x55, 0xac, |
||||
0x88, 0xac, 0xc1, 0xac, 0xf5, 0xac, 0x2a, 0xad, 0x67, 0xad, 0x9f, 0xad, |
||||
0xe0, 0xad, 0x14, 0xae, 0x4c, 0xae, 0x82, 0xae, 0xb8, 0xae, 0xf8, 0xae, |
||||
0x2c, 0xaf, 0x6a, 0xaf, 0x9d, 0xaf, 0xd4, 0xaf, 0x05, 0xb0, 0x38, 0xb0, |
||||
0x77, 0xb0, 0xb2, 0xb0, 0xf8, 0xb0, 0x3c, 0xb1, 0x97, 0xb1, 0x05, 0xb2, |
||||
0x6f, 0xb2, 0xdf, 0xb2, 0x48, 0xb3, 0xb2, 0xb3, 0x16, 0xb4, 0x7b, 0xb4, |
||||
0xe5, 0xb4, 0x54, 0xb5, 0xc3, 0xb5, 0x26, 0xb6, 0x97, 0xb6, 0x03, 0xb7, |
||||
0x68, 0xb7, 0xce, 0xb7, 0x44, 0xb8, 0xae, 0xb8, 0x20, 0xb9, 0x87, 0xb9, |
||||
0xf1, 0xb9, 0x5d, 0xba, 0xc6, 0xba, 0x24, 0xbb, 0xa1, 0xbb, 0x05, 0xbc, |
||||
0x79, 0xbc, 0xdc, 0xbc, 0x4b, 0xbd, 0xba, 0xbd, 0x24, 0xbe, 0x9b, 0xbe, |
||||
0x07, 0xbf, 0x72, 0xbf, 0xe5, 0xbf, 0x46, 0xc0, 0xc3, 0xc0, 0x1f, 0xc1, |
||||
0x91, 0xc1, 0x01, 0xc2, 0x79, 0xc2, 0xf1, 0xc2, 0x66, 0xc3, 0xe5, 0xc3, |
||||
0x55, 0xc4, 0xc8, 0xc4, 0x3e, 0xc5, 0xb3, 0xc5, 0x2d, 0xc6, 0xa7, 0xc6, |
||||
0x27, 0xc7, 0x97, 0xc7, 0x1f, 0xc8, 0xa0, 0xc8, 0x29, 0xc9, 0xad, 0xc9, |
||||
0x36, 0xca, 0xad, 0xca, 0x3d, 0xcb, 0xc0, 0xcb, 0x47, 0xcc, 0xe9, 0xcc, |
||||
0x6f, 0xcd, 0x06, 0xce, 0x84, 0xce, 0x1a, 0xcf, 0xbb, 0xcf, 0x55, 0xd0, |
||||
0xf6, 0xd0, 0x8b, 0xd1, 0x30, 0xd2, 0xd2, 0xd2, 0x79, 0xd3, 0x1c, 0xd4, |
||||
0xcf, 0xd4, 0x83, 0xd5, 0x36, 0xd6, 0xe1, 0xd6, 0x96, 0xd7, 0x5f, 0xd8, |
||||
0x1c, 0xd9, 0xe2, 0xd9, 0xa8, 0xda, 0x6c, 0xdb, 0x43, 0xdc, 0x04, 0xdd, |
||||
0xd8, 0xdd, 0xac, 0xde, 0x8a, 0xdf, 0x5b, 0xe0, 0x39, 0xe1, 0x0b, 0xe2, |
||||
0xf5, 0xe2, 0xde, 0xe3, 0xbc, 0xe4, 0x9e, 0xe5, 0x83, 0xe6, 0x62, 0xe7, |
||||
0x51, 0xe8, 0x34, 0xe9, 0x1e, 0xea, 0x12, 0xeb, 0xf7, 0xeb, 0xe5, 0xec, |
||||
0xc5, 0xed, 0xc2, 0xee, 0xb1, 0xef, 0xa6, 0xf0, 0x90, 0xf1, 0x7e, 0xf2, |
||||
0x6f, 0xf3, 0x56, 0xf4, 0x48, 0xf5, 0x35, 0xf6, 0x29, 0xf7, 0x17, 0xf8, |
||||
0x0a, 0xf9, 0x00, 0xfa, 0xe7, 0xfa, 0xde, 0xfb, 0xc9, 0xfc, 0xc1, 0xfd, |
||||
0xac, 0xfe, 0xae, 0xff, 0xa2, 0x00, 0x8d, 0x01, 0x70, 0x02, 0x62, 0x03, |
||||
0x4e, 0x04, 0x3a, 0x05, 0x26, 0x06, 0x16, 0x07, 0xff, 0x07, 0xf3, 0x08, |
||||
0xda, 0x09, 0xbe, 0x0a, 0xb9, 0x0b, 0xa1, 0x0c, 0x9b, 0x0d, 0x7d, 0x0e, |
||||
0x66, 0x0f, 0x54, 0x10, 0x36, 0x11, 0x20, 0x12, 0x11, 0x13, 0xf3, 0x13, |
||||
0xea, 0x14, 0xd1, 0x15, 0xb6, 0x16, 0x9b, 0x17, 0x83, 0x18, 0x7f, 0x19, |
||||
0x58, 0x1a, 0x53, 0x1b, 0x37, 0x1c, 0x22, 0x1d, 0x0a, 0x1e, 0xf3, 0x1e, |
||||
0xda, 0x1f, 0xca, 0x20, 0xb1, 0x21, 0x96, 0x22, 0x70, 0x23, 0x55, 0x24, |
||||
0x39, 0x25, 0x39, 0x26, 0x1a, 0x27, 0x07, 0x28, 0xe1, 0x28, 0xc5, 0x29, |
||||
0xa7, 0x2a, 0x85, 0x2b, 0x70, 0x2c, 0x4e, 0x2d, 0x3e, 0x2e, 0x19, 0x2f, |
||||
0xf3, 0x2f, 0xdf, 0x30, 0xc0, 0x31, 0xaf, 0x32, 0x93, 0x33, 0x77, 0x34, |
||||
0x48, 0x35, 0x2a, 0x36, 0x0f, 0x37, 0xf8, 0x37, 0xd9, 0x38, 0xbe, 0x39, |
||||
0x8b, 0x3a, 0x74, 0x3b, 0x48, 0x3c, 0x2d, 0x3d, 0xfa, 0x3d, 0xe7, 0x3e, |
||||
0xb0, 0x3f, 0x98, 0x40, 0x67, 0x41, 0x3a, 0x42, 0x16, 0x43, 0xf4, 0x43, |
||||
0xd8, 0x44, 0xa4, 0x45, 0x7c, 0x46, 0x4c, 0x47, 0x2a, 0x48, 0x06, 0x49, |
||||
0xce, 0x49, 0xa5, 0x4a, 0x77, 0x4b, 0x4e, 0x4c, 0x13, 0x4d, 0xdf, 0x4d, |
||||
0xaa, 0x4e, 0x74, 0x4f, 0x3d, 0x50, 0xfc, 0x50, 0xbd, 0x51, 0x8c, 0x52, |
||||
0x3e, 0x53, 0xfe, 0x53, 0x99, 0x54, 0x57, 0x55, 0xfc, 0x55, 0xab, 0x56, |
||||
0x45, 0x57, 0xd6, 0x57, 0x87, 0x58, 0x2f, 0x59, 0xbf, 0x59, 0x48, 0x5a, |
||||
0xc7, 0x5a, 0x54, 0x5b, 0xc8, 0x5b, 0x45, 0x5c, 0xb4, 0x5c, 0x25, 0x5d, |
||||
0x7e, 0x5d, 0xda, 0x5d, 0x36, 0x5e, 0xa5, 0x5e, 0xe9, 0x5e, 0x37, 0x5f, |
||||
0x72, 0x5f, 0xab, 0x5f, 0xe5, 0x5f, 0x1d, 0x60, 0x4f, 0x60, 0x81, 0x60, |
||||
0x9c, 0x60, 0xc3, 0x60, 0xdc, 0x60, 0xf7, 0x60, 0x04, 0x61, 0x16, 0x61, |
||||
0x1b, 0x61, 0x21, 0x61, 0x20, 0x61, 0x0d, 0x61, 0x0b, 0x61, 0xf0, 0x60, |
||||
0xe5, 0x60, 0xc7, 0x60, 0xb3, 0x60, 0x98, 0x60, 0x7c, 0x60, 0x59, 0x60, |
||||
0x4c, 0x60, 0x24, 0x60, 0x0d, 0x60, 0xdf, 0x5f, 0xb7, 0x5f, 0x87, 0x5f, |
||||
0x6b, 0x5f, 0x44, 0x5f, 0x28, 0x5f, 0xf5, 0x5e, 0xbd, 0x5e, 0x8f, 0x5e, |
||||
0x5c, 0x5e, 0x2a, 0x5e, 0xfe, 0x5d, 0xcd, 0x5d, 0xa4, 0x5d, 0x75, 0x5d, |
||||
0x4d, 0x5d, 0x11, 0x5d, 0xdf, 0x5c, 0xa9, 0x5c, 0x78, 0x5c, 0x42, 0x5c, |
||||
0x13, 0x5c, 0xde, 0x5b, 0xaf, 0x5b, 0x75, 0x5b, 0x3e, 0x5b, 0xfd, 0x5a, |
||||
0xbc, 0x5a, 0x90, 0x5a, 0x54, 0x5a, 0x1f, 0x5a, 0xe5, 0x59, 0xc2, 0x59, |
||||
0x80, 0x59, 0x39, 0x59, 0x0a, 0x59, 0xd6, 0x58, 0x96, 0x58, 0x55, 0x58, |
||||
0x1e, 0x58, 0xf1, 0x57, 0xc8, 0x57, 0x7e, 0x57, 0x44, 0x57, 0x11, 0x57, |
||||
0xd4, 0x56, 0x93, 0x56, 0x4c, 0x56, 0x11, 0x56, 0xd7, 0x55, 0xae, 0x55, |
||||
0x72, 0x55, 0x3c, 0x55, 0x0c, 0x55, 0xd1, 0x54, 0x98, 0x54, 0x63, 0x54, |
||||
0x2b, 0x54, 0xf8, 0x53, 0xc6, 0x53, 0x81, 0x53, 0x4b, 0x53, 0x19, 0x53, |
||||
0xea, 0x52, 0xb2, 0x52, 0x7e, 0x52, 0x30, 0x52, 0xc5, 0x51, 0x46, 0x51, |
||||
0xca, 0x50, 0x55, 0x50, 0xd7, 0x4f, 0x5d, 0x4f, 0xe4, 0x4e, 0x79, 0x4e, |
||||
0xfb, 0x4d, 0x83, 0x4d, 0x02, 0x4d, 0x8a, 0x4c, 0x1f, 0x4c, 0x98, 0x4b, |
||||
0x20, 0x4b, 0xa7, 0x4a, 0x36, 0x4a, 0xc0, 0x49, 0x44, 0x49, 0xc3, 0x48, |
||||
0x44, 0x48, 0xd5, 0x47, 0x59, 0x47, 0xe6, 0x46, 0x63, 0x46, 0xf8, 0x45, |
||||
0x79, 0x45, 0xfa, 0x44, 0x80, 0x44, 0x01, 0x44, 0x7a, 0x43, 0x04, 0x43, |
||||
0x85, 0x42, 0x07, 0x42, 0x92, 0x41, 0x17, 0x41, 0x94, 0x40, 0x16, 0x40, |
||||
0x9f, 0x3f, 0x20, 0x3f, 0x9c, 0x3e, 0x29, 0x3e, 0x9c, 0x3d, 0x20, 0x3d, |
||||
0x88, 0x3c, 0x0c, 0x3c, 0x87, 0x3b, 0x07, 0x3b, 0x89, 0x3a, 0xfb, 0x39, |
||||
0x6f, 0x39, 0xe7, 0x38, 0x55, 0x38, 0xcf, 0x37, 0x43, 0x37, 0xb5, 0x36, |
||||
0x2a, 0x36, 0x9c, 0x35, 0x0a, 0x35, 0x83, 0x34, 0xe6, 0x33, 0x53, 0x33, |
||||
0xba, 0x32, 0x1d, 0x32, 0x78, 0x31, 0xcb, 0x30, 0x34, 0x30, 0x8e, 0x2f, |
||||
0xf6, 0x2e, 0x56, 0x2e, 0xab, 0x2d, 0xfe, 0x2c, 0x4c, 0x2c, 0x9f, 0x2b, |
||||
0xed, 0x2a, 0x36, 0x2a, 0x7b, 0x29, 0xb9, 0x28, 0x02, 0x28, 0x41, 0x27, |
||||
0x81, 0x26, 0xb9, 0x25, 0xfb, 0x24, 0x2d, 0x24, 0x66, 0x23, 0x98, 0x22, |
||||
0xc6, 0x21, 0xe9, 0x20, 0x0d, 0x20, 0x28, 0x1f, 0x4c, 0x1e, 0x64, 0x1d, |
||||
0x66, 0x1c, 0x8c, 0x1b, 0x96, 0x1a, 0xac, 0x19, 0xb2, 0x18, 0xbb, 0x17, |
||||
0xc2, 0x16, 0xc7, 0x15, 0xcb, 0x14, 0xcd, 0x13, 0xc4, 0x12, 0xca, 0x11, |
||||
0xb6, 0x10, 0xb8, 0x0f, 0xa3, 0x0e, 0x9e, 0x0d, 0x88, 0x0c, 0x86, 0x0b, |
||||
0x7b, 0x0a, 0x7c, 0x09, 0x6d, 0x08, 0x5b, 0x07, 0x4a, 0x06, 0x38, 0x05, |
||||
0x2f, 0x04, 0x1c, 0x03, 0x10, 0x02, 0xf6, 0x00, 0xe9, 0xff, 0xe5, 0xfe, |
||||
0xcf, 0xfd, 0xc8, 0xfc, 0xb1, 0xfb, 0xa7, 0xfa, 0x8d, 0xf9, 0x7b, 0xf8, |
||||
0x7e, 0xf7, 0x77, 0xf6, 0x68, 0xf5, 0x62, 0xf4, 0x49, 0xf3, 0x42, 0xf2, |
||||
0x41, 0xf1, 0x3e, 0xf0, 0x49, 0xef, 0x47, 0xee, 0x56, 0xed, 0x46, 0xec, |
||||
0x56, 0xeb, 0x5c, 0xea, 0x6c, 0xe9, 0x7d, 0xe8, 0x9c, 0xe7, 0x99, 0xe6, |
||||
0xbf, 0xe5, 0xc9, 0xe4, 0xe5, 0xe3, 0xfd, 0xe2, 0x17, 0xe2, 0x26, 0xe1, |
||||
0x44, 0xe0, 0x6d, 0xdf, 0x9f, 0xde, 0xc5, 0xdd, 0xec, 0xdc, 0x26, 0xdc, |
||||
0x58, 0xdb, 0x91, 0xda, 0xb7, 0xd9, 0xf5, 0xd8, 0x27, 0xd8, 0x63, 0xd7, |
||||
0x96, 0xd6, 0xd5, 0xd5, 0x1a, 0xd5, 0x52, 0xd4, 0x9d, 0xd3, 0xde, 0xd2, |
||||
0x27, 0xd2, 0x6c, 0xd1, 0xb3, 0xd0, 0xf6, 0xcf, 0x51, 0xcf, 0x98, 0xce, |
||||
0xe9, 0xcd, 0x2f, 0xcd, 0x88, 0xcc, 0xdc, 0xcb, 0x41, 0xcb, 0x9f, 0xca, |
||||
0x01, 0xca, 0x60, 0xc9, 0xc4, 0xc8, 0x13, 0xc8, 0x7e, 0xc7, 0xe2, 0xc6, |
||||
0x51, 0xc6, 0xb6, 0xc5, 0x1a, 0xc5, 0x8e, 0xc4, 0xf6, 0xc3, 0x74, 0xc3, |
||||
0xdf, 0xc2, 0x59, 0xc2, 0xd2, 0xc1, 0x47, 0xc1, 0xbe, 0xc0, 0x3b, 0xc0, |
||||
0xbe, 0xbf, 0x3e, 0xbf, 0xc4, 0xbe, 0x39, 0xbe, 0xbf, 0xbd, 0x3e, 0xbd, |
||||
0xd7, 0xbc, 0x5d, 0xbc, 0xec, 0xbb, 0x73, 0xbb, 0x07, 0xbb, 0x96, 0xba, |
||||
0x24, 0xba, 0xb5, 0xb9, 0x49, 0xb9, 0xdd, 0xb8, 0x76, 0xb8, 0x02, 0xb8, |
||||
0xa8, 0xb7, 0x3c, 0xb7, 0xee, 0xb6, 0x82, 0xb6, 0x2b, 0xb6, 0xc3, 0xb5, |
||||
0x6e, 0xb5, 0x14, 0xb5, 0xc4, 0xb4, 0x6b, 0xb4, 0x20, 0xb4, 0xd2, 0xb3, |
||||
0x78, 0xb3, 0x2c, 0xb3, 0xe6, 0xb2, 0x9e, 0xb2, 0x58, 0xb2, 0x1a, 0xb2, |
||||
0xea, 0xb1, 0xa6, 0xb1, 0x63, 0xb1, 0x2b, 0xb1, 0xf3, 0xb0, 0xb8, 0xb0, |
||||
0x7b, 0xb0, 0x4e, 0xb0, 0x20, 0xb0, 0xf9, 0xaf, 0xc6, 0xaf, 0xa2, 0xaf, |
||||
0x84, 0xaf, 0x5e, 0xaf, 0x44, 0xaf, 0x21, 0xaf, 0x06, 0xaf, 0xe9, 0xae, |
||||
0xe2, 0xae, 0xd0, 0xae, 0xc3, 0xae, 0xba, 0xae, 0xc1, 0xae, 0xaf, 0xae, |
||||
0xbc, 0xae, 0xb5, 0xae, 0xc0, 0xae, 0xc3, 0xae, 0xd7, 0xae, 0xdd, 0xae, |
||||
0xfb, 0xae, 0x0a, 0xaf, 0x16, 0xaf, 0x37, 0xaf, 0x4a, 0xaf, 0x70, 0xaf, |
||||
0x86, 0xaf, 0xa9, 0xaf, 0xc7, 0xaf, 0xec, 0xaf, 0x12, 0xb0, 0x42, 0xb0, |
||||
0x66, 0xb0, 0x91, 0xb0, 0xc0, 0xb0, 0xee, 0xb0, 0x1a, 0xb1, 0x4c, 0xb1, |
||||
0x77, 0xb1, 0xb3, 0xb1, 0xdd, 0xb1, 0x10, 0xb2, 0x47, 0xb2, 0x70, 0xb2, |
||||
0xb8, 0xb2, 0xef, 0xb2, 0x26, 0xb3, 0x64, 0xb3, 0x90, 0xb3, 0xd8, 0xb3, |
||||
0x07, 0xb4, 0x4b, 0xb4, 0x83, 0xb4, 0xc7, 0xb4, 0xf4, 0xb4, 0x35, 0xb5, |
||||
0x70, 0xb5, 0xbc, 0xb5, 0xf0, 0xb5, 0x39, 0xb6, 0x7d, 0xb6, 0xb7, 0xb6, |
||||
0xfa, 0xb6, 0x2e, 0xb7, 0x7d, 0xb7, 0xbb, 0xb7, 0x01, 0xb8, 0x39, 0xb8, |
||||
0x80, 0xb8, 0xbd, 0xb8, 0x05, 0xb9, 0x46, 0xb9, 0x94, 0xb9, 0xcd, 0xb9, |
||||
0x17, 0xba, 0x5b, 0xba, 0x9e, 0xba, 0xdf, 0xba, 0x27, 0xbb, 0x6a, 0xbb, |
||||
0xbc, 0xbb, 0xf6, 0xbb, 0x3a, 0xbc, 0x83, 0xbc, 0xc3, 0xbc, 0x16, 0xbd, |
||||
0x58, 0xbd, 0xa2, 0xbd, 0xe0, 0xbd, 0x24, 0xbe, 0x70, 0xbe, 0xa1, 0xbe, |
||||
0xfa, 0xbe, 0x37, 0xbf, 0x8d, 0xbf, 0xc9, 0xbf, 0x1d, 0xc0, 0x5d, 0xc0, |
||||
0xa6, 0xc0, 0xe6, 0xc0, 0x2f, 0xc1, 0x7a, 0xc1, 0xcb, 0xc1, 0x2f, 0xc2, |
||||
0x95, 0xc2, 0xfa, 0xc2, 0x55, 0xc3, 0xbb, 0xc3, 0x1e, 0xc4, 0x86, 0xc4, |
||||
0xec, 0xc4, 0x4b, 0xc5, 0xab, 0xc5, 0x04, 0xc6, 0x72, 0xc6, 0xc6, 0xc6, |
||||
0x3a, 0xc7, 0x8e, 0xc7, 0xfd, 0xc7, 0x5a, 0xc8, 0xc0, 0xc8, 0x17, 0xc9, |
||||
0x79, 0xc9, 0xd5, 0xc9, 0x43, 0xca, 0x98, 0xca, 0x05, 0xcb, 0x64, 0xcb, |
||||
0xc3, 0xcb, 0x1e, 0xcc, 0x81, 0xcc, 0xe3, 0xcc, 0x40, 0xcd, 0xa6, 0xcd, |
||||
0x0a, 0xce, 0x6a, 0xce, 0xc0, 0xce, 0x26, 0xcf, 0x81, 0xcf, 0xf0, 0xcf, |
||||
0x48, 0xd0, 0xad, 0xd0, 0x07, 0xd1, 0x71, 0xd1, 0xca, 0xd1, 0x2b, 0xd2, |
||||
0x8a, 0xd2, 0xed, 0xd2, 0x50, 0xd3, 0xa1, 0xd3, 0x0f, 0xd4, 0x6f, 0xd4, |
||||
0xd6, 0xd4, 0x30, 0xd5, 0x93, 0xd5, 0xf6, 0xd5, 0x55, 0xd6, 0xb5, 0xd6, |
||||
0x12, 0xd7, 0x7b, 0xd7, 0xde, 0xd7, 0x34, 0xd8, 0x93, 0xd8, 0xe9, 0xd8, |
||||
0x61, 0xd9, 0xbb, 0xd9, 0x2b, 0xda, 0x88, 0xda, 0xeb, 0xda, 0x4f, 0xdb, |
||||
0xb9, 0xdb, 0x21, 0xdc, 0x80, 0xdc, 0xf7, 0xdc, 0x53, 0xdd, 0xbb, 0xdd, |
||||
0x2b, 0xde, 0xa4, 0xde, 0x05, 0xdf, 0x74, 0xdf, 0xd8, 0xdf, 0x44, 0xe0, |
||||
0xb4, 0xe0, 0x26, 0xe1, 0x91, 0xe1, 0x01, 0xe2, 0x77, 0xe2, 0xeb, 0xe2, |
||||
0x5e, 0xe3, 0xc7, 0xe3, 0x44, 0xe4, 0xb2, 0xe4, 0x25, 0xe5, 0xa3, 0xe5, |
||||
0x15, 0xe6, 0x97, 0xe6, 0x0b, 0xe7, 0x8b, 0xe7, 0x10, 0xe8, 0x7d, 0xe8, |
||||
0x06, 0xe9, 0x74, 0xe9, 0xff, 0xe9, 0x82, 0xea, 0x01, 0xeb, 0x85, 0xeb, |
||||
0xfa, 0xeb, 0x91, 0xec, 0x07, 0xed, 0x8f, 0xed, 0x15, 0xee, 0x9a, 0xee, |
||||
0x26, 0xef, 0xa5, 0xef, 0x26, 0xf0, 0xb2, 0xf0, 0x3e, 0xf1, 0xca, 0xf1, |
||||
0x45, 0xf2, 0xcc, 0xf2, 0x51, 0xf3, 0xdc, 0xf3, 0x5c, 0xf4, 0xe8, 0xf4, |
||||
0x6e, 0xf5, 0xf9, 0xf5, 0x79, 0xf6, 0xf9, 0xf6, 0x7d, 0xf7, 0x08, 0xf8, |
||||
0x91, 0xf8, 0x18, 0xf9, 0x95, 0xf9, 0x18, 0xfa, 0xa5, 0xfa, 0x21, 0xfb, |
||||
0xa9, 0xfb, 0x2a, 0xfc, 0xa7, 0xfc, 0x23, 0xfd, 0xa3, 0xfd, 0x2b, 0xfe, |
||||
0x9c, 0xfe, 0x2b, 0xff, 0xa0, 0xff, 0x1c, 0x00, 0x9a, 0x00, 0x11, 0x01, |
||||
0x9a, 0x01, 0x14, 0x02, 0x8c, 0x02, 0x07, 0x03, 0x84, 0x03, 0xf7, 0x03, |
||||
0x75, 0x04, 0xf3, 0x04, 0x65, 0x05, 0xe8, 0x05, 0x54, 0x06, 0xd3, 0x06, |
||||
0x48, 0x07, 0xc2, 0x07, 0x38, 0x08, 0xad, 0x08, 0x28, 0x09, 0x99, 0x09, |
||||
0x11, 0x0a, 0x79, 0x0a, 0xf5, 0x0a, 0x5c, 0x0b, 0xd1, 0x0b, 0x3f, 0x0c, |
||||
0xb5, 0x0c, 0x2c, 0x0d, 0x9a, 0x0d, 0x0b, 0x0e, 0x74, 0x0e, 0xe6, 0x0e, |
||||
0x45, 0x0f, 0xbd, 0x0f, 0x2f, 0x10, 0x9a, 0x10, 0x05, 0x11, 0x6c, 0x11, |
||||
0xdb, 0x11, 0x40, 0x12, 0xaa, 0x12, 0x14, 0x13, 0x81, 0x13, 0xe9, 0x13, |
||||
0x4d, 0x14, 0xb9, 0x14, 0x18, 0x15, 0x88, 0x15, 0xe6, 0x15, 0x58, 0x16, |
||||
0xb9, 0x16, 0x1c, 0x17, 0x7e, 0x17, 0xe3, 0x17, 0x43, 0x18, 0xac, 0x18, |
||||
0x08, 0x19, 0x6d, 0x19, 0xce, 0x19, 0x34, 0x1a, 0x90, 0x1a, 0xf5, 0x1a, |
||||
0x53, 0x1b, 0xbb, 0x1b, 0x07, 0x1c, 0x6f, 0x1c, 0xc2, 0x1c, 0x28, 0x1d, |
||||
0x84, 0x1d, 0xe8, 0x1d, 0x35, 0x1e, 0xa2, 0x1e, 0xf8, 0x1e, 0x59, 0x1f, |
||||
0xb8, 0x1f, 0x0c, 0x20, 0x69, 0x20, 0xbe, 0x20, 0x19, 0x21, 0x66, 0x21, |
||||
0xc6, 0x21, 0x1f, 0x22, 0x70, 0x22, 0xbe, 0x22, 0x18, 0x23, 0x72, 0x23, |
||||
0xbf, 0x23, 0x0f, 0x24, 0x67, 0x24, 0xc0, 0x24, 0x08, 0x25, 0x51, 0x25, |
||||
0xa6, 0x25, 0xf4, 0x25, 0x42, 0x26, 0x93, 0x26, 0xd6, 0x26, 0x25, 0x27, |
||||
0x6c, 0x27, 0xb7, 0x27, 0x07, 0x28, 0x49, 0x28, 0x96, 0x28, 0xda, 0x28, |
||||
0x22, 0x29, 0x66, 0x29, 0xa4, 0x29, 0xe8, 0x29, 0x20, 0x2a, 0x62, 0x2a, |
||||
0xa9, 0x2a, 0xe5, 0x2a, 0x21, 0x2b, 0x5a, 0x2b, 0x97, 0x2b, 0xc1, 0x2b, |
||||
0xfe, 0x2b, 0x28, 0x2c, 0x57, 0x2c, 0x88, 0x2c, 0xae, 0x2c, 0xd3, 0x2c, |
||||
0xfa, 0x2c, 0x17, 0x2d, 0x33, 0x2d, 0x4b, 0x2d, 0x5d, 0x2d, 0x68, 0x2d, |
||||
0x81, 0x2d, 0x92, 0x2d, 0x9e, 0x2d, 0xa9, 0x2d, 0xbb, 0x2d, 0xc3, 0x2d, |
||||
0xcd, 0x2d, 0xd5, 0x2d, 0xcd, 0x2d, 0xdc, 0x2d, 0xe3, 0x2d, 0xe1, 0x2d, |
||||
0xdd, 0x2d, 0xd9, 0x2d, 0xd7, 0x2d, 0xcf, 0x2d, 0xe0, 0x2d, 0xd2, 0x2d, |
||||
0xd2, 0x2d, 0xcb, 0x2d, 0xb7, 0x2d, 0xb6, 0x2d, 0xa1, 0x2d, 0x9e, 0x2d, |
||||
0x8b, 0x2d, 0x84, 0x2d, 0x68, 0x2d, 0x6a, 0x2d, 0x4e, 0x2d, 0x45, 0x2d, |
||||
0x2f, 0x2d, 0x18, 0x2d, 0x15, 0x2d, 0xef, 0x2c, 0xe8, 0x2c, 0xc9, 0x2c, |
||||
0xc7, 0x2c, 0xaa, 0x2c, 0x9b, 0x2c, 0x7c, 0x2c, 0x64, 0x2c, 0x3c, 0x2c, |
||||
0x2e, 0x2c, 0x16, 0x2c, 0x05, 0x2c, 0xe1, 0x2b, 0xc8, 0x2b, 0xb5, 0x2b, |
||||
0x9a, 0x2b, 0x7c, 0x2b, 0x61, 0x2b, 0x3f, 0x2b, 0x21, 0x2b, 0x01, 0x2b, |
||||
0xee, 0x2a, 0xd0, 0x2a, 0xb3, 0x2a, 0x95, 0x2a, 0x6d, 0x2a, 0x50, 0x2a, |
||||
0x2b, 0x2a, 0x0b, 0x2a, 0xe9, 0x29, 0xd1, 0x29, 0xa8, 0x29, 0x97, 0x29, |
||||
0x6c, 0x29, 0x51, 0x29, 0x24, 0x29, 0x03, 0x29, 0xe6, 0x28, 0xbe, 0x28, |
||||
0xa1, 0x28, 0x80, 0x28, 0x64, 0x28, 0x38, 0x28, 0x12, 0x28, 0xf0, 0x27, |
||||
0xd3, 0x27, 0xac, 0x27, 0x94, 0x27, 0x67, 0x27, 0x4a, 0x27, 0x1c, 0x27, |
||||
0xf7, 0x26, 0xd1, 0x26, 0xb6, 0x26, 0x8d, 0x26, 0x6e, 0x26, 0x4b, 0x26, |
||||
0x25, 0x26, 0x02, 0x26, 0xd8, 0x25, 0xbe, 0x25, 0x93, 0x25, 0x7c, 0x25, |
||||
0x4a, 0x25, 0x27, 0x25, 0x07, 0x25, 0xdc, 0x24, 0xbb, 0x24, 0x9a, 0x24, |
||||
0x78, 0x24, 0x4c, 0x24, 0x26, 0x24, 0x00, 0x24, 0xd7, 0x23, 0xc0, 0x23, |
||||
0x94, 0x23, 0x71, 0x23, 0x45, 0x23, 0x1c, 0x23, 0x00, 0x23, 0xd4, 0x22, |
||||
0xb5, 0x22, 0x8e, 0x22, 0x67, 0x22, 0x39, 0x22, 0x00, 0x22, 0xbd, 0x21, |
||||
0x87, 0x21, 0x46, 0x21, 0x01, 0x21, 0xca, 0x20, 0x89, 0x20, 0x4a, 0x20, |
||||
0x17, 0x20, 0xd6, 0x1f, 0x9a, 0x1f, 0x5e, 0x1f, 0x20, 0x1f, 0xe0, 0x1e, |
||||
0xa3, 0x1e, 0x5f, 0x1e, 0x29, 0x1e, 0xf0, 0x1d, 0xb8, 0x1d, 0x78, 0x1d, |
||||
0x36, 0x1d, 0x04, 0x1d, 0xc6, 0x1c, 0x8b, 0x1c, 0x4d, 0x1c, 0x18, 0x1c, |
||||
0xd9, 0x1b, 0x97, 0x1b, 0x5c, 0x1b, 0x2b, 0x1b, 0xf4, 0x1a, 0xb1, 0x1a, |
||||
0x7c, 0x1a, 0x32, 0x1a, 0x02, 0x1a, 0xc6, 0x19, 0x8b, 0x19, 0x59, 0x19, |
||||
0x10, 0x19, 0xd7, 0x18, 0x9c, 0x18, 0x62, 0x18, 0x22, 0x18, 0xe8, 0x17, |
||||
0xb1, 0x17, 0x7c, 0x17, 0x34, 0x17, 0xf9, 0x16, 0xc0, 0x16, 0x8b, 0x16, |
||||
0x55, 0x16, 0x14, 0x16, 0xdd, 0x15, 0x9f, 0x15, 0x65, 0x15, 0x2b, 0x15, |
||||
0xea, 0x14, 0xb9, 0x14, 0x70, 0x14, 0x3d, 0x14, 0x05, 0x14, 0xc1, 0x13, |
||||
0x86, 0x13, 0x45, 0x13, 0x09, 0x13, 0xca, 0x12, 0x90, 0x12, 0x57, 0x12, |
||||
0x1a, 0x12, 0xe1, 0x11, 0x9b, 0x11, 0x61, 0x11, 0x1d, 0x11, 0xe1, 0x10, |
||||
0x9d, 0x10, 0x64, 0x10, 0x17, 0x10, 0xde, 0x0f, 0xa1, 0x0f, 0x60, 0x0f, |
||||
0x1b, 0x0f, 0xd8, 0x0e, 0x90, 0x0e, 0x5b, 0x0e, 0x0e, 0x0e, 0xd3, 0x0d, |
||||
0x86, 0x0d, 0x4d, 0x0d, 0xf5, 0x0c, 0xba, 0x0c, 0x68, 0x0c, 0x2a, 0x0c, |
||||
0xde, 0x0b, 0x94, 0x0b, 0x4e, 0x0b, 0x07, 0x0b, 0xbb, 0x0a, 0x6c, 0x0a, |
||||
0x25, 0x0a, 0xd4, 0x09, 0x89, 0x09, 0x39, 0x09, 0xe6, 0x08, 0xa3, 0x08, |
||||
0x4f, 0x08, 0x02, 0x08, 0xa7, 0x07, 0x5f, 0x07, 0x08, 0x07, 0xba, 0x06, |
||||
0x68, 0x06, 0x1f, 0x06, 0xc5, 0x05, 0x7a, 0x05, 0x1f, 0x05, 0xd7, 0x04, |
||||
0x85, 0x04, 0x31, 0x04, 0xde, 0x03, 0x89, 0x03, 0x3a, 0x03, 0xe9, 0x02, |
||||
0x96, 0x02, 0x47, 0x02, 0xf7, 0x01, 0xa4, 0x01, 0x5d, 0x01, 0x06, 0x01, |
||||
0xb9, 0x00, 0x00, 0x00 |
||||
}; |
||||
unsigned int kick_raw_len = 6352; |
@ -1,59 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
project(save_wav) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs_soundio) |
||||
if(teensy_audio_x86_stubs_soundio_FOUND) |
||||
include_directories(${teensy_audio_x86_stubs_soundio_INCLUDE_DIR}) |
||||
|
||||
include_directories(/usr/local/include) #soundio |
||||
include_directories(../../../src) |
||||
|
||||
add_custom_command(OUTPUT stereo_souljah_wav.c |
||||
COMMAND embedfile stereo_souljah_wav ${CMAKE_SOURCE_DIR}/test/resources/input/stereo_souljah.wav |
||||
) |
||||
|
||||
add_custom_command(OUTPUT mono_souljah_wav.c |
||||
COMMAND embedfile mono_souljah_wav ${CMAKE_SOURCE_DIR}/test/resources/input/mono_souljah.wav |
||||
) |
||||
|
||||
add_executable(save_wav mono_souljah_wav.c stereo_souljah_wav.c save_wav.cpp) |
||||
target_link_libraries(save_wav teensy_variable_playback) |
||||
|
||||
if(WIN32) |
||||
elseif(UNIX AND NOT APPLE) |
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") |
||||
SET(SOUNDIO_LIBS -L/usr/lib/x86_64-linux-gnu -lsoundio) |
||||
elseif(APPLE) |
||||
INCLUDE_DIRECTORIES(/System/Library/Frameworks) |
||||
FIND_LIBRARY(glfw3_LIBRARY glfw) |
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa) |
||||
FIND_LIBRARY(OpenGL_LIBRARY OpenGL) |
||||
FIND_LIBRARY(IOKit_LIBRARY IOKit) |
||||
FIND_LIBRARY(glew_LIBRARY glew) |
||||
FIND_LIBRARY(CoreVideo_LIBRARY CoreVideo) |
||||
MARK_AS_ADVANCED(COCOA_LIBRARY OpenGL_LIBRARY) |
||||
FIND_LIBRARY(FREETYPE_LIBRARIES FreeType) |
||||
SET(APPLE_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${OpenGL_LIBRARY} ${CoreVideo_LIBRARY}) |
||||
SET(APPLE_LIBS ${APPLE_LIBS} ${GLFW3_LIBRARY} ${ASSIMP_LIBRARY} ${FREETYPE_LIBRARIES} ${glfw3_LIBRARY} ${glew_LIBRARY}) |
||||
set(LIBS ${LIBS} ${APPLE_LIBS}) |
||||
target_link_libraries(save_wav |
||||
"-framework CoreServices" |
||||
"-framework CoreAudio" |
||||
"-framework Foundation" |
||||
"-framework AudioUnit") |
||||
SET(SOUNDIO_LIBS /usr/local/lib/libsoundio.a) |
||||
endif() |
||||
|
||||
target_link_libraries(save_wav ${LIBS} ${teensy_x86_stubs_LIBS} ${teensy_x86_sd_stubs_LIBS} ${teensy_audio_x86_stubs_LIBS} ${teensy_audio_x86_stubs_soundio_LIBS} ${teensy_st7735_linux_stubs_LIBS} ${teensy_st7735_linux_extras_opengl_LIBS} ${SOUNDIO_LIBS}) |
||||
#set(CMAKE_VERBOSE_MAKEFILE 1) |
||||
endif() |
@ -1,152 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include "../../../src/playarrayresmp.h" |
||||
#include "output_soundio.h" |
||||
#include <soundio/soundio.h> |
||||
#include <SD.h> |
||||
#include <iostream> |
||||
#include <execinfo.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
#include <string> |
||||
#include <cassert> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp rraw_a1; //xy=306,225
|
||||
AudioRecordQueue queue1; //xy=609,267
|
||||
AudioOutputSoundIO sio_out1; //xy=612,224
|
||||
AudioConnection patchCord1(rraw_a1, 0, sio_out1, 0); |
||||
AudioConnection patchCord2(rraw_a1, 0, sio_out1, 1); |
||||
AudioConnection patchCord3(rraw_a1, 0, queue1, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
extern unsigned int mono_souljah_wav_len; |
||||
extern unsigned char mono_souljah_wav[]; |
||||
|
||||
int16_t buffer[512] = {0}; |
||||
File frec; |
||||
|
||||
unsigned long lastSamplePlayed = 0; |
||||
void my_handler(sig_atomic_t i); |
||||
static char stack_body[64*1024]; |
||||
static stack_t sigseg_stack; |
||||
static struct sigaction sigseg_handler; |
||||
|
||||
void crash_handler(sig_atomic_t i); |
||||
|
||||
void setup() { |
||||
Serial.begin(9600);
|
||||
|
||||
rraw_a1.setPlaybackRate(1.0f); |
||||
rraw_a1.enableInterpolation(true); |
||||
//rraw_a1.play((int16_t*)kick_raw, kick_raw_len/2);
|
||||
Serial.println("setup done"); |
||||
|
||||
if (SD.exists("RECORD.RAW")) { |
||||
// The SD library writes new data to the end of the
|
||||
// file, so to start a new recording, the old file
|
||||
// must be deleted before new data is written.
|
||||
SD.remove("RECORD.RAW"); |
||||
} |
||||
frec = SD.open("RECORD.RAW", O_WRITE); |
||||
|
||||
AudioMemory(120); |
||||
|
||||
if (frec) { |
||||
queue1.begin(); |
||||
Serial.println("startRecording"); |
||||
} else { |
||||
Serial.println("recording failed..."); |
||||
} |
||||
} |
||||
|
||||
void loop() { |
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 1000) { |
||||
if (!rraw_a1.isPlaying()) { |
||||
rraw_a1.playWav((int16_t *)mono_souljah_wav, mono_souljah_wav_len/2); |
||||
lastSamplePlayed = currentMillis; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
|
||||
if (queue1.available() >= 1) {
|
||||
int16_t* incomming = queue1.readBuffer(); |
||||
if (incomming != NULL) { |
||||
memcpy(buffer, incomming, 256); |
||||
queue1.freeBuffer(); |
||||
frec.write((unsigned char *)buffer, 256); |
||||
frec.flush(); |
||||
}
|
||||
}
|
||||
delay(1); |
||||
} |
||||
|
||||
int main() { |
||||
signal (SIGINT,my_handler); |
||||
signal (SIGSEGV,crash_handler); |
||||
|
||||
sigseg_stack.ss_sp = stack_body; |
||||
sigseg_stack.ss_flags = SS_ONSTACK; |
||||
sigseg_stack.ss_size = sizeof(stack_body); |
||||
// assert(!sigaltstack(&sigseg_stack, nullptr));
|
||||
sigseg_handler.sa_flags = SA_ONSTACK; |
||||
sigseg_handler.sa_handler = &crash_handler; |
||||
// assert(!sigaction(SIGSEGV, &sigseg_handler, nullptr));
|
||||
|
||||
initialize_mock_arduino(); |
||||
SD.setSDCardFolderPath("."); |
||||
setup(); |
||||
while(!arduino_should_exit){ |
||||
loop(); |
||||
} |
||||
delay(1000); |
||||
frec.close(); |
||||
} |
||||
|
||||
void my_handler(sig_atomic_t i){ |
||||
if ( i== SIGINT) { |
||||
arduino_should_exit = true; |
||||
printf("Caught signal %d\n",i); |
||||
} else
|
||||
{ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
} |
||||
void crash_handler(sig_atomic_t i){ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
@ -1,51 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.10) |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
project(sd_play_all) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs_soundio) |
||||
if(teensy_audio_x86_stubs_soundio_FOUND) |
||||
include_directories(${teensy_audio_x86_stubs_soundio_INCLUDE_DIR}) |
||||
|
||||
include_directories(../../../src) |
||||
include_directories(/usr/local/include) #soundio |
||||
|
||||
add_executable(sd_play_all sd_play_all.cpp) |
||||
target_link_libraries(sd_play_all teensy_variable_playback) |
||||
|
||||
if(WIN32) |
||||
elseif(UNIX AND NOT APPLE) |
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall") |
||||
SET(SOUNDIO_LIBS -L/usr/lib/x86_64-linux-gnu -lsoundio) |
||||
elseif(APPLE) |
||||
INCLUDE_DIRECTORIES(/System/Library/Frameworks) |
||||
FIND_LIBRARY(glfw3_LIBRARY glfw) |
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa) |
||||
FIND_LIBRARY(OpenGL_LIBRARY OpenGL) |
||||
FIND_LIBRARY(IOKit_LIBRARY IOKit) |
||||
FIND_LIBRARY(glew_LIBRARY glew) |
||||
FIND_LIBRARY(CoreVideo_LIBRARY CoreVideo) |
||||
MARK_AS_ADVANCED(COCOA_LIBRARY OpenGL_LIBRARY) |
||||
FIND_LIBRARY(FREETYPE_LIBRARIES FreeType) |
||||
SET(APPLE_LIBS ${COCOA_LIBRARY} ${IOKit_LIBRARY} ${OpenGL_LIBRARY} ${CoreVideo_LIBRARY}) |
||||
SET(APPLE_LIBS ${APPLE_LIBS} ${GLFW3_LIBRARY} ${ASSIMP_LIBRARY} ${FREETYPE_LIBRARIES} ${glfw3_LIBRARY} ${glew_LIBRARY}) |
||||
set(LIBS ${LIBS} ${APPLE_LIBS}) |
||||
target_link_libraries(sd_play_all |
||||
"-framework CoreServices" |
||||
"-framework CoreAudio" |
||||
"-framework Foundation" |
||||
"-framework AudioUnit") |
||||
SET(SOUNDIO_LIBS /usr/local/lib/libsoundio.a) |
||||
endif() |
||||
|
||||
target_link_libraries(sd_play_all ${LIBS} ${teensy_x86_stubs_LIBS} ${teensy_x86_sd_stubs_LIBS} ${teensy_audio_x86_stubs_LIBS} ${teensy_audio_x86_stubs_soundio_LIBS} ${teensy_st7735_linux_stubs_LIBS} ${teensy_st7735_linux_extras_opengl_LIBS} ${SOUNDIO_LIBS}) |
||||
#set(CMAKE_VERBOSE_MAKEFILE 1) |
||||
endif() |
@ -1,784 +0,0 @@ |
||||
// Plays a RAW (16-bit signed) PCM audio file at slower or faster rate
|
||||
// this example plays a sample stored in an array
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include "playsdresmp.h" |
||||
#include "output_soundio.h" |
||||
#include <soundio/soundio.h> |
||||
#include <SD.h> |
||||
#include <iostream> |
||||
#include <execinfo.h> |
||||
#include <signal.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
#include <string> |
||||
#include <cassert> |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp playSd1; //xy=306,225
|
||||
AudioRecordQueue queue1; //xy=609,267
|
||||
AudioOutputSoundIO sio_out1; //xy=612,224
|
||||
AudioConnection patchCord1(playSd1, 0, sio_out1, 0); |
||||
AudioConnection patchCord2(playSd1, 1, sio_out1, 1); |
||||
AudioConnection patchCord3(playSd1, 0, queue1, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
char** _filenames = nullptr; |
||||
uint16_t _fileIndex = 0; |
||||
uint16_t _numWaveFiles = 0; |
||||
|
||||
int16_t buffer[512] = {0}; |
||||
File frec; |
||||
|
||||
unsigned long lastSamplePlayed = 0; |
||||
void my_handler(sig_atomic_t i); |
||||
static char stack_body[64*1024]; |
||||
static stack_t sigseg_stack; |
||||
static struct sigaction sigseg_handler; |
||||
|
||||
void crash_handler(sig_atomic_t i); |
||||
|
||||
|
||||
|
||||
uint16_t getNumWavFilesInDirectory(char *directory); |
||||
void populateFilenames(char *directory, char **filenames); |
||||
|
||||
|
||||
void setup() { |
||||
Serial.begin(9600);
|
||||
|
||||
playSd1.setPlaybackRate(1.0f); |
||||
playSd1.enableInterpolation(true); |
||||
//rraw_a1.play((int16_t*)kick_raw, kick_raw_len/2);
|
||||
Serial.println("setup done"); |
||||
|
||||
if (SD.exists("RECORD_SD.RAW")) { |
||||
// The SD library writes new data to the end of the
|
||||
// file, so to start a new recording, the old file
|
||||
// must be deleted before new data is written.
|
||||
SD.remove("RECORD_SD.RAW"); |
||||
} |
||||
frec = SD.open("RECORD_SD.RAW", O_WRITE); |
||||
|
||||
_numWaveFiles = getNumWavFilesInDirectory("/"); |
||||
Serial.printf("Num wave files: %d\n", _numWaveFiles); |
||||
_filenames = new char*[_numWaveFiles]; |
||||
populateFilenames("/", _filenames); |
||||
|
||||
Serial.println("Populated..."); |
||||
|
||||
AudioMemory(120); |
||||
|
||||
if (frec) { |
||||
queue1.begin(); |
||||
Serial.println("startRecording"); |
||||
} else { |
||||
Serial.println("recording failed..."); |
||||
} |
||||
} |
||||
|
||||
void loop() { |
||||
unsigned currentMillis = millis(); |
||||
if (currentMillis > lastSamplePlayed + 1000) { |
||||
if (!playSd1.isPlaying()) { |
||||
if (playSd1.playWav(_filenames[_fileIndex])) { |
||||
lastSamplePlayed = currentMillis; |
||||
Serial.printf("playing %s\n", _filenames[_fileIndex]); |
||||
} else
|
||||
Serial.printf("failed to play%s\n", _filenames[_fileIndex]); |
||||
_fileIndex++; |
||||
_fileIndex %= _numWaveFiles; |
||||
|
||||
Serial.print("Memory: "); |
||||
Serial.print(AudioMemoryUsage()); |
||||
Serial.print(","); |
||||
Serial.print(AudioMemoryUsageMax()); |
||||
Serial.println(); |
||||
} |
||||
} |
||||
|
||||
if (queue1.available() >= 1) {
|
||||
int16_t* incomming = queue1.readBuffer(); |
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//if (incomming != NULL && sizeof(incomming) >= 256) {
|
||||
if (incomming != NULL) { |
||||
memcpy(buffer, incomming, 256); |
||||
queue1.freeBuffer(); |
||||
frec.write((unsigned char *)buffer, 256); |
||||
frec.flush(); |
||||
}
|
||||
//else {
|
||||
// arduino_should_exit = true;
|
||||
//Serial.printf("sizeof(incomming)=%i\n", sizeof(incomming));
|
||||
//}
|
||||
}
|
||||
delay(1); |
||||
} |
||||
|
||||
int main(int numArgs, char **args) { |
||||
|
||||
if (numArgs < 2) |
||||
{ |
||||
std::cout << "usage: " << args[0] << " <path-to-SDCard>"; |
||||
exit(0); |
||||
} |
||||
std::cout << args[1] << std::endl; |
||||
signal (SIGINT,my_handler); |
||||
signal (SIGSEGV,crash_handler);
|
||||
|
||||
sigseg_stack.ss_sp = stack_body; |
||||
sigseg_stack.ss_flags = SS_ONSTACK; |
||||
sigseg_stack.ss_size = sizeof(stack_body); |
||||
// assert(!sigaltstack(&sigseg_stack, nullptr));
|
||||
sigseg_handler.sa_flags = SA_ONSTACK; |
||||
sigseg_handler.sa_handler = &crash_handler; |
||||
// assert(!sigaction(SIGSEGV, &sigseg_handler, nullptr));
|
||||
|
||||
initialize_mock_arduino(); |
||||
//SD.setSDCardFileData((char *) kick_raw, kick_raw_len);
|
||||
SD.setSDCardFolderPath(args[1]); |
||||
setup(); |
||||
while(!arduino_should_exit){ |
||||
loop(); |
||||
} |
||||
delay(1000); |
||||
frec.close(); |
||||
} |
||||
|
||||
|
||||
uint16_t getNumWavFilesInDirectory(char *directory) { |
||||
File dir = SD.open(directory); |
||||
uint16_t numWaveFiles = 0; |
||||
|
||||
while (true) {
|
||||
|
||||
File files = dir.openNextFile(); |
||||
if (!files) { |
||||
//If no more files, break out.
|
||||
break; |
||||
} |
||||
|
||||
String curfile = files.name(); //put file in string
|
||||
|
||||
int m = curfile.lastIndexOf(".WAV"); |
||||
int a = curfile.lastIndexOf(".wav"); |
||||
int underscore = curfile.indexOf("_"); |
||||
int underscore2 = curfile.indexOf("._"); |
||||
// if returned results is more then 0 add them to the list.
|
||||
if ((m > 0 || a > 0) && (underscore != 0) && (underscore2 != 0)) {
|
||||
numWaveFiles++; |
||||
} |
||||
|
||||
files.close(); |
||||
} |
||||
// close
|
||||
dir.close(); |
||||
return numWaveFiles; |
||||
} |
||||
|
||||
void populateFilenames(char *directory, char **filenames) { |
||||
File dir = SD.open(directory); |
||||
uint16_t index = 0; |
||||
|
||||
while (true) {
|
||||
|
||||
File files = dir.openNextFile(); |
||||
if (!files) { |
||||
//If no more files, break out.
|
||||
break; |
||||
} |
||||
|
||||
String curfile = files.name(); //put file in string
|
||||
|
||||
int m = curfile.lastIndexOf(".WAV"); |
||||
int a = curfile.lastIndexOf(".wav"); |
||||
int underscore = curfile.indexOf("_"); |
||||
int underscore2 = curfile.indexOf("._"); |
||||
// if returned results is more then 0 add them to the list.
|
||||
if ((m > 0 || a > 0) && (underscore != 0) && (underscore2 != 0) ) {
|
||||
|
||||
Serial.printf(" ---- %s\n", curfile.c_str()); |
||||
filenames[index] = new char[curfile.length()+1] {0}; |
||||
memcpy(filenames[index], curfile.c_str(), curfile.length()+1); |
||||
Serial.printf(" ------ %s\n", filenames[index]); |
||||
index++; |
||||
}
|
||||
files.close(); |
||||
} |
||||
// close
|
||||
dir.close(); |
||||
} |
||||
|
||||
|
||||
void my_handler(sig_atomic_t i){ |
||||
if ( i== SIGINT) { |
||||
arduino_should_exit = true; |
||||
printf("Caught signal %d\n",i); |
||||
} else
|
||||
{ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
} |
||||
void crash_handler(sig_atomic_t i){ |
||||
cerr << "sig seg fault handler" << endl; |
||||
const int asize = 10; |
||||
void *array[asize]; |
||||
size_t size; |
||||
|
||||
// get void*'s for all entries on the stack
|
||||
size = backtrace(array, asize); |
||||
|
||||
// print out all the frames to stderr
|
||||
cerr << "stack trace: " << endl; |
||||
backtrace_symbols_fd(array, size, STDERR_FILENO); |
||||
cerr << "resend SIGSEGV to get core dump" << endl; |
||||
signal(i, SIG_DFL); |
||||
kill(getpid(), i); |
||||
} |
||||
|
||||
unsigned char kick_raw[] = { |
||||
0x99, 0x02, 0xd7, 0x02, 0xfa, 0x02, 0x5f, 0x03, 0xc1, 0x03, 0x2a, 0x04, |
||||
0xad, 0x04, 0xa5, 0x05, 0x76, 0x06, 0x2f, 0x07, 0x9e, 0x07, 0xe2, 0x07, |
||||
0x43, 0x08, 0x92, 0x08, 0xb2, 0x08, 0xe8, 0x08, 0x16, 0x09, 0xda, 0x08, |
||||
0x51, 0x08, 0x01, 0x08, 0x25, 0x08, 0x70, 0x08, 0xc3, 0x08, 0x23, 0x09, |
||||
0x95, 0x09, 0x19, 0x0a, 0x83, 0x0a, 0x7e, 0x0a, 0xd0, 0x0a, 0x65, 0x0b, |
||||
0xf6, 0x0b, 0x89, 0x0c, 0xd1, 0x0c, 0xcf, 0x0c, 0x1a, 0x0d, 0xe5, 0x0d, |
||||
0x5e, 0x0e, 0xbb, 0x0e, 0xec, 0x0e, 0xd9, 0x0e, 0x07, 0x0f, 0xc8, 0x0f, |
||||
0x2a, 0x10, 0x04, 0x10, 0x28, 0x10, 0x54, 0x11, 0x8e, 0x13, 0x4b, 0x16, |
||||
0x09, 0x19, 0x91, 0x1b, 0xf7, 0x1d, 0x55, 0x20, 0xd1, 0x22, 0xcb, 0x25, |
||||
0x4d, 0x29, 0xa8, 0x2c, 0x7f, 0x2f, 0xda, 0x31, 0xac, 0x34, 0x0a, 0x3a, |
||||
0x24, 0x47, 0x9d, 0x5b, 0xe9, 0x67, 0x29, 0x67, 0x24, 0x66, 0x26, 0x66, |
||||
0xd2, 0x65, 0x9c, 0x65, 0x38, 0x65, 0x05, 0x65, 0x9f, 0x64, 0x64, 0x64, |
||||
0x12, 0x64, 0xce, 0x63, 0x7c, 0x63, 0x32, 0x63, 0xe6, 0x62, 0x97, 0x62, |
||||
0x49, 0x62, 0x01, 0x62, 0xb3, 0x61, 0x63, 0x61, 0x15, 0x61, 0xc4, 0x60, |
||||
0x75, 0x60, 0x20, 0x60, 0xce, 0x5f, 0x7a, 0x5f, 0x28, 0x5f, 0xd5, 0x5e, |
||||
0x81, 0x5e, 0x2d, 0x5e, 0xd3, 0x5d, 0x80, 0x5d, 0x2e, 0x5d, 0xe6, 0x5c, |
||||
0x1a, 0x5c, 0x16, 0x5a, 0x01, 0x58, 0xb9, 0x56, 0x6d, 0x55, 0xf4, 0x53, |
||||
0x49, 0x52, 0x83, 0x50, 0x87, 0x4e, 0x5f, 0x4c, 0x68, 0x4a, 0x5c, 0x48, |
||||
0x62, 0x46, 0x5a, 0x44, 0xe2, 0x41, 0x08, 0x3f, 0x1c, 0x3c, 0x44, 0x39, |
||||
0x35, 0x36, 0xcb, 0x32, 0xaf, 0x2f, 0xc8, 0x2c, 0xf8, 0x29, 0x55, 0x27, |
||||
0x6a, 0x24, 0x0f, 0x21, 0x5e, 0x1d, 0xc3, 0x19, 0x7b, 0x16, 0x71, 0x13, |
||||
0x6c, 0x10, 0x00, 0x0d, 0xd2, 0x08, 0x7f, 0x04, 0x7a, 0x01, 0x43, 0xff, |
||||
0xb9, 0xfc, 0xfa, 0xf9, 0x3b, 0xf7, 0xcb, 0xf4, 0x2b, 0xf2, 0x02, 0xef, |
||||
0x0c, 0xec, 0x3d, 0xe9, 0x21, 0xe6, 0xa6, 0xe2, 0x8a, 0xdf, 0x00, 0xdd, |
||||
0xbc, 0xda, 0x9e, 0xd8, 0xc1, 0xd6, 0xd6, 0xd4, 0xd6, 0xd2, 0xad, 0xd0, |
||||
0x5f, 0xce, 0xf0, 0xcb, 0xe9, 0xc9, 0x61, 0xc8, 0x75, 0xc7, 0x97, 0xc6, |
||||
0x3e, 0xc5, 0x07, 0xc4, 0x8e, 0xc3, 0x18, 0xc3, 0x3a, 0xc2, 0x15, 0xc1, |
||||
0x0e, 0xc0, 0xb3, 0xbf, 0xcf, 0xbf, 0xf8, 0xbf, 0xcc, 0xbf, 0x72, 0xbf, |
||||
0x41, 0xbf, 0x2b, 0xbf, 0xe2, 0xbe, 0x99, 0xbe, 0x4e, 0xbe, 0x0e, 0xbe, |
||||
0xcd, 0xbd, 0x7c, 0xbd, 0x8a, 0xbd, 0x88, 0xbd, 0x04, 0xbd, 0x0c, 0xbc, |
||||
0xb3, 0xbb, 0xf6, 0xbb, 0xf1, 0xbb, 0x12, 0xbc, 0x6f, 0xbc, 0xcb, 0xbc, |
||||
0xe4, 0xbc, 0x33, 0xbd, 0x1b, 0xbe, 0xac, 0xbe, 0x1e, 0xbf, 0x91, 0xbf, |
||||
0x50, 0xc0, 0x40, 0xc1, 0x3d, 0xc2, 0x32, 0xc3, 0xdf, 0xc3, 0xad, 0xc4, |
||||
0x77, 0xc5, 0xbe, 0xc6, 0xc7, 0xc8, 0x1d, 0xcb, 0x0e, 0xcd, 0x83, 0xce, |
||||
0xf1, 0xcf, 0xb4, 0xd1, 0x7d, 0xd3, 0x86, 0xd5, 0x89, 0xd7, 0xd2, 0xd9, |
||||
0x34, 0xdc, 0x28, 0xde, 0x23, 0xe0, 0x33, 0xe2, 0x0a, 0xe4, 0x59, 0xe5, |
||||
0xfc, 0xe6, 0x98, 0xe9, 0x30, 0xec, 0x91, 0xee, 0xc2, 0xf0, 0x0d, 0xf3, |
||||
0x35, 0xf5, 0xf3, 0xf6, 0xc4, 0xf8, 0xcb, 0xfa, 0xef, 0xfc, 0x65, 0xff, |
||||
0x05, 0x02, 0x7c, 0x04, 0xde, 0x06, 0x75, 0x09, 0x2b, 0x0c, 0x9b, 0x0e, |
||||
0xf3, 0x10, 0xb3, 0x13, 0x3a, 0x16, 0xeb, 0x18, 0x55, 0x1c, 0xad, 0x1f, |
||||
0xa8, 0x22, 0x54, 0x25, 0xae, 0x27, 0x33, 0x2a, 0x16, 0x2d, 0x36, 0x30, |
||||
0x84, 0x33, 0x94, 0x36, 0xbd, 0x38, 0xa2, 0x3a, 0x7d, 0x3c, 0x06, 0x3e, |
||||
0x24, 0x3f, 0x27, 0x40, 0x7c, 0x41, 0xef, 0x42, 0x14, 0x44, 0xeb, 0x44, |
||||
0x06, 0x46, 0x53, 0x47, 0x47, 0x48, 0x9b, 0x48, 0xaf, 0x48, 0xd7, 0x48, |
||||
0x4c, 0x49, 0xa0, 0x49, 0xbe, 0x49, 0xd4, 0x49, 0xfa, 0x49, 0x5e, 0x4a, |
||||
0xcc, 0x4a, 0x14, 0x4b, 0xfe, 0x4a, 0x22, 0x4b, 0x10, 0x4c, 0x0c, 0x4d, |
||||
0xb2, 0x4d, 0x4c, 0x4e, 0x3e, 0x4e, 0x77, 0x4d, 0x98, 0x4c, 0xf6, 0x4b, |
||||
0x67, 0x4b, 0xf0, 0x4a, 0x2a, 0x4a, 0xea, 0x48, 0x06, 0x48, 0x47, 0x47, |
||||
0xb2, 0x46, 0xda, 0x45, 0xad, 0x44, 0x5c, 0x43, 0x43, 0x42, 0x9e, 0x41, |
||||
0x0a, 0x41, 0x49, 0x40, 0xa6, 0x3f, 0x9d, 0x3e, 0x3c, 0x3d, 0xc6, 0x3b, |
||||
0xf6, 0x39, 0x87, 0x37, 0xf6, 0x34, 0x87, 0x32, 0x2b, 0x30, 0x6f, 0x2d, |
||||
0xfa, 0x2a, 0x3d, 0x29, 0x48, 0x27, 0xc2, 0x24, 0x49, 0x22, 0xca, 0x1f, |
||||
0xa0, 0x1c, 0x7c, 0x19, 0x06, 0x17, 0xbf, 0x14, 0x9f, 0x12, 0x96, 0x10, |
||||
0xf9, 0x0d, 0x3e, 0x0b, 0xe8, 0x08, 0x5c, 0x06, 0xe7, 0x02, 0x6e, 0xff, |
||||
0xca, 0xfc, 0x5b, 0xfa, 0xa0, 0xf7, 0xe9, 0xf4, 0x9c, 0xf2, 0x66, 0xf0, |
||||
0xaf, 0xed, 0xfd, 0xea, 0xcc, 0xe8, 0x6e, 0xe6, 0x82, 0xe3, 0x97, 0xe0, |
||||
0xed, 0xdd, 0x62, 0xdb, 0x7b, 0xd8, 0xd3, 0xd5, 0x5f, 0xd3, 0x1a, 0xd1, |
||||
0x44, 0xcf, 0xeb, 0xcd, 0x89, 0xcc, 0xca, 0xca, 0x4d, 0xc9, 0x35, 0xc8, |
||||
0x53, 0xc7, 0x0c, 0xc6, 0x06, 0xc4, 0xca, 0xc1, 0x09, 0xc0, 0x9c, 0xbe, |
||||
0xa8, 0xbd, 0xfd, 0xbc, 0xf2, 0xbb, 0x9b, 0xba, 0x20, 0xb9, 0xe4, 0xb7, |
||||
0xc1, 0xb6, 0xcd, 0xb5, 0x12, 0xb5, 0x55, 0xb4, 0xd1, 0xb3, 0x86, 0xb3, |
||||
0x19, 0xb3, 0xe8, 0xb2, 0xd7, 0xb2, 0x72, 0xb2, 0x27, 0xb2, 0xb7, 0xb1, |
||||
0x67, 0xb1, 0x65, 0xb1, 0xae, 0xb1, 0x6b, 0xb1, 0xf2, 0xb0, 0xeb, 0xb0, |
||||
0x0f, 0xb1, 0xfe, 0xb0, 0xeb, 0xb0, 0xcf, 0xb0, 0x94, 0xb0, 0x3e, 0xb0, |
||||
0x29, 0xb0, 0x56, 0xb0, 0x0c, 0xb0, 0xb7, 0xaf, 0xfb, 0xaf, 0x37, 0xb0, |
||||
0x96, 0xb0, 0x42, 0xb1, 0xe8, 0xb1, 0xb5, 0xb2, 0xc5, 0xb3, 0x93, 0xb4, |
||||
0x93, 0xb4, 0xee, 0xb4, 0x59, 0xb6, 0xca, 0xb7, 0x87, 0xb8, 0x6f, 0xb8, |
||||
0x33, 0xb8, 0xaf, 0xb8, 0x4a, 0xb9, 0x9d, 0xb9, 0xf2, 0xb9, 0x48, 0xba, |
||||
0xd0, 0xba, 0xe5, 0xbb, 0x4e, 0xbd, 0xaf, 0xbe, 0xe9, 0xbf, 0xba, 0xc1, |
||||
0xc2, 0xc3, 0x73, 0xc5, 0xa6, 0xc6, 0x6a, 0xc7, 0x83, 0xc8, 0x42, 0xca, |
||||
0xc8, 0xcb, 0x34, 0xcd, 0x94, 0xce, 0xcc, 0xcf, 0x31, 0xd1, 0x27, 0xd3, |
||||
0x8c, 0xd5, 0x61, 0xd7, 0x78, 0xd9, 0x3b, 0xdc, 0x40, 0xdf, 0xdd, 0xe1, |
||||
0x0c, 0xe4, 0xe4, 0xe5, 0xd0, 0xe7, 0x65, 0xea, 0xc9, 0xec, 0xd7, 0xee, |
||||
0xfc, 0xf0, 0x7c, 0xf3, 0xf6, 0xf5, 0x09, 0xf8, 0xde, 0xf9, 0xca, 0xfb, |
||||
0xac, 0xfd, 0xc3, 0xff, 0x33, 0x02, 0xb1, 0x04, 0x24, 0x07, 0x57, 0x09, |
||||
0x5f, 0x0b, 0xe6, 0x0d, 0xd1, 0x10, 0x6d, 0x13, 0x8f, 0x15, 0xfb, 0x17, |
||||
0x43, 0x1a, 0x8e, 0x1c, 0x1a, 0x1f, 0x69, 0x21, 0x80, 0x23, 0x74, 0x25, |
||||
0x62, 0x27, 0x07, 0x29, 0xa1, 0x2a, 0xa5, 0x2c, 0xdf, 0x2e, 0x57, 0x31, |
||||
0xff, 0x33, 0xd1, 0x36, 0x6e, 0x39, 0x8a, 0x3b, 0x58, 0x3d, 0x32, 0x3f, |
||||
0xc8, 0x40, 0x1b, 0x42, 0x22, 0x43, 0x1a, 0x44, 0x25, 0x45, 0xe5, 0x45, |
||||
0x43, 0x46, 0x9b, 0x46, 0x6a, 0x47, 0x6f, 0x48, 0x69, 0x49, 0x6f, 0x4a, |
||||
0xc7, 0x4b, 0x0e, 0x4d, 0x03, 0x4e, 0x78, 0x4e, 0xdf, 0x4e, 0x0b, 0x4f, |
||||
0xea, 0x4e, 0xcb, 0x4e, 0x1b, 0x4f, 0x6e, 0x4f, 0xc3, 0x4f, 0xdc, 0x4f, |
||||
0xcb, 0x4f, 0xd2, 0x4f, 0x16, 0x50, 0x24, 0x50, 0xf2, 0x4f, 0x00, 0x50, |
||||
0x37, 0x50, 0x4e, 0x50, 0x5e, 0x50, 0x7c, 0x50, 0xab, 0x50, 0x69, 0x50, |
||||
0xad, 0x4f, 0xa3, 0x4e, 0xe6, 0x4d, 0x42, 0x4d, 0xdc, 0x4c, 0x7c, 0x4c, |
||||
0xbe, 0x4b, 0x08, 0x4b, 0x7b, 0x4a, 0xe4, 0x49, 0x14, 0x49, 0x07, 0x48, |
||||
0x98, 0x46, 0x2f, 0x45, 0x16, 0x44, 0x23, 0x43, 0x55, 0x42, 0xac, 0x41, |
||||
0x06, 0x41, 0x4b, 0x40, 0x8f, 0x3f, 0xde, 0x3e, 0xe1, 0x3d, 0x75, 0x3c, |
||||
0xc0, 0x3a, 0xe4, 0x38, 0x83, 0x37, 0x9a, 0x36, 0xe5, 0x35, 0xc0, 0x34, |
||||
0xf9, 0x32, 0xe1, 0x30, 0xfa, 0x2e, 0xd4, 0x2c, 0x4d, 0x2a, 0xed, 0x27, |
||||
0xb9, 0x25, 0xb2, 0x23, 0x7d, 0x21, 0xfd, 0x1e, 0x89, 0x1c, 0x38, 0x1a, |
||||
0xe2, 0x17, 0x67, 0x15, 0xf3, 0x12, 0xb3, 0x10, 0x9e, 0x0e, 0x79, 0x0c, |
||||
0xea, 0x09, 0x54, 0x07, 0x26, 0x05, 0x0a, 0x03, 0xd7, 0x00, 0x98, 0xfe, |
||||
0x41, 0xfc, 0x8d, 0xf9, 0x3c, 0xf7, 0x4f, 0xf5, 0x73, 0xf3, 0x7b, 0xf1, |
||||
0x68, 0xef, 0x6f, 0xed, 0x7a, 0xeb, 0x87, 0xe9, 0x48, 0xe7, 0xc6, 0xe4, |
||||
0x65, 0xe2, 0xf6, 0xdf, 0x86, 0xdd, 0x9f, 0xdb, 0x1b, 0xda, 0xa6, 0xd8, |
||||
0xce, 0xd6, 0xe4, 0xd4, 0xe3, 0xd2, 0x84, 0xd0, 0xec, 0xcd, 0x08, 0xcc, |
||||
0x89, 0xca, 0x1b, 0xc9, 0xe2, 0xc7, 0x9d, 0xc6, 0xe5, 0xc4, 0x79, 0xc3, |
||||
0x6d, 0xc2, 0xe3, 0xc0, 0x3c, 0xbf, 0xd3, 0xbd, 0x41, 0xbc, 0xd2, 0xba, |
||||
0x6a, 0xb9, 0xa1, 0xb7, 0xa9, 0xb5, 0x47, 0xb4, 0x91, 0xb3, 0xd5, 0xb2, |
||||
0xb7, 0xb1, 0x51, 0xb0, 0x14, 0xaf, 0xf5, 0xad, 0x95, 0xac, 0x34, 0xab, |
||||
0x05, 0xaa, 0xe1, 0xa8, 0xb3, 0xa7, 0xd9, 0xa6, 0x25, 0xa6, 0x6e, 0xa5, |
||||
0x2b, 0xa5, 0x7b, 0xa5, 0x9a, 0xa5, 0x88, 0xa5, 0xc3, 0xa5, 0xe7, 0xa5, |
||||
0xaf, 0xa5, 0x8b, 0xa5, 0x80, 0xa5, 0x65, 0xa5, 0x8c, 0xa5, 0x7e, 0xa5, |
||||
0x22, 0xa5, 0x40, 0xa5, 0xed, 0xa5, 0x27, 0xa6, 0x2b, 0xa6, 0x1c, 0xa6, |
||||
0xe5, 0xa5, 0x7b, 0xa5, 0x45, 0xa5, 0x37, 0xa5, 0x04, 0xa5, 0x91, 0xa4, |
||||
0x8d, 0xa4, 0x2d, 0xa5, 0x9f, 0xa5, 0xf6, 0xa5, 0x7e, 0xa6, 0x34, 0xa7, |
||||
0x14, 0xa8, 0x7e, 0xa8, 0x87, 0xa8, 0xc4, 0xa8, 0x51, 0xa9, 0xec, 0xa9, |
||||
0x74, 0xaa, 0xf7, 0xaa, 0x40, 0xab, 0xd9, 0xab, 0xca, 0xac, 0x6b, 0xad, |
||||
0xb3, 0xad, 0x08, 0xae, 0x10, 0xaf, 0x2c, 0xb0, 0xcb, 0xb0, 0x23, 0xb1, |
||||
0xac, 0xb1, 0x0e, 0xb2, 0x42, 0xb2, 0xd7, 0xb2, 0xef, 0xb3, 0x21, 0xb5, |
||||
0x30, 0xb6, 0xe9, 0xb6, 0x54, 0xb7, 0xf0, 0xb7, 0x9e, 0xb8, 0x2e, 0xb9, |
||||
0x03, 0xba, 0x55, 0xbb, 0xdf, 0xbc, 0x5f, 0xbe, 0xb8, 0xbf, 0x01, 0xc1, |
||||
0x83, 0xc2, 0x0c, 0xc4, 0x65, 0xc5, 0x7e, 0xc6, 0x86, 0xc7, 0xba, 0xc8, |
||||
0x11, 0xca, 0x66, 0xcb, 0x28, 0xcd, 0x4d, 0xcf, 0x60, 0xd1, 0x69, 0xd3, |
||||
0x7b, 0xd5, 0x5f, 0xd7, 0xe3, 0xd8, 0xca, 0xda, 0xda, 0xdc, 0xda, 0xde, |
||||
0xab, 0xe0, 0x59, 0xe2, 0x3b, 0xe4, 0x21, 0xe6, 0xfc, 0xe7, 0xcb, 0xe9, |
||||
0xbe, 0xeb, 0x9c, 0xed, 0x47, 0xef, 0x0b, 0xf1, 0xd3, 0xf2, 0xbc, 0xf4, |
||||
0x9c, 0xf6, 0x67, 0xf8, 0x2a, 0xfa, 0xc1, 0xfb, 0x7f, 0xfd, 0x41, 0xff, |
||||
0x12, 0x01, 0xd2, 0x02, 0xfc, 0x04, 0xe8, 0x06, 0x9a, 0x08, 0x59, 0x0a, |
||||
0x48, 0x0c, 0x36, 0x0e, 0x37, 0x10, 0x36, 0x12, 0x59, 0x14, 0x62, 0x16, |
||||
0x86, 0x18, 0xb9, 0x1a, 0xc2, 0x1c, 0xcd, 0x1e, 0xf1, 0x20, 0x27, 0x23, |
||||
0x7a, 0x25, 0xf9, 0x27, 0x2a, 0x2a, 0x1f, 0x2c, 0xf8, 0x2d, 0xa3, 0x2f, |
||||
0x23, 0x31, 0xf4, 0x32, 0x2c, 0x35, 0x40, 0x37, 0x23, 0x39, 0xfe, 0x3a, |
||||
0x11, 0x3d, 0x2c, 0x3f, 0xe8, 0x40, 0x8c, 0x42, 0x55, 0x44, 0x37, 0x46, |
||||
0x99, 0x47, 0xcb, 0x48, 0x12, 0x4a, 0x60, 0x4b, 0x86, 0x4c, 0x9b, 0x4d, |
||||
0xc8, 0x4e, 0xec, 0x4f, 0xe3, 0x50, 0x8a, 0x51, 0x23, 0x52, 0xd8, 0x52, |
||||
0x68, 0x53, 0x9b, 0x53, 0xb1, 0x53, 0x11, 0x54, 0x94, 0x54, 0xf7, 0x54, |
||||
0x4f, 0x55, 0xa4, 0x55, 0x03, 0x56, 0x51, 0x56, 0x92, 0x56, 0xfa, 0x56, |
||||
0x59, 0x57, 0xad, 0x57, 0xcd, 0x57, 0xc5, 0x57, 0xa8, 0x57, 0x64, 0x57, |
||||
0x49, 0x57, 0x63, 0x57, 0x64, 0x57, 0x40, 0x57, 0xf6, 0x56, 0xfc, 0x56, |
||||
0x36, 0x57, 0x3b, 0x57, 0x1e, 0x57, 0x1c, 0x57, 0x03, 0x57, 0xee, 0x56, |
||||
0xa5, 0x56, 0x80, 0x56, 0xd4, 0x56, 0xe4, 0x56, 0x92, 0x56, 0xf0, 0x55, |
||||
0x02, 0x55, 0xab, 0x53, 0xb5, 0x52, 0x51, 0x52, 0x08, 0x52, 0x80, 0x51, |
||||
0xb4, 0x50, 0xde, 0x4f, 0x27, 0x4f, 0x63, 0x4e, 0x58, 0x4d, 0x72, 0x4c, |
||||
0x82, 0x4b, 0x81, 0x4a, 0x87, 0x49, 0xb4, 0x48, 0xb1, 0x47, 0x99, 0x46, |
||||
0xb4, 0x45, 0x34, 0x45, 0xb8, 0x44, 0x2f, 0x44, 0x7f, 0x43, 0xa0, 0x42, |
||||
0xcb, 0x41, 0xd1, 0x40, 0xeb, 0x3f, 0x28, 0x3f, 0x3d, 0x3e, 0x09, 0x3d, |
||||
0x9d, 0x3b, 0x40, 0x3a, 0x1c, 0x39, 0xeb, 0x37, 0xd1, 0x36, 0xb3, 0x35, |
||||
0x8b, 0x34, 0x0b, 0x33, 0x51, 0x31, 0xfb, 0x2f, 0xb9, 0x2e, 0x54, 0x2d, |
||||
0xaf, 0x2b, 0xdf, 0x29, 0xf1, 0x27, 0x3a, 0x26, 0x6f, 0x24, 0x56, 0x22, |
||||
0x20, 0x20, 0x0a, 0x1e, 0x3b, 0x1c, 0x55, 0x1a, 0x6c, 0x18, 0xaa, 0x16, |
||||
0xef, 0x14, 0x0a, 0x13, 0x17, 0x11, 0x1c, 0x0f, 0x22, 0x0d, 0x46, 0x0b, |
||||
0x53, 0x09, 0x46, 0x07, 0x46, 0x05, 0x4d, 0x03, 0x1a, 0x01, 0xd3, 0xfe, |
||||
0x94, 0xfc, 0x8c, 0xfa, 0x8f, 0xf8, 0xc1, 0xf6, 0x27, 0xf5, 0x8f, 0xf3, |
||||
0xf2, 0xf1, 0x74, 0xf0, 0xfa, 0xee, 0x4d, 0xed, 0x9e, 0xeb, 0xa2, 0xe9, |
||||
0x73, 0xe7, 0xa9, 0xe5, 0x2d, 0xe4, 0xa3, 0xe2, 0xf9, 0xe0, 0x50, 0xdf, |
||||
0xb9, 0xdd, 0x34, 0xdc, 0xad, 0xda, 0x0b, 0xd9, 0x77, 0xd7, 0xb9, 0xd5, |
||||
0x37, 0xd4, 0xff, 0xd2, 0x8a, 0xd1, 0x14, 0xd0, 0xba, 0xce, 0x7d, 0xcd, |
||||
0x2c, 0xcc, 0xa1, 0xca, 0x22, 0xc9, 0xa9, 0xc7, 0x0e, 0xc6, 0x66, 0xc4, |
||||
0xfc, 0xc2, 0xa5, 0xc1, 0x4a, 0xc0, 0xff, 0xbe, 0xf7, 0xbd, 0x0e, 0xbd, |
||||
0x1d, 0xbc, 0x16, 0xbb, 0xad, 0xb9, 0x44, 0xb8, 0xd7, 0xb6, 0x9e, 0xb5, |
||||
0x9f, 0xb4, 0x97, 0xb3, 0x72, 0xb2, 0x5f, 0xb1, 0x67, 0xb0, 0x89, 0xaf, |
||||
0x9d, 0xae, 0xbe, 0xad, 0x08, 0xad, 0x5d, 0xac, 0x8b, 0xab, 0xad, 0xaa, |
||||
0xe4, 0xa9, 0x59, 0xa9, 0xc4, 0xa8, 0x02, 0xa8, 0x4d, 0xa7, 0xc2, 0xa6, |
||||
0x4a, 0xa6, 0x09, 0xa6, 0xd2, 0xa5, 0x50, 0xa5, 0xec, 0xa4, 0xc2, 0xa4, |
||||
0xd9, 0xa4, 0xbd, 0xa4, 0x97, 0xa4, 0xa5, 0xa4, 0xbf, 0xa4, 0xb4, 0xa4, |
||||
0x8f, 0xa4, 0x31, 0xa4, 0x39, 0xa4, 0x7d, 0xa4, 0xab, 0xa4, 0xc7, 0xa4, |
||||
0xb3, 0xa4, 0xab, 0xa4, 0xca, 0xa4, 0x05, 0xa5, 0x1e, 0xa5, 0x2a, 0xa5, |
||||
0x2c, 0xa5, 0x18, 0xa5, 0x01, 0xa5, 0x33, 0xa5, 0x8c, 0xa5, 0xb2, 0xa5, |
||||
0x81, 0xa5, 0x5c, 0xa5, 0x6e, 0xa5, 0x79, 0xa5, 0x4e, 0xa5, 0x17, 0xa5, |
||||
0xff, 0xa4, 0x1c, 0xa5, 0x45, 0xa5, 0x8a, 0xa5, 0xbf, 0xa5, 0xdb, 0xa5, |
||||
0x41, 0xa6, 0xfb, 0xa6, 0xc6, 0xa7, 0x86, 0xa8, 0x29, 0xa9, 0x97, 0xa9, |
||||
0x27, 0xaa, 0xd7, 0xaa, 0x6d, 0xab, 0xf4, 0xab, 0x34, 0xac, 0x69, 0xac, |
||||
0xc6, 0xac, 0x37, 0xad, 0xaa, 0xad, 0x34, 0xae, 0xd3, 0xae, 0x81, 0xaf, |
||||
0x16, 0xb0, 0x72, 0xb0, 0xc8, 0xb0, 0x36, 0xb1, 0x91, 0xb1, 0xe0, 0xb1, |
||||
0x3b, 0xb2, 0x8e, 0xb2, 0xe0, 0xb2, 0x2a, 0xb3, 0xab, 0xb3, 0x3a, 0xb4, |
||||
0xf1, 0xb4, 0xc0, 0xb5, 0xae, 0xb6, 0x91, 0xb7, 0x82, 0xb8, 0x98, 0xb9, |
||||
0x8f, 0xba, 0x88, 0xbb, 0x65, 0xbc, 0x20, 0xbd, 0xcb, 0xbd, 0xaf, 0xbe, |
||||
0x94, 0xbf, 0x84, 0xc0, 0x85, 0xc1, 0x7b, 0xc2, 0x67, 0xc3, 0x66, 0xc4, |
||||
0x7f, 0xc5, 0x89, 0xc6, 0x6b, 0xc7, 0x38, 0xc8, 0x29, 0xc9, 0x4a, 0xca, |
||||
0x82, 0xcb, 0xc1, 0xcc, 0x12, 0xce, 0x5e, 0xcf, 0xb0, 0xd0, 0x25, 0xd2, |
||||
0x66, 0xd3, 0xde, 0xd4, 0x6c, 0xd6, 0x28, 0xd8, 0xd7, 0xd9, 0x80, 0xdb, |
||||
0xf7, 0xdc, 0x6f, 0xde, 0xd0, 0xdf, 0x22, 0xe1, 0x7a, 0xe2, 0xe5, 0xe3, |
||||
0x7a, 0xe5, 0xea, 0xe6, 0x51, 0xe8, 0xeb, 0xe9, 0x70, 0xeb, 0xb3, 0xec, |
||||
0x01, 0xee, 0x60, 0xef, 0xcb, 0xf0, 0x1d, 0xf2, 0x7b, 0xf3, 0xcf, 0xf4, |
||||
0x39, 0xf6, 0xc8, 0xf7, 0x82, 0xf9, 0x4a, 0xfb, 0xf2, 0xfc, 0x8c, 0xfe, |
||||
0x01, 0x00, 0x68, 0x01, 0x15, 0x03, 0xe6, 0x04, 0xbc, 0x06, 0x42, 0x08, |
||||
0xbb, 0x09, 0x2b, 0x0b, 0xc7, 0x0c, 0x35, 0x0e, 0x94, 0x0f, 0xf2, 0x10, |
||||
0x59, 0x12, 0xbc, 0x13, 0x34, 0x15, 0xac, 0x16, 0x1c, 0x18, 0x79, 0x19, |
||||
0xdc, 0x1a, 0x6d, 0x1c, 0x21, 0x1e, 0xca, 0x1f, 0x70, 0x21, 0x02, 0x23, |
||||
0x6c, 0x24, 0x9e, 0x25, 0x45, 0x27, 0x02, 0x29, 0x95, 0x2a, 0xff, 0x2b, |
||||
0x72, 0x2d, 0xe8, 0x2e, 0x48, 0x30, 0x7c, 0x31, 0xd2, 0x32, 0x3d, 0x34, |
||||
0xac, 0x35, 0x26, 0x37, 0xbc, 0x38, 0x4c, 0x3a, 0x90, 0x3b, 0xef, 0x3c, |
||||
0x61, 0x3e, 0xe8, 0x3f, 0x59, 0x41, 0xab, 0x42, 0xf7, 0x43, 0x2d, 0x45, |
||||
0x6c, 0x46, 0x78, 0x47, 0xb4, 0x48, 0x2e, 0x4a, 0x8e, 0x4b, 0xd7, 0x4c, |
||||
0xf4, 0x4d, 0xee, 0x4e, 0xcb, 0x4f, 0xc3, 0x50, 0xc2, 0x51, 0xac, 0x52, |
||||
0x61, 0x53, 0xf3, 0x53, 0xac, 0x54, 0x5f, 0x55, 0xf4, 0x55, 0x7f, 0x56, |
||||
0x04, 0x57, 0x9c, 0x57, 0x1f, 0x58, 0x7c, 0x58, 0xbc, 0x58, 0x0b, 0x59, |
||||
0x71, 0x59, 0xc1, 0x59, 0x0b, 0x5a, 0x3e, 0x5a, 0x8b, 0x5a, 0xac, 0x5a, |
||||
0xa9, 0x5a, 0x8a, 0x5a, 0x6c, 0x5a, 0x4c, 0x5a, 0x39, 0x5a, 0x32, 0x5a, |
||||
0x40, 0x5a, 0x33, 0x5a, 0x44, 0x5a, 0x58, 0x5a, 0x79, 0x5a, 0x7a, 0x5a, |
||||
0x69, 0x5a, 0x49, 0x5a, 0x54, 0x5a, 0x78, 0x5a, 0x72, 0x5a, 0x5f, 0x5a, |
||||
0x31, 0x5a, 0x11, 0x5a, 0xf9, 0x59, 0xea, 0x59, 0xd1, 0x59, 0xa1, 0x59, |
||||
0x48, 0x59, 0xf0, 0x58, 0xa2, 0x58, 0x6e, 0x58, 0x60, 0x58, 0x46, 0x58, |
||||
0x3f, 0x58, 0x47, 0x58, 0x40, 0x58, 0x08, 0x58, 0x9c, 0x57, 0x11, 0x57, |
||||
0x83, 0x56, 0xd7, 0x55, 0x42, 0x55, 0xab, 0x54, 0x06, 0x54, 0x63, 0x53, |
||||
0xa6, 0x52, 0xf0, 0x51, 0x55, 0x51, 0xbc, 0x50, 0x1e, 0x50, 0x8e, 0x4f, |
||||
0xf3, 0x4e, 0x34, 0x4e, 0x6b, 0x4d, 0xc9, 0x4c, 0x30, 0x4c, 0x7d, 0x4b, |
||||
0xd8, 0x4a, 0x49, 0x4a, 0xad, 0x49, 0x11, 0x49, 0x6c, 0x48, 0xa4, 0x47, |
||||
0xec, 0x46, 0x6c, 0x46, 0xde, 0x45, 0x5d, 0x45, 0xbc, 0x44, 0xf1, 0x43, |
||||
0x34, 0x43, 0x8c, 0x42, 0xf8, 0x41, 0x47, 0x41, 0x6a, 0x40, 0x72, 0x3f, |
||||
0x8b, 0x3e, 0xb3, 0x3d, 0xf2, 0x3c, 0x2f, 0x3c, 0x5c, 0x3b, 0x96, 0x3a, |
||||
0xbc, 0x39, 0xb2, 0x38, 0x91, 0x37, 0x8c, 0x36, 0x75, 0x35, 0x63, 0x34, |
||||
0x5e, 0x33, 0x63, 0x32, 0x4b, 0x31, 0x3c, 0x30, 0x1e, 0x2f, 0x07, 0x2e, |
||||
0xd0, 0x2c, 0xb2, 0x2b, 0x84, 0x2a, 0x4d, 0x29, 0xfc, 0x27, 0xa5, 0x26, |
||||
0x2f, 0x25, 0x95, 0x23, 0x1f, 0x22, 0xad, 0x20, 0x3a, 0x1f, 0x9e, 0x1d, |
||||
0x10, 0x1c, 0x6e, 0x1a, 0xe3, 0x18, 0x56, 0x17, 0xdb, 0x15, 0x58, 0x14, |
||||
0xba, 0x12, 0x2a, 0x11, 0x8b, 0x0f, 0xf4, 0x0d, 0x5b, 0x0c, 0xd3, 0x0a, |
||||
0x5f, 0x09, 0xe5, 0x07, 0x4a, 0x06, 0xc0, 0x04, 0x3e, 0x03, 0xb6, 0x01, |
||||
0x37, 0x00, 0xca, 0xfe, 0x74, 0xfd, 0x00, 0xfc, 0xa5, 0xfa, 0x4a, 0xf9, |
||||
0xd1, 0xf7, 0x7e, 0xf6, 0x1c, 0xf5, 0x9d, 0xf3, 0x4f, 0xf2, 0x0e, 0xf1, |
||||
0xc0, 0xef, 0x3a, 0xee, 0xd8, 0xec, 0x69, 0xeb, 0x0c, 0xea, 0xad, 0xe8, |
||||
0x56, 0xe7, 0xf8, 0xe5, 0xbe, 0xe4, 0x98, 0xe3, 0x61, 0xe2, 0x03, 0xe1, |
||||
0x99, 0xdf, 0x4d, 0xde, 0x0e, 0xdd, 0xde, 0xdb, 0xad, 0xda, 0x84, 0xd9, |
||||
0x62, 0xd8, 0x32, 0xd7, 0x01, 0xd6, 0xb7, 0xd4, 0x87, 0xd3, 0x97, 0xd2, |
||||
0x89, 0xd1, 0x89, 0xd0, 0x6e, 0xcf, 0x65, 0xce, 0x5d, 0xcd, 0x44, 0xcc, |
||||
0x13, 0xcb, 0xf2, 0xc9, 0xd3, 0xc8, 0xad, 0xc7, 0x9b, 0xc6, 0x94, 0xc5, |
||||
0x8e, 0xc4, 0x7b, 0xc3, 0x92, 0xc2, 0xad, 0xc1, 0xb2, 0xc0, 0xb9, 0xbf, |
||||
0xb3, 0xbe, 0xc0, 0xbd, 0xd5, 0xbc, 0xf2, 0xbb, 0xe1, 0xba, 0xc7, 0xb9, |
||||
0xc7, 0xb8, 0xe8, 0xb7, 0x09, 0xb7, 0x2c, 0xb6, 0x66, 0xb5, 0xb1, 0xb4, |
||||
0xf6, 0xb3, 0x32, 0xb3, 0x53, 0xb2, 0x92, 0xb1, 0xdb, 0xb0, 0x0d, 0xb0, |
||||
0x46, 0xaf, 0x62, 0xae, 0x98, 0xad, 0xd1, 0xac, 0x3f, 0xac, 0xb0, 0xab, |
||||
0x34, 0xab, 0xb1, 0xaa, 0x45, 0xaa, 0xda, 0xa9, 0x6a, 0xa9, 0xf1, 0xa8, |
||||
0x7d, 0xa8, 0x04, 0xa8, 0xbb, 0xa7, 0x80, 0xa7, 0x41, 0xa7, 0x02, 0xa7, |
||||
0xb6, 0xa6, 0x68, 0xa6, 0x3b, 0xa6, 0x1c, 0xa6, 0x0d, 0xa6, 0xfc, 0xa5, |
||||
0xd4, 0xa5, 0xa6, 0xa5, 0x81, 0xa5, 0x76, 0xa5, 0x61, 0xa5, 0x54, 0xa5, |
||||
0x48, 0xa5, 0x47, 0xa5, 0x4b, 0xa5, 0x49, 0xa5, 0x38, 0xa5, 0x4b, 0xa5, |
||||
0x6c, 0xa5, 0xa3, 0xa5, 0xda, 0xa5, 0xfe, 0xa5, 0x21, 0xa6, 0x4a, 0xa6, |
||||
0x8a, 0xa6, 0xb4, 0xa6, 0xe0, 0xa6, 0xf3, 0xa6, 0x1b, 0xa7, 0x17, 0xa7, |
||||
0x40, 0xa7, 0x8e, 0xa7, 0xcd, 0xa7, 0x06, 0xa8, 0x3e, 0xa8, 0x86, 0xa8, |
||||
0xbd, 0xa8, 0xde, 0xa8, 0xf6, 0xa8, 0x1c, 0xa9, 0x49, 0xa9, 0x5c, 0xa9, |
||||
0x79, 0xa9, 0x93, 0xa9, 0xab, 0xa9, 0xe6, 0xa9, 0x2c, 0xaa, 0x82, 0xaa, |
||||
0xbc, 0xaa, 0xec, 0xaa, 0x32, 0xab, 0x69, 0xab, 0xa7, 0xab, 0xde, 0xab, |
||||
0x19, 0xac, 0x53, 0xac, 0xbb, 0xac, 0x14, 0xad, 0x8a, 0xad, 0xeb, 0xad, |
||||
0x6c, 0xae, 0xe1, 0xae, 0x62, 0xaf, 0xd9, 0xaf, 0x58, 0xb0, 0xc0, 0xb0, |
||||
0x36, 0xb1, 0x99, 0xb1, 0x11, 0xb2, 0x71, 0xb2, 0xdc, 0xb2, 0x58, 0xb3, |
||||
0xbb, 0xb3, 0x37, 0xb4, 0xb6, 0xb4, 0x46, 0xb5, 0xca, 0xb5, 0x50, 0xb6, |
||||
0xd9, 0xb6, 0x6c, 0xb7, 0x03, 0xb8, 0x7e, 0xb8, 0xf0, 0xb8, 0x64, 0xb9, |
||||
0xcf, 0xb9, 0x47, 0xba, 0xd3, 0xba, 0x60, 0xbb, 0xe8, 0xbb, 0x70, 0xbc, |
||||
0xf3, 0xbc, 0x82, 0xbd, 0x05, 0xbe, 0xa1, 0xbe, 0x2a, 0xbf, 0xae, 0xbf, |
||||
0x25, 0xc0, 0xac, 0xc0, 0x52, 0xc1, 0xde, 0xc1, 0x75, 0xc2, 0x11, 0xc3, |
||||
0xb5, 0xc3, 0x42, 0xc4, 0xc5, 0xc4, 0x6d, 0xc5, 0x0b, 0xc6, 0xb2, 0xc6, |
||||
0x4b, 0xc7, 0xf6, 0xc7, 0x9b, 0xc8, 0x4f, 0xc9, 0x17, 0xca, 0xf3, 0xca, |
||||
0xc6, 0xcb, 0x9a, 0xcc, 0x7b, 0xcd, 0x54, 0xce, 0x32, 0xcf, 0x09, 0xd0, |
||||
0xd7, 0xd0, 0xc9, 0xd1, 0xc1, 0xd2, 0xb8, 0xd3, 0xb6, 0xd4, 0xae, 0xd5, |
||||
0xbc, 0xd6, 0xca, 0xd7, 0xd2, 0xd8, 0xca, 0xd9, 0xbd, 0xda, 0xc8, 0xdb, |
||||
0xd8, 0xdc, 0xf9, 0xdd, 0x08, 0xdf, 0x1e, 0xe0, 0x39, 0xe1, 0x4e, 0xe2, |
||||
0x60, 0xe3, 0x7a, 0xe4, 0x96, 0xe5, 0xc1, 0xe6, 0xde, 0xe7, 0x0e, 0xe9, |
||||
0x2a, 0xea, 0x42, 0xeb, 0x7a, 0xec, 0x9f, 0xed, 0xbb, 0xee, 0xd6, 0xef, |
||||
0xef, 0xf0, 0x0e, 0xf2, 0x30, 0xf3, 0x55, 0xf4, 0x68, 0xf5, 0x7e, 0xf6, |
||||
0xa4, 0xf7, 0xc0, 0xf8, 0xea, 0xf9, 0x10, 0xfb, 0x41, 0xfc, 0x7d, 0xfd, |
||||
0xad, 0xfe, 0xe3, 0xff, 0x10, 0x01, 0x27, 0x02, 0x58, 0x03, 0x74, 0x04, |
||||
0xa4, 0x05, 0xd5, 0x06, 0x0b, 0x08, 0x36, 0x09, 0x5c, 0x0a, 0x76, 0x0b, |
||||
0x9a, 0x0c, 0xc1, 0x0d, 0xd8, 0x0e, 0xf5, 0x0f, 0x15, 0x11, 0x3f, 0x12, |
||||
0x70, 0x13, 0x8e, 0x14, 0xcc, 0x15, 0xf2, 0x16, 0x31, 0x18, 0x4b, 0x19, |
||||
0x82, 0x1a, 0xa1, 0x1b, 0xbc, 0x1c, 0xde, 0x1d, 0xe9, 0x1e, 0x13, 0x20, |
||||
0x33, 0x21, 0x6c, 0x22, 0x80, 0x23, 0xa7, 0x24, 0xbc, 0x25, 0xde, 0x26, |
||||
0xe7, 0x27, 0x07, 0x29, 0x28, 0x2a, 0x36, 0x2b, 0x4d, 0x2c, 0x71, 0x2d, |
||||
0x91, 0x2e, 0xbe, 0x2f, 0xd6, 0x30, 0xfb, 0x31, 0x20, 0x33, 0x46, 0x34, |
||||
0x59, 0x35, 0x7a, 0x36, 0xa1, 0x37, 0xc2, 0x38, 0xdf, 0x39, 0x01, 0x3b, |
||||
0x0f, 0x3c, 0x27, 0x3d, 0x1f, 0x3e, 0x2e, 0x3f, 0x43, 0x40, 0x5b, 0x41, |
||||
0x73, 0x42, 0x8e, 0x43, 0xaf, 0x44, 0xbc, 0x45, 0xcc, 0x46, 0xd8, 0x47, |
||||
0xec, 0x48, 0xe1, 0x49, 0xd1, 0x4a, 0xc4, 0x4b, 0xb6, 0x4c, 0xa9, 0x4d, |
||||
0x9d, 0x4e, 0x88, 0x4f, 0x75, 0x50, 0x4c, 0x51, 0x3b, 0x52, 0x05, 0x53, |
||||
0xd9, 0x53, 0xa1, 0x54, 0x6f, 0x55, 0x33, 0x56, 0xe5, 0x56, 0x7d, 0x57, |
||||
0x15, 0x58, 0xb3, 0x58, 0x4e, 0x59, 0xdb, 0x59, 0x55, 0x5a, 0xc8, 0x5a, |
||||
0x36, 0x5b, 0xa9, 0x5b, 0x09, 0x5c, 0x5a, 0x5c, 0xab, 0x5c, 0xf1, 0x5c, |
||||
0x34, 0x5d, 0x6a, 0x5d, 0x9e, 0x5d, 0xc1, 0x5d, 0xea, 0x5d, 0x0b, 0x5e, |
||||
0x28, 0x5e, 0x3d, 0x5e, 0x41, 0x5e, 0x51, 0x5e, 0x5f, 0x5e, 0x69, 0x5e, |
||||
0x79, 0x5e, 0x6a, 0x5e, 0x78, 0x5e, 0x76, 0x5e, 0x7f, 0x5e, 0x72, 0x5e, |
||||
0x70, 0x5e, 0x61, 0x5e, 0x61, 0x5e, 0x42, 0x5e, 0x36, 0x5e, 0x2f, 0x5e, |
||||
0x2c, 0x5e, 0x1a, 0x5e, 0xec, 0x5d, 0xbf, 0x5d, 0x94, 0x5d, 0x71, 0x5d, |
||||
0x4c, 0x5d, 0x24, 0x5d, 0xfa, 0x5c, 0xc3, 0x5c, 0x8c, 0x5c, 0x59, 0x5c, |
||||
0x3e, 0x5c, 0x0c, 0x5c, 0xd3, 0x5b, 0xb1, 0x5b, 0x78, 0x5b, 0x45, 0x5b, |
||||
0x14, 0x5b, 0xed, 0x5a, 0xc0, 0x5a, 0x89, 0x5a, 0x4f, 0x5a, 0x16, 0x5a, |
||||
0xe5, 0x59, 0xb5, 0x59, 0x84, 0x59, 0x4e, 0x59, 0x0d, 0x59, 0xcf, 0x58, |
||||
0xa6, 0x58, 0x79, 0x58, 0x3e, 0x58, 0xf8, 0x57, 0xc0, 0x57, 0x83, 0x57, |
||||
0x38, 0x57, 0x03, 0x57, 0xc1, 0x56, 0x65, 0x56, 0xe0, 0x55, 0x52, 0x55, |
||||
0xd0, 0x54, 0x4c, 0x54, 0xbe, 0x53, 0x32, 0x53, 0xa7, 0x52, 0x2a, 0x52, |
||||
0x95, 0x51, 0x09, 0x51, 0x76, 0x50, 0xe9, 0x4f, 0x69, 0x4f, 0xe2, 0x4e, |
||||
0x49, 0x4e, 0xc0, 0x4d, 0x38, 0x4d, 0xbd, 0x4c, 0x2d, 0x4c, 0x98, 0x4b, |
||||
0x07, 0x4b, 0x76, 0x4a, 0xdc, 0x49, 0x4a, 0x49, 0xb9, 0x48, 0x2d, 0x48, |
||||
0x9c, 0x47, 0x19, 0x47, 0x80, 0x46, 0xf9, 0x45, 0x66, 0x45, 0xd6, 0x44, |
||||
0x47, 0x44, 0xb5, 0x43, 0x14, 0x43, 0x74, 0x42, 0xd4, 0x41, 0x42, 0x41, |
||||
0xa4, 0x40, 0x18, 0x40, 0x85, 0x3f, 0xeb, 0x3e, 0x52, 0x3e, 0xb2, 0x3d, |
||||
0x0c, 0x3d, 0x7a, 0x3c, 0xdb, 0x3b, 0x3a, 0x3b, 0x87, 0x3a, 0xe0, 0x39, |
||||
0x29, 0x39, 0x88, 0x38, 0xd1, 0x37, 0x16, 0x37, 0x4d, 0x36, 0x9e, 0x35, |
||||
0xdc, 0x34, 0x19, 0x34, 0x4a, 0x33, 0x83, 0x32, 0xb7, 0x31, 0xec, 0x30, |
||||
0x1c, 0x30, 0x47, 0x2f, 0x71, 0x2e, 0x88, 0x2d, 0xa6, 0x2c, 0xbb, 0x2b, |
||||
0xd0, 0x2a, 0xd8, 0x29, 0xdb, 0x28, 0xe3, 0x27, 0xf5, 0x26, 0xf1, 0x25, |
||||
0xf8, 0x24, 0xdc, 0x23, 0xdb, 0x22, 0xca, 0x21, 0xa7, 0x20, 0x85, 0x1f, |
||||
0x5a, 0x1e, 0x30, 0x1d, 0x0a, 0x1c, 0xd5, 0x1a, 0xa6, 0x19, 0x6d, 0x18, |
||||
0x3d, 0x17, 0xff, 0x15, 0xbf, 0x14, 0x81, 0x13, 0x57, 0x12, 0x15, 0x11, |
||||
0xe0, 0x0f, 0xa2, 0x0e, 0x65, 0x0d, 0x27, 0x0c, 0xf1, 0x0a, 0xb2, 0x09, |
||||
0x77, 0x08, 0x4b, 0x07, 0x0a, 0x06, 0xc9, 0x04, 0x97, 0x03, 0x65, 0x02, |
||||
0x3b, 0x01, 0x03, 0x00, 0xd2, 0xfe, 0x95, 0xfd, 0x6f, 0xfc, 0x50, 0xfb, |
||||
0x19, 0xfa, 0xf0, 0xf8, 0xb8, 0xf7, 0x97, 0xf6, 0x65, 0xf5, 0x48, 0xf4, |
||||
0x24, 0xf3, 0xfe, 0xf1, 0xec, 0xf0, 0xd2, 0xef, 0xa9, 0xee, 0x95, 0xed, |
||||
0x76, 0xec, 0x64, 0xeb, 0x61, 0xea, 0x43, 0xe9, 0x3a, 0xe8, 0x21, 0xe7, |
||||
0x14, 0xe6, 0xff, 0xe4, 0x06, 0xe4, 0x04, 0xe3, 0x04, 0xe2, 0x01, 0xe1, |
||||
0x02, 0xe0, 0x04, 0xdf, 0x16, 0xde, 0x1f, 0xdd, 0x29, 0xdc, 0x2d, 0xdb, |
||||
0x3d, 0xda, 0x45, 0xd9, 0x5a, 0xd8, 0x6f, 0xd7, 0x74, 0xd6, 0x8a, 0xd5, |
||||
0x91, 0xd4, 0xa5, 0xd3, 0xbb, 0xd2, 0xdb, 0xd1, 0x01, 0xd1, 0x17, 0xd0, |
||||
0x42, 0xcf, 0x5e, 0xce, 0x94, 0xcd, 0xb1, 0xcc, 0xe8, 0xcb, 0x04, 0xcb, |
||||
0x29, 0xca, 0x4e, 0xc9, 0x78, 0xc8, 0x99, 0xc7, 0xc4, 0xc6, 0xff, 0xc5, |
||||
0x3d, 0xc5, 0x76, 0xc4, 0xa6, 0xc3, 0xe4, 0xc2, 0x17, 0xc2, 0x4e, 0xc1, |
||||
0x8a, 0xc0, 0xc5, 0xbf, 0x0b, 0xbf, 0x42, 0xbe, 0x8e, 0xbd, 0xd8, 0xbc, |
||||
0x20, 0xbc, 0x60, 0xbb, 0xbb, 0xba, 0x08, 0xba, 0x5a, 0xb9, 0xba, 0xb8, |
||||
0x08, 0xb8, 0x64, 0xb7, 0xb1, 0xb6, 0x0c, 0xb6, 0x5d, 0xb5, 0xbf, 0xb4, |
||||
0x10, 0xb4, 0x7b, 0xb3, 0xd0, 0xb2, 0x3d, 0xb2, 0xa1, 0xb1, 0x0f, 0xb1, |
||||
0x84, 0xb0, 0xf2, 0xaf, 0x63, 0xaf, 0xd3, 0xae, 0x50, 0xae, 0xbd, 0xad, |
||||
0x49, 0xad, 0xc1, 0xac, 0x4d, 0xac, 0xc6, 0xab, 0x56, 0xab, 0xe4, 0xaa, |
||||
0x83, 0xaa, 0x0d, 0xaa, 0xac, 0xa9, 0x49, 0xa9, 0xf3, 0xa8, 0x9e, 0xa8, |
||||
0x4e, 0xa8, 0x07, 0xa8, 0xc5, 0xa7, 0x8d, 0xa7, 0x56, 0xa7, 0x1d, 0xa7, |
||||
0xf6, 0xa6, 0xc7, 0xa6, 0xad, 0xa6, 0x8c, 0xa6, 0x74, 0xa6, 0x58, 0xa6, |
||||
0x47, 0xa6, 0x2d, 0xa6, 0x24, 0xa6, 0x23, 0xa6, 0x21, 0xa6, 0x19, 0xa6, |
||||
0x20, 0xa6, 0x1f, 0xa6, 0x28, 0xa6, 0x3c, 0xa6, 0x4e, 0xa6, 0x59, 0xa6, |
||||
0x6e, 0xa6, 0x84, 0xa6, 0x9a, 0xa6, 0xb7, 0xa6, 0xd4, 0xa6, 0xef, 0xa6, |
||||
0x0a, 0xa7, 0x2f, 0xa7, 0x53, 0xa7, 0x77, 0xa7, 0x9c, 0xa7, 0xbc, 0xa7, |
||||
0xe5, 0xa7, 0x10, 0xa8, 0x35, 0xa8, 0x6d, 0xa8, 0x9b, 0xa8, 0xcb, 0xa8, |
||||
0xf5, 0xa8, 0x23, 0xa9, 0x5a, 0xa9, 0x80, 0xa9, 0xb7, 0xa9, 0xee, 0xa9, |
||||
0x1c, 0xaa, 0x46, 0xaa, 0x78, 0xaa, 0xb2, 0xaa, 0xeb, 0xaa, 0x1a, 0xab, |
||||
0x57, 0xab, 0x84, 0xab, 0xba, 0xab, 0xef, 0xab, 0x22, 0xac, 0x55, 0xac, |
||||
0x88, 0xac, 0xc1, 0xac, 0xf5, 0xac, 0x2a, 0xad, 0x67, 0xad, 0x9f, 0xad, |
||||
0xe0, 0xad, 0x14, 0xae, 0x4c, 0xae, 0x82, 0xae, 0xb8, 0xae, 0xf8, 0xae, |
||||
0x2c, 0xaf, 0x6a, 0xaf, 0x9d, 0xaf, 0xd4, 0xaf, 0x05, 0xb0, 0x38, 0xb0, |
||||
0x77, 0xb0, 0xb2, 0xb0, 0xf8, 0xb0, 0x3c, 0xb1, 0x97, 0xb1, 0x05, 0xb2, |
||||
0x6f, 0xb2, 0xdf, 0xb2, 0x48, 0xb3, 0xb2, 0xb3, 0x16, 0xb4, 0x7b, 0xb4, |
||||
0xe5, 0xb4, 0x54, 0xb5, 0xc3, 0xb5, 0x26, 0xb6, 0x97, 0xb6, 0x03, 0xb7, |
||||
0x68, 0xb7, 0xce, 0xb7, 0x44, 0xb8, 0xae, 0xb8, 0x20, 0xb9, 0x87, 0xb9, |
||||
0xf1, 0xb9, 0x5d, 0xba, 0xc6, 0xba, 0x24, 0xbb, 0xa1, 0xbb, 0x05, 0xbc, |
||||
0x79, 0xbc, 0xdc, 0xbc, 0x4b, 0xbd, 0xba, 0xbd, 0x24, 0xbe, 0x9b, 0xbe, |
||||
0x07, 0xbf, 0x72, 0xbf, 0xe5, 0xbf, 0x46, 0xc0, 0xc3, 0xc0, 0x1f, 0xc1, |
||||
0x91, 0xc1, 0x01, 0xc2, 0x79, 0xc2, 0xf1, 0xc2, 0x66, 0xc3, 0xe5, 0xc3, |
||||
0x55, 0xc4, 0xc8, 0xc4, 0x3e, 0xc5, 0xb3, 0xc5, 0x2d, 0xc6, 0xa7, 0xc6, |
||||
0x27, 0xc7, 0x97, 0xc7, 0x1f, 0xc8, 0xa0, 0xc8, 0x29, 0xc9, 0xad, 0xc9, |
||||
0x36, 0xca, 0xad, 0xca, 0x3d, 0xcb, 0xc0, 0xcb, 0x47, 0xcc, 0xe9, 0xcc, |
||||
0x6f, 0xcd, 0x06, 0xce, 0x84, 0xce, 0x1a, 0xcf, 0xbb, 0xcf, 0x55, 0xd0, |
||||
0xf6, 0xd0, 0x8b, 0xd1, 0x30, 0xd2, 0xd2, 0xd2, 0x79, 0xd3, 0x1c, 0xd4, |
||||
0xcf, 0xd4, 0x83, 0xd5, 0x36, 0xd6, 0xe1, 0xd6, 0x96, 0xd7, 0x5f, 0xd8, |
||||
0x1c, 0xd9, 0xe2, 0xd9, 0xa8, 0xda, 0x6c, 0xdb, 0x43, 0xdc, 0x04, 0xdd, |
||||
0xd8, 0xdd, 0xac, 0xde, 0x8a, 0xdf, 0x5b, 0xe0, 0x39, 0xe1, 0x0b, 0xe2, |
||||
0xf5, 0xe2, 0xde, 0xe3, 0xbc, 0xe4, 0x9e, 0xe5, 0x83, 0xe6, 0x62, 0xe7, |
||||
0x51, 0xe8, 0x34, 0xe9, 0x1e, 0xea, 0x12, 0xeb, 0xf7, 0xeb, 0xe5, 0xec, |
||||
0xc5, 0xed, 0xc2, 0xee, 0xb1, 0xef, 0xa6, 0xf0, 0x90, 0xf1, 0x7e, 0xf2, |
||||
0x6f, 0xf3, 0x56, 0xf4, 0x48, 0xf5, 0x35, 0xf6, 0x29, 0xf7, 0x17, 0xf8, |
||||
0x0a, 0xf9, 0x00, 0xfa, 0xe7, 0xfa, 0xde, 0xfb, 0xc9, 0xfc, 0xc1, 0xfd, |
||||
0xac, 0xfe, 0xae, 0xff, 0xa2, 0x00, 0x8d, 0x01, 0x70, 0x02, 0x62, 0x03, |
||||
0x4e, 0x04, 0x3a, 0x05, 0x26, 0x06, 0x16, 0x07, 0xff, 0x07, 0xf3, 0x08, |
||||
0xda, 0x09, 0xbe, 0x0a, 0xb9, 0x0b, 0xa1, 0x0c, 0x9b, 0x0d, 0x7d, 0x0e, |
||||
0x66, 0x0f, 0x54, 0x10, 0x36, 0x11, 0x20, 0x12, 0x11, 0x13, 0xf3, 0x13, |
||||
0xea, 0x14, 0xd1, 0x15, 0xb6, 0x16, 0x9b, 0x17, 0x83, 0x18, 0x7f, 0x19, |
||||
0x58, 0x1a, 0x53, 0x1b, 0x37, 0x1c, 0x22, 0x1d, 0x0a, 0x1e, 0xf3, 0x1e, |
||||
0xda, 0x1f, 0xca, 0x20, 0xb1, 0x21, 0x96, 0x22, 0x70, 0x23, 0x55, 0x24, |
||||
0x39, 0x25, 0x39, 0x26, 0x1a, 0x27, 0x07, 0x28, 0xe1, 0x28, 0xc5, 0x29, |
||||
0xa7, 0x2a, 0x85, 0x2b, 0x70, 0x2c, 0x4e, 0x2d, 0x3e, 0x2e, 0x19, 0x2f, |
||||
0xf3, 0x2f, 0xdf, 0x30, 0xc0, 0x31, 0xaf, 0x32, 0x93, 0x33, 0x77, 0x34, |
||||
0x48, 0x35, 0x2a, 0x36, 0x0f, 0x37, 0xf8, 0x37, 0xd9, 0x38, 0xbe, 0x39, |
||||
0x8b, 0x3a, 0x74, 0x3b, 0x48, 0x3c, 0x2d, 0x3d, 0xfa, 0x3d, 0xe7, 0x3e, |
||||
0xb0, 0x3f, 0x98, 0x40, 0x67, 0x41, 0x3a, 0x42, 0x16, 0x43, 0xf4, 0x43, |
||||
0xd8, 0x44, 0xa4, 0x45, 0x7c, 0x46, 0x4c, 0x47, 0x2a, 0x48, 0x06, 0x49, |
||||
0xce, 0x49, 0xa5, 0x4a, 0x77, 0x4b, 0x4e, 0x4c, 0x13, 0x4d, 0xdf, 0x4d, |
||||
0xaa, 0x4e, 0x74, 0x4f, 0x3d, 0x50, 0xfc, 0x50, 0xbd, 0x51, 0x8c, 0x52, |
||||
0x3e, 0x53, 0xfe, 0x53, 0x99, 0x54, 0x57, 0x55, 0xfc, 0x55, 0xab, 0x56, |
||||
0x45, 0x57, 0xd6, 0x57, 0x87, 0x58, 0x2f, 0x59, 0xbf, 0x59, 0x48, 0x5a, |
||||
0xc7, 0x5a, 0x54, 0x5b, 0xc8, 0x5b, 0x45, 0x5c, 0xb4, 0x5c, 0x25, 0x5d, |
||||
0x7e, 0x5d, 0xda, 0x5d, 0x36, 0x5e, 0xa5, 0x5e, 0xe9, 0x5e, 0x37, 0x5f, |
||||
0x72, 0x5f, 0xab, 0x5f, 0xe5, 0x5f, 0x1d, 0x60, 0x4f, 0x60, 0x81, 0x60, |
||||
0x9c, 0x60, 0xc3, 0x60, 0xdc, 0x60, 0xf7, 0x60, 0x04, 0x61, 0x16, 0x61, |
||||
0x1b, 0x61, 0x21, 0x61, 0x20, 0x61, 0x0d, 0x61, 0x0b, 0x61, 0xf0, 0x60, |
||||
0xe5, 0x60, 0xc7, 0x60, 0xb3, 0x60, 0x98, 0x60, 0x7c, 0x60, 0x59, 0x60, |
||||
0x4c, 0x60, 0x24, 0x60, 0x0d, 0x60, 0xdf, 0x5f, 0xb7, 0x5f, 0x87, 0x5f, |
||||
0x6b, 0x5f, 0x44, 0x5f, 0x28, 0x5f, 0xf5, 0x5e, 0xbd, 0x5e, 0x8f, 0x5e, |
||||
0x5c, 0x5e, 0x2a, 0x5e, 0xfe, 0x5d, 0xcd, 0x5d, 0xa4, 0x5d, 0x75, 0x5d, |
||||
0x4d, 0x5d, 0x11, 0x5d, 0xdf, 0x5c, 0xa9, 0x5c, 0x78, 0x5c, 0x42, 0x5c, |
||||
0x13, 0x5c, 0xde, 0x5b, 0xaf, 0x5b, 0x75, 0x5b, 0x3e, 0x5b, 0xfd, 0x5a, |
||||
0xbc, 0x5a, 0x90, 0x5a, 0x54, 0x5a, 0x1f, 0x5a, 0xe5, 0x59, 0xc2, 0x59, |
||||
0x80, 0x59, 0x39, 0x59, 0x0a, 0x59, 0xd6, 0x58, 0x96, 0x58, 0x55, 0x58, |
||||
0x1e, 0x58, 0xf1, 0x57, 0xc8, 0x57, 0x7e, 0x57, 0x44, 0x57, 0x11, 0x57, |
||||
0xd4, 0x56, 0x93, 0x56, 0x4c, 0x56, 0x11, 0x56, 0xd7, 0x55, 0xae, 0x55, |
||||
0x72, 0x55, 0x3c, 0x55, 0x0c, 0x55, 0xd1, 0x54, 0x98, 0x54, 0x63, 0x54, |
||||
0x2b, 0x54, 0xf8, 0x53, 0xc6, 0x53, 0x81, 0x53, 0x4b, 0x53, 0x19, 0x53, |
||||
0xea, 0x52, 0xb2, 0x52, 0x7e, 0x52, 0x30, 0x52, 0xc5, 0x51, 0x46, 0x51, |
||||
0xca, 0x50, 0x55, 0x50, 0xd7, 0x4f, 0x5d, 0x4f, 0xe4, 0x4e, 0x79, 0x4e, |
||||
0xfb, 0x4d, 0x83, 0x4d, 0x02, 0x4d, 0x8a, 0x4c, 0x1f, 0x4c, 0x98, 0x4b, |
||||
0x20, 0x4b, 0xa7, 0x4a, 0x36, 0x4a, 0xc0, 0x49, 0x44, 0x49, 0xc3, 0x48, |
||||
0x44, 0x48, 0xd5, 0x47, 0x59, 0x47, 0xe6, 0x46, 0x63, 0x46, 0xf8, 0x45, |
||||
0x79, 0x45, 0xfa, 0x44, 0x80, 0x44, 0x01, 0x44, 0x7a, 0x43, 0x04, 0x43, |
||||
0x85, 0x42, 0x07, 0x42, 0x92, 0x41, 0x17, 0x41, 0x94, 0x40, 0x16, 0x40, |
||||
0x9f, 0x3f, 0x20, 0x3f, 0x9c, 0x3e, 0x29, 0x3e, 0x9c, 0x3d, 0x20, 0x3d, |
||||
0x88, 0x3c, 0x0c, 0x3c, 0x87, 0x3b, 0x07, 0x3b, 0x89, 0x3a, 0xfb, 0x39, |
||||
0x6f, 0x39, 0xe7, 0x38, 0x55, 0x38, 0xcf, 0x37, 0x43, 0x37, 0xb5, 0x36, |
||||
0x2a, 0x36, 0x9c, 0x35, 0x0a, 0x35, 0x83, 0x34, 0xe6, 0x33, 0x53, 0x33, |
||||
0xba, 0x32, 0x1d, 0x32, 0x78, 0x31, 0xcb, 0x30, 0x34, 0x30, 0x8e, 0x2f, |
||||
0xf6, 0x2e, 0x56, 0x2e, 0xab, 0x2d, 0xfe, 0x2c, 0x4c, 0x2c, 0x9f, 0x2b, |
||||
0xed, 0x2a, 0x36, 0x2a, 0x7b, 0x29, 0xb9, 0x28, 0x02, 0x28, 0x41, 0x27, |
||||
0x81, 0x26, 0xb9, 0x25, 0xfb, 0x24, 0x2d, 0x24, 0x66, 0x23, 0x98, 0x22, |
||||
0xc6, 0x21, 0xe9, 0x20, 0x0d, 0x20, 0x28, 0x1f, 0x4c, 0x1e, 0x64, 0x1d, |
||||
0x66, 0x1c, 0x8c, 0x1b, 0x96, 0x1a, 0xac, 0x19, 0xb2, 0x18, 0xbb, 0x17, |
||||
0xc2, 0x16, 0xc7, 0x15, 0xcb, 0x14, 0xcd, 0x13, 0xc4, 0x12, 0xca, 0x11, |
||||
0xb6, 0x10, 0xb8, 0x0f, 0xa3, 0x0e, 0x9e, 0x0d, 0x88, 0x0c, 0x86, 0x0b, |
||||
0x7b, 0x0a, 0x7c, 0x09, 0x6d, 0x08, 0x5b, 0x07, 0x4a, 0x06, 0x38, 0x05, |
||||
0x2f, 0x04, 0x1c, 0x03, 0x10, 0x02, 0xf6, 0x00, 0xe9, 0xff, 0xe5, 0xfe, |
||||
0xcf, 0xfd, 0xc8, 0xfc, 0xb1, 0xfb, 0xa7, 0xfa, 0x8d, 0xf9, 0x7b, 0xf8, |
||||
0x7e, 0xf7, 0x77, 0xf6, 0x68, 0xf5, 0x62, 0xf4, 0x49, 0xf3, 0x42, 0xf2, |
||||
0x41, 0xf1, 0x3e, 0xf0, 0x49, 0xef, 0x47, 0xee, 0x56, 0xed, 0x46, 0xec, |
||||
0x56, 0xeb, 0x5c, 0xea, 0x6c, 0xe9, 0x7d, 0xe8, 0x9c, 0xe7, 0x99, 0xe6, |
||||
0xbf, 0xe5, 0xc9, 0xe4, 0xe5, 0xe3, 0xfd, 0xe2, 0x17, 0xe2, 0x26, 0xe1, |
||||
0x44, 0xe0, 0x6d, 0xdf, 0x9f, 0xde, 0xc5, 0xdd, 0xec, 0xdc, 0x26, 0xdc, |
||||
0x58, 0xdb, 0x91, 0xda, 0xb7, 0xd9, 0xf5, 0xd8, 0x27, 0xd8, 0x63, 0xd7, |
||||
0x96, 0xd6, 0xd5, 0xd5, 0x1a, 0xd5, 0x52, 0xd4, 0x9d, 0xd3, 0xde, 0xd2, |
||||
0x27, 0xd2, 0x6c, 0xd1, 0xb3, 0xd0, 0xf6, 0xcf, 0x51, 0xcf, 0x98, 0xce, |
||||
0xe9, 0xcd, 0x2f, 0xcd, 0x88, 0xcc, 0xdc, 0xcb, 0x41, 0xcb, 0x9f, 0xca, |
||||
0x01, 0xca, 0x60, 0xc9, 0xc4, 0xc8, 0x13, 0xc8, 0x7e, 0xc7, 0xe2, 0xc6, |
||||
0x51, 0xc6, 0xb6, 0xc5, 0x1a, 0xc5, 0x8e, 0xc4, 0xf6, 0xc3, 0x74, 0xc3, |
||||
0xdf, 0xc2, 0x59, 0xc2, 0xd2, 0xc1, 0x47, 0xc1, 0xbe, 0xc0, 0x3b, 0xc0, |
||||
0xbe, 0xbf, 0x3e, 0xbf, 0xc4, 0xbe, 0x39, 0xbe, 0xbf, 0xbd, 0x3e, 0xbd, |
||||
0xd7, 0xbc, 0x5d, 0xbc, 0xec, 0xbb, 0x73, 0xbb, 0x07, 0xbb, 0x96, 0xba, |
||||
0x24, 0xba, 0xb5, 0xb9, 0x49, 0xb9, 0xdd, 0xb8, 0x76, 0xb8, 0x02, 0xb8, |
||||
0xa8, 0xb7, 0x3c, 0xb7, 0xee, 0xb6, 0x82, 0xb6, 0x2b, 0xb6, 0xc3, 0xb5, |
||||
0x6e, 0xb5, 0x14, 0xb5, 0xc4, 0xb4, 0x6b, 0xb4, 0x20, 0xb4, 0xd2, 0xb3, |
||||
0x78, 0xb3, 0x2c, 0xb3, 0xe6, 0xb2, 0x9e, 0xb2, 0x58, 0xb2, 0x1a, 0xb2, |
||||
0xea, 0xb1, 0xa6, 0xb1, 0x63, 0xb1, 0x2b, 0xb1, 0xf3, 0xb0, 0xb8, 0xb0, |
||||
0x7b, 0xb0, 0x4e, 0xb0, 0x20, 0xb0, 0xf9, 0xaf, 0xc6, 0xaf, 0xa2, 0xaf, |
||||
0x84, 0xaf, 0x5e, 0xaf, 0x44, 0xaf, 0x21, 0xaf, 0x06, 0xaf, 0xe9, 0xae, |
||||
0xe2, 0xae, 0xd0, 0xae, 0xc3, 0xae, 0xba, 0xae, 0xc1, 0xae, 0xaf, 0xae, |
||||
0xbc, 0xae, 0xb5, 0xae, 0xc0, 0xae, 0xc3, 0xae, 0xd7, 0xae, 0xdd, 0xae, |
||||
0xfb, 0xae, 0x0a, 0xaf, 0x16, 0xaf, 0x37, 0xaf, 0x4a, 0xaf, 0x70, 0xaf, |
||||
0x86, 0xaf, 0xa9, 0xaf, 0xc7, 0xaf, 0xec, 0xaf, 0x12, 0xb0, 0x42, 0xb0, |
||||
0x66, 0xb0, 0x91, 0xb0, 0xc0, 0xb0, 0xee, 0xb0, 0x1a, 0xb1, 0x4c, 0xb1, |
||||
0x77, 0xb1, 0xb3, 0xb1, 0xdd, 0xb1, 0x10, 0xb2, 0x47, 0xb2, 0x70, 0xb2, |
||||
0xb8, 0xb2, 0xef, 0xb2, 0x26, 0xb3, 0x64, 0xb3, 0x90, 0xb3, 0xd8, 0xb3, |
||||
0x07, 0xb4, 0x4b, 0xb4, 0x83, 0xb4, 0xc7, 0xb4, 0xf4, 0xb4, 0x35, 0xb5, |
||||
0x70, 0xb5, 0xbc, 0xb5, 0xf0, 0xb5, 0x39, 0xb6, 0x7d, 0xb6, 0xb7, 0xb6, |
||||
0xfa, 0xb6, 0x2e, 0xb7, 0x7d, 0xb7, 0xbb, 0xb7, 0x01, 0xb8, 0x39, 0xb8, |
||||
0x80, 0xb8, 0xbd, 0xb8, 0x05, 0xb9, 0x46, 0xb9, 0x94, 0xb9, 0xcd, 0xb9, |
||||
0x17, 0xba, 0x5b, 0xba, 0x9e, 0xba, 0xdf, 0xba, 0x27, 0xbb, 0x6a, 0xbb, |
||||
0xbc, 0xbb, 0xf6, 0xbb, 0x3a, 0xbc, 0x83, 0xbc, 0xc3, 0xbc, 0x16, 0xbd, |
||||
0x58, 0xbd, 0xa2, 0xbd, 0xe0, 0xbd, 0x24, 0xbe, 0x70, 0xbe, 0xa1, 0xbe, |
||||
0xfa, 0xbe, 0x37, 0xbf, 0x8d, 0xbf, 0xc9, 0xbf, 0x1d, 0xc0, 0x5d, 0xc0, |
||||
0xa6, 0xc0, 0xe6, 0xc0, 0x2f, 0xc1, 0x7a, 0xc1, 0xcb, 0xc1, 0x2f, 0xc2, |
||||
0x95, 0xc2, 0xfa, 0xc2, 0x55, 0xc3, 0xbb, 0xc3, 0x1e, 0xc4, 0x86, 0xc4, |
||||
0xec, 0xc4, 0x4b, 0xc5, 0xab, 0xc5, 0x04, 0xc6, 0x72, 0xc6, 0xc6, 0xc6, |
||||
0x3a, 0xc7, 0x8e, 0xc7, 0xfd, 0xc7, 0x5a, 0xc8, 0xc0, 0xc8, 0x17, 0xc9, |
||||
0x79, 0xc9, 0xd5, 0xc9, 0x43, 0xca, 0x98, 0xca, 0x05, 0xcb, 0x64, 0xcb, |
||||
0xc3, 0xcb, 0x1e, 0xcc, 0x81, 0xcc, 0xe3, 0xcc, 0x40, 0xcd, 0xa6, 0xcd, |
||||
0x0a, 0xce, 0x6a, 0xce, 0xc0, 0xce, 0x26, 0xcf, 0x81, 0xcf, 0xf0, 0xcf, |
||||
0x48, 0xd0, 0xad, 0xd0, 0x07, 0xd1, 0x71, 0xd1, 0xca, 0xd1, 0x2b, 0xd2, |
||||
0x8a, 0xd2, 0xed, 0xd2, 0x50, 0xd3, 0xa1, 0xd3, 0x0f, 0xd4, 0x6f, 0xd4, |
||||
0xd6, 0xd4, 0x30, 0xd5, 0x93, 0xd5, 0xf6, 0xd5, 0x55, 0xd6, 0xb5, 0xd6, |
||||
0x12, 0xd7, 0x7b, 0xd7, 0xde, 0xd7, 0x34, 0xd8, 0x93, 0xd8, 0xe9, 0xd8, |
||||
0x61, 0xd9, 0xbb, 0xd9, 0x2b, 0xda, 0x88, 0xda, 0xeb, 0xda, 0x4f, 0xdb, |
||||
0xb9, 0xdb, 0x21, 0xdc, 0x80, 0xdc, 0xf7, 0xdc, 0x53, 0xdd, 0xbb, 0xdd, |
||||
0x2b, 0xde, 0xa4, 0xde, 0x05, 0xdf, 0x74, 0xdf, 0xd8, 0xdf, 0x44, 0xe0, |
||||
0xb4, 0xe0, 0x26, 0xe1, 0x91, 0xe1, 0x01, 0xe2, 0x77, 0xe2, 0xeb, 0xe2, |
||||
0x5e, 0xe3, 0xc7, 0xe3, 0x44, 0xe4, 0xb2, 0xe4, 0x25, 0xe5, 0xa3, 0xe5, |
||||
0x15, 0xe6, 0x97, 0xe6, 0x0b, 0xe7, 0x8b, 0xe7, 0x10, 0xe8, 0x7d, 0xe8, |
||||
0x06, 0xe9, 0x74, 0xe9, 0xff, 0xe9, 0x82, 0xea, 0x01, 0xeb, 0x85, 0xeb, |
||||
0xfa, 0xeb, 0x91, 0xec, 0x07, 0xed, 0x8f, 0xed, 0x15, 0xee, 0x9a, 0xee, |
||||
0x26, 0xef, 0xa5, 0xef, 0x26, 0xf0, 0xb2, 0xf0, 0x3e, 0xf1, 0xca, 0xf1, |
||||
0x45, 0xf2, 0xcc, 0xf2, 0x51, 0xf3, 0xdc, 0xf3, 0x5c, 0xf4, 0xe8, 0xf4, |
||||
0x6e, 0xf5, 0xf9, 0xf5, 0x79, 0xf6, 0xf9, 0xf6, 0x7d, 0xf7, 0x08, 0xf8, |
||||
0x91, 0xf8, 0x18, 0xf9, 0x95, 0xf9, 0x18, 0xfa, 0xa5, 0xfa, 0x21, 0xfb, |
||||
0xa9, 0xfb, 0x2a, 0xfc, 0xa7, 0xfc, 0x23, 0xfd, 0xa3, 0xfd, 0x2b, 0xfe, |
||||
0x9c, 0xfe, 0x2b, 0xff, 0xa0, 0xff, 0x1c, 0x00, 0x9a, 0x00, 0x11, 0x01, |
||||
0x9a, 0x01, 0x14, 0x02, 0x8c, 0x02, 0x07, 0x03, 0x84, 0x03, 0xf7, 0x03, |
||||
0x75, 0x04, 0xf3, 0x04, 0x65, 0x05, 0xe8, 0x05, 0x54, 0x06, 0xd3, 0x06, |
||||
0x48, 0x07, 0xc2, 0x07, 0x38, 0x08, 0xad, 0x08, 0x28, 0x09, 0x99, 0x09, |
||||
0x11, 0x0a, 0x79, 0x0a, 0xf5, 0x0a, 0x5c, 0x0b, 0xd1, 0x0b, 0x3f, 0x0c, |
||||
0xb5, 0x0c, 0x2c, 0x0d, 0x9a, 0x0d, 0x0b, 0x0e, 0x74, 0x0e, 0xe6, 0x0e, |
||||
0x45, 0x0f, 0xbd, 0x0f, 0x2f, 0x10, 0x9a, 0x10, 0x05, 0x11, 0x6c, 0x11, |
||||
0xdb, 0x11, 0x40, 0x12, 0xaa, 0x12, 0x14, 0x13, 0x81, 0x13, 0xe9, 0x13, |
||||
0x4d, 0x14, 0xb9, 0x14, 0x18, 0x15, 0x88, 0x15, 0xe6, 0x15, 0x58, 0x16, |
||||
0xb9, 0x16, 0x1c, 0x17, 0x7e, 0x17, 0xe3, 0x17, 0x43, 0x18, 0xac, 0x18, |
||||
0x08, 0x19, 0x6d, 0x19, 0xce, 0x19, 0x34, 0x1a, 0x90, 0x1a, 0xf5, 0x1a, |
||||
0x53, 0x1b, 0xbb, 0x1b, 0x07, 0x1c, 0x6f, 0x1c, 0xc2, 0x1c, 0x28, 0x1d, |
||||
0x84, 0x1d, 0xe8, 0x1d, 0x35, 0x1e, 0xa2, 0x1e, 0xf8, 0x1e, 0x59, 0x1f, |
||||
0xb8, 0x1f, 0x0c, 0x20, 0x69, 0x20, 0xbe, 0x20, 0x19, 0x21, 0x66, 0x21, |
||||
0xc6, 0x21, 0x1f, 0x22, 0x70, 0x22, 0xbe, 0x22, 0x18, 0x23, 0x72, 0x23, |
||||
0xbf, 0x23, 0x0f, 0x24, 0x67, 0x24, 0xc0, 0x24, 0x08, 0x25, 0x51, 0x25, |
||||
0xa6, 0x25, 0xf4, 0x25, 0x42, 0x26, 0x93, 0x26, 0xd6, 0x26, 0x25, 0x27, |
||||
0x6c, 0x27, 0xb7, 0x27, 0x07, 0x28, 0x49, 0x28, 0x96, 0x28, 0xda, 0x28, |
||||
0x22, 0x29, 0x66, 0x29, 0xa4, 0x29, 0xe8, 0x29, 0x20, 0x2a, 0x62, 0x2a, |
||||
0xa9, 0x2a, 0xe5, 0x2a, 0x21, 0x2b, 0x5a, 0x2b, 0x97, 0x2b, 0xc1, 0x2b, |
||||
0xfe, 0x2b, 0x28, 0x2c, 0x57, 0x2c, 0x88, 0x2c, 0xae, 0x2c, 0xd3, 0x2c, |
||||
0xfa, 0x2c, 0x17, 0x2d, 0x33, 0x2d, 0x4b, 0x2d, 0x5d, 0x2d, 0x68, 0x2d, |
||||
0x81, 0x2d, 0x92, 0x2d, 0x9e, 0x2d, 0xa9, 0x2d, 0xbb, 0x2d, 0xc3, 0x2d, |
||||
0xcd, 0x2d, 0xd5, 0x2d, 0xcd, 0x2d, 0xdc, 0x2d, 0xe3, 0x2d, 0xe1, 0x2d, |
||||
0xdd, 0x2d, 0xd9, 0x2d, 0xd7, 0x2d, 0xcf, 0x2d, 0xe0, 0x2d, 0xd2, 0x2d, |
||||
0xd2, 0x2d, 0xcb, 0x2d, 0xb7, 0x2d, 0xb6, 0x2d, 0xa1, 0x2d, 0x9e, 0x2d, |
||||
0x8b, 0x2d, 0x84, 0x2d, 0x68, 0x2d, 0x6a, 0x2d, 0x4e, 0x2d, 0x45, 0x2d, |
||||
0x2f, 0x2d, 0x18, 0x2d, 0x15, 0x2d, 0xef, 0x2c, 0xe8, 0x2c, 0xc9, 0x2c, |
||||
0xc7, 0x2c, 0xaa, 0x2c, 0x9b, 0x2c, 0x7c, 0x2c, 0x64, 0x2c, 0x3c, 0x2c, |
||||
0x2e, 0x2c, 0x16, 0x2c, 0x05, 0x2c, 0xe1, 0x2b, 0xc8, 0x2b, 0xb5, 0x2b, |
||||
0x9a, 0x2b, 0x7c, 0x2b, 0x61, 0x2b, 0x3f, 0x2b, 0x21, 0x2b, 0x01, 0x2b, |
||||
0xee, 0x2a, 0xd0, 0x2a, 0xb3, 0x2a, 0x95, 0x2a, 0x6d, 0x2a, 0x50, 0x2a, |
||||
0x2b, 0x2a, 0x0b, 0x2a, 0xe9, 0x29, 0xd1, 0x29, 0xa8, 0x29, 0x97, 0x29, |
||||
0x6c, 0x29, 0x51, 0x29, 0x24, 0x29, 0x03, 0x29, 0xe6, 0x28, 0xbe, 0x28, |
||||
0xa1, 0x28, 0x80, 0x28, 0x64, 0x28, 0x38, 0x28, 0x12, 0x28, 0xf0, 0x27, |
||||
0xd3, 0x27, 0xac, 0x27, 0x94, 0x27, 0x67, 0x27, 0x4a, 0x27, 0x1c, 0x27, |
||||
0xf7, 0x26, 0xd1, 0x26, 0xb6, 0x26, 0x8d, 0x26, 0x6e, 0x26, 0x4b, 0x26, |
||||
0x25, 0x26, 0x02, 0x26, 0xd8, 0x25, 0xbe, 0x25, 0x93, 0x25, 0x7c, 0x25, |
||||
0x4a, 0x25, 0x27, 0x25, 0x07, 0x25, 0xdc, 0x24, 0xbb, 0x24, 0x9a, 0x24, |
||||
0x78, 0x24, 0x4c, 0x24, 0x26, 0x24, 0x00, 0x24, 0xd7, 0x23, 0xc0, 0x23, |
||||
0x94, 0x23, 0x71, 0x23, 0x45, 0x23, 0x1c, 0x23, 0x00, 0x23, 0xd4, 0x22, |
||||
0xb5, 0x22, 0x8e, 0x22, 0x67, 0x22, 0x39, 0x22, 0x00, 0x22, 0xbd, 0x21, |
||||
0x87, 0x21, 0x46, 0x21, 0x01, 0x21, 0xca, 0x20, 0x89, 0x20, 0x4a, 0x20, |
||||
0x17, 0x20, 0xd6, 0x1f, 0x9a, 0x1f, 0x5e, 0x1f, 0x20, 0x1f, 0xe0, 0x1e, |
||||
0xa3, 0x1e, 0x5f, 0x1e, 0x29, 0x1e, 0xf0, 0x1d, 0xb8, 0x1d, 0x78, 0x1d, |
||||
0x36, 0x1d, 0x04, 0x1d, 0xc6, 0x1c, 0x8b, 0x1c, 0x4d, 0x1c, 0x18, 0x1c, |
||||
0xd9, 0x1b, 0x97, 0x1b, 0x5c, 0x1b, 0x2b, 0x1b, 0xf4, 0x1a, 0xb1, 0x1a, |
||||
0x7c, 0x1a, 0x32, 0x1a, 0x02, 0x1a, 0xc6, 0x19, 0x8b, 0x19, 0x59, 0x19, |
||||
0x10, 0x19, 0xd7, 0x18, 0x9c, 0x18, 0x62, 0x18, 0x22, 0x18, 0xe8, 0x17, |
||||
0xb1, 0x17, 0x7c, 0x17, 0x34, 0x17, 0xf9, 0x16, 0xc0, 0x16, 0x8b, 0x16, |
||||
0x55, 0x16, 0x14, 0x16, 0xdd, 0x15, 0x9f, 0x15, 0x65, 0x15, 0x2b, 0x15, |
||||
0xea, 0x14, 0xb9, 0x14, 0x70, 0x14, 0x3d, 0x14, 0x05, 0x14, 0xc1, 0x13, |
||||
0x86, 0x13, 0x45, 0x13, 0x09, 0x13, 0xca, 0x12, 0x90, 0x12, 0x57, 0x12, |
||||
0x1a, 0x12, 0xe1, 0x11, 0x9b, 0x11, 0x61, 0x11, 0x1d, 0x11, 0xe1, 0x10, |
||||
0x9d, 0x10, 0x64, 0x10, 0x17, 0x10, 0xde, 0x0f, 0xa1, 0x0f, 0x60, 0x0f, |
||||
0x1b, 0x0f, 0xd8, 0x0e, 0x90, 0x0e, 0x5b, 0x0e, 0x0e, 0x0e, 0xd3, 0x0d, |
||||
0x86, 0x0d, 0x4d, 0x0d, 0xf5, 0x0c, 0xba, 0x0c, 0x68, 0x0c, 0x2a, 0x0c, |
||||
0xde, 0x0b, 0x94, 0x0b, 0x4e, 0x0b, 0x07, 0x0b, 0xbb, 0x0a, 0x6c, 0x0a, |
||||
0x25, 0x0a, 0xd4, 0x09, 0x89, 0x09, 0x39, 0x09, 0xe6, 0x08, 0xa3, 0x08, |
||||
0x4f, 0x08, 0x02, 0x08, 0xa7, 0x07, 0x5f, 0x07, 0x08, 0x07, 0xba, 0x06, |
||||
0x68, 0x06, 0x1f, 0x06, 0xc5, 0x05, 0x7a, 0x05, 0x1f, 0x05, 0xd7, 0x04, |
||||
0x85, 0x04, 0x31, 0x04, 0xde, 0x03, 0x89, 0x03, 0x3a, 0x03, 0xe9, 0x02, |
||||
0x96, 0x02, 0x47, 0x02, 0xf7, 0x01, 0xa4, 0x01, 0x5d, 0x01, 0x06, 0x01, |
||||
0xb9, 0x00, 0x00, 0x00 |
||||
}; |
||||
unsigned int kick_raw_len = 6352; |
@ -1,12 +0,0 @@ |
||||
AudioPlayArrayResmp KEYWORD2 |
||||
AudioPlaySdResmp KEYWORD2 |
||||
playRaw KEYWORD2 |
||||
playWav KEYWORD2 |
||||
isPlaying KEYWORD2 |
||||
setPlaybackRate KEYWORD2 |
||||
setLoopType KEYWORD2 |
||||
startLoop KEYWORD2 |
||||
enableInterpolation KEYWORD2 |
||||
looptype_none LITERAL1 |
||||
looptype_repeat LITERAL1 |
||||
looptype_pingpong LITERAL1 |
@ -1,37 +0,0 @@ |
||||
{ |
||||
"name": "TeensyVariablePlayback", |
||||
"frameworks": "Arduino", |
||||
"platforms": "Teensy", |
||||
"keywords": "sound, audio, sample, resample, pitch, interpolation, legrange, sampler, playback, speed, loop", |
||||
"description": "Teensy Variable Playback", |
||||
"url": "https://github.com/newdigate/teensy-variable-playback", |
||||
"version": "1.0.16", |
||||
"export": { |
||||
"exclude": [ |
||||
".vscode", |
||||
".github", |
||||
"extras", |
||||
"test", |
||||
"cmake", |
||||
"docs" |
||||
] |
||||
}, |
||||
"authors": |
||||
{ |
||||
"name": "Nic Newdigate", |
||||
"maintainer": true |
||||
}, |
||||
"repository": |
||||
{ |
||||
"type": "git", |
||||
"url": "https://github.com/newdigate/teensy-variable-playback" |
||||
}, |
||||
"dependencies":[{ |
||||
"name": "Audio", |
||||
"frameworks": "arduino" |
||||
}], |
||||
"examples": [ |
||||
"examples/*/*.ino", |
||||
"examples/*/*/*.ino" |
||||
] |
||||
} |
@ -1,9 +0,0 @@ |
||||
name=TeensyVariablePlayback |
||||
version=1.0.16 |
||||
author=Nic Newdigate |
||||
maintainer=Nic Newdigate |
||||
sentence=Play samples at variable pitch using Teensy Audio Library |
||||
paragraph=Adds AudioPlaySdRawResmp, AudioPlaySdWavResmp, AudioPlayArrayResmp objects to with pitch and loop controls |
||||
category=Signal Input/Output |
||||
url=https://github.com/newdigate/teensy-variable-playback |
||||
architectures=* |
@ -1,52 +0,0 @@ |
||||
message("building for linux...") |
||||
add_definitions(-DBUILD_FOR_LINUX) |
||||
|
||||
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include/teensy_variable_playback/) |
||||
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib/teensy_variable_playback ) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
add_library(teensy_variable_playback STATIC |
||||
${HEADER_FILES} |
||||
${SOURCE_FILES} |
||||
) |
||||
|
||||
set_target_properties(teensy_variable_playback PROPERTIES PUBLIC_HEADER "${HEADER_FILES}") |
||||
set_target_properties(teensy_variable_playback PROPERTIES LINKER_LANGUAGE C) |
||||
|
||||
include(CMakePackageConfigHelpers) |
||||
configure_package_config_file(../cmake/teensy_variable_playback.cmake.in |
||||
${CMAKE_CURRENT_BINARY_DIR}/teensy_variable_playbackConfig.cmake |
||||
INSTALL_DESTINATION ${LIB_INSTALL_DIR}/teensy_variable_playback/cmake |
||||
PATH_VARS) |
||||
|
||||
write_basic_package_version_file( |
||||
${CMAKE_CURRENT_BINARY_DIR}/teensy_variable_playbackConfigVersion.cmake |
||||
VERSION ${teensy_variable_playback_VERSION} |
||||
COMPATIBILITY SameMajorVersion ) |
||||
|
||||
install(TARGETS teensy_variable_playback DESTINATION |
||||
LIBRARY DESTINATION ${LIB_INSTALL_DIR} |
||||
ARCHIVE DESTINATION ${LIB_INSTALL_DIR} |
||||
PUBLIC_HEADER DESTINATION "include/teensy_variable_playback" |
||||
) |
||||
|
||||
install(FILES |
||||
${CMAKE_CURRENT_BINARY_DIR}/teensy_variable_playbackConfig.cmake |
||||
${CMAKE_CURRENT_BINARY_DIR}/teensy_variable_playbackConfigVersion.cmake |
||||
${CMAKE_CURRENT_SOURCE_DIR}/../cmake/uninstall.cmake |
||||
DESTINATION "lib/cmake/teensy_variable_playback" ) |
||||
|
||||
## |
||||
# copied from: https://gist.github.com/royvandam/3033428 |
||||
# Add uninstall target |
||||
# Requirements: Copy the uninstall.cmake file to the appropriate CMAKE_MODULE_PATH. |
||||
add_custom_target(uninstall |
||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/uninstall.cmake") |
@ -1,41 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.5) |
||||
project(teensy_variable_playback C CXX) |
||||
set(teensy_variable_playback_VERSION 1.0.0) |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
set(SOURCE_FILES |
||||
interpolation.cpp |
||||
) |
||||
|
||||
set(HEADER_FILES |
||||
loop_type.h |
||||
playresmp.h |
||||
playsdresmp.h |
||||
ResamplingSdReader.h |
||||
waveheaderparser.h |
||||
ResamplingArrayReader.h |
||||
ResamplingReader.h |
||||
playarrayresmp.h |
||||
interpolation.h |
||||
TeensyVariablePlayback.h |
||||
IndexableFile.h |
||||
IndexableSerialFlashFile.h |
||||
IndexableLittleFSFile.h |
||||
IndexableSDFile.h |
||||
ResamplingLfsReader.h |
||||
ResamplingSerialFlashReader.h |
||||
playlfsresmp.h |
||||
playserialflashresmp.h |
||||
) |
||||
|
||||
#set(CMAKE_VERBOSE_MAKEFILE 1) |
||||
if (NOT DEFINED TEENSY_VERSION) |
||||
include(CMakeLists.linux.cmake.in) |
||||
else() |
||||
teensy_add_library( |
||||
teensy_variable_playback |
||||
${SOURCE_FILES} |
||||
) |
||||
|
||||
add_custom_target(installarduino |
||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/install_arduino_library.cmake") |
||||
endif() |
@ -1,108 +0,0 @@ |
||||
#ifndef TEENSY_RESAMPLING_INDEXABLE_FILE_H |
||||
#define TEENSY_RESAMPLING_INDEXABLE_FILE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include <SD.h> |
||||
#include <vector> |
||||
|
||||
namespace newdigate { |
||||
|
||||
|
||||
struct indexedbuffer { |
||||
uint32_t index; |
||||
int16_t buffer_size; |
||||
int16_t *buffer; |
||||
}; |
||||
|
||||
constexpr bool isPowerOf2(size_t value){ |
||||
return !(value == 0) && !(value & (value - 1)); |
||||
} |
||||
|
||||
template<size_t BUFFER_SIZE, size_t MAX_NUM_BUFFERS, class TFile> // BUFFER_SIZE needs to be a power of two
|
||||
class IndexableFile { |
||||
public: |
||||
static_assert(isPowerOf2(BUFFER_SIZE), "BUFFER_SIZE must be a power of 2"); |
||||
|
||||
virtual TFile open(const char *filename) = 0; |
||||
|
||||
static constexpr size_t element_size = sizeof(int16_t); |
||||
size_t buffer_to_index_shift; |
||||
IndexableFile(const char *filename) :
|
||||
_buffers(), |
||||
buffer_to_index_shift(log2(BUFFER_SIZE))
|
||||
{ |
||||
_filename = new char[strlen(filename)+1] {0}; |
||||
memcpy(_filename, filename, strlen(filename)); |
||||
} |
||||
|
||||
virtual ~IndexableFile() { |
||||
close(); |
||||
} |
||||
|
||||
int16_t &operator[](int i) { |
||||
int32_t indexFor_i = i >> buffer_to_index_shift; |
||||
indexedbuffer *match = find_with_index(indexFor_i); |
||||
if (match == nullptr) { |
||||
if (_buffers.size() > MAX_NUM_BUFFERS - 1) { |
||||
indexedbuffer *first = _buffers[0]; |
||||
_buffers.erase(_buffers.begin()); |
||||
delete [] first->buffer; |
||||
delete first; |
||||
} |
||||
indexedbuffer *next = new indexedbuffer(); |
||||
next->index = indexFor_i; |
||||
next->buffer = new int16_t[BUFFER_SIZE]; |
||||
size_t basePos = indexFor_i << buffer_to_index_shift; |
||||
size_t seekPos = basePos * element_size; |
||||
_file.seek(seekPos); |
||||
int16_t bytesRead = _file.read(next->buffer, BUFFER_SIZE * element_size); |
||||
#ifndef TEENSYDUINO |
||||
if (!_file.available()){
|
||||
_file.close(); |
||||
_file = open(_filename); |
||||
} |
||||
#endif |
||||
next->buffer_size = bytesRead; |
||||
_buffers.push_back(next); |
||||
match = next; |
||||
} |
||||
return match->buffer[i % BUFFER_SIZE]; |
||||
} |
||||
|
||||
void close() { |
||||
if (_file.available()) { |
||||
_file.close(); |
||||
} |
||||
|
||||
for (auto && x : _buffers){ |
||||
delete [] x->buffer; |
||||
delete x; |
||||
} |
||||
_buffers.clear(); |
||||
|
||||
if (_filename != nullptr) { |
||||
delete [] _filename; |
||||
_filename = nullptr; |
||||
}
|
||||
} |
||||
|
||||
protected: |
||||
TFile _file; |
||||
char *_filename; |
||||
std::vector<indexedbuffer*> _buffers; |
||||
|
||||
indexedbuffer* find_with_index(uint32_t i) { |
||||
for (auto && x : _buffers){ |
||||
if (x->index == i) { |
||||
return x; |
||||
} |
||||
} |
||||
return nullptr; |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
#endif |
@ -1,43 +0,0 @@ |
||||
#ifndef TEENSY_RESAMPLING_INDEXABLELITTLEFS_FILE_H |
||||
#define TEENSY_RESAMPLING_INDEXABLELITTLEFS_FILE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include "IndexableFile.h" |
||||
#include <LittleFS.h> |
||||
#include <vector> |
||||
|
||||
namespace newdigate { |
||||
|
||||
template<size_t BUFFER_SIZE, size_t MAX_NUM_BUFFERS> // BUFFER_SIZE needs to be a power of two
|
||||
class IndexableLittleFSFile : public IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS, File> { |
||||
public: |
||||
static_assert(isPowerOf2(BUFFER_SIZE), "BUFFER_SIZE must be a power of 2"); |
||||
|
||||
IndexableLittleFSFile(LittleFS &fs, const char *filename) :
|
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS, File>(filename), |
||||
_myFS(fs)
|
||||
{ |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::_file = _myFS.open(filename); |
||||
} |
||||
|
||||
File open(const char *filename) override { |
||||
return _myFS.open(filename); |
||||
} |
||||
|
||||
virtual ~IndexableLittleFSFile() { |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::close(); |
||||
} |
||||
|
||||
int16_t &operator[](int i) { |
||||
return IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::operator[](i); |
||||
} |
||||
|
||||
private: |
||||
LittleFS &_myFS; |
||||
}; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_INDEXABLELITTLEFS_FILE_H
|
@ -1,38 +0,0 @@ |
||||
#ifndef TEENSY_RESAMPLING_INDEXABLESD_FILE_H |
||||
#define TEENSY_RESAMPLING_INDEXABLESD_FILE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include "IndexableFile.h" |
||||
#include <SD.h> |
||||
#include <vector> |
||||
|
||||
namespace newdigate { |
||||
|
||||
template<size_t BUFFER_SIZE, size_t MAX_NUM_BUFFERS> // BUFFER_SIZE needs to be a power of two
|
||||
class IndexableSDFile : public IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File> { |
||||
public: |
||||
static_assert(isPowerOf2(BUFFER_SIZE), "BUFFER_SIZE must be a power of 2"); |
||||
|
||||
IndexableSDFile(const char *filename) :
|
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>(filename) { |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::_file = open(filename); |
||||
} |
||||
|
||||
File open(const char *filename) override { |
||||
return SD.open(filename); |
||||
} |
||||
|
||||
virtual ~IndexableSDFile() { |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::close(); |
||||
} |
||||
|
||||
int16_t &operator[](int i) { |
||||
return IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,File>::operator[](i); |
||||
} |
||||
}; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
#endif |
@ -1,43 +0,0 @@ |
||||
#ifndef TEENSY_RESAMPLING_INDEXABLESERIALFLASH_FILE_H |
||||
#define TEENSY_RESAMPLING_INDEXABLESERIALFLASH_FILE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include "IndexableFile.h" |
||||
#include <SerialFlash.h> |
||||
#include <vector> |
||||
|
||||
namespace newdigate { |
||||
|
||||
template<size_t BUFFER_SIZE, size_t MAX_NUM_BUFFERS> // BUFFER_SIZE needs to be a power of two
|
||||
class IndexableSerialFlashFile : public IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,SerialFlashFile> { |
||||
public: |
||||
static_assert(isPowerOf2(BUFFER_SIZE), "BUFFER_SIZE must be a power of 2"); |
||||
|
||||
IndexableSerialFlashFile(SerialFlashChip &fs, const char *filename) :
|
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,SerialFlashFile>(filename), |
||||
_myFS(fs)
|
||||
{ |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,SerialFlashFile>::_file = _myFS.open(filename); |
||||
} |
||||
|
||||
SerialFlashFile open(const char *filename) override { |
||||
return _myFS.open(filename); |
||||
} |
||||
|
||||
virtual ~IndexableSerialFlashFile() { |
||||
IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,SerialFlashFile>::close(); |
||||
} |
||||
|
||||
int16_t &operator[](int i) { |
||||
return IndexableFile<BUFFER_SIZE, MAX_NUM_BUFFERS,SerialFlashFile>::operator[](i); |
||||
} |
||||
|
||||
private: |
||||
SerialFlashChip &_myFS; |
||||
}; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_INDEXABLESERIALFLASH_FILE_H
|
@ -1,49 +0,0 @@ |
||||
#ifndef TEENSYAUDIOLIBRARY_RESAMPLINGARRAYREADER_H |
||||
#define TEENSYAUDIOLIBRARY_RESAMPLINGARRAYREADER_H |
||||
|
||||
#include <Arduino.h> |
||||
#include "SD.h" |
||||
#include <cstdint> |
||||
#include "loop_type.h" |
||||
#include "interpolation.h" |
||||
#include "ResamplingReader.h" |
||||
|
||||
namespace newdigate { |
||||
|
||||
class ResamplingArrayReader : public ResamplingReader<int16_t, File> { |
||||
public: |
||||
ResamplingArrayReader() : |
||||
ResamplingReader() { |
||||
}
|
||||
|
||||
virtual ~ResamplingArrayReader() { |
||||
} |
||||
|
||||
int16_t getSourceBufferValue(long index) override { |
||||
return _sourceBuffer[index]; |
||||
} |
||||
|
||||
int available(void) { |
||||
return _playing; |
||||
} |
||||
|
||||
int16_t* createSourceBuffer() override { |
||||
return _sourceBuffer; |
||||
} |
||||
|
||||
void close(void) override { |
||||
if (_playing) { |
||||
stop(); |
||||
deleteInterpolationPoints(); |
||||
} |
||||
} |
||||
|
||||
File open(char *filename) override { |
||||
return File(); |
||||
} |
||||
protected: |
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif //TEENSYAUDIOLIBRARY_RESAMPLINGARRAYREADER_H
|
@ -1,85 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 10/02/2019.
|
||||
//
|
||||
|
||||
#ifndef TEENSYAUDIOLIBRARY_RESAMPLINGLFSREADER_H |
||||
#define TEENSYAUDIOLIBRARY_RESAMPLINGLFSREADER_H |
||||
|
||||
#include <cstdint> |
||||
#include "IndexableLittleFSFile.h" |
||||
#include "ResamplingReader.h" |
||||
#include "LittleFS.h" |
||||
|
||||
#define RESAMPLE_BUFFER_SAMPLE_SIZE 128 |
||||
|
||||
#define B2M (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT / 2.0) // 97352592
|
||||
|
||||
namespace newdigate { |
||||
|
||||
class ResamplingLfsReader : public ResamplingReader< IndexableLittleFSFile<128, 2>, File > { |
||||
public: |
||||
ResamplingLfsReader(LittleFS &fs) :
|
||||
ResamplingReader(), |
||||
_myFS(fs)
|
||||
{ |
||||
} |
||||
virtual ~ResamplingLfsReader() { |
||||
} |
||||
|
||||
int16_t getSourceBufferValue(long index) override { |
||||
return (*_sourceBuffer)[index]; |
||||
} |
||||
|
||||
int available(void) |
||||
{ |
||||
return _playing; |
||||
} |
||||
|
||||
File open(char *filename) override { |
||||
return _myFS.open(filename); |
||||
} |
||||
|
||||
void close(void) override |
||||
{ |
||||
if (_playing) |
||||
stop(); |
||||
if (_sourceBuffer != nullptr) { |
||||
_sourceBuffer->close(); |
||||
delete _sourceBuffer; |
||||
_sourceBuffer = nullptr; |
||||
} |
||||
if (_filename != nullptr) { |
||||
delete [] _filename; |
||||
_filename = nullptr; |
||||
} |
||||
deleteInterpolationPoints(); |
||||
} |
||||
|
||||
IndexableLittleFSFile<128, 2>* createSourceBuffer() override { |
||||
return new IndexableLittleFSFile<128, 2>(_myFS, _filename); |
||||
} |
||||
|
||||
uint32_t positionMillis(void) { |
||||
if (_file_size == 0) return 0; |
||||
if (!_useDualPlaybackHead) { |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} else
|
||||
{ |
||||
if (_crossfade < 0.5) |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
else |
||||
return (uint32_t) (( (double)_bufferPosition2 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} |
||||
} |
||||
|
||||
uint32_t lengthMillis(void) { |
||||
return ((uint64_t)_file_size * B2M) >> 32; |
||||
} |
||||
|
||||
protected:
|
||||
LittleFS &_myFS; |
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif //TEENSYAUDIOLIBRARY_RESAMPLINGLFSREADER_H
|
@ -1,631 +0,0 @@ |
||||
#ifndef TEENSYAUDIOLIBRARY_RESAMPLINGREADER_H |
||||
#define TEENSYAUDIOLIBRARY_RESAMPLINGREADER_H |
||||
|
||||
#include <Arduino.h> |
||||
#include <cstdint> |
||||
#include "loop_type.h" |
||||
#include "interpolation.h" |
||||
#include "waveheaderparser.h" |
||||
|
||||
namespace newdigate { |
||||
|
||||
template<class TArray, class TFile> |
||||
class ResamplingReader { |
||||
public: |
||||
ResamplingReader() { |
||||
} |
||||
virtual ~ResamplingReader() {
|
||||
} |
||||
|
||||
virtual TFile open(char *filename) = 0; |
||||
virtual TArray* createSourceBuffer() = 0; |
||||
virtual int16_t getSourceBufferValue(long index) = 0; |
||||
virtual void close(void) = 0; |
||||
|
||||
void begin(void)
|
||||
{ |
||||
if (_interpolationType != ResampleInterpolationType::resampleinterpolation_none) { |
||||
initializeInterpolationPoints(); |
||||
} |
||||
_playing = false; |
||||
_crossfade = 0.0; |
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _header_offset; |
||||
else |
||||
_bufferPosition1 = _loop_start; |
||||
_file_size = 0; |
||||
} |
||||
|
||||
bool playRaw(TArray *array, uint32_t length, uint16_t numChannels) |
||||
{ |
||||
_sourceBuffer = array; |
||||
stop(); |
||||
|
||||
_header_offset = 0; |
||||
_file_size = length * 2; |
||||
_loop_start = 0; |
||||
_loop_finish = length; |
||||
setNumChannels(numChannels); |
||||
|
||||
reset(); |
||||
_playing = true; |
||||
return true; |
||||
} |
||||
|
||||
bool playRaw(TArray *array, uint16_t numChannels) { |
||||
return playRaw(array, false, numChannels);
|
||||
} |
||||
|
||||
bool playWav(TArray *array, uint32_t length) { |
||||
return playRaw(array, true);
|
||||
} |
||||
|
||||
bool play(const char *filename, bool isWave, uint16_t numChannelsIfRaw = 0) |
||||
{ |
||||
close(); |
||||
|
||||
if (!isWave) // if raw file, then hardcode the numChannels as per the parameter
|
||||
setNumChannels(numChannelsIfRaw); |
||||
|
||||
_filename = new char[strlen(filename)+1] {0}; |
||||
memcpy(_filename, filename, strlen(filename) + 1); |
||||
|
||||
TFile file = open(_filename); |
||||
if (!file) { |
||||
Serial.printf("Not able to open file: %s\n", _filename); |
||||
if (_filename) delete [] _filename; |
||||
_filename = nullptr; |
||||
return false; |
||||
} |
||||
|
||||
_file_size = file.size(); |
||||
if (isWave) { |
||||
wav_header wav_header; |
||||
wav_data_header data_header; |
||||
|
||||
WaveHeaderParser wavHeaderParser; |
||||
char buffer[36]; |
||||
size_t bytesRead = file.read(buffer, 36); |
||||
|
||||
wavHeaderParser.readWaveHeaderFromBuffer((const char *) buffer, wav_header); |
||||
if (wav_header.bit_depth != 16) { |
||||
Serial.printf("Needs 16 bit audio! Aborting.... (got %d)", wav_header.bit_depth); |
||||
return false; |
||||
} |
||||
setNumChannels(wav_header.num_channels); |
||||
|
||||
bytesRead = file.read(buffer, 8); |
||||
unsigned infoTagsSize; |
||||
if (!wavHeaderParser.readInfoTags((unsigned char *)buffer, 0, infoTagsSize)) |
||||
{ |
||||
Serial.println("Not able to read header! Aborting..."); |
||||
return false; |
||||
} |
||||
|
||||
file.seek(36 + infoTagsSize); |
||||
bytesRead = file.read(buffer, 8); |
||||
|
||||
if (!wavHeaderParser.readDataHeader((unsigned char *)buffer, 0, data_header)) { |
||||
Serial.println("Not able to read header! Aborting..."); |
||||
return false; |
||||
} |
||||
|
||||
_header_offset = (44 + infoTagsSize) / 2; |
||||
_loop_finish = ((data_header.data_bytes) / 2) + _header_offset;
|
||||
} else
|
||||
_loop_finish = _file_size / 2; |
||||
|
||||
file.close(); |
||||
|
||||
if (_file_size <= _header_offset * sizeof(int16_t)) { |
||||
_playing = false; |
||||
if (_filename) delete [] _filename; |
||||
_filename = nullptr; |
||||
Serial.printf("Wave file contains no samples: %s\n", filename); |
||||
return false; |
||||
} |
||||
|
||||
_sourceBuffer = createSourceBuffer(); |
||||
_loop_start = _header_offset; |
||||
|
||||
reset(); |
||||
_playing = true; |
||||
return true; |
||||
} |
||||
|
||||
bool playRaw(const char *filename, uint16_t numChannelsIfRaw){ |
||||
return play(filename, false, numChannelsIfRaw); |
||||
} |
||||
|
||||
bool playWav(const char *filename){ |
||||
return play(filename, true); |
||||
} |
||||
|
||||
bool play() |
||||
{ |
||||
stop(); |
||||
reset(); |
||||
_playing = true; |
||||
return true; |
||||
} |
||||
|
||||
void stop(void) |
||||
{ |
||||
if (_playing) {
|
||||
_playing = false; |
||||
} |
||||
}
|
||||
|
||||
bool isPlaying(void) { return _playing; } |
||||
|
||||
unsigned int read(void **buf, uint16_t nsamples) { |
||||
if (!_playing) return 0; |
||||
|
||||
int16_t *index[_numChannels]; |
||||
unsigned int count = 0; |
||||
for (int channel=0; channel < _numChannels; channel++) { |
||||
index[channel] = (int16_t*)buf[channel]; |
||||
} |
||||
|
||||
while (count < nsamples) { |
||||
for (int channel=0; channel < _numChannels; channel++) { |
||||
if (readNextValue(index[channel], channel)) { |
||||
if (channel == _numChannels - 1) |
||||
count++; |
||||
index[channel]++; |
||||
} |
||||
else { |
||||
// we have reached the end of the file
|
||||
|
||||
switch (_loopType) { |
||||
case looptype_repeat: |
||||
{ |
||||
_crossfade = 0.0; |
||||
if (_playbackRate >= 0.0)
|
||||
_bufferPosition1 = _loop_start; |
||||
else |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
|
||||
break; |
||||
} |
||||
|
||||
case looptype_pingpong: |
||||
{ |
||||
if (_playbackRate >= 0.0) { |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
} |
||||
else { |
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _header_offset; |
||||
else |
||||
_bufferPosition1 = _loop_start; |
||||
} |
||||
_playbackRate = -_playbackRate; |
||||
break; |
||||
}
|
||||
|
||||
case looptype_none:
|
||||
default: |
||||
{ |
||||
//Serial.printf("end of loop...\n");
|
||||
/* no looping - return the number of (resampled) bytes returned... */ |
||||
close(); |
||||
return count; |
||||
} |
||||
}
|
||||
} |
||||
} |
||||
} |
||||
return count; |
||||
} |
||||
|
||||
// read the sample value for given channel and store it at the location pointed to by the pointer 'value'
|
||||
bool readNextValue(int16_t *value, uint16_t channel) { |
||||
if (!_useDualPlaybackHead) { |
||||
if (_playbackRate >= 0 ) { |
||||
//forward playback
|
||||
if (_bufferPosition1 >= _loop_finish ) |
||||
return false; |
||||
} else if (_playbackRate < 0) { |
||||
// reverse playback
|
||||
if (_play_start == play_start::play_start_sample) { |
||||
if (_bufferPosition1 < _header_offset) |
||||
return false; |
||||
} else { |
||||
if (_bufferPosition1 < _loop_start) |
||||
return false;
|
||||
} |
||||
} |
||||
} else { |
||||
if (_playbackRate >= 0.0) { |
||||
if (_crossfade == 0.0 && _bufferPosition1 > (_loop_finish - _numChannels) - _crossfadeDurationInSamples) { |
||||
_bufferPosition2 = _loop_start; |
||||
_crossfade = 1.0 - (( (_loop_finish-_numChannels) - _bufferPosition1 ) / static_cast<double>(_crossfadeDurationInSamples)); |
||||
_crossfadeState = 1; |
||||
} else if (_crossfade == 1.0 && _bufferPosition2 > (_loop_finish - _numChannels)- _crossfadeDurationInSamples) { |
||||
_bufferPosition1 = _loop_start; |
||||
_crossfade = ((_loop_finish - _numChannels) - _bufferPosition2) / static_cast<double>(_crossfadeDurationInSamples); |
||||
_crossfadeState = 2; |
||||
} else if (_crossfadeState == 1) { |
||||
_crossfade = 1.0 - (((_loop_finish - _numChannels) - _bufferPosition1) / static_cast<double>(_crossfadeDurationInSamples)); |
||||
if (_crossfade >= 1.0) { |
||||
_crossfadeState = 0; |
||||
_crossfade = 1.0; |
||||
} |
||||
} else if (_crossfadeState == 2) { |
||||
_crossfade = ( (_loop_finish - _numChannels) - _bufferPosition2 ) / static_cast<double>(_crossfadeDurationInSamples); |
||||
if (_crossfade <= 0.0) { |
||||
_crossfadeState = 0; |
||||
_crossfade = 0.0; |
||||
} |
||||
} |
||||
} else { |
||||
if (_crossfade == 0.0 && _bufferPosition1 < _crossfadeDurationInSamples + _header_offset) { |
||||
_bufferPosition2 = _loop_finish - _numChannels; |
||||
_crossfade = 1.0 - (_bufferPosition1 - _header_offset) / static_cast<double>(_crossfadeDurationInSamples); |
||||
_crossfadeState = 1; |
||||
} else if (_crossfade == 1.0 && _bufferPosition2 < _crossfadeDurationInSamples + _header_offset) { |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
_crossfade = (_bufferPosition2 - _header_offset) / static_cast<double>(_crossfadeDurationInSamples); |
||||
_crossfadeState = 2; |
||||
} else if (_crossfadeState == 1) { |
||||
_crossfade = 1.0 - (_bufferPosition1 - _header_offset) / static_cast<double>(_crossfadeDurationInSamples); |
||||
if (_crossfade >= 1.0) { |
||||
_crossfadeState = 0; |
||||
_crossfade = 1.0; |
||||
} |
||||
} else if (_crossfadeState == 2) { |
||||
_crossfade = (_bufferPosition2 - _header_offset) / static_cast<double>(_crossfadeDurationInSamples); |
||||
if (_crossfade <= 0.0) { |
||||
_crossfadeState = 0; |
||||
_crossfade = 0.0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
int16_t result = 0; |
||||
if (!_useDualPlaybackHead || _crossfade == 0.0) { |
||||
result = getSourceBufferValue(_bufferPosition1 + channel); |
||||
} else if (_crossfade == 1.0){ |
||||
result = getSourceBufferValue(_bufferPosition2 + channel); |
||||
} else{ |
||||
int result1 = getSourceBufferValue(_bufferPosition1 + channel); |
||||
int result2 = getSourceBufferValue(_bufferPosition2 + channel); |
||||
result = ((1.0 - _crossfade ) * result1) + ((_crossfade) * result2); |
||||
} |
||||
|
||||
if (_interpolationType == ResampleInterpolationType::resampleinterpolation_linear) { |
||||
double abs_remainder = abs(_remainder); |
||||
if (abs_remainder > 0.0) { |
||||
|
||||
if (_playbackRate > 0) { |
||||
if (_remainder - _playbackRate < 0.0){ |
||||
// we crossed over a whole number, make sure we update the samples for interpolation
|
||||
if (!_useDualPlaybackHead) { |
||||
if ( _numInterpolationPoints < 2 &&_playbackRate > 1.0 && _bufferPosition1 - _numChannels > _header_offset * 2 ) { |
||||
// need to update last sample
|
||||
_interpolationPoints[channel][1].y = getSourceBufferValue(_bufferPosition1 - _numChannels); |
||||
} |
||||
} |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = result; |
||||
if (_numInterpolationPoints < 2) |
||||
_numInterpolationPoints++; |
||||
} |
||||
}
|
||||
else if (_playbackRate < 0) { |
||||
if (_remainder - _playbackRate > 0.0){ |
||||
// we crossed over a whole number, make sure we update the samples for interpolation
|
||||
if (!_useDualPlaybackHead) { |
||||
if (_numInterpolationPoints < 2 && _playbackRate < -1.0) { |
||||
// need to update last sample
|
||||
_interpolationPoints[channel][1].y = getSourceBufferValue(_bufferPosition1 + _numChannels); |
||||
} |
||||
} |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = result; |
||||
if (_numInterpolationPoints < 2) |
||||
_numInterpolationPoints++; |
||||
} |
||||
} |
||||
|
||||
if (_numInterpolationPoints > 1) { |
||||
result = abs_remainder * _interpolationPoints[channel][1].y + (1.0 - abs_remainder) * _interpolationPoints[channel][0].y; |
||||
} |
||||
} else { |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = result; |
||||
if (_numInterpolationPoints < 2) |
||||
_numInterpolationPoints++; |
||||
|
||||
result =_interpolationPoints[channel][0].y; |
||||
} |
||||
}
|
||||
else if (_interpolationType == ResampleInterpolationType::resampleinterpolation_quadratic) { |
||||
double abs_remainder = abs(_remainder); |
||||
if (abs_remainder > 0.0) { |
||||
if (_playbackRate > 0) {
|
||||
if (_remainder - _playbackRate < 0.0){ |
||||
// we crossed over a whole number, make sure we update the samples for interpolation
|
||||
int numberOfSamplesToUpdate = - floor(_remainder - _playbackRate); |
||||
if (numberOfSamplesToUpdate > 4)
|
||||
numberOfSamplesToUpdate = 4; // if playbackrate > 4, only need to pop last 4 samples
|
||||
for (int i=numberOfSamplesToUpdate; i > 0; i--) { |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = _interpolationPoints[channel][2].y; |
||||
_interpolationPoints[channel][2].y = _interpolationPoints[channel][3].y; |
||||
if (!_useDualPlaybackHead) { |
||||
_interpolationPoints[channel][3].y = getSourceBufferValue(_bufferPosition1-(i*_numChannels)+1+channel); |
||||
} else
|
||||
{ |
||||
_interpolationPoints[channel][3].y = result; |
||||
} |
||||
if (_numInterpolationPoints < 4) _numInterpolationPoints++; |
||||
} |
||||
} |
||||
}
|
||||
else if (_playbackRate < 0) {
|
||||
if (_remainder - _playbackRate > 0.0){ |
||||
// we crossed over a whole number, make sure we update the samples for interpolation
|
||||
int numberOfSamplesToUpdate = ceil(_remainder - _playbackRate); |
||||
if (numberOfSamplesToUpdate > 4)
|
||||
numberOfSamplesToUpdate = 4; // if playbackrate > 4, only need to pop last 4 samples
|
||||
for (int i=numberOfSamplesToUpdate; i > 0; i--) { |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = _interpolationPoints[channel][2].y; |
||||
_interpolationPoints[channel][2].y = _interpolationPoints[channel][3].y; |
||||
if (!_useDualPlaybackHead) { |
||||
_interpolationPoints[channel][3].y = getSourceBufferValue(_bufferPosition1+(i*_numChannels)-1+channel); |
||||
} else
|
||||
{ |
||||
_interpolationPoints[channel][3].y = result; |
||||
} |
||||
if (_numInterpolationPoints < 4) _numInterpolationPoints++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (_numInterpolationPoints >= 4) { |
||||
//int16_t interpolation = interpolate(_interpolationPoints, 1.0 + abs_remainder, 4);
|
||||
int16_t interpolation
|
||||
= fastinterpolate( |
||||
_interpolationPoints[channel][0].y,
|
||||
_interpolationPoints[channel][1].y,
|
||||
_interpolationPoints[channel][2].y,
|
||||
_interpolationPoints[channel][3].y,
|
||||
1.0 + abs_remainder);
|
||||
result = interpolation; |
||||
//Serial.printf("[%f]\n", interpolation);
|
||||
} else
|
||||
result = 0; |
||||
} else { |
||||
_interpolationPoints[channel][0].y = _interpolationPoints[channel][1].y; |
||||
_interpolationPoints[channel][1].y = _interpolationPoints[channel][2].y; |
||||
_interpolationPoints[channel][2].y = _interpolationPoints[channel][3].y; |
||||
_interpolationPoints[channel][3].y = result; |
||||
if (_numInterpolationPoints < 4) { |
||||
_numInterpolationPoints++; |
||||
result = 0; |
||||
} else
|
||||
result = _interpolationPoints[channel][1].y; |
||||
//Serial.printf("%f\n", result);
|
||||
} |
||||
} |
||||
|
||||
if (channel == _numChannels - 1) { |
||||
_remainder += _playbackRate; |
||||
|
||||
auto delta = static_cast<signed int>(_remainder); |
||||
_remainder -= static_cast<double>(delta); |
||||
if (!_useDualPlaybackHead) { |
||||
_bufferPosition1 += (delta * _numChannels); |
||||
} else { |
||||
if (_crossfade < 1.0) |
||||
_bufferPosition1 += (delta * _numChannels); |
||||
|
||||
if (_crossfade > 0.0) |
||||
_bufferPosition2 += (delta * _numChannels); |
||||
} |
||||
} |
||||
|
||||
*value = result; |
||||
return true; |
||||
} |
||||
|
||||
void setPlaybackRate(double f) { |
||||
_playbackRate = f; |
||||
if (!_useDualPlaybackHead) { |
||||
if (f < 0.0) { |
||||
if (_bufferPosition1 <= _header_offset) { |
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _file_size/2 - _numChannels; |
||||
else |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
}
|
||||
} else { |
||||
if (f >= 0.0 && _bufferPosition1 < _header_offset) { |
||||
if (_play_start == play_start::play_start_sample)
|
||||
_bufferPosition1 = _header_offset; |
||||
else |
||||
_bufferPosition1 = _loop_start; |
||||
} |
||||
} |
||||
} else {
|
||||
// _useDualPlaybackHead == true
|
||||
if (_crossfade == 0.0) { |
||||
if (f < 0.0) {
|
||||
if( _bufferPosition1 <= _header_offset) { |
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _file_size/2 - _numChannels; |
||||
else |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
} |
||||
} else { |
||||
if (f >= 0.0 && _bufferPosition1 < _header_offset) { |
||||
_bufferPosition1 = _header_offset; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
float playbackRate() { |
||||
return _playbackRate; |
||||
} |
||||
|
||||
void loop(uint32_t numSamples) { |
||||
int bufferPosition = (_crossfade < 1.0)? _bufferPosition1 : _bufferPosition2; |
||||
_loop_start = bufferPosition; |
||||
_loop_finish = bufferPosition + numSamples * _numChannels; |
||||
_loopType = loop_type::looptype_repeat; |
||||
} |
||||
|
||||
void setLoopType(loop_type loopType) |
||||
{ |
||||
_loopType = loopType; |
||||
} |
||||
|
||||
loop_type getLoopType() { |
||||
return _loopType;
|
||||
} |
||||
|
||||
int available(void) { |
||||
return _playing; |
||||
} |
||||
|
||||
void reset(void) { |
||||
if (_interpolationType != ResampleInterpolationType::resampleinterpolation_none) { |
||||
initializeInterpolationPoints(); |
||||
} |
||||
_numInterpolationPoints = 0; |
||||
if (_playbackRate > 0.0) { |
||||
// forward playabck - set _file_offset to first audio block in file
|
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _header_offset; |
||||
else |
||||
_bufferPosition1 = _loop_start; |
||||
} else { |
||||
// reverse playback - forward _file_offset to last audio block in file
|
||||
if (_play_start == play_start::play_start_sample) |
||||
_bufferPosition1 = _file_size/2 - _numChannels; |
||||
else |
||||
_bufferPosition1 = _loop_finish - _numChannels; |
||||
} |
||||
_crossfade = 0.0; |
||||
} |
||||
|
||||
void setLoopStart(uint32_t loop_start) { |
||||
_loop_start = _header_offset + (loop_start * _numChannels); |
||||
} |
||||
|
||||
void setLoopFinish(uint32_t loop_finish) { |
||||
// sample number, (NOT byte number)
|
||||
_loop_finish = _header_offset + (loop_finish * _numChannels); |
||||
} |
||||
|
||||
void setUseDualPlaybackHead(bool useDualPlaybackHead) { |
||||
_useDualPlaybackHead = useDualPlaybackHead; |
||||
} |
||||
|
||||
void setCrossfadeDurationInSamples(unsigned int crossfadeDurationInSamples) { |
||||
_crossfadeDurationInSamples = crossfadeDurationInSamples; |
||||
} |
||||
|
||||
void setInterpolationType(ResampleInterpolationType interpolationType) { |
||||
if (interpolationType != _interpolationType) { |
||||
_interpolationType = interpolationType; |
||||
initializeInterpolationPoints(); |
||||
} |
||||
} |
||||
|
||||
int16_t getNumChannels() { |
||||
return _numChannels; |
||||
} |
||||
|
||||
void setNumChannels(uint16_t numChannels) { |
||||
if (numChannels != _numChannels) { |
||||
_numChannels = numChannels; |
||||
initializeInterpolationPoints(); |
||||
} |
||||
} |
||||
|
||||
void setHeaderSizeInBytes(uint32_t headerSizeInBytes) { |
||||
_header_offset = headerSizeInBytes / 2; |
||||
} |
||||
|
||||
void setPlayStart(play_start start) { |
||||
_play_start = start; |
||||
} |
||||
|
||||
#define B2M (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT / 2.0) // 97352592
|
||||
uint32_t positionMillis() |
||||
{ |
||||
return ((uint64_t)_file_size * B2M) >> 32; |
||||
} |
||||
|
||||
uint32_t lengthMillis() |
||||
{ |
||||
return ((uint64_t)_file_size * B2M) >> 32; |
||||
} |
||||
|
||||
protected: |
||||
volatile bool _playing = false; |
||||
|
||||
int32_t _file_size; |
||||
int32_t _header_offset = 0; // == (header size in bytes ) / 2
|
||||
|
||||
double _playbackRate = 1.0; |
||||
double _remainder = 0.0; |
||||
loop_type _loopType = loop_type::looptype_none; |
||||
play_start _play_start = play_start::play_start_sample; |
||||
int _bufferPosition1 = 0; |
||||
int _bufferPosition2 = 0; |
||||
double _crossfade = 0.0; |
||||
bool _useDualPlaybackHead = false; |
||||
unsigned int _crossfadeDurationInSamples = 256;
|
||||
int _crossfadeState = 0; |
||||
int32_t _loop_start = 0; |
||||
int32_t _loop_finish = 0; |
||||
int16_t _numChannels = -1; |
||||
uint16_t _numInterpolationPointsChannels = 0; |
||||
char *_filename = nullptr; |
||||
TArray *_sourceBuffer = nullptr; |
||||
|
||||
ResampleInterpolationType _interpolationType = ResampleInterpolationType::resampleinterpolation_none; |
||||
unsigned int _numInterpolationPoints = 0; |
||||
InterpolationData **_interpolationPoints = nullptr; |
||||
|
||||
void initializeInterpolationPoints(void) { |
||||
if (_numChannels < 0) |
||||
return; |
||||
|
||||
deleteInterpolationPoints(); |
||||
_interpolationPoints = new InterpolationData*[_numChannels]; |
||||
for (int channel=0; channel < _numChannels; channel++) {
|
||||
InterpolationData *interpolation = new InterpolationData[4]; |
||||
interpolation[0].y = 0.0; |
||||
interpolation[1].y = 0.0;
|
||||
interpolation[2].y = 0.0;
|
||||
interpolation[3].y = 0.0; |
||||
_interpolationPoints[channel] = interpolation ; |
||||
} |
||||
_numInterpolationPointsChannels = _numChannels; |
||||
} |
||||
|
||||
void deleteInterpolationPoints(void) |
||||
{ |
||||
if (!_interpolationPoints) return; |
||||
for (int i=0; i<_numInterpolationPointsChannels; i++) { |
||||
delete [] _interpolationPoints[i]; |
||||
} |
||||
delete [] _interpolationPoints; |
||||
_interpolationPoints = nullptr; |
||||
_numInterpolationPointsChannels = 0; |
||||
} |
||||
|
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif //TEENSYAUDIOLIBRARY_RESAMPLINGREADER_H
|
@ -1,88 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 10/02/2019.
|
||||
//
|
||||
|
||||
#ifndef TEENSYAUDIOLIBRARY_RESAMPLINGSDREADER_H |
||||
#define TEENSYAUDIOLIBRARY_RESAMPLINGSDREADER_H |
||||
|
||||
#include "SD.h" |
||||
#include <cstdint> |
||||
#include "spi_interrupt.h" |
||||
#include "loop_type.h" |
||||
#include "interpolation.h" |
||||
#include "IndexableSDFile.h" |
||||
#include "ResamplingReader.h" |
||||
|
||||
#define RESAMPLE_BUFFER_SAMPLE_SIZE 128 |
||||
|
||||
#define B2M (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT / 2.0) // 97352592
|
||||
|
||||
namespace newdigate { |
||||
|
||||
class ResamplingSdReader : public ResamplingReader< IndexableSDFile<128, 4>, File > { |
||||
public: |
||||
ResamplingSdReader() :
|
||||
ResamplingReader()
|
||||
{ |
||||
} |
||||
|
||||
virtual ~ResamplingSdReader() { |
||||
} |
||||
|
||||
int16_t getSourceBufferValue(long index) override { |
||||
return (*_sourceBuffer)[index]; |
||||
} |
||||
|
||||
int available(void) |
||||
{ |
||||
return _playing; |
||||
} |
||||
|
||||
File open(char *filename) override { |
||||
return SD.open(filename); |
||||
} |
||||
|
||||
void close(void) override |
||||
{ |
||||
if (_playing) |
||||
stop(); |
||||
if (_sourceBuffer != nullptr) { |
||||
_sourceBuffer->close(); |
||||
delete _sourceBuffer; |
||||
_sourceBuffer = nullptr; |
||||
} |
||||
if (_filename != nullptr) { |
||||
delete [] _filename; |
||||
_filename = nullptr; |
||||
} |
||||
deleteInterpolationPoints(); |
||||
} |
||||
|
||||
IndexableSDFile<128, 4>* createSourceBuffer() override { |
||||
return new IndexableSDFile<128, 4>(_filename); |
||||
} |
||||
|
||||
uint32_t positionMillis(void) { |
||||
if (_file_size == 0) return 0; |
||||
if (!_useDualPlaybackHead) { |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} else
|
||||
{ |
||||
if (_crossfade < 0.5) |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
else |
||||
return (uint32_t) (( (double)_bufferPosition2 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} |
||||
} |
||||
|
||||
uint32_t lengthMillis(void) { |
||||
return ((uint64_t)_file_size * B2M) >> 32; |
||||
} |
||||
|
||||
protected:
|
||||
|
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif //TEENSYAUDIOLIBRARY_RESAMPLINGSDREADER_H
|
@ -1,89 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 10/02/2019.
|
||||
//
|
||||
|
||||
#ifndef TEENSYAUDIOLIBRARY_RESAMPLINGSERIALFLASHREADER_H |
||||
#define TEENSYAUDIOLIBRARY_RESAMPLINGSERIALFLASHREADER_H |
||||
|
||||
#include <cstdint> |
||||
#include "spi_interrupt.h" |
||||
#include "loop_type.h" |
||||
#include "interpolation.h" |
||||
#include "IndexableSerialFlashFile.h" |
||||
#include "ResamplingReader.h" |
||||
#include "SerialFlash.h" |
||||
|
||||
#define RESAMPLE_BUFFER_SAMPLE_SIZE 128 |
||||
|
||||
#define B2M (uint32_t)((double)4294967296000.0 / AUDIO_SAMPLE_RATE_EXACT / 2.0) // 97352592
|
||||
|
||||
namespace newdigate { |
||||
|
||||
class ResamplingSerialFlashReader : public ResamplingReader< IndexableSerialFlashFile<128, 2>, SerialFlashFile > { |
||||
public: |
||||
ResamplingSerialFlashReader(SerialFlashChip &fs) :
|
||||
ResamplingReader(), |
||||
_myFS(fs)
|
||||
{ |
||||
} |
||||
|
||||
virtual ~ResamplingSerialFlashReader() { |
||||
} |
||||
|
||||
int16_t getSourceBufferValue(long index) override { |
||||
return (*_sourceBuffer)[index]; |
||||
} |
||||
|
||||
int available(void) |
||||
{ |
||||
return _playing; |
||||
} |
||||
|
||||
SerialFlashFile open(char *filename) override { |
||||
return _myFS.open(filename); |
||||
} |
||||
|
||||
void close(void) override |
||||
{ |
||||
if (_playing) |
||||
stop(); |
||||
if (_sourceBuffer != nullptr) { |
||||
_sourceBuffer->close(); |
||||
delete _sourceBuffer; |
||||
_sourceBuffer = nullptr; |
||||
} |
||||
if (_filename != nullptr) { |
||||
delete [] _filename; |
||||
_filename = nullptr; |
||||
} |
||||
deleteInterpolationPoints(); |
||||
} |
||||
|
||||
IndexableSerialFlashFile<128, 2>* createSourceBuffer() override { |
||||
return new IndexableSerialFlashFile<128, 2>(_myFS, _filename); |
||||
} |
||||
|
||||
uint32_t positionMillis(void) { |
||||
if (_file_size == 0) return 0; |
||||
if (!_useDualPlaybackHead) { |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} else
|
||||
{ |
||||
if (_crossfade < 0.5) |
||||
return (uint32_t) (( (double)_bufferPosition1 * lengthMillis() ) / (double)(_file_size/2)); |
||||
else |
||||
return (uint32_t) (( (double)_bufferPosition2 * lengthMillis() ) / (double)(_file_size/2)); |
||||
} |
||||
} |
||||
|
||||
uint32_t lengthMillis(void) { |
||||
return ((uint64_t)_file_size * B2M) >> 32; |
||||
} |
||||
|
||||
protected:
|
||||
SerialFlashChip &_myFS; |
||||
}; |
||||
|
||||
} |
||||
|
||||
#endif //TEENSYAUDIOLIBRARY_RESAMPLINGSERIALFLASHREADER_H
|
@ -1,17 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 21/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_ARDUINO_SAMPLER_H |
||||
#define TEENSY_RESAMPLING_ARDUINO_SAMPLER_H |
||||
|
||||
#include "waveheaderparser.h" |
||||
#include "ResamplingSdReader.h" |
||||
#include "ResamplingArrayReader.h" |
||||
#include "ResamplingLfsReader.h" |
||||
#include "ResamplingSerialFlashReader.h" |
||||
#include "playsdresmp.h" |
||||
#include "playarrayresmp.h" |
||||
#include "playlfsresmp.h" |
||||
#include "playserialflashresmp.h" |
||||
#endif //TEENSY_RESAMPLING_ARDUINO_SAMPLER_H
|
@ -1,56 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 24/05/2021.
|
||||
//
|
||||
#include "interpolation.h" |
||||
|
||||
// https://en.wikipedia.org/wiki/Lagrange_polynomial
|
||||
// https://www.geeksforgeeks.org/lagranges-interpolation/
|
||||
// function to interpolate the given data points using Lagrange's formula
|
||||
// xi corresponds to the new data point whose value is to be obtained
|
||||
// n represents the number of known data points
|
||||
int16_t interpolate(InterpolationData *f, double xi, int n) { |
||||
double result = 0.0; // Initialize result
|
||||
for (int i=0; i<n; i++) |
||||
{ |
||||
// Compute individual terms of above formula
|
||||
double term = f[i].y; |
||||
for (int j=0;j<n;j++) |
||||
{ |
||||
if (j!=i) |
||||
term = term*(xi - double(f[j].x))/(f[i].x - double(f[j].x)); |
||||
} |
||||
|
||||
// Add current term to result
|
||||
result += term; |
||||
} |
||||
|
||||
int32_t untruncated = round(result); |
||||
if (untruncated < -32768) |
||||
return -32768; |
||||
if (untruncated > 32767) |
||||
return 32767; |
||||
return untruncated; |
||||
} |
||||
|
||||
|
||||
int16_t fastinterpolate(int16_t d1, int16_t d2, int16_t d3, int16_t d4, float x) { |
||||
float x_1 = x * 1000.0; |
||||
float x_2 = x_1 * x_1; |
||||
float x_3 = x_2 * x_1; |
||||
|
||||
//Serial.printf("%i,%i,%i,%i @ x=%f \n", d1,d2,d3,d4,x);
|
||||
|
||||
return d1 * (x_3 - 6000 * x_2 + 11000000 * x_1 - 6000000000 ) / - 6000000000 |
||||
+ d2 * (x_3 - 5000 * x_2 + 6000000 * x_1 ) / 2000000000 |
||||
+ d3 * (x_3 - 4000 * x_2 + 3000000 * x_1 ) / - 2000000000 |
||||
+ d4 * (x_3 - 3000 * x_2 + 2000000 * x_1 ) / 6000000000; |
||||
|
||||
/*
|
||||
int32_t untruncated = result; |
||||
if (untruncated < -32768) |
||||
return -32768; |
||||
if (untruncated > 32767) |
||||
return 32767; |
||||
return result; |
||||
*/ |
||||
} |
@ -1,29 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 24/05/2021.
|
||||
//
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_INTERPOLATION_H |
||||
#define TEENSY_RESAMPLING_SDREADER_INTERPOLATION_H |
||||
|
||||
#include <cinttypes> |
||||
#include <math.h> |
||||
|
||||
|
||||
enum ResampleInterpolationType { |
||||
resampleinterpolation_none = 1, |
||||
resampleinterpolation_linear = 2, |
||||
resampleinterpolation_quadratic = 3, |
||||
}; |
||||
|
||||
struct InterpolationData |
||||
{ |
||||
int16_t x, y; |
||||
}; |
||||
|
||||
// https://en.wikipedia.org/wiki/Lagrange_polynomial
|
||||
// https://www.geeksforgeeks.org/lagranges-interpolation/
|
||||
// function to interpolate the given data points using Lagrange's formula
|
||||
// xi corresponds to the new data point whose value is to be obtained
|
||||
// n represents the number of known data points
|
||||
int16_t interpolate(InterpolationData *f, double xi, int n); |
||||
int16_t fastinterpolate(int16_t d1, int16_t d2, int16_t d3, int16_t d4, float x); |
||||
#endif //TEENSY_RESAMPLING_SDREADER_INTERPOLATION_H
|
@ -1,19 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 25/04/2021.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_LOOP_TYPE_H |
||||
#define TEENSY_RESAMPLING_LOOP_TYPE_H |
||||
|
||||
typedef enum loop_type { |
||||
looptype_none, |
||||
looptype_repeat, |
||||
looptype_pingpong |
||||
} loop_type; |
||||
|
||||
typedef enum play_start { |
||||
play_start_sample, |
||||
play_start_loop, |
||||
} play_start; |
||||
|
||||
#endif //TEENSY_RESAMPLING_LOOP_TYPE_H
|
@ -1,30 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_PLAYARRAYRESMP_H |
||||
#define TEENSY_RESAMPLING_SDREADER_PLAYARRAYRESMP_H |
||||
|
||||
|
||||
#include "Arduino.h" |
||||
#include "AudioStream.h" |
||||
#include "ResamplingArrayReader.h" |
||||
#include "playresmp.h" |
||||
|
||||
class AudioPlayArrayResmp : public AudioPlayResmp<newdigate::ResamplingArrayReader> |
||||
{ |
||||
public: |
||||
AudioPlayArrayResmp(void) : |
||||
AudioPlayResmp<newdigate::ResamplingArrayReader>() |
||||
{ |
||||
reader = new newdigate::ResamplingArrayReader(); |
||||
begin(); |
||||
} |
||||
|
||||
virtual ~AudioPlayArrayResmp() { |
||||
delete reader; |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_PLAYARRAYRESMP_H
|
@ -1,26 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_PLAYLFSRAWRESMP_H |
||||
#define TEENSY_RESAMPLING_SDREADER_PLAYLFSRAWRESMP_H |
||||
|
||||
#include "ResamplingLfsReader.h" |
||||
|
||||
class AudioPlayLfsResmp : public AudioPlayResmp<newdigate::ResamplingLfsReader> |
||||
{ |
||||
public: |
||||
AudioPlayLfsResmp(LittleFS &fs) : |
||||
AudioPlayResmp<newdigate::ResamplingLfsReader>() |
||||
{ |
||||
reader = new newdigate::ResamplingLfsReader(fs); |
||||
begin(); |
||||
} |
||||
|
||||
virtual ~AudioPlayLfsResmp() { |
||||
delete reader; |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_PLAYLFSRAWRESMP_H
|
@ -1,151 +0,0 @@ |
||||
#ifndef TEENSY_RESAMPLING_SDREADER_PLAYRESMP_H |
||||
#define TEENSY_RESAMPLING_SDREADER_PLAYRESMP_H |
||||
|
||||
#include "Arduino.h" |
||||
#include "Audio.h" |
||||
#include "loop_type.h" |
||||
|
||||
template <class TResamplingReader> |
||||
class AudioPlayResmp : public AudioStream |
||||
{ |
||||
public: |
||||
AudioPlayResmp(): AudioStream(0, NULL), reader(nullptr) |
||||
{ |
||||
} |
||||
|
||||
virtual ~AudioPlayResmp() { |
||||
} |
||||
|
||||
void begin(void) |
||||
{ |
||||
reader->begin(); |
||||
} |
||||
|
||||
bool playRaw(const char *filename, uint16_t numChannels) |
||||
{ |
||||
stop(); |
||||
return reader->play(filename, false, numChannels); |
||||
} |
||||
|
||||
bool playWav(const char *filename) |
||||
{ |
||||
stop(); |
||||
return reader->play(filename, true, 0); |
||||
} |
||||
|
||||
bool playRaw(int16_t *data, uint32_t numSamples, uint16_t numChannels) |
||||
{ |
||||
stop(); |
||||
return reader->playRaw(data, numSamples, numChannels); |
||||
} |
||||
|
||||
bool playRaw(const unsigned int *data, uint32_t numSamples, uint16_t numChannels)
|
||||
{ |
||||
return playRaw((int16_t *) data, numSamples, numChannels); |
||||
} |
||||
|
||||
bool playWav(int16_t *data, uint32_t fileSize) |
||||
{ |
||||
stop(); |
||||
return reader->playWav(data, fileSize); |
||||
} |
||||
|
||||
bool playWav(const unsigned int *data, uint32_t fileSize) { |
||||
return playWav((int16_t *) data, fileSize); |
||||
} |
||||
|
||||
void setPlaybackRate(float f) { |
||||
reader->setPlaybackRate(f); |
||||
} |
||||
|
||||
void setLoopType(loop_type t) { |
||||
reader->setLoopType(t); |
||||
} |
||||
|
||||
void setLoopStart(uint32_t loop_start) { |
||||
reader->setLoopStart(loop_start); |
||||
} |
||||
|
||||
void setLoopFinish(uint32_t loop_finish) { |
||||
reader->setLoopFinish(loop_finish); |
||||
} |
||||
|
||||
void setUseDualPlaybackHead(bool useDualPlaybackHead) { |
||||
reader->setUseDualPlaybackHead(useDualPlaybackHead); |
||||
} |
||||
|
||||
void setCrossfadeDurationInSamples(unsigned int crossfadeDurationInSamples) { |
||||
reader->setCrossfadeDurationInSamples(crossfadeDurationInSamples); |
||||
} |
||||
|
||||
void setPlayStart(play_start start) { |
||||
reader->setPlayStart(start); |
||||
} |
||||
|
||||
void enableInterpolation(bool enable) { |
||||
if (enable) |
||||
reader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_quadratic); |
||||
else
|
||||
reader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_none); |
||||
} |
||||
|
||||
bool isPlaying(void) { |
||||
return reader->isPlaying(); |
||||
}; |
||||
|
||||
void stop() { |
||||
reader->stop(); |
||||
} |
||||
|
||||
void update() |
||||
{ |
||||
int _numChannels = reader->getNumChannels(); |
||||
if (_numChannels == -1) |
||||
return; |
||||
|
||||
unsigned int i, n; |
||||
audio_block_t *blocks[_numChannels]; |
||||
int16_t *data[_numChannels]; |
||||
// only update if we're playing
|
||||
if (!reader->isPlaying()) return; |
||||
|
||||
// allocate the audio blocks to transmit
|
||||
for (int i=0; i < _numChannels; i++) { |
||||
blocks[i] = allocate(); |
||||
if (blocks[i] == nullptr) return; |
||||
data[i] = blocks[i]->data; |
||||
} |
||||
|
||||
if (reader->available()) { |
||||
// we can read more data from the file...
|
||||
n = reader->read((void**)data, AUDIO_BLOCK_SAMPLES); |
||||
for (int channel=0; channel < _numChannels; channel++) { |
||||
memset( &blocks[channel]->data[n], 0, (AUDIO_BLOCK_SAMPLES - n) * 2); |
||||
transmit(blocks[channel], channel); |
||||
} |
||||
|
||||
if(_numChannels == 1) { |
||||
transmit(blocks[0], 1); |
||||
} |
||||
} else { |
||||
reader->close(); |
||||
} |
||||
for (int channel=0; channel < _numChannels; channel++) { |
||||
release(blocks[channel]); |
||||
} |
||||
} |
||||
uint32_t positionMillis() |
||||
{ |
||||
return reader->positionMillis(); |
||||
} |
||||
|
||||
uint32_t lengthMillis() |
||||
{ |
||||
return reader->lengthMillis(); |
||||
} |
||||
|
||||
protected: |
||||
TResamplingReader *reader; |
||||
}; |
||||
|
||||
#endif // TEENSY_RESAMPLING_SDREADER_PLAYRESMP_H
|
@ -1,32 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_PLAYSDRAWRESMP_H |
||||
#define TEENSY_RESAMPLING_SDREADER_PLAYSDRAWRESMP_H |
||||
|
||||
|
||||
#include "Arduino.h" |
||||
#include "AudioStream.h" |
||||
#include "SD.h" |
||||
#include "stdint.h" |
||||
#include "ResamplingSdReader.h" |
||||
#include "playresmp.h" |
||||
|
||||
class AudioPlaySdResmp : public AudioPlayResmp<newdigate::ResamplingSdReader> |
||||
{ |
||||
public: |
||||
AudioPlaySdResmp(void) : |
||||
AudioPlayResmp<newdigate::ResamplingSdReader>() |
||||
{ |
||||
reader = new newdigate::ResamplingSdReader(); |
||||
begin(); |
||||
} |
||||
|
||||
virtual ~AudioPlaySdResmp() { |
||||
delete reader; |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_PLAYSDRAWRESMP_H
|
@ -1,31 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_PLAYSERIALFLASHRAWRESMP_H |
||||
#define TEENSY_RESAMPLING_SDREADER_PLAYSERIALFLASHRAWRESMP_H |
||||
|
||||
#include "Arduino.h" |
||||
#include "AudioStream.h" |
||||
#include "SerialFlash.h" |
||||
#include "stdint.h" |
||||
#include "ResamplingSerialFlashReader.h" |
||||
#include "playresmp.h" |
||||
|
||||
class AudioPlaySerialFlashResmp : public AudioPlayResmp<newdigate::ResamplingSerialFlashReader> |
||||
{ |
||||
public: |
||||
AudioPlaySerialFlashResmp(SerialFlashChip &fs) : |
||||
AudioPlayResmp<newdigate::ResamplingSerialFlashReader>() |
||||
{ |
||||
reader = new newdigate::ResamplingSerialFlashReader(fs); |
||||
begin(); |
||||
} |
||||
|
||||
virtual ~AudioPlaySerialFlashResmp() { |
||||
delete reader; |
||||
} |
||||
}; |
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_PLAYSERIALFLASHRAWRESMP_H
|
@ -1,181 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 20/07/2020.
|
||||
//
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_WAVEHEADERPARSER_H |
||||
#define TEENSY_RESAMPLING_SDREADER_WAVEHEADERPARSER_H |
||||
|
||||
#include <string> |
||||
#include <cstdint> |
||||
#include <SD.h> |
||||
#include "spi_interrupt.h" |
||||
|
||||
using namespace std; |
||||
|
||||
// from https://gist.github.com/Jon-Schneider/8b7c53d27a7a13346a643dac9c19d34f
|
||||
struct wav_header { |
||||
// RIFF Header
|
||||
char riff_header[4] = {0,0,0,0}; // 00 - 03 - Contains "RIFF"
|
||||
int header_chunk_size = 0; // 04 - 07 - Size of the wav portion of the file, which follows the first 8 bytes. File size - 8
|
||||
char wave_header[4] = {0,0,0,0}; // 08 - 11 - Contains "WAVE"
|
||||
|
||||
// Format Header
|
||||
char fmt_header[4] = {0,0,0,0}; // 12 - 15 - Contains "fmt " (includes trailing space)
|
||||
int fmt_chunk_size = 0; // 16 - 19 - Should be 16 for PCM
|
||||
short audio_format = 0; // 20 - 21 - Should be 1 for PCM. 3 for IEEE Float
|
||||
short num_channels = 0; // 22 - 23
|
||||
int sample_rate = 0; // 24 - 27
|
||||
int byte_rate = 0; // 28 - 31
|
||||
short sample_alignment = 0; // 32 - 33
|
||||
short bit_depth = 0; // 34 - 35
|
||||
}; |
||||
|
||||
struct wav_data_header { |
||||
// Data
|
||||
char data_header[4] = {0,0,0,0}; // 36 - 39
|
||||
unsigned int data_bytes = 0;// 40 - 43
|
||||
}; |
||||
|
||||
class WaveHeaderParser { |
||||
public: |
||||
bool readWaveHeader(const char *filename, wav_header &header, wav_data_header &wav_data_header) { |
||||
File wavFile = SD.open(filename); |
||||
if (!wavFile) { |
||||
Serial.printf("Not able to open wave file... %s\n", filename); |
||||
return false; |
||||
} |
||||
bool result = readWaveHeader(filename, header, wavFile); |
||||
if (result) { |
||||
wavFile.seek(36); |
||||
unsigned char buffer[8]; |
||||
size_t bytesRead = wavFile.read(buffer, 8); |
||||
if (bytesRead != 8) { |
||||
Serial.printf("Not able to read header... %s\n", filename); |
||||
result = false; |
||||
} |
||||
|
||||
if (result) { |
||||
unsigned infoTagsSize; |
||||
result = readInfoTags(buffer, 0, infoTagsSize); |
||||
|
||||
if (result) { |
||||
wavFile.seek(36 + infoTagsSize); |
||||
bytesRead = wavFile.read(buffer, 8); |
||||
if (bytesRead != 8) { |
||||
Serial.printf("Not able to read header... %s\n", filename); |
||||
return false; |
||||
} |
||||
|
||||
result = readDataHeader(buffer, 0, wav_data_header); |
||||
} |
||||
} |
||||
} |
||||
wavFile.close(); |
||||
return result; |
||||
} |
||||
|
||||
bool readWaveHeader(const char *filename, wav_header &header, File &wavFile) { |
||||
char buffer[36]; |
||||
int bytesRead = wavFile.read(buffer, 36); |
||||
if (bytesRead != 36) { |
||||
Serial.printf("expected 36 bytes (was %d)\n", bytesRead); |
||||
return false; |
||||
} |
||||
return readWaveHeaderFromBuffer(buffer, header); |
||||
} |
||||
|
||||
bool readWaveHeaderFromBuffer(const char *buffer, wav_header &header) { |
||||
if (buffer[0] != 'R' || buffer[1] != 'I' || buffer[2] != 'F' || buffer[3] != 'F') { |
||||
Serial.printf("expected RIFF (was %s)\n", buffer); |
||||
return false; |
||||
} |
||||
for (int i=0; i < 4; i++) |
||||
header.riff_header[i] = buffer[i]; |
||||
|
||||
unsigned char *b = (unsigned char*)buffer; |
||||
|
||||
auto header_chunk_size = static_cast<unsigned long>(b[7] << 24 | b[6] << 16 | b[5] << 8 | b[4]); |
||||
header.header_chunk_size = header_chunk_size; |
||||
|
||||
for (int i=0; i < 4; i++) |
||||
header.wave_header[i] = buffer[i+8]; |
||||
if (buffer[8] != 'W' || buffer[9] != 'A' || buffer[10] != 'V' || buffer[11] != 'E') { |
||||
Serial.printf("expected WAVE (was %s)\n", buffer[8]); |
||||
return false; |
||||
} |
||||
|
||||
for (int i=0; i < 4; i++) |
||||
header.fmt_header[i] = buffer[i+12]; |
||||
if (buffer[12] != 'f' || buffer[13] != 'm' || buffer[14] != 't' || buffer[15] != ' ') { |
||||
Serial.printf("expected 'fmt ' (was %s)\n", buffer[12]); |
||||
return false; |
||||
} |
||||
|
||||
auto fmt_chunk_size = static_cast<unsigned long>(b[19] << 24 | b[18] << 16 | b[17] << 8 | b[16]); |
||||
header.fmt_chunk_size = fmt_chunk_size; |
||||
if (fmt_chunk_size != 16) { |
||||
Serial.printf("chunk size should be 16 for PCM wave data... (was %d)\n", fmt_chunk_size); |
||||
return false; |
||||
} |
||||
|
||||
auto audio_format = static_cast<unsigned long>((b[21] << 8) | b[20]); |
||||
header.audio_format = audio_format; |
||||
|
||||
auto num_channels = static_cast<unsigned long>((b[23] << 8) | b[22]); |
||||
header.num_channels = num_channels; |
||||
|
||||
uint32_t sample_rate = static_cast<uint32_t>(b[27] << 24 | b[26] << 16 | b[25] << 8 | b[24]); |
||||
header.sample_rate = sample_rate; |
||||
|
||||
uint32_t byte_rate = static_cast<uint32_t>(b[31] << 24 | b[30] << 16 | b[29] << 8 | b[28]); |
||||
header.byte_rate = byte_rate; |
||||
|
||||
auto sample_alignment = static_cast<unsigned long>((b[33] << 8) | b[32]); |
||||
header.sample_alignment = sample_alignment; |
||||
|
||||
auto bit_depth = static_cast<unsigned long>(b[35] << 8 | b[34]); |
||||
header.bit_depth = bit_depth; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
bool readInfoTags(unsigned char *buffer, size_t offset, unsigned &infoTagsSize) { |
||||
if ( buffer[offset+0] == 'L'
|
||||
&& buffer[offset+1] == 'I'
|
||||
&& buffer[offset+2] == 'S'
|
||||
&& buffer[offset+3] == 'T') { |
||||
infoTagsSize = static_cast<uint32_t>(buffer[offset+7] << 24 | buffer[offset+6] << 16 | buffer[offset+5] << 8 | buffer[offset+4]);
|
||||
infoTagsSize += 8; |
||||
return true; |
||||
} |
||||
|
||||
if ( buffer[offset+0] == 'd'
|
||||
&& buffer[offset+1] == 'a'
|
||||
&& buffer[offset+2] == 't'
|
||||
&& buffer[offset+3] == 'a') { |
||||
infoTagsSize = 0; |
||||
return true; |
||||
} |
||||
|
||||
Serial.println("expected 'data' or 'LIST'..."); |
||||
return false; |
||||
} |
||||
|
||||
bool readDataHeader(unsigned char *buffer, size_t offset, wav_data_header &data_header) { |
||||
|
||||
for (int i=0; i < 4; i++) |
||||
data_header.data_header[i] = buffer[i+offset]; |
||||
|
||||
if (buffer[offset+0] != 'd' || buffer[offset+1] != 'a' || buffer[offset+2] != 't' || buffer[offset+3] != 'a') { |
||||
Serial.printf("expected data... (was %d)\n", buffer); |
||||
return false; |
||||
} |
||||
|
||||
auto data_bytes = static_cast<unsigned long>(buffer[offset+7] << 24 | buffer[offset+6] << 16 | buffer[offset+5] << 8 | buffer[offset+4]); |
||||
data_header.data_bytes = data_bytes; |
||||
return true; |
||||
} |
||||
private: |
||||
}; |
||||
|
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_WAVEHEADERPARSER_H
|
@ -1,3 +0,0 @@ |
||||
#!/bin/bash |
||||
cd cmake-build-debug/test/ |
||||
./tests |
@ -1,87 +0,0 @@ |
||||
cmake_minimum_required(VERSION 3.5) |
||||
project(tests C CXX) |
||||
if (DEFINED BUILD_FOR_LINUX) |
||||
set(CMAKE_CXX_STANDARD 17) |
||||
|
||||
set (Boost_USE_STATIC_LIBS OFF) |
||||
find_package (Boost REQUIRED COMPONENTS unit_test_framework) |
||||
include_directories (${Boost_INCLUDE_DIRS}) |
||||
|
||||
find_package(teensy_x86_stubs) |
||||
include_directories(${teensy_x86_stubs_INCLUDE_DIR}) |
||||
message(STATUS "include-dir: teensy_x86_stubs: ${teensy_x86_stubs_INCLUDE_DIR}") |
||||
|
||||
find_package(teensy_audio_x86_stubs) |
||||
include_directories(${teensy_audio_x86_stubs_INCLUDE_DIR}) |
||||
|
||||
find_package(teensy_x86_sd_stubs) |
||||
include_directories(${teensy_x86_sd_stubs_INCLUDE_DIR}) |
||||
|
||||
include_directories(../src) |
||||
include_directories(../test/audio) |
||||
|
||||
add_executable(embedfile embedfile.c) |
||||
|
||||
add_custom_command(OUTPUT kick_raw.c |
||||
COMMAND embedfile kick_raw ${CMAKE_SOURCE_DIR}/test/resources/input/kick.raw |
||||
) |
||||
|
||||
add_custom_command(OUTPUT stereo_souljah_raw.c |
||||
COMMAND embedfile stereo_souljah_raw ${CMAKE_SOURCE_DIR}/test/resources/input/stereo_souljah.raw |
||||
) |
||||
|
||||
add_custom_command(OUTPUT stereo_souljah_wav.c |
||||
COMMAND embedfile stereo_souljah_wav ${CMAKE_SOURCE_DIR}/test/resources/input/stereo_souljah.wav |
||||
) |
||||
|
||||
add_custom_command(OUTPUT mono_souljah_wav.c |
||||
COMMAND embedfile mono_souljah_wav ${CMAKE_SOURCE_DIR}/test/resources/input/mono_souljah.wav |
||||
) |
||||
|
||||
add_custom_command(OUTPUT PNO1C1_raw.c |
||||
COMMAND embedfile PNO1C1_raw ${CMAKE_SOURCE_DIR}/test/resources/input/PNO1C1.raw |
||||
) |
||||
|
||||
add_executable(tests |
||||
kick_raw.c |
||||
stereo_souljah_raw.c |
||||
stereo_souljah_wav.c |
||||
mono_souljah_wav.c |
||||
PNO1C1_raw.c |
||||
audio/output_test.cpp |
||||
|
||||
audio/array/AudioArrayFixture.h |
||||
audio/array/test_array_mono_loop_forward_playback.cpp |
||||
audio/array/test_array_stereo_loop_forward_playback.cpp |
||||
|
||||
audio/wav/AudioWavFixture.h |
||||
audio/wav/test_wav_mono_loop_forward_playback.cpp |
||||
audio/wav/test_wav_stereo_loop_forward_playback.cpp |
||||
audio/wav/test_wav_tags.cpp |
||||
|
||||
low_level/sd/ResamplingReaderFixture.h |
||||
low_level/sd/test_raw_mono_noloop_forward_playback.cpp |
||||
low_level/sd/test_raw_mono_noloop_forward_double_rate_playback.cpp |
||||
low_level/sd/test_raw_mono_loop_forward_playback.cpp |
||||
low_level/sd/test_wav_mono_noloop_forward_playback.cpp |
||||
low_level/sd/test_wav_mono_loop_forward_playback.cpp |
||||
low_level/sd/test_wav_mono_noloop_backward_playback.cpp |
||||
|
||||
low_level/wav_header/test_parse_wave_header.cpp |
||||
|
||||
low_level/array/test_array_mono_loop_forward_playback.cpp |
||||
low_level/array/test_array_stereo_loop_forward_playback.cpp |
||||
|
||||
low_level/arraywav/test_array_mono_loop_forward_playback.cpp |
||||
low_level/arraywav/test_array_stereo_loop_forward_playback.cpp |
||||
|
||||
low_level/indexedfile/test_indexablefile.cpp |
||||
) |
||||
|
||||
target_link_libraries(tests ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) |
||||
target_link_libraries(tests ${teensy_x86_stubs_LIBS}) |
||||
target_link_libraries(tests ${teensy_audio_x86_stubs_LIBS}) |
||||
target_link_libraries(tests ${teensy_x86_sd_stubs_LIBS}) |
||||
target_link_libraries(tests teensy_variable_playback) |
||||
message(STATUS ${teensy_x86_stubs_LIBS}) |
||||
endif() |
@ -1,24 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 17/06/2021.
|
||||
//
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <iterator> |
||||
#include "output_test.h" |
||||
#include "playarrayresmp.h" |
||||
|
||||
struct AudioArrayFixture { |
||||
|
||||
AudioArrayFixture() { |
||||
AudioMemory(20); |
||||
} |
||||
|
||||
~AudioArrayFixture() { |
||||
arduino_should_exit = true; |
||||
} |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H
|
@ -1,234 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_AUDIO_ARRAY_READERTESTS_CPP |
||||
#define TEENSY_AUDIO_ARRAY_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "AudioArrayFixture.h" |
||||
|
||||
extern unsigned char kick_raw[]; |
||||
extern unsigned int kick_raw_len; // in bytes, divide by 2 to get samples
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_audio_array_mono_loop_forward_playback) |
||||
|
||||
const uint16_t numberOfChannels = 1; |
||||
|
||||
const std::string referencePath = "test/resources/reference/"; |
||||
const std::string inputPath = "test/resources/input/"; |
||||
const std::string outputPath = "output/"; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_1_0000_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "Array_fwd_1_0000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_0_5000_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
const double playbackRate = 0.5; |
||||
const std::string testName = "Array_fwd_0_5000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_2_0000_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 2.0; |
||||
const std::string testName = "Array_fwd_2_0000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str());
|
||||
memory.begin();
|
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_0_7437_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 0.7437; |
||||
const std::string testName = "Array_fwd_0_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_1_7437_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.7437; |
||||
const std::string testName = "Array_fwd_1_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_8_7437_quadratic_mono_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 8.7437; |
||||
const std::string testName = "Array_fwd_8_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin();
|
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)kick_raw, kick_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((kick_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_AUDIO_ARRAY_READERTESTS_CPP
|
@ -1,239 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_AUDIO_ARRAY_READERTESTS_CPP |
||||
#define TEENSY_AUDIO_ARRAY_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "AudioArrayFixture.h" |
||||
|
||||
extern unsigned char stereo_souljah_raw[]; |
||||
extern unsigned int stereo_souljah_raw_len; |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_audio_array_stereo_loop_forward_playback) |
||||
|
||||
const uint16_t numberOfChannels = 2; |
||||
const std::string referencePath = "test/resources/reference/"; |
||||
const std::string inputPath = "test/resources/input/"; |
||||
const std::string outputPath = "output/"; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_1_0000_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "Array_fwd_1_0000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_0_5000_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
const double playbackRate = 0.5; |
||||
const std::string testName = "Array_fwd_0_5000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_2_0000_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 2.0; |
||||
const std::string testName = "Array_fwd_2_0000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str());
|
||||
memory.begin();
|
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_0_7437_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 0.7437; |
||||
const std::string testName = "Array_fwd_0_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_1_7437_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.7437; |
||||
const std::string testName = "Array_fwd_1_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin(); |
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Array_fwd_8_7437_quadratic_stereo_noloop, AudioArrayFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlayArrayResmp memory; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(memory, 0, testout, 0); |
||||
AudioConnection patchCord2(memory, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 8.7437; |
||||
const std::string testName = "Array_fwd_8_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath+testName+".wav"; |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
memory.begin();
|
||||
memory.enableInterpolation(true); |
||||
memory.setPlaybackRate(playbackRate); |
||||
memory.playRaw((int16_t*)stereo_souljah_raw, stereo_souljah_raw_len / 2, numberOfChannels); |
||||
for (int i=0; i < ((stereo_souljah_raw_len)/128) + 20; i++) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_AUDIO_ARRAY_READERTESTS_CPP
|
@ -1,92 +0,0 @@ |
||||
#include "output_test.h" |
||||
|
||||
audio_block_t * TestAudioOutput::block_left_1st = NULL; |
||||
audio_block_t * TestAudioOutput::block_right_1st = NULL; |
||||
bool TestAudioOutput::update_responsibility = false; |
||||
|
||||
void TestAudioOutput::begin(void) |
||||
{ |
||||
update_responsibility = update_setup(); |
||||
active = true; |
||||
} |
||||
|
||||
void TestAudioOutput::isr(void) |
||||
{ |
||||
if (TestAudioOutput::update_responsibility) AudioStream::update_all(); |
||||
} |
||||
|
||||
void TestAudioOutput::update(void) |
||||
{ |
||||
// null audio device: discard all incoming data
|
||||
if (!active) return; |
||||
audio_block_t *block = receiveReadOnly(0); |
||||
audio_block_t *blockRight = receiveReadOnly(1); |
||||
if (block) { |
||||
|
||||
if (_saveToFile) { |
||||
if (!blockRight){ |
||||
_outputFile.write((char*)block->data, 256); |
||||
_dataSize += 256; |
||||
} else { |
||||
|
||||
int16_t interleaved[256]; |
||||
|
||||
if (blockRight) { |
||||
memcpy_tdm_tx(interleaved, block->data, blockRight->data); |
||||
} else
|
||||
memset(interleaved, 0, 512); |
||||
|
||||
_outputFile.write((char*)interleaved, 512); |
||||
_dataSize += 512; |
||||
} |
||||
|
||||
} |
||||
|
||||
/*
|
||||
Serial.print("Ch1:");
|
||||
for (int i=0; i<AUDIO_BLOCK_SAMPLES;i++) {
|
||||
if (block->data[i] < 0) |
||||
Serial.printf("-%04x ", -block->data[i]); |
||||
else
|
||||
Serial.printf(" %04x ", block->data[i]); |
||||
} |
||||
Serial.println();
|
||||
*/ |
||||
release(block); |
||||
|
||||
if (blockRight) { |
||||
/*
|
||||
Serial.print("Ch2:");
|
||||
for (int i=0; i<AUDIO_BLOCK_SAMPLES;i++) {
|
||||
if (blockRight->data[i] < 0) |
||||
Serial.printf("-%04x ", -blockRight->data[i]); |
||||
else
|
||||
Serial.printf(" %04x ", blockRight->data[i]); |
||||
} |
||||
Serial.println();
|
||||
*/ |
||||
release(blockRight); |
||||
} |
||||
} else {
|
||||
//Serial.print(" empty block \n");
|
||||
} |
||||
} |
||||
|
||||
// Taken from https://github.com/PaulStoffregen/Audio/blob/master/output_tdm.cpp
|
||||
void TestAudioOutput::memcpy_tdm_tx(int16_t *dest, int16_t *src1, int16_t *src2) |
||||
{ |
||||
int16_t i, in1, in2, out1, out2; |
||||
|
||||
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) { |
||||
*dest = *src1++; |
||||
*(dest + 1) = *src2++; |
||||
dest += 2; |
||||
} |
||||
} |
||||
|
||||
unsigned char TestAudioOutput::test_output_wav_header[] = { |
||||
0x52, 0x49, 0x46, 0x46, 0x38, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, |
||||
0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, |
||||
0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, |
||||
0x64, 0x61, 0x74, 0x61, 0x14, 0x00, 0x00, 0x00 |
||||
}; |
@ -1,101 +0,0 @@ |
||||
#ifndef output_test_h_ |
||||
#define output_test_h_ |
||||
|
||||
#include <Arduino.h> |
||||
#include <AudioStream.h> |
||||
#include <thread> |
||||
#include <iostream> |
||||
#include <fstream> |
||||
#include <filesystem> |
||||
#include <unistd.h> |
||||
|
||||
#ifdef __APPLE__ |
||||
#define __filesystem std::__fs::filesystem |
||||
#else |
||||
#define __filesystem std::filesystem |
||||
#endif |
||||
class TestAudioOutput : public AudioStream |
||||
{ |
||||
public: |
||||
TestAudioOutput(void) : AudioStream(2, inputQueueArray) { begin(); } |
||||
virtual void update(void); |
||||
void begin(void); |
||||
static void isr(void); |
||||
bool saveOutputFile(const char * path, const char* filename){ |
||||
if (num_inputs == 0) return false; |
||||
char cwd[500]; |
||||
if (getcwd(cwd, sizeof(cwd)) != NULL) { |
||||
printf("Current working dir: %s\n", cwd); |
||||
} else { |
||||
perror("getcwd() error"); |
||||
} |
||||
std::string outputPath = std::string(cwd) + "/" + std::string(path); |
||||
__filesystem::path p(outputPath); |
||||
if (! __filesystem::exists(p) ) |
||||
__filesystem::create_directories(outputPath); |
||||
|
||||
_filePath = outputPath + std::string(filename); |
||||
std::cout << "saving output audio .wav file to " << _filePath << std::endl; |
||||
_outputFile.open(_filePath, std::ios_base::trunc | std::ios_base::out); |
||||
if (!_outputFile.is_open()) { |
||||
Serial.printf("couldn't open file for recording...%s\n", _filePath.c_str()); |
||||
return false;
|
||||
} else { |
||||
_filename = filename; |
||||
_outputFile.write((char*)test_output_wav_header, 44); |
||||
_saveToFile = true;
|
||||
return true;
|
||||
} |
||||
} |
||||
void closeOutputfile(uint16_t numChannels) { |
||||
if (!_saveToFile) return; |
||||
if (_outputFile.is_open()) { |
||||
_saveToFile = false; |
||||
char buf[4]; |
||||
buf[1] = numChannels >> 8; |
||||
buf[0] = numChannels; |
||||
_outputFile.seekp(22, std::ios_base::beg); |
||||
_outputFile.write(buf, 2); |
||||
|
||||
long bytespersecond = numChannels * 2 * 44100; |
||||
buf[3] = bytespersecond >> 24; |
||||
buf[2] = bytespersecond >> 16; |
||||
buf[1] = bytespersecond >> 8; |
||||
buf[0] = bytespersecond; |
||||
_outputFile.seekp(28, std::ios_base::beg); |
||||
_outputFile.write(buf, 4); |
||||
|
||||
short bytespersampleframe = numChannels * 2; |
||||
buf[1] = bytespersampleframe >> 8; |
||||
buf[0] = bytespersampleframe; |
||||
_outputFile.seekp(32, std::ios_base::beg); |
||||
_outputFile.write(buf, 2); |
||||
|
||||
buf[3] = _dataSize >> 24; |
||||
buf[2] = _dataSize >> 16; |
||||
buf[1] = _dataSize >> 8; |
||||
buf[0] = _dataSize; |
||||
_outputFile.seekp(40, std::ios_base::beg); |
||||
_outputFile.write(buf, 4); |
||||
_outputFile.close(); |
||||
_filename = nullptr; |
||||
} |
||||
} |
||||
protected: |
||||
std::ofstream _outputFile; |
||||
std::string _filePath; |
||||
static audio_block_t *block_left_1st; |
||||
static audio_block_t *block_right_1st; |
||||
static bool update_responsibility; |
||||
bool _saveToFile = false; |
||||
unsigned int _dataSize = 0; |
||||
const char *_filename; |
||||
static void memcpy_tdm_tx(int16_t *dest, int16_t *src1, int16_t *src2); |
||||
|
||||
private: |
||||
audio_block_t *inputQueueArray[2]; |
||||
static unsigned char test_output_wav_header[];
|
||||
}; |
||||
|
||||
|
||||
#endif |
@ -1,25 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 17/06/2021.
|
||||
//
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGWAVFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGWAVFIXTURE_H |
||||
|
||||
#include <Arduino.h> |
||||
#include <Audio.h> |
||||
#include <SD.h> |
||||
#include <iterator> |
||||
#include "output_test.h" |
||||
#include "playsdresmp.h" |
||||
|
||||
struct AudioWavFixture { |
||||
|
||||
AudioWavFixture() { |
||||
AudioMemory(20); |
||||
} |
||||
|
||||
~AudioWavFixture() { |
||||
arduino_should_exit = true; |
||||
} |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGWAVFIXTURE_H
|
@ -1,238 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_AUDIO_SDWAV_MONO_READERTESTS_CPP |
||||
#define TEENSY_AUDIO_SDWAV_MONO_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "AudioWavFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_audio_wav_mono_loop_forward_playback) |
||||
|
||||
const uint16_t numberOfChannels = 1; |
||||
|
||||
const std::string referencePath = "test/resources/reference/"; |
||||
const std::string inputPath = "test/resources/input/"; |
||||
const std::string outputPath = "output/"; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_1_0000_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "Wav_fwd_1_0000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
|
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_0_5000_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
const double playbackRate = 0.5; |
||||
const std::string testName = "Wav_fwd_0_5000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_2_0000_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 2.0; |
||||
const std::string testName = "Wav_fwd_2_0000_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str());
|
||||
wave.begin();
|
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_0_7437_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 0.7437; |
||||
const std::string testName = "Wav_fwd_0_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_1_7437_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.7437; |
||||
const std::string testName = "Wav_fwd_1_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_8_7437_quadratic_mono_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 8.7437; |
||||
const std::string testName = "Wav_fwd_8_7437_quadratic_mono_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin();
|
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("kick.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_AUDIO_SDWAV_MONO_READERTESTS_CPP
|
@ -1,244 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP |
||||
#define TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "AudioWavFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_audio_wav_stereo_loop_forward_playback) |
||||
|
||||
const uint16_t numberOfChannels = 2; |
||||
|
||||
const std::string referencePath = "test/resources/reference/"; |
||||
const std::string inputPath = "test/resources/input/"; |
||||
const std::string outputPath = "output/"; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_1_0000_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "Wav_fwd_1_0000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_0_5000_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
const double playbackRate = 0.5; |
||||
const std::string testName = "Wav_fwd_0_5000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
|
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_2_0000_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 2.0; |
||||
const std::string testName = "Wav_fwd_2_0000_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str());
|
||||
wave.begin();
|
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_0_7437_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 0.7437; |
||||
const std::string testName = "Wav_fwd_0_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_1_7437_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.7437; |
||||
const std::string testName = "Wav_fwd_1_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_fwd_8_7437_quadratic_stereo_noloop, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 8.7437; |
||||
const std::string testName = "Wav_fwd_8_7437_quadratic_stereo_noloop"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
testout.saveOutputFile(outputPath.c_str(), outputFile.c_str()); |
||||
wave.begin();
|
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav("stereo_souljah.wav"); |
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP
|
@ -1,118 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP |
||||
#define TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "AudioWavFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_audio_wav_tags_in_header) |
||||
|
||||
const uint16_t numberOfChannels = 2; |
||||
const std::string referencePath = "test/resources/reference/"; |
||||
const std::string inputPath = "test/resources/input/"; |
||||
const std::string outputPath = "output/"; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Wav_with_tags_in_header_1, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "SDTEST1"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
if (!testout.saveOutputFile(outputPath.c_str(), outputFile.c_str())) { |
||||
std::cout << "not able to save output file..." << std::endl; |
||||
BOOST_ERROR("not able to save output file (1)..."); |
||||
} |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
bool isPlaying = wave.playWav(outputFile.c_str()); |
||||
if (!isPlaying) { |
||||
std::cout << "input audio file is not able to play..." << std::endl; |
||||
BOOST_ERROR("input audio file is not able to play (1)..."); |
||||
} |
||||
if (!wave.isPlaying()) { |
||||
std::cout << "input audio file is not able to play..." << std::endl; |
||||
BOOST_ERROR("input audio file is not able to play (2)..."); |
||||
} |
||||
|
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::cout << "comparing " << outputFileName << " with " << referenceFileName << ";" << std::endl; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
BOOST_FIXTURE_TEST_CASE(Wav_with_tags_in_header_2, AudioWavFixture) { |
||||
|
||||
// GUItool: begin automatically generated code
|
||||
AudioPlaySdResmp wave; //xy=306,225
|
||||
TestAudioOutput testout; //xy=612,224
|
||||
AudioConnection patchCord1(wave, 0, testout, 0); |
||||
AudioConnection patchCord2(wave, 1, testout, 1); |
||||
// GUItool: end automatically generated code
|
||||
|
||||
const double playbackRate = 1.0; |
||||
const std::string testName = "SDTEST2"; |
||||
const std::string outputFile = testName+".wav"; |
||||
const std::string outputFileName = outputPath + outputFile; |
||||
const std::string referenceFileName = referencePath + testName + ".wav"; |
||||
SD.setSDCardFolderPath(inputPath); |
||||
|
||||
if (!testout.saveOutputFile(outputPath.c_str(), outputFile.c_str())) { |
||||
std::cout << "not able to save output file..." << std::endl; |
||||
BOOST_CHECK(false); |
||||
return; |
||||
} |
||||
wave.begin(); |
||||
wave.enableInterpolation(true); |
||||
wave.setPlaybackRate(playbackRate); |
||||
wave.playWav(outputFile.c_str()); |
||||
|
||||
if (!wave.isPlaying()) { |
||||
std::cout << "input audio file is not able to play..." << std::endl; |
||||
BOOST_CHECK(false); |
||||
return; |
||||
} |
||||
|
||||
while (wave.isPlaying()) { |
||||
testout.isr(); |
||||
} |
||||
testout.closeOutputfile(numberOfChannels); |
||||
patchCord1.disconnect(); |
||||
AudioConnection::reset(); |
||||
arduino_should_exit = true; |
||||
|
||||
std::ifstream ifs1(outputFileName); |
||||
std::ifstream ifs2(referenceFileName); |
||||
std::istream_iterator<char> b1(ifs1), e1; |
||||
std::istream_iterator<char> b2(ifs2), e2; |
||||
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1, e1, b2, e2); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_AUDIO_SDWAV_STEREO_READERTESTS_CPP
|
@ -1,71 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<!-- [Stuart Lange](https://stackoverflow.com/a/2975928/4634140) --> |
||||
<xsl:stylesheet version="1.0" |
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
||||
xmlns:msxsl="urn:schemas-microsoft-com:xslt" |
||||
exclude-result-prefixes="msxsl"> |
||||
|
||||
<xsl:output method="xml" |
||||
indent="yes"/> |
||||
|
||||
<xsl:template match="TestResult"> |
||||
<xsl:call-template name="testSuite" /> |
||||
</xsl:template> |
||||
|
||||
<xsl:template name="testSuite"> |
||||
<xsl:for-each select="TestSuite"> |
||||
<testsuite> |
||||
<xsl:attribute name="errors"> |
||||
<xsl:value-of select="@test_cases_failed + @test_cases_aborted"/> |
||||
</xsl:attribute> |
||||
|
||||
<xsl:attribute name="tests"> |
||||
<xsl:value-of select="@test_cases_passed + @test_cases_failed + @test_cases_skipped + @test_cases_aborted"/> |
||||
</xsl:attribute> |
||||
|
||||
<xsl:attribute name="skipped"> |
||||
<xsl:value-of select="@test_cases_skipped"/> |
||||
</xsl:attribute> |
||||
|
||||
<xsl:attribute name="failures"> |
||||
<xsl:value-of select="@test_cases_failed"/> |
||||
</xsl:attribute> |
||||
|
||||
<xsl:call-template name="testAttributes" /> |
||||
<!--results--> |
||||
<xsl:call-template name="testSuite" /> |
||||
<xsl:for-each select="TestCase"> |
||||
<testcase> |
||||
<xsl:call-template name="testAttributes" /> |
||||
<xsl:call-template name="testCaseElements" /> |
||||
</testcase> |
||||
</xsl:for-each> |
||||
<!--/results--> |
||||
</testsuite> |
||||
</xsl:for-each> |
||||
</xsl:template> |
||||
|
||||
<xsl:template name="testAttributes"> |
||||
<xsl:attribute name="name"> |
||||
<xsl:value-of select="@name"/> |
||||
</xsl:attribute> |
||||
<xsl:attribute name="success"> |
||||
<xsl:choose> |
||||
<xsl:when test="@result = 'passed'">True</xsl:when> |
||||
<xsl:when test="@result != 'passed'">False</xsl:when> |
||||
</xsl:choose> |
||||
</xsl:attribute> |
||||
<xsl:attribute name="executed">True</xsl:attribute> |
||||
<xsl:attribute name="time">0</xsl:attribute> |
||||
<xsl:attribute name="asserts"> |
||||
<xsl:value-of select="@assertions_failed + @assertions_passed"/> |
||||
</xsl:attribute> |
||||
</xsl:template> |
||||
|
||||
<xsl:template name="testCaseElements"> |
||||
<xsl:if test="@result != 'passed'"> |
||||
<failure type="No type reported" message="No message reported"/> |
||||
</xsl:if> |
||||
</xsl:template> |
||||
|
||||
</xsl:stylesheet> |
@ -1,53 +0,0 @@ |
||||
// taken from https://stackoverflow.com/a/11814544/4634140
|
||||
#include <stdlib.h> |
||||
#include <stdio.h> |
||||
|
||||
FILE* open_or_exit(const char* fname, const char* mode) |
||||
{ |
||||
FILE* f = fopen(fname, mode); |
||||
if (f == NULL) { |
||||
perror(fname); |
||||
exit(EXIT_FAILURE); |
||||
} |
||||
return f; |
||||
} |
||||
|
||||
int main(int argc, char** argv) |
||||
{ |
||||
if (argc < 3) { |
||||
fprintf(stderr, "USAGE: %s {sym} {rsrc}\n\n" |
||||
" Creates {sym}.c from the contents of {rsrc}\n", |
||||
argv[0]); |
||||
return EXIT_FAILURE; |
||||
} |
||||
|
||||
const char* sym = argv[1]; |
||||
FILE* in = open_or_exit(argv[2], "r"); |
||||
|
||||
char symfile[256]; |
||||
snprintf(symfile, sizeof(symfile), "%s.c", sym); |
||||
|
||||
FILE* out = open_or_exit(symfile,"w"); |
||||
fprintf(out, "#include <stdlib.h>\n"); |
||||
fprintf(out, "const char %s[] = {\n", sym); |
||||
|
||||
unsigned char buf[256]; |
||||
size_t nread = 0; |
||||
size_t linecount = 0; |
||||
do { |
||||
nread = fread(buf, 1, sizeof(buf), in); |
||||
size_t i; |
||||
for (i=0; i < nread; i++) { |
||||
fprintf(out, "0x%02x, ", buf[i]); |
||||
if (++linecount == 10) { fprintf(out, "\n"); linecount = 0; } |
||||
} |
||||
} while (nread > 0); |
||||
if (linecount > 0) fprintf(out, "\n"); |
||||
fprintf(out, "};\n"); |
||||
fprintf(out, "const size_t %s_len = sizeof(%s);\n\n",sym,sym); |
||||
|
||||
fclose(in); |
||||
fclose(out); |
||||
|
||||
return EXIT_SUCCESS; |
||||
} |
@ -1,23 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 17/06/2021.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H |
||||
|
||||
#include "ResamplingArrayReader.h" |
||||
|
||||
struct ResamplingArrayFixture { |
||||
|
||||
ResamplingArrayFixture() { |
||||
resamplingArrayReader = new newdigate::ResamplingArrayReader(); |
||||
} |
||||
|
||||
~ResamplingArrayFixture() { |
||||
delete resamplingArrayReader; |
||||
} |
||||
|
||||
newdigate::ResamplingArrayReader * resamplingArrayReader; |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYFIXTURE_H
|
@ -1,43 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_ARRAY_READERTESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_ARRAY_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingArrayFixture.h" |
||||
extern unsigned char kick_raw[]; |
||||
extern unsigned int kick_raw_len; // in bytes, divide by 2 to get samples
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_array_mono_loop_forward_playback) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingArrayFixture) { |
||||
|
||||
const uint32_t expectedDataSize = kick_raw_len; // 32 16bit samples = 64 bytes of space
|
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
|
||||
resamplingArrayReader->begin(); |
||||
resamplingArrayReader->setPlaybackRate(1.0f); |
||||
resamplingArrayReader->playRaw((int16_t*)kick_raw, kick_raw_len/2, 1); |
||||
resamplingArrayReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_linear); |
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
|
||||
int j = 0, bytesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
bytesRead = resamplingArrayReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += bytesRead; |
||||
//printf("j:%d bytesRead: %d \n", j, bytesRead);
|
||||
//printf("\n");
|
||||
j++; |
||||
} while (j < 3); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingArrayReader->close(); |
||||
BOOST_CHECK_EQUAL(true, true); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_READERTESTS_CPP
|
@ -1,54 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_ARRAY_READERTESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_ARRAY_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingArrayFixture.h" |
||||
#include "AudioStream.h" |
||||
|
||||
extern unsigned char stereo_souljah_raw[]; |
||||
extern unsigned int stereo_souljah_raw_len; |
||||
BOOST_AUTO_TEST_SUITE(test_array_stereo_loop_forward_playback) |
||||
|
||||
unsigned char stereo_raw[] = { |
||||
0x00, 0x00, 0x10, 0x00,
|
||||
0x01, 0x00, 0x11, 0x00,
|
||||
0x02, 0x00, 0x12, 0x00, |
||||
0x03, 0x00, 0x13, 0x00,
|
||||
0x04, 0x00, 0x14, 0x00,
|
||||
0x05, 0x00, 0x15, 0x00 }; |
||||
|
||||
unsigned int stereo_raw_length = 24; |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingArrayFixture) { |
||||
|
||||
const uint32_t expectedDataSize = stereo_souljah_raw_len; // 32 16bit samples = 64 bytes of space
|
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
|
||||
resamplingArrayReader->begin(); |
||||
resamplingArrayReader->setPlaybackRate(0.5f); |
||||
resamplingArrayReader->playRaw((int16_t*)stereo_raw, stereo_raw_length/4, 1); |
||||
resamplingArrayReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_none); |
||||
int16_t actual_left[256]; |
||||
int16_t actual_right[256]; |
||||
int16_t *buffers[2] = { actual_left, actual_right }; |
||||
|
||||
int j = 0, bytesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
bytesRead = resamplingArrayReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += bytesRead; |
||||
//printf("j:%d bytesRead: %d \n", j, bytesRead);
|
||||
j++; |
||||
} while (j < 3); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingArrayReader->close(); |
||||
BOOST_CHECK_EQUAL(true, true); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_READERTESTS_CPP
|
@ -1,23 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 17/06/2021.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYWAVFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYWAVFIXTURE_H |
||||
|
||||
#include "ResamplingArrayReader.h" |
||||
|
||||
struct ResamplingArrayWavFixture { |
||||
|
||||
ResamplingArrayWavFixture() { |
||||
resamplingArrayReader = new newdigate::ResamplingArrayReader(); |
||||
} |
||||
|
||||
~ResamplingArrayWavFixture() { |
||||
delete resamplingArrayReader; |
||||
} |
||||
|
||||
newdigate::ResamplingArrayReader * resamplingArrayReader; |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGARRAYWAVFIXTURE_H
|
@ -1,44 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_ARRAYWAV_MONO_READERTESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_ARRAYWAV_MONO_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingArrayWavFixture.h" |
||||
|
||||
extern unsigned char mono_souljah_wav[]; |
||||
extern unsigned int mono_souljah_wav_len; |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_array_mono) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingArrayWavFixture) { |
||||
|
||||
const uint32_t expectedDataSize = mono_souljah_wav_len; // 32 16bit samples = 64 bytes of space
|
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
|
||||
resamplingArrayReader->begin(); |
||||
resamplingArrayReader->setPlaybackRate(0.5f); |
||||
resamplingArrayReader->playWav((int16_t*)mono_souljah_wav, mono_souljah_wav_len/2); |
||||
resamplingArrayReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_linear); |
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
|
||||
int j = 0, bytesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
bytesRead = resamplingArrayReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += bytesRead; |
||||
//printf("j:%d bytesRead: %d \n", j, bytesRead);
|
||||
//printf("\n");
|
||||
j++; |
||||
} while (bytesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingArrayReader->close(); |
||||
BOOST_CHECK_EQUAL(true, true); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_ARRAYWAV_MONO_READERTESTS_CPP
|
@ -1,44 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_ARRAYWAV_STEREO_READERTESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_ARRAYWAV_STEREO_READERTESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingArrayWavFixture.h" |
||||
|
||||
extern unsigned char stereo_souljah_wav[]; |
||||
extern unsigned int stereo_souljah_wav_len; |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_array_stereo) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingArrayWavFixture) { |
||||
|
||||
const uint32_t expectedDataSize = stereo_souljah_wav_len; // 32 16bit samples = 64 bytes of space
|
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
|
||||
resamplingArrayReader->begin(); |
||||
resamplingArrayReader->setPlaybackRate(1.0f); |
||||
resamplingArrayReader->playWav((int16_t*)stereo_souljah_wav, stereo_souljah_wav_len/2); |
||||
resamplingArrayReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_linear); |
||||
int16_t actualLeft[256], actualRight[256]; |
||||
int16_t *buffers[2] = { actualLeft, actualRight }; |
||||
|
||||
int j = 0, bytesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
bytesRead = resamplingArrayReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += bytesRead; |
||||
//printf("j:%d bytesRead: %d \n", j, bytesRead);
|
||||
//printf("\n");
|
||||
j++; |
||||
} while (bytesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingArrayReader->close(); |
||||
BOOST_CHECK_EQUAL(true, true); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_ARRAYWAV_STEREO_READERTESTS_CPP
|
@ -1,16 +0,0 @@ |
||||
#ifndef TEENSY_VARIABLE_PLAYBACK_TEST_LOWLEVEL_INDEXEDFILE_INDEXEDFILEFIXTURE_H |
||||
#define TEENSY_VARIABLE_PLAYBACK_TEST_LOWLEVEL_INDEXEDFILE_INDEXEDFILEFIXTURE_H |
||||
|
||||
#include "IndexableFile.h" |
||||
|
||||
struct IndexableFileFixture { |
||||
|
||||
IndexableFileFixture() { |
||||
} |
||||
|
||||
~IndexableFileFixture() { |
||||
} |
||||
|
||||
}; |
||||
|
||||
#endif //TEENSY_VARIABLE_PLAYBACK_TEST_LOWLEVEL_INDEXEDFILE_INDEXEDFILEFIXTURE_H
|
@ -1,32 +0,0 @@ |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "IndexedFileFixture.h" |
||||
|
||||
#include <SD.h> |
||||
#include "IndexableSDFile.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_indexablefile) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(basic_test, IndexableFileFixture) { |
||||
|
||||
const uint16_t sample_size = 30; |
||||
int16_t file_contents[sample_size] = {0}; |
||||
for (int i=0; i<sample_size; i++) { |
||||
file_contents[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*)file_contents, sample_size * 2); |
||||
|
||||
newdigate::IndexableSDFile<16, 2> indexable("blah.h"); // use max 2 buffers, with 16 elements each....
|
||||
|
||||
/*
|
||||
for (int i=0; i<sample_size; i++) { |
||||
std::cout << i << " " << (int)indexable[i] << std::endl; |
||||
}
|
||||
|
||||
for (int i=sample_size; i>0; i--) { |
||||
std::cout << i-1 << " " << (int)indexable[i-1] << std::endl; |
||||
} |
||||
*/ |
||||
indexable.close(); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
@ -1,23 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H |
||||
|
||||
#include "ResamplingSdReader.h" |
||||
|
||||
struct ResamplingReaderFixture { |
||||
|
||||
ResamplingReaderFixture() { |
||||
resamplingSdReader = new newdigate::ResamplingSdReader(); |
||||
} |
||||
|
||||
~ResamplingReaderFixture() { |
||||
delete resamplingSdReader; |
||||
} |
||||
|
||||
newdigate::ResamplingSdReader * resamplingSdReader; |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H
|
@ -1,5 +0,0 @@ |
||||
#Don't Run Unit Tests on the Arduino Device or Emulator |
||||
https://stackoverflow.com/a/11437456 |
||||
|
||||
includes code from the following repos: |
||||
https://github.com/IronSavior/dsm2_tx |
@ -1,97 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_READER_MONO_LOOP_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_READER_MONO_LOOP_TESTS_CPP |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_raw_mono_loop_forward_playback) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 32; // 32 16bit samples = 64 bytes of space
|
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t expected[expectedDataSize]; |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
expected[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) expected, expectedDataSize * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->playRaw("test2.bin", 1); |
||||
resamplingSdReader->setLoopType(looptype_repeat); |
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d \n", j, samplesRead); |
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", currentExpected, actual[i]); |
||||
|
||||
if (currentExpected != actual[i]) { |
||||
assertionsPass = false; |
||||
BOOST_FAIL("Value not as expected!!!"); |
||||
} |
||||
|
||||
currentExpected++; |
||||
currentExpected %= expectedDataSize; |
||||
} |
||||
|
||||
printf("\n"); |
||||
j++; |
||||
} while (j < 100); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtHalfPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t size_of_datasource = 800; |
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", size_of_datasource); |
||||
int16_t dataSource[size_of_datasource]; |
||||
for (int16_t i = 0; i < size_of_datasource; i++) { |
||||
dataSource[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) dataSource, size_of_datasource * 2); |
||||
|
||||
const int16_t expectedSize = size_of_datasource * 2; |
||||
int16_t expected[expectedSize]; |
||||
for (int16_t i = 0; i < expectedSize; i++) { |
||||
expected[i] = i / 2; |
||||
} |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(0.5); |
||||
resamplingSdReader->playRaw("test2.bin", 1); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[expectedSize]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[i]); |
||||
} |
||||
printf("\n"); |
||||
|
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close();
|
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_READER_MONO_LOOP_TESTS_CPP
|
@ -1,115 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_READER_MONO_NOLOOP_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_READER_MONO_NOLOOP_TESTS_CPP |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
#include <cmath> |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_raw_mono_noloop_forward_double_rate_playback) |
||||
const double playBackRate = 2.0; |
||||
|
||||
void populateDataSourceAndSetSDCardMockData(const uint32_t size_of_datasource, int16_t dataSource[]) { |
||||
for (int16_t i = 0; i < size_of_datasource; i++) { |
||||
dataSource[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char *) dataSource, size_of_datasource * 2); |
||||
} |
||||
|
||||
void testReadForwardAtDoublePlaybackRate(const uint32_t size_of_datasource, newdigate::ResamplingSdReader *resamplingSdReader) { |
||||
printf("test_raw_mono_noloop_forward_double_rate_playback::testReadForwardAtDoublePlaybackRate(rate:%.2f\tsamples:%d)\n", playBackRate, size_of_datasource); |
||||
|
||||
int16_t dataSource[size_of_datasource]; |
||||
populateDataSourceAndSetSDCardMockData(size_of_datasource, dataSource); |
||||
|
||||
const int16_t expectedSize = ceil(size_of_datasource / 2.0); |
||||
int16_t expected[expectedSize]; |
||||
for (int16_t i = 0; i < expectedSize; i++) { |
||||
expected[i] = i * 2; |
||||
} |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(playBackRate); |
||||
resamplingSdReader->playRaw("test2.bin", 1); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
|
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i = 0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("actual: bytes read: %d; samples read: %d \t\texpected: bytes read: %d; samples read:%d\n", |
||||
total_bytes_read, total_bytes_read / 2, expectedSize * 2, expectedSize); |
||||
resamplingSdReader->close(); |
||||
|
||||
BOOST_CHECK_EQUAL(expectedSize * 2, total_bytes_read ); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas0Samples, ResamplingReaderFixture) |
||||
{ |
||||
testReadForwardAtDoublePlaybackRate(0, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas1Sample, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(1, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas2Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(2, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas4Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(2, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas255Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(255, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas256Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(256, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas257Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(257, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas500Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(500, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas512Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(512, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas800Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(800, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas1023Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(1023, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas1024Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(1024, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RawFileHas1025Samples, ResamplingReaderFixture) { |
||||
testReadForwardAtDoublePlaybackRate(1025, resamplingSdReader); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_READER_MONO_NOLOOP_TESTS_CPP
|
@ -1,95 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_READER_MONO_FORWARD_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_SDREADER_READER_MONO_FORWARD_TESTS_CPP |
||||
#define BOOST_AUTO_TEST_MAIN |
||||
#define BOOST_TEST_MODULE ResamplingReaderTests |
||||
#define BOOST_TEST_DYN_LINK |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_raw_mono_noloop_forward_playback) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardAtRegularPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 1600; |
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t expected[expectedDataSize]; |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
expected[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) expected, expectedDataSize * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->play("test2.bin", false, 1); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
resamplingSdReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_quadratic); |
||||
int16_t actual[1024]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d \n", j, samplesRead); |
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[j + i]); |
||||
} |
||||
printf("\n"); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
//BOOST_CHECK_EQUAL_COLLECTIONS(&expected[0], &expected[expectedDataSize-1], &actual[0], &actual[(total_bytes_read / 2)-1]);
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardAtHalfPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t size_of_datasource = 800; |
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", size_of_datasource); |
||||
int16_t dataSource[size_of_datasource]; |
||||
for (int16_t i = 0; i < size_of_datasource; i++) { |
||||
dataSource[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) dataSource, size_of_datasource * 2); |
||||
|
||||
const int16_t expectedSize = size_of_datasource * 2; |
||||
int16_t expected[expectedSize]; |
||||
for (int16_t i = 0; i < expectedSize; i++) { |
||||
expected[i] = i / 2; |
||||
} |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(0.5); |
||||
resamplingSdReader->playRaw("test2.bin", 1); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
//resamplingSdReader->setInterpolationType(ResampleInterpolationType::resampleinterpolation_quadratic);
|
||||
|
||||
int16_t actual[expectedSize]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
|
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_READER_MONO_FORWARD_TESTS_CPP
|
@ -1,214 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_LOOP_FORWARD_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_LOOP_FORWARD_TESTS_CPP |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_wav_mono_loop_forward_playback) |
||||
uint16_t test_sndhdrdata_sndhdr_wav[] = { |
||||
0x4952, 0x4646, 0x0038, 0x0000, 0x4157, 0x4556, |
||||
0x6d66, 0x2074, 0x0010, 0x0000, 0x0001, 0x0001, |
||||
0xac44, 0x0000, 0xb110, 0x0002, 0x0004, 0x0010, |
||||
0x6164, 0x6174, 0x0014, 0x0000 |
||||
}; |
||||
unsigned int test_sndhdrdata_sndhdr_wav_len = 22; // 22 int16_t = 44 bytes = size of wave header
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 32; // = 64 bytes
|
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2; |
||||
printf("test_wav_mono_loop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_repeat); |
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, bytesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
bytesRead = resamplingSdReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += bytesRead; |
||||
//printf("j:%d bytesRead: %d \n", j, bytesRead);
|
||||
|
||||
for (int i=0; i < bytesRead/2; i++) { |
||||
printf("\t\t[%x]:%x", currentExpected, actual[i]); |
||||
|
||||
if (currentExpected != actual[i]) { |
||||
assertionsPass = false; |
||||
BOOST_FAIL("Value not as expected!!!"); |
||||
} |
||||
|
||||
currentExpected++; |
||||
currentExpected %= expectedDataSize; |
||||
} |
||||
|
||||
printf("\n"); |
||||
j++; |
||||
} while (j < 100); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
BOOST_CHECK_EQUAL( true, assertionsPass); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRateWithLoopFinish, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 32; // = 64 bytes
|
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2; |
||||
|
||||
printf("test_wav_mono_loop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_repeat); |
||||
resamplingSdReader->setLoopFinish(8); |
||||
|
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d \n", j, samplesRead); |
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", currentExpected, actual[i]); |
||||
|
||||
if (currentExpected != actual[i]) { |
||||
assertionsPass = false; |
||||
BOOST_FAIL("Value not as expected!!!"); |
||||
} |
||||
|
||||
currentExpected++; |
||||
currentExpected %= 8; |
||||
} |
||||
|
||||
printf("\n"); |
||||
j++; |
||||
} while (j < 100); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
BOOST_CHECK_EQUAL( true, assertionsPass); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtRegularPlaybackRateWithLoopStartAndFinish, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 32; // = 64 bytes
|
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2; |
||||
printf("test_wav_mono_loop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_repeat); |
||||
resamplingSdReader->setLoopFinish(8); |
||||
|
||||
int16_t actual[256]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0, currentExpected = 0; |
||||
bool assertionsPass = true; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); // 256 samples
|
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d bytesRead: %d \n", j, total_bytes_read); |
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", currentExpected, actual[i]); |
||||
|
||||
if (currentExpected != actual[i]) { |
||||
assertionsPass = false; |
||||
BOOST_FAIL("Value not as expected!!!"); |
||||
} |
||||
|
||||
currentExpected++; |
||||
currentExpected %= 8; |
||||
} |
||||
|
||||
printf("\n"); |
||||
j++; |
||||
} while (j < 100); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
|
||||
BOOST_CHECK_EQUAL( true, assertionsPass); |
||||
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardLoopAtHalfPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t size_of_datasource = 800; |
||||
test_sndhdrdata_sndhdr_wav[20] = size_of_datasource * 2; |
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", size_of_datasource); |
||||
int16_t dataSource[size_of_datasource]; |
||||
for (int16_t i = 0; i < size_of_datasource; i++) { |
||||
dataSource[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) dataSource, size_of_datasource * 2); |
||||
|
||||
const int16_t expectedSize = size_of_datasource * 2; |
||||
int16_t expected[expectedSize]; |
||||
for (int16_t i = 0; i < expectedSize; i++) { |
||||
expected[i] = i / 2; |
||||
} |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(0.5); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[expectedSize]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[j + i]); |
||||
} |
||||
printf("\n"); |
||||
|
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_LOOP_FORWARD_TESTS_CPP
|
@ -1,107 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_BACKWARD_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_BACKWARD_TESTS_CPP |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_wav_mono_noloop_backward_playback) |
||||
|
||||
uint16_t test_sndhdrdata_sndhdr_wav[] = { |
||||
0x4952, 0x4646, 0x0038, 0x0000, 0x4157, 0x4556, |
||||
0x6d66, 0x2074, 0x0010, 0x0000, 0x0001, 0x0001, |
||||
0xac44, 0x0000, 0xb110, 0x0002, 0x0004, 0x0010, |
||||
0x6164, 0x6174, 0x0014, 0x0000 |
||||
}; |
||||
unsigned int test_sndhdrdata_sndhdr_wav_len = 22; // 22 int16_t = 44 bytes = size of wave header
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadBackwardAtRegularPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 258; |
||||
|
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2; |
||||
printf("test_wav_mono_noloop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
int16_t expected[expectedDataSize]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
expected[i] = expectedDataSize - i - 1; |
||||
} |
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(-1.0); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[1024]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d bytessamplesReadRead: %d \n", j, samplesRead); |
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
|
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
BOOST_CHECK_EQUAL(resamplingSdReader->isPlaying(), false); |
||||
resamplingSdReader->close(); |
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadBackwardAtHalfPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 258; |
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2; |
||||
printf("test_wav_mono_noloop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
int16_t expected[expectedDataSize * 2]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize * 2; i++) { |
||||
expected[i] = expectedDataSize - (i/2) - 1; |
||||
} |
||||
|
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(-0.5); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[expectedDataSize*2]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[j + i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close(); |
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_BACKWARD_TESTS_CPP
|
@ -1,103 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_FORWARD_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_FORWARD_TESTS_CPP |
||||
#include <boost/test/unit_test.hpp> |
||||
#include "ResamplingReaderFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(test_wav_mono_noloop_forward_playback) |
||||
|
||||
uint16_t test_sndhdrdata_sndhdr_wav[] = { |
||||
0x4952, 0x4646, 0x0038, 0x0000, 0x4157, 0x4556, |
||||
0x6d66, 0x2074, 0x0010, 0x0000, 0x0001, 0x0001, |
||||
0xac44, 0x0000, 0xb110, 0x0002, 0x0004, 0x0010, |
||||
0x6164, 0x6174, 0x0014, 0x0000 |
||||
}; |
||||
unsigned int test_sndhdrdata_sndhdr_wav_len = 22; // 22 int16_t = 44 bytes = size of wave header
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardAtRegularPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t expectedDataSize = 257; |
||||
test_sndhdrdata_sndhdr_wav[20] = expectedDataSize * 2;
|
||||
printf("test_wav_mono_noloop_forward_playback::ReadForwardAtRegularPlaybackRate(%d)\n", expectedDataSize); |
||||
int16_t mockFileBytes[expectedDataSize + test_sndhdrdata_sndhdr_wav_len]; |
||||
int16_t expected[expectedDataSize]; |
||||
for (int16_t i = 0; i < test_sndhdrdata_sndhdr_wav_len; i++) { |
||||
mockFileBytes[i] = test_sndhdrdata_sndhdr_wav[i]; |
||||
} |
||||
for (int16_t i = 0; i < expectedDataSize; i++) { |
||||
mockFileBytes[i + test_sndhdrdata_sndhdr_wav_len] = i; |
||||
expected[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) mockFileBytes, (expectedDataSize + test_sndhdrdata_sndhdr_wav_len) * 2); |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(1.0); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[1024]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
//printf("j:%d bytesRead: %d \n", j, samplesRead);
|
||||
|
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[j + i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
BOOST_CHECK_EQUAL(resamplingSdReader->isPlaying(), false); |
||||
resamplingSdReader->close();
|
||||
} |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadForwardAtHalfPlaybackRate, ResamplingReaderFixture) { |
||||
|
||||
const uint32_t size_of_datasource = 800; |
||||
test_sndhdrdata_sndhdr_wav[20] = size_of_datasource * 2; |
||||
printf("ReadForwardAtRegularPlaybackRate(%d)\n", size_of_datasource); |
||||
int16_t dataSource[size_of_datasource]; |
||||
for (int16_t i = 0; i < size_of_datasource; i++) { |
||||
dataSource[i] = i; |
||||
} |
||||
SD.setSDCardFileData((char*) dataSource, size_of_datasource * 2); |
||||
|
||||
const int16_t expectedSize = size_of_datasource * 2; |
||||
int16_t expected[expectedSize]; |
||||
for (int16_t i = 0; i < expectedSize; i++) { |
||||
expected[i] = i / 2; |
||||
} |
||||
|
||||
resamplingSdReader->begin(); |
||||
resamplingSdReader->setPlaybackRate(0.5); |
||||
resamplingSdReader->playWav("test2.bin"); |
||||
resamplingSdReader->setLoopType(looptype_none); |
||||
int16_t actual[expectedSize]; |
||||
int16_t *buffers[1] = { actual }; |
||||
int j = 0, samplesRead = 0, total_bytes_read = 0; |
||||
do { |
||||
samplesRead = resamplingSdReader->read((void**)buffers, 256 ); |
||||
total_bytes_read += samplesRead * 2; |
||||
printf("j:%d samplesRead: %d: ", j, samplesRead); |
||||
for (int i=0; i < samplesRead; i++) { |
||||
printf("\t\t[%x]:%x", expected[j * 256 + i], actual[j + i]); |
||||
} |
||||
printf("\n"); |
||||
if (samplesRead != 0) |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&expected[j * 256], &expected[j * 256 + samplesRead - 1], &actual[0], &actual[samplesRead - 1]); |
||||
j++; |
||||
} while (samplesRead > 0); |
||||
printf("total_bytes_read: %d \n", total_bytes_read); |
||||
resamplingSdReader->close();
|
||||
} |
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_WAVSDREADER_READER_MONO_NOLOOP_FORWARD_TESTS_CPP
|
@ -1,23 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H |
||||
#define TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H |
||||
|
||||
#include "waveheaderparser.h" |
||||
|
||||
struct WaveHeaderParserFixture { |
||||
|
||||
WaveHeaderParserFixture() { |
||||
waveHeaderParser = new WaveHeaderParser(); |
||||
} |
||||
|
||||
~WaveHeaderParserFixture() { |
||||
delete waveHeaderParser; |
||||
} |
||||
|
||||
WaveHeaderParser * waveHeaderParser; |
||||
}; |
||||
|
||||
#endif //TEENSY_RESAMPLING_SDREADER_RESAMPLINGREADERFIXTURE_H
|
@ -1,43 +0,0 @@ |
||||
//
|
||||
// Created by Nicholas Newdigate on 18/07/2020.
|
||||
//
|
||||
|
||||
#ifndef TEENSY_RESAMPLING_WAVEHEADER_PARSER_TESTS_CPP |
||||
#define TEENSY_RESAMPLING_WAVEHEADER_PARSER_TESTS_CPP |
||||
|
||||
#include <boost/test/unit_test.hpp> |
||||
#include "WaveHeaderParserFixture.h" |
||||
|
||||
BOOST_AUTO_TEST_SUITE(WaveHeaderParsingTests) |
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ReadWaveHeader, WaveHeaderParserFixture) { |
||||
|
||||
unsigned char test_sndhdrdata_sndhdr_wav[] = { |
||||
0x52, 0x49, 0x46, 0x46, 0x38, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, |
||||
0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, |
||||
0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, |
||||
0x64, 0x61, 0x74, 0x61, 0x14, 0x00, 0x00, 0x00 |
||||
}; |
||||
unsigned int test_sndhdrdata_sndhdr_wav_len = 44; |
||||
|
||||
SD.setSDCardFileData((char*) test_sndhdrdata_sndhdr_wav, test_sndhdrdata_sndhdr_wav_len); |
||||
|
||||
wav_header header; |
||||
wav_data_header data_header; |
||||
bool success = waveHeaderParser->readWaveHeader("blah.wav", header, data_header); |
||||
BOOST_CHECK_EQUAL(success, true); |
||||
const char expectedRIFF[5] = "RIFF"; |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&header.riff_header[0], &header.riff_header[3],&expectedRIFF[0], &expectedRIFF[3]); |
||||
BOOST_CHECK_EQUAL(header.header_chunk_size,56); |
||||
const char expectedWave[5] = "WAVE"; |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&header.wave_header[0], &header.wave_header[3],&expectedWave[0], &expectedWave[3]); |
||||
const char expectedfmt[5] = "fmt "; |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&header.fmt_header[0], &header.fmt_header[3],&expectedfmt[0], &expectedfmt[3]); |
||||
const char expecteddata[5] = "data"; |
||||
BOOST_CHECK_EQUAL_COLLECTIONS(&data_header.data_header[0], &data_header.data_header[3],&expecteddata[0], &expecteddata[3]); |
||||
//BOOST_CHECK_EQUAL(File::numOpenFiles,0);
|
||||
//BOOST_CHECK_EQUAL(File::numInstances,0);
|
||||
} |
||||
BOOST_AUTO_TEST_SUITE_END() |
||||
|
||||
#endif //TEENSY_RESAMPLING_WAVEHEADER_PARSER_TESTS_CPP
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue