VS1053 Library Program demonstration

Dependencies:   mbed VS1053lib MI0283QTlib

main.cpp

Committer:
clemente
Date:
2012-05-26
Revision:
0:bc68fb9d73a4

File content as of revision 0:bc68fb9d73a4:

#include "mbed.h"
#include "SDFileSystem.h"
#include "VLSIcodec.h"
#include "piano_A4.h"
#include "MI0283QTlib.h"

DigitalOut myled(LED2);
DigitalOut DBG_LED(LED1);
DigitalIn Volume( p30);
DigitalIn Pause( p25);
VS1053Codec codec( p11, p12, p13, p21, p22, p23, p24);

FILE *fp;
SDFileSystem sd(p5, p6, p7, p8, "sd");

GLCD lcd(  p11, p12, p13, p14, p17, p26);

void PlayPiano1( void);
void displayGA( unsigned char *gaval, unsigned char *gapeak, unsigned char bands);

unsigned char volval=0;
Timer t;
Serial pc(USBTX, USBRX);

unsigned char buff[64];

unsigned char gaval[14], gapeak[14];

int main() {

    int cnt;
    
    pc.baud( 115200);
    
    fp = fopen("/sd/mbed.txt", "w");
    if ( fp == NULL) {
        printf("Error opening file\n");
        DBG_LED=1;
        while(1);
    }
    fprintf( fp, "File mbed\n");
    fclose( fp);

    Volume.mode( PullUp);
    Pause.mode( PullUp);
    
   if ( (fp = fopen("/sd/sounds/0001.mp3", "r")) == NULL) {
    DBG_LED=1;
    printf("Errore apertura file MP3\r\n");
    while(1);
   }
    //
    lcd.backlightoff();
    lcd.lcd_init();
    lcd.lcd_clear( LCD_WHITE);
    lcd.backlighton();
   
    //
    codec.init();
    // codec.loadpatch();  
    codec.loadgapatch();  
    codec.setvolume( volval, volval);
    
    printf("Sine Test\r\n");
    codec.sinetest( 0x7d);
    wait( .5);
    codec.sinetest( 0x00);
    
    printf("Riproduzione del file MP3\n\r");

    codec.setbassboost( 15, 150);
    codec.settrebleboost( 7, 15000);
    codec.setvmeter();
    
    //
    unsigned short bands=codec.readgabands();
    printf("GA: Num of bands:%d\r\n", bands);
    
    t.start();
    while( 1) {
        cnt = fread(&buff[0], sizeof(buff[0]), sizeof(buff)/sizeof(buff[0]), fp);
        // loop di riproduzione.
        int iSize=0;
        while( iSize < cnt) {
            int count=32;
            codec.testdreq();
            while( count--) {
                codec.writedata( buff[ iSize++]);
                if ( iSize > cnt)
                    break;
            }
        }    
        // verifico l'esito della lettura. 
        if ( feof( fp)) {
            fclose( fp);
            DBG_LED=1;
            break;
        }
        //
        if ( !Volume) {
            volval++;
            codec.setvolume( volval, volval);
            printf("Set volume %d\n\r", volval);
        }
        //
        if ( !Pause) {
            // volume a zero
            codec.setvolume( 0xFE, 0xFE);
            // Aspetto finché il pulsante è premuto...
            while( !Pause);
            codec.setvolume( volval, volval);
        }
        //
        int tm=t.read_ms();
        //
        if ( tm>=100) {
            t.reset();
            //
            codec.readgavalue( &gaval[0], &gapeak[0]);
            displayGA( &gaval[0], &gapeak[0], bands);
#if 0            
            printf("SValue: ");
            for( int f=0; f<bands; f++) {
                printf("%2d, ",gaval[f]);
            }
#else
            printf("SPeak: ");
            for( int f=0; f<bands; f++) {
                printf("%2d, ",gapeak[f]);
            }
#endif            
            printf("\r\n");
        }
    }
    
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

void PlayPiano1( void)
{
    // piano_note
    int cnt=sizeof(piano_A4)/sizeof(piano_A4[0]);
    printf("Riproduzione file MP3 piano_note [%d]\n\r", cnt);
    //
    int iSize=0;
    while( iSize < cnt) {
        int count=32;
        codec.testdreq();
        while( count--) {
            codec.writedata( piano_A4[ iSize++]);
            if ( iSize > cnt)
                break;
        }
    }
}

#define cBAR_MUL    2                       // moltiplicatore per aumentare il valore max della barra.
#define cBAR_MAX    31                      // massimo valore raggiunto dalla barra, come definito dal VS1053
#define cBAR_W      5                       // spessore barra
#define cBAR_H      (cBAR_MUL*cBAR_MAX)     // altezza della barra
#define cBAR_S      1                       // distanza tra le barre
#define cBAR_X      20                      // coordinata x iniziale
#define cBAR_Y      150                     // coordinata y iniziale  

const unsigned int bandscl[14]={ 0xff0000,0xff9933,0xffff66,0x99cc00,0x00ff00,0x33cc66,0x33ffcc,0x99ffff,0x0033cc,0x6666ff,
                                 0x9933cc,0xccccff,0x0066ff,0x333ff};
                                 
void displayGA( unsigned char *gaval, unsigned char *gapeak, unsigned char bands)
{
 
    lcd.lcd_clear( cBAR_X, cBAR_Y, (cBAR_W+cBAR_S)*bands, cBAR_H, LCD_WHITE);
    
    for ( int i=0; i<bands; i++) {
        //
        // lcd.lcd_clear( cBAR_X+(( cBAR_W+cBAR_S)*i), cBAR_Y, cBAR_W, cBAR_H, LCD_WHITE);
        // lcd.lcd_clear(unsigned int x0, unsigned int y0, unsigned int w, unsigned int h, unsigned int color)
        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]);
    }
}