Library for 3.2'' uLcd Picaso Display4D system Picaso Serial Environment Command Set web: http://www.4dsystems.com.au/product/20/67/Processors_Graphics/PICASO/

Revision:
1:a74e42cf52b2
diff -r 65fd8b1cbf86 -r a74e42cf52b2 Buzzer.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Buzzer.cpp	Sun Apr 05 13:54:48 2015 +0000
@@ -0,0 +1,561 @@
+#include "mbed.h"
+#include "Buzzer.h"
+
+const int tab_A[]= {NOTE_A3,NOTE_A4,NOTE_A5,NOTE_A6,NOTE_A7};
+
+const int tab_AS[]= {NOTE_AS3,NOTE_AS4,NOTE_AS5,NOTE_AS6,NOTE_AS7};
+
+const int tab_B[]= {NOTE_B3,NOTE_B4,NOTE_B5,NOTE_B6,NOTE_B7};
+
+const int tab_BS[]= {NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C6,NOTE_C7};
+
+const int tab_C[]= {NOTE_C3,NOTE_C4,NOTE_C5,NOTE_C6,NOTE_C7};
+
+const int tab_CS[]= {NOTE_CS3,NOTE_CS4,NOTE_CS5,NOTE_CS6,NOTE_CS7};
+
+const int tab_D[]= {NOTE_D3,NOTE_D4,NOTE_D5,NOTE_D6,NOTE_D7};
+
+const int tab_DS[]= {NOTE_DS3,NOTE_DS4,NOTE_DS5,NOTE_DS6,NOTE_DS7};
+
+const int tab_E[]= {NOTE_E3,NOTE_E4,NOTE_E5,NOTE_E6,NOTE_E7};
+
+const int tab_ES[]= {NOTE_F3,NOTE_F4,NOTE_F5,NOTE_F6,NOTE_F7};
+
+const int tab_F[]= {NOTE_F3,NOTE_F4,NOTE_F5,NOTE_F6,NOTE_F7};
+
+const int tab_FS[]= {NOTE_FS3,NOTE_FS4,NOTE_FS5,NOTE_FS6,NOTE_FS7};
+
+const int tab_G[]= {NOTE_G3,NOTE_G4,NOTE_G5,NOTE_G6,NOTE_G7};
+
+const int tab_GS[]= {NOTE_GS3,NOTE_GS4,NOTE_GS5,NOTE_GS6,NOTE_GS7};
+
+#define isDigit(n)   (n>='0' && n <= '9')
+
+//------------------------------
+Note::Note(char _note,bool _isSharp,char _octave,int _duration):
+    myNoteChar(_note),myIsSharp(_isSharp),myOctave(_octave),myDuration(_duration)
+{
+    myPeriod_us=calculatePeriod_us();
+}
+//--------------------------------
+Note::Note(char* str,int _duration):myDuration(_duration)
+{
+    parse(str);
+    myPeriod_us=calculatePeriod_us();
+}
+//--------------------------------
+void Note::parse(const char* _str)
+{
+    int i=0;
+
+    for(i=0; i<3; i++) {
+        switch(_str[i]) {
+                //
+            case 'R':
+                myNoteChar='R';
+                break;
+                
+            case 'r':
+             myNoteChar='R';
+                break;
+            
+                //
+            case 'A':
+                myNoteChar='A';
+                break;
+            case 'a':
+                 myNoteChar='A';
+                break;
+                //
+                //
+            case 'B':
+                myNoteChar='B';
+                break;
+                //
+                case 'b':
+                myNoteChar='B';
+                break;
+                //
+            case 'C':
+                myNoteChar='C';
+                break;
+            case 'c':
+                myNoteChar='C';
+                break;
+                //
+            case 'D':
+                myNoteChar='D';
+                break;
+            case 'd':
+                myNoteChar='D';
+                break;
+                //
+                //
+            case 'E':
+                myNoteChar='E';
+                break;
+                //
+               case 'e':
+               myNoteChar='E';
+                break;
+                //
+            case 'F':
+                myNoteChar='F';
+                break;
+                //
+            case 'f':
+                myNoteChar='F';
+                break;
+                //
+            case 'G':
+                myNoteChar='G';
+                break;
+                //
+                case 'g':
+                 myNoteChar='G';
+                break;
+                //
+            case '%':
+                myIsSharp=false;
+                break;
+                //
+                //
+            case '#':
+                myIsSharp=true;
+                break;
+                //
+                //
+            case '3':
+                myOctave=3;
+                break;
+                //
+                //
+            case '4':
+                myOctave=4;
+                break;
+                //
+                //
+            case '5':
+                myOctave=5;
+                break;
+                //
+                //
+            case '6':
+                myOctave=6;
+                break;
+                //
+                //
+            case '7':
+                myOctave=7;
+                break;
+
+            default:
+                myNoteChar='R';
+                break;
+        }
+        //
+    }
+    //
+
+}
+//--------------------------------
+int Note::calculatePeriod_us(void)
+{
+    switch(myNoteChar) {
+            //
+        case 'p':
+            return NOTE_R;
+            //
+        case 'R':
+            return NOTE_R;
+            //
+        case 'r':
+            return NOTE_R;
+            //
+        case 'A':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_A[myOctave-3];
+                } else {
+                    return tab_AS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'a':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_A[myOctave-3];
+                } else {
+                    return tab_AS[myOctave-3];
+                }
+            }
+            break;
+            //
+        case 'B':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_B[myOctave-3];
+                } else {
+                    return tab_BS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'b':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_B[myOctave-3];
+                } else {
+                    return tab_BS[myOctave-3];
+                }
+            }
+            break;
+            //
+        case 'C':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_C[myOctave-3];
+                } else {
+                    return tab_CS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'c':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_C[myOctave-3];
+                } else {
+                    return tab_CS[myOctave-3];
+                }
+            }
+            break;
+            //
+            //
+        case 'D':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_D[myOctave-3];
+                } else {
+                    return tab_DS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'd':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_D[myOctave-3];
+                } else {
+                    return tab_DS[myOctave-3];
+                }
+            }
+            break;
+            //
+        case 'E':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_E[myOctave-3];
+                } else {
+                    return tab_ES[myOctave-3];
+                }
+            }
+            break;
+            //
+             case 'e':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_E[myOctave-3];
+                } else {
+                    return tab_ES[myOctave-3];
+                }
+            }
+            break;
+            //
+        case 'F':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_F[myOctave-3];
+                } else {
+                    return tab_FS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'f':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_F[myOctave-3];
+                } else {
+                    return tab_FS[myOctave-3];
+                }
+            }
+            break;
+            //
+        case 'G':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_G[myOctave-3];
+                } else {
+                    return tab_GS[myOctave-3];
+                }
+            }
+            break;
+            //
+            case 'g':
+            //
+            if(myOctave >=3 && myOctave <=7) {
+                if(myIsSharp==false) {
+                    return tab_G[myOctave-3];
+                } else {
+                    return tab_GS[myOctave-3];
+                }
+            }
+            break;
+            //
+        default:
+            break;
+    }
+
+    return 0;
+}
+//--------------------------------
+int Note::getNotePeriod_us(void) const
+{
+    return this->myPeriod_us;
+}
+//---------------------------------
+bool Note::getIsSharp(void) const
+{
+    return this->myIsSharp;
+}
+//----------------------------------
+char Note::getNoteChar(void) const
+{
+    return this-> myNoteChar;
+}
+//----------------------------------
+char Note::getOctave(void) const
+{
+    return this->myOctave;  
+}
+//---------------------------------
+int Note::getDuration(void) const
+{
+    return this->myDuration;
+}
+//----------------------------------
+void Note::toString(char* buffer)
+{
+
+    buffer[0]= myNoteChar;
+    if(myIsSharp)
+        buffer[1]='#';
+    else
+        buffer[1]='%';
+
+    buffer[2]=myOctave+'0';
+
+    buffer[3]='\0';
+
+}
+//-----------------------------------
+
+
+Buzzer::Buzzer(PinName _pwmOut):PwmOut(_pwmOut)
+{
+    this->period_us(1);
+    this->pulsewidth_us(0);
+}
+//-----------------------------------
+void Buzzer::tone(const Note* _note)
+{
+    int mperiod = _note->getNotePeriod_us();
+
+    int dure=_note->getDuration();
+
+    this->period_us(mperiod);
+    this->pulsewidth_us(mperiod/2);
+
+    wait_ms(dure);
+    this->pulsewidth_us(0);
+
+
+    wait_ms(dure);
+
+}
+//-------------------------------------
+Buzzer::~Buzzer()
+{
+}
+//--------------------------------------
+Music::Music(const char* p)
+{
+    char defautDuree=4;
+    char defautOctave=6;
+    int bmp=63;
+
+    int ronde=0;
+    int dura=0;
+    int num=0;
+
+    char _note;
+    bool _issharp=false;
+    char _octave=0;
+
+    char newOctave=0;
+//
+    while(*p != ':')
+        p++;           //le titre
+
+    p++;    //skip :
+
+    //defaut duration
+    if(*p=='d') {
+        p++;
+        p++;    //skip d=
+
+
+        while(isDigit(*p)) {
+            num=(num*10)+(*p++-'0');
+        }
+        //
+        if(num >0)
+            defautDuree=num;
+        p++;    //skip ,
+    }
+    //
+    if(*p=='o') {
+        p++;
+        p++;    //skip o=
+
+        num=*p++ -'0';
+
+        if(num >=3 && num <=7)
+            defautOctave=num;
+
+        p++;    //skip ,
+
+    }
+    //
+    if(*p =='b') {
+        p++;
+        p++;    //skip b=
+        num=0;
+
+        while(isDigit(*p)) {
+            num=num*10+(*p++ -'0');
+        }
+        bmp=num;
+        p++;    //skip :
+    }
+    //
+    ronde=(60*500/bmp)*4;      // in ms
+
+    //les notes
+    while(*p) {
+        //ge t duration if available
+        num=0;
+        while(isDigit(*p)) {
+            num=(num*10)+(*p++ -'0');
+        }
+        if(num)
+            dura=ronde/num;
+        else
+            dura=ronde/defautDuree;
+        //la note
+        _note=*p;
+
+        p++;
+        //issharp
+        if(*p=='#') {
+            _issharp=true;
+            p++;
+        } else {
+            _issharp=false;
+
+        }
+        //un point ?
+        if(*p=='.') {
+            dura+=dura/2;
+            p++;
+        }
+        //
+        //nouvelle octave
+        if(isDigit(*p)) {
+            newOctave =*p - '0';
+            p++;
+        }
+
+        if(newOctave >0)
+            _octave=newOctave;
+
+        else {
+            _octave=defautOctave;
+        }
+
+        //
+        if(*p==',')
+        {
+        p++;
+         myTabNotes.push_back(new Note(_note,_issharp,_octave,dura));
+        }
+       
+        
+        
+
+    }   
+}
+//--------------------------------------
+int Music::getNumbersNotes(void) const
+{
+    return this->myTabNotes.size();
+}
+
+//--------------------------------------
+void  Music::play(Buzzer* _buzzer)
+{
+    /*
+        char buffer[10];
+        int duration=0;
+
+        for(int i=0; i< myTabNotes.size(); i++) {
+            myTabNotes[i]->toString(buffer);
+            duration=myTabNotes[i]->getDuration();
+
+            pc.printf(" %s:%d \n\r",buffer,duration);
+        }
+     */
+
+    for(int i=0; i< myTabNotes.size(); i++) {
+        _buzzer->tone(myTabNotes[i]);
+    }
+
+
+}
+//--------------------------------------
+Music::~Music()
+{
+    for(int i=0; i< myTabNotes.size(); i++) {
+        delete(myTabNotes[i]);
+        myTabNotes[i]=0;
+    }
+}
+//--------------------------------------
+
+
+