Suchcode

KI schreibt einen Song und dieser ESP32 bringt dir bei, ihn zu spielen

KI schreibt einen Song und dieser ESP32 bringt dir bei, ihn zu spielen

Bitte eine KI, eine Melodie zu schreiben, höre sie dir an und lass dich vom Board dabei unterrichten, sie zu spielen

Wähle eine Stimmung, tippe auf SCHREIBEN, und eine KI komponiert eine kurze Melodie. Das Board spielt sie ab und beleuchtet dabei jede Taste. Dann tippe auf LERNEN und es wird zum Lehrer: Es leuchtet eine Taste nach der anderen auf und wartet darauf, dass du sie drückst, Note für Note, bis du die ganze Melodie selbst gespielt hast.

922-Dies ist der AI-Musik-Artikel (der aktuelle Artikel)

923-Das Klavier-Projekt ist hier.

Es ist jederzeit ein vollwertiges 21-Tasten-Klavier – spiel einfach darauf.

AI-Musikkomponist und -Lehrer läuft auf dem MaTouch AI ESP32-S3-Board
AI-Musikkomponist und -Lehrer läuft auf dem MaTouch AI ESP32-S3-Board

Der Bildschirm

Der AI-Musik-Hauptbildschirm auf dem MaTouch AI ESP32-S3, der die sechs Tasten zeigt
Der AI-Musik-Hauptbildschirm auf dem MaTouch AI ESP32-S3, der die sechs Tasten zeigt

Sechs Tasten oben, dann eine 21-Tasten-Tastatur – drei Reihen zu sieben, C3 bis B5. Anders als beim Klavierprojekt gibt es hier kein Schwarz-Weiß-Layout, weil die KI auf die sieben natürlichen Noten beschränkt ist und das Raster genau das ist, wie diese Noten aussehen.

Taste Was sie tut
STIL Wechselt die Stimmung: GLÜCKLICH, TRAURIG, GESPENSTISCH, FOLKLORE, WIEGENLIED. Das wird an die KI gesendet.
SCHREIBEN Bittet die KI um eine Melodie in dieser Stimmung. Zeigt WARTEN, während sie denkt, und spielt dann, was zurückkommt.
ABSPIELEN Spielt die aktuell geladene Melodie erneut ab. Tippe erneut, um zu stoppen.
LERNEN Lernmodus – leuchtet eine Taste auf und wartet auf dich.
WELLE Klangfarbe: WEICH, ORGEL oder HELL.
LAUTSTÄRKE Tippen, um die Lautstärke von 1 bis 5 zu erhöhen. Das Label zeigt den Pegel.

Die Lautstärke, mit der das Board startet, wird durch #define VOLUME nahe dem Anfang des Sketches festgelegt, sodass du den gewünschten Pegel eincompilieren und trotzdem live ändern kannst.

Was die KI tatsächlich generiert

Dies ist der Teil, bei dem man präzise sein sollte, weil es leicht ist, zu übertreiben. Die KI generiert kein Audio. Die Erzeugung einer tatsächlichen Wellenform erfordert ein großes Modell und eine Grafikkarte; kein Mikrocontroller macht das, und jeder, der etwas anderes behauptet, spielt eine Datei ab, die woanders gerendert wurde.

Was sie generiert, ist eine Liste von Noten als gewöhnlicher Text:

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

Das Board parst das mit ArduinoJson und spielt es mit demselben Synthesizer wie beim Klavierprojekt. Eine kurze Textanfrage kostet einen Bruchteil eines Cents, und sobald eine Melodie angekommen ist, kann sie für immer ohne Internetverbindung erneut abgespielt werden.

makerfabs_ESP32S3_cam_music_screen-10-

Warum der Prompt die KI einschränkt

Die Anfrage teilt dem Modell mit, dass es nur die 21 Noten verwenden darf, die physisch auf dieser Tastatur existieren – natürliche Noten von C3 bis B5, keine Kreuze oder Bs. Das ist keine Einschränkung des Synthesizers, der jede Frequenz spielen kann. Es gibt zwei gute Gründe dafür:

  • Jede Note, die es schreibt, kann der LERNEN-Modus dir tatsächlich beibringen, weil es eine Taste dafür gibt
  • In einer Tonart zu bleiben bedeutet, dass das Ergebnis immer musikalisch klingt, selbst wenn das Modell einen uninspirierten Tag hat

Eine Antwort von einem Sprachmodell parsen

