VS1053 Library Program demonstration

Dependencies:   mbed VS1053lib MI0283QTlib

Committer:
clemente
Date:
Sat May 26 17:42:43 2012 +0000
Revision:
0:bc68fb9d73a4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemente 0:bc68fb9d73a4 1 #include "mbed.h"
clemente 0:bc68fb9d73a4 2 #include "SDFileSystem.h"
clemente 0:bc68fb9d73a4 3 #include "VLSIcodec.h"
clemente 0:bc68fb9d73a4 4 #include "piano_A4.h"
clemente 0:bc68fb9d73a4 5 #include "MI0283QTlib.h"
clemente 0:bc68fb9d73a4 6
clemente 0:bc68fb9d73a4 7 DigitalOut myled(LED2);
clemente 0:bc68fb9d73a4 8 DigitalOut DBG_LED(LED1);
clemente 0:bc68fb9d73a4 9 DigitalIn Volume( p30);
clemente 0:bc68fb9d73a4 10 DigitalIn Pause( p25);
clemente 0:bc68fb9d73a4 11 VS1053Codec codec( p11, p12, p13, p21, p22, p23, p24);
clemente 0:bc68fb9d73a4 12
clemente 0:bc68fb9d73a4 13 FILE *fp;
clemente 0:bc68fb9d73a4 14 SDFileSystem sd(p5, p6, p7, p8, "sd");
clemente 0:bc68fb9d73a4 15
clemente 0:bc68fb9d73a4 16 GLCD lcd( p11, p12, p13, p14, p17, p26);
clemente 0:bc68fb9d73a4 17
clemente 0:bc68fb9d73a4 18 void PlayPiano1( void);
clemente 0:bc68fb9d73a4 19 void displayGA( unsigned char *gaval, unsigned char *gapeak, unsigned char bands);
clemente 0:bc68fb9d73a4 20
clemente 0:bc68fb9d73a4 21 unsigned char volval=0;
clemente 0:bc68fb9d73a4 22 Timer t;
clemente 0:bc68fb9d73a4 23 Serial pc(USBTX, USBRX);
clemente 0:bc68fb9d73a4 24
clemente 0:bc68fb9d73a4 25 unsigned char buff[64];
clemente 0:bc68fb9d73a4 26
clemente 0:bc68fb9d73a4 27 unsigned char gaval[14], gapeak[14];
clemente 0:bc68fb9d73a4 28
clemente 0:bc68fb9d73a4 29 int main() {
clemente 0:bc68fb9d73a4 30
clemente 0:bc68fb9d73a4 31 int cnt;
clemente 0:bc68fb9d73a4 32
clemente 0:bc68fb9d73a4 33 pc.baud( 115200);
clemente 0:bc68fb9d73a4 34
clemente 0:bc68fb9d73a4 35 fp = fopen("/sd/mbed.txt", "w");
clemente 0:bc68fb9d73a4 36 if ( fp == NULL) {
clemente 0:bc68fb9d73a4 37 printf("Error opening file\n");
clemente 0:bc68fb9d73a4 38 DBG_LED=1;
clemente 0:bc68fb9d73a4 39 while(1);
clemente 0:bc68fb9d73a4 40 }
clemente 0:bc68fb9d73a4 41 fprintf( fp, "File mbed\n");
clemente 0:bc68fb9d73a4 42 fclose( fp);
clemente 0:bc68fb9d73a4 43
clemente 0:bc68fb9d73a4 44 Volume.mode( PullUp);
clemente 0:bc68fb9d73a4 45 Pause.mode( PullUp);
clemente 0:bc68fb9d73a4 46
clemente 0:bc68fb9d73a4 47 if ( (fp = fopen("/sd/sounds/0001.mp3", "r")) == NULL) {
clemente 0:bc68fb9d73a4 48 DBG_LED=1;
clemente 0:bc68fb9d73a4 49 printf("Errore apertura file MP3\r\n");
clemente 0:bc68fb9d73a4 50 while(1);
clemente 0:bc68fb9d73a4 51 }
clemente 0:bc68fb9d73a4 52 //
clemente 0:bc68fb9d73a4 53 lcd.backlightoff();
clemente 0:bc68fb9d73a4 54 lcd.lcd_init();
clemente 0:bc68fb9d73a4 55 lcd.lcd_clear( LCD_WHITE);
clemente 0:bc68fb9d73a4 56 lcd.backlighton();
clemente 0:bc68fb9d73a4 57
clemente 0:bc68fb9d73a4 58 //
clemente 0:bc68fb9d73a4 59 codec.init();
clemente 0:bc68fb9d73a4 60 // codec.loadpatch();
clemente 0:bc68fb9d73a4 61 codec.loadgapatch();
clemente 0:bc68fb9d73a4 62 codec.setvolume( volval, volval);
clemente 0:bc68fb9d73a4 63
clemente 0:bc68fb9d73a4 64 printf("Sine Test\r\n");
clemente 0:bc68fb9d73a4 65 codec.sinetest( 0x7d);
clemente 0:bc68fb9d73a4 66 wait( .5);
clemente 0:bc68fb9d73a4 67 codec.sinetest( 0x00);
clemente 0:bc68fb9d73a4 68
clemente 0:bc68fb9d73a4 69 printf("Riproduzione del file MP3\n\r");
clemente 0:bc68fb9d73a4 70
clemente 0:bc68fb9d73a4 71 codec.setbassboost( 15, 150);
clemente 0:bc68fb9d73a4 72 codec.settrebleboost( 7, 15000);
clemente 0:bc68fb9d73a4 73 codec.setvmeter();
clemente 0:bc68fb9d73a4 74
clemente 0:bc68fb9d73a4 75 //
clemente 0:bc68fb9d73a4 76 unsigned short bands=codec.readgabands();
clemente 0:bc68fb9d73a4 77 printf("GA: Num of bands:%d\r\n", bands);
clemente 0:bc68fb9d73a4 78
clemente 0:bc68fb9d73a4 79 t.start();
clemente 0:bc68fb9d73a4 80 while( 1) {
clemente 0:bc68fb9d73a4 81 cnt = fread(&buff[0], sizeof(buff[0]), sizeof(buff)/sizeof(buff[0]), fp);
clemente 0:bc68fb9d73a4 82 // loop di riproduzione.
clemente 0:bc68fb9d73a4 83 int iSize=0;
clemente 0:bc68fb9d73a4 84 while( iSize < cnt) {
clemente 0:bc68fb9d73a4 85 int count=32;
clemente 0:bc68fb9d73a4 86 codec.testdreq();
clemente 0:bc68fb9d73a4 87 while( count--) {
clemente 0:bc68fb9d73a4 88 codec.writedata( buff[ iSize++]);
clemente 0:bc68fb9d73a4 89 if ( iSize > cnt)
clemente 0:bc68fb9d73a4 90 break;
clemente 0:bc68fb9d73a4 91 }
clemente 0:bc68fb9d73a4 92 }
clemente 0:bc68fb9d73a4 93 // verifico l'esito della lettura.
clemente 0:bc68fb9d73a4 94 if ( feof( fp)) {
clemente 0:bc68fb9d73a4 95 fclose( fp);
clemente 0:bc68fb9d73a4 96 DBG_LED=1;
clemente 0:bc68fb9d73a4 97 break;
clemente 0:bc68fb9d73a4 98 }
clemente 0:bc68fb9d73a4 99 //
clemente 0:bc68fb9d73a4 100 if ( !Volume) {
clemente 0:bc68fb9d73a4 101 volval++;
clemente 0:bc68fb9d73a4 102 codec.setvolume( volval, volval);
clemente 0:bc68fb9d73a4 103 printf("Set volume %d\n\r", volval);
clemente 0:bc68fb9d73a4 104 }
clemente 0:bc68fb9d73a4 105 //
clemente 0:bc68fb9d73a4 106 if ( !Pause) {
clemente 0:bc68fb9d73a4 107 // volume a zero
clemente 0:bc68fb9d73a4 108 codec.setvolume( 0xFE, 0xFE);
clemente 0:bc68fb9d73a4 109 // Aspetto finché il pulsante è premuto...
clemente 0:bc68fb9d73a4 110 while( !Pause);
clemente 0:bc68fb9d73a4 111 codec.setvolume( volval, volval);
clemente 0:bc68fb9d73a4 112 }
clemente 0:bc68fb9d73a4 113 //
clemente 0:bc68fb9d73a4 114 int tm=t.read_ms();
clemente 0:bc68fb9d73a4 115 //
clemente 0:bc68fb9d73a4 116 if ( tm>=100) {
clemente 0:bc68fb9d73a4 117 t.reset();
clemente 0:bc68fb9d73a4 118 //
clemente 0:bc68fb9d73a4 119 codec.readgavalue( &gaval[0], &gapeak[0]);
clemente 0:bc68fb9d73a4 120 displayGA( &gaval[0], &gapeak[0], bands);
clemente 0:bc68fb9d73a4 121 #if 0
clemente 0:bc68fb9d73a4 122 printf("SValue: ");
clemente 0:bc68fb9d73a4 123 for( int f=0; f<bands; f++) {
clemente 0:bc68fb9d73a4 124 printf("%2d, ",gaval[f]);
clemente 0:bc68fb9d73a4 125 }
clemente 0:bc68fb9d73a4 126 #else
clemente 0:bc68fb9d73a4 127 printf("SPeak: ");
clemente 0:bc68fb9d73a4 128 for( int f=0; f<bands; f++) {
clemente 0:bc68fb9d73a4 129 printf("%2d, ",gapeak[f]);
clemente 0:bc68fb9d73a4 130 }
clemente 0:bc68fb9d73a4 131 #endif
clemente 0:bc68fb9d73a4 132 printf("\r\n");
clemente 0:bc68fb9d73a4 133 }
clemente 0:bc68fb9d73a4 134 }
clemente 0:bc68fb9d73a4 135
clemente 0:bc68fb9d73a4 136 while(1) {
clemente 0:bc68fb9d73a4 137 myled = 1;
clemente 0:bc68fb9d73a4 138 wait(0.2);
clemente 0:bc68fb9d73a4 139 myled = 0;
clemente 0:bc68fb9d73a4 140 wait(0.2);
clemente 0:bc68fb9d73a4 141 }
clemente 0:bc68fb9d73a4 142 }
clemente 0:bc68fb9d73a4 143
clemente 0:bc68fb9d73a4 144 void PlayPiano1( void)
clemente 0:bc68fb9d73a4 145 {
clemente 0:bc68fb9d73a4 146 // piano_note
clemente 0:bc68fb9d73a4 147 int cnt=sizeof(piano_A4)/sizeof(piano_A4[0]);
clemente 0:bc68fb9d73a4 148 printf("Riproduzione file MP3 piano_note [%d]\n\r", cnt);
clemente 0:bc68fb9d73a4 149 //
clemente 0:bc68fb9d73a4 150 int iSize=0;
clemente 0:bc68fb9d73a4 151 while( iSize < cnt) {
clemente 0:bc68fb9d73a4 152 int count=32;
clemente 0:bc68fb9d73a4 153 codec.testdreq();
clemente 0:bc68fb9d73a4 154 while( count--) {
clemente 0:bc68fb9d73a4 155 codec.writedata( piano_A4[ iSize++]);
clemente 0:bc68fb9d73a4 156 if ( iSize > cnt)
clemente 0:bc68fb9d73a4 157 break;
clemente 0:bc68fb9d73a4 158 }
clemente 0:bc68fb9d73a4 159 }
clemente 0:bc68fb9d73a4 160 }
clemente 0:bc68fb9d73a4 161
clemente 0:bc68fb9d73a4 162 #define cBAR_MUL 2 // moltiplicatore per aumentare il valore max della barra.
clemente 0:bc68fb9d73a4 163 #define cBAR_MAX 31 // massimo valore raggiunto dalla barra, come definito dal VS1053
clemente 0:bc68fb9d73a4 164 #define cBAR_W 5 // spessore barra
clemente 0:bc68fb9d73a4 165 #define cBAR_H (cBAR_MUL*cBAR_MAX) // altezza della barra
clemente 0:bc68fb9d73a4 166 #define cBAR_S 1 // distanza tra le barre
clemente 0:bc68fb9d73a4 167 #define cBAR_X 20 // coordinata x iniziale
clemente 0:bc68fb9d73a4 168 #define cBAR_Y 150 // coordinata y iniziale
clemente 0:bc68fb9d73a4 169
clemente 0:bc68fb9d73a4 170 const unsigned int bandscl[14]={ 0xff0000,0xff9933,0xffff66,0x99cc00,0x00ff00,0x33cc66,0x33ffcc,0x99ffff,0x0033cc,0x6666ff,
clemente 0:bc68fb9d73a4 171 0x9933cc,0xccccff,0x0066ff,0x333ff};
clemente 0:bc68fb9d73a4 172
clemente 0:bc68fb9d73a4 173 void displayGA( unsigned char *gaval, unsigned char *gapeak, unsigned char bands)
clemente 0:bc68fb9d73a4 174 {
clemente 0:bc68fb9d73a4 175
clemente 0:bc68fb9d73a4 176 lcd.lcd_clear( cBAR_X, cBAR_Y, (cBAR_W+cBAR_S)*bands, cBAR_H, LCD_WHITE);
clemente 0:bc68fb9d73a4 177
clemente 0:bc68fb9d73a4 178 for ( int i=0; i<bands; i++) {
clemente 0:bc68fb9d73a4 179 //
clemente 0:bc68fb9d73a4 180 // lcd.lcd_clear( cBAR_X+(( cBAR_W+cBAR_S)*i), cBAR_Y, cBAR_W, cBAR_H, LCD_WHITE);
clemente 0:bc68fb9d73a4 181 // lcd.lcd_clear(unsigned int x0, unsigned int y0, unsigned int w, unsigned int h, unsigned int color)
clemente 0:bc68fb9d73a4 182 lcd.lcd_clear( cBAR_X+(( cBAR_W+cBAR_S)*i), cBAR_Y+(cBAR_H-(gaval[i]*cBAR_MUL) ), cBAR_W, gaval[i]*cBAR_MUL, bandscl[i]);
clemente 0:bc68fb9d73a4 183 }
clemente 0:bc68fb9d73a4 184 }