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

Das Modell von Kraftwerk

Home   How To   Code Pool   Public Library   Theory   Events
/* Das Stück "das Modell" von Kraftwerk besteht aus einer snare die den Takt angibt
 * und einer schnellen snare die leise im Hintergrund läuft und 8x pro Takt vorkommt.
 * Sie hat zwei Frequenzen die periodisch nach jedem Durchlauf geändert werden.
 * Dazu gibt es fünf verschiedene Melodien die überschneidungsfrei abgespielt werden,
 * im Outro wird die Intro-Melodie gespielt und mit einen Pfeiffton unterlegt.
 */

(
/*
 * Snare
 */
SynthDef("snare",
        { arg out=0, freq=100, sustain=0.25, amp = 7, pan = 0;
                var env;
		// env.perc: attackTime, releaseTime, peakLevel,
		// erzeugter envelope hat kurzen niedrigen peak mit kurzem sustain

                env = EnvGen.kr(Env.perc(0.01, sustain, 0.2), doneAction:2);
		// SinOsc: frequenz, phase, multiplikator

                Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0.5pi, env * amp * GrayNoise.ar(0.1).dup), pan))
        }
).store;

/*
 * Hintergrund Snare
 */
SynthDef("background_snare",
        { arg out=0, freq=300, sustain=0.05, amp = 1.1, pan = 0;
                var env;
		// env.perc: attackTime, releaseTime, peakLevel,
		// erzeugter envelope hat kurzen hohen peak mit sehr kurzem sustain

                env = EnvGen.kr(Env.perc(0.01, sustain, 0.3), doneAction:2);
		// SinOsc: frequenz, phase, multiplikator

                Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0.5pi, env * amp * PinkNoise.ar(0.5).dup), pan))
        }
).store;

/*
 * Die Synthdef tone_short gibt eine kurze midi Note wieder.
 */
SynthDef("tone_short",
	{ arg pan = 0, midiPitch = 60, dur = 1, amp = 0.9, sustain = 1.2, out=0;
		var env, sin;
		env = EnvGen.kr(Env.perc(0.2, dur, sustain), doneAction:2);

		// Wie snare, mit midi anstatt noise
		sin = SinOsc.ar(midiPitch.midicps, mul: amp)*env;
		Out.ar(out, Pan2.ar(sin, pan))
	}
).store;

/*
 * Die Synthdef tone_long gibt ähnlich wie tone_short eine midi Note wieder und wird
 * für die Melodien mit längeren Tönen verwendet.
 */
SynthDef("tone_long",
	{ arg pan = 0, midiPitch = 60, dur = 1, amp = 0.1, sustain = 2.4, out=0;
		var env, saw;
		env = EnvGen.kr(Env.perc(0.1, dur, sustain), doneAction:2);

		// LFSaw statt SinOsc für unruhigere langa noten 
		saw = LFSaw.ar(midiPitch.midicps, mul: amp)*env;

		Out.ar(out, Pan2.ar(saw, pan))

	}
).store;

/*
 * Definition der Snare, 
 */
~snare =  Pbind(
        \instrument, \snare,
        \freq, 100,
        \sustain, 0.25,
	\amp, 3,
        \dur, 1
);

/*
 * Definition der Hintergrund-Snare.
 * Die Frequenz verändert sich periodisch nach jedem achten vorkommen.
 */
