8: SuperCollider - Midi & OSC


Zie hieronder de presentatie uit de les:
SuperCollider-les-3.pdf

En hieronder de code uit de les:

s.boot;

//maak verbinding met alle MIDI-devices 
//aangsloten op je computer
MIDIIn.connectAll;

//wil je ÊÊn specifiek device selecteren:
//check welke devices er zijn:
MIDIClient.init;
MIDIClient.sources
// een kies er een:
MIDIIn.connect(0,MIDIClient.sources.at(0));

//een synthdef om een noot af te spelen met 
//een adsr-envelope. Voor verdere uitleg over SynthDef
//zie de vorige les.
(
SynthDef(\naam,{ |freq=220,amp=0.5,gate|
  var sig, env;
  env = EnvGen.ar(Env.adsr(sustainLevel:amp),gate);
  sig = SinOsc.ar([freq,freq+1],0,env);
  sig = FreeVerb.ar(sig);
  DetectSilence.ar(sig,doneAction:2);
  Out.ar(0,sig/3);
}).add;
)

//maak een array om noten in op te slaan
//zodat je de envelope aan- en uit kan zetten
~poly = Array.fill(128,0);

//maak de functies voor note-on, en note-off
//zorg dat je ook ~variabelenaam.free
//doet zodat de functies niet opstapelen.

(
~midiNoot.free;
//de velocity- en note-info komt binnen als 1e en 2e argument
//die noemen we nu vel en pitch.
~midiNoot = MIDIFunc.noteOn({|vel,pitch|
  //voeg op element `pitch` van de array een synth toe
  ~poly.put(pitch,
    //midicsp (midi > cycles/second) zet midi om naar hz
    //vel/127 om een amplitude van 0.-1. te krijgen
    Synth(\naam,[\gate,1,\freq,pitch.midicps,\amp,vel/127])
  );
});
~midiNootUit.free;
~midiNootUit = MIDIFunc.noteOff({|vel,pitch|
  //zet de gate op element `pitch` op 0
  ~poly[pitch].set(\gate,0);

});
)

//dan OSC
//een andere synth, met percussieve envelope.
//Daar hoef je niet bij te houden wat de status 
//van de envelope is
(
SynthDef(\naamOsc,{ |freq=220,amp=0.5,gate|
  var sig, env;
  env = EnvGen.ar(Env.perc(level:amp),gate);
  sig = SinOsc.ar([freq,freq+1],0,env);
  sig = FreeVerb.ar(sig);
  DetectSilence.ar(sig,doneAction:2);
  Out.ar(0,sig/3);
}).add;
)
//open een poort naar keuze
thisProcess.openUDPPort(9001);
//en check welke poorten er nu open staan.
thisProcess.openPorts;

//zelfde principe als midi, in een func komt de data binnen
//eerste argument is een array met [/adress, waarde1, waarde2, etc.]

//geef als 2e argument van de OSCFunc aan naar welk adres er
//geluisterd moet worden.
(
~testeosc.free;
~testeosc = OSCFunc({ |msg|
  Synth(\naam,[\gate,msg[3],\freq,msg[1],\amp,msg[2]])
},'\test');
)