Gå til indholdet

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.

Nøgler og værdier i Pbind
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 SynthDefs, 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ør Scale.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.

Skalatrin, skala, oktav og grundtone
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).

Alternative nøgler til angivelse af tonehøjde
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.

Modal og kromatisk transponering
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.

Pbind-nøgler til udregning af oscillatorfrekvens. Licens: CC BY-SA 3.0. Kilde: SuperCollider 3 documentation contributors, https://doc.sccode.org/Classes/Event.html
Pbind-nøgler til udregning af oscillatorfrekvens. Licens: CC BY-SA 3.0. Kilde: SuperCollider 3 documentation contributors, https://doc.sccode.org/Classes/Event.html

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.

Sammenhængen mellem \dur og \legato i Pbind
Sammenhængen mellem \dur og \legato i Pbind

Rytmik og frasering med dur og legato
// 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.

Rytmisk forskydning med lag
(
~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).

Strumming med strum
Pbind(
    \degree, [0, 2, 4, 6],
    \strum, 0.05
).play;

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.

Tempo med TempoClock
TempoClock.tempo;
// -> 1.0

TempoClock.tempo = 2;
TempoClock.tempo;
// -> 2.0

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

Tempoangivelse i BPM
// 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.

Tempovariation med stretch
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.

Notation af traditionelle nodeværdier i Pbind
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.

Lydstyrke med amp og db
Pbind(\db, -30).play;
Pbind(\amp, 0.2).play;

  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. 

  2. 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