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