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) { } }
MusicEngine.h@2:4f7c4255997a, 2015-02-06 (annotated)
- 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?
User | Revision | Line number | New 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__ |