I started using a Bela board. It works with a series of programming languages, including SuperCollider. But I’d rather use Lisp through cl-collider, which is unsupported. I spent way more time than I’d like to admit trying to get this to work, but I finally did it! For my reference and for the improbable benefit of anyone else playing with this, here’s how to set things up.
We need an ARM 32-bit implementation. SBCL has a port, but it doesn’t support threads. Use CCL. Following the instructions for the current release, download both the source code and the bootstrapping binaries for linuxarm
, copy them over to Bela, unpack, launch the CCL image and run (rebuild-ccl :full t)
.
osc
To avoid compile errors in CCL use my fork of the osc
library. Clone it to local-projects
on the host machine.
On the host machine, create a Quicklisp bundle for cl-collider
.
bela.lisp
with the following contents:(require "cl-collider") (in-package :ccl) (advise ccl::resolve-address (let ((arglist (list* :address-family :internet arglist))) (:do-it)) :when :around :name :internet) (in-package :sc) ;;; the following are needed for working with the Trill UGens at https://github.com/jreus/Trill_SC (defugen (trill-raw "TrillRaw") (&key (i2c-bus 1) (i2c-address #x20) (noise-threshold 0) (pre-scaler 2) (reset-baseline 0.0)) ((:kr (multinew new 'multiout-ugen 11 i2c-bus i2c-address noise-threshold pre-scaler reset-baseline)))) (defugen (trill-centroids "TrillCentroids") (&key (i2c-bus 1) (i2c-address #x20) (noise-threshold 0) (pre-scaler 2) (reset-baseline 0.0)) ((:kr (multinew new 'multiout-ugen 11 i2c-bus i2c-address noise-threshold pre-scaler reset-baseline)))) (in-package :sc-user) (setf *s* (make-external-server "bela" :port 5000 :server-options (make-server-options :block-size 16))) (unless (boot-p *s*) (loop :initially (server-boot *s*) :with start := (get-universal-time) :do (sleep 1) :until (or (boot-p *s*) (> (get-universal-time) (+ start 10)))))
For example:
scp /path-to-bundle-and-file/ [email protected]:~/bela-lisp/
armcl --load "bundle" --load "bela" -S 8000000 -Z 8000000
This will hopefully leave you at the repl with the server booted and ready to play.
Create a systemd
process (that runs the above command, or alternatively that loads a prebuilt image) and enable
it—follow this guide.
It’s possible to connect to a scsynth
server running on Bela. From the host use the following:
(setf *s* (make-external-server "bela" :port 5000 :just-connect-p t))
For a more sophisticated option, it’s also possible to use swank
or slynk
to connect to the running lisp instance on Bela.