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

})
)