Strudelify

When Love Comes to Town

U2

KeyE majorTempo118 bpm
0:00/0:00
// When Love Comes to Town — U2
// 118 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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.

// other · overdriven guitar · "Guitar 30"
const overdriven_guitar = note(`<
  ~ A B C D A B C D ~@16 E@4 ~@24 F@2 G@2 F@2 G@2 H@6 ~@2 A B C D A B C D ~@8 I@5 J ~@2 A B C D A B C D A B C D A B C
  ~@9
>`.pickRestart({
  A: "~@2 b5 a5@2 g5 e5 d5", B: "e5 ~", C: "~ b5@2 a5@2 g5 e5 d5", D: "e5 g5 e5@2 ~@4",
  E: "[~@3 f#4 [g#4,g#5]@3 [e4,f#4] [d4,g#4,g#5]@10 ~ d4 [g#3,e4,e5]@2 [g#3,e4,e5]@4 [e3,c#4,c#5]@7 ~@2 f#4 [g#4,g#5]@3 [e4,f#4] [d4,g#4,g#5]@10 ~ d4 [g#3,e4,e5]@2 [g#3,e4,e5]@4 g#3@2 g3 f#3 f3 e3, ~ g#3@16 ~ g#3@2 ~@13 g#3@17 g#3@2 ~@12, ~@2 d4@5 ~@27 d4@6 ~@18 [c#4,c#5]@6, ~@4 g4 ~@3 g4 ~@27 g4 ~@3 g4 ~@23]/4", // G# Esus2 Ddim C#m G# Esus2 Ddim C#m …
  F: "[~@2 [d4,d5]@5 [e4,e5]@3 [d4,d5]@2 [a3,a4]@2 [d4,d5]@2, e3@31 ~]/2", // D E D A D
  G: "[~@2 [d4,d5]@5 [e4,e5]@3 [d4,d5]@2 [g3,g4]@2 [d4,d5]@2, e3]/2", H: "b1 ~@3 c2 ~@3", I: "c2!2 ~@2 c2!2 ~ b1",
  J: "c2!2 ~@2 c2 ~@3",
})).s("gm_overdriven_guitar").gain(0.39).pan(0.7)

// other · overdriven guitar · "Guitar 30" · soft notes
const overdriven_guitar_soft = note("<~@108 A B C D A B C D E>".pickRestart({
  A: "e5 g5 e5@2 ~@4", B: "~@2 b5 a5@2 g5 e5 d5", C: "e5 ~", D: "~ b5@2 a5@2 g5 e5 d5", E: "e5@2 g5@2 e5@5 ~@7",
})).s("gm_overdriven_guitar").gain(0.17).pan(0.7)

// bass · electric bass finger · "Bass 34"
const bass = note(`<
  A B C B D B D B E B E B E B F ~ G H I B E B J ~ A B C B C B C B C B J ~ G H I B E B F ~ G H I B E B J ~ A B C B C B C
  B K H L B D B J ~ M B E B E B E B E B E B E B J ~ N H L B C B J ~ A B D B D B E B E B E B E B E B ~@9
>`.pickRestart({
  A: "~@12 e1 ~ e1@2", B: "d2 e2@2 e1 d2 e2@2 e1", C: "d2@2 e2@4 e1@2 d2@2 e2@2 e1 ~ e1@2", D: "d2 e2@2 e1 d2 e2 e1!2",
  E: "d2@2 e2@4 e1@2 d2@2 e2 ~ e1@2 e1@2", F: "d2@2 e2@4 e1@2 d2@2 e2 ~ e1@2 ~@2", G: "~@6 a1!2",
  H: "g2 a2@2 a1 g2 a2@2 a1", I: "g2@2 a2@4 a1@2 g2@2 a2 ~ e1@2 e1@2", J: "d2 e2@2 e1 d2 e2 e1 ~",
  K: "d2@2 e2@4 e1@2 d2@2 e2@2 a1 ~ a1@2", L: "g2@2 a2@4 a1@2 g2@2 a2@2 e1 ~ e1@2", M: "~@6 e1!2", N: "~@12 a1 ~ a1@2",
})).s("gm_electric_bass_finger").gain(0.5).pan(0.7)