~background_snare =  Pbind(
        \instrument, \background_snare,
        \freq, 300 * Pseq.new(#[1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2], inf),
        \sustain, 0.05,
        \amp, 0.5, 
        \dur, 1/4
);


/*
 * Definitionen der Melodien
 */
~melodie1 = Pbind(
	\instrument, \tone_short,
	\midiPitch, Pseq([57 , 0  , 57 , 60 , 57 , 60 , 57 , 52 , 0  , 52 , 55 , 52 , 55 , 0  ], 4),
	\dur,       Pseq([1.1, 0.3, 0.6, 0.5, 0.5, 0.5, 0.5, 1.2, 0.2, 0.6, 0.5, 0.5, 0.8, 0.2] * 1/2, 4),
	\amp, 0.3,
	\sustain, 1.2
);

/*
 * Die zweite Melodie kann doppelt verwendet werden, da die midi Noten einmal
 * eine Oktave höher vorkommen
 */
~melodie2_midiPitch = [69 , 0  , 72 , 71  , 69  , 71 , 0   , 64   , 0    , 64 , 0  , 64 ];
~melodie2_dur       = [2.1, 0.3, 0.6, 0.45, 0.55, 1.3, 0.13, 0.285, 0.285, 1.3, 0.2, 0.5];

~melodie2_low = Pbind(
        \instrument, \tone_short,
	\midiPitch, Pseq(~melodie2_midiPitch, 4),
	\dur,       Pseq(~melodie2_dur * 1/2, 4),
	\amp, 0.2,
	\sustain, 1.4
);

~melodie2_high = Pbind(
        \instrument, \tone_short,
	\midiPitch, Pseq(~melodie2_midiPitch + 12, 4), // + 12 = um eine Oktave erhöhen
	\dur,       Pseq(~melodie2_dur * 1/2, 4),
	\amp, 0.2,
	\sustain, 1.4
);

~melodie3 = Pbind(
        \instrument, \tone_long,
	\midiPitch, Pseq([69, 67 , 0  , 64, 69, 67, 72, 76 , 77 , 79 ], 1),
	\dur,       Pseq([4 , 3.8, 0.2, 8 , 4 , 4 , 4 , 1.5, 0.5, 2.0] * 1/2, 1),
	\amp, 0.03,
	\sustain, 3.5
);

~melodie4 = Pbind(
        \instrument, \tone_short,
	\midiPitch, Pseq([88  , 84  , 81 , 84 , 88  , 86  , 88 , 89 , 88  , 84  , 81 , 84 , 88 , 0  , 86 , 0  , 88  , 84  , 81 , 84 , 88  , 86  , 88 , 89 , 88  , 84  , 81 , 84 , 88 , 86 , 0  ], 4),
	\dur,       Pseq([0.45, 0.55, 0.5, 0.5, 0.45, 0.55, 0.5, 0.5, 0.45, 0.55, 0.5, 0.5, 0.7, 0.3, 0.9, 0.1, 0.45, 0.55, 0.5, 0.5, 0.45, 0.55, 0.5, 0.5, 0.45, 0.55, 0.5, 0.5, 1.6, 0.3, 0.1] * 1/2, 2),
	\amp, 0.06,
	\sustain, 1.5
);

/*
 * Definition des Outro, besteht aus 2 langen Pfeiftönen
 */
~outro1 = Pbind(
        \instrument, \tone_long,
	\midiPitch, Pseq([93], 1),
	\dur,       Pseq([33] * 1/2, 1),
	\amp, 0.02,
	\sustain, 5.5
);

~outro2 = Pbind(
        \instrument, \tone_long,
	\midiPitch, Pseq([81], 1),
	\dur,       Pseq([33] * 1/2, 1),
	\amp, 0.02,
	\sustain, 5.5
);


// Ablauf des Stückes
Pdef(\the_model, 
	Ppar([
		// Snare und Hintergrund-Snare laufen im ganzen Stück parallel
		~snare, 
		~background_snare,
		Pseq([
			~melodie1, 
			~melodie2_low, 
			~melodie2_low, 
			~melodie3, 
			~melodie2_low,
			~melodie2_high,
			~melodie3,
			~melodie4,
			~melodie4,
			~melodie3,
			~melodie2_low,
			~melodie2_low,
			~melodie4,
			// Das Outro ist mit 2 Pfeiftönen unterlegt
			Ppar([
				~melodie1, 
				~outro1,
				~outro2
			])
		])
	])
);
);


// Hier abspielen
Pdef(\the_model).play


Link to this Page