Kick Drum resonance

Trying to learn more about sound design but fallowing along with people making 808 sounds (very unoriginal I know, but I like the idea of tuning my own set). Im happy with the snare and the cymbal but the kick is not there.

It’s interesting that in digging online the kick seems to be not a sine but a self resonating filter at about 56~54 hz.

Been trying it some different ways but not capturing the ringing out part…

(
SynthDef(\kick,{ | out = 0 |
	var sig;
	sig = RHPF.ar(Pulse.ar(1),31, 0.1, 0.1);
	sig = 2 * BRF.ar(sig,60,0.00000001);
	sig = 8 * RHPF.ar(sig, XLine.kr(100, 31,0.25),0.00000000001);
	sig = sig * Env.perc(0.001, 0.4, 0.1,curve:-12).ar(doneAction:2);
	sig = LPF.ar(sig, 1200);
	sig = sig * -9.dbamp;
	sig = Splay.ar(sig);
	Out.ar(out, sig);
}).add;
)
Synth(\kick);

Im attempting to get increase the resonance by multiplying the filters. Im intrigued that this example gets a good sound with so few components.

I have other less close attempts and have looked at the code on the SC-808 by Yoshinosuke Horiuchi. But aiming to make something more simple and with less code.

Im curious on how I can achieve a self oscillation that gets closer to the sound of the reactor screenshot in the post.

Have you seen this one ?

Thanks for sending but in terms of learning more about sound design, I am really asking how to achieve results similar to this reaktor patch that is emulating the old circuit. I copied the patch sent and also recreated it to understand it and it also was missing the fuller ring of the screen shot posted… Some differences were the use of Rinqz over BPF and RHPF, but also making use of a XLine to ramp the tone.

Reaktor patch is a Pulse trigging a self oscillating LPF that is then enveloped…but like a haiku delivering much more…

The actual synthdef for the kick in Yoshinosuke’s code is pretty simple though, 14-15 lines of code and not using any resonant filters, just plain old SinOsc’s and hi-pass and lo-pass filters with a little noise added.

Have you had a look at some of @nathan s videos? There are some really nice kicks among other things.

1 Like

I love the sounds Horiuchi gets but his code is so bad.
I have a file where I’ve managed to shorten the envelopes so you don’t stack 30 seconds of mostly silence per kick drum and overburden the server.
Another idea is to use the Decay ugen for an envelope.
I also like to use Resonz instead of SinOsc sometimes but it’s 6 one half dozen the other

Yea @nathans videos are excellent and what kinda got me going into wanting to explore kicks.
Then after poking around online and seeing the some classic kicks are just self resonating filters enveloped I thought to make some but… def something is missing. On a physical synth I can remake it fine like the MC202. Yea the Yoshinosuke kick sounds good but bulit differnetly. Maybe the SC filters just simply dont resonant similar to old Rolands…

SC has resonant filters, Yoshinosuke just does not use them (RLPF, RHPF). I also really like the portedplugin filters, like the VLadder although the exact cutoff freq is not really what you input, but still they sound really great and gritty, especially when you play around with the resonance and overdrive. Here is a quick example with of a self resonating filter which could be a starting point for a kick:

(
{
	var sig = Decay.ar(Impulse.ar(0));
	RLPF.ar(sig, 50, 0.02) * 0.2;
}.play
)

yea Decay is new to me so I give go ( I think its just dose what I using XLine for ) but yes messed around with RLPF, RHPL, Fromlet, MoogFF, Resonz, etc. but none got so close…must be a reason that @nathan and Horiuchi use sines… I was intrigued as to/how why hardware and other programs like the video could get ther with just resonant filters very elegantly quickly and simple not needing to mix multiple signals etc

