Strudelify

Love Is Strong

The Rolling Stones

KeyA minorTempo120 bpm
0:00/0:00
// Love Is Strong — The Rolling Stones
// 120 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "CLEAN GTR" electric guitar clean (copy of ch 5 "DISTORTION" distortion guitar); ch 6 "JAZZ GTR" electric guitar jazz (copy of ch 7 "DISTORTION" distortion guitar)
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level. 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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A B C D A B C D A E C F A E C F A B C D A E C F A E C F A B C D G H G H G H I@2 J@4 A E C F A E C F A E C F A E C F
  G H G H G H I@2 J@4 A E C F A E C F A E C F A E C F A E C F A E C F A E C F
>`.pickRestart({
  A: "g1 a1!7", B: "c2!7 e1", C: "g1!7 e1", D: "a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 a1@2 a1 ~", E: "c2!8", F: "a1!8",
  G: "d2!8", H: "d2!3 f2!3 g2!2", I: "[d2!2 ~ c2 ~ a1@11]/2", J: "[g1@2 a1@2 a1@27 ~]/2",
})).s("gm_fretless_bass").gain(0.4)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar = note(`<
  ~ A B C@2 D E F G ~ H I J K L ~ M D E F G ~ H I J K L ~ M D E F G N O N O N O P@2 A Q A R ~ H I J K L ~ M ~ H I J K L
  ~ M N O N O N O P@2 A Q A R ~ H I J K L ~ M ~ H I J K L ~ M ~ H I J K L ~ M K L ~ M
>`.pickRestart({
  A: "[g2,d3,g3] [a2,e3,a3]@3", B: "[c3,g3,c4]@7 ~ d4@6 ~@2, ~@7 c3@9, ~@7 g3@7 ~@2",
  C: "[~@2 b3@2 a3@2 ~@2 b3@2 a3@2 ~@2 b3@2 a3@3 ~ b3@2 a3@8 ~@2, ~@2 d4@4 ~@2 d4@4 ~@2 d4@5 ~ d4@10 ~@2]/2",
  D: "g3 g3@3, [g2,d3]", E: "a3 b3@3 a3@4, c3", F: "~@2 b3 a3 ~ b3 a3 ~, ~@2 d4@2 ~ d4@2 ~",
  G: "b3@2 a3@3 ~ b3@2 a3@8, d4@5 ~ d4@10", H: "c4@5 d4 c4 ~, c3@7 ~, g3 ~@9 g3@4 ~@2",
  I: "~@6 b3@2 a3@5 ~@3, ~@3 d4@4 ~", J: "~@6 a2 ~ a2 ~ a2 ~ a2 ~ a2 ~",
  K: "a2 ~ a2 ~ a2 ~ a2 ~ [e3,a3]@4 [e3,a3]@2 [e3,a3] ~, ~@8 a2@7 ~", L: "a2 ~ a2 ~ a2 ~ [g3,d4]@8 d4 ~",
  M: "[g2,d3,g3]@2 [a2,e3,a3]@5 ~", N: "d3 ~ d3 ~ d3 ~ [d3,a3]@2 d3 ~ d3 ~ [d3,a3]@2 d3 ~",
  O: "d3 ~ d3 ~ d3 ~ d3!2 c3@2 c3@2 g3@2 g3@2, ~@2 f3 d3", P: "[[d3,a3,d4]!2 ~ [c3,g3,c4] ~ [a2,e3,a3]@11]/2",
  Q: "[g2,d3,g3]@2 a2@3 a2!3, ~ [e3,a3]@3", R: "[g2,d3,g3]@2 a2@2 a2!4, ~ [e3,a3]@3",
})).s("gm_distortion_guitar").gain(0.29).pan(1)

// chords · distortion guitar · "DISTORTION"
const distortion_guitar_2 = note(`<
  ~@4 A B C D E F ~@2 G@2 ~ H I J C D E F ~@2 G@2 ~ H I J C D E ~@7 K@3 L ~ F ~@2 G@2 ~ H I F ~@2 G@2 ~ H I ~@8 M@2 N O
  F ~@2 G@2 ~ H I F ~@2 G@2 ~ H I F ~@2 G@2 ~ H I P ~ H I
