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:
- Als je
freq=440
gebruikt als argument voor de frequentie van je synth, dan kan je metPbind
\midinote
gebruiken om deze direct aan te sturen. - Als je
trig
gebruikt als argument voor een envelope zonder sustain, dan zal de envelope automatisch getriggered worden als je\dur
gebruikt in eenPbind
. - Als je
gate=1
gebruikt als argument voor een envelope met sustain, dan zal de envelope automatisch getriggered worden als je\dur' gebruikt in een
Pbind`.
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:
.play
- starten.stop
- stoppen.pause
- pauzeren.resume
- hervatten.mute
- sequentie blijft doorlopen, maar wordt gemute..unmute
- unmute.reset
- ga terug naar het begin van de sequentie.
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);
)