VS1053 Library Program demonstration
Dependencies: mbed VS1053lib MI0283QTlib
main.cpp@0:bc68fb9d73a4, 2012-05-26 (annotated)
- Committer:
- clemente
- Date:
- Sat May 26 17:42:43 2012 +0000
- Revision:
- 0:bc68fb9d73a4
Who changed what in which revision?
User | Revision | Line number | New 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 | } |