Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save ajangrahmat/b3c0a25436d347997f07eb628a1799a7 to your computer and use it in GitHub Desktop.

Select an option

Save ajangrahmat/b3c0a25436d347997f07eb628a1799a7 to your computer and use it in GitHub Desktop.
strudle_remix_Music 4 Machines — Clean Version.js
// Music 4 Machines — Clean Version
// Struktur: variasi melodi (tease) → melodi utama masuk
let cpm = 94/4;
// ============================================================
// DRUMS
// ============================================================
let drums_light = stack(
sound(`<bd>*4`).bank("RolandTR909").gain(0.7),
sound("<hh>*8").bank("LinnDrum").gain(0.12)
);
let drums_full = stack(
sound(`<bd>*4, <- sd>*4, <- cp:3>*4`).bank("RolandTR909"),
sound("<- hh>*8").bank("LinnDrum").gain(0.20),
sound("<sh>*8").bank("RolandTR808").gain(0.25)
);
let drums_climax = stack(
sound(`<bd>*4, <sd cp:3>*4, <- cp:3>*4`).bank("RolandTR909"),
sound("<hh>*8").bank("LinnDrum").gain(0.30),
sound("<sh>*8").bank("RolandTR808").gain(0.35),
sound("<cp:3>*8").bank("RolandTR909").gain(0.18)
);
// ============================================================
// BASS
// ============================================================
let bass_intro = cat(
"<c2>*4","<g1>*4","<eb1>*4","<eb1>*4"
).note()
.n(1).sound("gm_synth_bass_1")
.lpf(80).lpenv(2).lpa(.8).lps(.9).lpd(.2)
.gain(0.35);
let bass = cat(
"<c2>*4","<g1>*4","<eb1>*4","<eb1!2 f1!2>*4",
"<c2>*4","<g1!2 bb1!2>*4","<eb1>*4","<f1>*4"
).note()
.n(1).sound("gm_synth_bass_1")
.lpf(200).lpenv(5).lpa(.5).lps(.8).lpd(.1);
let bass_climax = cat(
"<c2>*4","<g1>*4","<eb1>*4","<eb1!2 f1!2>*4"
).note()
.n(1).sound("gm_synth_bass_1")
.lpf(600).lpenv(8).lpa(.3).lps(.7).lpd(.1)
.gain(1.1);
// ============================================================
// MELODI UTAMA (original — tidak diubah)
// ============================================================
let synth_arpeggio = cat(
"<c3 c4 eb5 c3 c4 d5 c3 bb4>*8",
"<g2 g3 bb4 g2 g3 a4 g2 g4>*8",
"<eb2 eb3 g4 eb2 eb3 f4 eb2 g4>*8",
"<eb2 eb3 g4 eb2 eb3 f4 f2 g4>*8",
"<c3 c4 eb5 c3 c4 d5 c3 bb4>*8",
"<g2 g3 bb4 g2 bb4 c5 bb2 g4>*8",
"<eb2 eb3 g4 eb2 eb3 f4 eb2 g4>*8",
"<f2 f3 g4 f2 f3 a4 f2 a4>*8",
).note()
.n(1).sound("gm_pad_poly")
.decay(.95).lpf(5000).lpenv(-3).lpa(.2)
.delay(".3:0.225:0.45")
.room(0.80).rsize(2);
let synth_bass = cat(
"<c3 c4 - c3 c4 - c3 ->*8",
"<g2 g3 - g2 g3 - g2 ->*8",
"<eb2 eb3 - eb2 eb3 - eb2 ->*8",
"<eb2 eb3 - eb2 eb3 - f2 ->*8",
"<c3 c4 - c3 c4 - c3 ->*8",
"<g2 g3 - g2 g3 - bb2 ->*8",
"<eb2 eb3 - eb2 eb3 - eb2 ->*8",
"<f2 f3 - f2 f3 - f2 ->*8"
).note()
.n(0).sound("gm_synth_bass_1")
.attack(.1).decay(.25).release(.25)
.lpf(2250).lpenv(2).lpa(.03).lpr(.2).lpd(.3)
.gain(.5);
let synth_lead = cat(
"<- - eb5 - - d5 - bb4>*8",
"<- - bb4 - - a4 - g4>*8",
"<- - g4 - - f4 - g4>*8",
"<- - g4 - - f4 - g4>*8",
"<- - eb5 - - d5 - bb4>*8",
"<- - bb4 - bb4 c5 - g4>*8",
"<- - g4 - - f4 - g4>*8",
"<- - g4 - - a4 - a4>*8",
).note()
.n(1).sound("gm_pad_metallic")
.decay(.95).delay(".3:0.225:0.45")
.room(0.80).rsize(2).gain(0.60);
// ============================================================
// VARIASI MELODI — tease sebelum melodi utama masuk
// Chord sama (Cm Gm Ebm Fm), tapi rhythm & oktaf beda
// ============================================================
// TEASE A — long notes sparse, satu note per 2 beat
// Kesan: "ini lagu apaan nih?" — penasaran
let tease_A = cat(
"<c4 - eb4 - g4 - eb4 ->*8",
"<g3 - bb3 - d4 - bb3 ->*8",
"<eb3 - g3 - bb3 - g3 ->*8",
"<f3 - a3 - c4 - a3 ->*8"
).note()
.sound("gm_pad_new_age")
.attack(0.8).decay(1.5).release(1.2)
.room(0.90).rsize(4)
.lpf(1500)
.gain(0.55);
// TEASE B — offbeat syncopated, rhythm mulai ada tapi masih tipis
// Kesan: "oh ada groove nih" — mulai anticipate
let tease_B = cat(
"<- eb4 - g4 - d5 - bb4>*8",
"<- bb3 - d4 - a4 - g4>*8",
"<- g3 - bb3 - f4 - g4>*8",
"<- g3 - bb3 - f4 - g4>*8"
).note()
.sound("gm_pad_poly")
.attack(0.15).decay(1.0).release(0.8)
.delay(".25:0.20:0.35")
.room(0.82).rsize(3)
.lpf(2800)
.gain(0.50);
// RISER menuju melodi utama
let riser = note("<c3>*1")
.sound("gm_synth_strings_2")
.attack(4).release(1)
.lpf(cat(300, 800, 2000, 5000, 9000))
.room(0.9).rsize(3)
.gain(0.50);
// Outro pad
let outro_pad = note("<c2 eb2 g2>*1")
.sound("gm_pad_new_age")
.attack(2).release(4)
.room(0.98).rsize(5)
.gain(0.35);
// ============================================================
// SECTIONS
// ============================================================
// [0:00–0:13] Tease A — variasi melodi saja, bass tipis, no drums
// Pendengar belum tau ini lagu apa
let section_tease_A = stack(
bass_intro,
tease_A
);
// [0:13–0:29] Tease B — variasi melodi kedua, drums light masuk
// Mulai ada groove tapi melodi utama belum muncul
let section_tease_B = stack(
drums_light,
bass_intro.gain(0.55),
tease_B
);
// [0:29–0:45] DROP — melodi utama masuk! Full drums, riser sweep
// "Oh INI dia lagunya!" — payoff dari tease
let section_main = stack(
drums_full,
bass,
synth_arpeggio,
synth_bass,
synth_lead.gain(0.55),
riser
);
// [0:45–1:12] KLIMAKS — semua full, gain naik
let section_climax = stack(
drums_climax,
bass_climax,
synth_arpeggio.gain(1.0),
synth_bass.gain(0.70),
synth_lead.gain(0.80)
);
// [1:12–1:29] OUTRO — strip back, dissolve
let section_outro = stack(
sound("<bd>*4").bank("RolandTR909").gain(0.35),
bass_intro.gain(0.25),
synth_arpeggio.lpf(400).gain(0.22),
outro_pad
);
// ============================================================
// ARRANGE — ~1.5 menit @ cpm 31
// ============================================================
arrange(
[6, section_tease_A], // 0:00–0:13 variasi A, ambient
[8, section_tease_B], // 0:13–0:29 variasi B, groove tipis
[8, section_main], // 0:29–0:45 melodi utama DROP 🎵
[12, section_climax], // 0:45–1:12 KLIMAKS 💥
[8, section_outro] // 1:12–1:29 dissolve
).cpm(31.0000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment