Patronen & sequences


Om binnen SuperCollider te kunnen sequencen kan je met patronen / Patterns werken. Deze patronen kan je helemaal zelf invullen of met bepaalde objecten willekeurig genereren. Met het Pbind-object voeg je deze patronen samen tot een afspeelbare sequentie.

Pbind

Hieronder een simpel voorbeeld van een patroon dat via Pbind afgespeeld wordt. Als je bij Pbind geen SynthDef opgeeft, maakt deze gebruik van de ingebouwde midi-player.

(
~pattern_example_1 = Pbind (
    \note, 0,
    \dur, 0.5,
);
~pattern_example_1.play;
)
//gebruik voor nu cmd/ctrl + . om te stoppen

Binnen Pbind geef je met \note aan welke toonhoogte er gespeeld moet worden, de 0 betekent in dit geval de centrale c (midinoot 60) met \dur hoe lang deze moet duren, Direct na de vorige noot wordt de volgende noot gespeeld.


Sequentie toevoegen

Een noot afspelen is wellicht een beetje saai op een gegeven moment. Met allerlei Pattern-functies kan je binnen een Pbind in SuperCollider verschillende (random) sequences toevegen. De eerste manier om dit te doen is als volgt:

(
~pattern_example_2 = Pbind (
    \midinote, Pseq([60, 62, 64, 60], 2),
    \dur, 0.5;
);
~pattern_example_2.play;
//gebruik voor nu cmd/ctrl + . om te stoppen

Met Pseq kan je een sequentie van noten afspelen. Als eerste argument geef je een array met noten die achter elkaar gespeeld moet worden. Als tweede argument kan je daarbij ook aangeven hoe vaak dit herhaald moet worden. bij een getal, wordt de sequentie zo vaak herhaald, met inf gaat het oneindig door. Je ziet in het voorbeeld hierboven dat je ook \midinote kan gebruiken in plaats van \note. Dan kan je midinoten invullen zoals je die ook in Max gebruikt.

Je kunt natuurlijk ook de duur van de noten sequencen een andere parameters aansturen

(
~pattern_example_3 = Pbind (
    \freq, Pseq([440, 220, 880], 2),
    \dur, Pseq([0.2, 0.5], inf),
    \amp, Pseq([0.5,0.9,0.3],2);
);
~pattern_example_3.play;
//gebruik voor nu cmd/ctrl + . om te stoppen
)

Zoals je ziet wordt er bij twee Pseqs 2 als duur gebruikt en bij de ander inf. In dit geval zal Pind de kortste optie kiezen. Dus na 2 x 3 noten stopt de sequentie.


Andere Pattern-generators

Je kan verschillende Patterngenerators gebruiken om je patroon vorm te geven. Hieronder worden er een aantal beschreven. Probeer ze allemaal even uit om naar het verschil te luisteren.

Pwhite

met Pwhite krijg je een willekeurige waarde tussen de eerste twee waarden die je opgeeft, de laatste waarde is hoe vaak er een waarde wordt gekozen: Pwhite(0.1,0.9,2) kiest 2x een getal tussen 0.1 en 0.9.

Pshuf

shuffelt elke keer dat de sequentie wordt uitgevoerd de waardes die in de lijst staan: Pshuf([60,62,64,67,69],3) speelt 3 van de noten uit de lijst uit, in willekeurige volgorde

Pser,

Pser is bijna hetzelfde als Pseq. Alleen zal Pser niet een x aantal keer de hele sequentie afspelen, maar x noten uit de sequentie. Pser([60,65,69],10) speelt de volgende seqeuentie: 60,65,69,60,65,69,60,65,69,60

andere..

Als je in de SuperCollider Help-browser naar Streams-Patterns-Events gaat en vervolgens Patterns selecteert, dan krijg je een overzicht van welke andere Patterns er beschikbaar zijn.


SynthDef aansturen.

Naast de ingebouwde midi-player kan je natuurlijk ook een SynthDef aansturen met Pbind. Je kan hiervoor de SynthDef maken zoals je die zelf wil, daarbij is het wel belangrijk om op een aantal dingen te letten:

Vervolgens kan je in je Pbind met \instrument selecteren welke SynthDef je wilt gebruiken. Zie het voorbeeld hieronder:

SynthDef(\test,{|freq=440,amp=0.5,gate=1|
    var sig, env;
    env = EnvGen.ar(Env.adsr(),gate,doneAction:2);
    sig = SinOsc.ar(freq,0,amp);
    Out.ar(0,sig*env!2);
}).add;

~pattern = Pbind(
    \instrument,\test,
    \midinote,Pseq([60,64,65],inf),
    \amp,Pwhite(0.1,0.5),
    \dur,Pwhite(0.5,1);
)

~pattern.play
//gebruik voor nu cmd/ctrl + . om te stoppen 

Patronen afspelen en stoppen

Zoals je in de voorbeelden hierboven al hebt gemerkt, is het wat lastig om de patterns weer te stoppen. Dit komt omdat, zodra je ~pattern.play uitvoert, dit resulteert in een zogenaamde EventStreamPlayer. Een pattern zelf kan je niet laten stoppen met afspelen, dat kan alleen met een EventStreamPlayer. Je zal dus deze EventStreamPlayer dus in een variabele op moeten slaan, vervolgens kan je die stoppen, herstarten, muten, etc. Je hebt de volgende opties:


Timing.

Je kunt patronen ook aan een clock hangen en zo zorgen dat ze altijd in sync lopen. je gebruikt hier een TempoClock voor. Zie het voorbeeld hieronder.

(
~pattern1 = Pbind (
    \instrument, \test,
    \midinote, Pseq([45, 48, 52], inf),
    \dur, Prand([1/2, 2/2, 2/4], inf),
    \amp, Pwhite(0.2, 0.8),
);

~pattern2 = Pbind (
    \instrument, \test,
    \midinote, Pseq([60, 62, 64], inf),
    \dur, Prand([1/2, 2/2, 2/4], inf),
    \amp, Pwhite(0.2, 0.5),
);
)
(
~clock1 = TempoClock(120/60);
~player1 = ~pattern1.play(~clock1);
~player2 = ~pattern2.play(~clock1);
)