Music Engine plays Music Macro Language compositions in the background

Dependents:   RETRO_BallsAndPaddle RETRO_BallAndHoles MusicBoxForFathersDay USBSec_mbed-os_dev

Music Engine is a simply library to execute Music Macro Language sequences asynchronously. Learn more about MML on wikipedia http://en.wikipedia.org/wiki/Music_Macro_Language

The following sample plays a simple tune

#include "mbed.h"
#include "MusicEngine.h"

// Play music on MCU Pin 0.18
// The pin should support PWM
MusicEngine music(P0_18);

main()
{
    music.play("T224L8O5CL16>C<P16GP16L8EL16P16>C<GP16L8E.L16P16L8C#L16>C#<P16G#P16L8FL16P16>C#<G#P16L8F.L16P16L8CL16>C<P16GP16L8EL16P16>C<GP16L8E.L16P16D#EFP16FF#GP16GG#AP16L8>C<P8L4>C");
    
    while(1)
    {
    }
}
Committer:
taylorza
Date:
Fri Feb 06 01:37:07 2015 +0000
Revision:
2:4f7c4255997a
Parent:
1:7eb27d971c01
Implemented suggestion by maxint to improve the silencing of the PWM signal.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taylorza 0:d873d5d62d3b 1 ///////////////////////////////////////////////////////////////////////////////
taylorza 0:d873d5d62d3b 2 // Retro Music Engine
taylorza 0:d873d5d62d3b 3 // Author: Chris Taylor (taylorza)
taylorza 0:d873d5d62d3b 4
taylorza 0:d873d5d62d3b 5 #include "mbed.h"
taylorza 0:d873d5d62d3b 6
taylorza 0:d873d5d62d3b 7 #ifndef __MUSICENGINE_H__
taylorza 0:d873d5d62d3b 8 #define __MUSICENGINE_H__
taylorza 1:7eb27d971c01 9
taylorza 1:7eb27d971c01 10 /** MusicEngine provides a means to play Music Macro Language sequences asynchronously.
taylorza 1:7eb27d971c01 11 * Learn more about Music Macro Language (MML) on wikipedia
taylorza 1:7eb27d971c01 12 * http://en.wikipedia.org/wiki/Music_Macro_Language
taylorza 1:7eb27d971c01 13 */
taylorza 0:d873d5d62d3b 14 class MusicEngine
taylorza 0:d873d5d62d3b 15 {
taylorza 0:d873d5d62d3b 16 public:
taylorza 1:7eb27d971c01 17 /** Creates an instance of the MusicEngine
taylorza 1:7eb27d971c01 18 * @param pin pin used to generate the note frequencies
taylorza 1:7eb27d971c01 19 */
taylorza 0:d873d5d62d3b 20 MusicEngine(PinName pin);
taylorza 0:d873d5d62d3b 21
taylorza 1:7eb27d971c01 22 /** Starts playing a new MML sequence. If one is already playing it is stopped and the new sequences started.
taylorza 1:7eb27d971c01 23 * @param mml string of MML commands to be played
taylorza 1:7eb27d971c01 24 */
taylorza 0:d873d5d62d3b 25 void play(char *mml);
taylorza 1:7eb27d971c01 26
taylorza 1:7eb27d971c01 27 /** Stop a currently playing sequence */
taylorza 0:d873d5d62d3b 28 void stop();
taylorza 1:7eb27d971c01 29
taylorza 1:7eb27d971c01 30 /** Query the engine to determine if a MML sequence is currently being played. */
taylorza 0:d873d5d62d3b 31 bool getIsPlaying() { return _isPlaying; }
taylorza 0:d873d5d62d3b 32
taylorza 1:7eb27d971c01 33 /** Setup a callback function that will be executed when the music sequence ends. */
taylorza 0:d873d5d62d3b 34 void setCompletionCallback(void (*function)(void))
taylorza 0:d873d5d62d3b 35 {
taylorza 0:d873d5d62d3b 36 _completionCallback.attach(function);
taylorza 0:d873d5d62d3b 37 }
taylorza 0:d873d5d62d3b 38
taylorza 1:7eb27d971c01 39 /** Setup a callback function that will be executed when the music sequence ends.
taylorza 1:7eb27d971c01 40 * @note This override is used if the callback is a class member
taylorza 1:7eb27d971c01 41 */
taylorza 0:d873d5d62d3b 42 template<typename T>
taylorza 0:d873d5d62d3b 43 void setCompletionCallback(T *object, void (T::*member)(void))
taylorza 0:d873d5d62d3b 44 {
taylorza 0:d873d5d62d3b 45 _completionCallback.attach(object, member);
taylorza 0:d873d5d62d3b 46 }
taylorza 0:d873d5d62d3b 47
taylorza 0:d873d5d62d3b 48 private:
taylorza 0:d873d5d62d3b 49 void executeCommand();
taylorza 0:d873d5d62d3b 50 void skipWhiteSpace();
taylorza 0:d873d5d62d3b 51 char getChar();
taylorza 0:d873d5d62d3b 52 char peekChar();
taylorza 0:d873d5d62d3b 53 void rewind();
taylorza 0:d873d5d62d3b 54 int getNumber(int min, int max);
taylorza 0:d873d5d62d3b 55
taylorza 0:d873d5d62d3b 56 private:
taylorza 0:d873d5d62d3b 57 PwmOut _pwm;
taylorza 0:d873d5d62d3b 58 bool _isPlaying;
taylorza 0:d873d5d62d3b 59 char *_mml;
taylorza 0:d873d5d62d3b 60 int _mmlIndex;
taylorza 0:d873d5d62d3b 61 int _octave;
taylorza 0:d873d5d62d3b 62 float _duration;
taylorza 0:d873d5d62d3b 63 float _durationRatio;
taylorza 0:d873d5d62d3b 64 float _pause;
taylorza 0:d873d5d62d3b 65 int _tempo;
taylorza 0:d873d5d62d3b 66 Timeout _scheduler;
taylorza 0:d873d5d62d3b 67
taylorza 0:d873d5d62d3b 68 FunctionPointer _completionCallback;
taylorza 0:d873d5d62d3b 69
taylorza 0:d873d5d62d3b 70 static const float PERIOD_TABLE[];
taylorza 0:d873d5d62d3b 71
taylorza 0:d873d5d62d3b 72 static const float WHOLE_NOTE_DURATION;
taylorza 0:d873d5d62d3b 73 static const float QUARTER_NOTE_DURATION;
taylorza 0:d873d5d62d3b 74 static const float QUARTER_NOTES_PER_MINUTE;
taylorza 0:d873d5d62d3b 75
taylorza 0:d873d5d62d3b 76 static const float DEFAULT_TIMING;
taylorza 0:d873d5d62d3b 77 static const float LEGATO_TIMING;
taylorza 0:d873d5d62d3b 78 static const float STACCATO_TIMING;
taylorza 0:d873d5d62d3b 79
taylorza 0:d873d5d62d3b 80 static const int NOTE_REST;
taylorza 0:d873d5d62d3b 81 static const int NOTE_C;
taylorza 0:d873d5d62d3b 82 static const int NOTE_CS;
taylorza 0:d873d5d62d3b 83 static const int NOTE_D;
taylorza 0:d873d5d62d3b 84 static const int NOTE_DS;
taylorza 0:d873d5d62d3b 85 static const int NOTE_E;
taylorza 0:d873d5d62d3b 86 static const int NOTE_F;
taylorza 0:d873d5d62d3b 87 static const int NOTE_FS;
taylorza 0:d873d5d62d3b 88 static const int NOTE_G;
taylorza 0:d873d5d62d3b 89 static const int NOTE_GS;
taylorza 0:d873d5d62d3b 90 static const int NOTE_A;
taylorza 0:d873d5d62d3b 91 static const int NOTE_AS;
taylorza 0:d873d5d62d3b 92 static const int NOTE_B;
taylorza 0:d873d5d62d3b 93 };
taylorza 0:d873d5d62d3b 94 #endif //__MUSICENGINE_H__