Skip to content

Commit

Permalink
Added Perlin mode, fixed standby mirror mode bug
Browse files Browse the repository at this point in the history
  • Loading branch information
connornishijima committed May 14, 2024
1 parent 634b7ed commit 09a0ea0
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 20 deletions.
14 changes: 0 additions & 14 deletions firmware.json
Original file line number Diff line number Diff line change
@@ -1,14 +0,0 @@
[
{
"type": "8CH_MOSFET_REV_C",
"version": "1.2.0",
"url": "https://raw.githubusercontent.com/hoeken/yarrboard/main/firmware/releases/8CH_MOSFET_REV_C-1.2.0.bin",
"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."
},
{
"type": "RGB_INPUT_REV_B",
"version": "1.2.0",
"url": "https://raw.githubusercontent.com/hoeken/yarrboard/main/firmware/releases/RGB_INPUT_REV_B-1.2.0.bin",
"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."
}
]
3 changes: 2 additions & 1 deletion src/EMOTISCOPE_FIRMWARE.ino
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
// ## SOFTWARE VERSION ########################################################

#define SOFTWARE_VERSION_MAJOR ( 1 )
#define SOFTWARE_VERSION_MINOR ( 1 )
#define SOFTWARE_VERSION_MINOR ( 2 )
#define SOFTWARE_VERSION_PATCH ( 0 )


Expand Down Expand Up @@ -87,6 +87,7 @@
#include "utilities.h" // .......... Custom generic math functions
#include "system.h" // ............. Lowest-level firmware functions
#include "led_driver.h" // ......... Low-level LED communication, (ab)uses RMT for non-blocking output
#include "perlin.h" // ............. Perlin noise generator
#include "leds.h" // ............... LED dithering, effects, filters
#include "touch.h" // .............. Handles capacitive touch input
#include "indicator.h" // .......... Little light bulb
Expand Down
85 changes: 85 additions & 0 deletions src/EMOTISCOPE_FIRMWARE.ino.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# 1 "C:\\Users\\conno\\AppData\\Local\\Temp\\tmpad0q33mk"
#include <Arduino.h>
# 1 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
# 55 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
#define SOFTWARE_VERSION_MAJOR ( 1 )
#define SOFTWARE_VERSION_MINOR ( 1 )
#define SOFTWARE_VERSION_PATCH ( 0 )







#include <PsychicHttp.h>
#include <HTTPClient.h>
#include <ESPmDNS.h>
#include <Ticker.h>
#include <DNSServer.h>
#include <Preferences.h>
#include <Update.h>
#include <WiFi.h>
#include <esp_dsp.h>
#include <esp_wifi.h>


#include "global_defines.h"
#include "hardware_version.h"
#include "types.h"
#include "profiler.h"
#include "sliders.h"
#include "toggles.h"
#include "menu_toggles.h"
#include "menu_dropdowns.h"
#include "filesystem.h"
#include "configuration.h"
#include "utilities.h"
#include "system.h"
#include "led_driver.h"
#include "perlin.h"
#include "leds.h"
#include "touch.h"
#include "indicator.h"
#include "ui.h"
#include "microphone.h"
#include "vu.h"
#include "goertzel.h"
#include "tempo.h"
#include "audio_debug.h"
#include "screensaver.h"
#include "standby.h"
#include "light_modes.h"
#include "commands.h"
#include "wireless.h"
#include "ota.h"


#include "cpu_core.h"
#include "gpu_core.h"
#include "web_core.h"
# 120 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
void loop();
void loop_gpu(void *param);
void setup();
#line 120 "C:/Users/conno/Emotiscope/src/EMOTISCOPE_FIRMWARE.ino"
void loop() {
run_cpu();
run_web();
}


void loop_gpu(void *param) {
for (;;) {
run_gpu();
}
}


void setup() {

init_system();


(void)xTaskCreatePinnedToCore(loop_gpu, "loop_gpu", 4096, NULL, 0, NULL, 0);
}
3 changes: 2 additions & 1 deletion src/leds.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ CRGBF incandescent_lookup = {sqrt(1.0000), sqrt(0.1982), sqrt(0.0244)};
float note_colors[12] = {0.0000, 0.0833, 0.1666, 0.2499, 0.3333, 0.4166,
0.4999, 0.5833, 0.6666, 0.7499, 0.8333, 0.9166};

float color_momentum = 0.0;

