Jurica Resetar / Mbed 2 deprecated beep

Dependencies:   aconno_bsp mbed

Dependents:   acd52832_beep_buzzer

Fork of beep by Peter Drescher

Files at this revision

API Documentation at this revision

Comitter:
jurica238814
Date:
Thu Sep 22 18:11:47 2016 +0000
Parent:
4:d8e14429a95f
Commit message:
Beep RTTL done =)

Changed in this revision

aconno_bsp.lib Show annotated file Show diff for this revision Revisions of this file
beep.cpp Show annotated file Show diff for this revision Revisions of this file
beep.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aconno_bsp.lib	Thu Sep 22 18:11:47 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/jurica238814/code/aconno_bsp/#6d9c6c231034
--- a/beep.cpp	Tue Sep 11 08:21:45 2012 +0000
+++ b/beep.cpp	Thu Sep 22 18:11:47 2016 +0000
@@ -1,5 +1,6 @@
 #include "beep.h"
 #include "mbed.h"
+#include "notes.h"
 
 /** class to make sound with a buzzer, based on a PwmOut
  *   The class use a timeout to switch off the sound  - it is not blocking while making noise
@@ -20,6 +21,14 @@
  * @endcode
  */
 
+int notes[] = { 0,
+NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
+NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
+NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
+NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
+};
+
+
 using namespace mbed;
  // constructor
  /** Create a Beep object connected to the specified PwmOut pin
@@ -52,5 +61,151 @@
 }
 
 
+void Beep::playRttl(char *p){
+  char default_dur = 4;
+  char default_oct = 6;
+  int bpm = 63;
+  int num;
+  long wholenote;
+  long duration;
+  char note;
+  char scale;
+
+  // format: d=N,o=N,b=NNN:
+  // find the start (skip name, etc)
+
+  while(*p != ':') p++;    // ignore name
+  p++;                     // skip ':'
+
+  // get default duration
+  if(*p == 'd')
+  {
+    p++; p++;              // skip "d="
+    num = 0;
+    while(isdigit(*p))
+    {
+      num = (num * 10) + (*p++ - '0');
+    }
+    if(num > 0) default_dur = num;
+    p++;                   // skip comma
+  }
+
+
+  // get default octave
+  if(*p == 'o')
+  {
+    p++; p++;              // skip "o="
+    num = *p++ - '0';
+    if(num >= 3 && num <=7) default_oct = num;
+    p++;                   // skip comma
+  }
+
+
+  // get BPM
+  if(*p == 'b')
+  {
+    p++; p++;              // skip "b="
+    num = 0;
+    while(isdigit(*p))
+    {
+      num = (num * 10) + (*p++ - '0');
+    }
+    bpm = num;
+    p++;                   // skip colon
+  }
+
+
+  // BPM usually expresses the number of quarter notes per minute
+  wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in seconds)
+    
 
 
+  // now begin note loop
+  while(*p)
+  {
+    // first, get note duration, if available
+    num = 0;
+    while(isdigit(*p))
+    {
+      num = (num * 10) + (*p++ - '0');
+    }
+    
+    if(num) duration = wholenote / num;
+    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after
+
+    // now get the note
+    note = 0;
+
+    switch(*p)
+    {
+      case 'c':
+        note = 1;
+        break;
+      case 'd':
+        note = 3;
+        break;
+      case 'e':
+        note = 5;
+        break;
+      case 'f':
+        note = 6;
+        break;
+      case 'g':
+        note = 8;
+        break;
+      case 'a':
+        note = 10;
+        break;
+      case 'b':
+        note = 12;
+        break;
+      case 'p':
+      default:
+        note = 0;
+    }
+    p++;
+
+    // now, get optional '#' sharp
+    if(*p == '#')
+    {
+      note++;
+      p++;
+    }
+
+    // now, get optional '.' dotted note
+    if(*p == '.')
+    {
+      duration += duration/2;
+      p++;
+    }
+  
+    // now, get scale
+    if(isdigit(*p))
+    {
+      scale = *p - '0';
+      p++;
+    }
+    else
+    {
+      scale = default_oct;
+    }
+
+    scale += OCTAVE_OFFSET;
+
+    if(*p == ',')
+      p++;       // skip comma for next note (or we may be at the end)
+
+    // now play the note
+
+    if(note)
+    {
+      beep(notes[(scale - 4) * 12 + note], (float)duration/1000);
+      wait((float)duration/1000);
+    }
+    else
+    {
+      //wait((float)duration/1000);
+    }
+  }
+}
+
--- a/beep.h	Tue Sep 11 08:21:45 2012 +0000
+++ b/beep.h	Thu Sep 22 18:11:47 2016 +0000
@@ -3,6 +3,9 @@
 
 #include "mbed.h"
 
+#define isdigit(n) (n >= '0' && n <= '9')
+#define OCTAVE_OFFSET 0
+
 /** class to make sound with a buzzer, based on a PwmOut
  *   The class use a timeout to switch off the sound  - it is not blocking while making noise
  *
@@ -44,6 +47,7 @@
  * @param time - the duration of the tone in seconds
  */
     void beep (float frequency, float time);
+    void playRttl(char *p);
 
 /** stop the beep instantaneous 
  * usually not used 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Sep 22 18:11:47 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/abea610beb85
\ No newline at end of file