Skip to content

Audio-reactive color hook + live theme recoloring for embedders - #24

Open
avillagran wants to merge 3 commits into
omacom:masterfrom
avillagran:feat/audio-reactive-hook
Open

Audio-reactive color hook + live theme recoloring for embedders#24
avillagran wants to merge 3 commits into
omacom:masterfrom
avillagran:feat/audio-reactive-hook

Conversation

@avillagran

Copy link
Copy Markdown

Qué hace

Dos hooks que permiten a quienes embeben ttfx como librería (modo --loop, paneles de fondo, widgets) reaccionar a audio y recolorear efectos en tiempo real sin parches por-efecto:

1. Hook global sgr_color (utils/ansi)

set_audio_color(active, brightness, matrix[9]) — una matriz 3x3 + brillo que se aplica a TODO color SGR que ttfx emite. Un embedder puede:

  • Mapear bass → hue shift y volumen → brillo (nuestro caso: backgrounds audio-reactivos)
  • Recolorear con la paleta de un tema de escritorio al vuelo (cambio de theme en vivo sin reiniciar el efecto)

Sin esto, cada efecto necesitaría un patch individual. Con el hook, el engine aplica la transform en un solo punto.

2. Effect::on_audio(volume, bass, beat) + implementación de referencia en thunderstorm

  • Trait Effect gana un método default no-op; los efectos opt-in
  • Thunderstorm: beats dispara relámpagos, volumen controla multi-strike (1-10 rayos) y rapidez de caída
  • Branch capping por rayo (max 5 subdivisiones) para controlar grosor visual

Por qué mergearlo

  • Sin cambios de comportamiento default: set_audio_color inactivo = identidad, on_audio default = no-op
  • El engine --loop ya existe upstream; estos hooks son la pieza que falta para backgrounds reactivos
  • thunderstorm es la implementación de referencia que demuestra el patrón

Uso (embedder)

// 1. Global: audio-reactive color (bass->hue, vol->brightness)
ttfx::utils::ansi::set_audio_color(true, 1.2, hue_rotation_matrix);

// 2. Por-frame: efectos que opt-in al audio
effect.on_audio(&mut ctx, volume, bass, beat);
effect.next_frame(&mut ctx);

Notas

  • ansi.rs: hook sgr_color aplicado en el punto único donde se emiten códigos de color
  • effect.rs: método default en el trait (no breaking change para efectos existentes)
  • thunderstorm.rs: campos audio_volume/audio_beat, setup_lightning_strike_capped, lógica on_audio

Provenance: extraído de omarchy-audio-background donde corre en producción en paneles de fondo Omarchy.

…lti-strike)

Implements the Effect::on_audio reference implementation on thunderstorm:
- Loud passages / detected beats trigger lightning strikes on the beat
- Strike count scales with volume (1..10 thin rays), branches per ray
  capped at 5 for user-controlled jaggedness
- Strike fall speed (batch/delay) follows volume for punchy drops
- Loop the storm phase continuously so external supervisors (background
  rotators) control lifetime without a visible fade-out/fade-in seam
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant