Como tocar qualquer música ou música no Arduino

Quando se trata de microcontroladores de uso geral, ninguém espera que eles executem operações pesadas de software. Microcontroladores são dispositivos simples que controlam dispositivos binários e se comunicam por meio de interfaces seriais. Nunca se tenta construir aplicações de áudio/vídeo ou multimídia em microcontroladores. É desafiador e inviável na maioria das situações lidar com qualquer tipo de multimídia através de microcontroladores. Os microcontroladores não foram projetados apenas para isso.

Apesar da incompetência para aplicações como áudio e/ou vídeo, vale a pena tentar e experimentar projetos de áudio e gráficos com microcontroladores. Já vimos como o Arduino pode gerar áudio digital na forma de notas musicais e melodias. O Arduino também pode tocar música para nós? Bem, o Arduino é incapaz de reproduzir os arquivos de áudio sozinho. É possível reproduzir arquivos de áudio no formato MP3 e WAVE pelo Arduino usando apenas circuitos breakout externos.

O Arduino interage muito bem com qualquer alto-falante, diretamente ou por meio de um circuito amplificador. Ele pode muito bem fazer com que qualquer alto-falante reproduza músicas por conta própria. Então, quão complexas podemos tocar no Arduino. Não podemos carregar arquivos de áudio no Arduino. Sua memória e sistema de arquivos não suportam isso. Não podemos usar áudio de código binário para firmware do Arduino porque a memória flash é limitada.

Então, só há uma maneira de tocar melodias musicais complexas no Arduino: por streaming. Neste projeto, tocaremos algumas músicas complexas e envolvendo múltiplas faixas no Arduino, transmitindo o conteúdo do arquivo de áudio para a placa. Transmitiremos melodias musicais para músicas com várias faixas usando um script Python em um PC/Mac e deixaremos o Arduino reproduzi-las em um alto-falante.

O projeto
Neste projeto, construiremos um aplicativo Python para transmitir o conteúdo de um arquivo de áudio de um computador para um Arduino. A placa Arduino está programada para receber o fluxo de áudio serialmente e reproduzi-lo no alto-falante em tempo real. Dessa forma, tocaremos músicas-tema de filmes populares como Missão Impossível, Piratas do Caribe e Titanic no Arduino. Seguindo este projeto, melodias de qualquer música podem ser transmitidas para o Arduino.

Observe que a taxa de transmissão máxima para comunicação serial no Arduino é 115200. A maioria dos arquivos de áudio tem uma taxa de bits mais alta, como 192K. É por isso que a música transmitida no Arduino pode não ser a mesma que a experimentada em computadores, telefones e outros dispositivos multimídia.

Existem duas versões deste aplicativo. Neste projeto, construiremos uma versão adequada para reproduzir arquivos de áudio de faixa única.

Componentes necessários

  1. Arduino UNO/Mega x1
  2. Alto-falante x1
  3. Conectando fios/fios de jumper
  4. Um computador

Biblioteca MIDO Python
Estamos usando a biblioteca MIDO do Python para extrair conteúdo de arquivos de áudio. A biblioteca extrairá notas e durações de notas do formato de arquivo de áudio MIDI e transmitirá os valores para o Arduino. O Arduino irá então buscar pares de valores representando notas e durações de notas através de um fluxo serial contínuo de dados e tocar a respectiva melodia em tempo real em um alto-falante.

Instalando a biblioteca MIDO
Para instalar a biblioteca MIDO em seu PC ou Mac, execute Terminal no Mac ou Prompt de Comando no Windows e execute o seguinte comando.
py -m pip instalar mido

O comando instalará a biblioteca mido. Ele também instalará o numpy como uma dependência, se ainda não estiver instalado no sistema.

Inspecionando o arquivo de áudio por script Python
Vamos começar escrevendo o aplicativo de desktop primeiro. O aplicativo é escrito em Python e utiliza as bibliotecas MIDO e PySerial. A biblioteca MIDO decodifica arquivos de áudio e a biblioteca PySerial transmite dados de arquivos de áudio para o Arduino por meio de comunicação serial. Você precisará de um arquivo intermediário da música ou música que deseja reproduzir. Você pode baixar um arquivo intermediário para sua música, tema ou melodia favorita online ou converter sua música/melodia favorita do formato MP3 para o formato MID usando uma ferramenta online. Antes de escrever o aplicativo principal, precisamos inspecionar o arquivo de áudio por meio de scripts Python.

Tocaremos a música tema “He's Pirate” no Arduino neste projeto. O arquivo MP3 desta música tema está anexado abaixo.

