Código de Pesquisa

IA escreve uma música e este ESP32 ensina você a tocá-la

IA escreve uma música e este ESP32 ensina você a tocá-la

Peça a uma IA para escrever uma melodia, ouça-a tocar e deixe o teclado ensinar você a tocá-la

Escolha um clima, toque em ESCREVER, e uma IA compõe uma melodia curta. O teclado a toca, acendendo cada tecla enquanto avança. Depois toque em APRENDER e ele se transforma em um professor: ele acende uma tecla de cada vez e espera você pressioná-la, nota por nota, até que você tenha tocado a melodia inteira sozinho.

922-Este é o Artigo de Música com IA (o artigo atual)

923-O projeto do Piano está aqui.

Ele continua sendo um piano completo de 21 teclas a qualquer momento - apenas toque.

Compositor e Professor de Música com IA rodando na placa MaTouch AI ESP32-S3
Compositor e Professor de Música com IA rodando na placa MaTouch AI ESP32-S3

A tela

A tela principal do Música com IA no MaTouch AI ESP32-S3, mostrando os seis botões
A tela principal do Música com IA no MaTouch AI ESP32-S3, mostrando os seis botões

Seis botões na parte superior, depois um teclado de 21 teclas - três fileiras de sete, de C3 a B5. Diferente do projeto do piano, não há layout preto e branco aqui, porque a IA está restrita às sete notas naturais e a grade é como essas notas se parecem.

Botão O que faz
ESTILO Alterna o clima: FELIZ, TRISTE, ASSUSTADOR, FOLCLÓRICO, CANÇÃO DE NINAR. Isso é o que é enviado para a IA.
ESCREVER Pede à IA uma melodia nesse clima. Mostra AGUARDE enquanto ela pensa, depois toca o que voltou.
TOCAR Reproduz a melodia atualmente carregada. Toque novamente para parar.
APRENDER Modo de ensino - acende uma tecla e espera por você.
ONDA Cor do tom: SUAVE, ÓRGÃO ou BRILHANTE.
VOL Toque para aumentar o volume de 1 a 5. O rótulo mostra o nível.

O volume com o qual a placa inicia é definido por #define VOLUME perto do topo do sketch, então você pode compilar no nível que preferir e ainda alterá-lo ao vivo.

O que a IA realmente gera

Esta é a parte que vale a pena ser precisa, porque é fácil exagerar. A IA não gera áudio. Produzir uma forma de onda real exige um modelo grande e uma placa gráfica; nenhum microcontrolador está fazendo isso, e qualquer um que afirme o contrário está tocando um arquivo renderizado em outro lugar.

O que ela gera é uma lista de notas, como texto comum:

[{"n":"C4","ms":300},{"n":"E4","ms":300},{"n":"G4","ms":600}]

A placa analisa isso com ArduinoJson e toca usando o mesmo sintetizador do projeto do piano. Uma solicitação de texto curta custa uma fração de centavo, e uma vez que uma melodia chega, ela pode ser reproduzida para sempre com a internet desconectada.

makerfabs_ESP32S3_cam_music_screen-10-

Por que o prompt restringe a IA

A solicitação diz ao modelo que ele só pode usar as 21 notas que existem fisicamente neste teclado - notas naturais de C3 a B5, sem sustenidos ou bemóis. Isso não é uma limitação do sintetizador, que pode tocar qualquer frequência. Está lá por dois bons motivos:

  • cada nota que ele escreve é uma que o modo APRENDER pode realmente ensinar a você, porque há uma tecla para ela
  • permanecer em uma tonalidade significa que o resultado sempre soa musical, mesmo quando o modelo está tendo um dia sem inspiração

Analisando uma resposta de um modelo de linguagem

Modelos gostam de ser úteis, o que aqui significa envolver a resposta em cercas de markdown e adicionar uma frase amigável sobre o que escreveram. O sketch pede firmemente JSON puro e depois, defensivamente, pega tudo entre o primeiro [ e o último ] de qualquer forma. Qualquer nota que ele não conseguir colocar no teclado é ignorada, e o resultado só é aceito se pelo menos quatro notas utilizáveis sobreviverem. Ser tolerante com saída imperfeita é a maior parte do trabalho em qualquer projeto que analisa texto de IA.

A resposta vazia e como evitá-la

Uma coisa vai te pegar de surpresa se você mudar o modelo ou o prompt. O DeepSeek raciocina antes de responder, e esse pensamento é cobrado do mesmo orçamento de max_tokens que a resposta. Peça algo difícil e ele pode gastar todo o orçamento pensando, e então retornar uma resposta vazia - uma solicitação bem-sucedida que não contém nada.

Neste projeto, isso apareceu como os modos mais difíceis falhando enquanto os fáceis funcionavam. SPOOKY e LULLABY querem um tom menor, o que é genuinamente difícil quando cada sustenido e bemol é proibido, então o modelo deliberou - e ficou sem orçamento. HAPPY em Dó maior respondeu imediatamente.

