9cd8292acc
Lint & Validate / lint (push) Has been cancelled
P2-R1: ALSA + JACK2 low-latency config (scripts, quirks, tuning) P2-R2: Carla integration (build scripts, 8ch rack config, NAM LV2 support) P2-R3: Plugin manager, categories, blacklist, NAM model support P3-R1: Mixer DSP engine (channel strip, routing matrix, bus mgr, automation) P4-R1: MIDI engine (learn mode, clock sync, HID discovery, mapping store) P4-R2: Network API (OSC server, FastAPI REST, WebSocket, auth, rate limiter) P5-R1: Touchscreen UI evaluation + main entry point docs: Audio stack, Carla integration, MIDI support, UI evaluation tests: Full test suite (292 passing)
4.4 KiB
4.4 KiB
Touchscreen UI Toolkit Evaluation
Raspberry Pi 4B, official 7" (800×480) or Waveshare 5" (720×720) DSI/HDMI touch displays. Requirements: faders, meters, mute/solo, routing matrix, plugin chain, touch gestures, DPI-aware layout.
Candidates
LVGL (Light and Versatile Graphics Library)
- Type: C library, embedded-first, Python bindings via
lvglpackage - RPi support: Native framebuffer + SDL2/KMS backends, no X11 required
- Touch: Native input device support (libinput/evdev), multi-touch, gestures
- DPI: Pixel-based (px), no automatic scaling — manual math required
- Widgets: Sliders, buttons, labels, charts, tables — good but basic
- Performance: ⭐⭐⭐⭐⭐ — C rendering, 30-60 FPS on RPi 4
- Python ergonomics: ⭐⭐ — Python bindings are auto-generated, not idiomatic; callbacks are C-style, error messages opaque; limited docs for Python usage
- Verdict: Best performance, but Python API is friction-heavy. Good for C projects. Too much pain for a Python codebase.
GTK 3/4
- Type: C library, GObject introspection for Python (
PyGObject) - RPi support: Requires X11 or Wayland compositor — adds RAM overhead
- Touch: Mouse-emulated touch; not natively touch-optimized
- DPI: CSS-based theming, but DPI scaling is complex on small screens
- Widgets: Very rich (sliders, buttons, tree views, notebooks)
- Performance: ⭐⭐ — X11/Wayland overhead, not optimized for embedded
- Python ergonomics: ⭐⭐⭐ — GObject patterns leak through; verbose
- Verdict: Desktop toolkit forced onto embedded. Heavy, poor touch UX. Best for desktop companion apps, not the primary mixer UI.
SDL2
- Type: C library, Python via
PySDL2 - RPi support: Framebuffer/KMSDRM backends, no X11 required
- Touch: Raw input events only — no gesture recognition built in
- DPI: None — raw pixels, manual scaling required
- Widgets: None — you build every widget from primitives (rects, lines, text)
- Performance: ⭐⭐⭐⭐ — low-level, fast rendering
- Python ergonomics: ⭐ — no widgets, no layout engine, no theme system. Building a mixer UI in raw SDL2 means writing a UI toolkit from scratch.
- Verdict: Great for games, terrible for complex UIs. Too much boilerplate.
Kivy (selected)
- Type: Python-native UI framework, OpenGL ES 2.0 backend
- RPi support: Native RPi support via
kivy-rpi; framebuffer or X11 backends; works with official 7" and Waveshare displays out of the box - Touch: First-class multi-touch, gesture recognition (swipe, pinch, long-press), mouse fallback for development
- DPI:
dp()andsp()(density-independent pixels/scaled pixels) — automatic scaling across 5" / 7" / desktop displays - Widgets: Sliders, buttons, toggles, labels, layouts, screens, tabbed panels
- Performance: ⭐⭐⭐ — OpenGL-accelerated; 30-60 FPS on RPi 4 for typical mixer UI complexity; GPU handles rendering, CPU free for DSP
- Python ergonomics: ⭐⭐⭐⭐⭐ — Pure Python, declarative KV language or programmatic widget construction; natural fit for the existing Python codebase
- Verdict: Best balance of performance, touch UX, and Python ergonomics. Purpose-built for multi-touch interfaces. DPI-aware by default. Rich widget set plus easy custom widget creation for faders/meters.
Decision: Kivy
| Criterion | LVGL | GTK | SDL2 | Kivy |
|---|---|---|---|---|
| Touch UX | ★★★★ | ★★ | ★ | ★★★★★ |
| Performance | ★★★★★ | ★★ | ★★★★ | ★★★ |
| Python API | ★★ | ★★★ | ★ | ★★★★★ |
| DPI scaling | ★ | ★★★ | ★ | ★★★★★ |
| Widget richness | ★★★ | ★★★★★ | ★ | ★★★★ |
| RPi setup | ★★★★ | ★★ | ★★★ | ★★★★ |
Kivy is the clear winner for a Python-project building a touch-optimized mixer UI on Raspberry Pi. The DPI-aware layout system means the same code works on 5" and 7" displays without manual scaling math. Multi-touch and gestures come free. Custom widgets (faders, meters, knobs) are straightforward to build on Kivy's Canvas primitives.
Installation (RPi)
sudo apt install python3-kivy # system package, includes RPi deps
# or
pip3 install kivy # + manual SDL2/OpenGL deps
Development (desktop)
pip3 install kivy
# Run with: python3 main_touch.py
# Mouse works as touch fallback