Modelle sind gerne hilfreich, was hier bedeutet, die Antwort in Markdown-Zäune zu wickeln und einen freundlichen Satz darüber hinzuzufügen, was sie geschrieben haben. Der Sketch bittet nachdrücklich um reines JSON und nimmt dann defensiv alles zwischen dem ersten [ und dem letzten ]. Jede Note, die es nicht auf der Tastatur platzieren kann, wird übersprungen, und das Ergebnis wird nur akzeptiert, wenn mindestens vier brauchbare Noten übrig bleiben. Tolerant gegenüber unvollkommener Ausgabe zu sein, ist der größte Teil der Arbeit in jedem Projekt, das KI-Text parst.

Die leere Antwort und wie man sie vermeidet

Eine Sache wird dich überraschen, wenn du das Modell oder den Prompt änderst. DeepSeek denkt nach, bevor es antwortet, und dieses Denken wird gegen dasselbe max_tokens-Budget abgerechnet wie die Antwort. Stell ihm eine schwierige Frage, und es kann das gesamte Budget mit Denken verbringen und dann eine leere Antwort zurückgeben – eine erfolgreiche Anfrage, die nichts enthält.

Bei diesem Projekt zeigte sich das darin, dass die schwierigeren Stimmungen fehlschlugen, während die einfachen funktionierten. SPOOKY und LULLABY wollen eine Moll-Tonart, was wirklich schwierig ist, wenn jedes Kreuz und jedes B verboten ist, also überlegte das Modell – und das Budget ging aus. HAPPY in C-Dur antwortete sofort.

Es gibt zwei Lösungen, und dieser Sketch verwendet beide. Die Anfrage sendet "thinking": {"type": "disabled"}, was das Denken vollständig abschaltet, sodass das gesamte Budget für die Antwort zur Verfügung steht und die Antwort viel schneller zurückkommt. Und der Prompt sagt dem Modell jetzt, wie es ohne Kreuze moll klingen soll – die Melodie auf A oder E zentrieren, was dieselben Noten verwendet.

Der Lernmodus

Tippe auf LEARN und eine Taste leuchtet grün. Drücke sie und das Board rückt zur nächsten Note vor. Drückst du die falsche Taste, ertönt sie trotzdem – es ist schließlich ein Klavier –, aber es geht nicht weiter. Die Statusleiste zählt deinen Fortschritt, und wenn du das Ende erreichst, teilt sie dir das mit.

Es gibt keinen Zeitdruck und keine Punktzahl. Es wartet so lange auf dich, wie du brauchst, was es wirklich brauchbar macht, um eine Phrase zu lernen, statt nur eine Neuheit zu sein.

LEARN-Modus auf dem MaTouch AI ESP32-S3 – eine Taste leuchtet und wartet darauf, gedrückt zu werden
LEARN-Modus auf dem MaTouch AI ESP32-S3 – eine Taste leuchtet und wartet darauf, gedrückt zu werden

Es funktioniert auch ohne WiFi

Eine Melodie ist im Sketch eingebaut, also funktionieren PLAY und LEARN ganz ohne Netzwerk. Nur WRITE benötigt das Internet – und es braucht nur einen DeepSeek-Schlüssel. Für dieses Projekt ist kein Azure- oder OpenAI-Konto erforderlich.

Wenn du testest, tippe zuerst auf PLAY: Das bestätigt den Audiopfad und die Tastatur, bevor ein Netzwerk involviert ist. Wenn WRITE später fehlschlägt, weißt du also bereits, wo du suchen musst.

Wiedergabe einer Melodie bei ausgeschaltetem Router – sie lebt jetzt auf dem Board
Wiedergabe einer Melodie bei ausgeschaltetem Router – sie lebt jetzt auf dem Board

Ideen für die Weiterentwicklung

  • Bitte um eine Melodie „im Stil eines Seemannslieds", indem du die Stil-Liste bearbeitest.
  • Lass es eine zweite Phrase schreiben, die die erste beantwortet.
  • Speichere die Melodien auf der SD-Karte, sodass das Board mit der Zeit ein Liederbuch aufbaut.
  • Füge die Mikrofone aus dem Sprachassistenten-Projekt hinzu, damit du die Anfrage sprechen kannst, statt ein Preset zu tippen.

Über das MaTouch AI ESP32-S3 2.8"-Board

Jedes Projekt auf dieser Seite läuft auf dem MaTouch AI ESP32-S3 2.8" TFT ST7789V von Makerfabs. Es ist ein All-in-One-Board: ein Farb-Touchscreen, eine 3-Megapixel-Kamera, zwei Mikrofone und ein echter Lautsprecherverstärker, alles angetrieben von einem ESP32-S3 mit 8 MB PSRAM. Diese Kombination macht diese KI-Projekte auf einem einzigen Board ohne zusätzliche Komponenten möglich.

