Paso 3: Editar defaults.cfg y ejecutar synchronized_lights_LED_strip.py personalizados
gpio_pins = 7,0,1,2,3
Sólo tengo 5 columnas, así que sólo trunca la lista de salidas a 5 números.
Si desea utilizar la lista de reproducción, cambiar el playlist_path
También cambié la siguiente
min_frequency = 50
max_frequency = 150000
Comentario custom_channel_frequencies. Quiero dividir las frecuencias máximas y mínima uniformemente.
Por último, ejecute el script modificado para requisitos particulares:
sudo py/synchronized_lights.py--archivo /home/pi/some_random_music_file.mp3
Para la depuración, considerar la adición de v - 2 - readcache 0
He podido decodificar mp3s y jugar al mismo tiempo con sólo unos pocos problemas técnicos desde el principio de la canción. El código de la base tiene una función donde escribe a todos los niveles a un archivo de caché para que cuando juega la canción otra vez no tiene que ejecutar que el FFTs. readcache 0 desactiva esto si no quieres tener que borrar la cache de .gz que genera cada vez.
--------------------
Algunos destacados en las modificaciones a la original
--------------------
Los principales cambios consisten en remover el código GPIO y reemplazar con el código para enviar los niveles a la tira del RGB LED. La mejor forma de hacerlo sería modificar el archivo hardware_controller.py, pero no importa lo que algunos cambios a la original sería necesario ya que no sólo estoy usando señales de encendido/apagado ya.
Pasé la mayor parte de mi tiempo tratando de optimizar la velocidad de la función calculate_levels(). Me enteré de la línea
datos = np.array (datos, dtype = 'h')
, que simplemente crea un array de numpy de una matriz de python, tomó 10ms, que es tanto como todo el procesamiento FFT! Esto fue acelerado grandemente por sustitución con una función que carga una matriz de memoria binaria directamente:
NP.frombuffer (datos...
El resto de mis cosas de cambios sólo realmente afectados cuando estaba haciendo pruebas con puras ondas del seno (ver prueba adjunta archivos). Los ajustes dinámicos en el código original hizo trabajar bien a pesar de todo a continuación. ¡ Muy grande!
Puesto que el audio es stereo, lanzo hacia fuera los números desde los que representan el canal derecho. El código original fue analizar la señal estéreo como si fuera mono, que probablemente ha añadido un poco de energía a la banda de frecuencia más baja.
datos [:] = data_stereo [:: 2]
La fft también se ejecuta en un trozo no ventana de audio. Al ejecutar un FFT en un trozo de audio tallada en el centro de una canción, los bordes de la que se ven como gotas escarpadas del Algoritmo FFT. Esto añade un montón de energía a través de todas las bandas. La solución es forma cónica hacia abajo cada pedazo, o "ventana". Puedes ver que una foto de esta adjunto a esta página de antes y después de ventanas un trozo de audio.
ventana = np.hanning(len(data))
datos = datos * ventana
Por último, cuando el poder del sonido sube por un factor de 10, que escuchamos que como una duplicación, todos los contenedores en cada banda de frecuencias de la suma y me tome el log10 de aquellos para que los LEDs rebotan dos veces como alta cuando escuchamos el sonido doble.
Para probar las cosas, intente ejecutar los archivos de sonido adjuntos. El archivo de ruido rosa debe reportar el mismo poder total por banda de frecuencia. Esto es interesante, porque habrá sólo contenedores 5 o así en la primera banda y cientos de personas en la última, pero si usted suma todas las energías, deben ser el mismo, a pesar de la diferencia en número de contenedores. Ruido rosa ruido como es el mismo volumen a través de todo el espectro. El archivo de la barra de ruido rosa tiene un filtro pasabanda se barrió desde baja a alta, y se puede ver esta demo en el vídeo.