/ Linux

Sonic Pi (Jack) über Pulseaudio

Hallo,
Sonic Pi ist ein Synthesizer den man durch einfachen Code programmieren kann. Dieser wurde ursprünglich für den Raspberry Pi entwickelt und ist damit auf die Hardware von diesem abgestimmt. Seit Debian 9 gibt es Sonic Pi auch in Debian und soll auf den Lernstick installiert werden.
Leider hat der Backend SuperCollider keinen Support für Pulseaudio was der Standard Audio-Daemon in den meisten Linux Distributionen ist.
Das Problem ist bekannt, aber eine saubere Lösung ist schwer, da ein neuer Audio-Backend in Sonic Pi oder SuperCollider integriert werden müsste.
Der andere Grund ist, dass man wenn man mit Audio arbeitet die Latenz möglichst niedrig gehalten werden soll, dafür ist Pulseaudio einfach nicht ausgelegt. Stattdessen verwendet man Jack, was geringe Latenzen gewährleistet, dafür aber für den Standard Benutzer nicht so einfach zu benutzen ist.

Lösung

Jetzt wo wir wissen das eine saubere Lösung viel zu Aufwendig ist, versuchen wir es mit einer anderen.
ALSA (Advanced Linux Sound Architecture) bietet die Möglichkeit ein Loopback Interface zu erstellen, d.h. wir können eine Virtuelle Soundkarte haben, die wir für Sonic Pi verwenden ohne das wir mit anderen Soundkarten, die von Pulseaudio benutzt werden, in die Quere kommen.
Dadurch entstand bei mir folgende Idee:
Sonic Pi -> Jackd -> Alsa Loopback -> Pulseaudio

Das lässt sich auch relativ einfach realisieren.

Als erstes müssen wir unser Loopback Interface erstellen, dabei gebe ich es den Karten Index 10, damit wir keine Probleme mit unseren normalen Soundkarten bekommen und wir unsere wiederfinden. Die PCM Substreams sind auf 1, da wir nicht mehr brauchen.

sudo modprobe snd-aloop index=10 pcm_substreams=1

Nachdem nun das Interface da ist, kann Jack gestartet werden. Dabei starten wir Jack nur mit unserem Interface (hw:10).

jackd -d alsa -d hw:10

Nun kommt der Teil der eine Latenz in die Sache bringt: die Wiedergabe des Interfaces über Pulseaudio.
Wenn jemand eine bessere Lösung findet, bitte melden.

arecord -D plughw:10,1 -r 48000 -f FLOAT_LE -c 2  | aplay -

Nun sollte alles was über Jack läuft via aplay wiedergeben werden.
Jetzt kann Sonic Pi gestartet werden und sollte nun funktionieren.

Ich habe das Ganze auch noch in ein kleines Skript verpackt, damit man sich nicht jeden Schritt jedes mal merken muss.

#!/bin/sh

sudo modprobe snd-aloop index=10 pcm_substreams=1 || true
jackd -d alsa -d hw:10 &
sleep 3
arecord -D plughw:10,1 -r 48000 -f FLOAT_LE -c 2  | aplay - &
sonic-pi
killall -9 jackd
killall -9 arecord

Fazit

ALSA bietet ziemlich viele Möglichkeiten mit Audio unter Linux zuarbeiten und diese Lösung ist nur einfache. Bestimmt lässt sich mit besseren Kenntnissen eine saubere Lösung finden. Dennoch hat der kleine Ausflug in die Audiosysteme Spaß gemacht und hoffe damit geholfen zu haben.

THS