Tonehøjde, rytmik og dynamik i Pbind
I SuperCollider kan man sammensætte længere forløb af musikalske "begivenheder" ved hjælp af Pbind
. Det er ofte inden for Pbind, at vi specificerer musikalske parametre som tonehøjde, dynamik, rytmik og frasering. Det gør vi ved at sammensætte nøgler og værdier i formen \nøgle, værdi
.
Pbind(
\degree, 4, // 5. skalatrin, et g (fordi udgangspunktet er C-dur)
\dur, 0.5, // varighed på et halvt taktslag (dvs. en ottendedel i almindelig musikterminologi)
\db, -25, // -25 decibel lydstyrke
).play;
Nøglerne i Pbind'en ovenfor her er altså de tekstbidder, der starter med \
- \degree
, \dur
eller \db
. Værdierne som knyttes til disse nøgler er henholdvis 4
, 0.5
og -25
.
Herunder gennemgås de mest almindelige standardnøgler, som er nyttige at kende til. Det skal med henblik på de senere kapitler i denne bog bemærkes, at vi kun kan bruge disse standardnøgler sammen med de klangdannelsesopskrifter, som kaldes SynthDef
s, hvis vi indretter vores SynthDef på en bestemt måde. Nøglerne der nævnes herunder fungerer kun, når man anvender argumenterne freq
, amp
og gate
korrekt i sin SynthDef. Se hertil afsnittet om argumentnavne i SynthDef.
Tonehøjde i Pbind
SuperCollider kan automatisk udregne hvilken frekvens, vores toner skal klinge med, hvis vi i Pbind angiver tonehøjde på en genkendelig måde, dvs. ved hjælp af en række konventionelle nøgler1. Til at notere tonehøjder anbefaler jeg, at man anvender en kombination af følgende nøgler:
\degree
-
Angiver skalatrin, hvor 0 er det første trin (fx tonen c i en C-dur skala).
\scale
-
Angiver skala, valgt med fx
Scale.minor
eller angivet som en liste bestående af intervaller.Scale.major
er standardværdien. For skalavalgmuligheder, kørScale.directory;
\octave
-
Angiver hvilken MIDI-oktav, tonen findes i.
\root
-
Skalaens grundtone, målt i antal halvtoners afstand fra c. Dvs. 0 er c, 1 er cis, 2 er d osv. Dette kan også være negative tal, dvs. -3 svarer til a.
Pbind(
\degree, [0, 2, 4, 6], // en diatonisk firklang
\scale, Scale.minor, // mol-skala
\octave, 5, // oktav 5 er den oktav, som starter ved nøglehuls-c
\root, -3 // 3 halvtoner under nøglehuls-c (i dette tilfælde a)
).play; // tilsammen en A-mol7
Man kan også vælge at angive tonehøjde på andre abstraktionsniveauer - med MIDI-tal (nøglen \midinote
) eller oscillatorfrekvens (nøglen \freq
).
Pbind(\midinote, 60).play; // c
Pbind(\freq, 440).play; // a, kammertonen
Vi kan angive transponering og parallelforskydning inden/uden for skala med:
\mtranspose
-
Modal transponering, dvs. parallelføring inden for skalaen. Måles i antal skalatrin.
\ctranspose
-
Kromatisk transponering, dvs. uafhængigt af skala. Måles i antal halvtonetrin.
Pbind(
\degree, [0, 2, 4],
\mtranspose, Pseq([0, 1, 2, 3]),
).play;
Pbind(
\degree, [0, 2, 4],
\ctranspose, Pseq([0, 1, 2, 3]),
).play;
Til disse kunne man måske indvende, at \root
og \ctranspose
giver samme resultat, så hvorfor have to forskellige nøgler, der gør det samme? Når begge nøgler sameksisterer, er det fordi det giver os mulighed for at definere en grundtone med \root
og en (midlertidig) bevægelse væk fra denne grundtone med \ctranspose
. Selvom der ikke er nogen funktionel forskel, er der en semantisk forskel for komponisten, som kan være meget væsentlig. Dette naturligvis sammenholdt med, at ingen er tvunget til at anvende disse nøgler til specificering af tonehøjde. Man kan blot angive miditone-tal med \midinote
eller oscillatorfrekvens med \freq
, hvis man ønsker at arbejde på det abstraktionsniveau. Man kan endda anvende en række andre nøgler, som for enkelhedens skyld er udeladt her. De kan ses på nedenstående graf, som stammer fra SuperColliders dokumentation (SuperCollider 3 documentation contributors, n.d.)2.
Varighed, frasering og timing
Til at notere rytmiske forhold bruger vi primært følgende nøgler:
\dur
-
Tidsinterval mellem på hinanden følgende anslag, målt i taktslag (ikke sekunder).
\legato
-
Hvor længe en tone klinger, målt relativt i forhold til
\dur
. Værdier større end 1 giver legato og værdier mindre end 1 giver staccato.
// tidsinterval 1 taktslag, dvs. en 4.-del
Pbind(\dur, 1).play;
// tidsinterval 0.25 taktslag, dvs. en 16.-del
Pbind(\dur, 0.25).play;
// staccato
Pbind(\legato, 0.1).play;
// legato
Pbind(\legato, 1.5).play;
For at justere timing relativt til den underliggende puls kan man bruge nøglen \lag
, hvilket fx kan bruges til at "humanisere" en ellers meget maskinel timing.
(
~almindelig = Pbind().play;
~forsinket = Pbind(
// højere tone, så vi kan høre forskel
\degree, 4,
// skiftevis lidt forsinket og lidt tidlig
\lag, Pseq([0.1, -0.1], inf)
).play;
)
~almindelig.stop; ~forsinket.stop;
For at forskyde timingen af den enkelte tone relativt til andre ellers samtidigt klingende toner kan vi bruge \strum
-nøglen, som forskyder toneanslag i akkorder ligesom ved et guitar-strum, hvor der kan være et kort tidsinterval mellem anslaget af de forskellige strenge. For at få denne effekt, skal vi notere en liste eller et pattern, som genererer en liste (fx med method'en .clump
).
Tempoangivelse med TempoClock
For at angive tempo kunne vi sådan set blot justere på de værdier, vi anvender til \dur
-nøglen. Dobbelt så lange varigheder halverer tempoet, og halvt så lange varigheder fordobler tempoet. Men det ville betyde, at vi skulle ændre på alle vores Pbinds, hvis vi ville sætte tempoet bare en smule op eller ned, og det ville ikke være praktisk. Heldigvis er der en bedre måde at styre tempoet på, nemlig ved hjælp af klassen TempoClock
.
TempoClock
måler tempoet i taktslag pr. sekund (BPS). Dette står i modsætning til mange andre former for musiksoftware, hvor tempoet måles i taktslag pr. minut (BPM). Spørger vi TempoClock
om den aktuelle tempoindstilling med method'en .tempo
, vil vi derfor få en lidt usædvanlig tempoangivelse retur, nemlig tallet 1.0
(medmindre vi har ændret tempoet). Det betyder ét taktslag pr. sekund, hvilket svarer til 60 taktslag pr. minut. Hvis vi vil fordoble tempoet, kan vi dermed sætte det til 2
, hvilket svarer til 120 BPM.
Men hvad så, hvis vi gerne vil sætte tempoet til fx 87,3 BPM? Det kan vi let gøre ved at omregne fra BPM til BPS med en simpel formel: \(BPS = BPM/60\)
// Tempo sættes til 87,3 BPM
TempoClock.tempo = 87.3 / 60;
TempoClock.tempo; // Vis det aktuelle tempo, målt i BPS
// -> 1.455
Hvis vi midlertidigt vil skifte tempo, kan vi godt ændre på TempoClock.tempo
, mens vores Pbind spiller. Men det kan her være nyttigt at bruge patterns til at sekvensere skiftet, så det sker præcist der, hvor vi ønsker det. Hvis vi vil skalere tidsintervallerne angivet med \dur
uden at ændre disse direkte, kan vi tilføje nøglen \stretch
, der som navnet antyder strækker eller skalerer varighederne med den faktor, vi angiver. Her er det altså ikke en direkte tempoangivelse som med TempoClock.tempo
, men en relativ angivelse, som tager udgangspunkt i det eksisterende tempo.
Pbind(\dur, 1, \stretch, 1).play; // normalt tempo
Pbind(\dur, 1, \stretch, 2).play; // dobbelt tempo
Pbind(\dur, 1, \stretch, 3).play; // tredobbelt tempo
Pbind(\dur, 1, \stretch, 0.5).play; // halvt tempo
Traditionel rytmenotation og \dur-nøglen
For at notere nodeværdier som vi kender dem fra almindelig musikteori, skal vi tage højde for, at SuperCollider tæller varigheder i taktslag. Når vi almindeligvis taler om et "taktslag", taler vi typisk om en fjerdedel (1/4). Men en fjerdedel af hvad? Rent teknisk taler vi om en fjerdedel af en (fire fjerdedels)takt. I SuperCollider tæller vi med \dur
-nøglen ikke i takter, men i taktslag. Derfor skriver vi 1 og ikke 1/4, når vi ønsker en varighed på ét taktslag.
Hvad nu, hvis vi gerne vil bruge almindelige rytmeangivelser i SuperCollider? Jo, vi kan for det meste ganske enkelt gange med 4 for at omregne fra "varighed målt i andele af takt" til "varighed målt i taktslag". For at notere sekstendedele, ottendedele, fjerdele, halvnoder og helnoder kan vi således skrive den ønskede nodeværdi ganget med 4.
Pbind(\dur, 1/16 * 4).play;
Pbind(\dur, 1/8 * 4).play;
Pbind(\dur, 1/4 * 4).play;
Pbind(\dur, 1/2 * 4).play;
Pbind(\dur, 1/1 * 4).play;
Lydstyrke
Til at notere volumen kan man vælge mellem nøglerne \db
eller \amp
. Med \db
omregner SuperCollider automatisk fra decibel, hvor 0
er den maksimale værdi. Med nøglen \amp
angiver vi i stedet amplituden direkte, typisk som en værdi mellem 0 og 1.
-
Teknisk set er det ikke Pbind, som man måske skulle tro, men i stedet SuperColliders såkaldte default Event, som foretager omregningen fra de nøgler og værdier, vi angiver i Pbind, til tekniske parametre som frekvens. Nysgerrige læsere henvises til SuperColliders dokumentation for yderligere uddybning. ↩
-
SuperCollider 3 documentation contributors. (n.d.). Event. In SuperCollider 3.14.0-dev Help. Retrieved June 17, 2025, from https://doc.sccode.org/Classes/Event.html ↩