Hoofdstuk 5 Open Sound Control

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.

5.1 OSC ontvangen in Supercollider

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;

5.2 localhost

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.

5.3 OSC ontvangen

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.

5.4 OSC commando's gebruiken

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!