Generando sonidos en Arduino a partir de pentagramas

5
3901
Con Arduino se puede llevar a cabo una infinita cantidad de proyectos. Esta vez estaré explicando lo que se necesita hacer para transformar notas musicales desde un pentagrama hasta un programa que, al ser ejecutado nos permitirá generar sonidos en Arduino.

Los proyectos que trabajan generando sonidos en Arduino son muy interesantes. Antes de entrar en materia me gustaría explicar un poco acerca de lo que son las notas musicales. Las notas que la mayor parte de nosotros conocemos (do, re, mi, fa, sol, la si) no son nada más que vibraciones a diferentes frecuencias.

Cuando tenemos una bocina, en su interior se encuentra una bobina que está envuelta en un campo magnético provocado por un imán natural.

Sonidos en Arduino

 Las bobinas son inductores. El comportamiento de un inductor, ante una señal de corriente directa es el de un corto circuito, lo que no produce sonido alguno. Sin embargo, si se hace variar la corriente de alimentación en el tiempo, la bobina crea un campo magnético variable. Esto genera una fuerza que empuja una membrana, la cual hace vibrar el aire. El oído de los seres humanos capta dichas vibraciones y las interpreta como sonidos.

Al variar la frecuencia de dicha vibración, somos capaces de distinguir diferentes tonos. Si se crea una armonía entre las vibraciones y se producen de manera secuencial se produce lo que conocemos como música.

Cada nota musical posee su propia frecuencia, como se puede apreciar en la siguiente imagen:

Sonidos en Arduino

Pero, ¿cómo se relaciona esto con Arduino?

Para generar sonidos con Arduino lo primero que necesitamos es una bocina. Se sabe que una bocina produce sonido cuando se alimenta con corriente variable en el tiempo. Con Arduino no es posible reproducir música per se, sino generar tonos por medio de una onda cuadrada. Las notas generadas por onda cuadrada son un poco chillonas, pero para nuestros propósitos son más que útiles.

En el siguiente diagrama se muestra como se genera una onda cuadrada con Arduino.

Sonidos en Arduino

El tiempo que duran los estados HIGH y LOW son lo importante aquí. La frecuencia, por definición, es el inverso del tiempo, por lo que modificando los tiempos que duran los estados HIGH y LOW es como se obtienen las notas musicales.

Veamos un ejemplo. La nota DO central tiene una frecuencia de 261.63 Hz según lo que se muestra en la imagen de la parte superior. Si se invierte dicha frecuencia se obtiene un tiempo de 0.003822, o lo mismo que 3.882 milisegundos. Cómo lograremos un delay de 3.882 milisegundos si no es posible introducir un número con decimales en el parámetro de la función delay()?

Pues para generar el tono DO, el código quedaría mas o menos así:

 

Se ha utilizado la función delayMicroseconds con la cual se puede lograr un “delay decimal”. La parte entera del tiempo se trabaja con el delay normal y la parte decimal con delayMicroseconds.

Ahora se conecta el circuito con la bocina a Arduino.

Sonidos en Arduino
ATENCIÓN: Esta conexión solo se puede hacer si la bocina es pequeña y no requiere de mucha potencia. Si se trata de una bocina >3W se debe usar un BJT o un FET para alimentar la bocina por medio de una fuente externa de voltaje. La resistencia debe ser un valor pequeño, preferiblemente <150 Ohms.

Si se utiliza un afinador digital, como los que se encuentran disponibles en muchos celulares Android o aquellos que poseen los que ejecutan instrumentos musicales, se podrá comprobar que efectivamente, la nota registrada por el aparato será Do.

Ahora solo hay que empezar a modificar las frecuencias para componer música… Si, claro.

Esto sería muy complicado ya que por cada nota habría que escribir 7 u 8 comandos. Recordemos que la duración de la nota es importante, por lo que hay que “meter” la onda cuadrada en un ciclo While que nos permita darle la elongación necesaria.

Esto hará que la nota dure medio segundo, lo que en mi diseño equivale a un tiempo de negra.

Imaginen pasar horas y horas tratando de trascribir un pentagrama a código de Arduino. Yo no lo haría. De hecho, no lo hice. Decidí hacer una pequeña composición musical, que quiero compartir con ustedes.

Que tiempos aquellos… Horas y horas “birreando” Mario Bros, cuando lo único que importaba en la vida era pasar todos los “mundos”. En fin… no logré que Arduino reproduzca más allá de ese punto donde se corta la canción. Probablemente el código es demasiado extenso, pero aún así se logra apreciar el resultado.

¿Cómo lo logré? Diseñé un programa en Java que transforma las notas de un pentagrama a código Arduino.

Sonidos en Arduino

¿Cómo funciona? Tomé un pentagrama donde está la canción de Mario y la traduje a nuestro propio lenguaje. Sonidos en Arduino

La primera nota musical del pentagrama es un Mi de la quinta octava en tiempo de corchea. Lo mismo es la segunda.

La nomenclatura que utilicé es la siguiente:

cE5cE5

Esto significa: (Tiempo de corchea)(Mi)(Quinta octava).

En el programa propuesto, las letras tienen significados:

Notas Musicales

C

Do

D

Re

E

Mi

F

Fa

G

Sol

A

La

B

Si

Tiempos

r

Redonda

b

Blanca

n

Negra

c

Corchea

x

Semi corchea

f

Fusa

y

Semi fusa

Otros

S

silencio

p

Puntillo

s

Tono sostenido

Un ejemplo de un Do sostenido de la quinta octava, negra con puntillo:

npCs5 (negra)(puntillo)(Do)(sostenido)(quinta escala)

NOTA: no he incluido los bemoles en mi programa, por lo que es necesario hacer cambios, por ejemplo, de si bemol a la sostenido. Es exactamente el mismo tono, solo cambia la nomenclatura.

Debo advertir que hay una serie de cosas que  mi programa aún no contempla. Ciertamente no tengo interés en llevar adelante un proyecto de este tipo, pero estoy seguro que habrá quienes se interesen por él y estén dispuestos a mejorarlo, agregarle más posibilidades (estacatos, etc) y volverlo más eficiente. Por ahora funciona muy bien y cumple su función principal.

Les dejo de muestra las notas del tema de Mario Bros, traducidas a mi idioma (no está completo).

 

El proyecto de Netbeans lo pueden descargar del siguiente enlace:

Descargar NotesGenerator

Por último, les dejo este video donde explico cómo utilizar el programa:

El proyecto también es capaz de exportar el código a un Archivo .ino, lo que lo hace directamente ejecutable desde Arduino IDE.

Espero que la información suministrada sea de su completo agrado y comprensión.

Saludos.