Die 8 MB PSRAM sind hier wichtiger als jede andere Zahl. Sie ermöglichen es dem Board, gleichzeitig ein Kamerabild, ein paar Sekunden aufgenommenes Audio oder ein base64-kodiertes Foto im Speicher zu halten – nichts davon passt in den normalen RAM des ESP32.

Herstellerdokumentation: Makerfabs-Wiki-Seite.

Jedes andere Projekt für dieses Board – die Kamera, Offline-Gesichtserkennung, der KI-Sprachassistent, KI-Vision und das Zeichenprojekt – hat sein eigenes Tutorial. Links zu allen findest du unterhalb dieses Artikels.

Wichtige Spezifikationen

  • Prozessor: ESP32-S3, Dual-Core 240 MHz, WiFi 2.4 GHz + Bluetooth 5.0
  • Speicher: 16 MB Flash, 8 MB PSRAM (für fast jedes Projekt hier erforderlich)
  • Display: 2.8" IPS, 320×240, ST7789V-Treiber, SPI
  • Touch: GT911 kapazitiv, erfasst 5 Finger gleichzeitig
  • Kamera: OV3660, 3 Megapixel, bis zu 2048×1536
  • Mikrofone: zwei INMP441-I2S-Digitalmikrofone (ein echtes Stereopaar)
  • Lautsprecher: MAX98357A-Klasse-D-Verstärker, 3.2 W an 4 Ω
  • Speicher: microSD-Kartensteckplatz (SPI-Modus)
  • Stromversorgung: USB-C, JST-Akkuanschluss, TP4056-Ladegerät, Netzschalter
  • Außerdem auf dem Board: WS2812B-RGB-LED, PCF8563T-Akku-gepufferte Echtzeituhr und ein MAX17048-Akku-Füllstandsmesser, der nicht in den offiziellen Spezifikationen aufgeführt ist

Betreiben Sie es mit einer Batterie? Die beiden USB-C-Buchsen, der TP4056-Laderegler und der Netzschalter werden vollständig, inklusive Schaltplan, im Artikel zum Board-Test erklärt — einschließlich der Frage, welche Buchse lädt und ob der Schalter ein- oder ausgeschaltet sein sollte.

Arduino-IDE-Einstellungen

Diese Einstellungen sind wichtig. Die meisten Probleme, die Personen mit diesem Board melden, beruhen auf einem dieser Punkte, und sie werden zurückgesetzt, wenn Sie die Core-Version ändern. Überprüfen Sie sie daher nach jeder Änderung erneut.

Einstellung Wert
Board ESP32S3 Dev Module
ESP32-Core-Version 2.0.17
PSRAM OPI PSRAM
Flash-Größe 16MB (128Mb)
Partitionsschema 16M Flash (3MB APP/9.9MB FATFS)
USB CDC On Boot Disabled
Upload-Geschwindigkeit 921600
Erase All Flash Before Upload Disabled
Port der CH340K-USB-C-Anschluss

Wenn das Hochladen fehlschlägt: Das Board manuell in den Download-Modus versetzen

Meistens drücken Sie einfach Upload und es funktioniert. Manchmal nicht — die IDE verharrt bei Connecting...... und gibt dann mit Failed to connect to ESP32-S3: No serial data received auf.

Das passiert, weil IO0 auf diesem Board drei Aufgaben gleichzeitig übernimmt: Es ist die BOOT-Taste, es ist die Auto-Reset-Leitung vom CH340K und es ist die Datenleitung für die RGB-LED. Wenn das bereits auf dem Board laufende Sketch diese LED ansteuert, kann es den automatischen Reset stören, sodass der Chip in Ihr altes Sketch statt in den Bootloader neu startet.

Die Lösung dauert fünf Sekunden. Versetzen Sie es selbst in den Download-Modus:

  1. Drücken und halten Sie die BOOT-Taste.
  2. Während Sie BOOT weiterhin halten, drücken Sie RESET und lassen RESET wieder los.
  3. Lassen Sie nun BOOT los. Der Bildschirm wird leer — das ist der wartende Bootloader.
  4. Klicken Sie auf Upload.
  5. Wenn es abgeschlossen ist, drücken Sie einmal RESET, um das neue Sketch auszuführen.

Wenn es immer noch keine Verbindung herstellt, setzen Sie Upload Speed auf 115200 herab und versuchen Sie es erneut. Überprüfen Sie außerdem, ob der Netzschalter des Boards eingeschaltet ist — der CH340K wird erkannt und stellt einen COM-Port bereit, selbst wenn das Board selbst ausgeschaltet ist, was Personen in die Irre führt.

Erforderliche Bibliotheken

