Skip to content

Instantly share code, notes, and snippets.

@dzoba
Created February 3, 2025 16:25
Show Gist options
  • Save dzoba/c1aeee86bbaae954a3a11b86c6aec6ee to your computer and use it in GitHub Desktop.
Save dzoba/c1aeee86bbaae954a3a11b86c6aec6ee to your computer and use it in GitHub Desktop.
(
// 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