Existem duas correções e este esboço usa ambas. A solicitação envia "thinking": {"type": "disabled"}, que desativa o raciocínio completamente para que todo o orçamento vá para a resposta e a resposta volte muito mais rápido. E o prompt agora diz ao modelo como soar menor sem sustenidos - centralize a melodia em Lá ou Mi, que usa as mesmas notas.

O modo de ensino

Toque em LEARN e uma tecla fica verde. Pressione-a e o painel avança para a próxima nota. Pressione a tecla errada e ela ainda soa - é um piano, afinal - mas não avança. A barra de status conta seu progresso, e quando você chega ao final, ela avisa.

Não há pressão de tempo nem pontuação. Ele espera por você o tempo que precisar, o que o torna genuinamente útil para aprender uma frase musical em vez de apenas uma novidade.

Modo LEARN no MaTouch AI ESP32-S3 - uma tecla acesa, esperando para ser pressionada
Modo LEARN no MaTouch AI ESP32-S3 - uma tecla acesa, esperando para ser pressionada

Funciona também sem WiFi

Uma melodia está embutida no esboço, então PLAY e LEARN funcionam sem nenhuma rede. Apenas WRITE precisa da internet - e precisa apenas de uma chave DeepSeek. Nenhuma conta Azure ou OpenAI é necessária para este projeto.

Ao testar, toque em PLAY primeiro: isso confirma o caminho de áudio e o teclado antes de qualquer rede estar envolvida, então se WRITE falhar depois, você já sabe onde procurar.

Reproduzindo uma melodia com o roteador desligado - ela agora vive no painel
Reproduzindo uma melodia com o roteador desligado - ela agora vive no painel

Ideias para levar adiante

  • Peça uma melodia "no estilo de uma cantiga de marinheiro" editando a lista de estilos.
  • Peça para escrever uma segunda frase que responda à primeira.
  • Salve as melodias no cartão SD para que o painel construa um cancioneiro ao longo do tempo.
  • Adicione os microfones do projeto de assistente de voz para que você possa falar a solicitação em vez de tocar em um preset.

Sobre o painel MaTouch AI ESP32-S3 2.8"

Cada projeto nesta página roda no MaTouch AI ESP32-S3 2.8" TFT ST7789V da Makerfabs. É um painel tudo-em-um: uma tela de toque colorida, uma câmera de 3 megapixels, dois microfones e um amplificador de alto-falante real, tudo dirigido por um ESP32-S3 com 8 MB de PSRAM. Essa combinação é o que torna esses projetos de IA possíveis em um único painel sem mais nada conectado.

Os 8 MB de PSRAM importam mais do que qualquer outro número aqui. É o que permite que o painel segure um quadro de câmera, alguns segundos de áudio gravado ou uma foto codificada em base64 na memória ao mesmo tempo - nada disso cabe na RAM normal do ESP32’s.

Documentação do fabricante: Página wiki da Makerfabs.

Cada outro projeto para este painel - a câmera, reconhecimento facial offline, o assistente de voz de IA, visão de IA e o projeto de desenho - tem seu próprio tutorial. Links para todos eles estão abaixo deste artigo.

Especificações principais

  • Processador: ESP32-S3, dual core 240 MHz, WiFi 2.4 GHz + Bluetooth 5.0
  • Memória: 16 MB flash, 8 MB PSRAM (necessário para quase todos os projetos aqui)
  • Display: 2.8" IPS, 320×240, driver ST7789V, SPI
  • Toque: GT911 capacitivo, rastreia 5 dedos ao mesmo tempo
  • Câmera: OV3660, 3 megapixels, até 2048×1536
  • Microfones: dois microfones digitais I2S INMP441 (um par estéreo genuíno)
  • Alto-falante: amplificador classe-D MAX98357A, 3.2 W em 4 Ω
  • Armazenamento: slot para cartão microSD (modo SPI)
  • Alimentação: USB-C, conector de bateria JST, carregador TP4056, interruptor de energia
  • Também no painel: LED RGB WS2812B, relógio de tempo real com bateria PCF8563T, e um medidor de bateria MAX17048 que não está listado nas especificações oficiais

Alimentando-o por bateria? Os dois soquetes USB-C, o carregador TP4056 e o interruptor de energia são explicados em detalhes, com o esquema, em o artigo de teste da placa — incluindo qual soquete carrega e se o interruptor deve estar ligado ou desligado.

Configurações do Arduino IDE

Essas configurações são importantes. A maioria dos problemas que as pessoas relatam com esta placa é uma delas estar errada, e elas são redefinidas quando você muda a versão do núcleo, então verifique-as novamente após qualquer alteração.

Configuração Valor
Placa ESP32S3 Dev Module
Versão do núcleo ESP32 2.0.17
PSRAM OPI PSRAM
Tamanho da Flash 16MB (128Mb)
Esquema de Partição 16M Flash (3MB APP/9.9MB FATFS)
USB CDC On Boot Disabled
Velocidade de Upload 921600
Apagar Toda a Flash Antes do Upload Disabled
Porta a porta USB-C CH340K

Se o upload falhar: colocando a placa no modo de download manualmente

Na maioria das vezes você apenas pressiona Upload e funciona. Às vezes não funciona - o IDE fica em Connecting...... e então desiste com Failed to connect to ESP32-S3: No serial data received.

