OSC


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.

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(9001);

Als het goed is zie je in de console met het volgende commando jouw port in het lijstje staan:

thisProcess.openPorts;

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 9001 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

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.

~mijnOscFunctie //of zoiets.

De volgende funtie laat zien wat hij ontvangt maar doet er verder niks mee.

~mijnOscFunctie = OSCFunc({ arg msg, time, addr, recvPort; 
    [msg, time, addr, recvPort].postln; 
}, '/freq');

Als je klaar bent met o dan kun je die weer opruimen:

~mijnOscFunctie.free;

Voordat je verder gaat is het aan te raden om eerst een OSC client (in Max/JS bijvoorbeeld) te maken die berichten naar je Supercollider-server stuurt zodat je weet dat er iets binnenkomt.

Stuur vanuit Max bijvoorbeeld /freq 1 4 en kijk wat er in de postwindow in SuperCollider verschijnt.

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;

~synth_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:

~mijnOscFunctie = OSCFunc({ arg msg;
    a.set(\freq, msg[1]); 
    a.set(\mul, msg[2]); 
}, '/freq');

Opruimen:

~mijnOscFunctie.free; // dit doe je pas als je er helemaal klaar mee bent ;-)

OSC versturen vanuit SuperCollider

Om data vanuit SuperCollider d.m.v. OSC te versturen maak je gebruik van een NetAddress. Dit is een functie die een UDP-verbinding opzet en je vervolgens de mogelijkheid geeft om via die verbinding data te versturen.

Aanmaken

Met de volgende code maak je een netAddress aan: ~sender = NetAddr.new("127.0.0.1", 9002);

Versturen

Met de volgende code verstuur je data: ~sender.sendMsg("/test",1,2,3);