Skip to content

Commit 09a0ea0

Browse files
Added Perlin mode, fixed standby mirror mode bug
1 parent 634b7ed commit 09a0ea0

File tree

9 files changed

+224
-20
lines changed

9 files changed

+224
-20
lines changed

firmware.json

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +0,0 @@
1-
[
2-
{
3-
"type": "8CH_MOSFET_REV_C",
4-
"version": "1.2.0",
5-
"url": "https://raw.githubusercontent.com/hoeken/yarrboard/main/firmware/releases/8CH_MOSFET_REV_C-1.2.0.bin",
6-
"changelog": "## Version 1.1.1\n\n* Minor ui improvements for debugging\n\n## Version 1.1.0\n\n* New crash handler and coredump recording.\n\n## Version 1.0.1\n\n* Better release automation.\n\n## Version 1.0.0\n\n* First 'official' release into the wild."
7-
},
8-
{
9-
"type": "RGB_INPUT_REV_B",
10-
"version": "1.2.0",
11-
"url": "https://raw.githubusercontent.com/hoeken/yarrboard/main/firmware/releases/RGB_INPUT_REV_B-1.2.0.bin",
12-
"changelog": "## Version 1.1.1\n\n* Minor ui improvements for debugging\n\n## Version 1.1.0\n\n* New crash handler and coredump recording.\n\n## Version 1.0.1\n\n* Better release automation.\n\n## Version 1.0.0\n\n* First 'official' release into the wild."
13-
}
14-
]

src/EMOTISCOPE_FIRMWARE.ino

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
// ## SOFTWARE VERSION ########################################################
5454

5555
#define SOFTWARE_VERSION_MAJOR ( 1 )
56-
#define SOFTWARE_VERSION_MINOR ( 1 )
56+
#define SOFTWARE_VERSION_MINOR ( 2 )
5757
#define SOFTWARE_VERSION_PATCH ( 0 )
5858

5959

@@ -87,6 +87,7 @@
8787
#include "utilities.h" // .......... Custom generic math functions
8888
#include "system.h" // ............. Lowest-level firmware functions
8989
#include "led_driver.h" // ......... Low-level LED communication, (ab)uses RMT for non-blocking output
90+
#include "perlin.h" // ............. Perlin noise generator
9091
#include "leds.h" // ............... LED dithering, effects, filters
9192
#include "touch.h" // .............. Handles capacitive touch input
9293
#include "indicator.h" // .......... Little light bulb

src/EMOTISCOPE_FIRMWARE.ino.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# 1 "C:\\Users\\conno\\AppData\\Local\\Temp\\tmpad0q33mk"
2+
#include <Arduino.h>
3+
# 1 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
4+
# 55 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
5+
#define SOFTWARE_VERSION_MAJOR ( 1 )
6+
#define SOFTWARE_VERSION_MINOR ( 1 )
7+
#define SOFTWARE_VERSION_PATCH ( 0 )
8+
9+
10+
11+
12+
13+
14+
15+
#include <PsychicHttp.h>
16+
#include <HTTPClient.h>
17+
#include <ESPmDNS.h>
18+
#include <Ticker.h>
19+
#include <DNSServer.h>
20+
#include <Preferences.h>
21+
#include <Update.h>
22+
#include <WiFi.h>
23+
#include <esp_dsp.h>
24+
#include <esp_wifi.h>
25+
26+
27+
#include "global_defines.h"
28+
#include "hardware_version.h"
29+
#include "types.h"
30+
#include "profiler.h"
31+
#include "sliders.h"
32+
#include "toggles.h"
33+
#include "menu_toggles.h"
34+
#include "menu_dropdowns.h"
35+
#include "filesystem.h"
36+
#include "configuration.h"
37+
#include "utilities.h"
38+
#include "system.h"
39+
#include "led_driver.h"
40+
#include "perlin.h"
41+
#include "leds.h"
42+
#include "touch.h"
43+
#include "indicator.h"
44+
#include "ui.h"
45+
#include "microphone.h"
46+
#include "vu.h"
47+
#include "goertzel.h"
48+
#include "tempo.h"
49+
#include "audio_debug.h"
50+
#include "screensaver.h"
51+
#include "standby.h"
52+
#include "light_modes.h"
53+
#include "commands.h"
54+
#include "wireless.h"
55+
#include "ota.h"
56+
57+
58+
#include "cpu_core.h"
59+
#include "gpu_core.h"
60+
#include "web_core.h"
61+
# 120 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
62+
void loop();
63+
void loop_gpu(void *param);
64+
void setup();
65+
#line 120 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
66+
void loop() {
67+
run_cpu();
68+
run_web();
69+
}
70+
71+
72+
void loop_gpu(void *param) {
73+
for (;;) {
74+
run_gpu();
75+
}
76+
}
77+
78+
79+
void setup() {
80+
81+
init_system();
82+
83+
84+
(void)xTaskCreatePinnedToCore(loop_gpu, "loop_gpu", 4096, NULL, 0, NULL, 0);
85+
}

