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');
)