24#if SKETCH_HAS_LOTS_OF_MEMORY
48UIButton buttonFancy(
"Trigger Fancy");
50UISlider triggerSpeed(
"Trigger Speed", .5f, 0.0f, 1.0f, 0.01f);
51UICheckbox easeModeSqrt(
"Ease Mode Sqrt",
false);
52UICheckbox useChangeGrid(
"Use Change Grid",
false);
53UISlider blurAmount(
"Global Blur Amount", 0, 0, 172, 1);
54UISlider blurPasses(
"Global Blur Passes", 1, 1, 10, 1);
60UISlider speedUpper(
"Wave Upper: Speed", 0.12f, 0.0f, 1.0f);
61UISlider dampeningUpper(
"Wave Upper: Dampening", 8.9f, 0.0f, 20.0f, 0.1f);
62UICheckbox halfDuplexUpper(
"Wave Upper: Half Duplex",
true);
63UISlider blurAmountUpper(
"Wave Upper: Blur Amount", 95, 0, 172, 1);
64UISlider blurPassesUpper(
"Wave Upper: Blur Passes", 1, 1, 10, 1);
67UISlider speedLower(
"Wave Lower: Speed", 0.26f, 0.0f, 1.0f);
68UISlider dampeningLower(
"Wave Lower: Dampening", 9.0f, 0.0f, 20.0f, 0.1f);
69UICheckbox halfDuplexLower(
"Wave Lower: Half Duplex",
true);
70UISlider blurAmountLower(
"Wave Lower: Blur Amount", 0, 0, 172, 1);
71UISlider blurPassesLower(
"Wave Lower: Blur Passes", 1, 1, 10, 1);
74UISlider fancySpeed(
"Fancy Speed", 796, 0, 1000, 1);
75UISlider fancyIntensity(
"Fancy Intensity", 32, 1, 255, 1);
76UISlider fancyParticleSpan(
"Fancy Particle Span", 0.06f, 0.01f, 0.2f, 0.01f);
79UIHelp changeGridHelp(
"Use Change Grid preserves the set point over multiple iterations to ensure more stable results across simulation resolutions. However, turning it off may result in more dramatic effects and saves memory.");
158 uint8_t min_x = perc *
WIDTH;
159 uint8_t max_x = (1 - perc) *
WIDTH;
160 uint8_t min_y = perc *
HEIGHT;
161 uint8_t max_y = (1 - perc) *
HEIGHT;
164 int x = random(min_x, max_x);
165 int y = random(min_y, max_y);
169 waveFxLower.setf(
x,
y, 1);
170 waveFxUpper.setf(
x,
y, 1);
174void applyFancyEffect(uint32_t now,
bool button_active) {
178 map(fancySpeed.as<uint32_t>(), 0, fancySpeed.getMax(), 1000, 100);
186 pointTransition.
trigger(now, total, 0, 0);
190 if (!pointTransition.
isActive(now)) {
196 int mid_x =
WIDTH / 2;
200 int amount =
WIDTH / 2;
203 int start_x = mid_x - amount;
204 int end_x = mid_x + amount;
205 int start_y = mid_y - amount;
206 int end_y = mid_y + amount;
209 int curr_alpha = pointTransition.
update8(now);
213 int left_x = map(curr_alpha, 0, 255, mid_x, start_x);
214 int down_y = map(curr_alpha, 0, 255, mid_y, start_y);
215 int right_x = map(curr_alpha, 0, 255, mid_x, end_x);
216 int up_y = map(curr_alpha, 0, 255, mid_y, end_y);
219 float curr_alpha_f = curr_alpha / 255.0f;
223 float valuef = (1.0f - curr_alpha_f) * fancyIntensity.value() / 255.0f;
226 int span = fancyParticleSpan.value() *
WIDTH;
232 for (
int x = left_x -
span;
x < left_x +
span;
x++) {
233 waveFxLower.addf(
x, mid_y, valuef);
234 waveFxUpper.addf(
x, mid_y, valuef);
238 for (
int x = right_x -
span;
x < right_x +
span;
x++) {
239 waveFxLower.addf(
x, mid_y, valuef);
240 waveFxUpper.addf(
x, mid_y, valuef);
244 for (
int y = down_y -
span;
y < down_y +
span;
y++) {
245 waveFxLower.addf(mid_x,
y, valuef);
246 waveFxUpper.addf(mid_x,
y, valuef);
251 waveFxLower.addf(mid_x,
y, valuef);
252 waveFxUpper.addf(mid_x,
y, valuef);
259 bool bigButton =
false;
273 waveFxLower.setSpeed(speedLower);
274 waveFxLower.setDampening(dampeningLower);
275 waveFxLower.setHalfDuplex(halfDuplexLower);
277 waveFxLower.setEasingMode(easeMode);
278 waveFxLower.setUseChangeGrid(useChangeGrid);
281 waveFxUpper.setSpeed(speedUpper);
282 waveFxUpper.setDampening(dampeningUpper);
283 waveFxUpper.setHalfDuplex(halfDuplexUpper);
285 waveFxUpper.setEasingMode(easeMode);
286 waveFxUpper.setUseChangeGrid(useChangeGrid);
289 fxBlend.setGlobalBlurAmount(blurAmount);
290 fxBlend.setGlobalBlurPasses(blurPasses);
302 fxBlend.setParams(waveFxLower, lower_params);
303 fxBlend.setParams(waveFxUpper, upper_params);
308 state.bigButton = buttonFancy;
313void processAutoTrigger(uint32_t now) {
315 static uint32_t nextTrigger = 0;
318 uint32_t trigger_delta = nextTrigger - now;
321 if (trigger_delta > 10000) {
329 if (now >= nextTrigger) {
335 float speed = 1.0f - triggerSpeed.value();
339 uint32_t min_rand = 400 *
speed;
340 uint32_t max_rand = 2000 *
speed;
343 uint32_t min =
MIN(min_rand, max_rand);
344 uint32_t max =
MAX(min_rand, max_rand);
352 nextTrigger = now + random(min, max);
359 auto screenmap =
xyMap.toScreenMap();
360 screenmap.setDiameter(.2);
370 title.setGroup(
"Main Controls");
372 button.setGroup(
"Main Controls");
373 buttonFancy.setGroup(
"Main Controls");
375 triggerSpeed.setGroup(
"Main Controls");
379 easeModeSqrt.setGroup(
"Global Settings");
380 useChangeGrid.setGroup(
"Global Settings");
381 blurAmount.setGroup(
"Global Settings");
382 blurPasses.setGroup(
"Global Settings");
386 speedUpper.setGroup(
"Upper Wave Layer");
387 dampeningUpper.setGroup(
"Upper Wave Layer");
388 halfDuplexUpper.setGroup(
"Upper Wave Layer");
389 blurAmountUpper.setGroup(
"Upper Wave Layer");
390 blurPassesUpper.setGroup(
"Upper Wave Layer");
393 speedLower.setGroup(
"Lower Wave Layer");
394 dampeningLower.setGroup(
"Lower Wave Layer");
395 halfDuplexLower.setGroup(
"Lower Wave Layer");
396 blurAmountLower.setGroup(
"Lower Wave Layer");
397 blurPassesLower.setGroup(
"Lower Wave Layer");
400 fancySpeed.setGroup(
"Fancy Effects");
401 fancyIntensity.setGroup(
"Fancy Effects");
402 fancyParticleSpan.setGroup(
"Fancy Effects");
406 fxBlend.add(waveFxLower);
407 fxBlend.add(waveFxUpper);
415 uint32_t now = millis();
418 waveFxLower.setXCylindrical(
xCyclical.value());
429 applyFancyEffect(now, state.bigButton);
432 processAutoTrigger(now);
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
central include file for FastLED, defines the CFastLED class/object
UICheckbox autoTrigger("Auto Trigger", true)
UICheckbox xCyclical("X Is Cyclical", true)
UITitle title("Audio Reactive Visualizations")
UIDescription description("Real-time audio visualizations with beat detection and multiple modes")
LED controller for WS2812 LEDs with GRB color order.
void trigger(u32 now) override
Call this when you want to (re)start the ramp cycle.
u8 update8(u32 now) override
Compute current 0–255 output based on how much time has elapsed since trigger().
bool isActive(u32 now) const override
#define DEFINE_GRADIENT_PALETTE(X)
Defines a static RGB palette very compactly using a series of connected color gradients.
WaveFx::Args CreateArgsLower()
WaveFx::Args CreateArgsUpper()
void triggerRipple(WaveSimulation1D &waveSim, int x)
UISlider superSample("SuperSampleExponent", 0.f, 0.f, 3.f, 1.f)
SuperSample getSuperSample()
shared_ptr< T > make_shared(Args &&... args)
UIButton button("Button")
Representation of an RGB pixel (Red, Green, Blue)