feat(renaser): Fase 15 — la voz del sistema (acorde + eventos)

La bocina pertenecía al app enfocado (Fase 12), pero el kernel
necesita hablar también. Ahora tiene voz propia, prioritaria.

- `altavoz`: cola `SECUENCIA: Mutex<VecDeque<(u32,u32)>>` (freq, ms)
  + reloj `FIN_NOTA: AtomicU64`. `agendar(&[...])` encola;
  `atender()` (tarea del compositor cada fotograma) avanza la
  secuencia y silencia al acabar; `kernel_sonando()` gatea a los
  apps — mientras el kernel suena, `sys_tono` no-op.
- Catálogo: VOZ_BIENVENIDA (Do5-Mi5-Sol5, 500 ms), VOZ_LANZAR
  (700→1050 Hz), VOZ_CERRAR (900→520 Hz), VOZ_DESALOJO (180 Hz).
- Hitos: `kernel_main` agenda el acorde antes de `ejecutor.run`;
  `nacer_ventana` (Alt+N), `cerrar` (Alt+Q), `desalojar` (falla)
  agendan al hacer su trabajo.
- De paso: las pestañas de la barra de tareas calculan su tinta por
  brillo del fondo (ITU-R BT.601); la pestaña crema del desalojo por
  memoria, que llevaba texto blanco invisible, ahora luce su nombre
  en tinta oscura.

Verificado en QEMU con `-audiodev wav -machine pcspk-audiodev=spk`:
el PCM crudo trae, en orden, el acorde de bienvenida (~520, 630, 760
Hz), un brevísimo 180 Hz (las balizas de discola/glotona desalojadas)
y después la escala de Do mayor de tonada.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-23 02:21:37 +00:00
parent 6a29152feb
commit 28c2e6af18
8 changed files with 199 additions and 3 deletions
+38
View File
@@ -1008,3 +1008,41 @@ barra al pie con la lista de quien vive en la casa.
enfocada, índigo), las desalojadas en sus colores de baliza. Un clic
sobre `pulso` cambia el foco al instante: el borde índigo del compositor
deja la maestra y envuelve a `pulso`, y la pestaña `pulso` se ilumina.
## Fase 15 — La voz del sistema — 2026-05-23
La bocina pertenecía a la ventana enfocada (Fase 12), pero el kernel necesita
hablar también: un acorde al abrir la casa, un repique al recibir un inquilino
nuevo, un bajo al echar a uno que se rompió. La Fase 15 le da al sistema su
propia voz, prioritaria sobre las de los apps.
### Añadido
- **`altavoz::SECUENCIA`** — una `VecDeque<(u32, u32)>` (frecuencia, duración
ms) que el kernel encola con `altavoz::agendar(&[(...)])`. `FIN_NOTA` (un
`AtomicU64`) recuerda el milisegundo del reloj monótono en que la nota
actual debe terminar.
- **`altavoz::atender()`** — invocada por la tarea del compositor cada
fotograma; si la nota actual ya terminó, saca la siguiente de la cola y la
toca; si la cola está vacía, silencia.
- **`altavoz::kernel_sonando()`** — `true` mientras `FIN_NOTA` esté en el
futuro. `sys_tono` lo consulta y, en ese caso, ignora la llamada del app:
el kernel no se interrumpe a sí mismo.
- **Catálogo de voces**: `VOZ_BIENVENIDA` (Do5-Mi5-Sol5 ascendente, 500 ms),
`VOZ_LANZAR` (repique 700→1050 Hz), `VOZ_CERRAR` (descendente 900→520 Hz),
`VOZ_DESALOJO` (bajo 180 Hz, 260 ms).
- **Hitos sonoros**: `kernel_main` agenda `VOZ_BIENVENIDA` justo antes de
`ejecutor.run()`. `nacer_ventana` agenda `VOZ_LANZAR`. `cerrar` agenda
`VOZ_CERRAR`. `desalojar` agenda `VOZ_DESALOJO`.
### Cambiado
- Las pestañas de la barra de tareas calculan su tinta por brillo del fondo
(ITU-R BT.601): la pestaña amarilla pálida del desalojo por memoria, que
llevaba texto blanco invisible, ahora luce su nombre en tinta oscura.
### Verificado
- QEMU con `-audiodev wav -machine pcspk-audiodev=spk`. El PCM crudo revela,
en orden, las tres notas del acorde de bienvenida (≈520, 630, 760 Hz),
inmediatamente un brevísimo bajo de 180 Hz (la baliza de discola/glotona
desalojadas), y después la escala de `tonada` tomando la bocina.
- Captura: la pestaña de `glotona` (crema) muestra ahora su nombre legible
en tinta oscura; la de `discola` (púrpura) sigue clara, como antes.