O arquivo MID da música tema baixada está anexado abaixo.

(Link para poctheme.mid)

poctema

Coloque os dois arquivos em uma pasta do projeto e crie um arquivo com o nome “mido-single-track-inspection.py” na mesma pasta. Escreveremos um script Python para inspecionar o arquivo de áudio neste arquivo. Assim, o aplicativo principal será programado.

Adicione o seguinte código ao arquivo “mido-single-track-inspection.py”.
importar mido
mid = mido.MidiFile('poctheme.mid', clip=True)
mid.tracks
imprimir(len(mid.tracks))

Salve e execute o script. Ele retornará o número de faixas do arquivo de áudio 'poctheme.mid'. Existem três faixas em nosso arquivo de áudio. Se você estiver trabalhando com um arquivo de áudio diferente, substitua o nome do arquivo no código acima.

Vamos agora inspecionar o tamanho do conteúdo de cada faixa. Execute o código a seguir em script Python para obter o tamanho do conteúdo de todas as três faixas.
importar mido
mid = mido.MidiFile('poctheme.mid', clip=True)
mid.tracks
imprimir(len(mid.tracks(0)))
imprimir(len(mid.tracks(1)))
imprimir(len(mid.tracks(2)))

Podemos ver nove linhas na trilha 0, 1.285 linhas na trilha 1 e 1.557 linhas na trilha 2. Vamos inspecionar o conteúdo de cada trilha. Execute o código a seguir no script Python para visualizar o conteúdo da faixa 0.

mensagem=
para m no meio.tracks(0):
mensagem.append(str(m))
para m em mensagem:
imprimir (m)

Como podemos ver no dump da tela acima, a faixa 0 possui apenas os metadados relacionados ao arquivo de áudio.

Execute o código a seguir no script Python para inspecionar o conteúdo de track1.
mensagem=
para m no meio.tracks(1):
mensagem.append(str(m))
para m em mensagem:
imprimir(m)

Como você pode ver na tela acima, a faixa 1 contém os dados de áudio. Após a 10ª linha da trilha, os dados de áudio estão presentes como status da nota, canal, nota, velocidade e duração da nota.

Execute o seguinte código no script Python para inspecionar o conteúdo de track2.
mensagem=
para m em mid.tracks(2):
mensagem.append(str(m))
para m em mensagem:
imprimir (m)

Como você pode ver na tela, a faixa 2 também contém dados de áudio, mas para um canal diferente. Existem dois canais, pois este é um áudio estéreo. Os dados de áudio de ambos os canais são armazenados no arquivo de áudio em trilhas diferentes. Precisamos extrair os dados de áudio dessas trilhas para transmitir para o Arduino.

Observe que um arquivo de áudio pode ter diversas trilhas, cada uma com dados de áudio para diversos canais. Faixas ou canais podem corresponder a cada instrumento tocado na música.

Vamos trabalhar na faixa 1 do arquivo de áudio. Precisamos extrair os dados de áudio para streaming. Então, primeiro, vamos eliminar as metainformações armazenadas nas primeiras dez linhas da faixa 1. Observe que já descartamos cada mensagem da faixa 1 em uma lista Python 'msg'. Adicione o código a seguir para se livrar das metainformações da faixa.
para m no intervalo (10):
del mensagem(0)

Agora, precisamos despejar cada elemento individual da mensagem/linha da faixa em um array. Adicione o código a seguir para despejar cada atributo das mensagens da faixa em um array.
matriz de notas =
para m em mensagem:
linha = m.split(” “)
notasmatrix.append(linha)

Com cada atributo das mensagens da faixa 1 despejado em um array bidimensional, agora podemos extrair todas as notas da trilha de áudio em outro array usando o código a seguir.
notas =
para linha na matriz de notas:
notas.append(linha(2).split(“=”)(1))
imprimir (notas)

As durações das notas de todas as notas da faixa podem ser despejadas em outro array usando o código a seguir.
notações =
para linha na matriz de notas:
notações.append(linha(4).split(“=”)(1))
print(notadasdurações)

Precisamos extrair notas e durações de notas da trilha de áudio para tocar uma melodia para o arquivo de áudio no Arduino. Como os dados de áudio serão transmitidos em série e reproduzidos em tempo real, cada nota deve ser seguida pela duração da nota nos dados seriais. Portanto, extrairemos pares de notas e respectivas durações de notas em um array diferente, para que o Arduino reproduza imediatamente cada nota ao receber pares de notas e valores de duração de notas em tempo real. O código a seguir armazena cada nota seguida pela respectiva duração da nota em uma matriz.
notas musicais =
para linha na matriz de notas:
notas musicais.append(linha(2).split(“=”)(1))
notas musicais.append(linha(4).split(“=”)(1))
imprimir (notas musicais)

