Created
February 3, 2025 16:25
-
-
Save dzoba/c1aeee86bbaae954a3a11b86c6aec6ee to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
( | |
// Global setup: define scale and state for the melody generator | |
~scaleDegrees = [0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23]; | |
~root = 60; | |
~currentIndex = 7; | |
// Synth Definitions | |
SynthDef(\lead, { |freq=440, amp=0.1, sustain=1, pan=0| | |
var env = EnvGen.kr(Env.linen(attackTime: 0.01, sustainTime: sustain, releaseTime: 0.3), doneAction: 2); | |
var osc = SinOsc.ar(freq) + SinOsc.ar(freq * 1.01); | |
var sig = osc * env * amp * 0.5; | |
Out.ar(0, Pan2.ar(sig, pan)); | |
}).add; | |
SynthDef(\bass, { |freq=110, amp=0.1, sustain=1, pan=0| | |
var env = EnvGen.kr(Env.linen(attackTime: 0.05, sustainTime: sustain, releaseTime: 1.0), doneAction: 2); | |
var fundamental = SinOsc.ar(freq); | |
var harmonic = 0.3 * SinOsc.ar(freq * 2); | |
var sig = (fundamental + harmonic) * env * amp; | |
Out.ar(0, Pan2.ar(sig, pan)); | |
}).add; | |
SynthDef(\perc, { |amp=0.1, pan=0| | |
var env = EnvGen.kr(Env.perc(0.001, 0.05), doneAction: 2); | |
var noise = WhiteNoise.ar() * amp; | |
var click = BPF.ar(noise, 8000, 0.5) * env; | |
Out.ar(0, Pan2.ar(click, pan)); | |
}).add; | |
// Wrap pattern definitions in a function | |
{ | |
var melodyPattern = Pbind( | |
\instrument, \lead, | |
\dur, 0.5, | |
\midinote, Pfunc({ | |
var step = [-2, -1, 1, 2].choose; | |
~currentIndex = (~currentIndex + step).clip(0, ~scaleDegrees.size - 1); | |
~root + ~scaleDegrees[~currentIndex]; | |
}), | |
\amp, Pwhite(0.08, 0.12), | |
\pan, Pwhite(-0.8, 0.8), | |
\legato, 0.8 | |
); | |
var bassPattern = Pbind( | |
\instrument, \bass, | |
\dur, 2.0, | |
\midinote, Pseq([ | |
~root - 12, | |
~root - 12, | |
~root - 5, | |
~root - 12, | |
~root - 12, | |
~root | |
], inf), | |
\amp, 0.1, | |
\pan, 0.0, | |
\legato, 1.5 | |
); | |
var percPattern = Pbind( | |
\instrument, \perc, | |
\dur, 0.25, | |
\degree, Pfunc({ | |
if(0.75.coin, { | |
Rest() | |
}, { | |
0 | |
}) | |
}), | |
\amp, Pwhite(0.05, 0.15), | |
\pan, Pwhite(-0.2, 0.2) | |
); | |
Ppar([melodyPattern, bassPattern, percPattern]).play; | |
}.value; | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment