I was curious if it was possible to use an Expert Sleepers ES-8 as a soundcard for Norns and as it turns out it appears to work with only a few changes necessary, but will need some development to really make use of the ES-8.
It’s an exciting idea to me, having something like FM7 modulated by and being output to multiple channels into the modular sounds potentially really fun!
Digging into Norns I found a systemd unit file that manages jack at
/etc/systemd/system/norns-jack.service
with the startup command:
/usr/bin/jackd -R -P 95 -d alsa -d hw:0 -r 48000 -n 3 -p 128 -S -s
After a bit of googling I found what looks to be a simple way to tell jack to start up and connect to an ES8:
/usr/bin/jackd -R -P 95 -d alsa -d hw:ES8,0 -r 48000 -n 3 -p 128 -S -s
So I edited the startup command and restarted norns.
I don’t know much about jack
yet, but after a bit of googling I found the command:
jack_lsp
This will list the in/out ports known to jack
, and if we pass the flag -c
it will show the connections that are configured:
Normally:
192.168.99.171 ~ $ jack_lsp -c
system:capture_1
crone:input_1
system:capture_2
crone:input_2
system:playback_1
crone:output_1
system:playback_2
crone:output_2
crone:input_1
system:capture_1
crone:input_2
system:capture_2
crone:input_3
softcut:output_1
crone:input_4
softcut:output_2
crone:input_5
SuperCollider:out_1
crone:input_6
SuperCollider:out_2
crone:output_1
system:playback_1
crone:output_2
system:playback_2
crone:output_3
softcut:input_1
crone:output_4
softcut:input_2
crone:output_5
SuperCollider:in_1
crone:output_6
SuperCollider:in_2
softcut:input_1
crone:output_3
softcut:input_2
crone:output_4
softcut:output_1
crone:input_3
softcut:output_2
crone:input_4
SuperCollider:in_1
crone:output_5
SuperCollider:in_2
crone:output_6
SuperCollider:out_1
crone:input_5
SuperCollider:out_2
crone:input_6
We can see that system:capture_1,2
and system:playback_1,2
are mapped to crone ins and outs normally.
After starting jack with ES8:
system:capture_1
crone:input_1
system:capture_2
crone:input_2
system:capture_3
system:capture_4
system:capture_5
system:capture_6
system:capture_7
system:capture_8
system:capture_9
system:capture_10
system:capture_11
system:capture_12
system:playback_1
crone:output_1
system:playback_2
crone:output_2
system:playback_3
system:playback_4
system:playback_5
system:playback_6
system:playback_7
system:playback_8
system:playback_9
system:playback_10
system:playback_11
system:playback_12
system:playback_13
system:playback_14
system:playback_15
system:playback_16
crone:input_1
system:capture_1
crone:input_2
system:capture_2
crone:input_3
softcut:output_1
crone:input_4
softcut:output_2
crone:input_5
SuperCollider:out_1
crone:input_6
SuperCollider:out_2
crone:output_1
system:playback_1
crone:output_2
system:playback_2
crone:output_3
softcut:input_1
crone:output_4
softcut:input_2
crone:output_5
SuperCollider:in_1
crone:output_6
SuperCollider:in_2
softcut:input_1
crone:output_3
softcut:input_2
crone:output_4
softcut:output_1
crone:input_3
softcut:output_2
crone:input_4
SuperCollider:in_1
crone:output_5
SuperCollider:in_2
crone:output_6
SuperCollider:out_1
crone:input_5
SuperCollider:out_2
crone:input_6
It’s a lot more output, but to summarize: crone still starts up and maps the first two device inputs and the first two device outputs
So I started Awake, made sure the output was set to audio and… it works!
The output levels were really hot, so they probably need some trimming, and I found some settings in /etc/systemd/system/norns-init.service
that may indicate a way of configuring this (though that assumes some similarity between the ES8 and the Norns soundcard).
Inputs seem to work as well, but I noticed a lot of lag but I suspect that was due to how the input was being processed… I know almost nothing about tape/softcut and the internal routing at the moment.
Next steps I think will be to modify Crone so that it creates a set of jack clients* and makes them available to Supercollider to noodle around with it some more, then if that all still works look at expanding the crone mixer to include the extra I/O. Ideally, Crone would be able to detect the device type, and if it’s an ES-8 then configure the jack environment accordingly.
Looking at the command running scsynth
I think I’ll need to modify that as well, it appears it’s passed some flags setting input and output ports to 2 each
scsynth -u 57110 -a 1024 -i 2 -o 2 -b 1026 -R 0 -C 0 -l 1
*is Client the right term here? Need to do some more reading.