Strudelify

Come Take My Hand

2 Brothers on the 4th Floor

KeyG majorTempo168 bpm
0:00/0:00
// Come Take My Hand — 2 Brothers on the 4th Floor
// 168 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 170 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(168/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano
const piano = note(`<
  ~@25 A B C D E F G H A B C D E F G H ~@32 A B C D E F G H A B C D E F G H ~@48 A B C D E F G H A B C D E F G H ~@17
>`.pickRestart({
  A: "~@2 [a4,d5,f5] ~ [a4,d5,f5] ~@3 [a4,d5,f5] ~@2 [a4,d5,f5] ~@2 [a4,d5,f5] ~", // Dm
  B: "~@2 [a4,d5,f5] ~ [a4,d5,f5] ~@3 [a4,d5,f5] ~@2 [a4,d5,f5] ~@2 [a4,d5,g5] ~", // Dm Dsus4
  C: "~@2 [a4,c5,e5] ~ [a4,c5,e5] ~@3 [a4,c5,e5] ~@2 [a4,c5,e5] ~@2 [a4,c5,e5] ~", // Am
  D: "~@2 [a4,c5,e5] ~ [a4,c5,e5] ~@3 [a4,c5,e5] ~@2 [a4,c5,e5] ~@2 [a4,c5,f5] ~", // Am F
  E: "~@2 [c5,e5,g5] ~ [c5,e5,g5] ~@3 [c5,e5,g5] ~@2 [c5,e5,g5] ~@2 [c5,e5,g5] ~", // C
  F: "~@2 [c5,e5,g5] ~ [c5,e5,g5] ~@3 [c5,e5,g5] ~@2 [c5,e5,g5] ~@2 [c5,e5,a5] ~", // C Am
  G: "~@2 [g4,a#4,d5] ~ [g4,a#4,d5] ~@3 [g4,a#4,d5] ~@2 [g4,a#4,d5] ~@2 [g4,a#4,d5] ~", // Gm
  H: "~@2 [g4,a#4,d5] ~ [g4,a#4,d5] ~@3 [g4,a#4,d5] ~@2 [g4,a#4,d5] ~@2 [g4,a#4,e5] ~", // Gm Edim
})).s("gm_piano").gain(0.32)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 ~@16 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2
  M@2 N@2 O@2 P@2 M@2 N@2 O@2 P@2 M@2 Q@2 R@2 S@2 M@2 Q@2 R@2 S@2 ~@16 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 M@2 N@2 O@2 P@2
  M@2 N@2 O@2 P@2 E@2 F@2 G@2 H@2 E@2 F@2 G@2 H@2 ~
>`.pickRestart({
  A: "[d4,a4,d5,f5]/2", B: "[a3,a4,c5,e5]/2", C: "[c4,g4,c5,e5]/2", D: "[g3,g4,a#4,d5]/2", E: "[d4,a4,d5,f5,f6]/2",
  F: "[a3,a4,c5,e5,e6]/2", G: "[c4,g4,c5,e5,g6]/2", H: "[g3,g4,a#4,d5,d6]/2", I: "[[d4,a4,d5,f5], d3 ~]/2",
  J: "[[a3,a4,c5,e5], a2 ~]/2", K: "[[c4,g4,c5,e5], c3 ~]/2", L: "[[g3,g4,a#4,d5], g2 ~]/2",
  M: "[[d4,a4,d5,f5,f6], d3 ~]/2", N: "[[a3,a4,c5,e5,e6], a2 ~]/2", O: "[[c4,g4,c5,e5,g6], c3 ~]/2",
  P: "[[g3,g4,a#4,d5,d6], g2 ~]/2", Q: "[[a4,c5,e5,e6], [a2,a3] ~]/2", R: "[[g4,c5,e5,g6], [c3,c4] ~]/2",
  S: "[[g4,a#4,d5,d6], [g2,g3] ~]/2", // Gm G
})).s("gm_synth_strings_1").gain(0.19)

// other · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~@41 A B A B A B A B A B A B A B A B ~@32 C D E F G H I J C D E F G H I J K L K L K L K L K L K L K L K L ~@49
>`.pickRestart({
  A: "d2@2 ~@2 d2@2 ~@2 d2@3 ~@3 d2@2", B: "~ d2 ~ d2 ~ d2 ~ d2", C: "f4 a3 e4 a3 d4 a3 e4 a3",
  D: "f4 a3 e4 a3 f4 a3 g4 a3", E: "e4 a3 d4 a3 c4 a3 d4 a3", F: "e4 a3 d4 a3 e4 a3 f4 a3",
  G: "g4 c4 f4 c4 e4 c4 f4 c4", H: "g4 c4 f4 c4 g4 c4 a4 c4", I: "d4 g3 c4 g3 a#3 g3 c4 g3",
  J: "d4 g3 c4 g3 d4 g3 e4 g3", K: "[d2,d3]@2 ~@2 [d2,d3]@3 ~ [d2,d3]@3 ~@5", L: "~@5 [a1,a2] ~ [a1,a2]",
})).s("gm_lead_2_sawtooth").gain(0.17).pan(0.6)

