Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.45 KB | None | 0 0
  1. #define OCTAVE_OFFSET 0
  2. #define TONE_PIN 9
  3.  
  4. #define NOTE_C4 262
  5. #define NOTE_CS4 277
  6. #define NOTE_D4 294
  7. #define NOTE_DS4 311
  8. #define NOTE_E4 330
  9. #define NOTE_F4 349
  10. #define NOTE_FS4 370
  11. #define NOTE_G4 392
  12. #define NOTE_GS4 415
  13. #define NOTE_A4 440
  14. #define NOTE_AS4 466
  15. #define NOTE_B4 494
  16. #define NOTE_C5 523
  17. #define NOTE_CS5 554
  18. #define NOTE_D5 587
  19. #define NOTE_DS5 622
  20. #define NOTE_E5 659
  21. #define NOTE_F5 698
  22. #define NOTE_FS5 740
  23. #define NOTE_G5 784
  24. #define NOTE_GS5 831
  25. #define NOTE_A5 880
  26. #define NOTE_AS5 932
  27. #define NOTE_B5 988
  28. #define NOTE_C6 1047
  29. #define NOTE_CS6 1109
  30. #define NOTE_D6 1175
  31. #define NOTE_DS6 1245
  32. #define NOTE_E6 1319
  33. #define NOTE_F6 1397
  34. #define NOTE_FS6 1480
  35. #define NOTE_G6 1568
  36. #define NOTE_GS6 1661
  37. #define NOTE_A6 1760
  38. #define NOTE_AS6 1865
  39. #define NOTE_B6 1976
  40. #define NOTE_C7 2093
  41. #define NOTE_CS7 2217
  42. #define NOTE_D7 2349
  43. #define NOTE_DS7 2489
  44. #define NOTE_E7 2637
  45. #define NOTE_F7 2794
  46. #define NOTE_FS7 2960
  47. #define NOTE_G7 3136
  48. #define NOTE_GS7 3322
  49. #define NOTE_A7 3520
  50. #define NOTE_AS7 3729
  51. #define NOTE_B7 3951
  52.  
  53. int notes[] = { 0,
  54. NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
  55. NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
  56. NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
  57. NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
  58. };
  59.  
  60. //const char *song = "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";
  61. //const char *song = "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";
  62. //const char *song = "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";
  63. //const char *song = "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";
  64. //const char *song = "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";
  65. //const char *song = "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";
  66. //const char *song = "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";
  67. //const char *song = "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#";
  68. //const char *song = "TopGun:d=4,o=4,b=31:32p,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,16f,d#,16c#,16g#,16g#,32f#,32f,32f#,32f,16d#,16d#,32c#,32d#,16f,32d#,32f,16f#,32f,32c#,g#";
  69. //const char *song = "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#";
  70. //const char *song = "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";
  71. //const char *song = "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#";
  72. //const char *song = "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#.";
  73. const char *song = "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";
  74. //const char *song = "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";
  75.  
  76. void setup(void)
  77. {
  78. Serial.begin(9600);
  79. }
  80.  
  81. #define isdigit(n) (n >= '0' && n <= '9')
  82.  
  83. void play_rtttl(const char *p)
  84. {
  85. // Absolutely no error checking in here
  86.  
  87. byte default_dur = 4;
  88. byte default_oct = 6;
  89. int bpm = 63;
  90. int num;
  91. long wholenote;
  92. long duration;
  93. byte note;
  94. byte scale;
  95.  
  96. // format: d=N,o=N,b=NNN:
  97. // find the start (skip name, etc)
  98.  
  99. while(*p != ':') p++; // ignore name
  100. p++; // skip ':'
  101.  
  102. // get default duration
  103. if(*p == 'd')
  104. {
  105. p++; p++; // skip "d="
  106. num = 0;
  107. while(isdigit(*p))
  108. {
  109. num = (num * 10) + (*p++ - '0');
  110. }
  111. if(num > 0) default_dur = num;
  112. p++; // skip comma
  113. }
  114.  
  115. Serial.print("ddur: "); Serial.println(default_dur, 10);
  116.  
  117. // get default octave
  118. if(*p == 'o')
  119. {
  120. p++; p++; // skip "o="
  121. num = *p++ - '0';
  122. if(num >= 3 && num <=7) default_oct = num;
  123. p++; // skip comma
  124. }
  125.  
  126. Serial.print("doct: "); Serial.println(default_oct, 10);
  127.  
  128. // get BPM
  129. if(*p == 'b')
  130. {
  131. p++; p++; // skip "b="
  132. num = 0;
  133. while(isdigit(*p))
  134. {
  135. num = (num * 10) + (*p++ - '0');
  136. }
  137. bpm = num;
  138. p++; // skip colon
  139. }
  140.  
  141. Serial.print("bpm: "); Serial.println(bpm, 10);
  142.  
  143. // BPM usually expresses the number of quarter notes per minute
  144. wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds)
  145.  
  146. Serial.print("wn: "); Serial.println(wholenote, 10);
  147.  
  148.  
  149. // now begin note loop
  150. while(*p)
  151. {
  152. // first, get note duration, if available
  153. num = 0;
  154. while(isdigit(*p))
  155. {
  156. num = (num * 10) + (*p++ - '0');
  157. }
  158.  
  159. if(num) duration = wholenote / num;
  160. else duration = wholenote / default_dur; // we will need to check if we are a dotted note after
  161.  
  162. // now get the note
  163. note = 0;
  164.  
  165. switch(*p)
  166. {
  167. case 'c':
  168. note = 1;
  169. break;
  170. case 'd':
  171. note = 3;
  172. break;
  173. case 'e':
  174. note = 5;
  175. break;
  176. case 'f':
  177. note = 6;
  178. break;
  179. case 'g':
  180. note = 8;
  181. break;
  182. case 'a':
  183. note = 10;
  184. break;
  185. case 'b':
  186. note = 12;
  187. break;
  188. case 'p':
  189. default:
  190. note = 0;
  191. }
  192. p++;
  193.  
  194. // now, get optional '#' sharp
  195. if(*p == '#')
  196. {
  197. note++;
  198. p++;
  199. }
  200.  
  201. // now, get optional '.' dotted note
  202. if(*p == '.')
  203. {
  204. duration += duration/2;
  205. p++;
  206. }
  207.  
  208. // now, get scale
  209. if(isdigit(*p))
  210. {
  211. scale = *p - '0';
  212. p++;
  213. }
  214. else
  215. {
  216. scale = default_oct;
  217. }
  218.  
  219. scale += OCTAVE_OFFSET;
  220.  
  221. if(*p == ',')
  222. p++; // skip comma for next note (or we may be at the end)
  223.  
  224. // now play the note
  225.  
  226. if(note)
  227. {
  228. Serial.print("Playing: ");
  229. Serial.print(scale, 10); Serial.print(' ');
  230. Serial.print(note, 10); Serial.print(" (");
  231. Serial.print(notes[(scale - 4) * 12 + note], 10);
  232. Serial.print(") ");
  233. Serial.println(duration, 10);
  234. tone(TONE_PIN, notes[(scale - 4) * 12 + note]);
  235. delay(duration);
  236. noTone(TONE_PIN);
  237. }
  238. else
  239. {
  240. Serial.print("Pausing: ");
  241. Serial.println(duration, 10);
  242. delay(duration);
  243. }
  244. }
  245. }
  246.  
  247. void loop(void)
  248. {
  249. play_rtttl(song);
  250. Serial.println("Done.");
  251. while(1);
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement