{"id":1559,"date":"2014-05-19T18:22:07","date_gmt":"2014-05-19T16:22:07","guid":{"rendered":"http:\/\/guimi.net\/blogs\/hiparco\/?p=1559"},"modified":"2014-07-25T12:51:41","modified_gmt":"2014-07-25T10:51:41","slug":"arduino-libreria-tocamelodia-para-tocar-melodias-predeterminadas","status":"publish","type":"post","link":"http:\/\/guimi.net\/blogs\/hiparco\/arduino-libreria-tocamelodia-para-tocar-melodias-predeterminadas\/","title":{"rendered":"Arduino: Libreria TocaMelodia para tocar melodias predeterminadas"},"content":{"rendered":"<p>Vamos a crear a modo de ejemplo una libreria para tocar melod\u00edas predeterminadas con un piezo-electrico o un altavoz (<a href=\"http:\/\/arduino.cc\/en\/Hacking\/LibraryTutorial\">Tutorial de Arduino de creaci\u00f3n de librer\u00edas<\/a>).<br \/>\n<!--more--><\/p>\n<p>Las librer\u00edas que queramos usar en nuestros programas deben estar en la ruta del IDE o en la carpeta sketchbook del usuario [configurable]:<br \/>\n<font class=\"comando\">\/usr\/share\/arduino\/libraries<br \/>\n~\/sketchbook\/libraries<\/font><\/p>\n<p>Dentro de la carpeta de librerias se genera una carpeta con el nombre la nueva librer\u00eda, en este caso <font class=\"comando\">TocaMelodia<\/font>.<br \/>\nA su vez, dentro de esa carpeta se crea una carpeta \u201c<font class=\"comando\">examples<\/font>\u201d, un archivo <font class=\"comando\">keywords.txt<\/font>, un archivo <font class=\"comando\">TocaMelodia.cpp<\/font> y un archivo <font class=\"comando\">TocaMelodia.h<\/font> (los dos primeros son opcionales).<\/p>\n<p>Dentro de la carpeta \u201c<font class=\"comando\">examples<\/font>\u201d se pueden incluir c\u00f3digos de ejemplo, en la forma habitual de arduino, es decir, dentro de su propia carpeta con el mismo nombre.<br \/>\nEl archivo <font class=\"comando\">keywords.txt<\/font> contiene palabras que queremos que el editor resalte.<br \/>\nEl archivo .h contiene las cabeceras y el archivo .cpp contiene el c\u00f3digo de la librer\u00eda.<\/p>\n<p><a href=\"\/imgs\/blog\/hiparco\/arduino\/TocaMelodia.zip\">Descargar la libreria completa (c\u00f3digo).<\/a><\/p>\n<p>Archivo TocaMelodia.h:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n  TocaMelodia.h - Libreria para tocar melodias pre-establecidas.\r\n  Guimi (http:\/\/guimi.net)\r\n  Released into the public domain.\r\n\r\n  Based on ToneMelody by Tom Igoe \r\n*\/\r\n\r\n\/\/ Para evitar que se incluya la libreria dos veces, solo incluyo la libreria si\r\n\/\/ no est\u00e1 definida la variable TocaMelodia_h\r\n#ifndef TocaMelodia_h\r\n\/\/ defino la variable TocaMelodia_h\r\n#define TocaMelodia_h\r\n\r\n#include \"Arduino.h\"\r\n\r\n\/\/ List of tones by Brett Hagman\r\n#define NOTE_B0  31\r\n#define NOTE_C1  33\r\n#define NOTE_CS1 35\r\n#define NOTE_D1  37\r\n#define NOTE_DS1 39\r\n#define NOTE_E1  41\r\n#define NOTE_F1  44\r\n#define NOTE_FS1 46\r\n#define NOTE_G1  49\r\n#define NOTE_GS1 52\r\n#define NOTE_A1  55\r\n#define NOTE_AS1 58\r\n#define NOTE_B1  62\r\n#define NOTE_C2  65\r\n#define NOTE_CS2 69\r\n#define NOTE_D2  73\r\n#define NOTE_DS2 78\r\n#define NOTE_E2  82\r\n#define NOTE_F2  87\r\n#define NOTE_FS2 93\r\n#define NOTE_G2  98\r\n#define NOTE_GS2 104\r\n#define NOTE_A2  110\r\n#define NOTE_AS2 117\r\n#define NOTE_B2  123\r\n#define NOTE_C3  131\r\n#define NOTE_CS3 139\r\n#define NOTE_D3  147\r\n#define NOTE_DS3 156\r\n#define NOTE_E3  165\r\n#define NOTE_F3  175\r\n#define NOTE_FS3 185\r\n#define NOTE_G3  196\r\n#define NOTE_GS3 208\r\n#define NOTE_A3  220\r\n#define NOTE_AS3 233\r\n#define NOTE_B3  247\r\n#define NOTE_C4  262\r\n#define NOTE_CS4 277\r\n#define NOTE_D4  294\r\n#define NOTE_DS4 311\r\n#define NOTE_E4  330\r\n#define NOTE_F4  349\r\n#define NOTE_FS4 370\r\n#define NOTE_G4  392\r\n#define NOTE_GS4 415\r\n#define NOTE_A4  440\r\n#define NOTE_AS4 466\r\n#define NOTE_B4  494\r\n#define NOTE_C5  523\r\n#define NOTE_CS5 554\r\n#define NOTE_D5  587\r\n#define NOTE_DS5 622\r\n#define NOTE_E5  659\r\n#define NOTE_F5  698\r\n#define NOTE_FS5 740\r\n#define NOTE_G5  784\r\n#define NOTE_GS5 831\r\n#define NOTE_A5  880\r\n#define NOTE_AS5 932\r\n#define NOTE_B5  988\r\n#define NOTE_C6  1047\r\n#define NOTE_CS6 1109\r\n#define NOTE_D6  1175\r\n#define NOTE_DS6 1245\r\n#define NOTE_E6  1319\r\n#define NOTE_F6  1397\r\n#define NOTE_FS6 1480\r\n#define NOTE_G6  1568\r\n#define NOTE_GS6 1661\r\n#define NOTE_A6  1760\r\n#define NOTE_AS6 1865\r\n#define NOTE_B6  1976\r\n#define NOTE_C7  2093\r\n#define NOTE_CS7 2217\r\n#define NOTE_D7  2349\r\n#define NOTE_DS7 2489\r\n#define NOTE_E7  2637\r\n#define NOTE_F7  2794\r\n#define NOTE_FS7 2960\r\n#define NOTE_G7  3136\r\n#define NOTE_GS7 3322\r\n#define NOTE_A7  3520\r\n#define NOTE_AS7 3729\r\n#define NOTE_B7  3951\r\n#define NOTE_C8  4186\r\n#define NOTE_CS8 4435\r\n#define NOTE_D8  4699\r\n#define NOTE_DS8 4978\r\n\r\n#define NOTA_CORCHEA 125\r\n#define NOTA_CORCHEA_PAUSA 175\r\n#define NOTA_NEGRA 250\r\n#define NOTA_NEGRA_PAUSA 330\r\n#define NOTA_BLANCA 500\r\n#define NOTA_BLANCA_PAUSA 660\r\n#define NOTA_REDONDA 1000\r\n#define NOTA_REDONDA_PAUSA 1320\r\n\r\n#define MELODIA_FANFARRIA 0\r\n#define MELODIA_PODER_PERRUNO 1\r\n#define MELODIA_ENCUENTROS_3A_FASE 2\r\n#define MELODIA_R2D2 3\r\n#define MELODIA_OHHH 4\r\n#define MELODIA_UHOH 5\r\n\r\n\r\n\/\/ Definimos la clase TocaMelodia\r\nclass TocaMelodia {\r\n\tpublic:\r\n\t\t\/\/ Constructor\r\n\t\tTocaMelodia(int pin);\r\n\t\t\/\/ Las funciones a utilizar\r\n\t\tvoid melodia(int melodia);\r\n\tprivate:\r\n\t\t\/\/ Variable interna para guardar el pin del altavoz\r\n\t\tint _pin; \/\/ Pin del altavoz\r\n\t\tvoid Glis(int note1, int note2, int rate); \/\/ Glissando\r\n\t\tvoid Trem(int note1, int note2, int rate); \/\/ Tremolo\r\n\t\t\/\/ Las funciones a utilizar\r\n\t\tvoid melodia0(); \/\/ MELODIA_FANFARRIA 0\r\n\t\tvoid melodia1(); \/\/ MELODIA_PODER_PERRUNO\r\n\t\tvoid melodia2(); \/\/ MELODIA_ENCUENTROS_3A_FASE\r\n\t\tvoid melodia3(); \/\/ MELODIA_R2D2\r\n\t\tvoid melodia4(); \/\/ MELODIA_R2D2\r\n\t\tvoid melodia5(); \/\/ MELODIA_R2D2\r\n};\r\n\r\n\/\/ Finalizo la opcion de compilacion\r\n#endif\r\n<\/pre>\n<p>Archivo TocaMelodia.cpp:<\/p>\n<p>\/*<br \/>\n  TocaMelodia.cpp &#8211; Libreria para tocar melodias pre-establecidas.<br \/>\n  Guimi (http:\/\/guimi.net)<br \/>\n  Released into the public domain.<\/p>\n<p>  Based on work by Brett Hagman (pitches.h), Tom Igoe (ToneMelody), Erik Kringen and Dave Tucker<br \/>\n*\/<\/p>\n<p>#include &#8220;Arduino.h&#8221;<br \/>\n#include &#8220;TocaMelodia.h&#8221;<\/p>\n<p>\/\/ Constructor<br \/>\nTocaMelodia::TocaMelodia(int pin) {<br \/>\n  \/\/ Definimos el pin como de salida<br \/>\n  pinMode(pin, OUTPUT);<br \/>\n  \/\/ Guardamos el pin indicado en la variable de la clase<br \/>\n  _pin = pin;<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia(int melodia) {<br \/>\n  switch(melodia){<br \/>\n    case 0:<br \/>\n      melodia0();<br \/>\n      break;<br \/>\n    case 1:<br \/>\n      melodia1();<br \/>\n      break;<br \/>\n    case 2:<br \/>\n      melodia2();<br \/>\n      break;<br \/>\n    case 3:<br \/>\n      melodia3();<br \/>\n      break;<br \/>\n    case 4:<br \/>\n      melodia4();<br \/>\n      break;<br \/>\n    case 5:<br \/>\n      melodia5();<br \/>\n      break;<br \/>\n  }<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia0() { \/\/ MELODIA_FANFARRIA 0<br \/>\n  tone(_pin, NOTE_C4, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_G3, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_G3, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_A3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_G3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, 0, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C4, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  delay(10);<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia1() { \/\/ MELODIA_PODER_PERRUNO<br \/>\n  tone(_pin, NOTE_B4, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B4, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B4, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS5, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B4, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS5, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  delay(10);<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia2() { \/\/ MELODIA_ENCUENTROS_3A_FASE<br \/>\n  \/\/ Based on work by Erik Kringen<br \/>\n  \/\/http:\/\/www.mycontraption.com\/sound-effects-with-and-arduino\/<br \/>\n  tone(_pin, NOTE_AS5, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C6, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS4, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_DS5, NOTA_BLANCA); delay (NOTA_BLANCA_PAUSA); noTone(_pin);<br \/>\n  delay (500);<\/p>\n<p>  tone(_pin, NOTE_AS4, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C5, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS2, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_DS4, NOTA_BLANCA); delay (NOTA_BLANCA_PAUSA); noTone(_pin);<br \/>\n  delay (500);<\/p>\n<p>  tone(_pin, NOTE_AS3, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C4, NOTA_NEGRA); delay (NOTA_NEGRA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS2, NOTA_BLANCA); delay (NOTA_BLANCA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_GS1, NOTA_BLANCA); delay (NOTA_BLANCA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_DS3, NOTA_REDONDA); delay (NOTA_REDONDA_PAUSA); noTone(_pin);<br \/>\n  delay(10);<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia3() { \/\/ MELODIA_R2D2<br \/>\n  \/\/ Based on work by Erik Kringen and Dave Tucker<br \/>\n  \/\/http:\/\/www.mycontraption.com\/sound-effects-with-and-arduino\/<br \/>\n  \/\/http:\/\/dtucker.co.uk\/make\/arduino-using-my-melodyutils-library-for-r2-d2-style-chirps.html<br \/>\n  tone(_pin, NOTE_A7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_G7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_E7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_D7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_F7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C8, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_A7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_G7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_E7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_D7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_B7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_F7, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  tone(_pin, NOTE_C8, NOTA_CORCHEA); delay (NOTA_CORCHEA_PAUSA); noTone(_pin);<br \/>\n  delay(10);<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia4() { \/\/ MELODIA_OHHH<br \/>\n  Glis(NOTE_C6, NOTE_C7, 6);<br \/>\n  Glis(NOTE_C7, NOTE_C6, 5);<br \/>\n  \/\/for (int i=1000; i<2000; i=i*1.02) { tone(_pin,i,10); };\n  \/\/for (int i=2000; i>1000; i=i*.98) { tone(_pin,i,10); delay(10);};<br \/>\n}<\/p>\n<p>void TocaMelodia::melodia5() { \/\/ MELODIA_UHOH<br \/>\n  Glis(NOTE_C6, NOTE_DS6, 6);<br \/>\n  delay(200);<br \/>\n  Glis(NOTE_DS6, NOTE_CS6, 5);<br \/>\n  \/\/for (int i=1000; i<1244; i=i*1.01) { tone(_pin,i,30); };\n  \/\/delay(200);\n  \/\/for (int i=1244; i>1108; i=i*.99) { tone(_pin,i,30);  delay(30);};<\/p>\n<p>}<\/p>\n<p>void TocaMelodia::Glis(int nota1, int nota2, int tasa) {<br \/>\n  \/\/ By Dave Tucker<br \/>\n  \/\/http:\/\/dtucker.co.uk\/make\/arduino-using-my-melodyutils-library-for-r2-d2-style-chirps.html<br \/>\n  \/\/ Glissando = Slide<br \/>\n  \/\/ Slides up or down from note1 to note2<br \/>\n  \/\/ rate = 0 is fast and can be increased to slow the effect down<\/p>\n<p>  if (nota1 < nota2) { \/\/Slide up\n    for (int nota = nota1; nota < nota2; nota++) {\n      tone(_pin, nota, tasa); delay (tasa); noTone(_pin);\n    }\n  } else { \/\/Slide down\n    for (int nota = nota1; nota > nota2; nota&#8211;) {<br \/>\n      tone(_pin, nota, tasa); delay (tasa); noTone(_pin);<br \/>\n    }<br \/>\n  }<br \/>\n  noTone(_pin);<br \/>\n}<\/p>\n<p>void TocaMelodia::Trem(int note, int length, int rate) {<br \/>\n  \/\/ By Dave Tucker<br \/>\n  \/\/http:\/\/dtucker.co.uk\/make\/arduino-using-my-melodyutils-library-for-r2-d2-style-chirps.html<br \/>\n  \/\/ Tremolo = Fast repetition of a note<br \/>\n  \/\/ note = the note (from pitches.h)<br \/>\n  \/\/ length = duration of the effect in msec<br \/>\n  \/\/ rate = number of repetitions<\/p>\n<p>  int note_duration = length\/rate;<br \/>\n  int pauseBetweenNotes = rate * (1 + rate\/length);<\/p>\n<p>  for (int i = 0; i <= rate; i++) {\n    tone(_pin, note, note_duration);\n    delay(pauseBetweenNotes);\n    noTone(_pin);\n  }\n}\n[\/sourcecode]\n\nArchivo keywords.txt:\n[sourcecode language=\"c\"]\nTocaMelodia\tKEYWORD1\nmelodia\tKEYWORD2\n[\/sourcecode]\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a crear a modo de ejemplo una libreria para tocar melod\u00edas predeterminadas con un piezo-electrico o un altavoz (Tutorial de Arduino de creaci\u00f3n de librer\u00edas).<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,29,16,33],"tags":[],"class_list":["post-1559","post","type-post","status-publish","format-standard","hentry","category-arduino","category-electronica","category-hardware","category-programacion"],"_links":{"self":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/comments?post=1559"}],"version-history":[{"count":7,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1559\/revisions"}],"predecessor-version":[{"id":1683,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1559\/revisions\/1683"}],"wp:attachment":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/media?parent=1559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/categories?post=1559"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/tags?post=1559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}