// bass · synth bass 1
const bass = note(`<
  ~@41 A@8 B@10 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B F B F B F
  B F B F B F B F B F B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 A@2 G@2 H@2 I@2 ~@9
>`.pickRestart({
  A: "d2@2 d3!2 d2@2 d3!2 d2@2 d3!2 d2@2 d3!2", B: "~@2 d3!2 ~@2 d3!2 ~@2 d3!2 ~@2 d3!2",
  C: "~@2 a2!2 ~@2 a2!2 ~@2 a2!2 ~@2 a2!2", D: "~@2 c3!2 ~@2 c3!2 ~@2 c3!2 ~@2 c3!2",
  E: "~@2 g2!2 ~@2 g2!2 ~@2 g2!2 ~@2 g2!2", F: "~@2 d3!2 ~@2 d3!2 ~@2 a2!2 ~@2 a2!2",
  G: "a1@2 a2!2 a1@2 a2!2 a1@2 a2!2 a1@2 a2!2", H: "c2@2 c3!2 c2@2 c3!2 c2@2 c3!2 c2@2 c3!2",
  I: "g1@2 g2!2 g1@2 g2!2 g1@2 g2!2 g1@2 g2!2",
})).s("gm_synth_bass_1").gain(0.25)

// bass · synth bass 1 · soft notes
const bass_soft = note(`<
  ~@41 A@8 B@10 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B F B F B F
  B F B F B F B F B F B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 B@2 C@2 D@2 E@2 A@2 G@2 H@2 I@2 ~@9
>`.pickRestart({
  A: "d1@2 d2!2 d1@2 d2!2 d1@2 d2!2 d1@2 d2!2", B: "~@2 d2!2 ~@2 d2!2 ~@2 d2!2 ~@2 d2!2",
  C: "~@2 a1!2 ~@2 a1!2 ~@2 a1!2 ~@2 a1!2", D: "~@2 c2!2 ~@2 c2!2 ~@2 c2!2 ~@2 c2!2",
  E: "~@2 g1!2 ~@2 g1!2 ~@2 g1!2 ~@2 g1!2", F: "~@2 d2!2 ~@2 d2!2 ~@2 a1!2 ~@2 a1!2",
  G: "a0@2 a1!2 a0@2 a1!2 a0@2 a1!2 a0@2 a1!2", H: "c1@2 c2!2 c1@2 c2!2 c1@2 c2!2 c1@2 c2!2",
  I: "g0@2 g1!2 g0@2 g1!2 g0@2 g1!2 g0@2 g1!2",
})).s("gm_synth_bass_1").gain(0.13)

// drums · kick
const kick = s("bd").struct(`<
  ~@49 A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A
  B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C ~@17
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~",
})).gain(0.36)

// drums · snare
const snare = s("sd").struct("<~@35 A@6 ~@8 B@35 C A@4 B@59 C A@4 ~@11 C A@4 ~>".pickRestart({
  A: "x!16", B: "~@4 x ~@2 x ~ x ~@2 x ~@3", C: "~ x!15",
})).gain(0.07)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@33 A@2 ~@46 A@3 B ~@60 A@3 B ~@12 A@3 B ~@5>".pickRestart({
  A: "x!16", B: "x",
})).gain(0.04)

// drums · hihat
const hihat = s("hh").struct("<[x!4] ~@48 [x!2 ~ x!3 ~ x!3 ~ x!3 ~ x]!104 ~@17>").gain(0.18)

// drums · open hat
const open_hat = s("oh").struct("<~@49 [~ x ~ x ~ x ~ x]!104 ~@17>").gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@49 [x!16]!104 ~@17>").gain(0.07)

// drums · crash
const crash = s("cr").struct(`<
  ~@39 A B ~@6 A B C ~@5 A B C ~@7 C ~@7 C ~@7 C ~@5 A B C ~@7 C ~@5 A B C ~@7 C ~@5 A B C ~@7 C ~@7 C ~@7 C ~@5 A B C
  ~@7 C ~@5 A B ~
>`.pickRestart({
  A: "x!2", B: "x!4", C: "x",
})).gain(0.32)

stack(
  piano, synth_strings_1, lead_2_sawtooth, bass, bass_soft, kick, snare, snare_soft, hihat, open_hat, tambourine, crash
)

More by 2 Brothers on the 4th Floor