// bass · electric bass finger · "Bass 34" · soft notes
const bass_soft = note("<~@108 A B A B C B C D E>".pickRestart({
  A: "d2@2 e2@4 e1@2 d2@2 e2 ~ e1@2 e1@2", B: "d2 e2@2 e1 d2 e2@2 e1", C: "d2@2 e2@4 e1@2 d2@2 e2@2 e1 ~ e1@2",
  D: "d2@2 e2@4 e1@2 d2@2 e2@2 e2 ~ d2@2", E: "d#2 e2@5 ~@2",
})).s("gm_electric_bass_finger").gain(0.25).pan(0.7)

// other · pad choir · "Choir 92"
const pad_choir = note("<~ A B C D A B C D ~@108>".pickRestart({
  A: "~@2 b4 a4@2 g4 e4 d4", B: "e4 ~", C: "~ b4@2 a4@2 g4 e4 d4", D: "e4 g4 e4@2 ~@4",
})).s("gm_pad_choir").gain(0.35)

// other · brass section · "Brass 62"
const brass_section = note("<~@16 A@2 B@4 ~@22 A@2 B@4 ~@10 A@2 B@4 ~@18 A@2 B@4 ~@27>".pickRestart({
  A: "[~@3 a3@3 ~@2]/2", B: "[~@3 e4@3 ~@2]/2",
})).s("gm_brass_section").gain(0.4)

// other · pad choir · "Choir 92"
const pad_choir_2 = note(`<
  ~ A B C D A E C D ~@16 F@4 ~@24 G@2 H@2 G@2 H@2 ~@8 A E C D A E C D ~@16 A E C D A E C D A E C D A E C ~@9
>`.pickRestart({
  A: "~@2 b5 a5@2 g5 e5 d5", B: "e5@5 ~@3", C: "~ b5@2 a5@2 g5 e5 d5", D: "e5@2 g5@2 e5@5 ~@7", E: "e5@9 ~@7",
  F: "[~@4 g#5@4 g#5@11 ~ e5@2 e5@4 c#5@8 ~@2 g#5@4 g#5@11 ~ e5@2 e5@4 c#5@6]/4", G: "[~@2 d5@5 e5@3 d5@2 a4@2 d5@2]/2",
  H: "[~@2 d5@5 e5@3 d5@2 g4@2 d5@2]/2",
})).s("gm_pad_choir").gain(0.35)

// other · pad choir · "Choir 92" · soft notes
const pad_choir_soft = note("<~@108 A B C D A B C D E>".pickRestart({
  A: "e5 g5 e5@2 ~@4", B: "~@2 b5 a5@2 g5 e5 d5", C: "e5@9 ~@7", D: "~ b5@2 a5@2 g5 e5 d5", E: "e5@2 g5@2 ~ e5@6 ~@5",
})).s("gm_pad_choir").gain(0.15)

// chords · drawbar organ · "Organ 17"
const drawbar_organ = note("<~@25 A@4 ~@24 B@2 C@6 ~@32 A@16 D@2 C@2 ~@4>".pickRestart({
  A: "[b4,e5,g#5]/2", B: "[e5@31 ~]/2", C: "e5/2", D: "[b4,e5]/2",
})).s("gm_drawbar_organ").gain(0.2)

// chords · drawbar organ · "Organ 17" · soft notes
const drawbar_organ_soft = note("<~@109 A@2 B@2 C@2 D@2>".pickRestart({
  A: "g#5/2", B: "[b4,g#5]/2", C: "[b4,e5,g#5]/2", D: "[[b4,e5,g#5]@13 ~@3]/2",
})).s("gm_drawbar_organ").gain(0.1)

