Version 0.1.0
This commit is contained in:
68
home-manager/20_cava/01_shaders_bar-spectrum.nix
Normal file
68
home-manager/20_cava/01_shaders_bar-spectrum.nix
Normal file
@@ -0,0 +1,68 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/cava/shaders/bar_spectrum.frag".text = ''
|
||||
#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
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
'';
|
||||
}
|
||||
29
home-manager/20_cava/02_shaders_northern-lights.nix
Normal file
29
home-manager/20_cava/02_shaders_northern-lights.nix
Normal file
@@ -0,0 +1,29 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/cava/shaders/northern_lights.frag".text = ''
|
||||
#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;
|
||||
}
|
||||
'';
|
||||
}
|
||||
15
home-manager/20_cava/03_shaders_pass-through.nix
Normal file
15
home-manager/20_cava/03_shaders_pass-through.nix
Normal file
@@ -0,0 +1,15 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/cava/shaders/pass_through.vert".text = ''
|
||||
#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;
|
||||
}
|
||||
'';
|
||||
}
|
||||
46
home-manager/20_cava/04_shaders_spectrogram.nix
Normal file
46
home-manager/20_cava/04_shaders_spectrogram.nix
Normal file
@@ -0,0 +1,46 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/cava/shaders/spectrogram.frag".text = ''
|
||||
#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 first 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);
|
||||
}
|
||||
}
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/cava/shaders/winamp_line_style_spectrum.frag".text = ''
|
||||
#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);
|
||||
}
|
||||
}
|
||||
'';
|
||||
}
|
||||
87
home-manager/20_cava/default.nix
Normal file
87
home-manager/20_cava/default.nix
Normal file
@@ -0,0 +1,87 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
./01_shaders_bar-spectrum.nix
|
||||
./02_shaders_nothern-lights.nix
|
||||
./03_shaders_pass-through.nix
|
||||
./04_shaders_spectrogram.nix
|
||||
./05_shaders_winamp-line-style-spectrum.nix
|
||||
];
|
||||
|
||||
home.file = {
|
||||
".config/cava/config".text = ''
|
||||
# ──────────────────────────────────────────────────────────────────────────
|
||||
# °˖* ૮( • ᴗ 。)っ🍸 pewdiepie/archdaemon/dionysh shhheersh
|
||||
# Custom config for cava
|
||||
# vers. 1.0.0-nix
|
||||
# ──────────────────────────────────────────────────────────────────────────
|
||||
|
||||
; ── General ───────────────────────────────────────────────────────────────
|
||||
[general]
|
||||
; framerate – frames per second (non‑negative)
|
||||
framerate = 64
|
||||
|
||||
; number of bars (0 = auto). 64 gives a nice “classic” look.
|
||||
bars = 64
|
||||
|
||||
; ── Input ─────────────────────────────────────────────────────────────────
|
||||
[input]
|
||||
; Choose the backend you actually use. Here we keep *pulse* active and
|
||||
; leave the other back‑ends commented for easy switching.
|
||||
method = pulse
|
||||
source = alsa_output.pci-0000_06_00.6.analog-stereo.monitor
|
||||
;method = pipewire
|
||||
;source = auto
|
||||
;method = alsa
|
||||
;source = hw:Loopback,1
|
||||
;method = fifo
|
||||
;source = /tmp/mpd.fifo
|
||||
;method = shmem
|
||||
;source = /squeezelite-AA:BB:CC:DD:EE:FF
|
||||
;method = portaudio
|
||||
;source = auto
|
||||
;method = sndio
|
||||
;source = default
|
||||
;method = oss
|
||||
;source = /dev/dsp
|
||||
;method = jack
|
||||
;source = default
|
||||
|
||||
; ── Output ────────────────────────────────────────────────────────────────
|
||||
[output]
|
||||
; Raw output is the most portable – it writes binary/ascii data to a FIFO.
|
||||
method = raw
|
||||
raw_target = /tmp/cava.raw ; where the data will be written
|
||||
data_format = ascii ; ascii makes it easy to inspect with `cat`
|
||||
|
||||
; Uncomment and adjust if you ever need binary data.
|
||||
;bit_format = 16bit
|
||||
|
||||
; ── Colours ───────────────────────────────────────────────────────────────
|
||||
[color]
|
||||
; Keep the terminal’s own palette (default) – edit only if your terminal
|
||||
; supports true‑colour changes.
|
||||
;background = default
|
||||
;foreground = default
|
||||
|
||||
; ── Smoothing ─────────────────────────────────────────────────────────────
|
||||
[smoothing]
|
||||
; The “Monstercat” smoothing algorithm gives a nice, slightly‑soft look.
|
||||
; Set to 0 to disable, 1‑100 to increase smoothness.
|
||||
monstercat = 0
|
||||
waves = 0
|
||||
|
||||
; ── Equaliser (optional) ──────────────────────────────────────────────────
|
||||
[eq]
|
||||
; Uncomment the bands you want to boost/cut. Values are 0‑100 where 50 is
|
||||
; “no change”. Example shows a flat (all‑50) EQ.
|
||||
;1 = 50 ; bass
|
||||
;2 = 50
|
||||
;3 = 50 ; mid‑tone
|
||||
;4 = 50
|
||||
;5 = 50 ; treble
|
||||
'';
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user