Gibt es eine effiziente Möglichkeit, Audioereignisse mithilfe einer MCU in Echtzeit mit LEDs zu synchronisieren?

Ich arbeite an einem Projekt, bei dem LED-Leuchten mit Audioereignissen synchronisiert werden. Ich beziehe mich nicht auf reaktive LED-Projekte, die den ADC aus der Audioamplitude oder dem Spektrum lesen, sondern darum, dass einige zusätzliche digitale Daten zusammen mit dem Audio abgespielt werden, um mehrere Auslöser von Ereignissen anzuzeigen.

Anfänglich verfolge ich den Ansatz, eine Stereodatei zu verwenden und einen Kanal für Audio und einen anderen Kanal für Daten zu haben. Auf die Datei wird von einem SD-Kartenmodul zugegriffen und von einem Codec- oder MP3-Player-Modul verarbeitet. Der Kanal mit Daten hat Impulse mit unterschiedlichen Sinuswellenfrequenzen, um verschiedene Ereignisse anzuzeigen und bestimmte LED-Leuchten auszulösen.

Ich habe dies mit einem Spektrumanalysator-Chip geschafft, aber es ist nicht ideal, da es durch die Verwendung des ADC zu Schwankungen kommt und Änderungen in der Lautstärkeregelung das Signal beeinflussen. Ich hoffe, eine digitale Signallösung zu finden, da beim Lesen der SD-Karte und der Audioverarbeitung die Daten von einem Kanal der Datei (wav oder mp3) in Echtzeit in der MCU gelesen werden müssen.

Idealerweise wäre die MCU ein ESP32. Ich habe mit einigen Bibliotheken experimentiert, die WAV-Dateien von einer SD-Karte lesen können (z. B. esp32_I2S_player), aber ich konnte es nicht schaffen, die Daten zum Erstellen der erforderlichen "Wenn-Bedingungen" zu erhalten. Ein weiterer Versuch war, zu sehen, ob ich dies mit einem VS1053-Codec tun könnte, aber Bibliotheken für diesen Chip bieten auch keine Funktion zum Auslesen von Daten von der SD-Karte eines bestimmten Kanals, und ich konnte in der nicht viel darüber finden Datenblatt.

Also meine Fragen sind:

  1. Gibt es eine effiziente Möglichkeit, Audioereignisse mithilfe einer MCU in Echtzeit mit LEDs zu synchronisieren? Ich weiß, wie man dies durch allgemeine Betriebssystemsoftware macht, aber jetzt erfordert die Anwendung eine nackte Maschine.
  2. Wenn mein Ansatz (Stereodatei = Daten + Audio) sinnvoll ist, wie kann ich das umsetzen? Gibt es einen Codec oder eine MCU, der diesen Ansatz erleichtert? Gibt es ein Codebeispiel, das mir helfen kann?

Ich fühle mich in dieser Ausgabe stagniert, also schätze ich Ihre Antworten wirklich. Danke.

Ich finde es irgendwie falsch, so etwas als Audio in eine digitale Datei zu codieren. MP3-Dateien können Songtext-Tags mit Zeitstempeln enthalten. Kodieren Sie Ihre LED-Befehle als Text in Text-Tags.
@JRE: Das ist eigentlich eine gute Antwort, und Sie sollten es so aufschreiben.
Ich habe überprüft, ob es mit typischen ESP32- oder Arduino-Bibliotheken überhaupt möglich ist. Es sieht so aus. Ich schreibe es auf und füge ein paar Details hinzu.
Abhängig von den Spezifikationen. Das Platzieren eines UART-Bitstroms mit niedriger Baudrate auf einem Audiokanal ist ziemlich einfach.
Eine Option wäre die gleichzeitige Wiedergabe eines MIDI-Streams zusammen mit Ihrem Audiostream, wobei die Lichtsteuerungsdaten in der MIDI-Spur codiert sind. Dies ist bei der DJ-/Nachtclub-Beleuchtungssteuerung eigentlich ziemlich üblich, und Sie können viele Referenzinformationen finden, sobald Sie wissen, wonach Sie suchen
Tatsächlich ist MIDI die Standardlösung in der Industrie

