@@ -642,45 +642,39 @@ static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,!;!,!;!;;m12=0";
642
642
* Dissolve function
643
643
*/
644
644
uint16_t dissolve (uint32_t color) {
645
- unsigned dataSize = (SEGLEN+ 7 ) >> 3 ; // 1 bit per LED
645
+ unsigned dataSize = sizeof ( uint32_t ) * SEGLEN;
646
646
if (!SEGENV.allocateData (dataSize)) return mode_static (); // allocation failed
647
+ uint32_t * pixels = reinterpret_cast <uint32_t *>(SEGENV.data );
647
648
648
649
if (SEGENV.call == 0 ) {
649
- memset (SEGMENT. data , 0xFF , dataSize); // start by fading pixels up
650
+ for ( unsigned i = 0 ; i < SEGLEN; i++) pixels[i] = SEGCOLOR ( 1 );
650
651
SEGENV.aux0 = 1 ;
651
652
}
652
653
653
654
for (unsigned j = 0 ; j <= SEGLEN / 15 ; j++) {
654
655
if (hw_random8 () <= SEGMENT.intensity ) {
655
656
for (size_t times = 0 ; times < 10 ; times++) { // attempt to spawn a new pixel 10 times
656
657
unsigned i = hw_random16 (SEGLEN);
657
- unsigned index = i >> 3 ;
658
- unsigned bitNum = i & 0x07 ;
659
- bool fadeUp = bitRead (SEGENV.data [index ], bitNum);
660
658
if (SEGENV.aux0 ) { // dissolve to primary/palette
661
- if (fadeUp) {
662
- if (color == SEGCOLOR (0 )) {
663
- SEGMENT.setPixelColor (i, SEGMENT.color_from_palette (i, true , PALETTE_SOLID_WRAP, 0 ));
664
- } else {
665
- SEGMENT.setPixelColor (i, color);
666
- }
667
- bitWrite (SEGENV.data [index ], bitNum, false );
659
+ if (pixels[i] == SEGCOLOR (1 )) {
660
+ pixels[i] = color == SEGCOLOR (0 ) ? SEGMENT.color_from_palette (i, true , PALETTE_SOLID_WRAP, 0 ) : color;
668
661
break ; // only spawn 1 new pixel per frame per 50 LEDs
669
662
}
670
663
} else { // dissolve to secondary
671
- if (!fadeUp ) {
672
- SEGMENT. setPixelColor (i, SEGCOLOR (1 )); break ;
673
- bitWrite (SEGENV. data [ index ], bitNum, true ) ;
664
+ if (pixels[i] != SEGCOLOR ( 1 ) ) {
665
+ pixels[i] = SEGCOLOR (1 );
666
+ break ;
674
667
}
675
668
}
676
669
}
677
670
}
678
671
}
672
+ // fix for #4401
673
+ for (unsigned i = 0 ; i < SEGLEN; i++) SEGMENT.setPixelColor (i, pixels[i]);
679
674
680
675
if (SEGENV.step > (255 - SEGMENT.speed ) + 15U ) {
681
676
SEGENV.aux0 = !SEGENV.aux0 ;
682
677
SEGENV.step = 0 ;
683
- memset (SEGMENT.data , (SEGENV.aux0 ? 0xFF : 0 ), dataSize); // switch fading
684
678
} else {
685
679
SEGENV.step ++;
686
680
}
@@ -6568,23 +6562,31 @@ static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;!,!;!;
6568
6562
// * MATRIPIX //
6569
6563
// ////////////////////
6570
6564
uint16_t mode_matripix (void ) { // Matripix. By Andrew Tuline.
6571
- if (SEGLEN == 1 ) return mode_static ();
6572
- // even with 1D effect we have to take logic for 2D segments for allocation as fill_solid() fills whole segment
6565
+ // effect can work on single pixels, we just lose the shifting effect
6566
+ unsigned dataSize = sizeof (uint32_t ) * SEGLEN;
6567
+ if (!SEGENV.allocateData (dataSize)) return mode_static (); // allocation failed
6568
+ uint32_t * pixels = reinterpret_cast <uint32_t *>(SEGENV.data );
6573
6569
6574
6570
um_data_t *um_data = getAudioData ();
6575
6571
int volumeRaw = *(int16_t *)um_data->u_data [1 ];
6576
6572
6577
6573
if (SEGENV.call == 0 ) {
6578
- SEGMENT. fill (BLACK);
6574
+ for ( unsigned i = 0 ; i < SEGLEN; i++) pixels[i] = BLACK; // may not be needed as resetIfRequired() clears buffer
6579
6575
}
6580
6576
6581
6577
uint8_t secondHand = micros ()/(256 -SEGMENT.speed )/500 % 16 ;
6582
6578
if (SEGENV.aux0 != secondHand) {
6583
6579
SEGENV.aux0 = secondHand;
6584
6580
6585
- uint8_t pixBri = volumeRaw * SEGMENT.intensity / 64 ;
6586
- for (unsigned i = 0 ; i < SEGLEN-1 ; i++) SEGMENT.setPixelColor (i, SEGMENT.getPixelColor (i+1 )); // shift left
6587
- SEGMENT.setPixelColor (SEGLEN-1 , color_blend (SEGCOLOR (1 ), SEGMENT.color_from_palette (strip.now , false , PALETTE_SOLID_WRAP, 0 ), pixBri));
6581
+ int pixBri = volumeRaw * SEGMENT.intensity / 64 ;
6582
+ unsigned k = SEGLEN-1 ;
6583
+ // loop will not execute if SEGLEN equals 1
6584
+ for (unsigned i = 0 ; i < k; i++) {
6585
+ pixels[i] = pixels[i+1 ]; // shift left
6586
+ SEGMENT.setPixelColor (i, pixels[i]);
6587
+ }
6588
+ pixels[k] = color_blend (SEGCOLOR (1 ), SEGMENT.color_from_palette (strip.now , false , PALETTE_SOLID_WRAP, 0 ), pixBri);
6589
+ SEGMENT.setPixelColor (k, pixels[k]);
6588
6590
}
6589
6591
6590
6592
return FRAMETIME;
@@ -7139,8 +7141,11 @@ static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;!,!;!;01f;m12=
7139
7141
// Combines peak detection with FFT_MajorPeak and FFT_Magnitude.
7140
7142
uint16_t mode_waterfall (void ) { // Waterfall. By: Andrew Tuline
7141
7143
// effect can work on single pixels, we just lose the shifting effect
7142
-
7143
- um_data_t *um_data = getAudioData ();
7144
+ unsigned dataSize = sizeof (uint32_t ) * SEGLEN;
7145
+ if (!SEGENV.allocateData (dataSize)) return mode_static (); // allocation failed
7146
+ uint32_t * pixels = reinterpret_cast <uint32_t *>(SEGENV.data );
7147
+
7148
+ um_data_t *um_data = getAudioData ();
7144
7149
uint8_t samplePeak = *(uint8_t *)um_data->u_data [3 ];
7145
7150
float FFT_MajorPeak = *(float *) um_data->u_data [4 ];
7146
7151
uint8_t *maxVol = (uint8_t *)um_data->u_data [6 ];
@@ -7150,7 +7155,7 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
7150
7155
if (FFT_MajorPeak < 1 ) FFT_MajorPeak = 1 ; // log10(0) is "forbidden" (throws exception)
7151
7156
7152
7157
if (SEGENV.call == 0 ) {
7153
- SEGMENT. fill (BLACK);
7158
+ for ( unsigned i = 0 ; i < SEGLEN; i++) pixels[i] = BLACK; // may not be needed as resetIfRequired() clears buffer
7154
7159
SEGENV.aux0 = 255 ;
7155
7160
SEGMENT.custom1 = *binNum;
7156
7161
SEGMENT.custom2 = *maxVol * 2 ;
@@ -7167,13 +7172,18 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
7167
7172
uint8_t pixCol = (log10f (FFT_MajorPeak) - 2 .26f ) * 150 ; // 22Khz sampling - log10 frequency range is from 2.26 (182hz) to 3.967 (9260hz). Let's scale accordingly.
7168
7173
if (FFT_MajorPeak < 182 .0f ) pixCol = 0 ; // handle underflow
7169
7174
7175
+ unsigned k = SEGLEN-1 ;
7170
7176
if (samplePeak) {
7171
- SEGMENT. setPixelColor (SEGLEN- 1 , CHSV (92 ,92 ,92 ));
7177
+ pixels[k] = ( uint32_t ) CRGB ( CHSV (92 ,92 ,92 ));
7172
7178
} else {
7173
- SEGMENT. setPixelColor (SEGLEN- 1 , color_blend (SEGCOLOR (1 ), SEGMENT.color_from_palette (pixCol+SEGMENT.intensity , false , PALETTE_SOLID_WRAP, 0 ), (uint8_t )my_magnitude) );
7179
+ pixels[k] = color_blend (SEGCOLOR (1 ), SEGMENT.color_from_palette (pixCol+SEGMENT.intensity , false , PALETTE_SOLID_WRAP, 0 ), (uint8_t )my_magnitude);
7174
7180
}
7181
+ SEGMENT.setPixelColor (k, pixels[k]);
7175
7182
// loop will not execute if SEGLEN equals 1
7176
- for (unsigned i = 0 ; i < SEGLEN-1 ; i++) SEGMENT.setPixelColor (i, SEGMENT.getPixelColor (i+1 )); // shift left
7183
+ for (unsigned i = 0 ; i < k; i++) {
7184
+ pixels[i] = pixels[i+1 ]; // shift left
7185
+ SEGMENT.setPixelColor (i, pixels[i]);
7186
+ }
7177
7187
}
7178
7188
7179
7189
return FRAMETIME;
0 commit comments