User Tools

Site Tools


supercollider

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
supercollider [2024/09/15 18:53] 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'' and ''tcl-udp'' through apt. Configure jack to use your audio device in ''folk/virtual-programs/music.folk''. Ignore the tidal error for now (TODO: handle this more gracefully).+  * ''git checkout jmg/supercollider''
  
-Add yourself to the audio group.+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: Starting code to make audio:
Line 17: Line 45:
 Code to play a note when it is wished for: Code to play a note when it is wished for:
 <file tcl> <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/ { When /player/ wishes to play note /note/ {
-    set noteAscii [scan $note %c+    regexp {^([A-Ga-g])([0-9]?)([#b]?)$} $note -> note octave accidental 
-    set noteIdx [expr { $noteAscii - 0x41 }] +    set noteSt [dict get $noteSemitones $note] 
-    set noteFreq [expr { 440.0 * (2.0 ** ($noteIdx / 12.0)) }] +    set modSt [dict get $accidentalSemitones $accidental] 
-    Wish $player is labelled "noteFreq is $noteFreq"+    set st [expr { $noteSt + $modSt }] 
 +    set noteFreq [expr { 440.0 * (2.0 ** (($octave == "" ? 0 : ($octave - 4)) + $st / 12.0)) }]
     set soundName note-$player-$note     set soundName note-$player-$note
     Wish Supercollider sound $soundName attr freq is $noteFreq     Wish Supercollider sound $soundName attr freq is $noteFreq
-    Wish Supercollider plays sound note-$player-$note {+    Wish Supercollider plays sound $soundName {
         arg freq = 440.0;         arg freq = 440.0;
         var envgen;         var envgen;
-        envgen = EnvGen.kr(Env.adsr(sustainLevel: 0.2)); +        envgen = EnvGen.kr(Env.adsr(sustainLevel: 0.1)); 
-        Pan2.ar(SinOsc.ar(freq) * 0.5 * envgen, 0.0);+        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> </file>
 +
 +===== Troubleshooting =====
 +
  
 May need to kill/restart ''jackdbus'' randomly. May need to kill/restart ''jackdbus'' randomly.
  
 For testing, try running the Supercollider interpreter separately with ''QT_QPA_PLATFORM=offscreen sclang''. 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.1726426434.txt.gz · Last modified: 2024/09/15 18:53 by discord

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki