I've never used FFT. I've done some lighting effects, but everything I've done works off the volume (no frequency filtering and no true beat detection).
Accurate beat detection isn't that easy... Detecting the bass isn't exactly the same as detecting the beat. But IMO, a lighting effect that accurately pulses to the beat 1-2-3-4-1-2-3-4 is kind-of boring anyway!
Some people have done beat detection, so you might want to search the forum. I think it requires two filters - One low-pass to filter-out everything except the bass, and a bandpass-filter tuned to the beat frequency (around 1/4 of a second or about 4Hz). That 2nd filter is not
to filter the signal
(there should be no signal at 4Hz), it's used to filter the detected loudness
envelope. (If it was me, I'd probaly do the bass-filter in hardware and the beat-filter in software.) Then if you wan to get really good, use some "fuzzy logic" to tune that 2nd filter and know when to expect
the next beat... That's how humans do it... We don't wait 'till we hear the the beat and then tap our foot... We know
when that next beat is coming and we make tiny adjustments as we listen to keep our foot-tapping in-time with the music.
Something that's super-easy
to do with just the volume (once you have the hardware setup so that you can read the loudness on an analog pin) is to compare the input to the average, and turn on the light/LED whenever the signal is louder than average. That's more of a "flicker effect" than a beat effect, but its something simple to start with.
The Smoothing Example
example shows you how to get a moving-average. If you use a moving average, you won't need a sensitivity control, and your effect will automatically adjust itself to loud songs, quiet songs, and volume changes. (In my application, I also switch automatically between the 1V and 5V analog references, depending on the signal level.)
I use a 20-second moving-average, updating the average-array once a second. (Of course, I use the "blink without delay" style timing, so it can uns and flash the lights in-between updating the average.)
For some of my effects, I find the peak value in the average-array, and use that as my trigger threshold. (For example, a chase effect that changes direction only when it hits a new peak.) For other effects, I use the halfway point between the peak and average. If you want to use the peak to detect the beat, you might pick a threshold that's something like 90% of the peak value in your array. You don't want one big peak to throw everything off...
For my very-crude beat detection, I just delay (or ignore peaks) for about 1/5th of a second, so that I don't get to many beats/flashes close-together. That's nothing like accurate beat detection, but you do get the feeling the that the lights are being triggered with the beat, and it's easy to do! ...Actually, there's one more "tweek" I'm using. I increase the sensitivity while waiting for the next beat. So... I'm unlikely to get a beat trigger exactly when 1/5th of a second is up, but after 1/2 second the sensitivity is going up and I'm very-likely to detect a beat.