// 256 pre-calculated values for full-saturated HSV lookup
const uint8_t hsv_lookup[256][3] = {
{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}
Expand Down Expand Up @@ -446,7 +448,6 @@ void update_auto_color(){
profile_function([&]() {
if(light_modes[configuration.current_mode].type != LIGHT_MODE_TYPE_ACTIVE){ return; }

static float color_momentum = 0.0;
if(configuration.auto_color_cycle == true){
float novelty = novelty_curve_normalized[NOVELTY_HISTORY_LENGTH - 1] * 0.75;
novelty = novelty*novelty*novelty*novelty*novelty*novelty;
Expand Down
2 changes: 2 additions & 0 deletions src/light_modes.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Functions for outputting computed data in beautiful fashion to the LEDs based on
#include "light_modes/active/spectronome.h"
#include "light_modes/active/hype.h"
#include "light_modes/active/bloom.h"
#include "light_modes/active/perlin.h"

// INACTIVE MODES
#include "light_modes/inactive/neutral.h"
Expand All @@ -42,6 +43,7 @@ light_mode light_modes[] = {
{ "Spectronome", LIGHT_MODE_TYPE_ACTIVE, &draw_spectronome },
{ "Hype", LIGHT_MODE_TYPE_ACTIVE, &draw_hype },
{ "Bloom", LIGHT_MODE_TYPE_ACTIVE, &draw_bloom },
{ "Perlin", LIGHT_MODE_TYPE_ACTIVE, &draw_perlin },

// Inactive Modes
{ "Neutral", LIGHT_MODE_TYPE_INACTIVE, &draw_neutral },
Expand Down
56 changes: 56 additions & 0 deletions src/light_modes/active/perlin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
void draw_perlin(){
static float perlin_image_hue[NUM_LEDS];
static float perlin_image_lum[NUM_LEDS];

static double x = 0.00;
static double y = 0.00;

static float momentum = 0.0;

float push = vu_level*vu_level*vu_level*vu_level*configuration.speed*0.1f;

momentum *= 0.99;

momentum = max(momentum, push);

static float angle = 0.0;
angle += 0.001;
float sine = sin(angle);

x += 0.01*sine;

y += 0.0001;
y += momentum;

fill_array_with_perlin(perlin_image_hue, NUM_LEDS, (float)x, (float)y, 0.025f);
fill_array_with_perlin(perlin_image_lum, NUM_LEDS, (float)x+100, (float)y+50, 0.0125f);

// Crazy SIMD functions scaling perlin_image_lum from 0.0 - 1.0 range to 0.1 - 1.0 range
float* ptr = (float*)perlin_image_lum;
dsps_mulc_f32_ae32(ptr, ptr, NUM_LEDS, 0.98, 1, 1);
dsps_addc_f32_ae32(ptr, ptr, NUM_LEDS, 0.02, 1, 1);

if(configuration.mirror_mode == false){
for(uint16_t i = 0; i < NUM_LEDS; i++){
CRGBF color = hsv(
get_color_range_hue(perlin_image_hue[i]),
configuration.saturation,
perlin_image_lum[i]*perlin_image_lum[i]
);

leds[i] = color;
}
}
else{
for(uint16_t i = 0; i < NUM_LEDS>>1; i++){
CRGBF color = hsv(
get_color_range_hue(perlin_image_hue[i<<1]),
configuration.saturation,
perlin_image_lum[i<<1]*perlin_image_lum[i<<1]
);

leds[i] = color;
leds[NUM_LEDS - 1 - i] = color;
}
}
}
67 changes: 67 additions & 0 deletions src/perlin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <stdint.h>
#include <math.h>
#include <stdio.h> // For debug output

// Doubled permutation to avoid overflow
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,
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};

static int p[512]; // Doubled permutation to avoid overflow

// Helper functions
static float fade(float t) {
return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
}

static float plerp(float t, float a, float b) {
return a + t * (b - a);
}

static float grad(int hash, float x, float y, float z) {
int h = hash & 15;
float u = h < 8 ? x : y;
float v = h < 4 ? y : h == 12 || h == 14 ? x : z;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}

// Fill array with Perlin noise
void fill_array_with_perlin(float *array, uint16_t array_length, float x, float y, float scale) {
// Initialize the permutation array if not already done
static int initialized = 0;
if (!initialized) {
for (int i = 0; i < 256; i++) {
p[256 + i] = p[i] = permutation[i];
}
initialized = 1;
}

for (uint16_t i = 0; i < array_length; i++) {
float nx = x + i * scale;
float fx = floorf(nx);
float fy = floorf(y);
int X = (int)fx & 255;
int Y = (int)fy & 255;
nx -= fx;
float ny = y - fy;

float u = fade(nx);
float v = fade(ny);

int A = p[X] + Y;
int AA = p[A];
int AB = p[A + 1];
int B = p[X + 1] + Y;
int BA = p[B];
int BB = p[B + 1];

float noise_value = plerp(v, plerp(u, grad(p[AA], nx, ny, 0.0f),
grad(p[BA], nx - 1.0f, ny, 0.0f)),
plerp(u, grad(p[AB], nx, ny - 1.0f, 0.0f),
grad(p[BB], nx - 1.0f, ny - 1.0f, 0.0f)));
array[i] = (noise_value + 1.0f) * 0.5f; // Scale to range [0.0, 1.0]
//array[i] = powf(array[i], 2.0f); // Square the value to make it more likely to be close to 0 or 1

// Debug output
//printf("array[%d] = %f\n", i, array[i]);
}
}
3 changes: 3 additions & 0 deletions src/sliders.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ void load_sliders_relevant_to_mode(int16_t mode_index) {
else if (mode_index == 6) { // Bloom
register_slider("speed", 0.000, 1.000, 0.001);
}
else if (mode_index == 7) { // Perlin
register_slider("speed", 0.000, 1.000, 0.001);
}
else{
// WTF happened that got you here?
}
Expand Down
11 changes: 7 additions & 4 deletions src/touch.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,10 +206,13 @@ void read_touch(){
}
else if(touch_pins[TOUCH_LEFT].touch_active == true && touch_pins[TOUCH_RIGHT].touch_active == true){ // both hands held
static uint32_t last_mirror_mode_toggle = 0;
if(t_now_ms - last_mirror_mode_toggle >= 1000){
configuration.mirror_mode = !configuration.mirror_mode;
save_config_delayed();
last_mirror_mode_toggle = t_now_ms;

if(EMOTISCOPE_ACTIVE){
if(t_now_ms - last_mirror_mode_toggle >= 1000){
configuration.mirror_mode = !configuration.mirror_mode;
save_config_delayed();
last_mirror_mode_toggle = t_now_ms;
}
}
}
}
Expand Down

0 comments on commit 09a0ea0

Please sign in to comment.