Finalmente, temos os dados de áudio da faixa 1 despejados em um array. Precisamos apenas transmitir o conteúdo do array serialmente para o Arduino para tocar uma música.

O script Python “audio-single-track-inspection.py” para inspecionar o arquivo de áudio “poctheme.mid” finalmente possui o seguinte código.

O aplicativo de desktop
Depois de inspecionar o arquivo de áudio, podemos agora escrever o código principal do aplicativo que extrai dados de áudio da trilha 1 do arquivo e transmiti-los serialmente para o Arduino. Antes disso, conecte o Arduino ao seu computador e verifique o número da porta à qual ele está conectado. No nosso caso, o Arduino se conecta ao COM6. Crie um novo arquivo de script Python e nomeie-o como 'python-audio-streaming.py'. Adicione o seguinte código ao arquivo de script.

O script acima é nosso principal aplicativo de desktop para streaming de faixas de áudio para o Arduino. Ele usa a biblioteca MIDO para extrair dados de áudio de uma trilha do arquivo de áudio e a biblioteca PySerial para transmitir os dados serialmente para o Arduino. Se você não tiver a biblioteca Pyserial instalada, instale a biblioteca executando o seguinte comando no Terminal/Prompt de Comando.
py -m pip instalar pyserial

Conexões de circuito
Precisamos preparar nosso Arduino para receber o fluxo de áudio e reproduzi-lo em um alto-falante. Conecte o Arduino ao computador e conecte um alto-falante diretamente ao Arduino. O alto-falante usado neste projeto é um alto-falante de 4 ohm e 50 Watts de 3 polegadas que não requer nenhum circuito amplificador para gerar som audível. O alto-falante possui dois terminais. Conecte um terminal ao pino terra do Arduino e o outro terminal a qualquer GPIO. Aqui, o outro terminal está conectado ao pino D8 do Arduino UNO.

Esboço do Arduino
Depois de fazer as conexões do circuito, carregue o seguinte esboço no Arduino.

O sketch lê um par de bytes dos dados seriais como uma nota e duração da nota e gera a nota no alto-falante imediatamente. Dessa forma, enquanto ele recebe fluxos de áudio, o fluxo é tocado em um alto-falante pelo Arduino em tempo real.

Como funciona
O script Python 'python-audio-streaming' na área de trabalho pega um arquivo de áudio e extrai os dados de áudio de uma de suas faixas. Os dados de áudio são transmitidos por comunicação serial para o Arduino como valores de pares de notas e duração de notas. O Arduino recebe informações sobre notas e durações das notas através de um fluxo de dados serial do computador. Ele usa dados de fluxo para reproduzir notas musicais em um alto-falante em tempo real.

Como testar o projeto
Após escrever o aplicativo desktop – 'python-audio-streaming', fazer conexões de circuito para Arduino e carregar um esboço para a placa Arduino, você tem o Arduino conectado ao computador. No seu computador, execute o script Python 'python-audio-streaming' e imediatamente o Arduino começará a tocar a melodia da música no alto-falante. Os dados de áudio transmitidos podem ser visualizados no console Python.

Resultados

Conclusão
Podemos tocar melodias para qualquer música no Arduino, transmitindo os dados de áudio para ele. Carregar um arquivo de áudio para o sistema de arquivos do Arduino é impossível. Também é impossível gravar dados de áudio em seu firmware devido à memória limitada do microcontrolador. Nesses casos, melodias musicais longas e complexas podem ser tocadas no Arduino transmitindo os dados de áudio para ele. O fluxo de áudio é então reproduzido em tempo real pelo Arduino. A música tocada terá uma taxa de bits menor que o arquivo de áudio original, pois a taxa de transmissão máxima do UNO é limitada a 115.200 bps. Neste projeto, construímos um script Python para decifrar arquivos de áudio e transmitir o conteúdo de áudio de uma de suas trilhas para o Arduino. O Arduino pode tocar apenas um tom por vez. Portanto, a melodia tocada pelo Arduino pode não ser exatamente igual à experimentada ao reproduzir o arquivo de áudio original. Ainda assim, se o arquivo de áudio tiver uma única faixa ou uma faixa proeminente, a melodia tocada pelo Arduino corresponderá aproximadamente ao áudio MP3 original.

Related Content

Back to blog

Leave a comment

Please note, comments need to be approved before they are published.