Strudelify
I Will Follow cover art

Boy

I Will Follow

U2

KeyE♭ majorTempo155 bpm
0:00/0:00
// I Will Follow — U2
// 155 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 135 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(155/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, A@4 for four bars: edit a riff to change every repeat.

// other · guitar harmonics · "guitarra 1"
const guitar_harmonics = note("<~@80 A B C B A B C B A B C B A B C B ~@39>".pickRestart({
  A: "eb3@15 ~", B: "bb3", C: "eb4",
})).s("gm_guitar_harmonics").gain(0.31)

// chords · overdriven guitar · "guitarra 2"
const overdriven_guitar = note(`<
  ~@4 A B A C ~@4 A B A C ~@12 A B A C ~@8 D E D F G E D H@2 B A C ~@12 D E D F G E D H@2 B A C ~@28 A B A C ~@4 D E D F
  G E D H@2 B A C ~@4 A B A C ~@3
>`.pickRestart({
  A: "[eb4,bb4]!8", B: "[eb4,ab4]!4 ~@3 eb5, ~ eb4, ~@2 ab4!2, ~@5 eb5@2 ~",
  C: "[eb4,ab4]!2 ~@4 db5@2, ~ eb4@3, ~ ab4 ab4@2, ~@3 eb5@2 eb5@3", D: "~ eb4@2 ab4@2 eb4@3, bb3",
  E: "~@2 eb4@4 gb4@4 eb4@5 ~, bb3@15 ~", F: "~ eb4@2 gb4@2 eb4@2 ~, bb3@15 ~", G: "~ eb4@2 bb4@2 eb4@3, bb3@15 ~",
  H: "[~@2 eb4@4 gb4@4 eb4@3 ~@3 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2 [eb4,bb4]@2, bb3]/2", // Eb5
})).s("gm_overdriven_guitar").gain(0.36)

// chords · overdriven guitar · "guitarra 3"
const overdriven_guitar_2 = note(`<
  A B A C ~@4 A B A C ~@12 A B A C ~@12 D@7 E@2 ~@3 A B A C ~@8 D@7 E@2 ~@3 A B A C ~@16 F G H I H I H I ~@4 A B A C J@8
  ~@4 A B A C ~@4 A B K
>`.pickRestart({
  A: "[eb4,bb4]!8", B: "[eb4,ab4]!4 ~@3 eb5, ~ eb4, ~@2 ab4!2, ~@5 eb5@2 ~",
  C: "[eb4,ab4]!2 ~@4 db5@2, ~ eb4@3, ~ ab4 ab4@2, ~@3 eb5@2 eb5@3", D: "[eb3,bb3]", E: "[eb3,bb3]/2",
  F: "bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~", G: "ab4 ~ ab4 ~ ab4 ~ ab4 ~ ab4 ~ ab4 ~ ab4 ~ ab4 ~",
  H: "[eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4] ~", // Eb5
  I: "[eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~ [eb4,ab4] ~", // Ab5
  J: "[eb3,bb3] ~@15", K: "[eb4,bb4] ~ [eb4,bb4] ~ [eb4,bb4]@4 ~@8",
})).s("gm_overdriven_guitar").gain(0.36)

// other · overdriven guitar · "guitarra 4"
const overdriven_guitar_3 = note("<~@16 A B C@2 A B C@2 ~@8 A B C@2 A B C@2 ~@16 A B C@2 A B C@2 ~@71>".pickRestart({
  A: "eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4 ~ eb4@2", B: "~@5 bb3@3, ab3@5 ~@3, ~@3 eb4@5",
  C: "[~ eb4@2 ab4@2 ~@2 db4@9, bb3, ~@5 eb4@11]/2",
})).s("gm_overdriven_guitar").gain(0.36)

// bass · electric bass finger · "baixo"
const bass = note(`<
  ~@8 A B C D A B C D A E A E A E A E A B C D A B C D A E A E A E A E F G F G F G F G A B C D A B C D A E A E A E A E F
  G F G F G F G A B C D A B C D H I H I H J H J H I H I H J H K H I H I H I H I A B C D A B C D F G F G F G F G A E A E
  A B C D A B C D A B L
>`.pickRestart({
  A: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~", B: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  C: "eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2 ~ eb2@2", D: "ab2@3 db2@3 db2@2",
  E: "ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~ ab2 ~", F: "eb2 ~ eb2@2 bb2@2 eb2 ~ eb2@2 bb2@2 eb2@2 bb2@2",
  G: "ab2 ~ ab2@2 eb3@2 ab2 ~ ab2@2 eb3@2 ab2@2 eb3@2", H: "eb1", I: "bb1@4 bb1@2 db2@3 ~ db2@2 bb1@4",
  J: "gb1@3 ~ gb1@2 db2@3 ~ db2@2 gb1@4", K: "gb1@3 ~ gb1@2 db2@2 ~@2 db2@2 gb1@4", L: "eb2 ~ eb2@5 ~@9",
})).s("gm_electric_bass_finger").gain(0.36)

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

// drums · snare
const snare = s("sd").struct(`<
  ~@7 A B C B D B C B D B C B C B C B D B C B D B C B D B C B C B C B D E F@2 B E F@2 D B C B D B C B D B C B C B C B D
  E F@2 B E F@2 D B C B D B C B D ~@18 B@5 A B C B D B C B D E F@2 B E F@2 D B C B D B C B D B C B D B G ~
>`.pickRestart({
  A: "~@4 x ~ x ~@5 x!3 ~", B: "~ x ~ x", C: "~@2 x ~@2 x ~ x", D: "~@4 x ~@3 x!3 ~ x!3 ~", E: "~ x!3", F: "x!2 ~ x",
  G: "~@2 x ~@2 x!2 ~",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A B A C A B A C A B A B A B A C A B A C A B A C A B A B A B A C A@7 C A B A C A B A C A B A B A B A C A@7 C A B A
  C A B A C ~@18 A@5 ~ A B A C A B A C A@7 C A B A C A B A C A B A C A D ~
>`.pickRestart({
  A: "x!8", B: "x!5 ~ x ~", C: "x!4 ~@4", D: "x!5 ~@3",
})).gain(0.26)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@80 [x!4]!18 ~@37>").gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A ~ B ~ C ~@95 C ~@31>".pickRestart({
  A: "~@15 x", B: "x ~@5 x ~@5 x ~@2 x", C: "x!2 ~@2 x!2 ~@2",
})).gain(0.41)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A ~@3 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@27 A ~@3 A ~@7 A ~@3 A ~@3 A ~@3 A ~
  B ~
>`.pickRestart({
  A: "~@2 x!2", B: "~@5 x ~@2",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@2 x!6] [x!8]!3 [x!2 ~@2 x!2 ~@2] ~@95 [x!2 ~@2 x!2 ~@2] ~@31>").gain(0.31)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@23 A ~@3 A ~@11 A ~@3 A ~@3 A ~@3 A B A
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.31)

stack(
  guitar_harmonics, overdriven_guitar, overdriven_guitar_2, overdriven_guitar_3, bass, kick, snare, hihat, hihat_soft,
  mid_tom, open_hat, high_tom, crash
)

More by U2