diff --git a/.config/cava/config b/.config/cava/config new file mode 100644 index 0000000..5af3425 --- /dev/null +++ b/.config/cava/config @@ -0,0 +1,57 @@ +# Cava Audio Visualizer Configuration Template +# Optimized for smooth and responsive visualization + +[general] +# Number of bars (20-200) - fewer bars = better performance +bars = 64 +# Framerate (1-144) - higher = smoother but more CPU intensive +framerate = 60 + +[input] +# Audio input method: pulse, alsa, fifo, or portaudio +method = pulse +# Audio device (leave as default for auto-detection) +source = auto + +[output] +# Output method: ncurses, terminal, raw, or circle +method = ncurses +# Terminal color scheme +style = stereo + +[color] +# Color gradient for bars using template variables +gradient = 1 +gradient_count = 8 +gradient_color_1 = '#ffdaa8' +gradient_color_2 = '#ffdb94' +gradient_color_3 = '#e1df87' +gradient_color_4 = '#b3d27e' +gradient_color_5 = '#ffa2bd' +gradient_color_6 = '#ffbcbb' +gradient_color_7 = '#ffac91' +gradient_color_8 = '#f6ae85' + +[smoothing] +# Noise reduction (0-100) - higher = smoother but less responsive +# 77 is default, 85 provides good balance for smooth visualization +noise_reduction = 85 + +# Monstercat smoothing (0 or 1) - adds smoothing between adjacent bars +monstercat = 1 + +# Wave effect (0 or 1) - creates wave-like motion across bars +waves = 0 + +# Gravity (0-200) - controls how fast bars fall +# 100 = normal gravity, 150 = faster fall, 50 = slower fall +gravity = 120 + +[eq] +# Equalizer settings for frequency response +# Lower frequencies tend to be louder, so reduce them slightly +1 = 0.8 +2 = 0.9 +3 = 1.0 +4 = 1.1 +5 = 1.2 diff --git a/.config/cava/shaders/bar_spectrum.frag b/.config/cava/shaders/bar_spectrum.frag new file mode 100644 index 0000000..e594618 --- /dev/null +++ b/.config/cava/shaders/bar_spectrum.frag @@ -0,0 +1,73 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +uniform float shader_time; // shader execution time s (not used here) + +uniform sampler2D inputTexture; // Texture from the last render pass (not used here) + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + // create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + // find which bar to use based on where we are on the x axis + float x = u_resolution.x * fragCoord.x; + int bar = int(bars_count * fragCoord.x); + + // calculate a bar size + float bar_size = u_resolution.x / bars_count; + + // the y coordinate and bar values are the same + float y = bars[bar]; + + // make sure there is a thin line at bottom + if (y * u_resolution.y < 1.0) { + y = 1.0 / u_resolution.y; + } + + // draw the bar up to current height + if (y > fragCoord.y) { + // make some space between bars basen on settings + if (x > (bar + 1) * (bar_size)-bar_spacing) { + fragColor = vec4(bg_color, 1.0); + } else { + if (gradient_count == 0) { + fragColor = vec4(fg_color, 1.0); + } else { + // find which color in the configured gradient we are at + int color = int((gradient_count - 1) * fragCoord.y); + + // find where on y this and next color is supposed to be + float y_min = color / (gradient_count - 1.0); + float y_max = (color + 1.0) / (gradient_count - 1.0); + + // make color + fragColor = vec4(normalize_C(fragCoord.y, gradient_colors[color], + gradient_colors[color + 1], y_min, y_max), + 1.0); + } + } + } else { + fragColor = vec4(bg_color, 1.0); + } +} \ No newline at end of file diff --git a/.config/cava/shaders/eye_of_phi.frag b/.config/cava/shaders/eye_of_phi.frag new file mode 100644 index 0000000..e499ee7 --- /dev/null +++ b/.config/cava/shaders/eye_of_phi.frag @@ -0,0 +1,117 @@ +#version 330 + +// this shader was stolen from shadertoy user ChunderFPV + +#define SCALE 8.0 +#define PI radians(180.0) +#define TAU (PI * 2.0) +#define CS(a) vec2(cos(a), sin(a)) +#define PT(u, r) smoothstep(0.0, r, r - length(u)) + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform float shader_time; // shader execution time s +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +// gradient map ( color, equation, time, width, shadow, reciprocal ) +vec3 gm(vec3 c, float n, float t, float w, float d, bool i) { + float g = min(abs(n), 1.0 / abs(n)); + float s = abs(sin(n * PI - t)); + if (i) + s = min(s, abs(sin(PI / n + t))); + return (1.0 - pow(abs(s), w)) * c * pow(g, d) * 6.0; +} + +// denominator spiral, use 1/n for numerator +// ( screen xy, spiral exponent, decimal, line width, hardness, rotation ) +float ds(vec2 u, float e, float n, float w, float h, float ro) { + float ur = length(u); // unit radius + float sr = pow(ur, e); // spiral radius + float a = round(sr) * n * TAU; // arc + vec2 xy = CS(a + ro) * ur; // xy coords + float l = PT(u - xy, w); // line + float s = mod(sr + 0.5, 1.0); // gradient smooth + s = min(s, 1.0 - s); // darken filter + return l * s * h; +} + +void main() { + float t = shader_time / PI * 2.0; + vec4 m = vec4(0, 0, 0, 0); // iMouse; + m.xy = m.xy * 2.0 / u_resolution.xy - 1.0; // ±1x, ±1y + if (m.z > 0.0) + t += m.y * SCALE; // move time with mouse y + float z = (m.z > 0.0) ? pow(1.0 - abs(m.y), sign(m.y)) : 1.0; // zoom (+) + float e = (m.z > 0.0) ? pow(1.0 - abs(m.x), -sign(m.x)) + : 1.0; // screen exponent (+) + float se = (m.z > 0.0) ? e * -sign(m.y) : 1.0; // spiral exponent + vec3 bg = vec3(0); // black background + + float aa = 3.0; // anti-aliasing + + for (float j = 0.0; j < aa; j++) + for (float k = 0.0; k < aa; k++) { + vec3 c = vec3(0); + vec2 o = vec2(j, k) / aa; + vec2 uv = (fragCoord * u_resolution.xy - 0.5 * u_resolution.xy + o) / + u_resolution.y * SCALE * z; // apply cartesian, scale and zoom + if (m.z > 0.0) + uv = + exp(log(abs(uv)) * e) * sign(uv); // warp screen space with exponent + + float px = length(fwidth(uv)); // pixel width + float x = uv.x; // every pixel on x + float y = uv.y; // every pixel on y + float l = length(uv); // hypot of xy: sqrt(x*x+y*y) + + float mc = (x * x + y * y - 1.0) / y; // metallic circle at xy + float g = min(abs(mc), 1.0 / abs(mc)); // gradient + vec3 gold = vec3(1.0, 0.6, 0.0) * g * l; + vec3 blue = vec3(0.3, 0.5, 0.9) * (1.0 - g); + vec3 rgb = max(gold, blue); + + float w = 0.1; // line width + float d = 0.4; // shadow depth + c = max(c, gm(rgb, mc, -t, w * bars[0], d, false)); // metallic + c = max(c, gm(rgb, abs(y / x) * sign(y), -t, w * bars[1], d, + false)); // tangent + c = max(c, gm(rgb, (x * x) / (y * y) * sign(y), -t, w * bars[2], d, + false)); // sqrt cotangent + c = max(c, gm(rgb, (x * x) + (y * y), t, w * bars[3], d, + true)); // sqrt circles + + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[4], 2.0, 0.0); // spiral 1a + c += rgb * ds(uv, se, t / TAU, px * 2.0 * bars[5], 2.0, PI); // spiral 1b + c += + rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[6], 2.0, 0.0); // spiral 2a + c += rgb * ds(uv, -se, t / TAU, px * 2.0 * bars[7], 2.0, PI); // spiral 2b + c = max(c, 0.0); // clear negative color + + c += pow(max(1.0 - l, 0.0), 3.0 / z); // center glow + + if (m.z > 0.0) // display grid on click + { + vec2 xyg = abs(fract(uv + 0.5) - 0.5) / px; // xy grid + c.gb += 0.2 * (1.0 - min(min(xyg.x, xyg.y), 1.0)); + } + bg += c; + } + bg /= aa * aa; + bg *= sqrt(bg) * 1.5; + + fragColor = vec4(bg, 1.0); +} \ No newline at end of file diff --git a/.config/cava/shaders/northern_lights.frag b/.config/cava/shaders/northern_lights.frag new file mode 100644 index 0000000..ecd859a --- /dev/null +++ b/.config/cava/shaders/northern_lights.frag @@ -0,0 +1,34 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) + +uniform vec3 u_resolution; // window resolution, not used here + +//colors, configurable in cava config file +uniform vec3 bg_color; // background color(r,g,b) (0.0 - 1.0), not used here +uniform vec3 fg_color; // foreground color, not used here + +void main() +{ + // find which bar to use based on where we are on the x axis + int bar = int(bars_count * fragCoord.x); + + float bar_y = 1.0 - abs((fragCoord.y - 0.5)) * 2.0; + float y = (bars[bar]) * bar_y; + + float bar_x = (fragCoord.x - float(bar) / float(bars_count)) * bars_count; + float bar_r = 1.0 - abs((bar_x - 0.5)) * 2; + + bar_r = bar_r * bar_r * 2; + + // set color + fragColor.r = fg_color.x * y * bar_r; + fragColor.g = fg_color.y * y * bar_r; + fragColor.b = fg_color.z * y * bar_r; +} diff --git a/.config/cava/shaders/orion_circle.frag b/.config/cava/shaders/orion_circle.frag new file mode 100644 index 0000000..3180023 --- /dev/null +++ b/.config/cava/shaders/orion_circle.frag @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: 2026 rezky_nightky + +// Static Orion (non-rotating) + +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; +uniform int bar_width; +uniform int bar_spacing; + +uniform vec3 u_resolution; + +uniform vec3 bg_color; +uniform vec3 fg_color; + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + const float EPS = 0.0001; + float yr = (y - y_min) / max(y_max - y_min, EPS); + yr = clamp(yr, 0.0, 1.0); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + vec2 p = fragCoord - vec2(0.5); + p.x *= u_resolution.x / u_resolution.y; + + float base_radius = 0.35; + float max_len = 0.15; + float pad = 2.0 / u_resolution.y; + float min_r = max(base_radius - pad, 0.0); + float max_r = base_radius + max_len + pad; + + float r2 = dot(p, p); + if (r2 < min_r * min_r || r2 > max_r * max_r) { + fragColor = vec4(bg_color, 1.0); + return; + } + + float r = sqrt(r2); + + float theta = atan(p.y, p.x); + + float pi = radians(180.0); + float tau = pi * 2.0; + + float a = (theta + pi) / tau; + a = fract(a); + + int bc = min(bars_count, 512); + if (bc <= 0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + float cell = a * float(bc); + int bar = int(floor(cell)); + bar = clamp(bar, 0, bc - 1); + int bar_next = bar + 1; + if (bar_next >= bc) { + bar_next = 0; + } + float f = fract(cell); + + float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0); + float angular = abs(f - 0.5); + float px = max(length(dFdx(p)), length(dFdy(p))); + float df = 0.35 * (float(bc) * px) / (tau * max(r, px)); + float gap_half = (1.0 - fill) * 0.5; + float eps = 1.0 / (float(bc) * 2048.0); + float gap_cap = max(gap_half - eps, 0.0); + float df_cap = min(gap_cap, fill * 0.15); + df = min(df, max(df_cap, 1e-6)); + float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular); + angular_alpha *= step(angular, fill * 0.5 + df); + angular_alpha *= step(0.01, angular_alpha); + + float y0 = clamp(bars[bar], 0.0, 1.0); + float y1 = clamp(bars[bar_next], 0.0, 1.0); + float y = mix(y0, y1, f); + + float amp = y * (1.0 + 0.8 * (1.0 - y)); + + float min_len = 1.0 / u_resolution.y; + float max_len_cap = max(max_len - min_len, min_len); + float len = min(max(amp * max_len, min_len), max_len_cap); + float act = smoothstep(0.0, min_len / max_len, amp); + + float dr = clamp(px, min_len, 2.0 * min_len); + float inner = smoothstep(base_radius - dr, base_radius + dr, r); + float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r); + float radial_alpha = inner * outer * act; + float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r); + radial_alpha *= outer_cap; + + float alpha = angular_alpha * radial_alpha; + alpha *= step(0.0035, alpha); + + if (alpha == 0.0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + vec3 col; + if (gradient_count == 0) { + col = fg_color; + } else { + if (gradient_count == 1) { + col = gradient_colors[0]; + } else { + int color = int(floor((gradient_count - 1) * amp)); + color = clamp(color, 0, gradient_count - 2); + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + col = + normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max); + } + } + + fragColor = vec4(mix(bg_color, col, alpha), 1.0); +} diff --git a/.config/cava/shaders/orion_circle_rotate.frag b/.config/cava/shaders/orion_circle_rotate.frag new file mode 100644 index 0000000..67db217 --- /dev/null +++ b/.config/cava/shaders/orion_circle_rotate.frag @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: 2026 rezky_nightky + +// Rotate Orion + +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; +uniform int bar_width; +uniform int bar_spacing; + +uniform vec3 u_resolution; + +uniform vec3 bg_color; +uniform vec3 fg_color; + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; + +uniform float shader_time; + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + const float EPS = 0.0001; + float yr = (y - y_min) / max(y_max - y_min, EPS); + yr = clamp(yr, 0.0, 1.0); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + vec2 p = fragCoord - vec2(0.5); + p.x *= u_resolution.x / u_resolution.y; + + float base_radius = 0.35; + float max_len = 0.15; + float pad = 2.0 / u_resolution.y; + float min_r = max(base_radius - pad, 0.0); + float max_r = base_radius + max_len + pad; + + float r2 = dot(p, p); + if (r2 < min_r * min_r || r2 > max_r * max_r) { + fragColor = vec4(bg_color, 1.0); + return; + } + + float r = sqrt(r2); + + float theta = atan(p.y, p.x); + + float pi = radians(180.0); + float tau = pi * 2.0; + + float a = (theta + pi) / tau; + a = fract(a); + + int bc = min(bars_count, 512); + if (bc <= 0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + // Note: rotation is achieved by phase-shifting bar sampling, not by rotating geometry. + float rotate_speed = 0.10; + float t = fract(shader_time * 0.1); + float phase = fract(t * (rotate_speed / 0.1)); + + float sweep_speed = 0.12; + float sweep_pos = fract(t * (sweep_speed / 0.1)); + float da = abs(a - sweep_pos); + da = min(da, 1.0 - da); + float sweep = 1.0 - smoothstep(0.0, 0.08 + fwidth(a), da); + + float a_sample = fract(a + phase); + + float cell = a_sample * float(bc); + int bar = int(floor(cell)); + bar = clamp(bar, 0, bc - 1); + int bar_next = bar + 1; + if (bar_next >= bc) { + bar_next = 0; + } + float f = fract(cell); + + float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0); + float angular = abs(f - 0.5); + float px = max(length(dFdx(p)), length(dFdy(p))); + float df = 0.35 * (float(bc) * px) / (tau * max(r, px)); + float gap_half = (1.0 - fill) * 0.5; + float eps = 1.0 / (float(bc) * 2048.0); + float gap_cap = max(gap_half - eps, 0.0); + float df_cap = min(gap_cap, fill * 0.15); + df = min(df, max(df_cap, 1e-6)); + float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular); + angular_alpha *= step(angular, fill * 0.5 + df); + angular_alpha *= step(0.01, angular_alpha); + + float y0 = clamp(bars[bar], 0.0, 1.0); + float y1 = clamp(bars[bar_next], 0.0, 1.0); + float y = mix(y0, y1, f); + + float amp = y * (1.0 + 0.8 * (1.0 - y)); + + float min_len = 1.0 / u_resolution.y; + float max_len_cap = max(max_len - min_len, min_len); + float len = min(max(amp * max_len, min_len), max_len_cap); + float act = smoothstep(0.0, min_len / max_len, amp); + + float dr = clamp(px, min_len, 2.0 * min_len); + float inner = smoothstep(base_radius - dr, base_radius + dr, r); + float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r); + float radial_alpha = inner * outer * act; + float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r); + radial_alpha *= outer_cap; + + float alpha = angular_alpha * radial_alpha; + alpha *= step(0.0035, alpha); + + if (alpha == 0.0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + vec3 col; + if (gradient_count == 0) { + col = fg_color; + } else { + if (gradient_count == 1) { + col = gradient_colors[0]; + } else { + int color = int(floor((gradient_count - 1) * amp)); + color = clamp(color, 0, gradient_count - 2); + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + col = normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max); + } + } + + col = min(col * (1.0 + 0.35 * sweep * alpha), vec3(1.0)); + + fragColor = vec4(mix(bg_color, col, alpha), 1.0); +} diff --git a/.config/cava/shaders/orion_saturn_core.frag b/.config/cava/shaders/orion_saturn_core.frag new file mode 100644 index 0000000..b8e4fc7 --- /dev/null +++ b/.config/cava/shaders/orion_saturn_core.frag @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: 2026 rezky_nightky + +// Orion Saturn core + +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; +uniform int bar_width; +uniform int bar_spacing; + +uniform vec3 u_resolution; + +uniform vec3 bg_color; +uniform vec3 fg_color; + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + const float EPS = 0.0001; + float yr = (y - y_min) / max(y_max - y_min, EPS); + yr = clamp(yr, 0.0, 1.0); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +vec3 gradient_map(float amp) { + if (gradient_count == 0) { + return fg_color; + } + + if (gradient_count == 1) { + return gradient_colors[0]; + } + + int color = int(floor((gradient_count - 1) * amp)); + color = clamp(color, 0, gradient_count - 2); + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + return normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max); +} + +void main() { + vec2 p = fragCoord - vec2(0.5); + p.x *= u_resolution.x / u_resolution.y; + + float base_radius = 0.35; + float max_len = 0.15; + float pad = 2.0 / u_resolution.y; + + float max_r = base_radius + max_len + pad; + + float r2 = dot(p, p); + if (r2 > max_r * max_r) { + fragColor = vec4(bg_color, 1.0); + return; + } + + int bc = min(bars_count, 512); + if (bc <= 0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + float r = sqrt(r2); + + float pi = radians(180.0); + float tau = pi * 2.0; + + float theta = atan(p.y, p.x); + float a = fract((theta + pi) / tau); + + float cell = a * float(bc); + int bar = int(floor(cell)); + bar = clamp(bar, 0, bc - 1); + int bar_next = bar + 1; + if (bar_next >= bc) { + bar_next = 0; + } + float f = fract(cell); + + float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0); + float angular = abs(f - 0.5); + float px_ang = max(length(dFdx(p)), length(dFdy(p))); + float df = 0.35 * (float(bc) * px_ang) / (tau * max(r, px_ang)); + float gap_half = (1.0 - fill) * 0.5; + float eps = 1.0 / (float(bc) * 2048.0); + float gap_cap = max(gap_half - eps, 0.0); + float df_cap = min(gap_cap, fill * 0.15); + df = min(df, max(df_cap, 1e-6)); + float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular); + angular_alpha *= step(angular, fill * 0.5 + df); + angular_alpha *= step(0.01, angular_alpha); + + float y0 = clamp(bars[bar], 0.0, 1.0); + float y1 = clamp(bars[bar_next], 0.0, 1.0); + float y = mix(y0, y1, f); + float amp = y * (1.0 + 0.8 * (1.0 - y)); + + float min_len = 1.0 / u_resolution.y; + float max_len_cap = max(max_len - min_len, min_len); + float len = min(max(amp * max_len, min_len), max_len_cap); + float act = smoothstep(0.0, min_len / max_len, amp); + + float dr = clamp(px_ang, min_len, 2.0 * min_len); + float inner = smoothstep(base_radius - dr, base_radius + dr, r); + float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r); + float radial_alpha = inner * outer * act; + float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r); + radial_alpha *= outer_cap; + + float ring_alpha = angular_alpha * radial_alpha; + ring_alpha *= step(0.0035, ring_alpha); + + float core_energy = 0.0; + int core_samples = 0; + + int core_limit = min(bc, 64); + for (int i = 0; i < core_limit; i += 2) { + core_energy += clamp(bars[i], 0.0, 1.0); + core_samples++; + } + core_energy /= max(float(core_samples), 1.0); + + float core_amp = core_energy * (1.0 + 0.8 * (1.0 - core_energy)); + + float core_radius = mix(0.07, 0.25, clamp(core_amp * 1.1, 0.0, 1.0)); + + float px = 1.0 / u_resolution.y; + float core_edge = max(px * 1.5, 0.003); + float core_act = smoothstep(0.0, 0.04, core_amp); + + float core_feather = core_edge + dr; + float core_alpha = 1.0 - smoothstep(core_radius - core_feather, core_radius + core_feather, r); + core_alpha = clamp(core_alpha, 0.0, 1.0) * core_act; + + if (ring_alpha == 0.0 && core_alpha == 0.0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + vec3 col_core = gradient_map(core_amp); + vec3 col_ring = gradient_map(amp); + + vec3 col = mix(bg_color, col_core, core_alpha); + col = mix(col, col_ring, ring_alpha); + fragColor = vec4(col, 1.0); +} diff --git a/.config/cava/shaders/orion_saturn_subring.frag b/.config/cava/shaders/orion_saturn_subring.frag new file mode 100644 index 0000000..9b274e2 --- /dev/null +++ b/.config/cava/shaders/orion_saturn_subring.frag @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: 2026 rezky_nightky + +// Orion Saturn subring + +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +uniform float bars[512]; + +uniform int bars_count; +uniform int bar_width; +uniform int bar_spacing; + +uniform vec3 u_resolution; + +uniform vec3 bg_color; +uniform vec3 fg_color; + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + const float EPS = 0.0001; + float yr = (y - y_min) / max(y_max - y_min, EPS); + yr = clamp(yr, 0.0, 1.0); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +vec3 gradient_map(float amp) { + if (gradient_count == 0) { + return fg_color; + } + + if (gradient_count == 1) { + return gradient_colors[0]; + } + + int color = int(floor((gradient_count - 1) * amp)); + color = clamp(color, 0, gradient_count - 2); + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + return normalize_C(amp, gradient_colors[color], gradient_colors[color + 1], y_min, y_max); +} + +void main() { + vec2 p = fragCoord - vec2(0.5); + p.x *= u_resolution.x / u_resolution.y; + + float base_radius = 0.35; + float max_len = 0.15; + float pad = 2.0 / u_resolution.y; + + float max_r = base_radius + max_len + pad; + + float r2 = dot(p, p); + + if (r2 > max_r * max_r) { + fragColor = vec4(bg_color, 1.0); + return; + } + + int bc = min(bars_count, 512); + if (bc <= 0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + float r = sqrt(r2); + + float pi = radians(180.0); + float tau = pi * 2.0; + + float theta = atan(p.y, p.x); + float a = fract((theta + pi) / tau); + + float cell = a * float(bc); + int bar = int(floor(cell)); + bar = clamp(bar, 0, bc - 1); + int bar_next = bar + 1; + if (bar_next >= bc) { + bar_next = 0; + } + float f = fract(cell); + + float fill = float(bar_width) / max(float(bar_width + bar_spacing), 1.0); + float angular = abs(f - 0.5); + float px = max(length(dFdx(p)), length(dFdy(p))); + float df = 0.35 * (float(bc) * px) / (tau * max(r, px)); + float gap_half = (1.0 - fill) * 0.5; + float eps = 1.0 / (float(bc) * 2048.0); + float gap_cap = max(gap_half - eps, 0.0); + float df_cap = min(gap_cap, fill * 0.15); + df = min(df, max(df_cap, 1e-6)); + float angular_alpha = 1.0 - smoothstep(fill * 0.5 - df, fill * 0.5 + df, angular); + angular_alpha *= step(angular, fill * 0.5 + df); + angular_alpha *= step(0.01, angular_alpha); + + float y0 = clamp(bars[bar], 0.0, 1.0); + float y1 = clamp(bars[bar_next], 0.0, 1.0); + float y = mix(y0, y1, f); + float amp = y * (1.0 + 0.8 * (1.0 - y)); + + float min_len = 1.0 / u_resolution.y; + float max_len_cap = max(max_len - min_len, min_len); + float len = min(max(amp * max_len, min_len), max_len_cap); + float act = smoothstep(0.0, min_len / max_len, amp); + + float dr = clamp(px, min_len, 2.0 * min_len); + float inner = smoothstep(base_radius - dr, base_radius + dr, r); + float outer = 1.0 - smoothstep(base_radius + len - dr, base_radius + len + dr, r); + float radial_alpha = inner * outer * act; + float outer_cap = 1.0 - smoothstep(base_radius + max_len - dr, base_radius + max_len + dr, r); + radial_alpha *= outer_cap; + + float ring_alpha = angular_alpha * radial_alpha; + ring_alpha *= step(0.0035, ring_alpha); + + float core_energy = 0.0; + int core_samples = 0; + + int core_limit = min(bc, 64); + for (int i = 0; i < core_limit; i += 4) { + core_energy += clamp(bars[i], 0.0, 1.0); + core_samples++; + } + core_energy /= max(float(core_samples), 1.0); + + float core_amp = core_energy * (1.0 + 0.8 * (1.0 - core_energy)); + float core_radius = mix(0.05, 0.18, clamp(core_amp * 1.2, 0.0, 1.0)); + + float core_act = smoothstep(0.0, 0.04, core_amp); + float core_half_thickness = 0.007; + + float core = smoothstep(core_radius - core_half_thickness - dr, + core_radius - core_half_thickness + dr, r) - + smoothstep(core_radius + core_half_thickness - dr, + core_radius + core_half_thickness + dr, r); + float core_alpha = clamp(core, 0.0, 1.0) * core_act; + + if (ring_alpha == 0.0 && core_alpha == 0.0) { + fragColor = vec4(bg_color, 1.0); + return; + } + + vec3 col_ring = gradient_map(amp); + vec3 col_core = gradient_map(core_amp); + + vec3 col = mix(bg_color, col_ring, ring_alpha); + col = mix(col, col_core, core_alpha); + fragColor = vec4(col, 1.0); +} diff --git a/.config/cava/shaders/pass_through.vert b/.config/cava/shaders/pass_through.vert new file mode 100644 index 0000000..a4f20e5 --- /dev/null +++ b/.config/cava/shaders/pass_through.vert @@ -0,0 +1,14 @@ +#version 330 + + +// Input vertex data, different for all executions of this shader. +layout(location = 0) in vec3 vertexPosition_modelspace; + +// Output data ; will be interpolated for each fragment. +out vec2 fragCoord; + +void main() +{ + gl_Position = vec4(vertexPosition_modelspace,1); + fragCoord = (vertexPosition_modelspace.xy+vec2(1,1))/2.0; +} diff --git a/.config/cava/shaders/spectrogram.frag b/.config/cava/shaders/spectrogram.frag new file mode 100644 index 0000000..adce70a --- /dev/null +++ b/.config/cava/shaders/spectrogram.frag @@ -0,0 +1,53 @@ +#version 330 + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high +// to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +// colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +uniform sampler2D inputTexture; // Texture from the last render pass + +vec3 normalize_C(float y, vec3 col_1, vec3 col_2, float y_min, float y_max) { + // create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() { + // find which bar to use based on where we are on the y axis + int bar = int(bars_count * fragCoord.y); + float y = bars[bar]; + float band_size = 1.0 / float(bars_count); + float current_band_min = bar * band_size; + float current_band_max = (bar + 1) * band_size; + + int hist_length = 512; + float win_size = 1.0 / hist_length; + + if (fragCoord.x > 1.0 - win_size) { + + if (fragCoord.y > current_band_min && fragCoord.y < current_band_max) { + + fragColor = vec4(fg_color * y, 1.0); + } + } else { + vec2 offsetCoord = fragCoord; + offsetCoord.x += float(win_size); + fragColor = texture(inputTexture, offsetCoord); + } +} \ No newline at end of file diff --git a/.config/cava/shaders/winamp_line_style_spectrum.frag b/.config/cava/shaders/winamp_line_style_spectrum.frag new file mode 100644 index 0000000..375ff27 --- /dev/null +++ b/.config/cava/shaders/winamp_line_style_spectrum.frag @@ -0,0 +1,112 @@ +#version 330 + +// Emulate the "line style" spectrum analyzer from Winamp 2. +// Try this config for a demonstration: + +/* +[general] +bar_width = 2 +bar_spacing = 0 +higher_cutoff_freq = 22000 + +[output] +method = sdl_glsl +channels = mono +fragment_shader = winamp_line_style_spectrum.frag + +[color] +background = '#000000' +gradient = 1 +gradient_color_1 = '#319C08' +gradient_color_2 = '#29CE10' +gradient_color_3 = '#BDDE29' +gradient_color_4 = '#DEA518' +gradient_color_5 = '#D66600' +gradient_color_6 = '#CE2910' + +[smoothing] +noise_reduction = 10 +*/ + +in vec2 fragCoord; +out vec4 fragColor; + +// bar values. defaults to left channels first (low to high), then right (high to low). +uniform float bars[512]; + +uniform int bars_count; // number of bars (left + right) (configurable) +uniform int bar_width; // bar width (configurable), not used here +uniform int bar_spacing; // space bewteen bars (configurable) + +uniform vec3 u_resolution; // window resolution + +//colors, configurable in cava config file (r,g,b) (0.0 - 1.0) +uniform vec3 bg_color; // background color +uniform vec3 fg_color; // foreground color + +uniform int gradient_count; +uniform vec3 gradient_colors[8]; // gradient colors + +vec3 normalize_C(float y,vec3 col_1, vec3 col_2, float y_min, float y_max) +{ + //create color based on fraction of this color and next color + float yr = (y - y_min) / (y_max - y_min); + return col_1 * (1.0 - yr) + col_2 * yr; +} + +void main() +{ + // find which bar to use based on where we are on the x axis + float x = u_resolution.x * fragCoord.x; + int bar = int(bars_count * fragCoord.x); + + //calculate a bar size + float bar_size = u_resolution.x / bars_count; + + //the y coordinate is stretched by 4X to resemble Winamp + float y = min(bars[bar] * 4.0, 1.0); + + // make sure there is a thin line at bottom + if (y * u_resolution.y < 1.0) + { + y = 1.0 / u_resolution.y; + } + + vec4 bar_color; + + if (gradient_count == 0) + { + bar_color = vec4(fg_color,1.0); + } + else + { + //find color in the configured gradient for the top of the bar + int color = int((gradient_count - 1) * y); + + //find where on y this and next color is supposed to be + float y_min = float(color) / (gradient_count - 1.0); + float y_max = float(color + 1) / (gradient_count - 1.0); + + //make a solid color for the entire bar + bar_color = vec4(normalize_C(y, gradient_colors[color], gradient_colors[color + 1], y_min, y_max), 1.0); + } + + + //draw the bar up to current height + if (y > fragCoord.y) + { + //make some space between bars based on settings + if (x > (bar + 1) * (bar_size) - bar_spacing) + { + fragColor = vec4(bg_color,1.0); + } + else + { + fragColor = bar_color; + } + } + else + { + fragColor = vec4(bg_color,1.0); + } +} \ No newline at end of file diff --git a/.config/cava/themes/solarized_dark b/.config/cava/themes/solarized_dark new file mode 100644 index 0000000..200057c --- /dev/null +++ b/.config/cava/themes/solarized_dark @@ -0,0 +1,15 @@ +[color] +background = '#001e26' +foreground = '#708183' + +gradient = 1 +gradient_color_1 = '#268bd2' +gradient_color_2 = '#6c71c4' +gradient_color_3 = '#cb4b16' + +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#586e75' +horizontal_gradient_color_2 = '#b58900' +horizontal_gradient_color_3 = '#839496' + +blend_direction = 'up' \ No newline at end of file diff --git a/.config/cava/themes/tricolor b/.config/cava/themes/tricolor new file mode 100644 index 0000000..b908137 --- /dev/null +++ b/.config/cava/themes/tricolor @@ -0,0 +1,10 @@ +[color] +horizontal_gradient = 1 +horizontal_gradient_color_1 = '#c45161' +horizontal_gradient_color_2 = '#e094a0' +horizontal_gradient_color_3 = '#f2b6c0' +horizontal_gradient_color_4 = '#f2dde1' +horizontal_gradient_color_5 = '#cbc7d8' +horizontal_gradient_color_6 = '#8db7d2' +horizontal_gradient_color_7 = '#5e62a9' +horizontal_gradient_color_8 = '#434279' \ No newline at end of file