# VA-Control for Linux Nativer Linux-Port der **Voice Acoustic VA-Remotecontrol** (technisch = *AllDSP „AllControl" DSP-Software*) zur Fernsteuerung/Konfiguration der DSP-Verstärker (HDSP-Serie, Paveosub-…sp, Venia-…sp, PAV115sp …). **Kein Wine. Kein dekompilierter App-Code.** Es läuft das **unveränderte, originale Python-2.7-Bytecode aus dem macOS-`.app`** direkt auf einem Linux-CPython-2.7 mit nativem wxGTK/numpy/scipy. ![Native GUI unter Linux](screenshot-native.png) ## Warum dieser Weg CPython-**Bytecode ist plattformunabhängig** — er hängt nur an der Python-*Version* (2.7), nicht am Betriebssystem. Das macOS-Bundle liefert die App-Module (`one_unit`, `child_unit`, …) als originale `.pyc`. Die laufen unter Linux direkt weiter; nur die C-Extensions (wxWidgets, numpy, scipy, PortAudio) kommen nativ aus dem Distro. Das umgeht beide Sackgassen der bisherigen Versuche: - **Wine** rendert die App nur als schwarzes Fenster (wxWidgets/`CreateActCtx`-Probleme). - Ein **dekompilierter** Port scheiterte, weil `one_unit`/`child_unit` (Py2.6-Bytecode) sich nicht sauber dekompilieren lassen — und geratener Code, der echte Limiter/Verstärker steuert, ist ein No-Go. Hier läuft **korrektes Original-Bytecode**, kein Rateanteil. ## Voraussetzungen - Docker (oder Podman) - Ein X11-/Wayland-Desktop (für die GUI) - Zugang zu `archive.debian.org` beim Build (Debian stretch ist EOL) ## Build ```bash docker build -t va-remotecontrol:native-mac . ``` Das Image basiert auf **Debian stretch** (letzte Distribution mit `python-wxgtk3.0` für Python 2) und installiert wxGTK 3.0, numpy, scipy, pyserial, pyaudio, PIL aus dem Archiv. ## Start ```bash ./run.sh # GUI + Ethernet-Amps (Host-Netz) SERIAL_DEV=/dev/ttyUSB0 ./run.sh # zusätzlich seriell/COM NET=bridge ./run.sh # ohne Host-Netz (keine LAN-Amps) ``` `run.sh` gibt das Host-X11 frei, setzt `--ipc=host` (gegen X-SHM-Fehler unter XWayland) und reicht optional den seriellen Port durch. ## Verbindung zu den Verstärkern Die App spricht die DSPs über **Ethernet** oder **seriellen COM-Port** an: - **Ethernet (empfohlen):** `run.sh` nutzt `--network host`, d. h. das Container erreicht dein LAN direkt (auch UDP-Discovery/Broadcast). In der App die Netzwerk-/Ethernet-Verbindung wählen. - **USB/seriell:** Die USB-Auto-Erkennung nutzt Windows-WMI (auf Linux gestubbt → leer). Gerät als COM-Port durchreichen (`SERIAL_DEV=/dev/ttyUSB0`) und in der App den Port **manuell** wählen. ## Die Linux-Fixes (in `va/launch.py`, non-invasiv — kein Bytecode-Patch) Der Start läuft über `va/launch.py` statt über den macOS-py2app-Bootstrap. Dort sitzen drei kleine Kompatibilitäts-Fixes, weil die App Linux (`os.name='posix'`) wie einen **Mac** behandelt (`mac_names='posix'`): 1. **`platform.version()`** beginnt unter Linux mit `#…` → `int('#')` in einer Windows- Versionsprüfung crasht (und deaktiviert dabei RTA). Wird auf einen Windows-artigen String gemappt. 2. **wx-Assertions → `SUPPRESS`**: diese wxGTK-Build wirft C++-Assertions als Python-Exceptions; sonst crasht wxPythons eigenes `flatmenu`. Auf Release-/Mac-wx sind sie unterdrückt. 3. **`my_MenuBar.left_down`**: wird nur im Nicht-Mac-Zweig gesetzt → Klassen-Default ergänzt. ## Bekannte Punkte - **Fader lassen sich nicht ziehen?** Die SVG-Regler haben einen Mac- und einen Windows- Koordinatenpfad; Linux nimmt fälschlich den Mac-Pfad (Y gespiegelt/versetzt). **Experimentell:** mit `VA_SVG_WINPATH=1 ./run.sh` erzwingt man den Windows-Pfad. Siehe `STATUS.md`. - **RTA-Messung (Mikrofon)** braucht Audio-Durchreichung (ALSA/Pulse) in den Container. - **`img.cache`** (vor-gerenderte Button-/Status-Bitmaps der Control-Panels, ~378 MB) ist **notwendige Laufzeitdaten** und im Repo enthalten — es gibt keine PNG-Quellen, aus denen sie regeneriert werden könnten. Fehlen sie, meldet die App `Failed to get image …`. ## Aufbau ``` va/ Lauffähiger App-Baum: Original-macOS-.pyc + pure-Python-Libs + Assets launch.py Start-Wrapper mit den Linux-Fixes one_unit.pyc … App-Module (Original-Bytecode, Python 2.7) win32*.py … Linux-Stubs für die wenigen Windows-APIs skins/ dfi/ … SVG-Bedienpanels, Geräte-Layouts, Factory-Presets, Sprachen Dockerfile Debian stretch + wxGTK3.0/numpy/scipy/… via archive.debian.org run.sh Start mit X11 + Netz + optional seriell entrypoint.sh Container-Entrypoint reference/ Dekompilierter Quellcode (nur zum Lesen/Debuggen) + ARCHITEKTUR.md ``` ## Herkunft Der `va/`-Baum stammt aus `Voice Acoustic VA-Remotecontrol.app` (macOS, Version 4.0.1, py2app, Python 2.7.10, wxPython 3.0.3). Nur die reinen `.pyc` (App + pure-Python-Libs) wurden übernommen; die macOS-`.so`/`.dylib` wurden weggelassen und durch native Linux-Builds ersetzt. `reference/decompiled/` enthält den aus dem **Windows**-Build (Py2.6) dekompilierten Quellcode — funktional dieselbe App, unverzichtbar zum Debuggen der `.pyc` (z. B. der Fader-Analyse oben).