Strudelify

Take Me Home

Phil Collins

KeyE♭ majorTempo120 bpm
0:00/0:00
// Take Me Home — Collins Phil
// 120 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 136 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@23 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ C@2 A@8 D@2 E F G H C@2 A@6 C@2 A@8 B ~ A@2 B ~ A@2 B ~ A@2 B ~ C@2 A@12 D@2 E F
  G H A@2 D@2 A@2 D@2 I@8 J@4 I@2 K@2 ~@5
>`.pickRestart({
  A: "[eb1@31 ~]/2", B: "~@4 eb3 f3 eb3@9 ~", C: "[eb1@15 ~]/2", D: "[eb1@29 ~@3]/2", E: "[f1,f2]", F: "[g1,g2]",
  G: "[ab1,ab2]", H: "[f1,f2]@7 ~", I: "[[eb1,eb2]@15 ~]/2", J: "[[eb1,eb2]@31 ~]/2", K: "[[eb1,eb2]@29 ~@3]/2",
})).s("gm_electric_bass_finger").gain(0.42)

// chords · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  ~@3 A B C D A B C E A B C E A B C E A B C E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N O P Q R S T U N V P W ~@4 A B C E A B C
  E A B C E A B C E F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N O P Q N O P Q R S T U N V P W ~@4 N O P Q N O P Q X@2 Y@8 Z@4 X@2
  ~@5
>`.pickRestart({
  A: "[eb2,eb3,bb3,eb4,g4]@15 ~", B: "[eb2,eb3,bb3,d4,f4]@15 ~", C: "[eb2,eb3,db4,f4,ab4]@15 ~",
  D: "[eb2,eb3,c4,eb4,ab4]", E: "[eb2,eb3,c4,eb4,ab4]@15 ~", F: "[[c4,eb4,bb4]@8 [c4,eb4,ab4]@7 ~, eb3@15 ~]/2",
  G: "[eb3@2 ~@2 eb3 f3 ~@12 [eb1,eb2]@13 ~, [bb3,eb4,g4]@31 ~, ~@6 eb3@25 ~]/2", // Eb
  H: "[[c4,bb4]@16 [c4,eb4,ab4]@15 ~, eb3@31 ~, eb4@7 ~@9]/2", // C7 Ab
  I: "[eb3@3 ~ eb3 f3 ~@12 [eb1,eb2]@13 ~, [bb3,eb4,g4]@15 ~, eb2 ~, ~@3 eb3@12 ~]/2", // Eb
  J: "[[eb4,ab4,c5,eb5]@15 ~ [f4,ab4,db5]@6 ~@2 [eb4,ab4,c5]@8, eb3@15 ~, ~@16 eb5@15 ~]/2", // Ab Db Ab
  K: "[eb3@2 ~@2 eb3 f3 ~@12 [eb1,eb2]@13 ~, [eb4,g4,bb4,eb5]@31 ~, eb2 ~, ~@6 eb3@25 ~]/2", // Eb
  L: "[[eb4,ab4,c5,eb5]@15 ~ [f4,ab4,db5,eb5]@7 ~ [eb4,ab4,c5,eb5]@8, eb3@31 ~, db5 ~@31]/2", // Ab Db Ab
  M: "[eb3@3 ~ eb3 f3 ~@22 bb3@4, [eb4,g4,bb4,eb5]@13 ~@3, eb2@16 ~@2 [eb1,eb2]@13 ~, ~@3 eb3@12 ~]/2", // Eb
  N: "[bb3,eb4,g4]@15 ~", O: "[bb3,eb4,g4]@5 ~ [bb3,d4,f4]@6 [eb4,g4] ~@3, ~@6 bb3 ~", P: "[ab3,c4,eb4]",
  Q: "[ab4,bb4,eb5]", R: "[bb3,eb4,g4]@7 ~", S: "[bb3,eb4,g4]@5 ~ [bb3,f4]@6 [bb3,eb4,g4] ~@3, ~@3 d4@2 ~@3",
  T: "[ab3,c4,eb4]@15 ~", U: "[c4,eb4,ab4]@5 ~@3 [eb4,f4]@6 ~@2, ~@2 ab3 ~",
  V: "[bb3,eb4,g4]@3 [bb3,f4]@3 [bb3,eb4] ~, ~@6 d4@4 ~@2 g4 ~@3", W: "[f3,bb3,d4]", X: "[[ab3,c4,eb4,f4]@27 ~@5]/2",
  Y: "[[ab3,c4,eb4,f4]@7 ~]/2", Z: "[[ab3,c4,eb4,f4]@29 ~@3]/2",
})).s("gm_epiano2").gain(0.22)

