Advertisement
dustinrobotics

RTTTL Example 5-1-2012

Apr 28th, 2012
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.74 KB | None | 0 0
  1. // Sketch to demonstrate the usage of the play_music function, which plays RTTTL ringtones
  2. // which have been saved into flash, rather than SRAM.
  3. // This is based on the good work that Brett Hagman has done at www.roguerobotics.com
  4. //
  5. // I made the following modifications to it:
  6. //   -Moved everything to be stored in FLASH, rather than RAM
  7. //   -Rewrote play_music to be state based.
  8. //   -Added more songs, put everything into a nice table :)
  9. //
  10. // 5-1-2012
  11. // Dustin Reynolds
  12. // MechaRobotics.Wordpress.com
  13.  
  14. //Circuit: TONE_PIN connected to 100 ohm resistor, which is connected to + term of piezo,
  15. // other conn of piezo to gnd.
  16.  
  17. //#define MUSIC_DEBUG
  18. #define TONE_PIN                5
  19. #define OCTAVE_OFFSET           0
  20.  
  21. #define NOTE_C4  262
  22. #define NOTE_CS4 277
  23. #define NOTE_D4  294
  24. #define NOTE_DS4 311
  25. #define NOTE_E4  330
  26. #define NOTE_F4  349
  27. #define NOTE_FS4 370
  28. #define NOTE_G4  392
  29. #define NOTE_GS4 415
  30. #define NOTE_A4  440
  31. #define NOTE_AS4 466
  32. #define NOTE_B4  494
  33. #define NOTE_C5  523
  34. #define NOTE_CS5 554
  35. #define NOTE_D5  587
  36. #define NOTE_DS5 622
  37. #define NOTE_E5  659
  38. #define NOTE_F5  698
  39. #define NOTE_FS5 740
  40. #define NOTE_G5  784
  41. #define NOTE_GS5 831
  42. #define NOTE_A5  880
  43. #define NOTE_AS5 932
  44. #define NOTE_B5  988
  45. #define NOTE_C6  1047
  46. #define NOTE_CS6 1109
  47. #define NOTE_D6  1175
  48. #define NOTE_DS6 1245
  49. #define NOTE_E6  1319
  50. #define NOTE_F6  1397
  51. #define NOTE_FS6 1480
  52. #define NOTE_G6  1568
  53. #define NOTE_GS6 1661
  54. #define NOTE_A6  1760
  55. #define NOTE_AS6 1865
  56. #define NOTE_B6  1976
  57. #define NOTE_C7  2093
  58. #define NOTE_CS7 2217
  59. #define NOTE_D7  2349
  60. #define NOTE_DS7 2489
  61. #define NOTE_E7  2637
  62. #define NOTE_F7  2794
  63. #define NOTE_FS7 2960
  64. #define NOTE_G7  3136
  65. #define NOTE_GS7 3322
  66. #define NOTE_A7  3520
  67. #define NOTE_AS7 3729
  68. #define NOTE_B7  3951
  69.  
  70. int notes[] = { 0,
  71. NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
  72. NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
  73. NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
  74. NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
  75. };
  76.  
  77. const prog_char PROGMEM MusicSongPlay1[] = "The Simpsons:d=4,o=5,b=160:c.6,e6,f#6,8a6,g.6,e6,c6,8a,8f#,8f#,8f#,2g,8p,8p,8f#,8f#,8f#,8g,a#.,8c6,8c6,8c6,c6";
  78. const prog_char PROGMEM MusicSongPlay2[] = "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6";
  79. const prog_char PROGMEM MusicSongPlay3[] = "Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6";
  80. const prog_char PROGMEM MusicSongPlay4[] = "Looney:d=4,o=5,b=140:32p,c6,8f6,8e6,8d6,8c6,a.,8c6,8f6,8e6,8d6,8d#6,e.6,8e6,8e6,8c6,8d6,8c6,8e6,8c6,8d6,8a,8c6,8g,8a#,8a,8f";
  81. const prog_char PROGMEM MusicSongPlay5[] = "Bond:d=4,o=5,b=80:32p,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d#6,16d#6,16c#6,32d#6,32d#6,16d#6,8d#6,16c#6,16c#6,16c#6,16c#6,32e6,32e6,16e6,8e6,16d#6,16d6,16c#6,16c#7,c.7,16g#6,16f#6,g#.6";
  82. const prog_char PROGMEM MusicSongPlay6[] = "MASH:d=8,o=5,b=140:4a,4g,f#,g,p,f#,p,g,p,f#,p,2e.,p,f#,e,4f#,e,f#,p,e,p,4d.,p,f#,4e,d,e,p,d,p,e,p,d,p,2c#.,p,d,c#,4d,c#,d,p,e,p,4f#,p,a,p,4b,a,b,p,a,p,b,p,2a.,4p,a,b,a,4b,a,b,p,2a.,a,4f#,a,b,p,d6,p,4e.6,d6,b,p,a,p,2b";
  83. const prog_char PROGMEM MusicSongPlay7[] = "StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6";
  84. const prog_char PROGMEM MusicSongPlay8[] = "GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#";
  85. const prog_char PROGMEM MusicSongPlay9[] = "A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#";
  86. const prog_char PROGMEM MusicSongPlay10[] = "Flinstones:d=4,o=5,b=40:32p,16f6,16a#,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,d6,16f6,16a#.,16a#6,32g6,16f6,16a#.,32f6,32f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,a#,16a6,16d.6,16a#6,32a6,32a6,32g6,32f#6,32a6,8g6,16g6,16c.6,32a6,32a6,32g6,32g6,32f6,32e6,32g6,8f6,16f6,16a#.,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#6,16c7,8a#.6";
  87. const prog_char PROGMEM MusicSongPlay11[] = "Jeopardy:d=4,o=6,b=125:c,f,c,f5,c,f,2c,c,f,c,f,a.,8g,8f,8e,8d,8c#,c,f,c,f5,c,f,2c,f.,8d,c,a#5,a5,g5,f5,p,d#,g#,d#,g#5,d#,g#,2d#,d#,g#,d#,g#,c.7,8a#,8g#,8g,8f,8e,d#,g#,d#,g#5,d#,g#,2d#,g#.,8f,d#,c#,c,p,a#5,p,g#.5,d#,g#";
  88. const prog_char PROGMEM MusicSongPlay12[] = "MahnaMahna:d=16,o=6,b=125:c#,c.,b5,8a#.5,8f.,4g#,a#,g.,4d#,8p,c#,c.,b5,8a#.5,8f.,g#.,8a#.,4g,8p,c#,c.,b5,8a#.5,8f.,4g#,f,g.,8d#.,f,g.,8d#.,f,8g,8d#.,f,8g,d#,8c,a#5,8d#.,8d#.,4d#,8d#.";
  89. const prog_char PROGMEM MusicSongPlay13[] = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d";
  90. const prog_char PROGMEM MusicSongPlay14[] = "KnightRider:d=4,o=5,b=125:16e,16p,16f,16e,16e,16p,16e,16e,16f,16e,16e,16e,16d#,16e,16e,16e,16e,16p,16f,16e,16e,16p,16f,16e,16f,16e,16e,16e,16d#,16e,16e,16e,16d,16p,16e,16d,16d,16p,16e,16d,16e,16d,16d,16d,16c,16d,16d,16d,16d,16p,16e,16d,16d,16p,16e,16d,16e,16d,16d,16d,16c,16d,16d,16d";
  91. const prog_char PROGMEM MusicSongPlay15[] = "MacGyver:d=4,o=6,b=127:8c,8c,8c,8c,8c,8c,2b5,8f_5,8a5,8p,2g5,8c,8c,8p,b5,8a5,8b5,8a5,8g5,8p,e,a.5,16p,b.5,16p,c,8b5,8a5,c";
  92. const prog_char PROGMEM MusicSongPlay16[] = "smb:d=4,o=5,b=100:16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6";
  93. const prog_char PROGMEM MusicSongPlay17[] = "SMBUndergr:d=16,o=6,b=100:c,c5,a5,a,a#5,a#,2p,8p,c,c5,a5,a,a#5,a#,2p,8p,f5,f,d5,d,d#5,d#,2p,8p,f5,f,d5,d,d#5,d#,2p,32d#,d,32c#,c,p,d#,p,d,p,g#5,p,g5,p,c#,p,32c,f#,32f,32e,a#,32a,g#,32p,d#,b5,32p,a#5,32p,a5,g#5";
  94. const prog_char PROGMEM MusicSongPlay18[] = "SMBWater:d=8,o=6,b=225:4d5,4e5,4f#5,4g5,4a5,4a#5,b5,b5,b5,p,b5,p,2b5,p,g5,2e.,2d#.,2e.,p,g5,a5,b5,c,d,2e.,2d#,4f,2e.,2p,p,g5,2d.,2c#.,2d.,p,g5,a5,b5,c,c#,2d.,2g5,4f,2e.,2p,p,g5,2g.,2g.,2g.,4g,4a,p,g,2f.,2f.,2f.,4f,4g,p,f,2e.,4a5,4b5,4f,e,e,4e.,b5,2c.";
  95. const prog_char PROGMEM MusicSongPlay19[] = "smbdeath:d=4,o=5,b=90:32c6,32c6,32c6,8p,16b,16f6,16p,16f6,16f.6,16e.6,16d6,16c6,16p,16e,16p,16c";
  96. const prog_char PROGMEM MusicSongPlay20[] = "HarryPotter:d=8,o=6,b=100:b5,e.,16g,f#,4e,b,4a.,4f#.,e.,16g,f#,4d,f,2b5,p,b5,e,16g,f#,4e,b,4d7,c#7,4c7,g#,c.7,16b,a#,4a#5,g,2e";
  97. const prog_char PROGMEM MusicSongPlay21[] = "TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5";
  98. const prog_char PROGMEM MusicSongPlay22[] = "Muppets:d=4,o=5,b=250:c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,8a,8p,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,8e,8p,8e,g,2p,c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,a,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,d,8d,c";
  99. const prog_char PROGMEM MusicSongPlay23[] = "Xfiles:d=4,o=5,b=125:e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,g6,f#6,e6,d6,e6,2b.,1p,g6,f#6,e6,d6,f#6,2b.,1p,e,b,a,b,d6,2b.,1p,e,b,a,b,e6,2b.,1p,e6,2b.";
  100. const prog_char PROGMEM MusicSongPlay24[] = "20thCenFox:d=16,o=5,b=140:b,8p,b,b,2b,p,c6,32p,b,32p,c6,32p,b,32p,c6,32p,b,8p,b,b,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,b,32p,g#,32p,a,32p,b,8p,b,b,2b,4p,8e,8g#,8b,1c#6,8f#,8a,8c#6,1e6,8a,8c#6,8e6,1e6,8b,8g#,8a,2b";
  101. const prog_char PROGMEM MusicSongPlay25[] = "Gadget:d=16,o=5,b=50:32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,32d#,32f,32f#,32g#,a#,d#6,4d6,32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,8d#";
  102. const prog_char PROGMEM MusicSongPlay26[] = "Smurfs:d=32,o=5,b=200:4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8f#,p,8a#,p,4g#,4p,g#,p,a#,p,b,p,c6,p,4c#6,16p,4f#6,p,16c#6,p,8d#6,p,8b,p,4g#,16p,4c#6,p,16a#,p,8b,p,8f,p,4f#";
  103. const prog_char PROGMEM MusicSongPlay27[] = "LeisureSuit:d=16,o=6,b=56:f.5,f#.5,g.5,g#5,32a#5,f5,g#.5,a#.5,32f5,g#5,32a#5,g#5,8c#.,a#5,32c#,a5,a#.5,c#.,32a5,a#5,32c#,d#,8e,c#.,f.,f.,f.,f.,f,32e,d#,8d,a#.5,e,32f,e,32f,c#,d#.,c#";
  104. const prog_char PROGMEM MusicSongPlay28[] = "City Of Angels Theme:d=4,o=5,b=80:32f#6,16f#6,32p,d6,32p,16a,32p,32a,32p,8a6,32p,16a6,32p,32a6,8p,32g6,16p,32f#6,16f#6,8p,32g6,16p,32f#6,16f#6,32p,8d6,32p,32d6,32p,32e6,32p,8f#6,32p,16e6,32p,32d6,32p,8e6,32p,16f#6,32p,16d6,32p,2d6,16p,16a,32p,16a6,32p,16a6";
  105. //christmas
  106. const prog_char PROGMEM MusicSongPlay29[] = "LetItSnow:d=8,o=5,b=125:c,c,c6,c6,4a#,4a,4g,4f,2c,c,c,4g.,f,4g.,f,4e,2c,4d,d6,d6,4c6,4a#,4a,2g.,e.6,16d6,4c6,c.6,16a#,4a,a#.,16a,2f.";
  107. const prog_char PROGMEM MusicSongPlay30[] = "WeWishYou:d=4,o=5,b=200:d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,2g,d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,1g,d,g,g,g,2f#,f#,g,f#,e,2d,a,b,8a,8a,8g,8g,d6,d,d,e,a,f#,2g";
  108. const prog_char PROGMEM MusicSongPlay31[] = "CarolBells:d=8,o=5,b=180:4a,g#,a,4f#,4a,g#,a,4f#,4f#6,f#6,f#6,e6,d6,4c#6,c#6,c#6,b,a,4b,b,b,c#6,b,4f#,f#,f#,4f#,c#,d#,e,f#,g#,a,b,c#6,4b,4a,c#,d#,e,f#,g#,a,b,c#6,4b,4a,4a,g#,a,4f#,4a,g#,a,4f#";
  109. const prog_char PROGMEM MusicSongPlay32[] = "Greensleeves:d=4,o=5,b=140:32p,g,2a#,c6,d.6,8d#6,d6,2c6,a,f.,8g,a,2a#,g,g.,8f,g,2a,f,2d,g,2a#,c6,d.6,8e6,d6,2c6,a,f.,8g,a,a#.,8a,g,f#.,8e,f#,2g";
  110. const prog_char PROGMEM MusicSongPlay33[] = "JoyWorld:d=4,o=5,b=112:d6,8c#.6,16b,a.,8g,f#,e,d,8p,8a,b,8p,8b,c#6,8p,8c#6,2d.6,8p,8d6,8d6,8c#6,8b,8a,8a.,16g,8f#,8d6,8d6,8c#6,8b,8a,8a.,16g,8f#,8f#,8f#,8f#,8f#,16f#,16g,a.,16g,16f#,8e,8e,8e,16e,16f#,g,8p,16f#,16e,8d,8d6,8p,8b,8a.,16g,8f#,8g,f#,e,2d";
  111. const prog_char PROGMEM MusicSongPlay34[] = "Rudolph:d=16,o=6,b=100:32p,g#5,8a#5,g#5,8f5,8c#,8a#5,4g#.5,g#5,a#5,g#5,a#5,8g#5,8c#,2c,f#5,8g#5,f#5,8d#5,8c,8a#5,4g#.5,g#5,a#5,g#5,a#5,8g#5,8a#5,2f5,g#5,8a#5,a#5,8f5,8c#,8a#5,4g#.5,g#5,a#5,g#5,a#5,8g#5,8c#,2c,f#5,8g#5,f#5,8d#5,8c,8a#5,4g#.5,g#5,a#5,g#5,a#5,8g#5,8d#,2c#";
  112. const prog_char PROGMEM MusicSongPlay35[] = "feliz:d=8,o=5,b=140:a,4d6,c#6,d6,2b.,4p,b,4e6,d6,b,2a.,4p,a,4d6,c#6,d6,4b.,g,4b,4b,a,a,b,a,4g,g,1f#";
  113.  
  114. PGM_P PROGMEM MusicSongPlayTable[] = {
  115. MusicSongPlay1,
  116. MusicSongPlay2,
  117. MusicSongPlay3,
  118. MusicSongPlay4,
  119. MusicSongPlay5,
  120. MusicSongPlay6,
  121. MusicSongPlay7,
  122. MusicSongPlay8,
  123. MusicSongPlay9,
  124. MusicSongPlay10,
  125. MusicSongPlay11,
  126. MusicSongPlay12,
  127. MusicSongPlay13,
  128. MusicSongPlay14,
  129. MusicSongPlay15,
  130. MusicSongPlay16,
  131. MusicSongPlay17,
  132. MusicSongPlay18,
  133. MusicSongPlay19,
  134. MusicSongPlay20,
  135. MusicSongPlay21,
  136. MusicSongPlay22,
  137. MusicSongPlay23,
  138. MusicSongPlay24,
  139. MusicSongPlay25,
  140. MusicSongPlay26,
  141. MusicSongPlay27,
  142. MusicSongPlay28,
  143. MusicSongPlay29,
  144. MusicSongPlay30,
  145. MusicSongPlay31,
  146. MusicSongPlay32,
  147. MusicSongPlay33,
  148. MusicSongPlay34,
  149. MusicSongPlay35
  150. };
  151.  
  152. void play_music(const char * song)
  153. {
  154.   uint8_t  _default_dur;
  155.   uint8_t  _default_oct;
  156.   uint32_t _wholenote;
  157.   uint32_t _duration;
  158.   uint16_t _bpm;
  159.   char * _songptr;
  160.   char buffer1[1];
  161.   int num;
  162.   int offset=0;
  163.   //int begoffset=0;
  164.   byte state = 0;
  165.   byte note = 0;
  166.   byte scale = 0;
  167.  
  168.   while(1)
  169.   {
  170.     _songptr = strncpy_P(buffer1,(song + offset++),1);
  171.    
  172.     //remove spaces
  173.     if(*_songptr == ' ')
  174.     {
  175.       continue;
  176.     }
  177.     #ifdef MUSIC_DEBUG
  178.       Serial.print(buffer[0]);
  179.     #endif
  180.    
  181.     //process beginning of music file
  182.     // format: d=NN,o=N,b=NNN:
  183.     // find the start (skip name, etc)
  184.     //while(*_songptr != ':') _songptr++;    // ignore name
  185.     if(state == 0)
  186.     {
  187.       if(*_songptr == ':')
  188.       {
  189.         #ifdef MUSIC_DEBUG
  190.           //Serial.print(":");
  191.         #endif
  192.         state++;
  193.       }
  194.     }
  195.     else if(state == 1)
  196.     {
  197.       if(*_songptr == 'd')
  198.       {
  199.         offset++;                         //skip =
  200.         state++;
  201.         num = 0;
  202.         #ifdef MUSIC_DEBUG
  203.           //Serial.print("d");
  204.         #endif
  205.       }
  206.     }
  207.     // get default duration
  208.     else if(state == 2)
  209.     {
  210.       if(isdigit(*_songptr))
  211.       {
  212.         num = (num * 10) + (*_songptr - '0');
  213.       }
  214.       else
  215.       {
  216.         if(num > 0)
  217.           _default_dur = num;
  218.         state++;                      
  219.         #ifdef MUSIC_DEBUG
  220.           //Serial.print(num);
  221.         #endif
  222.       }
  223.     }
  224.     else if(state == 3)
  225.     {
  226.       if(*_songptr == 'o')
  227.       {
  228.         offset++;                 //skip =
  229.         state++;
  230.         #ifdef MUSIC_DEBUG
  231.           //Serial.print("o");
  232.         #endif
  233.       }
  234.     }
  235.     // get default octave
  236.     else if(state == 4)
  237.     {
  238.       num = *_songptr - '0';
  239.       if(num >= 3 && num <=7)
  240.         _default_oct = num;
  241.       state++;
  242.       #ifdef MUSIC_DEBUG
  243.         //Serial.print(num);
  244.       #endif
  245.     }
  246.     else if(state == 5)
  247.     {
  248.       if(*_songptr == 'b')
  249.       {
  250.         offset++;                   //skip =
  251.         state++;
  252.         num = 0;
  253.         #ifdef MUSIC_DEBUG
  254.           //Serial.print("b");
  255.         #endif
  256.       }
  257.     }
  258.     else if(state == 6)
  259.     {
  260.       if(isdigit(*_songptr))
  261.       {
  262.         num = (num * 10) + (*_songptr - '0');
  263.       }
  264.       else
  265.       {
  266.         _bpm = num;
  267.         num = 0;                    //house keeping
  268.         state++;
  269.         // BPM usually expresses the number of quarter notes per minute
  270.         _wholenote = (60 * 1000L / _bpm) * 4;  // this is the time for whole note (in milliseconds)
  271.        
  272.         //save location of beginning
  273.         //begoffset = offset;  //points to beginning of song hopefully
  274.        
  275.         #ifdef MUSIC_DEBUG
  276.           //Serial.print(num);
  277.         #endif
  278.       }
  279.     }
  280.     //Pre processing complete, now read each note
  281.    
  282.     // first, get note duration, if available
  283.     else if (state == 7)
  284.     {
  285.       //first, get note duration, if available
  286.       if(isdigit(*_songptr))
  287.       {
  288.         num = (num * 10) + (*_songptr - '0');
  289.       }
  290.       else
  291.       {
  292.         if(num)
  293.           _duration = _wholenote / num;
  294.         else
  295.           _duration = _wholenote / _default_dur;  // we will need to check if we are a dotted note after
  296.        
  297.        
  298.         //current is not a number, it is a note?
  299.         //now, get note
  300.         //if statements faster than switch
  301.         //default == 0
  302.         note = 0;
  303.         if(*_songptr == 'c')
  304.             note = 1;
  305.         if(*_songptr == 'd')
  306.             note = 3;
  307.         if(*_songptr == 'e')
  308.             note = 5;
  309.         if(*_songptr == 'f')
  310.             note = 6;
  311.         if(*_songptr == 'g')
  312.             note = 8;
  313.         if(*_songptr == 'a')
  314.             note = 10;
  315.         if(*_songptr == 'b')
  316.             note = 12;
  317.            
  318.         scale = _default_oct;
  319.         state++;
  320.         #ifdef MUSIC_DEBUG
  321.           //Serial.print(_duration);
  322.         #endif
  323.       }
  324.     }
  325.     else if (state == 8)
  326.     {
  327.       // now, get optional '#' sharp
  328.       if(*_songptr == '#')
  329.       {
  330.         note++;
  331.       }
  332.       // now, get optional '.' dotted note
  333.       if(*_songptr == '.')
  334.       {
  335.         _duration += _duration>>1;
  336.       }
  337.       // now, get scale
  338.       if(isdigit(*_songptr))
  339.       {
  340.         scale = *_songptr - '0';
  341.       }
  342.       if(*_songptr == ',' || *_songptr == 0)
  343.       {
  344.         //set state to beginning of note
  345.         state = 7;
  346.         scale += OCTAVE_OFFSET;
  347.         noTone(TONE_PIN);
  348.         // now play the note
  349.         if(note)
  350.         {
  351.           tone(TONE_PIN, notes[(scale - 4) * 12 + note], _duration);
  352.         }
  353.        
  354.         delay(_duration);
  355.        
  356.         num = 0;
  357.         note = 0;
  358.       }
  359.     }
  360.     #ifdef MUSIC_DEBUG
  361.       Serial.print(state);
  362.       delay(200);
  363.     #endif
  364.    
  365.     if(*_songptr == 0) //null
  366.     {
  367.       noTone(TONE_PIN);
  368.       #ifdef MUSIC_DEBUG
  369.         Serial.print(buffer1[0]);
  370.         Serial.print(state);
  371.         Serial.print(offset);
  372.         delay(200);
  373.       #endif
  374.       return;
  375.     }
  376.   }
  377. }
  378.  
  379. int value = 0;
  380.  
  381. void setup(void)
  382. {
  383.   #ifdef MUSIC_DEBUG
  384.     Serial.begin(9600);
  385.   #endif
  386. }
  387.  
  388. void loop(void)
  389. {
  390.   #ifdef MUSIC_DEBUG
  391.     Serial.print(value);
  392.   #endif
  393.   play_music(MusicSongPlayTable[value++]);
  394.   if(value == 35)
  395.     value = 0;
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement