varheit.de – nichts als die varheit

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

SunVox
Abbildung 1: SunVox

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

Renoise
Abbildung 2: Renoise