The Right Thing to Do (makes GEQ look awesome)
... found that stupid commit messages get more attention ;-) - use 22050 Hz for sampling, as it is a standard frequency. I think this is the best choise. - redesigned the GEQ channels (fftResult[]) for 22Khz, based on channels found on old HiFi equalizer equipment. 1Kzh is now at the center; Bass/Trebble channels are using 1/4 on left/right side respectively - similar to real equalizers. Looks nice :-) - adjusted effects that use FFT_MajorPeak so that the maximum frequency is supported.
This commit is contained in:
@@ -5938,7 +5938,7 @@ static const char _data_FX_MODE_2DDRIFTROSE[] PROGMEM = "Drift Rose@Fade,Blur;;;
|
||||
|
||||
uint8_t *binNum = (uint8_t*)&SEGENV.aux1, *maxVol = (uint8_t*)(&SEGENV.aux1+1); // just in case assignment
|
||||
bool samplePeak = false;
|
||||
float FFT_MajorPeak = 0.0;
|
||||
float FFT_MajorPeak = 1.0;
|
||||
uint8_t *fftResult = nullptr;
|
||||
float *fftBin = nullptr;
|
||||
um_data_t *um_data;
|
||||
@@ -5958,6 +5958,15 @@ static const char _data_FX_MODE_2DDRIFTROSE[] PROGMEM = "Drift Rose@Fade,Blur;;;
|
||||
}
|
||||
*/
|
||||
|
||||
// a few constants needed for AudioReactive effects
|
||||
// for 22Khz sampling
|
||||
#define MAX_FREQUENCY 11025 // sample frequency / 2 (as per Nyquist criterion)
|
||||
#define MAX_FREQ_LOG10 4.04238f // log10(MAX_FREQUENCY)
|
||||
|
||||
// for 20Khz sampling
|
||||
//#define MAX_FREQUENCY 10240 // sample frequency / 2 (as per Nyquist criterion)
|
||||
//#define MAX_FREQ_LOG10 4.0103f // log10(MAX_FREQUENCY)
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
// * Ripple Peak //
|
||||
@@ -6724,12 +6733,12 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
|
||||
SEGMENT.fade_out(SEGMENT.speed);
|
||||
|
||||
// int locn = (log10f((float)FFT_MajorPeak) - 1.78f) * (float)SEGLEN/(3.71f-1.78f); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN.
|
||||
int locn = (log10f((float)FFT_MajorPeak) - 1.78f) * (float)SEGLEN/(4.0102f-1.78f); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN.
|
||||
int locn = (log10f((float)FFT_MajorPeak) - 1.78f) * (float)SEGLEN/(MAX_FREQ_LOG10 - 1.78f); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN.
|
||||
if (locn < 1) locn = 0; // avoid underflow
|
||||
|
||||
if (locn >=SEGLEN) locn = SEGLEN-1;
|
||||
//uint16_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(3.71f-1.78f); // Scale log10 of frequency values to the 255 colour index.
|
||||
uint16_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(4.0102f-1.78f); // Scale log10 of frequency values to the 255 colour index.
|
||||
uint16_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(MAX_FREQ_LOG10 - 1.78f); // Scale log10 of frequency values to the 255 colour index.
|
||||
uint16_t bright = (int)my_magnitude;
|
||||
|
||||
SEGMENT.setPixelColor(locn, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), bright));
|
||||
@@ -6769,7 +6778,7 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
|
||||
CRGB color = CRGB::Black;
|
||||
|
||||
//if (FFT_MajorPeak > 5120) FFT_MajorPeak = 0;
|
||||
if (FFT_MajorPeak > 10240) FFT_MajorPeak = 0;
|
||||
if (FFT_MajorPeak > MAX_FREQUENCY) FFT_MajorPeak = 1;
|
||||
// MajorPeak holds the freq. value which is most abundant in the last sample.
|
||||
// With our sampling rate of 10240Hz we have a usable freq range from roughtly 80Hz to 10240/2 Hz
|
||||
// we will treat everything with less than 65Hz as 0
|
||||
@@ -6777,8 +6786,8 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
|
||||
if (FFT_MajorPeak < 80) {
|
||||
color = CRGB::Black;
|
||||
} else {
|
||||
int upperLimit = 20 * SEGMENT.custom2;
|
||||
int lowerLimit = 2 * SEGMENT.custom1;
|
||||
int upperLimit = 80 + 42 * SEGMENT.custom2;
|
||||
int lowerLimit = 80 + 3 * SEGMENT.custom1;
|
||||
int i = lowerLimit!=upperLimit ? map(FFT_MajorPeak, lowerLimit, upperLimit, 0, 255) : FFT_MajorPeak;
|
||||
uint16_t b = 255 * intensity;
|
||||
if (b > 255) b = 255;
|
||||
@@ -6818,7 +6827,7 @@ uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
|
||||
for (int i=0; i < SEGMENT.intensity/32+1; i++) {
|
||||
uint16_t locn = random16(0,SEGLEN);
|
||||
//uint8_t pixCol = (log10f(FFT_MajorPeak) - 1.78) * 255.0/(3.71-1.78); // Scale log10 of frequency values to the 255 colour index.
|
||||
uint8_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(4.0102f-1.78f); // Scale log10 of frequency values to the 255 colour index.
|
||||
uint8_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(MAX_FREQ_LOG10 - 1.78f); // Scale log10 of frequency values to the 255 colour index.
|
||||
SEGMENT.setPixelColor(locn, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), (int)my_magnitude));
|
||||
}
|
||||
|
||||
@@ -6869,7 +6878,7 @@ uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschun
|
||||
CRGB color = 0;
|
||||
|
||||
//if (FFT_MajorPeak > 5120) FFT_MajorPeak = 0.0f;
|
||||
if (FFT_MajorPeak > 10240) FFT_MajorPeak = 0.0f;
|
||||
if (FFT_MajorPeak > MAX_FREQUENCY) FFT_MajorPeak = 1.0f;
|
||||
// MajorPeak holds the freq. value which is most abundant in the last sample.
|
||||
// With our sampling rate of 10240Hz we have a usable freq range from roughtly 80Hz to 10240/2 Hz
|
||||
// we will treat everything with less than 65Hz as 0
|
||||
@@ -6877,8 +6886,8 @@ uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschun
|
||||
if (FFT_MajorPeak < 80) {
|
||||
color = CRGB::Black;
|
||||
} else {
|
||||
int upperLimit = 20 * SEGMENT.custom2;
|
||||
int lowerLimit = 2 * SEGMENT.custom1;
|
||||
int upperLimit = 80 + 42 * SEGMENT.custom2;
|
||||
int lowerLimit = 80 + 3 * SEGMENT.custom1;
|
||||
int i = lowerLimit!=upperLimit ? map(FFT_MajorPeak, lowerLimit, upperLimit, 0, 255) : FFT_MajorPeak;
|
||||
uint16_t b = 255.0 * intensity;
|
||||
if (b > 255) b=255;
|
||||
@@ -6927,7 +6936,7 @@ uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
|
||||
for (int i=0; i<tempsamp; i++) {
|
||||
|
||||
//uint8_t index = (log10((int)FFT_MajorPeak) - (3.71-1.78)) * 255; //int? shouldn't it be floor() or similar
|
||||
uint8_t index = (log10f(FFT_MajorPeak) - (4.0102f-1.78f)) * 255; //int? shouldn't it be floor() or similar
|
||||
uint8_t index = (log10f(FFT_MajorPeak) - (MAX_FREQ_LOG10 - 1.78f)) * 255; //int? shouldn't it be floor() or similar
|
||||
|
||||
SEGMENT.setPixelColor(i+SEGLEN/2, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0));
|
||||
SEGMENT.setPixelColor(SEGLEN/2-i-1, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0));
|
||||
|
||||
Reference in New Issue
Block a user