Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #define OCTAVE_OFFSET 0
  2. #define TONE_PIN 8
  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. 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.  
  62. void setup(void)
  63. {
  64.   Serial.begin(9600);
  65. }
  66.  
  67. #define isdigit(n) (n >= '0' && n <= '9')
  68.  
  69. void play_rtttl(char *p)
  70. {
  71.  
  72.   byte default_dur = 4; //duracion
  73.   byte default_oct = 6;
  74.   int bpm = 64;// pulsos por minuti
  75.   int num;
  76.   long notatotal;
  77.   long duration;
  78.   byte nota;
  79.   byte escala;
  80.  
  81.   // formato: d=N,o=N,b=NNN:
  82.   // encontramos el principio
  83.  
  84.   while(*p != ':') p++;    // ignorar el nombre
  85.   p++;                    
  86.  
  87.   // obtiene la duracion
  88.   if(*p == 'd')
  89.   {
  90.     p++; p++;              // no cojer la "d="
  91.     num = 0;
  92.     while(isdigit(*p))
  93.     {
  94.       num = (num * 10) + (*p++ - '0');
  95.     }
  96.     if(num > 0) default_dur = num;
  97.     p++;                   // no cojer la coma
  98.   }
  99.  
  100.   Serial.print("duracion: "); Serial.println(default_dur, 10);
  101.  
  102.   // obtener la octava
  103.   if(*p == 'o')
  104.   {
  105.     p++; p++;              // no cojer la "o="
  106.     num = *p++ - '0';
  107.     if(num >= 3 && num <=7) default_oct = num;
  108.     p++;                   // no cojer la coma
  109.   }
  110.  
  111.   Serial.print("doct: "); Serial.println(default_oct, 10);
  112.  
  113.   // obtener los BPM
  114.   if(*p == 'b')
  115.   {
  116.     p++; p++;              // omitir  "b="
  117.     num = 0;
  118.     while(isdigit(*p))
  119.     {
  120.       num = (num * 10) + (*p++ - '0');
  121.     }
  122.     bpm = num;
  123.     p++;                   // omitir colon
  124.   }
  125.  
  126.   Serial.print("bpm: "); Serial.println(bpm, 10);
  127.  
  128.  
  129.  // BPM por lo general expresa el n�mero de cuartos  por minuto
  130.  
  131.  notatotal = (60 * 1000L / bpm) * 4;
  132. //la nota completa (en milisegundos)
  133.  
  134.   Serial.print("wn: "); Serial.println(notatotal, 10);
  135.  
  136.  
  137.   //empesamos el recorrido de la nota
  138.   while(*p)
  139.   {
  140.     //  primer ,obtener duraci�n de la nota, si est� disponible
  141.     num = 0;
  142.     while(isdigit(*p))
  143.     {
  144.       num = (num * 10) + (*p++ - '0');
  145.     }
  146.    
  147.     if(num) duration = notatotal / num;
  148.     else duration = notatotal / default_dur;
  149.  
  150.  // obetenemos la  nota
  151.     nota = 0;
  152.  
  153.     switch(*p)
  154.     {
  155.       case 'c':
  156.         nota = 1;
  157.         break;
  158.       case 'd':
  159.         nota = 3;
  160.         break;
  161.       case 'e':
  162.         nota = 5;
  163.         break;
  164.       case 'f':
  165.         nota = 6;
  166.         break;
  167.       case 'g':
  168.         nota = 8;
  169.         break;
  170.       case 'a':
  171.         nota = 10;
  172.         break;
  173.       case 'b':
  174.         nota = 12;
  175.         break;
  176.       case 'p':
  177.       default:
  178.         nota = 0;
  179.     }
  180.     p++;
  181.  
  182.    //obtiene la nota #aguda
  183.     if(*p == '#')
  184.     {
  185.       nota++;
  186.       p++;
  187.     }
  188.  
  189.     //obtiene la nota "." punteada
  190.     if(*p == '.')
  191.     {
  192.       duration += duration/2;
  193.       p++;
  194.     }
  195.  
  196.     // obetener la escala
  197.     if(isdigit(*p))
  198.     {
  199.       escala = *p - '0';
  200.       p++;
  201.     }
  202.     else
  203.     {
  204.       escala = default_oct;
  205.     }
  206.  
  207.     escala+= OCTAVE_OFFSET;
  208.  
  209.     if(*p == ',')
  210.       p++;  
  211. //omitir las comas para la nota siguiente
  212.  
  213.     // tocar la nota
  214.  
  215.     if(nota)
  216.     {
  217.       Serial.print("tocando: ");
  218.       Serial.print(escala, 10); Serial.print(' ');
  219.       Serial.print(nota, 10); Serial.print(" (");
  220.       Serial.print(notes[(escala - 4) * 12 + nota], 10);
  221.       Serial.print(") ");
  222.       Serial.println(duration, 10);
  223.       tone(TONE_PIN, notes[(escala - 4) * 12 + nota]);
  224.       delay(duration);
  225.       noTone(TONE_PIN);
  226.     }
  227.     else
  228.     {
  229.       Serial.print("Pausing: ");
  230.       Serial.println(duration, 10);
  231.       delay(duration);
  232.     }
  233.   }
  234. }
  235.  
  236. void loop(void)
  237. {
  238.   play_rtttl(song);
  239.   Serial.println("Done.");
  240.   while(1);
  241. }