// other · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~@23 A B@3 A C@3 D E F@2 G D H@2 I@2 J@2 ~ K L@2 ~ M N O P Q R P S@8 T@4 U@4 A N V@2 A W X@2 Y D H@2 Z E H@2 I@2 AA@2
  ~ K AB@2 ~ K AC@2 AD K N O P AE R P AF AG AH AI AD K AJ@2 AK AL AM AN A AO AP@3 AL AP@3 AL AA@2 ~@5
>`.pickRestart({
  A: "f4", B: "[eb4@17 [eb2,g2,bb2,eb3] ~@6]/3", C: "[eb4@17 [eb2,bb2,eb3] ~@6]/3", D: "c5", E: "db5 c5",
  F: "[bb4@9 [eb2,bb2,eb3] ~@6]/2", G: "c5@15 ~", H: "[bb4@18 [eb2,bb2,eb3]@3 ~@11]/2", I: "[g4@11 f4@3 g4@2]/2",
  J: "[eb4@31 ~]/2", K: "g4@3 f4@3 g4@2", L: "[eb4@29 ~@3]/2", M: "g4@5 ~ f4@6 g4@4", N: "eb4", O: "[eb3,bb3]", P: "f2",
  Q: "g2", R: "ab2", S: "[[eb2,bb2,eb3]@31 ~]/4", T: "[[eb2,bb2,eb3]@63 ~]/4", U: "[[eb2,bb2], eb3@57 ~@7]/4",
  V: "[bb3@18 [eb2,bb2,eb3]@3 ~@11, ~@18 g2 ~@13]/2", W: "eb4@7 c4", X: "[bb3@9 [eb2,bb2,eb3]@2 ~@5]/2",
  Y: "c5@13 eb4 ab4 c5", Z: "c5@3 eb5", AA: "[eb4@25 ~@7]/2", AB: "eb4/2",
  AC: "[eb4@24 ab4 eb4 bb4 eb5 ~ eb4 bb4 eb5]/2", AD: "bb4", AE: "g2@15 ~", AF: "[eb2,bb2]", AG: "g4@6 f4@6 g4@3 ~",
  AH: "eb4@8 ~ eb4 ab4 eb4 bb4 eb4 eb5 ab4", AI: "~ ab4 bb4 eb5 bb4 eb5 f5 bb4 ab5 g5 eb5 bb4 ab4 g4 ab4 eb5, eb5 ~@7",
  AJ: "[eb4@6 c4 eb4]/2", AK: "f3", AL: "~@8 c4@4 eb4@3 ~", AM: "eb4@15 ~", AN: "eb4@13 bb3 eb4 g4",
  AO: "eb4@8 c4@4 eb4@3 ~", AP: "[eb4@11 ~@5]/3",
})).s("gm_distortion_guitar").gain(0.35).pan(0.4)

// other · xylophone
const xylophone = note(`<
  A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C ~@4 B C B C B C
  B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C ~@4 B C B C B C B C B C B C B C B
  C B C B C B C B D ~@5
