/* 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