This is an old revision of the document!
Directions
Use the jmg/supercollider
branch until it's merged into main.
git checkout jmg/supercollider
Install supercollider
, the alsa utilities, and tcl-udp
through apt.
sudo apt install supercollider alsa-utils tcl-udp
Add yourself to the audio group and reboot.
sudo usermod --group --append audio folk
reboot
Configure jack to use your audio device in folk/virtual-programs/music.folk
. Ignore the tidal error for now (TODO: handle this more gracefully).
- This is a bit more involved.
- Start by running
aplay -L
. - You'll get a huge list of audio device. Try and find one that says something about HD-Audio, being generic, and being analog. You'll want the string that looks like
hw:CARD=Generic_1,DEV=0
and starts withhw
. - Now, go to
virtual-programs/music.folk
and look for the big block of if-elseif checks, and add your own instance- Add a section that looks like this:
[... top of ifs] } elseif {$::thisNode eq "folk-<your node>" } { exec jack_control dps device hw:CARD=Generic_1,DEV=0 exec jack_control dps period 256 } [... rest of ifs]
- It should be set up!
Starting code to make audio:
Wish Supercollider plays sound foo { Pan2.ar(SinOsc.ar(440) * 0.5, 0.0); // This is Supercollider synth code }
Code to play a note when it is wished for:
set noteSemitones [dict create A 0 B 2 C 3 D 5 E 7 F 8 G 10] set modSemitones [dict create "#" 1 b -1 "" 0] When /player/ wishes to play note /note/ { set noteName [string index $note 0] set noteMod [string index $note 1] set noteSt [dict get $noteSemitones $noteName] set modSt [dict get $modSemitones $noteMod] set st [expr { $noteSt + $modSt }] set noteFreq [expr { 440.0 * (2.0 ** ($st / 12.0)) }] Wish $player is labelled "noteFreq is $noteFreq" set soundName note-$player-$note Wish Supercollider sound $soundName attr freq is $noteFreq Wish Supercollider plays sound $soundName { arg freq = 440.0; var envgen; envgen = EnvGen.kr(Env.adsr(sustainLevel: 0.2)); Pan2.ar(SinOsc.ar(freq) * 0.5 * envgen, 0.0); } }
Troubleshooting
May need to kill/restart jackdbus
randomly.
For testing, try running the Supercollider interpreter separately with QT_QPA_PLATFORM=offscreen sclang
.
If you just can't get it working you can run Supercollider as a server on a separate device and connect.
- To do that, start by installing Supercollider on your host device of choice, and write down its IP.
- Now, run the server side using this code:
s.options.protocol = \tcp; // set to use tcp s.options.bindAddress = "0.0.0.0"; // allow connections from any address s.options.maxLogins = 2; // set to correct number of clients s.boot();
- Moving back to the folk side, you'll have to edit
music.folk
- There will be a block labelled
after 500
, put this in there where it says::Music::scExec {
before the rest of that block. o = ServerOptions.new; o.protocol_(\tcp); t = Server.remote(\remote, NetAddr("Host IP Address", 57110), o); // set to correct address and port t.addr.connect; t.startAliveThread( 0 ); t.doWhenBooted({ "remote tcp server started".postln; t.notify; t.initTree }); Server.default = t; s = t;
TODO: add audio debugging page that can be printed?