Directions

Use the jmg/supercollider folk branch until it's merged into main.

Install supercollider, the alsa utilities, ghc, and tcl-udp through apt.

Add yourself to the audio group and 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).

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 accidentalSemitones [dict create "#" 1 b -1 "" 0]
 
When /player/ wishes to play note /note/ {
    regexp {^([A-Ga-g])([0-9]?)([#b]?)$} $note -> note octave accidental
    set noteSt [dict get $noteSemitones $note]
    set modSt [dict get $accidentalSemitones $accidental]
    set st [expr { $noteSt + $modSt }]
    set noteFreq [expr { 440.0 * (2.0 ** (($octave == "" ? 0 : ($octave - 4)) + $st / 12.0)) }]
    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.1));
        Pan2.ar(Saw.ar(freq) * 0.5 * envgen, 0.0);
    }
 
    When the clock time is /t/ {
        When /nobody/ claims $soundName has start time /startTime/ {
            Hold $soundName { Claim $soundName has start time $t }
        }
        When $player has region /r/ & $soundName has start time /startTime/ {
            # set radius [expr { max([region width $r], [region height $r])/2 + 10 }]
            set radius [expr { ($t - $startTime) * 500 }]
            Wish $player draws a circle with radius $radius color red
        }
    }
    On unmatch { Hold $soundName { } }
}

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.

TODO: add audio debugging page that can be printed?