Y lo prometido es deuda:
La verdad es que la cámara de mi móvil es una mierda y no capta bien las transiciones de color, pero es que si le subo el delay entonces ya no sigue el ritmo xD.
Y aquí el código. Está basado en el de un VU-meter con barras de leds que hizo un japonés por ahí.
Obviamente metiéndole un amplificador a la entrada funcionaría mucho mejor que escalando el valor de la entrada analógica.
Como véis agrupo las frecuencias en 3, pero sólo cojo 4 muestras de cada grupo. Esto es para que los coloeres sean más básicos (rojos, naranjas, verdes, azules...). Si se le meten más las transiciones quedan más feas.
El valor de mapeo lo hice viendo cuánto sacaba la fft (utilizando el monitor serie) y nuevamente hice alguna "trampa" para que los colores que saque fueran más chulos xD.
La librería de la fft es de dominio público y fácilmente googleable.
- Código: Seleccionar todo
-
-
- #include <fix_fft.h>
-
- #define AUDIOPIN 5
- #define RED 9
- #define GREEN 10
- #define BLUE 11
-
-
- char im[128], data[128];
-
- char data_avgs[14];
-
- int i=0,val;
-
-
-
- void setup() {
- pinMode(RED,OUTPUT);
- pinMode(GREEN,OUTPUT);
- pinMode(BLUE,OUTPUT);
- }
-
-
- void loop() {
-
- for (i=0; i < 128; i++){
- val = 7500*analogRead(AUDIOPIN); //scale jack singal as it is just some mV
- data[i] = val;
- im[i] = 0;
- };
-
-
- fix_fft(data,im,10,0);
-
- for (i=0; i< 64;i++){
- data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); // this gets the absolute value of the values in the array, so we're only dealing with positive numbers
- }
-
-
- // average values
- for (i=0; i<14; i++) {
- data_avgs[i] = data[i*21] + data[i*21 + 1] + data[i*21 + 2] + data[i*21 + 3]; // average together
- data_avgs[i] = 255 - map(data_avgs[i], 0, 30, 0, 255); // remap values for RGB
-
- }
- analogWrite(RED,data_avgs[0]);
- analogWrite(GREEN,data_avgs[1]);
- analogWrite(BLUE,data_avgs[2]);
- delay(100);
- }
-
La canción elegida (básicamente
porque mola por sus cambios de ritmo) es Skalari Rude Klub de Skalariak ;-)
Ska, ska, ska!