SuperCollider les 3
Hieronder de code van de Supercollider-les van 20-04-2023:
OSC en midi
s.boot;
//OSC
(
SynthDef(\testSynth,{
|freq=440,amp=0.5,release=1,ratio=0.5,t_trig,cutoff=500|
var sig, env;
env = EnvGen.ar(Env.perc(0.01,release,amp),t_trig,doneAction:2);
sig = Saw.ar(freq+SinOsc.ar(freq*ratio,0,100,200));
sig = BLowPass.ar(sig,cutoff);
sig = sig * env;
Out.ar([0,1],sig);
}).add();
)
//test de synth-def
Synth(\testSynth,[\t_trig,1]);
//luister naar poort:
thisProcess.openUDPPort(9001);
//osc
(
~ofunc.free;
~ofunc = OSCFunc({
|oscmsg|
oscmsg.postln;
Synth(\testSynth,[
\t_trig,1,
\freq,oscmsg[1],
\ratio,oscmsg[2],
\amp,oscmsg[3],
\release,oscmsg[4]
]);
},'\synth');
)
//MIDI
//verbind met alle poorten:
MIDIIn.connectAll;
//kies er een:
MIDIClient.init
MIDIClient.sources;
MIDIIn.connect(0); //aan de hand van de lijst die uit MIDICient.sources komt
//sluit verbinding:
MIDIIn.disconnectAll;
(
~release = 1;
~ratio = 0.5;
~cutoff = 500;
~mfunc.free;
~mfunc = MIDIFunc.noteOn({
|vel,note|
Synth(\testSynth,[
\t_trig,1,
\freq,note.midicps,
\amp,vel/127,
\release,~release,
\cutoff,~cutoff,
\ratio,~ratio
]);
});
)
//cc met if-statement, niet echt handig.
(
~cfunc.free;
~cfunc = MIDIFunc.cc({
|val,ctl|
if (ctl == 1,
{~cutoff = val.linlin(0,127,250,2000)},
{if (ctl == 2,
{},
{}
)}
)
})
)
//alternatief kan je ook een switch gebruiken:
(
~cfunc.free;
~cfunc = MIDIFunc.cc({
|val,ctl|
switch(ctl)
{1} {~cutoff = val.linlin(0,127,250,2000)}
{2} {~release = val.linlin(0,127,0.1,10)}
{3} {~ratio = val.linlin(0,127,0.01,10)}
})
)
Busses en effecten
(
s.waitForBoot({
//maak busses aan:
s.newBufferAllocators; //ruim alle bestaande bussen op.
~delbus = Bus.audio(s,2);
~verbbus = Bus.audio(s,2);
//maak groups aan:
~fxGroup = Group.new();
~srcGroup = Group.before(~fxGroup);
//synchroniseer tussen client en server
s.sync;
//maak een aantal synthdefs aan:
SynthDef(\source,{
|t_trig,delBus=0|
var sig, env;
env = EnvGen.ar(Env.perc(),t_trig);
sig = Saw.ar([110,111],0.5);
sig = sig * env;
Out.ar(0,sig);
Out.ar(delBus,sig);
}).add;
SynthDef(\del,{
|busIn=0,busOut=0|
var sig;
sig = InFeedback.ar(busIn,2);
sig = CombN.ar(sig,1,LFNoise2.ar(0.25).range(0.1,0.4),10);
sig = BLowPass.ar(sig,7000,1);
sig = LeakDC.ar(sig);
Out.ar(0,sig);
Out.ar(busOut,sig);
}).add;
SynthDef(\verb,{
|busIn=0,busOut=0,t_trig|
var sig, env;
env = EnvGen.ar(Env.perc(0,01,10),t_trig);
sig = InFeedback.ar(busIn,2);
sig = FreeVerb.ar(sig,0.5,0.9,0.5);
sig = LeakDC.ar(sig);
sig = sig * env;
Out.ar(0,sig);
Out.ar(busOut,sig);
}).add;
s.sync;
//voeg oscillator toe aan source-group
~srcGroup.freeAll;
~synth = Synth(\source,[\delBus,~delbus],~srcGroup);
//voeg effecten toe aan fx-group
~fxGroup.freeAll;
~del = Synth(\del,[\busIn,~delbus,\busOut,~verbbus],~fxGroup);
~verb = Synth(\verb,[\busIn,~verbbus,\busOut,~delbus],~fxGroup);
s.sync;
//trigger oscillator- en reverb-envelope
~synth.set(\t_trig,1);
~verb.set(\t_trig,1);
})
)