Supercollider programmeren en besturen vanuit zijn (of haar) eigen interface SCLang is handig voor het ontdekken van het systeem, voor het doen van experimenten, voor live coding en voor het opbouwen van programma's. Soms wil je echter een setup vanuit andere programma's of met externe hardware besturen. MIDI is een mogelijkheid: met een MIDI controller of keyboard bijvoorbeeld. Een andere mogelijkheid is OSC, waarbij je het protocol helemaal zelf kunt vastleggen en niet gebonden bent aan één server.
Supercollider is een client/server systeem. De client is hier de
Supercollider interface (SCLang) waarin we meestal werken. De server of
servers maken geluid. Het is de server waar we OSC-commands naartoe sturen.
Dat doe je vanuit SCLang met set
bijvoorbeeld zo:
a.set(\freq, 800);
Maar vanuit andere programma's (Max, PD, NodeJS, Python, C++) kunnen we ook OSC-berichten naar de server sturen. We moeten dan weten:
Begin met het aangeven naar welke poort je server luistert:
thisProcess.openUDPPort(7777);
Als het goed is zie je in de console met het volgende commando jouw port in het lijstje staan:
thisProcess.openPorts;
Als het programma dat OSC-berichten naar de server stuurt op dezelfde
computer draait als de server dan kan het als OSC-client werken en
berichten sturen naar localhost
(of 127.0.0.1) op port 7777
die we net in
de Supercollider-server hebben geopend. Als je vanuit een andere computer
komt moet je het IP-adres gebruiken van de computer waarop jouw
Supercolliderr-server draait.
OSC ontvangen doen we door in SCLang een functie OSCFunc te maken. Je kunt
deze het beste toekennen aan een variabele zodat je hem later weer kunt
vrijgeven. Hieronder is variabele o
gebruikt. Als je een variabele met
meerdere letters wilt gebruiken (zeer aan te raden!) gebruik dan een tilde:
~mijnOscFunctie of zoiets.
De volgende funtie laat zien wat hij ontvangt maar doet er verder niks mee.
o = OSCFunc({ arg msg,time,addr,recvPort; [msg,time,addr,recvPort].postln; }, '/freq');
Als je klaar bent met o dan kun je die weer opruimen:
o.free;
Voordat je verder gaat is het aan te raden om eerst een OSC client (in Max/PD bijvoorbeeld) te maken die berichten naar je Supercollider-server stuurt zodat je weet dat er iets binnenkomt.
Gegeven een eenvoudige SynthDef "mySine" waarmee we een synth a maken:
SynthDef("mySine", {|freq=400,mul=0.1| Out.ar(0, SinOsc.ar(freq,0,mul))}).add; a=Synth("mySine",[\freq, 440]);
Vanuit SCLang kun je de parameters freq en mul aanpassen:
a.set(\freq, 800); a.set(\mul, 0.1);
Als we een functie maken die OSC ontvangt en deze set-functies gebruikt dan kunnen we OSC-berichten gebruiken om parameters van de Synth aan te passen:
p = OSCFunc({ arg msg; a.set(\freq,msg[1]); a.set(\mul,msg[2]) }, '/freq');
Opruimen:
p.free; // dit doe je pas als je er helemaal klaar mee bent ;-)
Als dit werkt kun je bijvoorbeeld een motion sensor op een Teensy aansluiten en via een OSC-client (in Max/PD/Python/C++) data laten doorsturen naar Supercollider. Veel plezier!