Cómo reproducir cualquier música o música en Arduino

Cuando se trata de microcontroladores de uso general, nadie espera que realicen operaciones de software pesadas. Los microcontroladores son dispositivos simples que controlan dispositivos binarios y se comunican a través de interfaces serie. Nunca intente crear aplicaciones de audio/vídeo o multimedia en microcontroladores. En la mayoría de las situaciones resulta desafiante y poco práctico manejar cualquier tipo de multimedia a través de microcontroladores. Los microcontroladores no fueron diseñados sólo para esto.

A pesar de la incompetencia para aplicaciones como audio y/o video, vale la pena probar y experimentar con proyectos de audio y gráficos con microcontroladores. Ya hemos visto cómo Arduino puede generar audio digital en forma de notas musicales y melodías. ¿Arduino también puede reproducir música para nosotros? Bueno, Arduino no puede reproducir los archivos de audio por sí solo. Es posible reproducir archivos de audio en formato MP3 y WAVE mediante Arduino utilizando únicamente circuitos de conexión externos.

El Arduino interactúa muy bien con cualquier altavoz, directamente o mediante un circuito amplificador. Bien podría hacer que cualquier altavoz reproduzca música por sí solo. Entonces, ¿qué tan complejo podemos jugar en Arduino? No podemos cargar archivos de audio en Arduino. Su memoria y sistema de archivos no admiten esto. No podemos utilizar audio de código binario para el firmware de Arduino porque la memoria flash es limitada.

Así que sólo hay una forma de reproducir melodías musicales complejas en Arduino: streaming. En este proyecto, reproduciremos algunas canciones complejas multipista en Arduino, transmitiendo el contenido del archivo de audio a la placa. Transmitiremos melodías musicales para canciones multipista usando un script Python en una PC/Mac y dejaremos que Arduino las reproduzca en un altavoz.

El proyecto
En este proyecto, crearemos una aplicación Python para transmitir el contenido de un archivo de audio desde una computadora a un Arduino. La placa Arduino está programada para recibir la transmisión de audio en serie y reproducirla en el altavoz en tiempo real. De esta manera, tocaremos temas de películas populares como Misión: Imposible, Piratas del Caribe y Titanic en el Arduino. Siguiendo este proyecto, se pueden transmitir melodías de cualquier canción al Arduino.

Tenga en cuenta que la velocidad máxima en baudios para la comunicación serie en Arduino es 115200. La mayoría de los archivos de audio tienen una velocidad de bits más alta, como 192K. Esta es la razón por la que la música transmitida por Arduino puede no ser la misma que la que se escucha en computadoras, teléfonos y otros dispositivos multimedia.

Hay dos versiones de esta aplicación. En este proyecto, crearemos una versión adecuada para reproducir archivos de audio de una sola pista.

Componentes necesarios

  1. Arduino UNO/Mega x1
  2. Altavoz x1
  3. Cables de conexión/cables de puente
  4. Una computadora

Biblioteca MIDO Python
Estamos utilizando la biblioteca MIDO de Python para extraer contenido de archivos de audio. La biblioteca extraerá notas y duraciones de notas del formato de archivo de audio MIDI y transmitirá los valores al Arduino. Luego, Arduino buscará pares de valores que representan notas y duraciones de notas a través de un flujo de datos en serie continuo y reproducirá la melodía respectiva en tiempo real en un altavoz.

Instalación de la biblioteca MIDO
Para instalar la biblioteca MIDO en su PC o Mac, ejecute Terminal en Mac o Símbolo del sistema en Windows y ejecute el siguiente comando.
py -m pip instalar mido

El comando instalará la biblioteca mido. También instalará numpy como una dependencia si aún no está instalado en el sistema.

Inspeccionar archivos de audio mediante script Python
Comencemos escribiendo primero la aplicación de escritorio. La aplicación está escrita en Python y utiliza las bibliotecas MIDO y PySerial. La biblioteca MIDO decodifica archivos de audio y la biblioteca PySerial transmite datos de archivos de audio a Arduino a través de comunicación en serie. Necesitarás un archivo intermedio de la canción o canción que deseas reproducir. Puede descargar un archivo intermedio para su canción, tema o melodía favorita en línea, o convertir su canción/melodía favorita del formato MP3 al formato MID usando una herramienta en línea. Antes de escribir la aplicación principal, debemos inspeccionar el archivo de audio mediante scripts de Python.

Tocaremos el tema musical "He's Pirate" en el Arduino de este proyecto. El archivo MP3 de este tema musical se adjunta a continuación.

El archivo MID del tema musical descargado se adjunta a continuación.

(Enlace a poctheme.mid)

poctema

Coloque los dos archivos en una carpeta de proyecto y cree un archivo con el nombre "mido-single-track-inspection.py" en la misma carpeta. Escribiremos un script de Python para inspeccionar el archivo de audio en este archivo. Entonces se programará la aplicación principal.

Agregue el siguiente código al archivo “mido-single-track-inspection.py”.
importar mido
medio = mido.MidiFile('poctheme.mid', clip=True)
pistas intermedias
print(len(mitad.de.pistas))

Guarde y ejecute el script. Devolverá el número de pista del archivo de audio 'poctheme.mid'. Hay tres pistas en nuestro archivo de audio. Si está trabajando con un archivo de audio diferente, sustituya el nombre del archivo en el código anterior.

Ahora inspeccionemos el tamaño del contenido de cada pista. Ejecute el siguiente código en script Python para obtener el tamaño del contenido de las tres pistas.
importar mido
medio = mido.MidiFile('poctheme.mid', clip=True)
pistas intermedias
print(len(mid.pistas(0)))
print(len(mitad.pistas(1)))
print(len(mitad.pistas(2)))

Podemos ver nueve líneas en la pista 0, 1285 líneas en la pista 1 y 1557 líneas en la pista 2. Inspeccionemos el contenido de cada pista. Ejecute el siguiente código en el script Python para ver el contenido de la pista 0.

mensaje=
para m en el medio.pistas(0):
mensaje.append(str(m))
a m en el mensaje:
imprimir (m)

Como podemos ver en el volcado de pantalla anterior, la pista 0 solo tiene los metadatos relacionados con el archivo de audio.

Ejecute el siguiente código en el script Python para inspeccionar el contenido de track1.
mensaje=
para m en el medio.pistas(1):
mensaje.append(str(m))
a m en el mensaje:
imprimir(m)

Como puede ver en la captura de pantalla anterior, la pista 1 contiene los datos de audio. Después de la décima línea de la pista, están presentes datos de audio, como el estado de la nota, el canal, la nota, la velocidad y la duración de la nota.

Ejecute el siguiente código en el script Python para inspeccionar el contenido de track2.
mensaje=
para m en mid.tracks(2):
mensaje.append(str(m))
a m en el mensaje:
imprimir (m)

Como puedes ver en la pantalla, la pista 2 también contiene datos de audio, pero para un canal diferente. Hay dos canales ya que es audio estéreo. Los datos de audio de ambos canales se almacenan en el archivo de audio en pistas diferentes. Necesitamos extraer los datos de audio de estas pistas para transmitirlos al Arduino.

Tenga en cuenta que un archivo de audio puede tener varias pistas, cada una de las cuales contiene datos de audio para varios canales. Las pistas o canales pueden corresponder a cada instrumento tocado en la canción.

Trabajemos en la pista 1 del archivo de audio. Necesitamos extraer los datos de audio para la transmisión. Entonces, primero, eliminemos la metainformación almacenada en las primeras diez líneas de la pista 1. Tenga en cuenta que ya hemos colocado cada mensaje de la pista 1 en una lista de 'mensajes' de Python. Agregue el siguiente código para deshacerse de la metainformación de la pista.
para m en el rango (10):
del mensaje(0)

Ahora necesitamos volcar cada elemento de línea de seguimiento/mensaje individual en una matriz. Agregue el siguiente código para volcar cada atributo de los mensajes de la pista en una matriz.
matriz de calificaciones =
a m en el mensaje:
línea = m.split(” “)
notesmatrix.append(línea)

