Added VS1003V_STM from Vassillis Serasidis. Note. Had to make a minor change as PC7 used in the example was not availabel on Maple mini. So I changed this for PC14
This commit is contained in:
parent
8540c26429
commit
e069959d3e
|
@ -0,0 +1,4 @@
|
|||
Description
|
||||
---
|
||||
|
||||
That library is for VS1003B / VS10053B WAV/MP3/AAC audio decoder. The library has been ported to work with STM32 micro-controllers.
|
|
@ -0,0 +1,346 @@
|
|||
/*
|
||||
Copyright (C) 2012 Andy Karpov <andy.karpov@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
version 2 as published by the Free Software Foundation.
|
||||
|
||||
Ported to STM32F103 by Vassilis Serasidis on 21 May 2015
|
||||
Home: http://www.serasidis.gr
|
||||
email: avrsite@yahoo.gr
|
||||
|
||||
*/
|
||||
|
||||
// STL headers
|
||||
// C headers
|
||||
#include <avr/pgmspace.h>
|
||||
// Framework headers
|
||||
// Library headers
|
||||
#include <avr/pgmspace.h>
|
||||
#include <limits.h>
|
||||
#include <libmaple/dma.h>
|
||||
#include "pins_arduino.h"
|
||||
#include "wiring_private.h"
|
||||
#include <SPI.h>
|
||||
// Project headers
|
||||
// This component's header
|
||||
#include <VS1003_STM.h>
|
||||
|
||||
const uint8_t vs1003_chunk_size = 32;
|
||||
|
||||
#undef PROGMEM
|
||||
#define PROGMEM __attribute__ ((section (".progmem.data")))
|
||||
#undef PSTR
|
||||
#define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
// VS1003 SCI Write Command byte is 0x02
|
||||
#define VS_WRITE_COMMAND 0x02
|
||||
|
||||
// VS1003 SCI Read COmmand byte is 0x03
|
||||
#define VS_READ_COMMAND 0x03
|
||||
|
||||
// SCI Registers
|
||||
|
||||
const uint8_t SCI_MODE = 0x0;
|
||||
const uint8_t SCI_STATUS = 0x1;
|
||||
const uint8_t SCI_BASS = 0x2;
|
||||
const uint8_t SCI_CLOCKF = 0x3;
|
||||
const uint8_t SCI_DECODE_TIME = 0x4;
|
||||
const uint8_t SCI_AUDATA = 0x5;
|
||||
const uint8_t SCI_WRAM = 0x6;
|
||||
const uint8_t SCI_WRAMADDR = 0x7;
|
||||
const uint8_t SCI_HDAT0 = 0x8;
|
||||
const uint8_t SCI_HDAT1 = 0x9;
|
||||
const uint8_t SCI_AIADDR = 0xa;
|
||||
const uint8_t SCI_VOL = 0xb;
|
||||
const uint8_t SCI_AICTRL0 = 0xc;
|
||||
const uint8_t SCI_AICTRL1 = 0xd;
|
||||
const uint8_t SCI_AICTRL2 = 0xe;
|
||||
const uint8_t SCI_AICTRL3 = 0xf;
|
||||
const uint8_t SCI_num_registers = 0xf;
|
||||
|
||||
// SCI_MODE bits
|
||||
|
||||
const uint8_t SM_DIFF = 0;
|
||||
const uint8_t SM_LAYER12 = 1;
|
||||
const uint8_t SM_RESET = 2;
|
||||
const uint8_t SM_OUTOFWAV = 3;
|
||||
const uint8_t SM_EARSPEAKER_LO = 4;
|
||||
const uint8_t SM_TESTS = 5;
|
||||
const uint8_t SM_STREAM = 6;
|
||||
const uint8_t SM_EARSPEAKER_HI = 7;
|
||||
const uint8_t SM_DACT = 8;
|
||||
const uint8_t SM_SDIORD = 9;
|
||||
const uint8_t SM_SDISHARE = 10;
|
||||
const uint8_t SM_SDINEW = 11;
|
||||
const uint8_t SM_ADPCM = 12;
|
||||
const uint8_t SM_ADCPM_HP = 13;
|
||||
const uint8_t SM_LINE_IN = 14;
|
||||
|
||||
// Register names
|
||||
|
||||
char reg_name_MODE[] PROGMEM = "MODE";
|
||||
char reg_name_STATUS[] PROGMEM = "STATUS";
|
||||
char reg_name_BASS[] PROGMEM = "BASS";
|
||||
char reg_name_CLOCKF[] PROGMEM = "CLOCKF";
|
||||
char reg_name_DECODE_TIME[] PROGMEM = "DECODE_TIME";
|
||||
char reg_name_AUDATA[] PROGMEM = "AUDATA";
|
||||
char reg_name_WRAM[] PROGMEM = "WRAM";
|
||||
char reg_name_WRAMADDR[] PROGMEM = "WRAMADDR";
|
||||
char reg_name_HDAT0[] PROGMEM = "HDAT0";
|
||||
char reg_name_HDAT1[] PROGMEM = "HDAT1";
|
||||
char reg_name_AIADDR[] PROGMEM = "AIADDR";
|
||||
char reg_name_VOL[] PROGMEM = "VOL";
|
||||
char reg_name_AICTRL0[] PROGMEM = "AICTRL0";
|
||||
char reg_name_AICTRL1[] PROGMEM = "AICTRL1";
|
||||
char reg_name_AICTRL2[] PROGMEM = "AICTRL2";
|
||||
char reg_name_AICTRL3[] PROGMEM = "AICTRL3";
|
||||
|
||||
static PGM_P register_names[] PROGMEM =
|
||||
{
|
||||
reg_name_MODE,
|
||||
reg_name_STATUS,
|
||||
reg_name_BASS,
|
||||
reg_name_CLOCKF,
|
||||
reg_name_DECODE_TIME,
|
||||
reg_name_AUDATA,
|
||||
reg_name_WRAM,
|
||||
reg_name_WRAMADDR,
|
||||
reg_name_HDAT0,
|
||||
reg_name_HDAT1,
|
||||
reg_name_AIADDR,
|
||||
reg_name_VOL,
|
||||
reg_name_AICTRL0,
|
||||
reg_name_AICTRL1,
|
||||
reg_name_AICTRL2,
|
||||
reg_name_AICTRL3,
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
inline void DMA1_CH3_Event() {
|
||||
dma1_ch3_Active = 0;
|
||||
dma_disable(DMA1, DMA_CH3);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
uint16_t VS1003_STM::read_register(uint8_t _reg) const
|
||||
{
|
||||
uint16_t result;
|
||||
control_mode_on();
|
||||
delayMicroseconds(1); // tXCSS
|
||||
SPI.transfer(VS_READ_COMMAND); // Read operation
|
||||
SPI.transfer(_reg); // Which register
|
||||
result = SPI.transfer(0xff) << 8; // read high byte
|
||||
result |= SPI.transfer(0xff); // read low byte
|
||||
delayMicroseconds(1); // tXCSH
|
||||
await_data_request();
|
||||
control_mode_off();
|
||||
return result;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::write_register(uint8_t _reg,uint16_t _value) const
|
||||
{
|
||||
control_mode_on();
|
||||
delayMicroseconds(1); // tXCSS
|
||||
SPI.transfer(VS_WRITE_COMMAND); // Write operation
|
||||
SPI.transfer(_reg); // Which register
|
||||
SPI.transfer(_value >> 8); // Send hi byte
|
||||
SPI.transfer(_value & 0xff); // Send lo byte
|
||||
delayMicroseconds(1); // tXCSH
|
||||
await_data_request();
|
||||
control_mode_off();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::sdi_send_buffer(const uint8_t* data, size_t len)
|
||||
{
|
||||
data_mode_on();
|
||||
while ( len )
|
||||
{
|
||||
await_data_request();
|
||||
delayMicroseconds(3);
|
||||
|
||||
size_t chunk_length = min(len,vs1003_chunk_size);
|
||||
len -= chunk_length;
|
||||
while ( chunk_length-- )
|
||||
SPI.transfer(*data++);
|
||||
}
|
||||
data_mode_off();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::sdi_send_zeroes(size_t len)
|
||||
{
|
||||
data_mode_on();
|
||||
while ( len )
|
||||
{
|
||||
await_data_request();
|
||||
|
||||
size_t chunk_length = min(len,vs1003_chunk_size);
|
||||
len -= chunk_length;
|
||||
while ( chunk_length-- )
|
||||
SPI.transfer(0);
|
||||
}
|
||||
data_mode_off();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
VS1003_STM::VS1003_STM( uint8_t _cs_pin, uint8_t _dcs_pin, uint8_t _dreq_pin, uint8_t _reset_pin):
|
||||
cs_pin(_cs_pin), dcs_pin(_dcs_pin), dreq_pin(_dreq_pin), reset_pin(_reset_pin)
|
||||
{
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::begin(void)
|
||||
{
|
||||
|
||||
// Keep the chip in reset until we are ready
|
||||
pinMode(reset_pin,OUTPUT);
|
||||
digitalWrite(reset_pin,LOW);
|
||||
|
||||
// The SCI and SDI will start deselected
|
||||
pinMode(cs_pin,OUTPUT);
|
||||
digitalWrite(cs_pin,HIGH);
|
||||
pinMode(dcs_pin,OUTPUT);
|
||||
digitalWrite(dcs_pin,HIGH);
|
||||
|
||||
// DREQ is an input
|
||||
pinMode(dreq_pin,INPUT);
|
||||
|
||||
// Boot VS1003
|
||||
//Serial.println(PSTR("Booting VS1003...\r\n"));
|
||||
|
||||
delay(1);
|
||||
|
||||
SPI.begin();
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
// init SPI slow mode
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV64); // Slow!
|
||||
|
||||
// release from reset
|
||||
digitalWrite(reset_pin,HIGH);
|
||||
|
||||
// Declick: Immediately switch analog off
|
||||
write_register(SCI_VOL,0xffff); // VOL
|
||||
|
||||
/* Declick: Slow sample rate for slow analog part startup */
|
||||
write_register(SCI_AUDATA,10);
|
||||
|
||||
delay(100);
|
||||
|
||||
/* Switch on the analog parts */
|
||||
write_register(SCI_VOL,0xfefe); // VOL
|
||||
|
||||
//printf_P(PSTR("VS1003 still booting\r\n"));
|
||||
|
||||
write_register(SCI_AUDATA,44101); // 44.1kHz stereo
|
||||
|
||||
write_register(SCI_VOL,0x2020); // VOL
|
||||
|
||||
// soft reset
|
||||
write_register(SCI_MODE, (1<<SM_SDINEW) | (1<<SM_RESET));
|
||||
delay(1);
|
||||
await_data_request();
|
||||
//write_register(SCI_CLOCKF,0xB800); // Experimenting with higher clock settings
|
||||
write_register(SCI_CLOCKF,0x6000);
|
||||
delay(1);
|
||||
await_data_request();
|
||||
|
||||
// Now you can set high speed SPI clock
|
||||
// 72 MHz / 16 = 4.5 MHz max is practically allowed by VS1003 SPI interface.
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV16);
|
||||
|
||||
//printf_P(PSTR("VS1003 Set\r\n"));
|
||||
//printDetails();
|
||||
//printf_P(PSTR("VS1003 OK\r\n"));
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::setVolume(uint8_t vol) const
|
||||
{
|
||||
uint16_t value = vol;
|
||||
value <<= 8;
|
||||
value |= vol;
|
||||
|
||||
write_register(SCI_VOL,value); // VOL
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::startSong(void)
|
||||
{
|
||||
sdi_send_zeroes(10);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::playChunk(const uint8_t* data, size_t len)
|
||||
{
|
||||
sdi_send_buffer(data,len);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::stopSong(void)
|
||||
{
|
||||
sdi_send_zeroes(2048);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::print_byte_register(uint8_t reg) const
|
||||
{
|
||||
const char *name = reinterpret_cast<const char*>(pgm_read_word( register_names + reg ));
|
||||
char extra_tab = strlen_P(name) < 5 ? '\t' : 0;
|
||||
//printf_P(PSTR("%02x %S\t%c = 0x%02x\r\n"),reg,name,extra_tab,read_register(reg));
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::printDetails(void) const
|
||||
{
|
||||
//printf_P(PSTR("VS1003 Configuration:\r\n"));
|
||||
int i = 0;
|
||||
while ( i <= SCI_num_registers )
|
||||
print_byte_register(i++);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void VS1003_STM::loadUserCode(const uint16_t* buf, size_t len) const
|
||||
{
|
||||
while (len)
|
||||
{
|
||||
uint16_t addr = pgm_read_word(buf++); len--;
|
||||
uint16_t n = pgm_read_word(buf++); len--;
|
||||
if (n & 0x8000U) { /* RLE run, replicate n samples */
|
||||
n &= 0x7FFF;
|
||||
uint16_t val = pgm_read_word(buf++); len--;
|
||||
while (n--) {
|
||||
//printf_P(PSTR("W %02x: %04x\r\n"),addr,val);
|
||||
write_register(addr, val);
|
||||
}
|
||||
} else { /* Copy run, copy n samples */
|
||||
while (n--) {
|
||||
uint16_t val = pgm_read_word(buf++); len--;
|
||||
//printf_P(PSTR("W %02x: %04x\r\n"),addr,val);
|
||||
write_register(addr, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
Copyright (C) 2012 Andy Karpov <andy.karpov@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
version 2 as published by the Free Software Foundation.
|
||||
|
||||
Ported to STM32F103 by Vassilis Serasidis on 21 May 2015
|
||||
Home: http://www.serasidis.gr
|
||||
email: avrsite@yahoo.gr
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __VS1003_STM_H__
|
||||
#define __VS1003_STM_H__
|
||||
|
||||
// STL headers
|
||||
// C headers
|
||||
// Framework headers
|
||||
#if ARDUINO < 100
|
||||
#include <WProgram.h>
|
||||
#else
|
||||
#include <Arduino.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Driver for VS1003 - MP3 / WMA / MIDI Audio Codec Chip
|
||||
*
|
||||
* See http://www.vlsi.fi/en/products/vs1003.html
|
||||
*/
|
||||
|
||||
class VS1003_STM
|
||||
{
|
||||
private:
|
||||
uint8_t cs_pin; /**< Pin where CS line is connected */
|
||||
uint8_t dcs_pin; /**< Pin where DCS line is connected */
|
||||
uint8_t dreq_pin; /**< Pin where DREQ line is connected */
|
||||
uint8_t reset_pin; /**< Pin where RESET line is connected */
|
||||
uint8_t my_SPCR; /**< Value of the SPCR register how we like it. */
|
||||
uint8_t my_SPSR; /**< Value of the SPSR register how we like it. */
|
||||
protected:
|
||||
inline void await_data_request(void) const
|
||||
{
|
||||
while ( !digitalRead(dreq_pin) );
|
||||
}
|
||||
|
||||
inline void control_mode_on(void) const
|
||||
{
|
||||
digitalWrite(dcs_pin,HIGH);
|
||||
digitalWrite(cs_pin,LOW);
|
||||
}
|
||||
|
||||
inline void control_mode_off(void) const
|
||||
{
|
||||
digitalWrite(cs_pin,HIGH);
|
||||
}
|
||||
|
||||
inline void data_mode_on(void) const
|
||||
{
|
||||
digitalWrite(cs_pin,HIGH);
|
||||
digitalWrite(dcs_pin,LOW);
|
||||
}
|
||||
|
||||
inline void data_mode_off(void) const
|
||||
{
|
||||
digitalWrite(dcs_pin,HIGH);
|
||||
}
|
||||
|
||||
uint16_t read_register(uint8_t _reg) const;
|
||||
void write_register(uint8_t _reg,uint16_t _value) const;
|
||||
void sdi_send_buffer(const uint8_t* data,size_t len);
|
||||
void sdi_send_zeroes(size_t length);
|
||||
void print_byte_register(uint8_t reg) const;
|
||||
|
||||
/**
|
||||
* Load a user code plugin
|
||||
*
|
||||
* @param buf Location of memory (in PROGMEM) where the code is
|
||||
* @param len Number of words to load
|
||||
*/
|
||||
void loadUserCode(const uint16_t* buf, size_t len) const;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* Only sets pin values. Doesn't do touch the chip. Be sure to call begin()!
|
||||
*/
|
||||
VS1003_STM( uint8_t _cs_pin, uint8_t _dcs_pin, uint8_t _dreq_pin, uint8_t _reset_pin);
|
||||
|
||||
/**
|
||||
* Begin operation
|
||||
*
|
||||
* Sets pins correctly, and prepares SPI bus.
|
||||
*/
|
||||
void begin(void);
|
||||
|
||||
/**
|
||||
* Prepare to start playing
|
||||
*
|
||||
* Call this each time a new song starts.
|
||||
*/
|
||||
void startSong(void);
|
||||
|
||||
/**
|
||||
* Play a chunk of data. Copies the data to the chip. Blocks until complete.
|
||||
*
|
||||
* @param data Pointer to where the data lives
|
||||
* @param len How many bytes of data to play
|
||||
*/
|
||||
void playChunk(const uint8_t* data, size_t len);
|
||||
|
||||
/**
|
||||
* Finish playing a song.
|
||||
*
|
||||
* Call this after the last playChunk call.
|
||||
*/
|
||||
void stopSong(void);
|
||||
|
||||
/**
|
||||
* Print configuration details
|
||||
*
|
||||
* Dumps all registers to stdout. Be sure to have stdout configured first
|
||||
* (see fdevopen() in avr/io.h).
|
||||
*/
|
||||
void printDetails(void) const;
|
||||
|
||||
/**
|
||||
* Set the player volume
|
||||
*
|
||||
* @param vol Volume level from 0-255, lower is louder.
|
||||
*/
|
||||
void setVolume(uint8_t vol) const;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,219 @@
|
|||
/*
|
||||
vs1003_hello
|
||||
|
||||
A simple MP3 flow player to test if board and library are working together.
|
||||
The following sketch should say "Hello" every 0.5s :)
|
||||
Created 2012-04-05 by Andrey Karpov
|
||||
|
||||
Ported to STM32F103 by Vassilis Serasidis on 21 May 2015
|
||||
Home: http://www.serasidis.gr
|
||||
email: avrsite@yahoo.gr
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
//#include <avr/io.h>
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
//#include "printf.h"
|
||||
#include <VS1003_STM.h>
|
||||
#include <SPI.h>
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* VS1003 development board connected by it's header pins the following way:
|
||||
*
|
||||
* GND - GND -
|
||||
* XDCS - D6 - PB10
|
||||
* DREQ - D7 - PA8
|
||||
* XRES - D8 - PA9
|
||||
* XCS - D9 - PC14
|
||||
* SCLK - D13 - PA5
|
||||
* SI - D11 - PA7
|
||||
* SO - D12 - PA6
|
||||
* GND - GND -
|
||||
* 5V - 5V -
|
||||
*/
|
||||
VS1003_STM player(PC14, PB10, PA8, PA9); // cs_pin, dcs_pin, dreq_pin, reset_pin
|
||||
|
||||
unsigned char HelloMP3[] = {
|
||||
0xFF,0xF2,0x40,0xC0,0x19,0xB7,0x00,0x14,0x02,0xE6,0x5C, /* ..@.......\ */
|
||||
0x01,0x92,0x68,0x01,0xF1,0x5E,0x03,0x08,0xF0,0x24,0x80, /* ..h..^...$. */
|
||||
0x05,0x9E,0x20,0xC6,0xFC,0x12,0x32,0x5C,0xBF,0xF9,0xB9, /* .. ...2\... */
|
||||
0x20,0x4A,0x7F,0x85,0xEC,0x4C,0xCD,0xC7,0x27,0xFE,0x5C, /* J...L..'.\ */
|
||||
0x34,0x25,0xCB,0xE6,0xFF,0xFF,0x8E,0x42,0xE1,0xA0,0x5E, /* 4%.....B..^ */
|
||||
0xCA,0x6E,0x30,0x9F,0xFF,0xF8,0xC2,0x12,0x84,0xB9,0x7C, /* .n0.......| */
|
||||
0xDC,0x61,0x09,0x4A,0x7F,0xFF,0xFF,0xF9,0x7D,0x32,0x51, /* .a.J....}2Q */
|
||||
0x09,0x7C,0xE1,0xA5,0x6E,0xB4,0xFF,0xFF,0xFF,0xFF,0xD3, /* .|..n...... */
|
||||
0x34,0x41,0x91,0xF0,0x11,0x8F,0x00,0x0F,0x81,0x9C,0x10, /* 4A......... */
|
||||
0xEE,0x59,0xCE,0x56,0x67,0xFF,0xF2,0x42,0xC0,0xEC,0x53, /* .Y.Vg..B..S */
|
||||
0x09,0x15,0xF9,0xAA,0xA8,0x0D,0xD9,0x40,0x00,0xCA,0x34, /* .......@..4 */
|
||||
0x53,0xD9,0x18,0xAB,0x7D,0xF7,0x89,0x3F,0x11,0x38,0x94, /* S...}..?.8. */
|
||||
0x82,0x59,0x93,0x20,0x6A,0x0C,0xEE,0x8E,0x58,0xFA,0x38, /* .Y. j...X.8 */
|
||||
0x82,0xCA,0xF0,0x58,0xBB,0xDA,0x0C,0x50,0x56,0x1F,0xBB, /* ...X...PV.. */
|
||||
0x18,0x5D,0x8B,0x9F,0xDA,0x71,0x4F,0xFF,0xBD,0xFE,0xEF, /* .]...qO.... */
|
||||
0x69,0x36,0x86,0x3C,0x50,0xBB,0x0A,0x07,0x89,0x54,0xF0, /* i6.<P....T. */
|
||||
0x88,0x9F,0x90,0x95,0x30,0x94,0x2E,0x7E,0xF0,0x64,0x96, /* ....0..~.d. */
|
||||
0x79,0x08,0x3E,0x20,0x97,0x28,0x34,0x9C,0x09,0x7F,0xD2, /* y.> .(4.... */
|
||||
0xC0,0x01,0x75,0xF8,0x05,0x6B,0x5F,0x41,0x17,0x0B,0xE7, /* ..u..k_A... */
|
||||
0xFF,0xF2,0x40,0xC0,0x61,0xE5,0x0B,0x16,0x09,0xC6,0xC5, /* ..@.a...... */
|
||||
0x74,0x7B,0xCC,0x94,0x7A,0xF7,0x80,0x76,0xB2,0xD2,0xF8, /* t{..z..v... */
|
||||
0x39,0x06,0x38,0xFD,0x71,0xC5,0xDE,0x3A,0x38,0xBF,0xD5, /* 9.8.q..:8.. */
|
||||
0xF7,0x12,0x37,0xCB,0xF5,0x63,0x0C,0x9B,0xCE,0x77,0x25, /* ..7..c...w% */
|
||||
0xED,0xFB,0x3D,0x6B,0x35,0xF9,0x6D,0xD7,0xF9,0x2C,0xD1, /* ..=k5.m..,. */
|
||||
0x97,0x15,0x87,0x93,0xA4,0x49,0x4A,0x18,0x16,0x07,0xA1, /* .....IJ.... */
|
||||
0x60,0xF7,0x52,0x94,0xDB,0x02,0x16,0x70,0xB2,0xD8,0x80, /* `.R....p... */
|
||||
0x30,0xC2,0x94,0x40,0x81,0x74,0x5A,0x19,0x7A,0x80,0x60, /* 0..@.tZ.z.` */
|
||||
0x41,0x21,0x46,0x95,0xD5,0xC4,0x40,0xD2,0x01,0xC0,0x01, /* A!F...@.... */
|
||||
0xDA,0xD9,0xA0,0xB1,0x01,0xFF,0xF2,0x42,0xC0,0x82,0x10, /* .......B... */
|
||||
0x0B,0x12,0xF9,0x9E,0xC9,0x7E,0x7A,0xC6,0x95,0x55,0x09, /* .....~z..U. */
|
||||
0x8B,0x19,0x5E,0x8B,0x26,0xCA,0xEB,0x68,0x8A,0x05,0x8F, /* ..^.&..h... */
|
||||
0x36,0xA5,0xA5,0x03,0xB8,0x9C,0xED,0x24,0x51,0x59,0x90, /* 6......$QY. */
|
||||
0xF6,0xC5,0x7D,0xB5,0xAD,0xAF,0xF6,0x3B,0x18,0xEF,0x3F, /* ..}....;..? */
|
||||
0xFF,0xFF,0x4E,0xDE,0x16,0x66,0x0B,0xAA,0x33,0x23,0xDD, /* ..N..f..3#. */
|
||||
0x9C,0x4E,0x6E,0x55,0x22,0x9D,0xA2,0x40,0xA6,0x36,0x31, /* .NnU"..@.61 */
|
||||
0x69,0xA5,0xE1,0xD9,0x7F,0xF7,0xC6,0xCC,0x48,0x00,0x0E, /* i.......H.. */
|
||||
0x90,0x16,0x00,0x0F,0xDE,0x6E,0x80,0x11,0x0C,0x9A,0x4F, /* .....n....O */
|
||||
0x56,0xDB,0x88,0xD3,0xB2,0x1C,0x00,0xE0,0x2E,0x3E,0xAC, /* V........>. */
|
||||
0xFF,0xF2,0x40,0xC0,0x1C,0xE5,0x19,0x13,0x31,0x4E,0xCD, /* ..@.....1N. */
|
||||
0x9E,0xC3,0x06,0x71,0x03,0x85,0xE5,0xB5,0x6D,0x88,0x50, /* ...q....m.P */
|
||||
0x8E,0x0E,0x17,0x3B,0x19,0xFB,0x4E,0x3B,0x99,0xEF,0x4C, /* ...;..N;..L */
|
||||
0x9E,0xF7,0x7B,0x31,0x7C,0x3C,0x5F,0xFF,0xF4,0xF8,0xE3, /* ..{1|<_.... */
|
||||
0x92,0x42,0x07,0x8E,0x83,0x8E,0x0F,0x05,0x08,0x91,0xA3, /* .B......... */
|
||||
0x16,0xE2,0xDF,0xB7,0x62,0x60,0x48,0x31,0x3C,0xFF,0xD4, /* ....b`H1<.. */
|
||||
0x9E,0x0C,0x68,0x00,0x77,0x54,0xE3,0x1E,0x05,0xC5,0xF8, /* ..h.wT..... */
|
||||
0xEA,0x8D,0x82,0x9D,0x08,0xA9,0x06,0x8D,0x1E,0x5D,0x7C, /* .........]| */
|
||||
0x7F,0x08,0xC0,0x50,0x45,0x42,0xD0,0x36,0xF8,0xB2,0x4D, /* ...PEB.6..M */
|
||||
0x53,0x0C,0x80,0x3B,0x4D,0xFF,0xF2,0x42,0xC0,0x2F,0x3C, /* S..;M..B./< */
|
||||
0x25,0x19,0x29,0xFE,0xBC,0x2E,0xC4,0xD0,0x99,0x4C,0x48, /* %.)......LH */
|
||||
0xB0,0x9C,0x49,0xD2,0x1A,0x2D,0x02,0xC2,0x79,0x69,0x16, /* ..I..-..yi. */
|
||||
0x92,0xA8,0xC5,0xAB,0x45,0x5A,0x68,0xE8,0x75,0x57,0xCD, /* ....EZh.uW. */
|
||||
0xF1,0xB9,0xAA,0x13,0x88,0xE4,0x87,0x42,0x15,0xB3,0x58, /* .......B..X */
|
||||
0xF5,0xA3,0x46,0xB1,0xCF,0xD3,0x59,0x7E,0xBA,0xB5,0xA7, /* ..F...Y~... */
|
||||
0x6B,0x0B,0x17,0x57,0x6B,0x5C,0x4A,0xCD,0x53,0x76,0x2A, /* k..Wk\J.Sv* */
|
||||
0x1D,0x28,0xC5,0x1C,0x76,0x5C,0xDD,0x0A,0x00,0x4B,0xC0, /* .(..v\...K. */
|
||||
0x1B,0xCA,0xA8,0xE9,0x81,0x5B,0xA6,0xDC,0xA4,0x59,0x13, /* .....[...Y. */
|
||||
0xFC,0xBA,0x8F,0x98,0x79,0x44,0x25,0xC9,0x35,0x38,0xCA, /* ....yD%.58. */
|
||||
0xFF,0xF2,0x40,0xC0,0xB9,0x7D,0x1A,0x13,0x79,0x6A,0xC8, /* ..@..}..yj. */
|
||||
0x3E,0xC4,0x46,0x94,0x8D,0x3C,0x67,0x85,0xB1,0xA8,0x89, /* >.F..<g.... */
|
||||
0xC0,0xF2,0xE6,0x2F,0x9D,0x7C,0xC9,0xB4,0xBE,0xCF,0xE1, /* .../.|..... */
|
||||
0x7D,0xFE,0x1F,0x03,0x00,0x12,0x84,0x72,0x8C,0xE7,0xD8, /* }......r... */
|
||||
0x5E,0xC9,0xA9,0x01,0xBA,0x9B,0xC4,0x10,0x5C,0x70,0x2E, /* ^.......\p. */
|
||||
0x6C,0x48,0xE7,0x8C,0x15,0x0B,0x06,0x01,0xE5,0xFF,0xFF, /* lH......... */
|
||||
0xD4,0x0D,0x00,0x0F,0xCE,0x58,0x95,0x61,0xA8,0x9E,0x7B, /* .....X.a..{ */
|
||||
0x19,0x98,0xB0,0xF0,0xC6,0x72,0x82,0xD5,0x27,0x06,0x47, /* .....r..'.G */
|
||||
0x41,0x22,0x0F,0x65,0x93,0xC9,0x8A,0x09,0x19,0x48,0x1B, /* A".e.....H. */
|
||||
0xBD,0xD6,0x64,0x1A,0xAC,0xFF,0xF2,0x42,0xC0,0xF1,0x11, /* ..d....B... */
|
||||
0x25,0x14,0x22,0x06,0xBC,0x0E,0xD4,0x4E,0x99,0x90,0xA8, /* %."....N... */
|
||||
0xD8,0xB7,0xAD,0x5D,0x3E,0xAF,0x6E,0xBE,0x66,0x83,0xA4, /* ...]>.n.f.. */
|
||||
0xE3,0xC2,0xE0,0x29,0x43,0x87,0x5F,0x4F,0x27,0x9C,0x2C, /* ...)C._O'., */
|
||||
0xD0,0x91,0xF3,0x87,0x9B,0x54,0xED,0xD1,0xB4,0xF3,0x39, /* .....T....9 */
|
||||
0x87,0x22,0x06,0x86,0x0D,0x71,0xE4,0x6F,0x2A,0x08,0x04, /* ."...q.o*.. */
|
||||
0xC0,0x03,0x2A,0xB1,0xE2,0x05,0x4D,0x64,0xA1,0x9C,0xA6, /* ..*...Md... */
|
||||
0x0D,0x41,0xA6,0xF2,0x7A,0xC1,0x30,0xC3,0x38,0x26,0x09, /* .A..z.0.8&. */
|
||||
0x50,0x08,0xC4,0xF6,0x30,0x0C,0xA6,0xA9,0x17,0x00,0x13, /* P...0...... */
|
||||
0x0C,0xDC,0xC4,0x2F,0x28,0xEB,0x3F,0xCD,0x7A,0x3D,0x2F, /* .../(.?.z=/ */
|
||||
0xFF,0xF2,0x40,0xC0,0x18,0x6F,0x2E,0x13,0xA1,0xF2,0xBC, /* ..@..o..... */
|
||||
0x36,0xCB,0x4E,0x99,0x6E,0xFC,0xEE,0xC5,0xF0,0xA0,0xB7, /* 6.N.n...... */
|
||||
0x92,0xD4,0xEE,0x79,0x7C,0x50,0x5D,0xE5,0x04,0x94,0xA9, /* ...y|P].... */
|
||||
0x76,0xCF,0x6C,0x70,0xDD,0x0D,0xD4,0xEE,0xED,0x98,0xE8, /* v.lp....... */
|
||||
0xC8,0x35,0x36,0x7A,0x0C,0x05,0x80,0x03,0xBC,0xBE,0x91, /* .56z....... */
|
||||
0x00,0x7C,0xAE,0x65,0xB8,0x91,0xA3,0x33,0xBA,0x68,0x60, /* .|.e...3.h` */
|
||||
0xD4,0x1A,0x66,0xF8,0x43,0xA0,0x20,0x89,0xE7,0x80,0xD8, /* ..f.C. .... */
|
||||
0x1E,0x4F,0xA0,0x04,0x60,0x06,0x0A,0xA4,0x91,0x24,0xFA, /* .O..`....$. */
|
||||
0x9F,0x57,0x53,0xF4,0x7A,0xDB,0x5F,0x56,0xE3,0x6E,0x0B, /* .WS.z._V.n. */
|
||||
0x8B,0x3A,0x1C,0xF9,0x5E,0xFF,0xF2,0x42,0xC0,0xB1,0x00, /* .:..^..B... */
|
||||
0x38,0x14,0x09,0xEE,0xB4,0x36,0xD3,0x4E,0x99,0xA4,0x78, /* 8....6.N..x */
|
||||
0x94,0x73,0xC4,0x66,0x30,0xF5,0xEA,0xDB,0xBA,0x67,0x67, /* .s.f0....gg */
|
||||
0x95,0x6B,0xAB,0x68,0x5D,0x08,0xA1,0x39,0x56,0xAB,0x1E, /* .k.h]..9V.. */
|
||||
0xD5,0x03,0xE8,0x01,0x70,0x00,0xB3,0x93,0x33,0x19,0x8C, /* ....p...3.. */
|
||||
0x61,0x8F,0xBB,0x5D,0x24,0x12,0x63,0xD3,0x4B,0x5D,0x91, /* a..]$.c.K]. */
|
||||
0x08,0x43,0x22,0x56,0x1A,0xC5,0x10,0x21,0x84,0xA8,0xEA, /* .C"V...!... */
|
||||
0x80,0xBF,0x16,0x8E,0x3D,0x46,0x18,0x9C,0x6E,0x9A,0x91, /* ....=F..n.. */
|
||||
0xE6,0xC9,0x6F,0xD2,0x7D,0x27,0xD7,0xE9,0x6B,0xFF,0x0A, /* ..o.}'..k.. */
|
||||
0x03,0x43,0x89,0xD5,0xBF,0x52,0x97,0x0A,0x25,0x95,0x0D, /* .C...R..%.. */
|
||||
0xFF,0xF2,0x40,0xC0,0xF5,0xC3,0x41,0x13,0x81,0xEE,0xA8, /* ..@...A.... */
|
||||
0x5E,0xD3,0x44,0x98,0xFC,0xCF,0x97,0xF9,0x58,0xB5,0x33, /* ^.D.....X.3 */
|
||||
0xB1,0x85,0x47,0x86,0xD7,0x98,0x01,0x3B,0xA3,0x4F,0x7E, /* ..G....;.O~ */
|
||||
0x04,0xA6,0xC3,0x39,0x21,0x70,0x27,0x62,0xB5,0x18,0x10, /* ...9!p'b... */
|
||||
0x09,0x99,0x00,0x8B,0x7E,0xF2,0xBF,0x52,0x18,0x26,0x30, /* ....~..R.&0 */
|
||||
0x1C,0xB0,0x01,0x49,0x30,0xE0,0xC3,0x11,0x46,0x05,0xCC, /* ...I0...F.. */
|
||||
0x49,0x14,0x28,0xB2,0xED,0x4B,0x57,0x5A,0x2F,0xB7,0x46, /* I.(..KWZ/.F */
|
||||
0x63,0x34,0xD2,0xDA,0x9F,0x56,0x32,0xB7,0xA2,0x25,0xFF, /* c4...V2..%. */
|
||||
0x94,0x28,0x33,0x7F,0x3B,0xC4,0x50,0xEC,0xB1,0xE2,0x26, /* .(3.;.P...& */
|
||||
0xA1,0xB7,0x07,0x7F,0xFB,0xFF,0xF2,0x42,0xC0,0x67,0x6A, /* .......B.gj */
|
||||
0x4C,0x13,0xF9,0x6A,0x90,0x7E,0xDB,0x44,0x94,0x3F,0xFF, /* L..j.~.D.?. */
|
||||
0x14,0xD6,0x2A,0xFF,0xFF,0xC1,0x34,0x8C,0x48,0x22,0x00, /* ..*...4.H". */
|
||||
0x06,0x8F,0x21,0xFD,0x64,0x60,0x04,0x92,0x42,0xEA,0x74, /* ..!.d`..B.t */
|
||||
0x32,0x37,0xAA,0x5A,0x9F,0x67,0x01,0x8B,0x3F,0x37,0x31, /* 27.Z.g..?71 */
|
||||
0xDD,0x06,0x3C,0x01,0x34,0x30,0xE0,0x5C,0x78,0x78,0xCB, /* ..<.40.\xx. */
|
||||
0xD6,0xF1,0x31,0x8A,0x69,0x61,0x93,0x92,0x42,0xCE,0x4B, /* ..1.ia..B.K */
|
||||
0xC5,0x02,0x4E,0x73,0xC6,0x24,0x30,0xCD,0x08,0x66,0xC6, /* ..Ns.$0..f. */
|
||||
0x35,0xAB,0xA2,0x3D,0x2F,0xB3,0xBD,0x34,0x87,0x13,0xEE, /* 5..=/..4... */
|
||||
0x71,0x45,0x68,0xFA,0xEA,0x05,0x84,0x41,0x36,0x4C,0x9A, /* qEh....A6L. */
|
||||
0xFF,0xF2,0x40,0xC0,0xC9,0x92,0x56,0x13,0xD0,0x6E,0x70, /* ..@...V..np */
|
||||
0x54,0xD3,0xCC,0x28,0x06,0xD7,0x0E,0xA4,0x1D,0x9C,0x9D, /* T..(....... */
|
||||
0xD9,0xA9,0x88,0x7B,0xB5,0xA3,0x56,0xB7,0x4B,0x4B,0x5A, /* ...{..V.KKZ */
|
||||
0x9B,0x2C,0xA9,0xAD,0x6F,0x99,0x6C,0xC0,0x4C,0x14,0x14, /* .,..o.l.L.. */
|
||||
0xEF,0xB4,0x20,0x91,0x5F,0xBC,0x81,0x41,0x41,0x5D,0xD4, /* .. ._..AA]. */
|
||||
0x20,0xBD,0x05,0x1A,0x6F,0xE2,0x68,0x56,0x41,0x41,0x57, /* ...o.hVAAW */
|
||||
0xF9,0xBF,0x89,0x82,0x8E,0xC7,0x8F,0x0A,0x0A,0x09,0x37, /* ..........7 */
|
||||
0xF1,0x05,0x0A,0x0A,0x0A,0x0A,0x09,0x05,0x37,0xFF,0x10, /* ........7.. */
|
||||
0x50,0x50,0x53,0x65,0xFF,0xFF,0xFD,0x75,0xDF,0xFF,0xFF, /* PPSe...u... */
|
||||
0x68,0x4F,0xFF,0x84,0x70,0xFF,0xF2,0x42,0xC0,0x27,0x50, /* hO..p..B.'P */
|
||||
0x5F,0x17,0xE8,0x82,0x3C,0x11,0x58,0x18,0x01,0x55,0x48, /* _...<.X..UH */
|
||||
0xBC,0x52,0xFC,0x4A,0x4C,0x3C,0xD5,0xF6,0x11,0x2D,0xBF, /* .R.JL<...-. */
|
||||
0xEA,0x03,0x5C,0x57,0x29,0xBF,0xC3,0x75,0x1C,0xE6,0xDD, /* ..\W)..u... */
|
||||
0xBF,0xED,0xEF,0xD0,0x98,0x77,0x71,0x95,0x73,0xFF,0xED, /* .....wq.s.. */
|
||||
0x54,0xBE,0xD5,0xEE,0xAE,0xC2,0xD5,0x0B,0xFF,0xF1,0x97, /* T.......... */
|
||||
0x8A,0xE4,0x42,0x09,0x99,0xB1,0xEA,0x94,0xDC,0x78,0xB5, /* ..B......x. */
|
||||
0x34,0x0F,0xF1,0x8F,0xFC,0x15,0xF6,0xFA,0xB1,0x47,0xA9, /* 4........G. */
|
||||
0x6C,0x67,0x43,0x8B,0xF2,0x76,0x22,0xED,0xDA,0x85,0xBA, /* lgC..v".... */
|
||||
0x2F,0xC7,0xF9,0xCF,0xFC,0xDB,0x46,0x2E,0x50,0x0A,0x84, /* /.....F.P.. */
|
||||
0xFF,0xF2,0x40,0xC0,0xC6,0x4A,0x59,0x28,0x2B,0x19,0xE0, /* ..@..JY(+.. */
|
||||
0x01,0x89,0x78,0x00,0x52,0x85,0x3C,0x8E,0x54,0x9A,0x48, /* ..x.R.<.T.H */
|
||||
0x5A,0x72,0x32,0x94,0xBF,0x43,0x4F,0x24,0x53,0x4B,0xEC, /* Zr2..CO$SK. */
|
||||
0x4B,0x99,0x0E,0x66,0x1F,0xFF,0xCE,0x7F,0xFF,0x3F,0x10, /* K..f.....?. */
|
||||
0xAE,0x82,0x62,0x71,0x34,0x18,0x59,0x9B,0x51,0xC7,0x59, /* ..bq4.Y.Q.Y */
|
||||
0xCE,0xEE,0xA5,0xFE,0x02,0xBB,0x30,0x91,0x49,0xD5,0x4B, /* ......0.I.K */
|
||||
0xF3,0xDC,0x9A,0xA9,0x57,0x8E,0x72,0x10,0xC0,0x5D,0x60, /* ....W.r..]` */
|
||||
0x67,0xFC,0x7D,0xD6,0xBA,0xDD,0xB3,0x8B,0x5A,0x0A,0x4C, /* g.}.....Z.L */
|
||||
0x41,0x4D,0x45,0x33,0x2E,0x39,0x33,0xAA,0xAA,0xAA,0xAA, /* AME3.93.... */
|
||||
0xAA,0xAA,0xAA,0xAA,0xAA,0x54,0x41,0x47,0x48,0x65,0x6C, /* .....TAGHel */
|
||||
0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* lo */
|
||||
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
|
||||
0x20,0x20,0x20,0x20,0x20,0x50,0x61,0x6E,0x75,0x2D,0x4B, /* Panu-K */
|
||||
0x72,0x69,0x73,0x74,0x69,0x61,0x6E,0x20,0x50,0x6F,0x69, /* ristian Poi */
|
||||
0x6B,0x73,0x61,0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20, /* ksalo */
|
||||
0x20,0x20,0x56,0x53,0x44,0x53,0x50,0x20,0x54,0x65,0x73, /* VSDSP Tes */
|
||||
0x74,0x69,0x6E,0x67,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* ting */
|
||||
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
|
||||
0x20,0x20,0x20,0x4D,0x50,0x33,0x20,0x48,0x65,0x6C,0x6C, /* MP3 Hell */
|
||||
0x6F,0x2C,0x20,0x57,0x6F,0x72,0x6C,0x64,0x21,0x20,0x20, /* o, World! */
|
||||
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
|
||||
0x00, /* . */
|
||||
};
|
||||
|
||||
void setup () {
|
||||
Serial.begin(9600);
|
||||
while (!Serial) {
|
||||
; //Give some time to Serial port to be initiallized.
|
||||
}
|
||||
Serial.println("VS1003 test");
|
||||
|
||||
// initiate a player
|
||||
player.begin();
|
||||
// set maximum output volume
|
||||
player.setVolume(0x00);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// play hellomp3 flow each 0.5s ;)
|
||||
player.playChunk(HelloMP3, sizeof(HelloMP3));
|
||||
delay(500);
|
||||
}
|
Loading…
Reference in New Issue