Syntetisk stortrommelyd
Èt område inden for elektronisk klangdannelse, hvor vi gør rig brug af envelopes, er dannelsen af trommelyde. Uanset om man ønsker at simulere en bestemt tromme for at opnå en "realistisk" klang eller målet er en tydeligt syntetisk klang, er trommelyde karakteriseret ved, at forskellige aspekter af lydene forandrer sig dramatisk over korte tidsspænd. Herunder kigger vi på hvordan man kan skabe en stortrommelyd ved hjælp af en oscillator og en støjkilde, der moduleres af korte envelopes. Tilgangen her er løseligt inspireret af Gordon Reids gennemgang af analoge kredsløb i tidlige trommemaskiner (Reid, 2002)1 samt et par stortromme-SynthDefs af Nathan Ho (2017)2.
Forskellige aspekter af en stortrommelyd
Trommelyde er klangligt komplekse, og syntetisering af en stortrommelyd er et problem, der kan angribes på mange måder. For enkelhedens skyld deler vi her stortrommelyden op i to elementer: Den dybe tone, som vi kan kalde for kroppen, og en lysere, kort støjimpuls, som på en akustisk tromme opstår, når et objekt rammer på trommeskindet. Sidstnævnte kalder vi for klikket.
Krop
Stortrommens krop kan vi simulere med en simpel sinustone hvis frekvens moduleres af en enkel envelopegenerator, XLine
. Amplituden moduleres af en Env.perc
med yderst kort attack, releasetid på 200 ms og 5 ms forsinkelse (dette for at skabe plads til klik-lyden i begyndelsen af stortrommens klanglige forløb).
{
var body = SinOsc.ar(XLine.ar(350, 50, 0.045));
body * Env.perc(0.0001, 0.2, 1, \lin).delay(0.005).ar(2);
}.play;
Klik
For at simulere en kliklyd kan vi bruge en støjgenerator, WhiteNoise.ar
. Fuldspektret hvid støj vil dog blive for dominerende, og vi anvender derfor et båndpasfilter til at fjerne en væsentlig mængde støj og bevare et begrænset frekvensbånd centreret omkring 500 Hz. Filtre introduceres i næste kapitel, så for nuværende kan du blot betragte variablen click
som indeholdende støj med primær intensitet omkring 500 Hz. Envelopen til klikket er kort, 21 ms i alt. Dette naturligvis fordi kliklyden hurtigt dør hen igen. I nogle genrer er kliklyden meget eftertragtet, mens den fylder mindre i andre genrer.
{
var click = BPF.ar(WhiteNoise.ar, 500, 0.4);
click * Env.perc(0.001, 0.02, 0.5).ar(2);
}.play
Sammensætning til SynthDef
For at demonstrere interfacet mellem Pbind og SynthDef sammensætter vi de to ovennævnte elementer i en SynthDef, hvor de fleste af indstillingerne kan justeres ved hjælp af SynthDef-argumenter og dermed varieres med patterns i Pbind. I forhold til doneAction
og de to envelopes, så lader vi envelopen til trommens krop afslutte synth'en, da den varer længst.
SynthDef(\kick, {
arg pan = 0, amp = 0.1, out = 0, release = 0.2, cutoff = 8000,
clickFreq = 500, clickRq = 0.4, clickAmp = 0.5, bodyDelay = 0.005,
bodyStart = 350, bodyEnd = 50, bodyAmp = 1, bodyTime = 0.045;
var clickEnv = Env.perc(0.001, 0.02, clickAmp).ar;
var click = BPF.ar(WhiteNoise.ar, clickFreq, clickRq) * clickEnv;
var bodyEnv = Env.perc(0.0001, release, bodyAmp, \lin).delay(bodyDelay).ar(doneAction: 2);
var body = SinOsc.ar(XLine.ar(bodyStart, bodyEnd, bodyTime)) * bodyEnv;
var sig = (body + click).tanh;
sig = LPF.ar(sig, cutoff);
sig = Pan2.ar(sig, pan, amp);
Out.ar(out, sig);
}).add;
Vi kan teste SynthDef'en med at starte et par toner med forskellige indstillinger.
Husk at lytte til disse lyde på gode hovedtelefoner eller højttalere, som kan gengive de dybe frekvenser.
En demonstration af de klanglige muligheder
For at illustrere hvor mange klanglige muligheder, der faktisk findes blot med denne enkle SynthDef, kan vi skrive en Pbind, hvor alle SynthDef-argumenter varieres, så vi konstant bliver præsenteret for nye udgaver af denne stortrommelyd. Der er tilføjet .trace
til alle de anvendte patterns, så man kan stoppe strømmen og notere sig de forskellige værdier, hvis man hører en lyd, man godt kan lide.
TempoClock.tempo = 110 / 60;
p = Pbind(
\instrument, \kick, \db, -10,
\release, Pexprand(0.1, 0.8, 10).trace(prefix: 'release: '),
\bodyStart, Pexprand(200, 1200).trace(prefix: 'bodyStart: '),
\bodyEnd, Pexprand(35, 90).trace(prefix: 'bodyEnd: '),
\bodyAmp, Pgauss(1, 0.1).trace(prefix: 'bodyAmp: '),
\bodyTime, Pexprand(0.025, 0.100).trace(prefix: 'bodyTime: '),
\bodyDelay, Pexprand(0.002, 0.020).trace(prefix: 'bodyDelay: '),
\clickRq, Pexprand(0.5, 0.9).trace(prefix: 'clickRq: '),
\clickFreq, Pexprand(300, 2000).trace(prefix: 'clickFreq: '),
\clickAmp, Pexprand(0.3, 0.8).trace(prefix: 'clickAmp: '),
);
p.stutter(4).play;
-
Reid, G. (2002). Practical Bass Drum Synthesis. In Sound on Sound. https://www.soundonsound.com/techniques/practical-bass-drum-synthesis ↩
-
Ho, N. (2017). Three kicks. In SuperCollider Code. http://sccode.org/1-57g ↩