User Tools

Site Tools


supercollider

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
supercollider [2024/09/15 17:50] – created discordsupercollider [2025/03/05 19:10] (current) smj-edison
Line 1: Line 1:
 ====== Directions ====== ====== Directions ======
  
-Use the ''jmg/supercollider'' branch until it's merged into main.+Use the ''jmg/supercollider'' folk branch until it's merged into main.
  
-Install supercollider through apt. Configure jack to use your audio device in ''folk/virtual-programs/music.folk''.+  * ''git checkout jmg/supercollider'' 
 + 
 +Install ''supercollider'', the alsa utilities, ''ghc'', and ''tcl-udp'' through apt.  
 + 
 +  * ''sudo apt install supercollider alsa-utils tcl-udp ghc'' 
 + 
 +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. 
 +  * Run this command: 
 +    * <file bash>aplay -L | grep -E 'hw:CARD=.*,DEV=0' | sed -n 's/^\(hw:CARD=.*,DEV=0\).*$/\1/p'</file> 
 +     * Or, manually: 
 +       * 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 with ''hw''
 +    * 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: 
 +    * <file tcl> 
 +[... 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] 
 +</file> 
 +  * Install the SuperDirt library by running <file bash>echo 'include("SuperDirt");' | QT_QPA_PLATFORM=offscreen sclang</file> 
 +  * It should be set up! 
 + 
 +Starting code to make audio: 
 + 
 +<file tcl> 
 +Wish Supercollider plays sound foo { 
 +    Pan2.ar(SinOsc.ar(440) * 0.5, 0.0); // This is Supercollider synth code 
 +
 +</file> 
 + 
 +Code to play a note when it is wished for: 
 +<file tcl> 
 +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 { } } 
 +
 +</file> 
 + 
 +===== 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: 
 +  * <file> 
 +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(); 
 +</file> 
 +  * 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. 
 +  * <file> 
 +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; 
 +</file> 
 + 
 +TODO: add audio debugging page that can be printed?
supercollider.1726422625.txt.gz · Last modified: 2024/09/15 17:50 by discord

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki