blurz effect upgrade
* avoid black spots * better randomness on esp32 * new mode "FreqMap" (checkbox) - blob location follows major frequency * new mode "GEQ scanner" (checkbox) - blob location based on GEQ band --> looks cool with Pinwheel or Bar or Arc mapping --> will be even better with the new Waterfall mapping mode
This commit is contained in:
@@ -7589,6 +7589,8 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
|
|||||||
um_data_t *um_data = getAudioData();
|
um_data_t *um_data = getAudioData();
|
||||||
uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
|
uint8_t *fftResult = (uint8_t*)um_data->u_data[2];
|
||||||
float volumeSmth = *(float*)um_data->u_data[0];
|
float volumeSmth = *(float*)um_data->u_data[0];
|
||||||
|
float FFT_MajorPeak = *(float*)um_data->u_data[4];
|
||||||
|
if (FFT_MajorPeak < 1) FFT_MajorPeak = 1;
|
||||||
|
|
||||||
if (SEGENV.call == 0) {
|
if (SEGENV.call == 0) {
|
||||||
SEGMENT.setUpLeds(); // not sure if necessary
|
SEGMENT.setUpLeds(); // not sure if necessary
|
||||||
@@ -7598,6 +7600,10 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
|
|||||||
SEGENV.step = 0; // last pixel color
|
SEGENV.step = 0; // last pixel color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
|
random16_add_entropy(esp_random() & 0xFFFF); // improves randonmess
|
||||||
|
#endif
|
||||||
|
|
||||||
int fadeoutDelay = (256 - SEGMENT.speed) / 24;
|
int fadeoutDelay = (256 - SEGMENT.speed) / 24;
|
||||||
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0))
|
if ((fadeoutDelay <= 1 ) || ((SEGENV.call % fadeoutDelay) == 0))
|
||||||
SEGMENT.fadeToBlackBy(max(SEGMENT.speed, (uint8_t)1));
|
SEGMENT.fadeToBlackBy(max(SEGMENT.speed, (uint8_t)1));
|
||||||
@@ -7606,10 +7612,25 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
|
|||||||
}
|
}
|
||||||
if ((SEGENV.aux1 < SEGLEN) && (volumeSmth > 1.0f)) SEGMENT.setPixelColor(SEGENV.aux1,SEGENV.step); // "repaint" last pixel after blur
|
if ((SEGENV.aux1 < SEGLEN) && (volumeSmth > 1.0f)) SEGMENT.setPixelColor(SEGENV.aux1,SEGENV.step); // "repaint" last pixel after blur
|
||||||
|
|
||||||
|
unsigned freqBand = SEGENV.aux0 % 16;
|
||||||
uint16_t segLoc = random16(SEGLEN);
|
uint16_t segLoc = random16(SEGLEN);
|
||||||
|
|
||||||
|
if (SEGENV.check1) { // FreqMap mode : blob location by major frequency
|
||||||
|
int freqLocn;
|
||||||
|
unsigned maxLen = (SEGENV.check2) ? max(1, SEGLEN-16): SEGLEN; // usable segment length - leave 16 pixels when embedding "GEQ scan"
|
||||||
|
freqLocn = roundf((log10f((float)FFT_MajorPeak) - 1.78f) * float(maxLen)/(MAX_FREQ_LOG10 - 1.78f)); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN. // WLEDMM proper rounding
|
||||||
|
if (freqLocn < 1) freqLocn = 0; // avoid underflow
|
||||||
|
segLoc = (SEGENV.check2) ? freqLocn + freqBand : freqLocn;
|
||||||
|
} else if (SEGENV.check2) { // GEQ Scanner mode: blob location is defined by frequency band + random offset
|
||||||
|
float bandWidth = float(SEGLEN) / 16.0f;
|
||||||
|
int bandStart = roundf(bandWidth * freqBand);
|
||||||
|
segLoc = bandStart + random16(max(1, int(bandWidth)));
|
||||||
|
}
|
||||||
|
segLoc = max(uint16_t(0), min(uint16_t(SEGLEN-1), segLoc)); // fix overflows
|
||||||
|
|
||||||
if (SEGLEN < 2) segLoc = 0; // WLEDMM just to be sure
|
if (SEGLEN < 2) segLoc = 0; // WLEDMM just to be sure
|
||||||
unsigned pixColor = (2*fftResult[SEGENV.aux0%16]*240)/max(1, SEGLEN-1); // WLEDMM avoid uint8 overflow, and preserve pixel parameters for redraw
|
unsigned pixColor = (2*fftResult[freqBand]*240)/max(1, SEGLEN-1); // WLEDMM avoid uint8 overflow, and preserve pixel parameters for redraw
|
||||||
unsigned pixIntensity = min((unsigned)(2.0f*fftResult[SEGENV.aux0%16]), 255U);
|
unsigned pixIntensity = min((unsigned)(2.0f*fftResult[freqBand]), 255U);
|
||||||
|
|
||||||
if (volumeSmth > 1.0f) {
|
if (volumeSmth > 1.0f) {
|
||||||
SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint16_t)pixColor, false, PALETTE_SOLID_WRAP, 0),(uint8_t)pixIntensity));
|
SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint16_t)pixColor, false, PALETTE_SOLID_WRAP, 0),(uint8_t)pixIntensity));
|
||||||
@@ -7619,12 +7640,12 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
|
|||||||
SEGMENT.blur(max(SEGMENT.intensity, (uint8_t)1));
|
SEGMENT.blur(max(SEGMENT.intensity, (uint8_t)1));
|
||||||
SEGENV.aux0 ++;
|
SEGENV.aux0 ++;
|
||||||
SEGENV.aux0 %= 16; // make sure it doesn't cross 16
|
SEGENV.aux0 %= 16; // make sure it doesn't cross 16
|
||||||
SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint16_t)pixColor, false, PALETTE_SOLID_WRAP, 0),(uint8_t)pixIntensity)); // repaint center pixel after blur
|
SEGMENT.addPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint16_t)pixColor, false, PALETTE_SOLID_WRAP, 0),(uint8_t)pixIntensity/2)); // repaint center pixel after blur
|
||||||
} else SEGMENT.blur(max(SEGMENT.intensity, (uint8_t)1)); // silence - just blur it again
|
} else SEGMENT.blur(max(SEGMENT.intensity, (uint8_t)1)); // silence - just blur it again
|
||||||
|
|
||||||
return FRAMETIME_FIXED;
|
return SEGENV.check2 ? FRAMETIME : (3*FRAMETIME_FIXED/4); // faster updates in GEQ Scanner mode
|
||||||
} // mode_blurz()
|
} // mode_blurz()
|
||||||
static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz ☾@Fade rate,Blur;!,Color mix;!;01f;sx=48,ix=127,m12=0,si=0"; // Pixels, Beatsin
|
static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz Plus ☾@Fade rate,Blur,,,,FreqMap ☾,GEQ Scanner ☾,;!,Color mix;!;01f;sx=48,ix=127,m12=7,si=0"; // Pinwheel, Beatsin
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user