src/leds.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ CRGBF incandescent_lookup = {sqrt(1.0000), sqrt(0.1982), sqrt(0.0244)};
5252
float note_colors[12] = {0.0000, 0.0833, 0.1666, 0.2499, 0.3333, 0.4166,
5353
0.4999, 0.5833, 0.6666, 0.7499, 0.8333, 0.9166};
5454

55+
float color_momentum = 0.0;
56+
5557
// 256 pre-calculated values for full-saturated HSV lookup
5658
const uint8_t hsv_lookup[256][3] = {
5759
{255,0,0},{253,2,0},{250,5,0},{247,8,0},{245,10,0},{242,13,0},{239,16,0},{237,18,0},{234,21,0},{231,24,0},{229,26,0},{226,29,0},{223,32,0},{221,34,0},{218,37,0},{215,40,0},{212,43,0},{210,45,0},{207,48,0},{204,51,0},{202,53,0},{199,56,0},{196,59,0},{194,61,0},{191,64,0},{188,67,0},{186,69,0},{183,72,0},{180,75,0},{178,77,0},{175,80,0},{172,83,0},{171,85,0},{171,87,0},{171,90,0},{171,93,0},{171,95,0},{171,98,0},{171,101,0},{171,103,0},{171,106,0},{171,109,0},{171,111,0},{171,114,0},{171,117,0},{171,119,0},{171,122,0},{171,125,0},{171,128,0},{171,130,0},{171,133,0},{171,136,0},{171,138,0},{171,141,0},{171,144,0},{171,146,0},{171,149,0},{171,152,0},{171,154,0},{171,157,0},{171,160,0},{171,162,0},{171,165,0},{171,168,0},{171,170,0},{166,172,0},{161,175,0},{155,178,0},{150,180,0},{145,183,0},{139,186,0},{134,188,0},{129,191,0},{123,194,0},{118,196,0},{113,199,0},{107,202,0},{102,204,0},{97,207,0},{91,210,0},{86,213,0},{81,215,0},{75,218,0},{70,221,0},{65,223,0},{59,226,0},{54,229,0},{49,231,0},{43,234,0},{38,237,0},{33,239,0},{27,242,0},{22,245,0},{17,247,0},{11,250,0},{6,253,0},{0,255,0},{0,253,2},{0,250,5},{0,247,8},{0,245,10},{0,242,13},{0,239,16},{0,237,18},{0,234,21},{0,231,24},{0,229,26},{0,226,29},{0,223,32},{0,221,34},{0,218,37},{0,215,40},{0,212,43},{0,210,45},{0,207,48},{0,204,51},{0,202,53},{0,199,56},{0,196,59},{0,194,61},{0,191,64},{0,188,67},{0,186,69},{0,183,72},{0,180,75},{0,178,77},{0,175,80},{0,172,83},{0,171,85},{0,166,90},{0,161,95},{0,155,101},{0,150,106},{0,145,111},{0,139,117},{0,134,122},{0,129,127},{0,123,133},{0,118,138},{0,113,143},{0,107,149},{0,102,154},{0,97,159},{0,91,165},{0,86,170},{0,81,175},{0,75,181},{0,70,186},{0,65,191},{0,59,197},{0,54,202},{0,49,207},{0,43,213},{0,38,218},{0,33,223},{0,27,229},{0,22,234},{0,17,239},{0,11,245},{0,6,250},{0,0,255},{2,0,253},{5,0,250},{8,0,247},{10,0,245},{13,0,242},{16,0,239},{18,0,237},{21,0,234},{24,0,231},{26,0,229},{29,0,226},{32,0,223},{34,0,221},{37,0,218},{40,0,215},{43,0,212},{45,0,210},{48,0,207},{51,0,204},{53,0,202},{56,0,199},{59,0,196},{61,0,194},{64,0,191},{67,0,188},{69,0,186},{72,0,183},{75,0,180},{77,0,178},{80,0,175},{83,0,172},{85,0,171},{87,0,169},{90,0,166},{93,0,163},{95,0,161},{98,0,158},{101,0,155},{103,0,153},{106,0,150},{109,0,147},{111,0,145},{114,0,142},{117,0,139},{119,0,137},{122,0,134},{125,0,131},{128,0,128},{130,0,126},{133,0,123},{136,0,120},{138,0,118},{141,0,115},{144,0,112},{146,0,110},{149,0,107},{152,0,104},{154,0,102},{157,0,99},{160,0,96},{162,0,94},{165,0,91},{168,0,88},{170,0,85},{172,0,83},{175,0,80},{178,0,77},{180,0,75},{183,0,72},{186,0,69},{188,0,67},{191,0,64},{194,0,61},{196,0,59},{199,0,56},{202,0,53},{204,0,51},{207,0,48},{210,0,45},{213,0,42},{215,0,40},{218,0,37},{221,0,34},{223,0,32},{226,0,29},{229,0,26},{231,0,24},{234,0,21},{237,0,18},{239,0,16},{242,0,13},{245,0,10},{247,0,8},{250,0,5},{253,0,2}
@@ -446,7 +448,6 @@ void update_auto_color(){
446448
profile_function([&]() {
447449
if(light_modes[configuration.current_mode].type != LIGHT_MODE_TYPE_ACTIVE){ return; }
448450

449-
static float color_momentum = 0.0;
450451
if(configuration.auto_color_cycle == true){
451452
float novelty = novelty_curve_normalized[NOVELTY_HISTORY_LENGTH - 1] * 0.75;
452453
novelty = novelty*novelty*novelty*novelty*novelty*novelty;

src/light_modes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Functions for outputting computed data in beautiful fashion to the LEDs based on
2222
#include "light_modes/active/spectronome.h"
2323
#include "light_modes/active/hype.h"
2424
#include "light_modes/active/bloom.h"
25+
#include "light_modes/active/perlin.h"
2526

2627
// INACTIVE MODES
2728
#include "light_modes/inactive/neutral.h"
@@ -42,6 +43,7 @@ light_mode light_modes[] = {
4243
{ "Spectronome", LIGHT_MODE_TYPE_ACTIVE, &draw_spectronome },
4344
{ "Hype", LIGHT_MODE_TYPE_ACTIVE, &draw_hype },
4445
{ "Bloom", LIGHT_MODE_TYPE_ACTIVE, &draw_bloom },
46+
{ "Perlin", LIGHT_MODE_TYPE_ACTIVE, &draw_perlin },
4547

4648
// Inactive Modes
4749
{ "Neutral", LIGHT_MODE_TYPE_INACTIVE, &draw_neutral },

src/light_modes/active/perlin.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
void draw_perlin(){
2+
static float perlin_image_hue[NUM_LEDS];
3+
static float perlin_image_lum[NUM_LEDS];
4+
5+
static double x = 0.00;
6+
static double y = 0.00;
7+
8+
static float momentum = 0.0;
9+
10+
float push = vu_level*vu_level*vu_level*vu_level*configuration.speed*0.1f;
11+
12+
momentum *= 0.99;
13+
14+
momentum = max(momentum, push);
15+
16+
static float angle = 0.0;
17+
angle += 0.001;
18+
float sine = sin(angle);
19+
20+
x += 0.01*sine;
21+
22+
y += 0.0001;
23+
y += momentum;
24+
25+
fill_array_with_perlin(perlin_image_hue, NUM_LEDS, (float)x, (float)y, 0.025f);
26+
fill_array_with_perlin(perlin_image_lum, NUM_LEDS, (float)x+100, (float)y+50, 0.0125f);
27+
28+
// Crazy SIMD functions scaling perlin_image_lum from 0.0 - 1.0 range to 0.1 - 1.0 range
29+
float* ptr = (float*)perlin_image_lum;
30+
dsps_mulc_f32_ae32(ptr, ptr, NUM_LEDS, 0.98, 1, 1);
31+
dsps_addc_f32_ae32(ptr, ptr, NUM_LEDS, 0.02, 1, 1);
32+
33+
if(configuration.mirror_mode == false){
34+
for(uint16_t i = 0; i < NUM_LEDS; i++){
35+
CRGBF color = hsv(
36+
get_color_range_hue(perlin_image_hue[i]),
37+
configuration.saturation,
38+
perlin_image_lum[i]*perlin_image_lum[i]
39+
);
40+
41+
leds[i] = color;
42+
}
43+
}
44+
else{
45+
for(uint16_t i = 0; i < NUM_LEDS>>1; i++){
46+
CRGBF color = hsv(
47+
get_color_range_hue(perlin_image_hue[i<<1]),
48+
configuration.saturation,
49+
perlin_image_lum[i<<1]*perlin_image_lum[i<<1]
50+
);
51+
52+
leds[i] = color;
53+
leds[NUM_LEDS - 1 - i] = color;
54+
}
55+
}
56+
}

src/perlin.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <stdint.h>
2+
#include <math.h>
3+
#include <stdio.h> // For debug output
4+
5+
// Doubled permutation to avoid overflow
6+
static const int permutation[] = {151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
7+
8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180};
8+
9+
static int p[512]; // Doubled permutation to avoid overflow
10+
11+
// Helper functions
12+
static float fade(float t) {
13+
return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
14+
}
15+
16+
static float plerp(float t, float a, float b) {
17+
return a + t * (b - a);
18+
}
19+
20+
static float grad(int hash, float x, float y, float z) {
21+
int h = hash & 15;
22+
float u = h < 8 ? x : y;
23+
float v = h < 4 ? y : h == 12 || h == 14 ? x : z;
24+
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
25+
}
26+
27+
// Fill array with Perlin noise
28+
void fill_array_with_perlin(float *array, uint16_t array_length, float x, float y, float scale) {
29+
// Initialize the permutation array if not already done
30+
static int initialized = 0;
31+
if (!initialized) {
32+
for (int i = 0; i < 256; i++) {
33+
p[256 + i] = p[i] = permutation[i];
34+
}
35+
initialized = 1;
36+
}
37+
38+
for (uint16_t i = 0; i < array_length; i++) {
39+
float nx = x + i * scale;
40+
float fx = floorf(nx);
41+
float fy = floorf(y);
42+
int X = (int)fx & 255;
43+
int Y = (int)fy & 255;
44+
nx -= fx;
45+
float ny = y - fy;
46+
47+
float u = fade(nx);
48+
float v = fade(ny);
49+
50+
int A = p[X] + Y;
51+
int AA = p[A];
52+
int AB = p[A + 1];
53+
int B = p[X + 1] + Y;
54+
int BA = p[B];
55+
int BB = p[B + 1];
56+
57+
float noise_value = plerp(v, plerp(u, grad(p[AA], nx, ny, 0.0f),
58+
grad(p[BA], nx - 1.0f, ny, 0.0f)),
59+
plerp(u, grad(p[AB], nx, ny - 1.0f, 0.0f),
60+
grad(p[BB], nx - 1.0f, ny - 1.0f, 0.0f)));
61+
array[i] = (noise_value + 1.0f) * 0.5f; // Scale to range [0.0, 1.0]
62+
//array[i] = powf(array[i], 2.0f); // Square the value to make it more likely to be close to 0 or 1
63+
64+
// Debug output
65+
//printf("array[%d] = %f\n", i, array[i]);
66+
}
67+
}

src/sliders.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ void load_sliders_relevant_to_mode(int16_t mode_index) {
5757
else if (mode_index == 6) { // Bloom
5858
register_slider("speed", 0.000, 1.000, 0.001);
5959
}
60+
else if (mode_index == 7) { // Perlin
61+
register_slider("speed", 0.000, 1.000, 0.001);
62+
}
6063
else{
6164
// WTF happened that got you here?
6265
}

src/touch.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,13 @@ void read_touch(){
206206
}
207207
else if(touch_pins[TOUCH_LEFT].touch_active == true && touch_pins[TOUCH_RIGHT].touch_active == true){ // both hands held
208208
static uint32_t last_mirror_mode_toggle = 0;
209-
if(t_now_ms - last_mirror_mode_toggle >= 1000){
210-
configuration.mirror_mode = !configuration.mirror_mode;
211-
save_config_delayed();
212-
last_mirror_mode_toggle = t_now_ms;
209+
210+
if(EMOTISCOPE_ACTIVE){
211+
if(t_now_ms - last_mirror_mode_toggle >= 1000){
212+
configuration.mirror_mode = !configuration.mirror_mode;
213+
save_config_delayed();
214+
last_mirror_mode_toggle = t_now_ms;
215+
}
213216
}
214217
}
215218
}

0 commit comments

Comments
 (0)