From 7ebb5932887f192cab5394d916c82456408b24d5 Mon Sep 17 00:00:00 2001 From: hacklab Date: Fri, 22 May 2026 16:28:17 +0200 Subject: [PATCH] Panel: fuente Xirod, titulos centrados y diseno de dos columnas Anade la fuente Xirod (web/panel/fonts/xirod.otf, de 1001fonts) para el titulo del panel, tanto en Raspberry como en portatil. Titulos centrados en la cabecera y en cada tarjeta. En pantalla ancha el panel pasa a dos columnas para aprovechar el espacio del portatil (Visuales/Audio/Sensibilidad a la izquierda, Motor y controles a la derecha); en movil sigue en una sola columna, igual que antes. El README explica el uso en ordenador con diagrama, comandos y tabla de diferencias, recalcando que en ordenador no se usa el modo kiosko. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 59 +++++-- web/panel/fonts/README.txt | 9 ++ web/panel/fonts/xirod.otf | Bin 0 -> 31556 bytes web/panel/index.html | 311 +++++++++++++++++++------------------ web/panel/panel.css | 84 +++++++--- 5 files changed, 281 insertions(+), 182 deletions(-) create mode 100644 web/panel/fonts/README.txt create mode 100644 web/panel/fonts/xirod.otf diff --git a/README.md b/README.md index 220ef57..77648d3 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,15 @@ # FOSFENO -**Motor de visuales audio-reactivas para Raspberry Pi.** +**Motor de visuales audio-reactivas para Raspberry Pi y para portátil Linux.** Convierte una Raspberry Pi + un proyector + un micro USB en una estación de -VJ automática: la Pi escucha la música de la sala, detecta su BPM y proyecta +VJ automática: escucha la música de la sala, detecta su BPM y proyecta visuales que reaccionan al sonido. Todo se controla desde un panel web. +Funciona en dos escenarios: en una **Raspberry Pi** como aparato dedicado que +arranca solo, o en un **portátil Linux** que lanzas cuando quieras. El apartado +[En un portátil Linux](#en-un-portátil-linux) explica las diferencias. + ``` [ Música en la sala ] │ (micro USB) @@ -76,13 +80,7 @@ bash install.sh --no-projectm # omite la compilación de projectM bash install.sh --check # solo comprueba el sistema, no instala nada ``` -### En un portátil Linux - -FOSFENO también corre en un portátil con Debian, Ubuntu o Mint, sin Raspberry -Pi. Se instala con `bash install.sh --laptop` y se arranca cuando quieras con -`./fosfeno`. Los detalles están en [FOSFENO en un portátil](docs/portatil.md). - -Después: +Después, en la Raspberry, activa el arranque al escritorio: ```bash sudo raspi-config # System Options → Boot/Auto Login → Desktop Autologin @@ -91,6 +89,49 @@ sudo reboot Al reiniciar, la Pi arranca sola en modo kiosko mostrando las visuales. +### En un portátil Linux + +FOSFENO no necesita la Raspberry: corre igual en un portátil con Debian, +Ubuntu o Mint. El portátil ya trae micrófono y cámara, y lo conectas al +proyector por HDMI como cualquier otra cosa. + +``` + [ Música de la sala ] + │ (micrófono integrado, o USB) + ▼ + ┌────────────────────────┐ + │ Portátil Linux │── HDMI ──▶ [ Proyector :: visuales ] + │ ./fosfeno │ + └───────────┬────────────┘ + │ + Panel: http://localhost:8080/ + (o desde el móvil, en la misma red Wi-Fi) +``` + +Se instala una vez y se arranca a mano cuando lo necesites: + +```bash +bash install.sh --laptop # instala, sin tocar el arranque del sistema +./fosfeno # arranca FOSFENO; Ctrl+C para cerrarlo +``` + +Diferencias con la Raspberry Pi: + +| | Raspberry Pi | Portátil Linux | +|---|---|---| +| Arranque | Automático al encender | A mano, con `./fosfeno` | +| Modo kiosko | Sí: visuales a pantalla completa al arrancar | **No**: ventana normal que mueves al proyector | +| Puerto del panel | 80 — `http://fosfeno.local/` | 8080 — `http://localhost:8080/` | +| Micrófono y cámara | Por USB | Los integrados del portátil | +| Cambios en el sistema | Arranque automático y nombre de red | Ninguno | + +La diferencia clave: en el portátil **no se usa el modo kiosko**. Las visuales +salen en una ventana de navegador normal que arrastras a la pantalla del +proyector y pones a pantalla completa con F11. Así FOSFENO no se apodera de tu +pantalla ni se mete en el arranque del sistema; lo abres y lo cierras tú. + +Guía completa: [FOSFENO en un portátil](docs/portatil.md). + ## Uso - **Visuales** → salen automáticamente por el proyector (HDMI). diff --git a/web/panel/fonts/README.txt b/web/panel/fonts/README.txt new file mode 100644 index 0000000..10e3196 --- /dev/null +++ b/web/panel/fonts/README.txt @@ -0,0 +1,9 @@ +Fuente del panel +================ + +xirod.otf - fuente "Xirod", usada para el titulo del panel. +Descargada de 1001fonts.com. Comprueba sus condiciones de uso si vas a +distribuir el proyecto con fines comerciales. + +Para cambiar la fuente del titulo, sustituye este archivo y ajusta la +regla @font-face de web/panel/panel.css. diff --git a/web/panel/fonts/xirod.otf b/web/panel/fonts/xirod.otf new file mode 100644 index 0000000000000000000000000000000000000000..7abda0724a7652917774d32fe6761ac665f056a8 GIT binary patch literal 31556 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 N)^7
-

