Estoy trabajando en un proyecto en el que las luces LED se sincronizan con los eventos de audio. No me refiero a proyectos de LED reactivos que leen el ADC de la amplitud o el espectro de audio, sino a tener algunos datos digitales adicionales que se reproducen junto con el audio para indicar varios desencadenantes de eventos.
Inicialmente, el enfoque que estoy tomando es utilizar un archivo estéreo y tener un canal para audio y otro canal para datos. Se accede al archivo mediante un módulo de tarjeta SD y se procesa mediante un códec o un módulo reproductor de mp3. El canal con datos tiene pulsos de diferentes frecuencias de onda sinusoidal para indicar diferentes eventos y activar luces LED específicas.
Logré hacer esto usando un chip analizador de espectro, pero no es lo ideal ya que al usar el ADC hay fluctuaciones y los cambios en el control de volumen afectan la señal. Espero encontrar una solución de señal digital, ya que cuando se lee la tarjeta SD y se procesa el audio, los datos de un canal del archivo (wav o mp3) deben leerse en tiempo real en la MCU.
Idealmente, el MCU sería un ESP32. Experimenté con algunas bibliotecas que pueden leer archivos wav desde una tarjeta SD (como esp32_I2S_player) pero no pude recibir los datos para crear las 'condiciones if' necesarias. Otro intento fue ver si podía hacer esto con un códec VS1053, pero las bibliotecas para este chip tampoco brindan una función para leer datos de la tarjeta SD de un canal específico, y no pude encontrar mucho sobre esto en el ficha de datos.
Entonces mis preguntas son:
Me siento estancado en este tema, así que realmente aprecio sus respuestas. Gracias.
El uso de un DSP auxiliar para la descompresión puede dificultar esta tarea, a menos que se limite a archivos de tasa de bits constante; si necesita una alta precisión de tiempo de los eventos de luz, es posible que deba tener en cuenta el retraso en el procesamiento desde que ingresa los datos hasta que sale el sonido. , que sería diferente a diferentes velocidades de bits.
Posiblemente, podría trabajar con un decodificador distinto haciendo una temporización independiente, iniciando un contador de tiempo de MCU al comienzo de la salida de audio y activando eventos de luz en las marcas de tiempo apropiadas. En ese caso, es posible que desee codificar sus datos de luz en su propio archivo vinculado por un patrón de nomenclatura, o incrustarlos en datos entretejidos que aparecen un poco antes del audio comprimido al que corresponde y se retienen en un búfer de MCU hasta la marca de tiempo indicada .
Una posible simplificación drástica es almacenar archivos .wav PCM lineales en lugar de MP3 comprimidos. Dado que un CD de audio es solo alrededor de 3/4 de un gigabyte, incluso una tarjeta SD barata puede contener unas pocas horas de audio sin comprimir. Si no tiene compresión, es bastante simple para su MCU simplemente registrar los datos en un DAC, aunque preferiblemente use un DAC controlado por temporizador de hardware (y potencialmente DMA) o al menos una interrupción, no un bucle de retraso de software.
No me gusta codificar datos de comandos como una señal analógica en un archivo digital.
Creo que intentaría codificar los comandos de iluminación como bloques de texto en el bloque de letras de la información ID3 dentro del archivo mp3.
El bloque de letras está antes de los datos de sonido, por lo que debería poder decodificarlo rápidamente antes de comenzar la reproducción.
Las bibliotecas típicas para la reproducción de mp3 no parecen leer todas las etiquetas ID3. Algunas bibliotecas leen algunas etiquetas. Puede extraer las etiquetas de letras en su propia función de lectura antes de la reproducción o ampliar una de las bibliotecas existentes.
Dentro de las etiquetas de las letras, tienes marcas de tiempo y texto.
Puede codificar las marcas de tiempo como las definen los estándares ID3, o codificar sus propias marcas de tiempo más precisas en su propio formato (las marcas de tiempo ID3 solo se dan en segundos).
El contenido del texto es la parte interesante. Defina su propia codificación de texto para sus luces. Diga "DMX1:FFFF00000000" para una luz roja brillante completa en la dirección 1 (eso es solo codificar datos DMX como hexadecimales, con la dirección incluida en el encabezado).
O algo más simple si solo necesita encender y apagar un puñado de LED conectados directamente al microcontrolador.
O implemente su formato de modo que pueda usarlo para DMX, pero tenga un intérprete en su controlador para los LED locales.
El contenido realmente depende de ti. En cualquier caso, es mucho más flexible que incrustar sonidos en un canal de su archivo de audio.
Hay editores de letras que puede usar para poner sus comandos en los archivos mp3. Simplemente escriba los comandos en su formato privado como letras.
Una vez desarrollé una aplicación en la que eventos arbitrarios podían activarse mediante marcas de agua de audio incrustadas en el sonido. Podría reproducir el sonido a través de pequeños altavoces de computadora sin amplificar en un extremo de la mesa de la sala de conferencias, y mi caja de demostración ubicada en el otro extremo encendería los LED exactamente en los momentos correctos.
Era eficiente en el sentido de que el decodificador funcionaba con un pequeño microcontrolador de 8 bits (basado en 6502), respaldado por una cadena de procesamiento de señal analógica simple (preamplificador de micrófono, filtro, etc.)
La solución rápida en mi mundo sería reproducir desde una computadora. Hay programas de computadora listos que pueden sincronizar el sonido en muchos canales con Midi (normalmente usado para sintetizadores) o DMX (muy similar a Midi pero usado para luces).
JRE
david tweed
JRE
sstobbe
nvuono
dormilón