//--------------------------------------
// Musikstück "Ferrous Feel" von ChrisB
//--------------------------------------
//------------------------
//Synthesizer-Definitionen
(
//SynthDef für die Bass-Drum
SynthDef(\drum, { |freq=60, sustain=5, amp=0.1|
var mod, sound, env;
//Modulator für die Sinus-Frequenz:
mod = XLine.kr(freq*2.2, freq, sustain);
env = EnvGen.ar(Env.perc(0.05, sustain, 1, -4), doneAction:2);
//Sinus mit 'mod' als sinkendem Frequenz-Modulator:
sound = SinOsc.ar(mod, 0, amp.dup);
Out.ar(0, sound * env);
};
).store;
//SynthDef für die Snare-Drum
SynthDef(\snare, { |sustain=3, amp=0.5, hard=0|
var sound, env, env2;
env = EnvGen.ar(Env.perc(0, sustain*(1-hard), 1, -12));
env2 = EnvGen.ar(Env.perc(0, sustain*1.5), doneAction: 2);
//Der Sound wird durch den 'Decay' UGen erzeugt. Dieser bekommt als Eingangssignal einen Impuls
//mit der Fequenz 0. Das Signal wird durch graues und weißes Rauschen verstärkt (siehe mul und add Parameter):
sound = Decay.ar(Impulse.ar(0), sustain * 0.1, GrayNoise.ar([1, 1] * 0.3), WhiteNoise.ar(0.1.dup) + 0.3);
//Das Decay-Signal wird mit einem Sägezahn-Signal multipliziert, dessen Frequenz ein Zufallswert von 5 bis 10
//ist. Negative Werte des Sägezahn-Signals werden durch den Wert 1 ersetzt (.max(0) + 1):
sound = sound * (LFSaw.ar(Rand(5, 10)).max(0) + 1) * (env * amp);
Out.ar(0, sound * env2);
};
).store;
//Bass SynthDef für das Bass-Intro
SynthDef(\tremBass, { |gate=1, freq=130.81|
var env, osc, sound;
env = EnvGen.ar(Env.new([0, 1, 0], [0.08, 0.6],'sine'), gate, doneAction:2);
//Ein Sägezahn- und ein Pulse-Signal werden zu einem Kanal zusammengefasst:
osc = Mix([LFSaw.ar(freq * [1, 1]), LFPulse.ar(freq / 2, 0.5)]);
//Das 'osc'-Signal wird durch einen Tiefpass-Filter (Lowpass Filter) bei 150 Hertz abgeschnitten:
sound = LPF.ar(osc, 150, env);
Out.ar(0, sound);
};
).store;
//SynthDef für den "normalen" Bass
//Dieser SynthDef unterscheidet sich zum Bass-Intro SynthDef lediglich durch einen
//anderen Envelope. Hier kommt ein adsr-Envelope zum Einsatz, mit dem ein Anschlag (Lautstärke) erzeugt wird,
//der gleichmäßiger ist:
SynthDef(\bass, { |gate=1, freq=130.81, amp=0.2|
var env, osc, sound;
env = EnvGen.ar(Env.adsr(0.04, 1, 0.7, 0.02, 0.7), gate, doneAction:2);
osc = Mix([LFSaw.ar(freq * [1, 1]), LFPulse.ar(freq / 2, 0.5)]);
sound = LPF.ar(osc, 150, env * amp);
Out.ar(0, sound);
};
).store;
//SynthDef für den "Knister"-Sound
SynthDef(\crackle, {
var env, sound;
env = EnvGen.ar(Env.new([0.1, 1, 0.2, 0.9, 0.4, 0.7, 0.1], [1, 3.5, 3, 4, 3, 1],'sine'), doneAction:2);
//Der Sound wird durch braunes Rauschen multipliziert mit dem Blip-UGen (dt. kurzer Impuls) erzeugt:
sound = BrownNoise.ar(0.1.dup) * Blip.ar(200,100,8,0.7) * env;
Out.ar(0, sound);
};
).store;
//SynthDef für den "Sirenen"-Sound
SynthDef(\siren, {
var env, sound;
env = EnvGen.ar(Env.new([0,0.4],[15.1],'linear'), doneAction:2);
//Der "Sirenen"-Sound entsteht durch ein Sägezahn-Signal, dessen Frequenz durch ein Sinus-Signal
//moduliert wird:
sound = LFSaw.ar(SinOsc.ar(2.12, 0, 60, 190.81), 0, 0.2.dup) * env;
Out.ar(0, sound);
};
).store;
//SynthDef für das tiefe Rauschen
SynthDef(\deepnoise, {
var env, sound, bnoise;
env = EnvGen.ar(Env.new([0.1, 1, 0.3], [0.04, 7.55],'sine'), doneAction:2);
//Das tiefe Rauschen und Knistern wird durch braunes Rauschen multipliziert mit dem
//Blip-UGen (dt. kurzer Impuls) erzeugt. Die Frequenz des Blip-UGens wird durch ein XLine-Signal moduliert:
bnoise = BrownNoise.ar(0.12.dup) * Blip.ar(XLine.kr(200, 100, 3),100,8,0.7);
//Durch einen Bandpass-Filter werden vom 'bnoise'-Signal nur bestimmte Frequenzbereiche durchgelassen:
sound = BPF.ar(bnoise, 1000, 0.3) * env;
Out.ar(0, sound);
};
).store;
//SynthDef für den tiefen Hall-Sound
SynthDef(\reverb, { |sustain=6|
var welle, filter, env, env2, sound;
env = EnvGen.ar(Env.perc(0, sustain, 1, -5));
env2 = EnvGen.ar(Env.perc(0, sustain*45), doneAction: 2);
//rosa Rauschen mit drei verschiedenen Werten für den mul-Parameter
//(-> drei versch. Spektren):
welle = PinkNoise.ar(8 * [1, 1.2, 1.5]).sum * env;
//Durch den Bandpass-Filter werden einige Frequenzen des 'welle'-Signals herausgefiltert:
filter = BPF.ar(welle, LFNoise1.kr(0.01).exprange(523.25, 523.25), 0.05);
//Auf das gefilterte Signal wird ein Delay (Verzögerung - dadurch Hall/Echo) gelegt:
sound = CombL.ar(filter, 1, [0.47, 0.48], 8);
Out.ar(0, sound * env2 * 0.6);
};
).store;
//SynthDef für den Triangel ähnlichen Sound
SynthDef(\triangle, { |sustain=0.05|
var sound, env;
env = EnvGen.kr(Env.perc(0.01, sustain, 0.6), doneAction:2);
//Der Sound entsteht durch die Addition zweier Sinus-Signale mit einem Sägezahnsignal.
//Die Frequenzen der drei Signale entsprechen dem Ton "c" auf drei versch. Oktaven:
sound = SinOsc.ar(523.25, 0, env * 0.1.dup) + SinOsc.ar(1046.5, 0, env * 0.05.dup) +
LFSaw.ar(2093, 0, env * 0.03.dup);
Out.ar(0, sound);
};
).store;
);
//--------------------
//PATTERN-Definitionen
(
Pdef(\bdrum,
Pbind(
\instrument, \drum,
\freq, 62,
\sustain, 0.1,
\dur, Pn(0.5, 8),
\amp, 0.65
)
);
Pdef(\introBdrum,
Pbind(
\instrument, \drum,
\freq, 62,
\sustain, 0.1,
\dur, Pseq([0.22, 0.8, 0.7, 0.84, 0.44, 0.2, 0.8], 1),
\lag, 0.27,
\amp, 0.65
)
);
Pdef(\snaredrum1,
Pbind(
\instrument, \snare,
\hard, 0.8,
\sustain, 4,
\dur, Pn(1, 4),
\lag, 0.5,
\amp, 0.5
)
);
Pdef(\snaredrum2,
Pbind(
\instrument, \snare,
\hard, 0.8,
\sustain, 4,
\dur, Pseq([0.34, 0.66, 0.15, 0.15, 0.7, 1, 1], 1),
\lag, 0.5,
\amp, 0.5
)
);
Pdef(\snaredrum3,
Pbind(
\instrument, \snare,
\hard, 0.8,
\sustain, 4.5,
\dur, Pseq([0.34, 0.66, 1, 1, 1], 1),
\lag, 0.5,
\amp, 0.5
)
);
Pdef(\snaredrum4,
Pbind(
\instrument, \snare,
\hard, 0.8,
\sustain, 4.5,
\dur, Pseq([1, 0.8, 1.2, 1], 1),
\amp, 0.5
)
);
Pdef(\bass1,
Pmono(\bass,
\freq, Pseq([155.56, 130.81, 155.56, 130.81, 174.61, 164.81, 174.61, 164.81], 1),
\dur, Pn(0.5, 8),
\amp, 1
)
);
Pdef(\bass2,
Pmono(\bass,
\freq, Pseq([155.56, 130.81, 155.56, 174.61, 130.81, 130.81, 130.81, 130.81], 1),
\dur, Pn(0.5, 8),
\amp, 1
)
);
Pdef(\bassIntro1,
Pbind(
\instrument, \tremBass,
\freq, Pseq([130.81], 4),
\sustain, 0.08,
\dur, Pseq([1], 8)
)
);
Pdef(\bassIntro2,
Pbind(
\instrument, \tremBass,
\freq, Pseq([174.61, 164.81], 4),
\sustain, 0.08,
\dur, Pseq([1], 4)
)
);
Pdef(\bassIntro3,
Pmono(\bass,
\freq, Pn(65.41, 32),
\dur, Pn(0.5, 32),
\amp, 0.2
)
);
Pdef(\crackleNoise,
Pbind(
\instrument, \crackle,
\dur, Pseq([15.5], 1)
)
);
Pdef(\sirenNoise,
Pbind(
\instrument, \siren,
\dur, Pseq([15.5], 1)
)
);
Pdef(\chorusNoise,
Pbind(
\instrument, \deepnoise,
\dur, Pseq([8], 2)
)
);
Pdef(\reverberation,
Pbind(
\instrument, \reverb,
\sustain, 2,
\dur, Pseq([4], 4),
\lag, 0.5
)
);
Pdef(\highPerc,
Pbind(
\instrument, \triangle,
\sustain, 0.5,
\dur, Pseq([0.66, 0.5, 0.5, 0.34, 0.5, 0.66, 0.84], 1),
\lag, 0.34
)
);
Pdef(\intro1, Ppar([Pdef(\introBdrum), Pdef(\bassIntro1), Pdef(\snaredrum4)]));
Pdef(\intro2, Ppar([Pdef(\introBdrum), Pdef(\bassIntro2), Pdef(\snaredrum4)]));
Pdef(\intro1Bridge, Ppar([Pdef(\introBdrum), Pdef(\snaredrum4)], 4));
Pdef(\bridge, Ppar([Pdef(\intro1Bridge), Pdef(\crackleNoise), Pdef(\sirenNoise), Pdef(\bassIntro3)]));
Pdef(\beat1, Ppar([Pdef(\bdrum), Pdef(\snaredrum1), Pdef(\bass1)]));
Pdef(\beat2, Ppar([Pdef(\bdrum), Pdef(\snaredrum2), Pdef(\bass1)]));
Pdef(\beat3, Ppar([Pdef(\bdrum), Pdef(\snaredrum3), Pdef(\bass1)]));
Pdef(\beat4, Ppar([Pdef(\bdrum), Pdef(\snaredrum1), Pdef(\bass2), Pdef(\highPerc)]));
Pdef(\beatSeq1, Pseq([Pdef(\beat1), Pdef(\beat3), Pdef(\beat1), Pdef(\beat2)]));
Pdef(\beatSeq2, Pseq([Pdef(\beat4), Pdef(\beat4), Pdef(\beat4), Pdef(\beat4)]));
Pdef(\highPercSeq, Pseq([Pdef(\highPerc), Pdef(\highPerc), Pdef(\highPerc), Pdef(\highPerc)]));
Pdef(\clinkyBeat, Ppar([Pdef(\beatSeq1), Pdef(\highPercSeq)]));
Pdef(\noisyBeat1, Ppar([Pdef(\beatSeq1), Pdef(\chorusNoise)]));
Pdef(\noisyBeat2, Ppar([Pdef(\beatSeq1), Pdef(\crackleNoise)]));
Pdef(\noisyBeat3, Ppar([Pdef(\beatSeq1), Pdef(\chorusNoise), Pdef(\reverberation)]));
Pdef(\noisyBeat4, Ppar([Pdef(\beatSeq2), Pdef(\chorusNoise), Pdef(\reverberation)]));
Pdef(\noisyBeat5, Ppar([Pdef(\beatSeq2), Pdef(\chorusNoise), Pdef(\reverberation), Pdef(\crackleNoise)]));
);
//--------------
//Song abspielen
(
Tempo.bpm = 64;
Pseq([ //Intro:
Pdef(\bassIntro1), Pdef(\intro1), Pdef(\intro1), Pdef(\intro2), Pdef(\intro1),
Pdef(\bridge),
//erster Chorus:
Pdef(\noisyBeat1), Pdef(\noisyBeat1), Pdef(\beat4), Pdef(\beat4),
Pdef(\clinkyBeat), Pdef(\noisyBeat2), Pdef(\beat4),
Pdef(\bridge),
//zweiter Chorus:
Pdef(\noisyBeat3), Pdef(\noisyBeat4), Pdef(\noisyBeat5),
//Outro:
Pdef(\intro1), Pdef(\intro1)]).play;
)