F O S F E N O

+

FOSFENO

@@ -20,167 +20,176 @@ +
- -
-
- Visuales - -
- -
+
- -
-
- Motor de visuales - -
-
- - - - - -
-
+ +
+
+ Visuales + +
+ +
- -
-
- Audio - -
- - -
- BPM detectado - -- -
-

Si conectas el microfono o la camara con la Raspberry ya - encendida, pulsa este boton para que aparezcan.

-
+ +
+
+ Audio + +
+ + +
+ BPM detectado + -- +
+

Si conectas el microfono o la camara con el equipo ya + encendido, pulsa este boton para que aparezcan.

+
- -
-
- Sensibilidad al audio: - 1.0 - -
- -
+ +
+
+ Sensibilidad al audio: + 1.0 + +
+ +
- - + +
+ Ahora suena +
-
+
- - + +
+ + +
- - +

FOSFENO

+
- - +
- -
- Ahora suena -
-
-
+ +
+
+ Motor de visuales + +
+
+ + + + + +
+
- -
- - -
+ + -

FOSFENO

+ + + + + + + + + +
diff --git a/web/panel/panel.css b/web/panel/panel.css index 38188c4..a29e23e 100644 --- a/web/panel/panel.css +++ b/web/panel/panel.css @@ -1,5 +1,13 @@ /* FOSFENO :: Panel de control - Tema verde acido y negro, con acentos en naranja neon. */ + Tema verde acido y negro, con acentos en naranja neon. + Movil: una columna. Pantalla ancha: dos columnas. */ + +@font-face { + font-family: "Xirod"; + src: url("/panel/fonts/xirod.otf") format("opentype"); + font-display: swap; +} + :root { --bg: #060a06; --card: #0d120c; @@ -27,24 +35,52 @@ body { padding-bottom: 48px; } +/* --- Cabecera con el titulo centrado --- */ header { - display: flex; align-items: center; justify-content: space-between; - padding: 18px 20px; border-bottom: 2px solid var(--green-d); - position: sticky; top: 0; background: var(--bg); z-index: 10; + position: sticky; top: 0; z-index: 10; + display: flex; align-items: center; justify-content: center; + padding: 16px 20px; border-bottom: 2px solid var(--green-d); + background: var(--bg); } header h1 { - font-size: 20px; font-weight: 800; letter-spacing: 0.32em; - color: var(--green); text-shadow: 0 0 14px rgba(180, 255, 0, 0.55); + font-family: "Xirod", "Arial Black", sans-serif; + font-size: 21px; font-weight: 400; letter-spacing: 0.16em; + color: var(--green); text-shadow: 0 0 16px rgba(180, 255, 0, 0.6); +} +#conn { + position: absolute; right: 20px; top: 50%; transform: translateY(-50%); } - .dot { width: 13px; height: 13px; border-radius: 50%; display: inline-block; } .dot.on { background: var(--green); box-shadow: 0 0 9px var(--green); } .dot.off { background: var(--red); box-shadow: 0 0 9px var(--red); } +/* --- Disposicion: movil en una columna --- */ main { max-width: 560px; margin: 0 auto; padding: 16px; display: flex; flex-direction: column; gap: 14px; } +.column { display: contents; } /* en movil, las columnas no existen */ + +/* Orden de las tarjetas cuando estan todas en una sola columna (movil) */ +#card-power { order: 1; } +#card-engines { order: 2; } +#card-audio { order: 3; } +#card-sens { order: 4; } +#ctl-butterchurn, #ctl-editor, #ctl-mixer, #ctl-projectm { order: 5; } +#card-now { order: 6; } +#card-sys { order: 7; } +#net-foot { order: 8; } + +/* --- Disposicion: pantalla ancha (portatil) en dos columnas --- */ +@media (min-width: 880px) { + main { + max-width: 1080px; flex-direction: row; + align-items: flex-start; gap: 18px; + } + .column { + display: flex; flex-direction: column; gap: 14px; flex: 1 1 0; + } +} /* --- Tarjetas --- */ .card { @@ -54,9 +90,10 @@ main { } .card.center { align-items: center; } +/* Cabecera de tarjeta: titulo centrado, boton de info a la derecha */ .cardhead { - display: flex; align-items: center; justify-content: space-between; - gap: 10px; width: 100%; + position: relative; width: 100%; + display: flex; align-items: center; justify-content: center; } .label { color: var(--green); font-size: 13px; text-transform: uppercase; @@ -68,9 +105,10 @@ main { gap: 10px; } .row .cmd { flex: 1; } -/* --- Boton de informacion (circular naranja) --- */ +/* --- Boton de informacion (circular naranja, esquina de la tarjeta) --- */ .info { - width: 28px; height: 28px; flex: none; border-radius: 50%; + position: absolute; right: 0; top: 50%; transform: translateY(-50%); + width: 28px; height: 28px; border-radius: 50%; background: var(--orange); color: var(--ink); border: none; font-weight: 900; font-style: italic; font-size: 15px; cursor: pointer; box-shadow: 0 0 10px rgba(255, 122, 0, 0.5); @@ -115,9 +153,7 @@ main { font-weight: 700; font-size: 14px; } .cmd:active, .sysbtn:active { background: #202a16; } -.cmd.accent { - background: var(--green); color: var(--ink); border: none; -} +.cmd.accent { background: var(--green); color: var(--ink); border: none; } /* --- Selectores y sliders --- */ select { @@ -165,6 +201,8 @@ input[type=range] { width: 100%; accent-color: var(--green); height: 30px; } font-size: 13px; font-family: "Fira Mono", Consolas, monospace; } +/* --- Tarjeta de estado --- */ +#card-now { text-align: center; } .now { font-size: 15px; color: var(--orange-n); word-break: break-word; } /* --- Sistema --- */ @@ -172,11 +210,17 @@ input[type=range] { width: 100%; accent-color: var(--green); height: 30px; } .sys .sysbtn { flex: 1; } .sysbtn.danger { color: var(--red); border-color: var(--red); } +/* --- Pie con la direccion del panel --- */ +.netfoot { + text-align: center; color: var(--dim); + font-size: 12px; font-family: monospace; padding: 4px 0 8px; +} + /* --- Banda de avisos --- */ .notif { display: flex; align-items: center; gap: 10px; padding: 12px 16px; font-size: 14px; font-weight: 600; - position: sticky; top: 60px; z-index: 9; + position: sticky; top: 56px; z-index: 9; } .notif.info { background: var(--green); color: var(--ink); } .notif.warn { background: var(--orange); color: var(--ink); } @@ -201,12 +245,8 @@ input[type=range] { width: 100%; accent-color: var(--green); height: 30px; } box-shadow: 0 0 30px rgba(180, 255, 0, 0.3); } .modal-box h2 { - color: var(--green); font-size: 18px; letter-spacing: 0.04em; + font-family: "Xirod", "Arial Black", sans-serif; font-weight: 400; + color: var(--green); font-size: 16px; letter-spacing: 0.06em; + text-align: center; } .modal-box p { color: var(--txt); font-size: 14px; line-height: 1.5; } - -/* Pie con la direccion del panel */ -.netfoot { - text-align: center; color: var(--dim); - font-size: 12px; font-family: monospace; padding: 4px 0 8px; -}