// other · overdriven guitar · "Guitar 30"
const overdriven_guitar_2 = note("<~@9 A@6 ~@14 A@6 ~@2 B@2 A@4 ~@34 A@6 ~@34>".pickRestart({
  A: "e3/2", B: "a3/2",
})).s("gm_overdriven_guitar").gain(0.35).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  A B@14 C@2 B@6 C@2 B@10 C@2 B@6 C@2 B@6 C@2 B@14 C@2 B@14 C@2 B@6 C@2 B@15 ~@9
>`.pickRestart({
  A: "~@3 x", B: "~@2 x!2 ~@2 x ~", C: "x!4",
})).gain(0.5).pan(0.3)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@108 [~@2 x!2 ~@2 x ~]!7 [~@2 x!2 ~@3 x] [x!2 ~@6]>").gain(0.25).pan(0.3)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  A ~@15 A ~@7 A ~@11 A ~@7 A ~@7 A ~@15 A ~@15 A ~@7 A ~@11 B ~@3 C D@6 E ~
>`.pickRestart({
  A: "~@5 x ~ x ~ x ~ x ~@4", B: "~@11 x ~@4", C: "x ~@2 x!3 ~@2", D: "x!2", E: "x ~ x!2",
})).gain(0.3).pan(0.3)

// drums · low tom
const low_tom = s("lt").struct("<A B@13 C ~@13 D B@5 C ~@25 E ~@15 D B@5 C ~@25 F G@3 ~@5>".pickRestart({
  A: "~@6 x!2", B: "x!8", C: "x!6 ~@2", D: "~@3 x!5", E: "~@3 x!3 ~@2", F: "~@3 x!4 ~", G: "x!4",
})).gain(0.4).pan(0.3)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@108 [~@7 x] [~ x ~ x ~ x ~ x]!3 [x!8]!3 [x!6 ~@2] ~>").gain(0.15).pan(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@16 A B@5 C ~ A B@3 D ~@7 A B@5 C ~ A B@5 C ~ A B@3 E B@9 C ~ A B@3 E B@3 D ~@7 A B@5 C ~ A B@3 E B@3 E B@3 E B@3 D
  ~@8
>`.pickRestart({
  A: "~@6 x!2", B: "x!8", C: "x!4 ~@4", D: "x!6 ~@2", E: "x!4 ~@2 x!2",
})).gain(0.4).pan(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~ A@7 B A@6 ~@13 B A@6 ~@25 B ~@15 B A@6 ~@34>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x!3 ~@2",
})).gain(0.5).pan(0.3)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@108 [~@3 x!3 ~@2] [~@5 x ~@2]!7 ~>").gain(0.25).pan(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@14 A ~@7 B ~@11 A ~@7 B ~@7 B ~@5 C ~@9 B ~@5 C ~@9 A ~@7 B ~@5 C ~@3 C ~@3 C ~@10 A ~
>`.pickRestart({
  A: "~@3 x", B: "~@2 x!2", C: "~ x",
})).gain(0.5).pan(0.3)

// drums · crash
const crash = s("cr").struct(`<
  A ~@7 A ~@7 A ~@7 A ~@3 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@7 B
>`.pickRestart({
  A: "~@3 x", B: "~ x ~@6",
})).gain(0.5).pan(0.3)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B@13 C ~ A B@5 C ~ A B@9 C ~ A B@5 C ~ A B@5 C ~ A B@13 C ~ A B@13 C ~ A B@5 C ~ A B@14 D@5 ~@5
>`.pickRestart({
  A: "~@6 x!2", B: "x!8", C: "x!6 ~@2", D: "x!4",
})).gain(0.4).pan(0.3)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@107 [~ x ~ x ~ x ~ x]!5 [x!8]!3 [x!6 ~@2] ~>").gain(0.2).pan(0.3)

stack(
  overdriven_guitar, overdriven_guitar_soft, bass, bass_soft, pad_choir, brass_section, pad_choir_2, pad_choir_soft,
  drawbar_organ, drawbar_organ_soft, overdriven_guitar_2, kick, kick_soft, snare, snare_soft, low_tom, low_tom_soft,
  hihat, mid_tom, mid_tom_soft, open_hat, crash, tambourine, tambourine_soft
)

More by U2