>`.pickRestart({
  A: "~@2 g3@2 a3 ~ d4@4 d4@4 c4@2", B: "a3@2 g3@2 a3@6 a3 ~@5", C: "~ [a3,d4]", D: "~@4 g4 e4 ~@2",
  E: "g4@2 e4@4 e4@7 [b3,c4,d4] [g3,a3] ~", F: "[g2,d3,g3] [a2,e3,a3]@3",
  G: "[[d3,g3]@2 [e3,a3]@5 [g2,d3,g3]@3 [a2,e3,a3]@6]/2", H: "[d3,g3]@2 ~@4 [d3,g3]@2 ~@2 a3 ~@3 [d4,e4]@2",
  I: "e4@2 e4@2 a4@8 [f4,g4] [c4,d4,e4] [a3,b3] ~", J: "~@2 g3@2 a3@6 a3 ~@5",
  K: "[~@8 d4@2 e4@4 e4@2 d4 c4 a3@2 [g3,c4]@18 c4@2 a3@2 ~@2 a3@2 ~@2, ~@4 a3@3 a3@2 ~@15]/3", L: "~@3 c4 a3 ~ a3 ~",
  M: "[~@4 c4@12 d4 e4 ~@4 c4@2 a3@2 ~@2 a3@2 ~@2, ~@2 g3@9 ~@5, ~@18 a4@13 ~]/2", N: "~@5 [e3,a3] ~@2",
  O: "~ [d3,g3] ~ [e3,a3] ~ [e3,a3]@2 ~", P: "~ [a2,e3,a3]@3",
})).s("gm_distortion_guitar").gain(0.25).pan(0)

// other · harmonica
const harmonica = note("<~@4 A B C D@2 ~@8 E F G H ~@8 I J K L ~@47 M N O P Q B C D@2 R F G H ~@8>".pickRestart({
  A: "~@14 a4 ~", B: "a4@2 f#4@2 a4@9 ~ a4@2", C: "c5 d5 d#5 e5@4 ~", D: "[g5@2 f#5@2 e5@9 e5@5 d5@2 c5@2 a4@8 ~@2]/2",
  E: "d5@2 c5@2 a4@9 ~ a4@2", F: "c5@2 d5@2 d#5!2 e5@9 ~", G: "e5 d5 c5@5 a4", H: "c5@2 a4 ~ a4@2 a4@7 ~@3",
  I: "c5@2 e5@2 e5@4 g5@7 ~", J: "g5 f#5 e5@6", K: "e5 d5 c5@2 a4@2 g4 a4", L: "a4 g4 a4@2 a4@3 ~", M: "~@5 e5@3",
  N: "e5@2 d5@2 c#5@2 a4@7 ~ a4@2", O: "c5 d5 e5 e5@5", P: "e5 d5!2 c5@2 a4@2 f#4", Q: "a4 f#4 a4@2 c5@2 ~ c5",
  R: "a4 c5 a4 a4@2 a4@2 a4",
})).s("gm_harmonica").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~ A@33 B A@3 B A@23 B A@3 B A@3 C A@30>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x!3 ~ x", C: "x ~@2 x!2 ~@3",
})).gain(0.54)

// drums · snare
const snare = s("sd").struct("<A B@31 C B D B@3 D B E B@21 D B@3 D B E B F B@30>".pickRestart({
  A: "~@8 x!5 ~ x ~", B: "~ x ~ x", C: "~@4 x ~@3 x ~ x ~ x!4", D: "~@4 x ~@2 x ~@4 x ~@3", E: "~@2 x ~@2 x!3",
  F: "~@4 x ~@3 x!8",
})).gain(0.61)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A@3 B A@7 B A@3 B A@7 B A@3 B A@3 C ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B ~@8 A D ~@2 A@3 B A@3 B A@3 B A@3 B A@3 B A@3
  B A@3 B
>`.pickRestart({
  A: "~@7 x", B: "~@6 x!2", C: "~ x", D: "~@3 x ~@4",
})).gain(0.41)

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

// drums · ride
const ride = s("rd").struct("<~@33 A B A C A B A C ~@20 A B A C A B A C ~@2 A C ~@28>".pickRestart({
  A: "~ x!7", B: "x!7 ~", C: "x!8",
})).gain(0.41)

// drums · tambourine
const tambourine = s("tb").struct("<~@81 [x!16]!20>").gain(0.34)

stack(bass, distortion_guitar, distortion_guitar_2, harmonica, kick, snare, hihat, open_hat, crash, ride, tambourine)

More by The Rolling Stones