Dieses Projekt benötigt jede Bibliothek in der folgenden Tabelle — nicht mehr und nicht weniger. Die meisten lassen sich direkt über Tools → Manage Libraries in der Arduino-IDE installieren, aber GFX Library for Arduino muss aus einer ZIP-Datei installiert werden. Die Versionsnummern sind wichtig, verwenden Sie daher bitte genau die aufgeführten.

Bibliothek Version Autor Installation von
GFX Library for Arduino 1.5.6 moononournation ZIP-Datei — siehe unten
bb_captouch 1.3.1 Larry Bank Library Manager
ArduinoJson 7.x Benoit Blanchon Library Manager
Adafruit NeoPixel beliebig aktuell Adafruit Library Manager

Installieren der GFX-Bibliothek aus einer ZIP-Datei

  1. Laden Sie die ZIP-Datei herunter. Sie ist im Download dieses Projekts enthalten, oder Sie können sie aus dem Arduino_GFX-Repository erhalten – klicken Sie auf die grüne Schaltfläche Code und dann auf Download ZIP.
  2. Speichern Sie sie an einem Ort, an dem Sie sie wiederfinden. Entpacken Sie sie nicht.
  3. Klicken Sie in der Arduino-IDE auf SketchBibliothek einbinden.ZIP-Bibliothek hinzufügen.
  4. Navigieren Sie zu der ZIP-Datei, die Sie heruntergeladen haben, und klicken Sie auf Öffnen.
  5. Die IDE installiert sie und bestätigt dies am unteren Fensterrand. Wenn Sie bereits eine Version 1.6 installiert haben, löschen Sie zuerst diesen Ordner aus Dokumente/Arduino/libraries, da sich die beiden sonst widersprechen.

Einrichten von secrets.h

Ihre WLAN-Daten und alle API-Schlüssel gehören in secrets.h, das mit Platzhalterwerten im Download enthalten ist. Öffnen Sie diesen Tab in der Arduino-IDE und ersetzen Sie sie durch Ihre eigenen.

Abrufen Ihrer API-Schlüssel

Dieses Projekt kommuniziert mit einem Cloud-KI-Dienst, daher benötigen Sie einen eigenen Schlüssel. Wenn Sie das noch nie gemacht haben, keine Sorge – es funktioniert wie ein Passwort, das Ihr Konto beim Dienst identifiziert. Es dauert einmalig ein paar Minuten.

DeepSeek – der Denk-Teil

DeepSeek ist das Sprachmodell, das Ihre Frage tatsächlich beantwortet. Es ist kostengünstig – ein Guthaben von ein paar Dollar reicht für tausende Antworten.

  1. Gehen Sie zu platform.deepseek.com und erstellen Sie ein Konto.
  2. Öffnen Sie API-Schlüssel im Menü und klicken Sie auf Neuen API-Schlüssel erstellen.
  3. Kopieren Sie ihn sofort. Er wird nur einmal angezeigt und nie wieder – wenn Sie ihn verlieren, löschen Sie diesen Schlüssel und erstellen Sie einen neuen.
  4. Fügen Sie unter Aufladen ein kleines Guthaben hinzu. Es gibt keinen kostenlosen Tarif, aber die kleinste Aufladung reicht bei dieser Nutzung sehr lange.

Fügen Sie den Schlüssel in secrets.h als DEEPSEEK_KEY ein. Er beginnt mit sk-.

Was der Betrieb kostet

Sehr wenig, aber es ist nicht kostenlos, und Sie sollten ungefähr wissen, was Sie ausgeben, bevor Sie ein Projekt laufen lassen.

Dienst Ungefähre Kosten
DeepSeek ein Bruchteil eines Cents pro Antwort – tausende Antworten für ein paar Dollar

Preise ändern sich, also behandeln Sie diese als Richtwerte und nicht als Angebot. Jeder dieser Dienste hat eine Nutzungsseite, auf der Sie Ihre Ausgaben einsehen können, und alle ermöglichen es Ihnen, ein Ausgabenlimit festzulegen – das lohnt sich am ersten Tag.

Fehlerbehebung

Symptom Ursache und Lösung
Bildschirm bleibt schwarz Falsche GFX-Bibliotheksversion (verwenden Sie 1.5.6) oder falsche Board-Einstellungen.
PSRAM alloc failed Werkzeuge → PSRAM ist nicht auf OPI PSRAM eingestellt.
Nichts wird hochgeladen / kein COM-Port Falscher USB-C-Anschluss oder der CH340-Treiber ist nicht installiert.

Bilder

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-
Kein Code angehängt.

Ressourcen & Referenzen

Dateien📁

Arduino-Code (.ino)

Datenblatt (pdf)