Bonjour,
J'ai programmé ces codes inspirés d'autres codes trouvés sur différents projets afin de les utiliser avec 4 bandes de 25 leds ws2801 , une arduino uno , sous windows vista , ces deux codes ont pour but de capter les fréquences d'une fft sur l'entrée audio afin d'afficher la basse en bleu sur les 50leds du bas et le beat moyen grace a beat listener contenu dans la librairie minim qui affiche le beat global en vert jaune puis rouge selon la hauteur sur les cotés de 2*25leds . Au départ tout se passe bien les sons sont bien représentés ,la basse rend les leds du bas bleues claire quand elle est detectée , sur les cotés , les leds s'allument bien vert , jaune, rouge, puis redescendent doucement quand un beat est détecté. tout fonctionne bien les 30 premières secondes puis au bout d'un moment une latence s'installe ,les beats détectes sont affiché légèrement en retard, puis , les leds se mettent a clignoter sans raison , les couleurs restent identiques mais un effet "flash" s'installe et les leds des cotés ne descendent plus, et l'effet flash est très désagréable.J'ai du mal a comprendre le problème sachant tout fonctionne lors des premières secondes voire minutes .l'arduino n'est pas assez puissant? y'a -t-il un probleme dans les codes? mes bandes leds sont en bon état et fonctionnent parfaitement pour d'autres utilisations . Si quelqu'un a une idée sur le(les) problème(s) , tout aide ou suggestion sont les bienvenus , je cherche depuis quelques semaines sur tout les forums et j'ai l'impression d'etre le seul au monde a avoir ce probleme , c'est assez frustrant d'avoir quelque chose qu'on ne peut utiliser que quelques minutes avant d'avoir des problemes! un lien vers le projet qui a inspiré mon code au cas ou mes explication n'ont pas étés claire :Audio visualization using an addressable led strip (repair) - YouTube
processing code :
[
import ddf.minim.analysis.*;
import ddf.minim.*;
import processing.serial.*; //library for serial communication
Serial port; //creates object "port" of serial class
Minim minim;
AudioInput in;
FFT fft;
float[] peaks;
BeatDetect beat;
BeatListener bl;
int peak_hold_time = 1; // how long before peak decays
int[] peak_age; // tracks how long peak has been stable, before decaying
// how wide each 'peak' band is, in fft bins
int binsperband = 5;
int peaksize; // how many individual peak bands we have (dep. binsperband)
float gain = 40; // in dB
float dB_scale = 2.0; // pixels per dB
int buffer_size = 512; // also sets FFT size (frequency resolution)
float sample_rate = 44100;
float snareSize;
int spectrum_height = 176; // determines range of dB shown
int[] freq_array = {0,0};
int i,g;
float f;
float[] freq_height = {0,0}; //avg amplitude of each freq band
class BeatListener implements AudioListener
{
private BeatDetect beat;
private AudioInput in;
BeatListener(BeatDetect beat, AudioInput in)
{
this.in = in;
this.in.addListener(this);
this.beat = beat;
}
void samples(float[] samps)
{
beat.detect(in.mix);
}
void samples(float[] sampsL, float[] sampsR)
{
beat.detect(in.mix);
}
}
void setup()
{
size(200, 200);
minim = new Minim(this);
port = new Serial(this, "COM2"); //set baud rate
in = minim.getLineIn(Minim.MONO,buffer_size,sample_rate);
// create an FFT object that has a time-domain buffer
// the same size as line-in's sample buffer
fft = new FFT(in.bufferSize(), in.sampleRate());
beat = new BeatDetect(in.bufferSize(), in.sampleRate());
beat.setSensitivity(10);
snareSize=1;
bl = new BeatListener(beat, in );
// Tapered window important for log-domain display
fft.window(FFT.HAMMING);
// initialize peak-hold structures
peaksize = 1+Math.round(fft.specSize()/binsperband);
peaks = new float[peaksize];
peak_age = new int[peaksize];
}
void draw()
{
for(int k=0; k<2; k++){
freq_array[k] = 0;
}
if ( beat.isSnare() )
{ snareSize=25; }
{ snareSize= constrain(snareSize * 0.98, 0, 25);
println(snareSize);
}
// perform a forward FFT on the samples in input buffer
fft.forward(in.mix);
// Frequency Band Ranges 0 - 5600
freq_height[0] = fft.calcAvg((float) 0, (float)50 );
freq_height[1] = round(snareSize);
// Amplitude Ranges if else tree
for(int j=0; j<2; j++){
if (freq_height[j] < 200000 && freq_height[j] > 15){freq_array[j] = 24;}
else{ if (freq_height[j] <= 15 && freq_height[j] > 14.5){freq_array[j] = 23;}
else{ if (freq_height[j] <= 14.5 && freq_height[j] > 13.{freq_array[j] = 22;}
else{ if (freq_height[j] <= 13.8 && freq_height[j] > 13.2){freq_array[j] = 21;}
else{ if (freq_height[j] <= 13.2 && freq_height[j] > 12.6){freq_array[j] = 20;}
else{ if (freq_height[j] <= 12.6 && freq_height[j] > 12){freq_array[j] = 19;}
else{ if (freq_height[j] <= 12 && freq_height[j] > 11.4){freq_array[j] = 18;}
else{ if (freq_height[j] <= 11.4 && freq_height[j] > 10.{freq_array[j] = 17;}
else{ if (freq_height[j] <= 10.8 && freq_height[j] > 10.2){freq_array[j] = 16;}
else{ if (freq_height[j] <= 10.2 && freq_height[j] > 9.6){freq_array[j] = 15;}
else{ if (freq_height[j] <= 9.6 && freq_height[j] > 9){freq_array[j] = 14;}
else{ if (freq_height[j] <= 9 && freq_height[j] > 8.4){freq_array[j] = 13;}
else{ if (freq_height[j] <= 8.4 && freq_height[j] > 7.{freq_array[j] = 12;}
else{ if (freq_height[j] <= 7.8 && freq_height[j] > 7.2){freq_array[j] = 11;}
else{ if (freq_height[j] <= 7.2 && freq_height[j] > 6.6){freq_array[j] = 10;}
else{ if (freq_height[j] <= 6.6 && freq_height[j] > 6){freq_array[j] = 9;}
else{ if (freq_height[j] <= 6 && freq_height[j] > 5.4){freq_array[j] = 8;}
else{ if (freq_height[j] <= 5.4 && freq_height[j] > 4.{freq_array[j] = 7;}
else{ if (freq_height[j] <= 4.8 && freq_height[j] > 4.2){freq_array[j] = 6;}
else{ if (freq_height[j] <= 4.2 && freq_height[j] > 3.6){freq_array[j] = 5;}
else{ if (freq_height[j] <= 3.6 && freq_height[j] > 3){freq_array[j] = 4;}
else{ if (freq_height[j] <= 3 && freq_height[j] > 2.4){freq_array[j] = 3;}
else{ if (freq_height[j] <= 2.4 && freq_height[j] > 1.{freq_array[j] = 2;}
else{ if (freq_height[j] <= 1.8 && freq_height[j] >= 1.2 ){freq_array[j] = 1;}
else{ if (freq_height[j] < 0.6 ){freq_array[j] = 0;}
}}}}}}}}}}}}}}}}}}}}}}}}}
//send to serial
port.write(0xff); //write marker (0xff) for synchronization
for(i=0; i<2; i++){
port.write((byte)(freq_array));
}
//delay(2); //delay for safety
}
void stop()
{
// always close Minim audio classes when you finish with them
in.close();
minim.stop();
super.stop();
}