Die Stimme der Sonne: SunVox auf OpenBSD
2026-06-17-18-01 (audio, ALSA, sndio, OpenBSD)
SunVox [4] ist ein modularer Synthesizer kombiniert mit einer rasterbasierten Ablaufsteuerung (auch als „Tracker“ bekannt). Das Programm läuft auf so ziemlich jedem Betriebssystem -- aber leider gehört OpenBSD nicht dazu. Mit gewissen Einschränkungen und etwas Mogelei läßt sich SunVox aber auch hier nutzen, indem man eine virtuelle Linuxmaschine aufsetzt, dort SunVox installiert und Graphik- sowie Tonausgabe auf den Wirtsrechner weiterleitet. Wider Erwarten ist das Programm (je nach Rechner) trotz dieses komplexen Prozederes durchaus benutzbar. Die gewisse Einschränkung: Die Tonaufnahme funktioniert aktuell leider nicht.
Die technische Umsetzung basiert auf dem Modul alsa-sndio [2], das die Tonausgabe über ALSA [1] nach sndio [3] und von dort über das Netzwerk umleitet.
Vorbereitungen
Wie üblich bei OpenBSD ist auch die Virtualisierung vorbildlich in den „Manual Pages“ und den häufig gestellten Fragen [5] dokumentiert. Ich beschränke mich im folgenden auf die notwendigen Fragmente. Der Rechner muß grundsätzlich in der Lage sein, virtuelle Maschinen ausführen zu können. Herausfinden kann man die vorhandene Unterstützung mit folgendem Kommando:
dmesg | egrep '(VMX/EPT|SVM/RVI)'
In meinem Fall erhalte ich folgende vielversprechende Ausgabe:
vmm0 at mainbus0: SVM/RVI
Für den bedauerlichen Fall, daß man keine Ausgabe erhält, kann man das Vorhaben an dieser Stelle abbrechen und sich mit der Blockflöte vergnügen. Andernfalls sollte der Dienst vmd [7] aktiviert und gestartet werden:
rcctl enable vmd rcctl start vmd
Die virtuelle Maschine braucht Netzwerkzugriff: Zum einen für die Installation und später für die gewünschte Umleitung. Es gibt verschiedene Möglichkeiten, das Netzwerk einzurichten. In diesem Beispiel verwende ich die „lokale“ Variante (-L [9]). Damit das Gastsystem auf das Internet und den Wirtsrechner zugreifen kann, sind wie in vmctl [8] beschrieben zwei Regeln zur Firewall einzufügen, wobei „$dns_server“ durch den lokalen DNS oder einen allgemeinen wie „8.8.8.8“ zu ersetzen ist.
cat <<EOT >>/etc/pf.conf
pass out on egress from 100.64.0.0/10 to any nat-to (egress)
pass in proto { udp tcp } from 100.64.0.0/10 to any port domain \
rdr-to $dns_server port domain
EOT
Darüberhinaus muß IP-Forwarding aktiviert werden:
echo "net.inet.ip.forwarding=1" >>/etc/sysctl.conf
Der Wirtsrechner muss Audio-Verbindungen über das Netzwerk akzeptieren. Dazu muss in /etc/rc.conf.local der Abschnitt sndiod_flags angelegt oder folgende Option hinzugefügt werden:
sndiod_flags="-L -"
Die Änderungen müssen nun nur noch aktiviert werden:
pfctl -f /etc/pf.conf sysctl -f /etc/sysctl.conf rcctl restart sndiod
Bereitstellen der virtuellen Linuxmaschine
In diesem Beispiel verwende ich Debian-Linux [6] als Basis, andere Linux-Distributionen sollten aber ebenfalls ohne Probleme funktionieren. Zuerst sollte ein ISO-Abbild für die Installation heruntergeladen werden. Es genügt grundsätzlich die deutlich kleinere Servervariante. Jetzt kann eine virtuelle Festplatte erstellt und die Installation gestartet werden:
vmctl create -s 50G debian.qcow2 vmctl start -c -d debian.qcow2 -i 1 -L -m 4G -r ISO-Abbild.iso debian
Der Installer muß gleich zu Beginn noch überredet werden, seine Ausgabe auf die virtuelle Konsole umzuleiten. Dazu muß im Installationsmenü die Taste Tab gedrückt und folgender Paramenter zum Aufruf hinzugefügt werden:
console=ttyS0,115200n8
Jetzt kann die Installation Schritt für Schritt durchlaufen werden. Es empfiehlt sich, gegen Ende der Installation die Desktop-Umgebung sowie Gnome abzuwählen, da die hier beschriebene Lösung keine graphische Schreibtischumgebung im Gastsystem erfordert. Der SSH-Server sollte auf jeden Fall angewählt werden.
Nach erfolgreicher Installation empfiehlt es sich, auf dem Wirtsrechner eine Konfiguration für die virtuelle Maschine in /etc/vm.conf anzulegen, damit sie beim Starten des Wirtsrechners automatisch mitgestartet wird.
vm "debian" {
enable
disk Pfad-zum-Festplattenabbild.qcow2
local interfaces 1
memory 4G
owner Dein-Login:wheel
}
Wenn dies die einzige bzw. erste virtuelle Maschine auf dem Wirtsrechner ist, wird sie in dieser Konfiguration beim Starten die IP-Adresse 100.64.1.3 erhalten.
Bereitstellen des Fundamentes
In der virtuellen Maschine müssen einige Pakete installiert werden, bevor das Modul alsa-sndio [2] gebaut und installiert werden kann.
apt install alsa-utils gcc git libasound2-dev libgl1 libsndio-dev make pkg-config unzip git clone https://github.com/Duncaen/alsa-sndio cd alsa-sndio make cp libasound_module_pcm_sndio.so /usr/lib/x86_64-linux-gnu/alsa-lib/
Bisher hat die virtuelle Maschine keinerlei Möglichkeit der Tonausgabe. Was liegt näher, als der virtuellen Maschine eine virtuelle Soundkarte zu verpassen:
echo "snd_aloop" >>/etc/modules-load.d/modules.conf
Im Heimatverzeichnis des während der Installation erstellten Nutzers (im folgenden als hugo angenommen) wird abschließend die Umleitung von ALSA auf sndio definiert.
cat <<EOT >~hugo/.asoundrc
pcm.!default {
type sndio
}
EOT
Aus dem Heimatverzeichnis des Nutzers des Wirtsrechners, der SunVox starten können soll, muß noch das sndio-Cookie auf die virtuelle Maschine kopiert werden.
cd $HOME scp -R .sndio hugo@100.64.1.3:
Schlußendlich muß Sunvox heruntergeladen und praktischerweise in hugos Verzeichnis entpackt werden. Damit sind alle einmalig notwendigen Vorarbeiten abgeschlossen. Zeit für einen Neustart der virtuellen Maschine und ein Glas Wein. Lassen wir die Stimme der Sonne ertönen.
Die Sonne spricht
Auf dem Wirtsrechner starten wir nun SunVox
ssh -Y hugo@100.64.1.3 AUDIODEVICE=snd@100.64.1.2/0 /home/hugo/sunvox/sunvox/linux_x86_64/sunvox_opengl
Ausblick
Selbstverständlich lassen sich auch andere Audioprogramme unter Linux auf diese Weise nutzen. Ein weiterer interessanter Tracker (Renoise) läuft ebenfalls, hat aber mehr mit Verzögerungen der Graphikausgabe zu kämpfen. Falls der Dienst apmd läuft, ist nach Aufruf von „apm -H“ eine Beschleunigung zu erreichen. Die Tonausgabe ist allerdings generell flüssig. Hier ist für die X11-Weiterleitung die ssh-Option „-X“ statt „-Y“ zu verwenden:
ssh -X hugo@100.64.1.3 AUDIODEVICE=snd@100.64.1.2/0 /usr/local/bin/renoise