>`.pickRestart({
  A: "~@14 eb5!2", B: "bb5!2 eb5!2 bb5!2 eb5!2 eb6 ~@2 eb6 ~@2 eb5!2",
  C: "bb5!2 eb5!2 bb5!2 eb5!2 eb6!2 ~ eb6 ~@2 eb5!2", D: "bb5!2 eb5!2 bb5!2 eb5!2 eb6!2 ~@6",
})).s("gm_xylophone").gain(0.25).pan(0.7)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@39 A@2 B@2 C@2 B@2 D@2 E F G H I J ~@32 A@2 B@2 A@2 B@2 C@2 B@2 D@2 E F G H I J A@2 B@2 A@2 B@2 K@8 ~@13
>`.pickRestart({
  A: "[bb3, g3@15 ~]/2", B: "[ab3,c4]/2", C: "[g3,bb3]/2", D: "[[g3,bb3]@31 ~]/2", E: "[ab3,c4]@15 ~", F: "[f3,bb3,d4]",
  G: "[ab3,c4,eb4]@15 ~", H: "[bb3,eb4]", I: "[ab3,db4,f4]", J: "[ab3,c4,eb4]@7 ~",
  K: "[[g3,bb3]@31 ~ [ab3,c4]@32 ~@64, bb5]/8", // Gm Ab
})).s("gm_synth_strings_2").gain(0.25)

// bass · slap bass 2 · "SLAPBASS 2"
const bass_2 = note("<~@26 A ~@3 A ~@3 A ~@3 A ~@35 A ~@3 A ~@3 A ~@3 A ~@20 B@2 C@2 D@2 E@2 ~@21>".pickRestart({
  A: "~@2 [eb2,eb3] ~@13", B: "[~@12 eb3@19 ~]/2", C: "[~@6 eb3@9 ~]/2", D: "[~@3 eb3@4 ~]/2", E: "[~@12 eb3@15 ~@5]/2",
})).s("gm_slap_bass_2").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@37 B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C
  B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B ~@5
>`.pickRestart({
  A: "x", B: "x!2 ~@6", C: "x!2 ~@2",
})).gain(0.35)

// drums · clap
const clap = s("cp").struct("<~ [~ x]!130 ~@5>").gain(0.35)

// drums · snare
const snare = s("sd").struct(`<
  ~@26 A ~@3 A ~@3 A ~@3 A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B
  C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B D ~@5
>`.pickRestart({
  A: "~ x ~@6", B: "~@8 x ~@2 x ~@2 x!2", C: "~@8 x!2 ~ x ~@2 x ~", D: "~@8 x!2 ~@6",
})).gain(0.2)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@40 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@7
>`.pickRestart({
  A: "~@15 x",
})).gain(0.1)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A C D A D A D A D A D A D A D A D A D A D A
  D A D A D A D A D A D A D A D A D A D A D A D A D A D A D A D A E A D A E A D A E A D A D A D A E A D A E A D A D A D
  A D A D A D A D A D A D A ~@5
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~@6", C: "~ x ~@5 x", D: "~@3 x!2 ~@11", E: "~@3 x!2 ~ x!2 ~@8",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~ [x!16]!129 [x!11 ~@5] ~@5>").gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B C@52 D C@3 D C@3 D C@7 D C@3 D C@18 E
  ~@5
>`.pickRestart({
  A: "~@3 x ~@11 x", B: "~@11 x!2 ~@3", C: "~@2 x ~@11 x!2", D: "~@2 x ~@2 x ~@8 x!2", E: "~ x ~@6",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A ~ C@52 D C@3 D C@3 D C@7 D C@3 D C@18 ~@6
>`.pickRestart({
  A: "~@2 x ~@5 x ~@2 x ~@2 x ~", B: "~@8 x ~@2 x ~@2 x ~", C: "~@13 x ~@2", D: "~ x ~@11 x ~@2",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct("<~@39 A ~@47 A ~@7 A ~@7 A ~@3 A ~@3 B ~@3 A ~@20>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.25)

// drums · congas
const congas = s("conga:33").struct("<~ [~@8 x ~@2 x ~@2 x ~]!129 [~ x] ~@5>").gain(0.79)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!2 ~@14]!37 ~@98>").gain(1.51)

stack(
  bass, epiano2, distortion_guitar, xylophone, synth_strings_2, bass_2, kick, clap, snare, snare_soft, low_tom, hihat,
  mid_tom, high_tom, crash, congas, cabasa
)

More by Phil Collins