Live-FFT-Spektrogramm (Falschfarben) mit LUFS- und dB(A)-Metern in einer ressourcensparsamen Rust/Slint-GUI für 10″-Displays. Zwei getrennte Audioeingänge, Konfiguration im Browser, lauffähig auf dem Raspberry Pi 1 (ARMv6).
  • Rust 61%
  • Slint 19.6%
  • Shell 11.9%
  • HTML 7.5%
Find a file
audioprog ae1d107a57
All checks were successful
release / release (push) Successful in 8m35s
windows / windows (push) Successful in 6m30s
bump spectralmeter version to 0.3.20
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 13:46:30 +00:00
.cargo CI: zusätzlicher arm64-Build (Raspberry Pi 3, 64-bit) 2026-07-28 20:53:18 +00:00
.forgejo/workflows Kiosk: Anzeige-Rotation (Bild+Touch) und Neustart/Herunterfahren 2026-08-06 08:56:48 +00:00
.vscode Wasserfall vertikal (Ring-Puffer) + Ziel-Lautstärke-Anzeige, 1:1-Rendering 2026-07-27 12:48:50 +00:00
scripts Kiosk: Anzeige-Rotation (Bild+Touch) und Neustart/Herunterfahren 2026-08-06 08:56:48 +00:00
src Eingangs-Status-Streifen (HA-Pull), ALSA-Aufnahme-Mixer, Mel-Achse 2026-08-06 13:46:12 +00:00
ui Eingangs-Status-Streifen (HA-Pull), ALSA-Aufnahme-Mixer, Mel-Achse 2026-08-06 13:46:12 +00:00
.gitignore Initial commit: SpectralMeter – Live-FFT/LUFS/dB(A) GUI für Raspberry Pi 1 2026-07-20 12:45:56 +00:00
app.rc Windows: Fenster-Schrumpfen beheben + App-Icon 2026-07-29 17:48:56 +00:00
build.rs Windows: Fenster-Schrumpfen beheben + App-Icon 2026-07-29 17:48:56 +00:00
Cargo.lock bump spectralmeter version to 0.3.20 2026-08-06 13:46:30 +00:00
Cargo.toml bump spectralmeter version to 0.3.20 2026-08-06 13:46:30 +00:00
CROSS_COMPILE.md Initial commit: SpectralMeter – Live-FFT/LUFS/dB(A) GUI für Raspberry Pi 1 2026-07-20 12:45:56 +00:00
icon.ico Windows: Fenster-Schrumpfen beheben + App-Icon 2026-07-29 17:48:56 +00:00
KIOSK-TUNING.md Add KIOSK-TUNING guide for optimizing RAM and boot time on Raspberry Pi 1 2026-07-28 18:47:34 +00:00
KIOSK.md Kiosk: Anzeige-Rotation (Bild+Touch) und Neustart/Herunterfahren 2026-08-06 08:56:48 +00:00
README.md Initial commit: SpectralMeter – Live-FFT/LUFS/dB(A) GUI für Raspberry Pi 1 2026-07-20 12:45:56 +00:00
ROTATION.md Kiosk: Anzeige-Rotation (Bild+Touch) und Neustart/Herunterfahren 2026-08-06 08:56:48 +00:00
WINDOWS.md Auto-Update für die Windows-Version (self_update über Forgejo-Releases) 2026-07-30 09:15:43 +00:00

SpectralMeter

Live-FFT-Spektrogramm (2D, Falschfarben) + LUFS- und dB(A)-Pegel in einer ressourcensparsamen Rust-GUI für ein 10"-Display. Zwei getrennte Audioeingänge (FFT und Loudness), Konfiguration im Browser. Zielplattform u.a. Raspberry Pi 1 (ARMv6).

Merkmale

  • Spektrogramm als scrollender Falschfarben-Wasserfall (Colormaps: inferno, magma, heat, grayscale)
  • Live-FFT-Streifen (Momentanspektrum) über dem Spektrogramm
  • LUFS nach EBU R128 / ITU-R BS.1770: Momentary, Short-term, Integrated, True Peak
  • dB(A)-Balken (A-Bewertung nach IEC 61672, Fast), mit Kalibrier-Offset
  • Zwei getrennte Eingänge verschiedene Geräte oder Kanäle eines Mehrkanal-Geräts
  • Software-Rendering (Slint) keine GPU/OpenGL nötig, läuft direkt aufs DRM-Display
  • Browser-Konfiguration über einen sehr leichten HTTP-Server (kein Chromium auf dem Pi)

Architektur

 ALSA-Gerät A ─┐                      ┌─ FFT-Worker  ── Spektrogramm + FFT-Streifen ─┐
               ├─ audio (cpal) ──mpsc─┤                                             ├─ Slint-GUI (Software-Renderer, 10")
 ALSA-Gerät B ─┘   Dedup pro Gerät    └─ Loudness-Worker ── LUFS + dB(A) ───────────┘
                                                     │
                                            tiny_http Web-Config  ── Browser
  • src/audio.rs cpal/ALSA-Capture, fasst gleiche Geräte zu einem Stream zusammen
  • src/analysis/fft.rs reelle FFT (realfft) + Hann-Fenster + dB
  • src/analysis/loudness.rs LUFS (Crate ebur128, reines Rust)
  • src/analysis/aweighting.rs dB(A)-IIR (bilinear) + Fast-Zeitbewertung
  • src/viz.rs + src/colormap.rs + src/pixbuf.rs Falschfarben, Frequenz-Mapping, Scroll-Puffer
  • src/web.rs + ui/config.html Browser-Konfiguration (REST/JSON)
  • ui/appwindow.slint die GUI

Entwicklung (x86-Host)

cargo run          # Fenster (winit) mit Software-Renderer; ohne Audiogerät läuft ein Testsignal

Konfiguration danach im Browser: http://localhost:8080

Deploy auf den Raspberry Pi 1 (ARMv6)

Der Pi 1 ist zu schwach, um selbst zu bauen → Cross-Compile. Details in CROSS_COMPILE.md. Kurz:

./scripts/setup-cross.sh                       # Rust-Target + Linker (einmalig)
./scripts/sync-sysroot.sh raspberrypi.local pi # ARMv6-Sysroot von Pi OS holen
./scripts/build-pi.sh                          # baut mit --features pi
scp target/arm-unknown-linux-gnueabihf/release/spectralmeter pi@raspberrypi.local:~/

Auf dem Pi: KMS-Treiber in /boot/config.txt (dtoverlay=vc4-fkms-v3d), ohne Desktop starten (siehe CROSS_COMPILE.md), dann ./spectralmeter.

Konfiguration

Wird als ~/spectralmeter.json gespeichert und über die Web-UI geändert. Änderungen an Colormap/dB-Bereich/Frequenzen/Framerate/dB(A) wirken live; Gerätewechsel und FFT-Größe brauchen einen Neustart (die Web-UI weist darauf hin).