maikandClaude Opus 4.8 a7c93fa266 Erster Commit: nativer Linux-Port aus macOS-Bytecode
Läuft die Voice Acoustic VA-Remotecontrol (AllDSP AllControl) nativ unter Linux
auf echtem wxGTK 3.0 — ohne Wine und ohne dekompilierten App-Code. Ausgeführt wird
das unveränderte Python-2.7-Bytecode aus dem macOS-.app; C-Extensions (wxGTK/numpy/
scipy/PortAudio) kommen nativ aus Debian stretch.

Enthält: va/ (Original-.pyc + pure-Python-Libs + Assets + launch.py mit den drei
Linux-Fixes), Dockerfile/run.sh/entrypoint.sh, reference/ (dekompilierter Quellcode
zum Debuggen) und README/STATUS. img.cache (378 MB, regenerierbar) ist per
.gitignore ausgeschlossen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 19:57:01 +02:00

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

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

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

./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 Skin-Bitmaps) ist nicht im Repo — die App rendert aus den vorhandenen SVGs und baut den Cache bei Bedarf neu (siehe .gitignore).

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).

S
Description
Voice Acoustic VA-Control als Docker Nativ unter Linux
Readme
16 MiB
Languages
Python 96.3%
HTML 3.5%