Phase 1-4: Audio stack, mixer engine, MIDI, and network API
Lint & Validate / lint (push) Has been cancelled
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)
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# 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 `lvgl` package
|
||||
- **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()` and `sp()` (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)
|
||||
```bash
|
||||
sudo apt install python3-kivy # system package, includes RPi deps
|
||||
# or
|
||||
pip3 install kivy # + manual SDL2/OpenGL deps
|
||||
```
|
||||
|
||||
### Development (desktop)
|
||||
```bash
|
||||
pip3 install kivy
|
||||
# Run with: python3 main_touch.py
|
||||
# Mouse works as touch fallback
|
||||
```
|
||||
Reference in New Issue
Block a user