Con cada atributo de los mensajes de la pista 1 volcados en una matriz bidimensional, ahora podemos extraer todas las notas de la pista de audio en otra matriz usando el siguiente código.
notas =
para fila en matriz de calificaciones:
notas.append(línea(2).split(“=")(1))
imprimir (notas)

Las duraciones de las notas de todas las notas de la pista se pueden volcar en otra matriz usando el siguiente código.
notaciones =
para fila en la matriz de notas:
notaciones.append(line(4).split(“=")(1))
imprimir (duraciones anotadas)

Necesitamos extraer notas y duraciones de notas de la pista de audio para reproducir una melodía en el archivo de audio en Arduino. Dado que los datos de audio se transmitirán en serie y se reproducirán en tiempo real, cada nota debe ir seguida de la duración de la nota en los datos en serie. Por lo tanto, extraeremos pares de notas y sus respectivas duraciones de notas en una matriz diferente, de modo que Arduino reproducirá inmediatamente cada nota al recibir pares de notas y valores de duración de notas en tiempo real. El siguiente código almacena cada nota seguida de la duración de la nota respectiva en una matriz.
notas musicales =
para fila en matriz de calificaciones:
notas musicales.append(line(2).split(“=”)(1))
notas musicales.append(line(4).split(“=")(1))
imprimir (notas musicales)

Finalmente, tenemos los datos de audio de la pista 1 volcados en una matriz. Sólo necesitamos transmitir el contenido de la matriz en serie al Arduino para reproducir una canción.

El script de Python “audio-single-track-inspection.py” para inspeccionar el archivo de audio “poctheme.mid” finalmente tiene el siguiente código.

La aplicación de escritorio
Después de inspeccionar el archivo de audio, ahora podemos escribir el código de la aplicación principal que extrae datos de audio de la pista 1 del archivo y los transmite en serie al Arduino. Antes de eso, conecte el Arduino a su computadora y verifique el número de puerto al que está conectado. En nuestro caso, el Arduino se conecta al COM6. Cree un nuevo archivo de secuencia de comandos de Python y asígnele el nombre 'python-audio-streaming.py'. Agregue el siguiente código al archivo de script.

El script anterior es nuestra aplicación de escritorio principal para transmitir pistas de audio a Arduino. Utiliza la biblioteca MIDO para extraer datos de audio de una pista del archivo de audio y la biblioteca PySerial para transmitir los datos en serie al Arduino. Si no tiene instalada la biblioteca Pyserial, instálela ejecutando el siguiente comando en Terminal/Símbolo del sistema.
py -m pip instalar pyserial

Conexiones de circuito
Necesitamos preparar nuestro Arduino para recibir la transmisión de audio y reproducirla en un altavoz. Conecte el Arduino a la computadora y conecte un altavoz directamente al Arduino. El altavoz utilizado en este proyecto es un altavoz de 3 pulgadas, 4 ohmios y 50 vatios que no requiere ningún circuito amplificador para generar un sonido audible. El altavoz tiene dos terminales. Conecte un terminal al pin de tierra de Arduino y el otro terminal a cualquier GPIO. Aquí el otro terminal está conectado al pin D8 de Arduino UNO.

Bosquejo de Arduino
Después de realizar las conexiones del circuito, cargue el siguiente boceto en Arduino.

El boceto lee un par de bytes de datos en serie, como una nota y la duración de la nota, y envía la nota al hablante inmediatamente. De esta manera, mientras recibe transmisiones de audio, Arduino reproduce la transmisión en un altavoz en tiempo real.

Como funciona
El script Python 'python-audio-streaming' del escritorio toma un archivo de audio y extrae los datos de audio de una de sus pistas. Los datos de audio se transmiten a través de comunicación en serie al Arduino como valores de pares de notas y duraciones de notas. El Arduino recibe información sobre notas y duraciones de notas a través de un flujo de datos en serie desde la computadora. Utiliza datos de transmisión para reproducir notas musicales a través de un altavoz en tiempo real.

Cómo probar el proyecto
Después de escribir la aplicación de escritorio, 'python-audio-streaming', realizar las conexiones del circuito para Arduino y cargar un boceto en la placa Arduino, tendrá el Arduino conectado a la computadora. En su computadora, ejecute el script Python 'python-audio-streaming' e inmediatamente Arduino comenzará a reproducir la melodía de la canción en el altavoz. Los datos de audio transmitidos se pueden ver en la consola Python.

Resultados

Conclusión
Podemos reproducir melodías para cualquier canción en Arduino transmitiéndole los datos de audio. Es imposible cargar un archivo de audio al sistema de archivos Arduino. También es imposible escribir datos de audio en su firmware debido a la memoria limitada del microcontrolador. En tales casos, se pueden reproducir melodías musicales largas y complejas en el Arduino transmitiéndole los datos de audio. Luego, Arduino reproduce la transmisión de audio en tiempo real. La música reproducida tendrá una tasa de bits más baja que el archivo de audio original, ya que la velocidad de transmisión máxima de la ONU está limitada a 115.200 bps. En este proyecto, creamos un script de Python para descifrar archivos de audio y transmitir el contenido de audio de una de sus pistas al Arduino. El Arduino sólo puede reproducir un tono a la vez. Por lo tanto, es posible que la melodía reproducida por Arduino no sea exactamente la misma que la que se escucha al reproducir el archivo de audio original. Aún así, si el archivo de audio tiene una sola pista o una pista destacada, la melodía reproducida por Arduino coincidirá aproximadamente con el audio MP3 original.

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.