//-------------------------------------- // 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; )