FastLED 3.9.15
Loading...
Searching...
No Matches
pacifica.h
Go to the documentation of this file.
1#pragma once
2
3#include "FastLED.h"
4#include "fx/fx1d.h"
5#include "fl/namespace.h"
6
7namespace fl {
8
12
14
15class Pacifica : public Fx1d {
16 public:
17 Pacifica(uint16_t num_leds) : Fx1d(num_leds) {}
18
19 void draw(DrawContext context) override;
20 fl::Str fxName() const override { return "Pacifica"; }
21
22 private:
23 uint16_t sCIStart1 = 0, sCIStart2 = 0, sCIStart3 = 0, sCIStart4 = 0;
24 uint32_t sLastms = 0;
25
26 CRGBPalette16 pacifica_palette_1 = {0x000507, 0x000409, 0x00030B, 0x00030D,
27 0x000210, 0x000212, 0x000114, 0x000117,
28 0x000019, 0x00001C, 0x000026, 0x000031,
29 0x00003B, 0x000046, 0x14554B, 0x28AA50};
30 CRGBPalette16 pacifica_palette_2 = {0x000507, 0x000409, 0x00030B, 0x00030D,
31 0x000210, 0x000212, 0x000114, 0x000117,
32 0x000019, 0x00001C, 0x000026, 0x000031,
33 0x00003B, 0x000046, 0x0C5F52, 0x19BE5F};
34 CRGBPalette16 pacifica_palette_3 = {0x000208, 0x00030E, 0x000514, 0x00061A,
35 0x000820, 0x000927, 0x000B2D, 0x000C33,
36 0x000E39, 0x001040, 0x001450, 0x001860,
37 0x001C70, 0x002080, 0x1040BF, 0x2060FF};
38
39 void pacifica_one_layer(CRGB* leds, CRGBPalette16 &p, uint16_t cistart,
40 uint16_t wavescale, uint8_t bri, uint16_t ioff);
43};
44
46 CRGB *leds = ctx.leds;
47 uint32_t now = ctx.now;
48 if (leds == nullptr || mNumLeds == 0) {
49 return;
50 }
51
52 // Update the hue each time through the loop
53 uint32_t ms = now;
54 uint32_t deltams = ms - sLastms;
55 sLastms = ms;
56 uint16_t speedfactor1 = beatsin16(3, 179, 269);
57 uint16_t speedfactor2 = beatsin16(4, 179, 269);
58 uint32_t deltams1 = (deltams * speedfactor1) / 256;
59 uint32_t deltams2 = (deltams * speedfactor2) / 256;
60 uint32_t deltams21 = (deltams1 + deltams2) / 2;
61 sCIStart1 += (deltams1 * beatsin88(1011, 10, 13));
62 sCIStart2 -= (deltams21 * beatsin88(777, 8, 11));
63 sCIStart3 -= (deltams1 * beatsin88(501, 5, 7));
64 sCIStart4 -= (deltams2 * beatsin88(257, 4, 6));
65
66 // Clear out the LED array to a dim background blue-green
67 fill_solid(leds, mNumLeds, CRGB(2, 6, 10));
68
69 // Render each of four layers, with different scales and speeds, that vary
70 // over time
72 beatsin16(3, 11 * 256, 14 * 256), beatsin8(10, 70, 130),
73 0 - beat16(301));
75 beatsin16(4, 6 * 256, 9 * 256), beatsin8(17, 40, 80),
76 beat16(401));
78 beatsin8(9, 10, 38), 0 - beat16(503));
80 beatsin8(8, 10, 28), beat16(601));
81
82 // Add brighter 'whitecaps' where the waves lines up more
84
85 // Deepen the blues and greens a bit
87}
88
89// Add one layer of waves into the led array
91 uint16_t wavescale, uint8_t bri,
92 uint16_t ioff) {
93 uint16_t ci = cistart;
94 uint16_t waveangle = ioff;
95 uint16_t wavescale_half = (wavescale / 2) + 20;
96 for (uint16_t i = 0; i < mNumLeds; i++) {
97 waveangle += 250;
98 uint16_t s16 = sin16(waveangle) + 32768;
99 uint16_t cs = scale16(s16, wavescale_half) + wavescale_half;
100 ci += cs;
101 uint16_t sindex16 = sin16(ci) + 32768;
102 uint8_t sindex8 = scale16(sindex16, 240);
103 CRGB c = ColorFromPalette(p, sindex8, bri, LINEARBLEND);
104 leds[i] += c;
105 }
106}
107
108// Add extra 'white' to areas where the four layers of light have lined up
109// brightly
111 uint8_t basethreshold = beatsin8(9, 55, 65);
112 uint8_t wave = beat8(7);
113
114 for (uint16_t i = 0; i < mNumLeds; i++) {
115 uint8_t threshold = scale8(sin8(wave), 20) + basethreshold;
116 wave += 7;
117 uint8_t l = leds[i].getAverageLight();
118 if (l > threshold) {
119 uint8_t overage = l - threshold;
120 uint8_t overage2 = qadd8(overage, overage);
121 leds[i] += CRGB(overage, overage2, qadd8(overage2, overage2));
122 }
123 }
124}
125
126// Deepen the blues and greens
128 for (uint16_t i = 0; i < mNumLeds; i++) {
129 leds[i].blue = scale8(leds[i].blue, 145);
130 leds[i].green = scale8(leds[i].green, 200);
131 leds[i] |= CRGB(2, 5, 7);
132 }
133}
134
135} // namespace fl
CRGB leds[NUM_LEDS]
Definition Apa102.ino:11
central include file for FastLED, defines the CFastLED class/object
void pacifica_deepen_colors()
Definition Pacifica.ino:149
void pacifica_add_whitecaps()
Definition Pacifica.ino:131
RGB color palette with 16 discrete values.
Fx1d(uint16_t numLeds)
Definition fx1d.h:14
uint16_t mNumLeds
Definition fx.h:50
_DrawContext DrawContext
Definition fx.h:21
void pacifica_deepen_colors(CRGB *leds)
Definition pacifica.h:127
Pacifica(uint16_t num_leds)
Definition pacifica.h:17
void draw(DrawContext context) override
Definition pacifica.h:45
CRGBPalette16 pacifica_palette_1
Definition pacifica.h:26
uint32_t sLastms
Definition pacifica.h:24
fl::Str fxName() const override
Definition pacifica.h:20
CRGBPalette16 pacifica_palette_3
Definition pacifica.h:34
uint16_t sCIStart4
Definition pacifica.h:23
CRGBPalette16 pacifica_palette_2
Definition pacifica.h:30
uint16_t sCIStart3
Definition pacifica.h:23
void pacifica_add_whitecaps(CRGB *leds)
Definition pacifica.h:110
uint16_t sCIStart1
Definition pacifica.h:23
void pacifica_one_layer(CRGB *leds, CRGBPalette16 &p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff)
Definition pacifica.h:90
uint16_t sCIStart2
Definition pacifica.h:23
Definition str.h:368
#define FASTLED_SMART_PTR(type)
Definition ptr.h:17
LIB8STATIC uint8_t beat8(accum88 beats_per_minute, uint32_t timebase=0)
Generates an 8-bit "sawtooth" wave at a given BPM.
Definition lib8tion.h:923
LIB8STATIC uint16_t beatsin16(accum88 beats_per_minute, uint16_t lowest=0, uint16_t highest=65535, uint32_t timebase=0, uint16_t phase_offset=0)
Generates a 16-bit sine wave at a given BPM that oscillates within a given range.
Definition lib8tion.h:957
LIB8STATIC uint16_t beat16(accum88 beats_per_minute, uint32_t timebase=0)
Generates a 16-bit "sawtooth" wave at a given BPM.
Definition lib8tion.h:913
LIB8STATIC uint8_t beatsin8(accum88 beats_per_minute, uint8_t lowest=0, uint8_t highest=255, uint32_t timebase=0, uint8_t phase_offset=0)
Generates an 8-bit sine wave at a given BPM that oscillates within a given range.
Definition lib8tion.h:975
LIB8STATIC uint16_t beatsin88(accum88 beats_per_minute_88, uint16_t lowest=0, uint16_t highest=65535, uint32_t timebase=0, uint16_t phase_offset=0)
Generates a 16-bit sine wave at a given BPM that oscillates within a given range.
Definition lib8tion.h:939
void fill_solid(struct CRGB *targetArray, int numToFill, const struct CRGB &color)
Fill a range of LEDs with a solid color.
LIB8STATIC_ALWAYS_INLINE uint8_t qadd8(uint8_t i, uint8_t j)
Add one byte to another, saturating at 0xFF.
Definition math8.h:31
@ LINEARBLEND
Linear interpolation between palette entries, with wrap-around from end to the beginning again.
CRGB ColorFromPalette(const CRGBPalette16 &pal, uint8_t index, uint8_t brightness, TBlendType blendType)
Get a color from a palette.
LIB8STATIC uint16_t scale16(uint16_t i, fract16 scale)
Scale a 16-bit unsigned value by an 16-bit value, which is treated as the numerator of a fraction who...
Definition scale8.h:540
LIB8STATIC_ALWAYS_INLINE uint8_t scale8(uint8_t i, fract8 scale)
Scale one byte by a second one, which is treated as the numerator of a fraction whose denominator is ...
Definition scale8.h:34
#define sin16
Platform-independent alias of the fast sin implementation.
Definition trig8.h:98
#define sin8
Platform-independent alias of the fast sin implementation.
Definition trig8.h:216
Implements the FastLED namespace macros.
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
static FASTLED_NAMESPACE_BEGIN uint8_t const p[]
Definition noise.cpp:56
Representation of an RGB pixel (Red, Green, Blue)
Definition crgb.h:54