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@0:d873d5d62d3b, 2015-02-05 (annotated)
- Committer:
- taylorza
- Date:
- Thu Feb 05 04:18:39 2015 +0000
- Revision:
- 0:d873d5d62d3b
- Child:
- 1:7eb27d971c01
Music Engine Library initial commit
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 | 0:d873d5d62d3b | 9 | class MusicEngine |
taylorza | 0:d873d5d62d3b | 10 | { |
taylorza | 0:d873d5d62d3b | 11 | public: |
taylorza | 0:d873d5d62d3b | 12 | MusicEngine(PinName pin); |
taylorza | 0:d873d5d62d3b | 13 | |
taylorza | 0:d873d5d62d3b | 14 | void play(char *mml); |
taylorza | 0:d873d5d62d3b | 15 | void stop(); |
taylorza | 0:d873d5d62d3b | 16 | |
taylorza | 0:d873d5d62d3b | 17 | bool getIsPlaying() { return _isPlaying; } |
taylorza | 0:d873d5d62d3b | 18 | |
taylorza | 0:d873d5d62d3b | 19 | void setCompletionCallback(void (*function)(void)) |
taylorza | 0:d873d5d62d3b | 20 | { |
taylorza | 0:d873d5d62d3b | 21 | _completionCallback.attach(function); |
taylorza | 0:d873d5d62d3b | 22 | } |
taylorza | 0:d873d5d62d3b | 23 | |
taylorza | 0:d873d5d62d3b | 24 | template<typename T> |
taylorza | 0:d873d5d62d3b | 25 | void setCompletionCallback(T *object, void (T::*member)(void)) |
taylorza | 0:d873d5d62d3b | 26 | { |
taylorza | 0:d873d5d62d3b | 27 | _completionCallback.attach(object, member); |
taylorza | 0:d873d5d62d3b | 28 | } |
taylorza | 0:d873d5d62d3b | 29 | |
taylorza | 0:d873d5d62d3b | 30 | private: |
taylorza | 0:d873d5d62d3b | 31 | void executeCommand(); |
taylorza | 0:d873d5d62d3b | 32 | void skipWhiteSpace(); |
taylorza | 0:d873d5d62d3b | 33 | char getChar(); |
taylorza | 0:d873d5d62d3b | 34 | char peekChar(); |
taylorza | 0:d873d5d62d3b | 35 | void rewind(); |
taylorza | 0:d873d5d62d3b | 36 | int getNumber(int min, int max); |
taylorza | 0:d873d5d62d3b | 37 | |
taylorza | 0:d873d5d62d3b | 38 | private: |
taylorza | 0:d873d5d62d3b | 39 | PwmOut _pwm; |
taylorza | 0:d873d5d62d3b | 40 | bool _isPlaying; |
taylorza | 0:d873d5d62d3b | 41 | char *_mml; |
taylorza | 0:d873d5d62d3b | 42 | int _mmlIndex; |
taylorza | 0:d873d5d62d3b | 43 | int _octave; |
taylorza | 0:d873d5d62d3b | 44 | float _duration; |
taylorza | 0:d873d5d62d3b | 45 | float _durationRatio; |
taylorza | 0:d873d5d62d3b | 46 | float _pause; |
taylorza | 0:d873d5d62d3b | 47 | int _tempo; |
taylorza | 0:d873d5d62d3b | 48 | Timeout _scheduler; |
taylorza | 0:d873d5d62d3b | 49 | |
taylorza | 0:d873d5d62d3b | 50 | FunctionPointer _completionCallback; |
taylorza | 0:d873d5d62d3b | 51 | |
taylorza | 0:d873d5d62d3b | 52 | static const float PERIOD_TABLE[]; |
taylorza | 0:d873d5d62d3b | 53 | |
taylorza | 0:d873d5d62d3b | 54 | static const float WHOLE_NOTE_DURATION; |
taylorza | 0:d873d5d62d3b | 55 | static const float QUARTER_NOTE_DURATION; |
taylorza | 0:d873d5d62d3b | 56 | static const float QUARTER_NOTES_PER_MINUTE; |
taylorza | 0:d873d5d62d3b | 57 | |
taylorza | 0:d873d5d62d3b | 58 | static const float DEFAULT_TIMING; |
taylorza | 0:d873d5d62d3b | 59 | static const float LEGATO_TIMING; |
taylorza | 0:d873d5d62d3b | 60 | static const float STACCATO_TIMING; |
taylorza | 0:d873d5d62d3b | 61 | |
taylorza | 0:d873d5d62d3b | 62 | static const int NOTE_REST; |
taylorza | 0:d873d5d62d3b | 63 | static const int NOTE_C; |
taylorza | 0:d873d5d62d3b | 64 | static const int NOTE_CS; |
taylorza | 0:d873d5d62d3b | 65 | static const int NOTE_D; |
taylorza | 0:d873d5d62d3b | 66 | static const int NOTE_DS; |
taylorza | 0:d873d5d62d3b | 67 | static const int NOTE_E; |
taylorza | 0:d873d5d62d3b | 68 | static const int NOTE_F; |
taylorza | 0:d873d5d62d3b | 69 | static const int NOTE_FS; |
taylorza | 0:d873d5d62d3b | 70 | static const int NOTE_G; |
taylorza | 0:d873d5d62d3b | 71 | static const int NOTE_GS; |
taylorza | 0:d873d5d62d3b | 72 | static const int NOTE_A; |
taylorza | 0:d873d5d62d3b | 73 | static const int NOTE_AS; |
taylorza | 0:d873d5d62d3b | 74 | static const int NOTE_B; |
taylorza | 0:d873d5d62d3b | 75 | }; |
taylorza | 0:d873d5d62d3b | 76 | #endif //__MUSICENGINE_H__ |