Isso acontece porque IO0 faz três trabalhos nesta placa ao mesmo tempo: é o botão BOOT, é a linha de reset automático do CH340K e é a linha de dados para o LED RGB. Quando o sketch já em execução na placa está acionando esse LED, ele pode lutar contra o reset automático, então o chip reinicia no seu sketch antigo em vez de no bootloader.

A correção leva cinco segundos. Coloque-o no modo de download você mesmo:

  1. Pressione e segure o botão BOOT.
  2. Enquanto ainda segura BOOT, pressione RESET e solte RESET.
  3. Agora solte BOOT. A tela fica em branco - é o bootloader esperando.
  4. Clique em Upload.
  5. Quando terminar, pressione RESET uma vez para executar o novo sketch.

Se ainda não conectar, reduza Upload Speed para 115200 e tente novamente. E verifique se o interruptor de energia da placa está ligado - o CH340K enumera e dá a você uma porta COM mesmo quando a própria placa está desligada, o que engana as pessoas.

Bibliotecas necessárias

Este projeto precisa de todas as bibliotecas na tabela abaixo - nada mais, nada menos. A maioria instala diretamente de Tools → Manage Libraries no Arduino IDE, mas a GFX Library for Arduino tem que ser instalada de um arquivo ZIP. Os números de versão são importantes, então use exatamente os listados.

Biblioteca Versão Autor Instalar de
GFX Library for Arduino 1.5.6 moononournation Arquivo ZIP - veja abaixo
bb_captouch 1.3.1 Larry Bank Gerenciador de Bibliotecas
ArduinoJson 7.x Benoit Blanchon Gerenciador de Bibliotecas
Adafruit NeoPixel qualquer recente Adafruit Gerenciador de Bibliotecas

Instalando a biblioteca GFX de um arquivo ZIP

  1. Baixe o ZIP. Ele está incluído no download deste projeto, ou você pode obtê-lo em o repositório Arduino_GFX - clique no botão verde Code e depois em Download ZIP.
  2. Salve-o em algum lugar onde possa encontrá-lo novamente. Não o descompacte.
  3. Na IDE Arduino, clique em SketchInclude LibraryAdd .ZIP Library.
  4. Navegue até o arquivo ZIP que você baixou e clique em Open.
  5. A IDE o instala e confirma na parte inferior da janela. Se você já tiver uma versão 1.6 instalada, exclua essa pasta de Documents/Arduino/libraries primeiro, ou as duas entrarão em conflito.

Configurando secrets.h

Seus detalhes de WiFi e quaisquer chaves de API vão em secrets.h, que está incluído no download com valores de espaço reservado. Abra essa aba na IDE Arduino e substitua-os pelos seus próprios.

Obtendo suas chaves de API

Este projeto fala com um serviço de IA em nuvem, então você precisa da sua própria chave. Se você nunca fez isso antes, não se preocupe - é a mesma ideia de uma senha que identifica sua conta ao serviço. Leva alguns minutos, uma única vez.

DeepSeek - a parte do raciocínio

DeepSeek é o modelo de linguagem que realmente responde à sua pergunta. É barato - alguns dólares de crédito cobrem milhares de respostas.

  1. Vá para platform.deepseek.com e crie uma conta.
  2. Abra API keys no menu e clique em Create new API key.
  3. Copie-a imediatamente. Ela é mostrada apenas uma vez e nunca mais - se você a perder, exclua essa chave e crie outra.
  4. Adicione uma pequena quantia de crédito em Top up. Não há camada gratuita, mas a menor recarga dura muito tempo com esse uso.

Coloque a chave em secrets.h como DEEPSEEK_KEY. Ela começa com sk-.

Quanto custa para executar

Muito pouco, mas não é gratuito, e você deve saber aproximadamente o que está gastando antes de deixar um projeto em execução.

Serviço Custo aproximado
DeepSeek uma fração de centavo por resposta - milhares de respostas por alguns dólares

Os preços mudam, então trate-os como um guia em vez de um orçamento. Cada um desses serviços tem uma página de uso onde você pode acompanhar o que gastou, e todos permitem definir um limite de gastos - o que vale a pena fazer desde o primeiro dia.

Solução de problemas

Sintoma Causa e correção
A tela permanece preta Versão errada da biblioteca GFX (use 1.5.6) ou configurações erradas da placa.
PSRAM alloc failed Tools → PSRAM não está definido como OPI PSRAM.
Nada é carregado / sem porta COM Porta USB-C errada, ou o driver CH340 não está instalado.

Imagens

makerfabs_ESP32S3_cam_music_screen-1-
makerfabs_ESP32S3_cam_music_screen-1-
makerfabs_ESP32S3_cam_music_screen-4-
makerfabs_ESP32S3_cam_music_screen-4-
makerfabs_ESP32S3_cam_music_screen-10-
makerfabs_ESP32S3_cam_music_screen-10-
Nenhum código anexado.

Recursos e referências

Arquivos📁

Código Arduino (.ino)

Folha de dados (pdf)