Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: WavPlayerSD WavPlayerUSB WavPlayerUSB WavPlayerSD_CB
Revision 0:3695886f3495, committed 2012-09-19
- Comitter:
- p07gbar
- Date:
- Wed Sep 19 10:58:16 2012 +0000
- Child:
- 1:3eb96771bbee
- Commit message:
- Working stably
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2S.lib Wed Sep 19 10:58:16 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/p07gbar/code/I2S_library/#455d5826751b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RingBuffer/RingBuffer.cpp Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,146 @@
+
+
+#include "RingBuffer.h"
+//Serial debug(USBTX,USBRX);
+
+RingBuffer::RingBuffer()
+{
+ Start = 0;
+ Finish = 0;
+ for(int i = 0; i < RBLENGTH; i++)
+ {
+ for(int j = 0; j<RBWIDTH; j++)
+ {
+ Buffer[i][j] = 0;
+ }
+ }
+ //debug.baud(115200);
+}
+
+int RingBuffer::addToBuffer(int* input)
+{
+ if(Finish == Start && Samples != 0)
+ {
+ return -1;
+ }
+ else
+ {
+ for(int i = 0; i < RBWIDTH; i++)
+ {
+ Buffer[Finish][i] = input[i];
+ }
+ sortFinishNS();
+ return 0;
+ }
+
+}
+
+
+int RingBuffer::addToBufferS(int input, int across)
+{
+ Buffer[Finish][across] = input;
+ return 0;
+}
+
+
+
+int RingBuffer::nextBuffer()
+{
+ sortFinishNS();
+ return 0;
+}
+
+
+
+void RingBuffer::readFirst(int* output)
+{
+ for(int i = 0; i < RBWIDTH; i++)
+ {
+ output[i] = Buffer[Start][i];
+ }
+}
+
+int RingBuffer::readFirstS(int across)
+{
+ return Buffer[Start][across];
+}
+
+
+
+void RingBuffer::readAt(int* output, int at)
+{
+ for(int i = 0; i < RBWIDTH; i++)
+ {
+ output[i] = Buffer[at][i];
+ }
+}
+
+int RingBuffer::readAtS(int at, int across)
+{
+ return Buffer[at][across];
+}
+
+
+
+void RingBuffer::readLast(int*output)
+{
+ for(int i = 0; i < RBWIDTH; i++)
+ {
+ output[i] = Buffer[Finish-1][i];
+ }
+}
+
+
+int RingBuffer::readLastS(int across)
+{
+ return Buffer[Finish-1][across];
+}
+
+void RingBuffer::usedFirst()
+{
+ sortStartUS();
+}
+
+void RingBuffer::usedLast()
+{
+ Finish--;
+ Samples--;
+}
+
+int RingBuffer::numberStored()
+{
+ if(Samples > RBLENGTH)
+ {
+ if(Finish < Start)
+ {
+ Samples = Finish + (RBLENGTH - Start);
+ }
+ else
+ {
+ Samples = Start - Finish;
+ }
+ }
+ return Samples;
+}
+
+void RingBuffer::sortFinishNS()
+{
+ Finish++;
+ Samples++;
+ if(Finish == RBLENGTH)
+ {
+ Finish = 0;
+ //debug.printf("\n\rBOO! %3i %3i\n\r",Start, Finish);
+ }
+
+}
+
+void RingBuffer::sortStartUS()
+{
+ Start++;
+ Samples--;
+ if(Start == RBLENGTH)
+ {
+ Start = 0;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RingBuffer/RingBuffer.h Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,44 @@
+#ifndef RINGBUFFER_H
+#define RINGBUFFER_H
+
+#include "mbed.h"
+
+#define RBLENGTH 1000
+#define RBWIDTH 2
+
+class RingBuffer {
+
+public:
+
+RingBuffer();
+
+int addToBuffer(int* input);
+int addToBufferS(int input, int across);
+int nextBuffer();
+
+void readFirst(int* output);
+int readFirstS(int across);
+
+void readAt(int* output, int at);
+int readAtS(int at, int across);
+
+void readLast(int*output);
+int readLastS(int across);
+
+void usedFirst();
+void usedLast();
+
+int numberStored();
+
+protected:
+
+int16_t Buffer[RBLENGTH][RBWIDTH];
+
+int Start;
+int Finish;
+int Samples;
+
+void sortFinishNS();
+void sortStartUS();
+};
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TLV320.lib Wed Sep 19 10:58:16 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/p07gbar/code/TLV320_library/#a68f7c573e8c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WavPlayer.cpp Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,506 @@
+// TODO: Add licence and stop start remembering and fill buffer functions
+
+
+
+#include "WavPlayer.h"
+
+#define DEBUG 1
+#define debug_printf(args ...) if (DEBUG) printf(args)
+
+#define WAVPLAYER_PLAYER_BUF 1000
+
+#define WAVPLAYER_OUTPUT_RATE 48000
+
+#define WAVPLAYER_READ_MARGIN 0.9
+
+#define WAVLPAYER_SLOW_MARGIN 5
+
+#define WAVPLAYER_GEN_TEST 0
+
+#define WAVPLAYER_GEN_FREQ 440
+
+#if WAVPLAYER_GEN_TEST == 1
+#include "sinelookup.h"
+#else
+#define SINE16LENGTH 2
+#define SINE32LENGTH 2
+const int16_t sine16lookup[] = {0,10000};
+#endif
+
+WavPlayer* WavPlayer::instance;
+//void WavPlayer::i2sisr();
+
+WavPlayer::WavPlayer() :
+ flag_play(true), i2s(I2S_TRANSMIT, p5, p6, p7), codec(p9, p10)//, ext_flag(p22), //run_flag(p23)
+{
+ instance = this;
+ codec.power(true); //power up TLV apart from analogue input
+ codec.stop();
+ codec.frequency(WAVPLAYER_OUTPUT_RATE); //set sample frequency
+ codec.wordsize(16); //set transfer protocol
+ codec.master(false);
+ codec.headphone_volume(0.6);
+ //interrupt come from the I2STXFIFO only
+
+ i2s.masterslave(I2S_MASTER);
+ i2s.attach(&WavPlayer::i2sisr);
+
+ i2s.wordsize(16);
+ i2s.stereomono(I2S_MONO);
+
+ i2s.frequency(WAVPLAYER_OUTPUT_RATE);
+
+ //ext_flag = false;
+
+ flag_vol = false;
+ volume = 1;
+}
+
+WavPlayer::WavPlayer(FILE **fpp):flag_play(true), i2s(I2S_TRANSMIT, p5, p6, p7), codec(p9, p10)//, ext_flag(p22), //run_flag(p23)
+{
+ instance = this;
+ codec.power(true); //power up TLV apart from analogue input
+ codec.stop();
+ codec.frequency(WAVPLAYER_OUTPUT_RATE); //set sample frequency
+ codec.wordsize(16); //set transfer protocol
+ codec.master(false);
+ codec.headphone_volume(0.6);
+ //interrupt come from the I2STXFIFO only
+
+ i2s.masterslave(I2S_MASTER);
+ i2s.attach(&WavPlayer::i2sisr);
+
+ i2s.wordsize(16);
+ i2s.stereomono(I2S_MONO);
+
+ i2s.frequency(WAVPLAYER_OUTPUT_RATE);
+
+ //ext_flag = false;
+
+ flag_vol = false;
+ volume = 1;
+ open(fpp);
+}
+
+void WavPlayer::i2sisr()
+{
+ instance->i2sisr_();
+}
+
+void WavPlayer::i2sisr_()
+{
+ int to_write = i2s.max_fifo_points() - i2s.fifo_points();
+ int temp[32];
+ /*for(int i = 0; i < 32; i++)
+ {
+ temp[i] = 0;
+ }*/
+ int destore[2];
+ if (rbuf.numberStored() > to_write + 8 && flag_play)
+ {
+ for (int i = 0; i < to_write; i += 2)
+ {
+ rbuf.readFirst(destore);
+ rbuf.usedFirst();
+ temp[i] = destore[0];
+ temp[i+1] = destore[1];
+ }
+
+ i2s.write(temp, to_write);
+ }
+ else
+ {
+ for (int i = 0; i < to_write; i++)
+ {
+ temp[i] = 0;
+ }
+ i2s.write(temp, to_write);
+ isr_underrun++;
+
+ }
+
+}
+
+void WavPlayer::open(FILE **fpp)
+{
+ filepp = fpp;
+ if (*filepp == NULL)
+ printf(
+ "Please open a file before passing the file pointer pointer...\n\r");
+ char temp[4];
+ fgets_m(temp, 4, *filepp);
+ debug_printf("%s\n\r", temp);
+ if (strcmp(temp, "RIFF") != 0)
+ printf("This is not a RIFF file\n\r");
+ fseekread(*filepp, temp, 8, 4);
+ if (strcmp(temp, "WAVE") != 0)
+ printf("This is not a WAVE file\n\r");
+
+ getConfig();
+}
+
+int WavPlayer::getConfig()
+{
+ char temp[4];
+ clear(temp, 4);
+ fseekread(*filepp, temp, 4, 4);
+ config.file_size = getu32(temp, 4);
+ debug_printf("FileSize = %i\n\r", config.file_size);
+
+ int chunkstart = findChunk(*filepp, "fmt ", 4, config.file_size, 12);
+
+ if (chunkstart != -1)
+ {
+
+ config.format_tag = fsru16(*filepp, chunkstart + 8);
+ debug_printf("Format_tag: %i\n\r", config.format_tag);
+
+ config.channels = fsru16(*filepp, chunkstart + 10);
+ debug_printf("nChannels: %i\n\r", config.channels);
+
+ config.samples_per_sec = fsru32(*filepp, chunkstart + 12);
+ debug_printf("nSamplesPerSec: %i\n\r", config.samples_per_sec);
+
+ config.avg_bytes_per_sec = fsru32(*filepp, chunkstart + 16);
+ debug_printf("avg_bytes_per_sec: %i\n\r", config.avg_bytes_per_sec);
+
+ config.block_align = fsru16(*filepp, chunkstart + 20);
+ debug_printf("block_align: %i\n\r", config.block_align);
+
+ config.bits_per_sample = fsru16(*filepp, chunkstart + 22);
+ debug_printf(
+ "bits per sample: %i\n\r", config.bits_per_sample);
+
+ }
+
+ chunkstart = findChunk(*filepp, "data", 4, config.file_size, 12);
+
+ if (chunkstart != -1)
+ {
+ config.data_length = fsru32(*filepp, chunkstart + 4);
+ debug_printf("Data Length: %i\n\r", config.data_length);
+ }
+ return 0;
+
+}
+
+float WavPlayer::play()
+{
+ return play(float(config.data_length) / float(config.samples_per_sec));
+
+}
+
+float WavPlayer::play(float time)
+{
+ return play(current_time, time);
+}
+
+float WavPlayer::play(float start, float timefor)
+{
+
+ #if WAVPLAYER_GEN_TEST == 1
+ config.channels = 1;
+ config.samples_per_sec = 48000;
+ #endif
+
+ float timeElapsed = 0;
+ int endPoint = int((start + timefor) * float(config.samples_per_sec));
+ if (endPoint * config.block_align >= config.data_length)
+ endPoint = config.data_length / config.block_align;
+ //printf("Will end after: %i samples \n\r", endPoint);
+ int point = int(start * float(config.samples_per_sec));
+ bool valid = true;
+ flag_play = false;
+ int dataOffset = findChunk(*filepp, "data", 4, config.file_size, 12) + 8 + (point * config.block_align);
+
+ double timeComp = 0;
+
+ double out_rate_t_p = 1 / double(WAVPLAYER_OUTPUT_RATE);
+ //printf("out_rate_t_p = %f\n\r", out_rate_t_p);
+ double out_rate_t_n = -1 / double(WAVPLAYER_OUTPUT_RATE);
+ double in_rate = 1 / double(config.samples_per_sec); //0.0000125
+ //printf("in_rate = %f\n\r", in_rate);
+
+ float phase = 0;
+
+ if (dataOffset != -1)
+ {
+ fseek(*filepp, dataOffset, SEEK_SET);
+
+ int16_t buffer[WAVPLAYER_PLAYER_BUF];
+
+ codec.start();
+ //debug_printf("Expecting isr\n\r");
+
+ i2s.frequency(WAVPLAYER_OUTPUT_RATE);
+
+
+ if (config.channels == 1)
+ {
+ stereo = false;
+ i2s.stereomono(I2S_MONO);
+ }
+ else
+ {
+ stereo =true;
+ i2s.stereomono(I2S_STEREO);
+ }
+
+ i2s.attach(&WavPlayer::i2sisr);
+ i2s.start();
+ flag_play = true;
+
+ while (valid && point < endPoint)
+ {
+ if (rbuf.numberStored() < RBLENGTH - 10)
+ {
+
+ //timer.reset();
+ //timer.start();
+ int numToread = WAVPLAYER_PLAYER_BUF;
+ if (numToread > (RBLENGTH - 10) - rbuf.numberStored())
+ {
+ numToread = (RBLENGTH - 10) - rbuf.numberStored();
+ }
+ if (numToread + (point * (config.block_align/config.channels)) > config.data_length)
+ {
+ numToread = config.data_length - point * config.block_align;
+ valid = false;
+ debug_printf("EOF detected\n\r");
+ }
+ if(numToread % 2 == 1) numToread--;
+ //printf("Generating\n\r");
+ //run_flag = true;
+ //phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/120,phase);
+ timer.reset();
+ timer.start();
+ //fread(buffer, config.block_align/config.channels, numToread, *filepp);
+ #if WAVPLAYER_GEN_TEST == 1
+ phase = sine_gen(buffer,numToread,float(config.samples_per_sec)/WAVPLAYER_GEN_FREQ,phase);
+ #else
+ fread(buffer, config.block_align/config.channels, numToread, *filepp);
+ #endif
+ timer.stop();
+ //printf("numToread:%f\n\r",float(numToread));
+ if(numToread>=10)
+ {
+ read_time += (timer.read()/float(numToread));
+ read_time_div += 1;
+ }
+
+
+ if(read_time/float(read_time_div) >= WAVPLAYER_READ_MARGIN / float(config.samples_per_sec*config.channels))
+ {
+ slow_count++;
+ if(slow_count > WAVLPAYER_SLOW_MARGIN)
+ {
+ printf("Data rates not high enough to sustain read...%f seconds per read\n\r", read_time/float(read_time_div));
+ valid = false;
+ break;
+ }
+
+ }
+
+ //run_flag = false;
+ int storer[2];
+ for (int i = 0; i < numToread; i += 2)
+ {
+
+ //run_flag = true;
+
+ if (timeComp < out_rate_t_p && timeComp > out_rate_t_n)
+ {
+ storer[0] = (int) buffer[i];
+ storer[1] = (int) buffer[i + 1];
+
+ //storer[0] = blip;
+ //storer[1] = blip;
+ timeComp += in_rate;
+ while (rbuf.numberStored() > RBLENGTH - 10)
+ {
+ //run_flag = true;
+ //run_flag = false;
+ }
+ rbuf.addToBuffer(storer);
+ timeComp -= out_rate_t_p;
+ //printf(",",timeComp);
+ point++;
+ //printf("straight %f\n\r",timeComp);
+ }
+ else if (timeComp >= out_rate_t_p)
+ {
+
+ storer[0] = (int) buffer[i];
+ storer[1] = (int) buffer[i + 1];
+
+ //storer[0] = blip;
+ //storer[1] = blip;
+
+ timeComp += in_rate;
+ /*const float ct = 5;
+ float c = 0;
+ float bufi = float(buffer[i]);
+ float bufip = float((i+1 >= numToread) ? buffer[i+1] : bufi);*/
+
+ while (timeComp >= out_rate_t_p)
+ {
+ //storer[0] = int((((ct-c)/ct)*bufi)+((c/ct)*bufip));
+ while (rbuf.numberStored() > RBLENGTH - 10)
+ {
+ //run_flag = true;
+ //run_flag = false;
+ }
+ rbuf.addToBuffer(storer);
+ timeComp -= out_rate_t_p;
+ //printf(";");
+ //if(c < ct) c++;
+ }
+ point++;
+
+ }
+ else if (timeComp <= out_rate_t_n)
+ {
+ timeComp += in_rate;
+ //printf("-");
+ }
+
+ //storer[1] = 0;
+ //if(i%1 == 0) printf("%i\n",int(storer[0]),int(storer[1]));
+ //run_flag = false;
+
+ }
+ flag_play = true;
+ //timer.stop();
+ //printf("point: %i\n\r",isr_underrun);
+ //read_time += timer;
+ //read_time_div =numToread;
+
+ }
+ }
+ }
+ flag_play = false;
+ current_time = float(point)/float(config.samples_per_sec);
+ return current_time;
+}
+
+int WavPlayer::fseekread(FILE *fp, char* str, int offset, int len)
+{
+ fseek(fp, offset, SEEK_SET);
+ fgets_m(str, len, fp);
+ return len;
+}
+
+uint32_t WavPlayer::getu32(char str[], int len)
+{
+ uint32_t temp = 0;
+ for (int i = 0; i < len; i++)
+ {
+ temp += str[i] << (i * 8);
+
+ }
+ return temp;
+}
+
+uint16_t WavPlayer::getu16(char str[], int len)
+{
+ uint16_t temp = 0;
+ for (int i = 0; i < len; i++)
+ {
+ temp += str[i] << (i * 8);
+ }
+ return temp;
+}
+
+int32_t WavPlayer::get32(char str[], int len)
+{
+ uint32_t temp = 0;
+ for (int i = 0; i < len; i++)
+ {
+ temp += str[i] << (i * 8);
+
+ }
+ return temp;
+}
+
+int16_t WavPlayer::get16(char str[], int len)
+{
+ uint16_t temp = 0;
+ for (int i = 0; i < len; i++)
+ {
+ temp += str[i] << (i * 8);
+ }
+ return temp;
+}
+
+uint32_t WavPlayer::fsru32(FILE *fp, int offset, int len)
+{
+ char temp[4];
+ fseekread(fp, temp, offset, len);
+ return getu32(temp, len);
+}
+
+uint16_t WavPlayer::fsru16(FILE *fp, int offset, int len)
+{
+ char temp[2];
+ fseekread(fp, temp, offset, len);
+ return getu16(temp, len);
+}
+
+void WavPlayer::clear(char* str, int len)
+{
+ for (int i = 0; i < len; i++)
+ {
+ str[i] = 0;
+ }
+}
+
+int WavPlayer::findChunk(FILE *fp, char* match, int len, int fileSize,
+ int startOffset)
+{
+ char temp[5];
+ int count = startOffset;
+ while ((count + 8) < fileSize)
+ {
+ clear(temp, 5);
+ fseekread(fp, temp, count, 4);
+ int chunksize = fsru32(fp, count + 4) + 8;
+ //debug_printf("@ %i Chunk Name: %s Size: %i\n\r", count, temp, chunksize);
+
+ if (strcmp(temp, match) == 0)
+ {
+ return count;
+ }
+ count += chunksize;
+ }
+ return -1;
+}
+
+int WavPlayer::findChunk(FILE *fp, char* match, int len, int startOffset)
+{
+ return findChunk(fp, match, len, config.file_size, startOffset);
+}
+
+void WavPlayer::fgets_m(char* str, int num, FILE* fp)
+{
+ for (int i = 0; i < num; i++)
+ {
+ str[i] = fgetc(fp);
+ //printf("%c",str[i]);
+ }
+}
+
+float WavPlayer::sine_gen(int16_t* buf, int len, float div, float phase)
+{
+ #if WAVPLAYER_GEN_TEST == 1
+ float t = SINE16LENGTH / div;
+ for (int i = 0; i < len; i++)
+ {
+ buf[i] = sine16lookup[int(phase)];
+ //printf("%i\n\r",buf[i]);
+ phase += t;
+ while (phase >= SINE16LENGTH)
+ phase -= SINE16LENGTH;
+ }
+ #endif
+ return phase;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WavPlayer.h Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,159 @@
+/**
+* @author Giles Barton-Owen
+*
+* @section LICENSE
+*
+* Copyright (c) 2012 mbed
+*
+* 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.
+*
+* @section DESCRIPTION
+* A WAV player library for the TLV320 and the LPC1768's built in I2S peripheral
+*
+*/
+
+#ifndef WAVPLAYER_H
+#define WAVPLAYER_H
+
+#include "mbed.h"
+#include "WavPlayerConfig.h"
+#include "RingBuffer.h"
+#include "TLV320.h"
+#include "I2S.h"
+
+/** A class to play WAV files from a file system, tested with USB
+ *
+ * Example (note, this has requires the USB MSC library to be imported):
+ * @code
+ *
+ * #include "mbed.h"
+ * #include "WavPlayer.h"
+ * #include "MSCFileSystem.h"
+ *
+ * MSCFileSystem msc("msc"); // Mount flash drive under the name "msc"
+ * WavPlayer player;
+ *
+ * int main() {
+ * FILE *fp = fopen("/msc/test.wav", "r"); // Open "out.txt" on the local file system for writing
+ * player.open(&fp);
+ * player.play();
+ * fclose(fp);
+ * }
+ * @endcode
+ */
+
+
+class WavPlayer
+{
+public:
+ /** Create a WavPlayer instance
+ *
+ */
+ WavPlayer();
+
+ /** Create a WavPlayer instance
+ *
+ * @param fpp A pointer to a file pointer to read out of
+ */
+ WavPlayer(FILE **fpp);
+
+ /** Set the file to read out of
+ *
+ * @param fpp A pointer to a file pointer to read out of
+ */
+ void open(FILE **fpp);
+
+ /** Extract the header infomation, automatically called by open
+ */
+ int getConfig();
+
+ /** Play the entire file. Blocking
+ */
+ float play();
+
+ /** Play the file for a certain number of seconds. Blocking
+ *
+ * @param time The number of seconds to play the file for.
+ */
+ float play(float time);
+
+ /** Play the file for a certain number of seconds, from a certain start point. Blocking
+ *
+ * @param start The start time
+ * @param timefor The number of seconds to play the file for.
+ */
+ float play(float start, float timefor);
+
+
+
+private:
+ WavPlayerConfig config;
+ FILE ** filepp;
+ RingBuffer rbuf;
+
+ I2S i2s;
+ TLV320 codec;
+ static void i2sisr();
+ void i2sisr_();
+ static WavPlayer* instance;
+
+ int fseekread(FILE *fp, char* str, int offset, int len);
+ uint32_t getu32(char str[], int len);
+ uint16_t getu16(char str[], int len);
+ int32_t get32(char str[], int len);
+ int16_t get16(char str[], int len);
+ uint32_t fsru32(FILE *fp, int offset, int len = 4);
+ uint16_t fsru16(FILE *fp, int offset, int len = 2);
+ void clear(char* str, int len);
+
+ int findChunk(FILE *fp, char* match, int len, int fileSize, int startOffset = 12);
+ int findChunk(FILE *fp, char* match, int len, int startOffset = 12);
+ void fgets_m(char* str, int num, FILE* fp);
+
+ float sine_gen(int16_t* buf, int len, float div, float phase);
+
+ bool flag_vol;
+ double volume;
+
+ bool stereo;
+
+ bool flag_play;
+
+ Timer timer;
+
+ int isr_underrun;
+
+ float read_time;
+ int read_time_div;
+
+ float isr_time;
+ int isr_time_div;
+
+ float current_time;
+
+ int slow_count;
+
+ //Timer isrtimer;
+
+ //DigitalOut ext_flag;
+ //DigitalOut run_flag;
+
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WavPlayerConfig.cpp Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,14 @@
+#include "WavPlayerConfig.h"
+
+WavPlayerConfig::WavPlayerConfig()
+{
+
+ format_tag = 0;
+ channels = 0;
+ samples_per_sec = 0;
+ avg_bytes_per_sec = 0;
+ block_align = 0;
+ bits_per_sample = 0;
+ data_length = 0;
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WavPlayerConfig.h Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,63 @@
+/**
+* @author Giles Barton-Owen
+*
+* @section LICENSE
+*
+* Copyright (c) 2012 mbed
+*
+* 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.
+*
+* @section DESCRIPTION
+* A WAV player configuration class for WavPlayer
+*
+*/
+
+
+#ifndef WAVPLAYERCONFIG_H
+#define WAVPLAYERCONFIG_H
+
+#include "mbed.h"
+
+class WavPlayerConfig
+{
+public:
+ /*format_tag(uint16_t ft);
+ channels(uint16_t n);
+ samples_per_second(uint32_t sps);
+ avg_bytes_per_second(uint32_t abps);
+ block_align(uint16_t ba);
+ bits_per_sample(uint16_t bps);
+ data_length(uint32_t len);*/
+
+ WavPlayerConfig();
+
+ uint16_t format_tag;
+ uint16_t channels;
+ uint32_t samples_per_sec;
+ uint32_t avg_bytes_per_sec;
+ uint16_t block_align;
+ uint16_t bits_per_sample;
+ uint32_t data_length;
+ uint32_t file_size;
+
+private:
+
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sinelookup.h Wed Sep 19 10:58:16 2012 +0000
@@ -0,0 +1,213 @@
+#define SINE16LENGTH 1024
+#define SINE32LENGTH 1024
+
+const int16_t sine16lookup[] = { 0, 201, 402, 603, 804, 1005, 1206, 1407, 1607, 1808, 2009,
+ 2210, 2410, 2611, 2811, 3011, 3211, 3411, 3611, 3811, 4011,
+ 4210, 4409, 4609, 4808, 5006, 5205, 5403, 5602, 5800, 5997,
+ 6195, 6392, 6589, 6786, 6983, 7179, 7375, 7571, 7766, 7961,
+ 8156, 8351, 8545, 8739, 8933, 9126, 9319, 9512, 9704, 9896,
+ 10087, 10278, 10469, 10659, 10849, 11039, 11228, 11416, 11605, 11793,
+ 11980, 12167, 12353, 12539, 12725, 12910, 13094, 13278, 13462, 13645,
+ 13828, 14010, 14191, 14372, 14552, 14732, 14912, 15090, 15269, 15446,
+ 15623, 15800, 15976, 16151, 16325, 16499, 16673, 16846, 17018, 17189,
+ 17360, 17530, 17700, 17869, 18037, 18204, 18371, 18537, 18703, 18868,
+ 19032, 19195, 19358, 19519, 19681, 19841, 20001, 20159, 20318, 20475,
+ 20631, 20787, 20942, 21097, 21250, 21403, 21555, 21706, 21856, 22005,
+ 22154, 22301, 22448, 22594, 22740, 22884, 23027, 23170, 23312, 23453,
+ 23593, 23732, 23870, 24007, 24144, 24279, 24414, 24547, 24680, 24812,
+ 24943, 25073, 25201, 25330, 25457, 25583, 25708, 25832, 25955, 26077,
+ 26199, 26319, 26438, 26557, 26674, 26790, 26905, 27020, 27133, 27245,
+ 27356, 27466, 27576, 27684, 27791, 27897, 28002, 28106, 28208, 28310,
+ 28411, 28511, 28609, 28707, 28803, 28898, 28993, 29086, 29178, 29269,
+ 29359, 29447, 29535, 29621, 29707, 29791, 29874, 29956, 30037, 30117,
+ 30196, 30273, 30350, 30425, 30499, 30572, 30644, 30714, 30784, 30852,
+ 30919, 30985, 31050, 31114, 31176, 31237, 31298, 31357, 31414, 31471,
+ 31526, 31581, 31634, 31685, 31736, 31785, 31834, 31881, 31927, 31971,
+ 32015, 32057, 32098, 32138, 32176, 32214, 32250, 32285, 32319, 32351,
+ 32383, 32413, 32442, 32469, 32496, 32521, 32545, 32568, 32589, 32610,
+ 32629, 32647, 32663, 32679, 32693, 32706, 32718, 32728, 32737, 32745,
+ 32752, 32758, 32762, 32765, 32767, 32767, 32767, 32765, 32762, 32758,
+ 32752, 32745, 32737, 32728, 32718, 32706, 32693, 32679, 32663, 32647,
+ 32629, 32610, 32589, 32568, 32545, 32521, 32496, 32469, 32442, 32413,
+ 32383, 32351, 32319, 32285, 32250, 32214, 32176, 32138, 32098, 32057,
+ 32015, 31971, 31927, 31881, 31834, 31785, 31736, 31685, 31634, 31581,
+ 31526, 31471, 31414, 31357, 31298, 31237, 31176, 31114, 31050, 30985,
+ 30919, 30852, 30784, 30714, 30644, 30572, 30499, 30425, 30350, 30273,
+ 30196, 30117, 30037, 29956, 29874, 29791, 29707, 29621, 29535, 29447,
+ 29359, 29269, 29178, 29086, 28993, 28898, 28803, 28707, 28609, 28511,
+ 28411, 28310, 28208, 28106, 28002, 27897, 27791, 27684, 27576, 27466,
+ 27356, 27245, 27133, 27020, 26905, 26790, 26674, 26557, 26438, 26319,
+ 26199, 26077, 25955, 25832, 25708, 25583, 25457, 25330, 25201, 25073,
+ 24943, 24812, 24680, 24547, 24414, 24279, 24144, 24007, 23870, 23732,
+ 23593, 23453, 23312, 23170, 23027, 22884, 22740, 22594, 22448, 22301,
+ 22154, 22005, 21856, 21706, 21555, 21403, 21250, 21097, 20942, 20787,
+ 20631, 20475, 20318, 20159, 20001, 19841, 19681, 19519, 19358, 19195,
+ 19032, 18868, 18703, 18537, 18371, 18204, 18037, 17869, 17700, 17530,
+ 17360, 17189, 17018, 16846, 16673, 16499, 16325, 16151, 15976, 15800,
+ 15623, 15446, 15269, 15090, 14912, 14732, 14552, 14372, 14191, 14010,
+ 13828, 13645, 13462, 13278, 13094, 12910, 12725, 12539, 12353, 12167,
+ 11980, 11793, 11605, 11416, 11228, 11039, 10849, 10659, 10469, 10278,
+ 10087, 9896, 9704, 9512, 9319, 9126, 8933, 8739, 8545, 8351,
+ 8156, 7961, 7766, 7571, 7375, 7179, 6983, 6786, 6589, 6392,
+ 6195, 5997, 5800, 5602, 5403, 5205, 5006, 4808, 4609, 4409,
+ 4210, 4011, 3811, 3611, 3411, 3211, 3011, 2811, 2611, 2410,
+ 2210, 2009, 1808, 1607, 1407, 1206, 1005, 804, 603, 402,
+ 201, 0, -201, -402, -603, -804, -1005, -1206, -1407, -1607,
+ -1808, -2009, -2210, -2410, -2611, -2811, -3011, -3211, -3411, -3611,
+ -3811, -4011, -4210, -4409, -4609, -4808, -5006, -5205, -5403, -5602,
+ -5800, -5997, -6195, -6392, -6589, -6786, -6983, -7179, -7375, -7571,
+ -7766, -7961, -8156, -8351, -8545, -8739, -8933, -9126, -9319, -9512,
+ -9704, -9896, -10087, -10278, -10469, -10659, -10849, -11039, -11228, -11416,
+ -11605, -11793, -11980, -12167, -12353, -12539, -12725, -12910, -13094, -13278,
+ -13462, -13645, -13828, -14010, -14191, -14372, -14552, -14732, -14912, -15090,
+ -15269, -15446, -15623, -15800, -15976, -16151, -16325, -16499, -16673, -16846,
+ -17018, -17189, -17360, -17530, -17700, -17869, -18037, -18204, -18371, -18537,
+ -18703, -18868, -19032, -19195, -19358, -19519, -19681, -19841, -20001, -20159,
+ -20318, -20475, -20631, -20787, -20942, -21097, -21250, -21403, -21555, -21706,
+ -21856, -22005, -22154, -22301, -22448, -22594, -22740, -22884, -23027, -23170,
+ -23312, -23453, -23593, -23732, -23870, -24007, -24144, -24279, -24414, -24547,
+ -24680, -24812, -24943, -25073, -25201, -25330, -25457, -25583, -25708, -25832,
+ -25955, -26077, -26199, -26319, -26438, -26557, -26674, -26790, -26905, -27020,
+ -27133, -27245, -27356, -27466, -27576, -27684, -27791, -27897, -28002, -28106,
+ -28208, -28310, -28411, -28511, -28609, -28707, -28803, -28898, -28993, -29086,
+ -29178, -29269, -29359, -29447, -29535, -29621, -29707, -29791, -29874, -29956,
+ -30037, -30117, -30196, -30273, -30350, -30425, -30499, -30572, -30644, -30714,
+ -30784, -30852, -30919, -30985, -31050, -31114, -31176, -31237, -31298, -31357,
+ -31414, -31471, -31526, -31581, -31634, -31685, -31736, -31785, -31834, -31881,
+ -31927, -31971, -32015, -32057, -32098, -32138, -32176, -32214, -32250, -32285,
+ -32319, -32351, -32383, -32413, -32442, -32469, -32496, -32521, -32545, -32568,
+ -32589, -32610, -32629, -32647, -32663, -32679, -32693, -32706, -32718, -32728,
+ -32737, -32745, -32752, -32758, -32762, -32765, -32767, -32768, -32767, -32765,
+ -32762, -32758, -32752, -32745, -32737, -32728, -32718, -32706, -32693, -32679,
+ -32663, -32647, -32629, -32610, -32589, -32568, -32545, -32521, -32496, -32469,
+ -32442, -32413, -32383, -32351, -32319, -32285, -32250, -32214, -32176, -32138,
+ -32098, -32057, -32015, -31971, -31927, -31881, -31834, -31785, -31736, -31685,
+ -31634, -31581, -31526, -31471, -31414, -31357, -31298, -31237, -31176, -31114,
+ -31050, -30985, -30919, -30852, -30784, -30714, -30644, -30572, -30499, -30425,
+ -30350, -30273, -30196, -30117, -30037, -29956, -29874, -29791, -29707, -29621,
+ -29535, -29447, -29359, -29269, -29178, -29086, -28993, -28898, -28803, -28707,
+ -28609, -28511, -28411, -28310, -28208, -28106, -28002, -27897, -27791, -27684,
+ -27576, -27466, -27356, -27245, -27133, -27020, -26905, -26790, -26674, -26557,
+ -26438, -26319, -26199, -26077, -25955, -25832, -25708, -25583, -25457, -25330,
+ -25201, -25073, -24943, -24812, -24680, -24547, -24414, -24279, -24144, -24007,
+ -23870, -23732, -23593, -23453, -23312, -23170, -23027, -22884, -22740, -22594,
+ -22448, -22301, -22154, -22005, -21856, -21706, -21555, -21403, -21250, -21097,
+ -20942, -20787, -20631, -20475, -20318, -20159, -20001, -19841, -19681, -19519,
+ -19358, -19195, -19032, -18868, -18703, -18537, -18371, -18204, -18037, -17869,
+ -17700, -17530, -17360, -17189, -17018, -16846, -16673, -16499, -16325, -16151,
+ -15976, -15800, -15623, -15446, -15269, -15090, -14912, -14732, -14552, -14372,
+ -14191, -14010, -13828, -13645, -13462, -13278, -13094, -12910, -12725, -12539,
+ -12353, -12167, -11980, -11793, -11605, -11416, -11228, -11039, -10849, -10659,
+ -10469, -10278, -10087, -9896, -9704, -9512, -9319, -9126, -8933, -8739,
+ -8545, -8351, -8156, -7961, -7766, -7571, -7375, -7179, -6983, -6786,
+ -6589, -6392, -6195, -5997, -5800, -5602, -5403, -5205, -5006, -4808,
+ -4609, -4409, -4210, -4011, -3811, -3611, -3411, -3211, -3011, -2811,
+ -2611, -2410, -2210, -2009, -1808, -1607, -1407, -1206, -1005, -804,
+ -603, -402, -201};
+
+ const int32_t sine32lookup[] = { 0, 13176711, 26352927, 39528151, 52701886, 65873638, 79042909, 92209204, 105372028, 118530884, 131685278,
+ 144834714, 157978697, 171116732, 184248325, 197372981, 210490206, 223599506, 236700387, 249792357, 262874923,
+ 275947591, 289009870, 302061268, 315101294, 328129456, 341145265, 354148229, 367137860, 380113668, 393075166,
+ 406021864, 418953276, 431868914, 444768293, 457650927, 470516330, 483364019, 496193509, 509004318, 521795963,
+ 534567962, 547319836, 560051103, 572761285, 585449902, 598116478, 610760535, 623381597, 635979189, 648552837,
+ 661102068, 673626408, 686125386, 698598532, 711045377, 723465451, 735858287, 748223418, 760560379, 772868705,
+ 785147934, 797397602, 809617248, 821806413, 833964637, 846091463, 858186434, 870249095, 882278991, 894275670,
+ 906238680, 918167571, 930061894, 941921200, 953745043, 965532978, 977284561, 988999351, 1000676905, 1012316784,
+ 1023918549, 1035481765, 1047005996, 1058490807, 1069935767, 1081340445, 1092704410, 1104027236, 1115308496, 1126547765,
+ 1137744620, 1148898640, 1160009404, 1171076495, 1182099495, 1193077990, 1204011566, 1214899812, 1225742318, 1236538675,
+ 1247288477, 1257991319, 1268646799, 1279254515, 1289814068, 1300325060, 1310787095, 1321199780, 1331562723, 1341875533,
+ 1352137822, 1362349204, 1372509294, 1382617710, 1392674071, 1402677999, 1412629117, 1422527050, 1432371426, 1442161874,
+ 1451898025, 1461579513, 1471205974, 1480777044, 1490292364, 1499751575, 1509154322, 1518500249, 1527789007, 1537020243,
+ 1546193612, 1555308767, 1564365366, 1573363068, 1582301533, 1591180425, 1599999411, 1608758157, 1617456334, 1626093615,
+ 1634669675, 1643184190, 1651636841, 1660027308, 1668355276, 1676620431, 1684822463, 1692961062, 1701035922, 1709046739,
+ 1716993211, 1724875039, 1732691927, 1740443580, 1748129706, 1755750017, 1763304224, 1770792044, 1778213194, 1785567396,
+ 1792854372, 1800073848, 1807225552, 1814309216, 1821324572, 1828271355, 1835149306, 1841958164, 1848697673, 1855367580,
+ 1861967634, 1868497585, 1874957189, 1881346201, 1887664382, 1893911494, 1900087300, 1906191570, 1912224072, 1918184580,
+ 1924072870, 1929888719, 1935631910, 1941302224, 1946899450, 1952423376, 1957873795, 1963250501, 1968553291, 1973781967,
+ 1978936330, 1984016188, 1989021349, 1993951624, 1998806829, 2003586779, 2008291295, 2012920200, 2017473320, 2021950483,
+ 2026351521, 2030676268, 2034924561, 2039096241, 2043191149, 2047209133, 2051150040, 2055013723, 2058800035, 2062508835,
+ 2066139983, 2069693341, 2073168777, 2076566159, 2079885360, 2083126254, 2086288719, 2089372637, 2092377892, 2095304369,
+ 2098151959, 2100920556, 2103610053, 2106220351, 2108751351, 2111202958, 2113575079, 2115867625, 2118080510, 2120213651,
+ 2122266966, 2124240380, 2126133817, 2127947206, 2129680479, 2131333571, 2132906419, 2134398965, 2135811152, 2137142927,
+ 2138394239, 2139565042, 2140655292, 2141664948, 2142593970, 2143442326, 2144209982, 2144896909, 2145503083, 2146028479,
+ 2146473079, 2146836866, 2147119825, 2147321946, 2147443222, 2147483647, 2147443222, 2147321946, 2147119825, 2146836866,
+ 2146473079, 2146028479, 2145503083, 2144896909, 2144209982, 2143442326, 2142593970, 2141664948, 2140655292, 2139565042,
+ 2138394239, 2137142927, 2135811152, 2134398965, 2132906419, 2131333571, 2129680479, 2127947206, 2126133817, 2124240380,
+ 2122266966, 2120213651, 2118080510, 2115867625, 2113575079, 2111202958, 2108751351, 2106220351, 2103610053, 2100920556,
+ 2098151959, 2095304369, 2092377892, 2089372637, 2086288719, 2083126254, 2079885360, 2076566159, 2073168777, 2069693341,
+ 2066139983, 2062508835, 2058800035, 2055013723, 2051150040, 2047209133, 2043191149, 2039096241, 2034924561, 2030676268,
+ 2026351521, 2021950483, 2017473320, 2012920200, 2008291295, 2003586779, 1998806829, 1993951624, 1989021349, 1984016188,
+ 1978936330, 1973781967, 1968553291, 1963250501, 1957873795, 1952423376, 1946899450, 1941302224, 1935631910, 1929888719,
+ 1924072870, 1918184580, 1912224072, 1906191570, 1900087300, 1893911494, 1887664382, 1881346201, 1874957189, 1868497585,
+ 1861967634, 1855367580, 1848697673, 1841958164, 1835149306, 1828271355, 1821324572, 1814309216, 1807225552, 1800073848,
+ 1792854372, 1785567396, 1778213194, 1770792044, 1763304224, 1755750017, 1748129706, 1740443580, 1732691927, 1724875039,
+ 1716993211, 1709046739, 1701035922, 1692961062, 1684822463, 1676620431, 1668355276, 1660027308, 1651636841, 1643184190,
+ 1634669675, 1626093615, 1617456334, 1608758157, 1599999411, 1591180425, 1582301533, 1573363068, 1564365366, 1555308767,
+ 1546193612, 1537020243, 1527789007, 1518500249, 1509154322, 1499751575, 1490292364, 1480777044, 1471205974, 1461579513,
+ 1451898025, 1442161874, 1432371426, 1422527050, 1412629117, 1402677999, 1392674071, 1382617710, 1372509294, 1362349204,
+ 1352137822, 1341875533, 1331562723, 1321199780, 1310787095, 1300325060, 1289814068, 1279254515, 1268646799, 1257991319,
+ 1247288477, 1236538675, 1225742318, 1214899812, 1204011566, 1193077990, 1182099495, 1171076495, 1160009404, 1148898640,
+ 1137744620, 1126547765, 1115308496, 1104027236, 1092704410, 1081340445, 1069935767, 1058490807, 1047005996, 1035481765,
+ 1023918549, 1012316784, 1000676905, 988999351, 977284561, 965532978, 953745043, 941921200, 930061894, 918167571,
+ 906238680, 894275670, 882278991, 870249095, 858186434, 846091463, 833964637, 821806413, 809617248, 797397602,
+ 785147934, 772868705, 760560379, 748223418, 735858287, 723465451, 711045377, 698598532, 686125386, 673626408,
+ 661102068, 648552837, 635979189, 623381597, 610760535, 598116478, 585449902, 572761285, 560051103, 547319836,
+ 534567962, 521795963, 509004318, 496193509, 483364019, 470516330, 457650927, 444768293, 431868914, 418953276,
+ 406021864, 393075166, 380113668, 367137860, 354148229, 341145265, 328129456, 315101294, 302061268, 289009870,
+ 275947591, 262874923, 249792357, 236700387, 223599506, 210490206, 197372981, 184248325, 171116732, 157978697,
+ 144834714, 131685278, 118530884, 105372028, 92209204, 79042909, 65873638, 52701886, 39528151, 26352927,
+ 13176711, 0, -13176711, -26352927, -39528151, -52701886, -65873638, -79042909, -92209204, -105372028,
+ -118530884, -131685278, -144834714, -157978697, -171116732, -184248325, -197372981, -210490206, -223599506, -236700387,
+ -249792357, -262874923, -275947591, -289009870, -302061268, -315101294, -328129456, -341145265, -354148229, -367137860,
+ -380113668, -393075166, -406021864, -418953276, -431868914, -444768293, -457650927, -470516330, -483364019, -496193509,
+ -509004318, -521795963, -534567962, -547319836, -560051103, -572761285, -585449902, -598116478, -610760535, -623381597,
+ -635979189, -648552837, -661102068, -673626408, -686125386, -698598532, -711045377, -723465451, -735858287, -748223418,
+ -760560379, -772868705, -785147934, -797397602, -809617248, -821806413, -833964637, -846091463, -858186434, -870249095,
+ -882278991, -894275670, -906238680, -918167571, -930061894, -941921200, -953745043, -965532978, -977284561, -988999351,
+ -1000676905, -1012316784, -1023918549, -1035481765, -1047005996, -1058490807, -1069935767, -1081340445, -1092704410, -1104027236,
+ -1115308496, -1126547765, -1137744620, -1148898640, -1160009404, -1171076495, -1182099495, -1193077990, -1204011566, -1214899812,
+ -1225742318, -1236538675, -1247288477, -1257991319, -1268646799, -1279254515, -1289814068, -1300325060, -1310787095, -1321199780,
+ -1331562723, -1341875533, -1352137822, -1362349204, -1372509294, -1382617710, -1392674071, -1402677999, -1412629117, -1422527050,
+ -1432371426, -1442161874, -1451898025, -1461579513, -1471205974, -1480777044, -1490292364, -1499751575, -1509154322, -1518500249,
+ -1527789007, -1537020243, -1546193612, -1555308767, -1564365366, -1573363068, -1582301533, -1591180425, -1599999411, -1608758157,
+ -1617456334, -1626093615, -1634669675, -1643184190, -1651636841, -1660027308, -1668355276, -1676620431, -1684822463, -1692961062,
+ -1701035922, -1709046739, -1716993211, -1724875039, -1732691927, -1740443580, -1748129706, -1755750017, -1763304224, -1770792044,
+ -1778213194, -1785567396, -1792854372, -1800073848, -1807225552, -1814309216, -1821324572, -1828271355, -1835149306, -1841958164,
+ -1848697673, -1855367580, -1861967634, -1868497585, -1874957189, -1881346201, -1887664382, -1893911494, -1900087300, -1906191570,
+ -1912224072, -1918184580, -1924072870, -1929888719, -1935631910, -1941302224, -1946899450, -1952423376, -1957873795, -1963250501,
+ -1968553291, -1973781967, -1978936330, -1984016188, -1989021349, -1993951624, -1998806829, -2003586779, -2008291295, -2012920200,
+ -2017473320, -2021950483, -2026351521, -2030676268, -2034924561, -2039096241, -2043191149, -2047209133, -2051150040, -2055013723,
+ -2058800035, -2062508835, -2066139983, -2069693341, -2073168777, -2076566159, -2079885360, -2083126254, -2086288719, -2089372637,
+ -2092377892, -2095304369, -2098151959, -2100920556, -2103610053, -2106220351, -2108751351, -2111202958, -2113575079, -2115867625,
+ -2118080510, -2120213651, -2122266966, -2124240380, -2126133817, -2127947206, -2129680479, -2131333571, -2132906419, -2134398965,
+ -2135811152, -2137142927, -2138394239, -2139565042, -2140655292, -2141664948, -2142593970, -2143442326, -2144209982, -2144896909,
+ -2145503083, -2146028479, -2146473079, -2146836866, -2147119825, -2147321946, -2147443222, -2147483648, -2147443222, -2147321946,
+ -2147119825, -2146836866, -2146473079, -2146028479, -2145503083, -2144896909, -2144209982, -2143442326, -2142593970, -2141664948,
+ -2140655292, -2139565042, -2138394239, -2137142927, -2135811152, -2134398965, -2132906419, -2131333571, -2129680479, -2127947206,
+ -2126133817, -2124240380, -2122266966, -2120213651, -2118080510, -2115867625, -2113575079, -2111202958, -2108751351, -2106220351,
+ -2103610053, -2100920556, -2098151959, -2095304369, -2092377892, -2089372637, -2086288719, -2083126254, -2079885360, -2076566159,
+ -2073168777, -2069693341, -2066139983, -2062508835, -2058800035, -2055013723, -2051150040, -2047209133, -2043191149, -2039096241,
+ -2034924561, -2030676268, -2026351521, -2021950483, -2017473320, -2012920200, -2008291295, -2003586779, -1998806829, -1993951624,
+ -1989021349, -1984016188, -1978936330, -1973781967, -1968553291, -1963250501, -1957873795, -1952423376, -1946899450, -1941302224,
+ -1935631910, -1929888719, -1924072870, -1918184580, -1912224072, -1906191570, -1900087300, -1893911494, -1887664382, -1881346201,
+ -1874957189, -1868497585, -1861967634, -1855367580, -1848697673, -1841958164, -1835149306, -1828271355, -1821324572, -1814309216,
+ -1807225552, -1800073848, -1792854372, -1785567396, -1778213194, -1770792044, -1763304224, -1755750017, -1748129706, -1740443580,
+ -1732691927, -1724875039, -1716993211, -1709046739, -1701035922, -1692961062, -1684822463, -1676620431, -1668355276, -1660027308,
+ -1651636841, -1643184190, -1634669675, -1626093615, -1617456334, -1608758157, -1599999411, -1591180425, -1582301533, -1573363068,
+ -1564365366, -1555308767, -1546193612, -1537020243, -1527789007, -1518500249, -1509154322, -1499751575, -1490292364, -1480777044,
+ -1471205974, -1461579513, -1451898025, -1442161874, -1432371426, -1422527050, -1412629117, -1402677999, -1392674071, -1382617710,
+ -1372509294, -1362349204, -1352137822, -1341875533, -1331562723, -1321199780, -1310787095, -1300325060, -1289814068, -1279254515,
+ -1268646799, -1257991319, -1247288477, -1236538675, -1225742318, -1214899812, -1204011566, -1193077990, -1182099495, -1171076495,
+ -1160009404, -1148898640, -1137744620, -1126547765, -1115308496, -1104027236, -1092704410, -1081340445, -1069935767, -1058490807,
+ -1047005996, -1035481765, -1023918549, -1012316784, -1000676905, -988999351, -977284561, -965532978, -953745043, -941921200,
+ -930061894, -918167571, -906238680, -894275670, -882278991, -870249095, -858186434, -846091463, -833964637, -821806413,
+ -809617248, -797397602, -785147934, -772868705, -760560379, -748223418, -735858287, -723465451, -711045377, -698598532,
+ -686125386, -673626408, -661102068, -648552837, -635979189, -623381597, -610760535, -598116478, -585449902, -572761285,
+ -560051103, -547319836, -534567962, -521795963, -509004318, -496193509, -483364019, -470516330, -457650927, -444768293,
+ -431868914, -418953276, -406021864, -393075166, -380113668, -367137860, -354148229, -341145265, -328129456, -315101294,
+ -302061268, -289009870, -275947591, -262874923, -249792357, -236700387, -223599506, -210490206, -197372981, -184248325,
+ -171116732, -157978697, -144834714, -131685278, -118530884, -105372028, -92209204, -79042909, -65873638, -52701886,
+ -39528151, -26352927, -13176711};
+
+
+
\ No newline at end of file