View this PageEdit this PageUploads to this PageHistory of this PageTop of the SwikiRecent ChangesSearch the SwikiHelp Guide

pentatonik und drum set

Home   How To   Code Pool   Public Library   Theory   Events
s = Server.default;
s.boot;


/*
Small piece with drum set and pentatonic synth sound, filled with similar pad
by Alexander Schremmer, with rough structure from spacelab.scd

Every instrument of the drum set plays a rhythm that is chosen randomly. The
particular rhythm is changed every 2 or 3 bars, depending on the instrument.
The notes are chosen randomly as well.

This file consists of 3 sections:
the synths, the patterns and the scheduler call
*/

// SynthDefs //
(
	// rather flat basedrum, no high resonance
	// i.e. you need very powerful speakers
	SynthDef(\basedrum, { | out=0, amp=1.0 |
		var osc, env;
		// 50 Hz triangular signal with low pass filter at 140 Hz
		osc = LPF.ar(LFTri.ar(50), 140);
		// short percussive envelope
		env = EnvGen.kr(Env.perc(0, 0.13), doneAction: 2);
		Out.ar(out, Pan2.ar(osc, 0, env) * amp * 2);
	}).memStore;

	// Snare drum that consists of two parts:
	//   - white noise
	//   - 300 Hz sinoid sound
	// which are both mixed and pushed through a 18 KHz low pass filter.
	// The latter sinoid sound ensures the knock/resonance sound
	// of a real snare drum.
	SynthDef(\snaredrum, { | out=0, amp=1.0 |
		var osc1, osc2, env;
		osc1 = WhiteNoise.ar * 1.2;
		osc2 = FSinOsc.ar(300);
		env = EnvGen.kr(Env.perc(0, 0.08), doneAction: 2);
		Out.ar(out, amp * Pan2.ar(LPF.ar(Mix([osc1, osc2]) * 0.6, 18000), 0, env));
	}).memStore;

	// Hi-hat which is simply generated by percussion formed
	// high pass filtered whitenoise 
	SynthDef(\hihat, { | out=0, amp=1.0 |
		var osc1, env;
		osc1 = WhiteNoise.ar;
		env = EnvGen.kr(Env.perc(0, 0.2), doneAction: 2);
		Out.ar(out, amp * Pan2.ar(HPF.ar(osc1, 400), 0, env));
	}).memStore;

	// Primary instrument used for the crotchets
	SynthDef(\soundone, { | out=0, amp=2, freq=440 |
	        var osc, saw, env;
		// simple envelope that peaks after 50 ms and remains active for 500 ms
		env = EnvGen.ar(Env.new([0, 1, 0.5], [0.05, 0.5]), doneAction:2);
		// saw tooth
	        saw = Saw.ar(freq);
		// low pass filter at 5th upper partial
	        osc = RLPF.ar(saw, freq * 5, 0.1);
	        Out.ar(out, Pan2.ar(osc * amp * env));
	}).memStore;

	// Synth padding
	SynthDef(\poly, { | out=0 amp=1 freq=440 |
		var env, env_freq, osc, flt;
		// Primary envelope with long attack time (2 seconds)
		env_freq = EnvGen.kr(Env.asr(2, 1, 0.2), levelScale: 14000, doneAction:2);
		// Secondary envelope which seems necessary in order to mute the instrument after 4 s
		env = EnvGen.ar(Env.new([1, 1], [4]), doneAction: 2);
		// Pulse wave with Sine-like cubic resonator which modulates the pulse width
		osc = Pulse.ar(freq * [1, 1.007], LFCub.kr(2, 0, 0.2, 0.7));
		// Low pass filter with q=1.11
		flt = RLPF.ar(osc, env_freq, 0.9) * amp * env;
		Out.ar(out, flt);
	}).memStore;
)



// Patterns //
(
	// Pattern that uses the base drum and plays a syncopated rhythm for 2 bars,
	// alternating with a straight forward one
	Pdef(\Pbasedrum_syncop, Pbind(
		\instrument, \basedrum,
		[\amp, \dur], Pwrand([
			Pseq([[1, 1], [0, 0.5], [1, 0.5], [1, 1], [0, 0.5], [1, 0.5]], 2),
			Pseq([[1, 1], [1, 1], [1, 1], [1, 1]], 2),
		      ], [0.5, 0.5], inf)
	));

	// Snare drum with two alternating patterns
	Pdef(\Psnaredrum, Pbind(
		\instrument, \snaredrum,
		\dur, 1,
		\amp, Pwrand([
                        Pseq([0, 1, 0, 1], 3),
			Pseq([1, 0, 1, 0], 3),
		      ], [0.5, 0.5], inf) * 0.2,
		// less exact timings, sounds more natural
		\timingOffset, Prand([0.001, 0.0005, 0], inf)
	));

	// hi-hat pattern used in the intro
	Pdef(\Phihat_intro, Pbind(
		\instrument, \hihat,
		\dur, 1,
		\amp, Pseq([1, 0.5, 0.25, 0.1 ], 2),
		// less exact timings, sounds more natural
		\timingOffset, Prand([0.001, 0.0005, 0], inf)
	));

	// hi-hat with three different patterns
	Pdef(\Phihat, Pbind(
		\instrument, \hihat,
		[\amp, \dur], Pwrand([
			Pseq([[0.1, 1], [0.3, 1], [0.7, 1], [0.5, 1]], 1),
			Pseq([[1, 1], [1, 1], [1, 1], [1, 1]], 1),
			Pseq([[0, 0.5], [1, 0.5], [0, 0.5], [1, 0.5], [0, 0.5], [1, 0.5], [0, 0.5], [1, 0.5]], 1),
		      ], [1/3, 1/3, 1/3], inf) * [0.2, 1],
		// less exact timings, sounds more natural
		\timingOffset, Prand([0.001, 0.0005, 0], inf)
	));

	// Primary sound, with pentatonic scale, notes are random
	Pdef(\Psoundone, Pbind(
		\instrument, \soundone,
		\dur, 1,
	        \timingOffset, 0.5,
		\amp, 0.15,
	        \midinote, Prand([1, 3, 5, 8, 10] + 60, inf) // pentatonik
	));

	// Synth pad with same scale
	Pdef(\Ppad, Pbind(
		\instrument, \poly,
		\dur, 8,
		\amp, 0.02,
	        \midinote, Prand([1, 3, 5, 8, 10] + 60, inf) // pentatonik
	));


	// Song sections //

	// intro just plays hi-hat
        Pdef(\intro, Ppar([Pdef(\Phihat_intro)]));
	// main section plays all instruments parallely
        Pdef(\main, Ppar([Pdef(\Pbasedrum_syncop), Pdef(\Psnaredrum),  
		    Pdef(\Phihat), Pdef(\Psoundone), Pdef(\Ppad)]));
)

// Scheduler //
(
	~tc = TempoClock.default;
	~tc.tempo = 120 / 60; // 120 BPM
	SystemClock.sched(0, {
		Psym(
			Pseq([
				\intro,
				\main
			])).play;
	});
)


/*
XXX debug
Synth(\poly).play;
s.scope;
PdefAllGui.new;
*/


Link to this Page