Crear música con Arduino o sonidos sueltos es relativamente fácil y suele ser una práctica muy interesante para hacer con alumnos que están empezando a familiarizarse con la programación.
En principio únicamente vamos a necesitar un zumbador piezoeléctrico y la placa de Arduino para poder generar música con Arduino. Una vez se comprende la generación de sonidos se pueden realizar proyectos más complejos implementando un pequeño instrumento electrónico donde le podamos indicar notas mediante teclas, sensores capacitivos, sensores de ultrasonidos, etc.
Un zumbador piezoaeléctrico consigue generar un sonido al vibrar en la frecuencia de la señal eléctrica que recibe. El valor en frecuencia de la señal determinará el tono en el que suene el piezoeléctrico. Es un sonido de muy baja calidad pero vamos a poder generar notas y con ello música.
Si usamos una interfaz de programación basada en Scratch como mBlock seguramente tengamos bloques disponibles para realizar sonidos, únicamente tendremos que tener en cuenta la notación anglosajona para “traducir” una partitura. Para familiarizarte con la programación de música mediante bloques te recomiendo que leas la entrada Música con mBot que es aplicable igualmente a Arduino.
En esta ocasión vamos a generar música con Arduino mediante código porque va a ser la manera de poder hacer sonar nuestro proyecto en cualquier nota que aparezca en la partitura que consultemos, ya que vamos a poder programar también sostenidas, algo que no se puede hacer por ejemplo con mBlock.
Vamos a hacer uso de la instrucción tone cuyos argumentos son el pin de salida al cual tenemos conectado el zumbador, la frecuencia de la señal que vamos a generar y que es la que variará la nota y la duración en milisegundos (opcional). Con varias instrucciones tone podremos hacer música con Arduino.
tone(pin, frecuencia)
tone(pin, frecuencia, tiempo)
El pin de salida debe ser de tipo PWM ya que debemos poder variar su frecuencia. En Arduino Uno, Mini y Nano podrán ser 3, 5, 6, 9, 10 y 11
La frecuencia adecuada para cada nota la tenéis en una tabla al final del tutorial.
El tiempo es la duración de la nota. Cada figura tendrá un tiempo determinado por el tiempo de la negra (t),de tal manera que una blanca durará doble que una negra y una corchea la mitad. La relación de los tiempos de las figuras es fija, pero el tempo lo vamos a marcar nosotros. Si no declaramos el tiempo en la instrucción tone deberemos hacer un delay con la duración y utilizar la instrución noTone posteriormente.
Por ejemplo si establecemos que una negra sea 1 segundo nos quedaría lo siguiente:
Figura | Tiempo(ms) |
Redonda | 4000 |
Blanca | 2000 |
Negra | 1000 |
Corchea | 500 |
Semicorchea | 250 |
Fusa | 125 |
Semifusa | 62 |
Utilizaremos la instrucción noTone si no indicamos un tiempo en la instrucción tone. Esta instrucción indica que se deje de emitir la señal por el pin indicado.
noTone(pin)
Con esto ya podemos generar música con Arduino o notas musicales sueltas.
Debemos conectar el zumbador con su patilla marcada como negativa a masa (GND) y la patilla marcada como positiva a nuestro pin con posibilidad de salida PWM. No te preocupes si lo conectas al revés, simplemente no funcionará y tendrás que cambiarlo, pero no habrá humo en tu lugar de trabajo.
Este puede ser un ejemplo para hacer sonar una semicorchea Do de la 4ª octava (según los timepos de ejemplo de la tabla de arriba) a través del pin 3:
void setup()
{
pinMode(3, OUTPUT); // Fija el pin 3 como salida.
}
void loop()
{
tone(3, 261.63, 250); // Lanza señal a 261,63Hz por el pin 3 durante 250ms.
}
Este bucle sería equivalente a poner:
void loop()
{
tone(3, 261.63); // Lanza señal a 261,63Hz por el pin 3.
delay(250); // Espera 250ms.
noTone(3); // Dejamos de emitir la señal.
}
Si la música con Arduino que queremos crear es una melodía relativamente larga lo mejor es utilizar arrays para almacenar todas las notas (frecuencias) y todos los tiempos.
Primero definimos los arrays:
long DO=523.25, //definimos las frecuencias de las notas
DoS=554.37,
RE=587.33,
RES=622.25,
MI=659.26,
FA=698.46,
FAS=739.99,
SOL=783.99,
SOLS=830.61,
LA=880,
LAS=932.33,
SI=987.77,
RE2=1174.66,
FAS2=1479.98,
PAU=30000; //pausa
int melodia[] = {SI, RE2, SI, RE2, PAU, SI, LA, SI, SI, SI, PAU, RE2, SI, SI, PAU, RE2, PAU, RE2, RE2, PAU, SI, RE2, SI, RE2, PAU,
SI, LA, SI, SI, SI, PAU, RE2, SI, SI, PAU, RE2, PAU, RE2, RE2, PAU, RE2, PAU, SI, RE2, PAU, SI, RE2, PAU, SI, RE2,
PAU, SI, PAU, RE2, SI, LA, SI, PAU, RE2,PAU, SI, RE2, PAU, SI, RE2, PAU, SI, RE2, PAU, SI, PAU, RE2, SI, LA, SI,
PAU, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2 ,FAS2, PAU, RE2, FAS2, PAU, RE2, LA, SOLS, SI, PAU, FAS2, PAU,
RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, FAS2, PAU, RE2, LA, SI, SI
};
int d=1000, e=500, m=250, c=125; //definimos los tiempos de doble, entera, media y cuarta
int duracionNota[] = {m, m, m, m, e, c, m, m, c, m, e, m, m, m, e, m, m, m, m, d, m, m, m, m, e, c, m, m, c, m, e, m, m, m, e, m, m, m, m, d,
m, m, m, m, m, m, m, m, m, m, m, m, c, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m,
m, m, m, m, m, m, m, m, m, m, m, m, c, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m,
};
En el bucle incluiremos los arrays dentro de la función tone:
for (int notaActual = 0; notaActual < 112; notaActual++) { //va a repetir las 112 notas
tone(11, melodia[notaActual]); //da el tono a la frecuencia de la nota en ese momento
delay(duracionNota[notaActual]);//se mantiene con la nota el tiempo definido para esa nota
noTone(11); //finaliza la melodía
}
Si te ha parecido muy complicado es que no lo he explicado bien. Es más sencillo de lo que parece y de hecho podemos partir de bloques para luego adaptar el código.
Te recomiendo que veas este vídeo y te ayude a crear música con Arduino, sólo tienes que practicar.
Prueba a configurar en clase o en casa instrumentos con diferentes moduladores, por ejemplo el sensor de ultrasonidos, y si tienes cualquier duda utiliza los comentarios y lo vemos.
Accediendo a la plataforma de cursos de Juegos Robótica aprenderás a aprovechar todas las posibilidades de Arduino y de otros kits de robótica ampliando tus conocimientos sobre programación aplicados a la música además del resto de funciones.
Dani S.
Nota | Octava | Frequencia (Hz) |
Do / C | 0 | 16,35 |
Do# / C# | 0 | 17,32 |
Re / D | 0 | 18,35 |
Re# / D# | 0 | 19,45 |
Mi / E | 0 | 20,60 |
Fa / F | 0 | 21,83 |
Fa# / F# | 0 | 23,12 |
Sol / G | 0 | 24,50 |
Sol# / G# | 0 | 25,96 |
La / A | 0 | 27,50 |
La# / A# | 0 | 29,14 |
Si / B | 0 | 30,87 |
Do / C | 1 | 32,70 |
Do# / C# | 1 | 34,65 |
Re / D | 1 | 36,71 |
Re# / D# | 1 | 38,89 |
Mi / E | 1 | 41,20 |
Fa / F | 1 | 43,65 |
Fa# / F# | 1 | 46,25 |
Sol / G | 1 | 49,00 |
Sol# / G# | 1 | 51,91 |
La / A | 1 | 55,00 |
La# / A# | 1 | 58,27 |
Si / B | 1 | 61,74 |
Do / C | 2 | 65,41 |
Do# / C# | 2 | 69,30 |
Re / D | 2 | 73,42 |
Re# / D# | 2 | 77,78 |
Mi / E | 2 | 82,41 |
Fa / F | 2 | 87,31 |
Fa# / F# | 2 | 92,50 |
Sol / G | 2 | 98,00 |
Sol# / G# | 2 | 103,83 |
La / A | 2 | 110,00 |
La# / A# | 2 | 116,54 |
Si / B | 2 | 123,47 |
Do / C | 3 | 130,81 |
Do# / C# | 3 | 138,59 |
Re / D | 3 | 146,83 |
Re# / D# | 3 | 155,56 |
Mi / E | 3 | 164,81 |
Fa / F | 3 | 174,61 |
Fa# / F# | 3 | 185,00 |
Sol / G | 3 | 196,00 |
Sol# / G# | 3 | 207,65 |
La / A | 3 | 220,00 |
La# / A# | 3 | 233,08 |
Si / B | 3 | 246,94 |
Do / C | 4 | 261,63 |
Do# / C# | 4 | 277,18 |
Re / D | 4 | 293,67 |
Re# / D# | 4 | 311,13 |
Mi / E | 4 | 329,63 |
Fa / F | 4 | 349,23 |
Fa# / F# | 4 | 369,99 |
Sol / G | 4 | 392,00 |
Sol# / G# | 4 | 415,31 |
La / A | 4 | 440,00 |
La# / A# | 4 | 466,16 |
Si / B | 4 | 493,88 |
Do / C | 5 | 523,25 |
Do# / C# | 5 | 554,37 |
Re / D | 5 | 587,33 |
Re# / D# | 5 | 622,25 |
Mi / E | 5 | 659,26 |
Fa / F | 5 | 698,46 |
Fa# / F# | 5 | 739,99 |
Sol / G | 5 | 783,99 |
Sol# / G# | 5 | 830,61 |
La / A | 5 | 880,00 |
La# / A# | 5 | 932,33 |
Si / B | 5 | 987,77 |
Do / C | 6 | 1046,50 |
Do# / C# | 6 | 1108,73 |
Re / D | 6 | 1174,66 |
Re# / D# | 6 | 1244,51 |
Mi / E | 6 | 1318,51 |
Fa / F | 6 | 1396,91 |
Fa# / F# | 6 | 1479,98 |
Sol / G | 6 | 1567,98 |
Sol# / G# | 6 | 1661,22 |
La / A | 6 | 1760,00 |
La# / A# | 6 | 1864,66 |
Si / B | 6 | 1975,53 |
Do / C | 7 | 2093,01 |
Do# / C# | 7 | 2217,46 |
Re / D | 7 | 2349,32 |
Re# / D# | 7 | 2489,02 |
Mi / E | 7 | 2637,02 |
Fa / F | 7 | 2793,83 |
Fa# / F# | 7 | 2959,96 |
Sol / G | 7 | 3135,96 |
Sol# / G# | 7 | 3322,44 |
La / A | 7 | 3520,00 |
La# / A# | 7 | 3729,31 |
Si / B | 7 | 3951,07 |
Do / C | 8 | 4186,01 |
Do# / C# | 8 | 4434,92 |
Re / D | 8 | 4698,64 |
Re# / D# | 8 | 4978,03 |
Mi / E | 8 | 5274,04 |
Fa / F | 8 | 5587,65 |
Fa# / F# | 8 | 5919,91 |
Sol / G | 8 | 6271,93 |
Sol# / G# | 8 | 6644,88 |
La / A | 8 | 7040,00 |
La# / A# | 8 | 7458,62 |
Si / B | 8 | 7902,13 |
Do / C | 9 | 8372,02 |
Do# / C# | 9 | 8869,84 |
Re / D | 9 | 9397,27 |
Re# / D# | 9 | 9956,06 |
Mi / E | 9 | 10548,08 |
Fa / F | 9 | 11175,30 |
Fa# / F# | 9 | 11839,82 |
Sol / G | 9 | 12543,86 |
Sol# / G# | 9 | 13289,75 |
La / A | 9 | 14080,00 |
La# / A# | 9 | 14917,24 |
Si / B | 9 | 15804,26 |
No esta especificado los parametros para una nota REDONDA que es el doble de la BLANCA
Gracias por tu comentario, he añadido la redonda en la tabla de tiempos.
Gracias Dany pero aún te falta en la lista la última que es la SEMIFUSA que viene a ser la mitad de la FUSA.-
Ya la he añadido, gracias por tus sugerencias Ángel.
Podríamos llegar de la máxima a la semigarrapatea, pero es simplemente para que sirva de orientación.
La verdad es que desgraciadamente sobre música sólo soy un aprendiz, así que agradezco cualquier sugerencia. Muchas gracias!
Dani
Gracias Dani.-
Hola Dani, Te consulto por lo siguiente, quisiera saber si reemplazando el zumbador por alguna placa arduino programada con un sketch se podría emular el sonido de algún instrumento para acercarse más a un intérprete midi. No se si ya hay algún proyecto que encare esto. Mi idea es construir una gaita gallega electrónica. Saludos, José.
Hola José,
Si que hay proyectos MIDI con Arduino pero utilizan una librería específica y tienen que ser programadas por código. Si haces una búsqueda no tendrás problemas en encontrar este tipo de proyectos.
Por bloques podrías hacerlo utilizando la comunicación serie con el PC pero necesitarías más programación por código en la parte MIDI del PC por lo que no tendría mucho sentido.
Si lo que quieres hacer es específicamente una gaita quizá puedas incluirlo como instrumento en mBlock igual que se haría con Scratch y luego podrías programarlo por bloques pero siempre en modo colaborativo con el PC.
Saludos,
Dani
Gracias por tu pronta respuesta Dani, la idea es una gaita y en modo no colaborativo con el PC, sino con una placa arduino autónoma quemada con un sketch, a modo que utilizando un conjunto de teclas (toques sobre orificios) pueda construir un puntero para aprendizaje de gaita con auricular, Sin molestar a los vecinos. Tengo dudas sobre si con los modestos recursos de memoria de la Atmega o la 328 pudiera alojar un sketch con la función de reconstrucción de los parámetros de la gaita (cepstrum). Posiblemente la reconstrucción analogica del pitch con integrados analógicos discretos sumando cuatro ondas, sinusoidal, cuadrada, sierra y triangular en proporciones ajustables pueda facilitar el logro del objetivo. De la misma manera me surgen dudas sobre como gobernar los parámetros de tiempos de ataque, caída, sostenimiento y extinción de la señal de la nota pulsada. Cordialmente, José
Disculpa, me gustaría saber como colocar 2 claves a la vez en el código, ya que una clave es de Sol pero la otra es de Fa y ambas tienen diferentes notas, y no sé como agregar ambas instrucciones a la vez en el código.
Hola Karen,
Me temo que esto no es posible, al menos por bloques. Con código puedes encontrar algunas librerías que te pueden permitir hacer lo que buscas, pero por bloque no.
Saludos
pero entonces cual seria la escritura para tocar dos tonos a la ves como el caso de los tonos dtmf
A través de bloques no se puede conseguir generar tonos dtmf pero hay una librería específica que puedes utilizar con el IDE de Arduino. Te dejo enlace con la explicación: https://create.arduino.cc/projecthub/dilshan-jayakody/generate-dtmf-tones-only-using-arduino-7d3713
sí se puede hacer, porque te muestra todas las notas de todas las escalas, porque son los índices acústicos, y la clave de Fa es grave, entonces tienes que buscar por debajo de la 4ª escala.
Hola, se pueden generar sonidos de guitarra?
De manera directa no, pero utilizando un sintetizador o conectado a un ordenador si.
quisiera hacer una especie de teclado con una guitarra de ps2 y que suene como una guitarra real, o similar.
Tal y como te decía en un comentario anterior deberías poder conectar la guitarra a un sintetizador o a un ordenador si es USB. De manera independiente con Arduino es mucho más complicado y seguirías necesitando funciones de sintetizador. Hay librerías específicas de sintetizador para Arduino que podrían servirte.
Hola disculpa tengo una pequeña duda estoy haciendo un proyecto y quiero hacer un pequeño piano eléctrico y quiero saber como como hacer para cambiar de tonalidad como por ejemplo de tocar piano a guitarra o a órgano como en un teclado real es posible hacer eso?
Se puede hacer pero a través de un controlador MIDI, investiga por MIDI + Arduino y encontrarás cosas.
Una placa Arduino pude emitir por el mismo puerto dos notas a la vez con la función tone, algo tipo:
tone(11,243,100);
tone(11,654,100);
Necesitaría una respuesta lo antes posible,
Gracias
Hola,
A la vez no.
Saludos
Quisiera saber , ¿Como puedo programar 2 buzzers?, para que suenen al mismo tiempo pero con melodías diferentes.
Agradecería mucho si me pueden ayudar.
Hola Erik,
De momento con programación por bloques no vas a poder conseguir que 2 buzzers suenen al mismo tiempo, ya que utilizarían el mismo timer interno para conseguir la frecuencia deseada.
Sin embargo utilizando el IDE de Arduino para programar con código la placa si que hay disponible alguna librería que permite el uso de múltiples buzzers.
Saludos
Hola buen dia, quisiera saber cuales serian las instrucciones para que sonase unas tonalidades básicas en el buzzer pero con la versión de mblock5? le agradecería mucho,
Ya que toda la información que ustedes manejan solo esta con la versión anterior mblock3
Hola Wilson,
En mBlock5 tienes un bloque dentro del apartado “Pin” una vez has seleccionado el dispositivo Arduino llamado “toca nota” que te permite seleccionar la nota. Ya no está en notación anglosajona y puedes seleccionar de la nota “do” a “si” en varias escalas.
En la plataforma de cursos vas a empezar a ver los nuevos cursos con mBlock5 así como los retos de programación, pero hemos estado muchos años utilizando mBlock3.
Saludos
Hola. Me gustaría hacerle un libro musical a mi hijo. Había pensado que al pulsar, en vez de sonar notas, sonaran animales (archivos mp3 o wav) . Quizás fuera posible con algún reproductor SD y arduino. Soy novato pero sigo las explicaciones. Ojalá puedas ayudarme.
Hola José Ramón,
Me parece una muy buena idea y claro que se puede hacer. Hay disponibles reproductores MP3 como el que distribuye nuestro colaborador E-Ika que puedes controlar a través de Arduino.
Nosotros hemos utilizado el módulo Me Audio Player de Makeblock para crear reproducir voces con efecto de robot en mp3 y funciona muy bien. Lo puedes programar por bloques con una extensión para mBlock y ya lleva un pequeño circuito que amplifica el sonido suficiente para emitirlo por el altavoz incorporado. Creo que para tu proyecto sería ideal.
Además tiene un micrófono y se le puede dar la orden de grabar, y luego puedes reproducir el sonido grabado, que quizá también lo podrías incorporar como función dentro de tu proyecto de libro musical.
Saludos
Gracias amigo. He encontrado unos pulsadores que graban sonido y reproducen por unos 50 céntimos… sin hacer falta arruino , así que mejor que mejor. Gracias de nuevo
Genial José Ramón, mucho más sencillo así.
Podrías hacer el código de una marcha chilena militar que se llama el último de línea
Hola Juan,
Lo lamento pero no hacemos código a medida.
Inténtalo, seguro que puedes hacerlo, y si necesitas ayuda puedes apuntarte a nuestros cursos.
Saludos
hola dani,
como le puedo hacer si quiero poner varias “canciones ” diferentes en un mismo sketch para reproducirlas
Hola Pablo,
Dentro de un mismo programa puedes poner varias melodías a las que llames a través de diferentes condiciones como pulsadores o un mando a distancia. También puedes organizarlas en subprogramas o funciones, pero simplemente con condicionales podrías establecer la selección de la canción.
hola dani estoy trabajando en un proyecto de construir un auto ya programado con modulo L298n para que haga movimientos espesificos (perdon que no tenga que ver con el proyecto) no se si tuvieras un programa para arduino ya que lo he intentado como 50 veces y me da que esta equivocado.
Te agradeceria mucho que me ayudaras ?? sludos.
Hola Ángel Antonio,
No puedo prestarte ese tipo de ayuda. No creamos ni enviamos programas a medida.
En la plataforma tenemos un curso para programar un vehículo en Arduino con el L298n y que se pueda manejar por bluetooth si te pudiera interesar.
Saludos y siento no poder ser de más ayuda.
Hola Dani, quisiera tu ayuda, como coloco la negra y la blnca y todo eso?, para que sirven?, o sea puedo hacer la programación sin utilizar estos?
Las diferentes figuras tienen que ver con el tiempo en el que el sonido se está produciendo tal y como tienes en la tabla del artículo. Se trata de establecer una base de tiempo y fijar el tiempo de cada figura en relación a esa base de tiempo. Por ejemplo una blanca va a durar el doble de tiempo que una negra.
Si quieres que suene tal y como aparece en una partitura deberías programar esos tiempos tal y como se ve en el ejemplo del artículo con tone(pin, frecuencia, tiempo).
Hola, al compilar el código me da como error que falta la declaración de “notaActual”, como puedo solucionarlo?. Gracias.
vale, ya lo he identificado el error, lo había escrito mal
Si finalmente lo has solucionado, genial.
Muy buen post!.
Buena explicación gracias.
Podrías hacer un tutorial de una canción como la de Quevedo?
o enseñarme como hacer el código de esa canción, te lo agradecería bastaste
Si tienes la partitura no te será difícil convertir cualquier canción, no es necesario un tutorial por canción. Inténtalo y si tienes alguna duda concreta me preguntas y te intento ayudar.
gran aporte gracias
Hola Dani, me gustaría saber cómo puedo programar dos pulsadores para que uno ponga en marcha la canción y el otro la pare cuando yo quiera. És posible? De momento sólo lo puedo poner en marcha pero no para hasta que termina la canción. Gracias.
Hola,
Tendrías que hacer vigilancias de pulsación del botón de parar a lo largo de la propia melodía de manera que no suene si el botón obliga a salir de la rutina de melodía. Lo ideal sería poder utilizar interrupciones pero con bloques tendrás que hacer una “simulación” a través de condicionales.