Antworten (4)

Die Verwendung eines zusätzlichen DSP für die Dekomprimierung kann dies erschweren, es sei denn, Sie beschränken sich auf Dateien mit konstanter Bitrate. Wenn Sie eine hohe Zeitgenauigkeit der Lichtereignisse benötigen, müssen Sie möglicherweise die Verarbeitungsverzögerung ab dem Eingeben der Daten bis zum Ausgeben des Tons berücksichtigen , was bei unterschiedlichen Bitraten unterschiedlich wäre.

Möglicherweise könnten Sie einen bestimmten Decoder umgehen, indem Sie ein unabhängiges Timing durchführen, einen MCU-Zeitzähler zu Beginn der Audioausgabe starten und Lichtereignisse zu geeigneten Zeitstempeln auslösen. In diesem Fall möchten Sie Ihre Lichtdaten möglicherweise in einer eigenen Datei codieren, die durch ein Benennungsmuster verknüpft ist, oder sie in verwobene Daten einbetten, die etwas vor den komprimierten Audiodaten angezeigt werden, denen sie entsprechen, und bis zum angegebenen Zeitstempel in einem MCU-Puffer gespeichert werden .

Eine mögliche drastische Vereinfachung besteht darin, lineare PCM-WAV-Dateien anstelle von komprimierten MP3-Dateien zu speichern. Angesichts der Tatsache, dass eine Audio-CD nur etwa 3/4 Gigabyte groß ist, kann selbst eine billige SD-Karte möglicherweise einige Stunden unkomprimiertes Audio speichern. Wenn Sie keine Komprimierung haben, ist es für Ihre MCU ziemlich einfach, die Daten einfach über einen DAC auszutakten, verwenden Sie jedoch vorzugsweise einen Hardware-Timer-gesteuerten DAC (und möglicherweise DMA) oder zumindest einen Interrupt, keine Software-Verzögerungsschleife.

Ich habe dies als die beste Lösung markiert, da es für mich perfekt funktioniert hat. Ich habe die Zeitstempel in einer TXT-Datei codiert und zusammen mit der Audiodatei (WAV) auf eine SD-Karte hinzugefügt. Diese TXT-Datei wurde von der MCU dekodiert, die dann einen Timer initialisierte und die WAV-Datei von der SD-Karte las. Schließlich verglich der Code die Zeitstempel mit dem Zeitzähler, um auszulösen, was benötigt wurde.

Ich mag es nicht, Befehlsdaten als analoges Signal in einer digitalen Datei zu codieren.

Ich denke, ich würde versuchen, die Beleuchtungsbefehle als Textblöcke im Textblock der ID3-Informationen in der MP3-Datei zu codieren.

Der Liedtextblock befindet sich vor den Tondaten, sodass Sie ihn schnell dekodieren können sollten, bevor Sie mit der Wiedergabe beginnen.

Typische Bibliotheken für die MP3-Wiedergabe scheinen nicht alle ID3-Tags zu lesen. Einige Bibliotheken lesen einige Tags. Sie könnten entweder die Songtext-Tags vor der Wiedergabe in Ihrer eigenen Lesefunktion extrahieren oder eine der vorhandenen Bibliotheken erweitern.

Innerhalb der Songtext-Tags befinden sich Zeitstempel und Text.

Sie können die Zeitstempel so codieren, wie sie die ID3-Standards definieren, oder Ihre eigenen, genaueren Zeitstempel in Ihrem eigenen Format codieren (die ID3-Zeitstempel werden nur in Sekunden angegeben).

Der Textinhalt ist der interessante Teil. Definieren Sie Ihre eigene Textcodierung für Ihre Lichter. Sagen Sie „DMX1:FFFF00000000“ für volles helles rotes Licht auf Adresse 1 (das ist nur die Codierung von DMX-Daten als Hexadezimalzahl, wobei die Adresse im Header enthalten ist).

Oder etwas Einfacheres, wenn Sie nur eine Handvoll LEDs ein- und ausschalten müssen, die direkt mit dem Mikrocontroller verbunden sind.

Oder implementieren Sie Ihr Format so, dass Sie es für DMX verwenden können, aber einen Interpreter in Ihrem Controller für lokale LEDs haben.

Der Inhalt ist wirklich bis zu Ihnen. In jedem Fall ist es viel flexibler als das Einbetten von Sounds in einen Kanal Ihrer Audiodatei.

Es gibt Texteditoren, mit denen Sie Ihre Befehle in die MP3-Dateien einfügen können. Geben Sie einfach Befehle in Ihrem privaten Format als Liedtext ein.

Dieser Ansatz scheint großartig zu sein, aber ich kann keine Informationen zu Codecs (in ICs, nicht in Software) oder Bibliotheken finden, die ID3-Texte (LYR) decodieren können, damit ich den Zeitstempel in Echtzeit in der MCU empfangen kann ... falls vorhanden Bitte lassen Sie es mich wissen. :)
Es liegt nicht am Codec. Sie haben die Datei gelesen und die ID3-Tags herausgesucht. Wie dieses ESP-Projekt.
Ich verstehe, schade, dass es noch nicht viele Informationen darüber gibt. Aber das hilft, ich werde versuchen, das zu untersuchen, und vielleicht kann ich einen Code finden. Danke.
Ihre MCU muss die Datei lesen und die Daten an den Hardware-Decoder weitergeben. Zupfen Sie einfach den ID3-Liedtextblock heraus, bevor Sie beginnen, Datenblöcke an den Decoder zu übergeben.

Ich habe einmal eine Anwendung entwickelt, in der beliebige Ereignisse durch in den Sound eingebettete Audio-Wasserzeichen ausgelöst werden konnten . Sie könnten den Ton über blecherne unverstärkte Computerlautsprecher an einem Ende des Konferenzraumtisches abspielen, und meine Demobox am anderen Ende würde LEDs genau in den richtigen Momenten einschalten.

Es war insofern effizient, als der Decoder auf einem winzigen 8-Bit-Mikrocontroller (6502-basiert) lief, der von einer einfachen analogen Signalverarbeitungskette (Mikrofonvorverstärker, Filter usw.)

das klingt nach einem guten Ansatz! Können Sie weitere Informationen zu dem System geben, das Sie zum Kodieren und Dekodieren der Wasserzeichen verwendet haben?
Unglücklicherweise nicht. Der Algorithmus ist Eigentum von Verance – ich habe damals für sie gearbeitet. Sie müssten es entweder von ihnen lizenzieren oder dasselbe Konzept mit einem anderen Algorithmus entwickeln.
Seltsamerweise habe ich die gleiche Art von Ding für jemand anderen mit Nahultraschallcodierung gebaut. Aber ich würde es für die Bedürfnisse des OP nicht so machen - sie steuern die Wiedergabe von der Datenquelle, sodass keine Audiokette durchlaufen werden muss. Wenn sie wirklich einen bestimmten Decoder-IC verwenden möchten, würde das Erkennen des Beginns der Ausgabe ermöglichen, dass unabhängige Zeitstempel funktionieren, insbesondere wenn die Taktquelle gemeinsam genutzt werden kann.
@ChrisStratton: Ja, der Ansatz von JRE ist in diesem Fall besser. Ich wollte nur Wasserzeichen für Anwendungen auf den Tisch bringen, die die in das Audio selbst eingebetteten Hinweise benötigen.

Die schnelle Lösung in meiner Welt wäre die Wiedergabe von einem Computer. Es gibt fertige Computerprogramme, die den Ton auf vielen Kanälen mit Midi (normalerweise für Synthesizer verwendet) oder DMX (sehr ähnlich zu Midi, aber für Lichter verwendet) synchronisieren können.

Sie können das MIDI gleichzeitig auf dem esp32 wiedergeben und als Bonus können Sie, wenn Sie MIDI-Keyboard-Eingänge bestimmten Farben/Lichtern zuordnen, einige ziemlich robuste Beleuchtungs-Cue-Tracks in vorhandener Open-Source-MIDI-Sequenzierungssoftware erstellen und bearbeiten.
Ja, über den Computer ist es ziemlich einfach und ich habe es oft mit Max MSP gemacht, aber das Problem ist, dass ich dies mit einer MCU verwenden muss. Kein Betriebssystem.