I don’t think the reaktor patch would be hard to do with the exact same elements in SC, I am curious to why you think that is simpler than doing it in SC? The reaktor patch has all the usual elements for creating a kick including LP filter and an envelope. Maybe it seems simpler because of how you patch elements premade modules together whereas SC does not use that kind of patching, which btw. is something I love about SC - I really dislike patching virtual cables, especially for more advanced operations.

me too I didn’t think so either ! it’s why I was surprised … I am more questioning why the big difference in results. I too prefer the SC way of doing it things . Feels both easier to read and faster. Maybe it’s just the behavior of the SC filters? I tried with hardware ( a 202) and presto but in SC the closest is something like this which uses no resonating filters.
Sounds good but def a different way.

(
SynthDef(\kick12,{
	var sig;
	sig = SinOsc.ar(54 * (1 + (8 * Env.perc(0.0, 0.3, curve:-30).ar))) * (1(8*Env(0, 0.1).ar));
	sig = sig * Env.perc(0.01, 0.2).ar(Done.freeSelf);
	sig = sig * -10.dbamp;
	sig = Splay.ar(sig);
	Out.ar(\out.kr(0), sig);
}).add;
)

but with hardware and other examples its as simple as TRIG > FILTER(self feedbacking at desired freq > ENV> OUT. In

which I see as this… works ok

(
SynthDef(\kick9,{
	var sig;
	sig = Impulse.ar(1);
	sig = 2 * RLPF.ar(sig, XLine.ar(130, 24, 0.4), 0.02, 0.2);
	sig = sig * Env.perc(0.0, 0.3, -64).ar(Done.freeSelf);
	sig = sig.tanh;
	sig = sig * -4.dbamp;
	sig = Splay.ar(sig);
	Out.ar(\out.kr(0), sig);
}).add;
)


I think it’s figuring out more about filter behaviors on my end? I guess you just have to add a second onset sound in SC…and some sort of distortion that excites the sound and makes feel more punchy . XLine helped a bit. But more curious how to achieve same results over emulating… maybe physical filters just have inherent distortion ?

Another hardware example

(
SynthDef(\kick3,{
	var filter, trig, env;
	trig = Impulse.ar(1);
	env = Env.perc(0.0, 0.8, -64).ar(Done.freeSelf);
	filter = RLPF.ar(trig,XLine.ar(100,56,0.8), 0.000002, 0.5);
	filter = filter * env;
	filter = Splay.ar(filter);
	Out.ar(\out.kr(0), filter);
}).add;
)

Synth(\kick3);

kinda close… I guess an issue of distortion ? shy

RLPF doesn’t really self oscillate well.

( // even with rq set all the way to 0, just a very small oscillation that fades
{
  var sig = RLPF.ar(Impulse.ar(0), 56, 0);
  sig!2
}.play
)

DFM1 from sc-plugins does, also several portedplugins, my HouvilainenFilter port, sam’s VAMoogLadderOS.

( // any resonance >1 will self oscillate
{
  var sig = DFM1.ar(Impulse.ar(0), 56, 1.2);
  sig!2
}.play
)

But also distorting a sine is a good approximation, although for me the DFM1’s distortion is very nice compared to say tanh. But tanh is cheaper:

(
{
  var sig = SinOsc.ar(56).tanh;
  sig!2
}.play;
)

If using the DFM1 self-oscillation, it takes a little while to get going so you should use an envelope on an already-running synth:

( // get the synth going
x = {
  var sig = DFM1.ar(Impulse.ar(0), 56, 1.2);
  var env = Env.perc(0, 1).ar(gate: \trig.tr(0));
  sig*env!2
}.play
)

// trigger the sound
x.set(\trig, 1)

The sine option can be used as a one-shot synth, and it’s nice that you can set its phase if you want to adjust the transient

SynthDef(\kik, { |out|
  var phase = MouseX.kr(0, pi/4).poll;
  var sig = SinOsc.ar(61, phase).tanh;
  var env = Env.perc(0, 1).ar(Done.freeSelf);
  Out.ar(out, sig*env!2);
}).play;
1 Like

Thank you ! this is awesome. Sad that RLPF dose not self oscillate but also good to know Im not crazy haha.

Ive not played with plugins but will def explore them now that I know they behave more “analog- ish” in that they will self oscillate.

But this is exactly the solution looking for. And it’s got a beauty in that it’s mega concise. Thank you again

Well, RLPF does self oscillate, but it easier (for me at least) to get good results with something like VALadder from PortedPlugins:

(
{
	var trig, freqEnv, sig;
	trig = Impulse.ar(0);
	freqEnv = Env([50, 750, 60, 50] * 0.33, [0.0035, 0.012, 0.06]).ar(trig);
	sig = Decay.ar(trig, 0.005);
	sig = VALadder.ar(sig, freqEnv, 0.99, 1, 1) * 0.55;
	sig = HPF.ar(sig, 50);
	sig * Env.perc(0.03, 0.28).ar(2) ! 2
}.play
)

(
{
	var trig, freqEnv, sig;
	trig = Impulse.ar(0);
	freqEnv = Env([50, 800, 60, 50] * 1.06, [0.002, 0.012, 0.06]).ar(trig);
	sig = Decay.ar(trig, 0.005);
	sig = sig * 12;
	sig = sig.fold2 * 0.2;
	sig = RLPF.ar(sig, freqEnv, 0.05);
	4.do{ sig = sig.tanh };
	sig = sig * 2.2;
	sig = HPF.ar(sig, 50);
	sig * Env.perc(0.018, 0.28).ar(2) ! 2
}.play
)

For some reason, the files sound different when I play them from the SC IDE compared to playing from the OSX finder or playing the uploaded soundfile here. Maybe it has to do with the short attack of the files. To me they sound better when played from the SC IDE than from the finder, not sure what is going with that?

I do not have VALadder but will get it and give it a go ! the

 SinOsc.ar(56).tanh;

to me addressed the sonic characteristics I was chasing, but agreed not as pleasant as DFM1’s. At this risk of going out on a limb here the Yoshinosuke sounds are very well done but also focused (in a good way). Finding out how filters can be manipulated was my aim without venturing into plugins. But Im learning that embracing plugins or double clicking into how filter are made is the next progression. (also obsessed with simplicity hence the avoided plugins )

Something to remember is that {}.play automatically adds an envelope with an attack time to the sound, if you want a really fast attack at the very beginning of the synth use SynthDef directly instead (edit: or as Daniel pointed out, use fadeTime: 0)

I actually didn’t know that, thanks for clarifying. I wonder if that is also true for Buffer.play?

For every temporary synthdef that is produced internally via {}.play. Nevertheless, you can circumvent it by passing the argument fadeTime: 0 to play.

You can try tanh with a pre-amplification. Bruno Ruviaro has posted a drumset on sccode: SynthDef examples: hihat, snare, kick, sawSynth, with Pbind demo

Variant with pre-amp:

SynthDef(\kick, { arg out = 0, amp = 0.1, preAmp = 5, sinfreq = 60, glissf = 0.9, att = 0.01, rel = 0.45, pan = 0;
	var gliss = XLine.kr(sinfreq, sinfreq * glissf, rel);
	var snd = SinOsc.ar(gliss);
	var env = EnvGen.kr(Env.perc(att, rel), doneAction: 2);
	snd = snd * env * preAmp;
	OffsetOut.ar(out, Pan2.ar(snd.tanh * amp, pan));
}).add;

Sometimes when say playing a synth in a Pbind the transient seems to shift creating a doubling sound

(
SynthDef(\kick3, { |out|
  var sig = SinOsc.ar(56).tanh;
  var env = Env.perc(0, 0.2).ar(Done.freeSelf);
  Out.ar(out, sig*env!2);
}).add;
)

Ndef(\k).play
Ndef(\k, Pbind(\instrument, \kick3, \dur, 1)))

curious why…?