Strudelify

Is This Love

Whitesnake

KeyG majorTempo90 bpm
0:00/0:00
// Is This Love — Whitesnake
// 90 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/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 · "Bass"
const bass = note(`<
  A B C B C B C D@2 B C B C B C D@2 B C B C B C E@2 F G H I F G H J@3 B C B C B C B C B C K@3 F G H I F G H J@3 B C B C
  B C B C B C B C B C K@3 L M N I F G N I L M N I F G N I L M N I F G N I O ~
>`.pickRestart({
  A: "~@14 a1 b1", B: "e1!7 a1", C: "b1@2 b1@2 b1@2 c2@2 c2@2 c2@2 c2@2 a1 b1",
  D: "[c2@2 b1@4 a1@4 g1@4 f1@16 a1 b1]/2", E: "[c2 b1@2 a1@2 g1@2 f1@2 f2 f2@6]/2", F: "c2!8", G: "c2!7 b1", H: "b1!8",
  I: "c2@2 b1@4 a1@4 g1@4 a1 b1", J: "[c2@2 b1@4 a1@4 a1@4 f1@4 f2@2 f2@26 a1 b1]/3",
  K: "[c2 b1@2 a1@2 g1@2 f1@2 f2 f2@5 f1@2 f2 f2@6]/3", L: "c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 c2@2 a1 b1",
  M: "c2@2 c2@2 c2@2 c2@2 c2@2 g2@2 f#2!2 b1 c2", N: "b1@2 b1@2 b1@2 b1@2 b1@2 b1@2 g1 a1 b1 g1", O: "c2",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · piano · "Keyboard 2"
const piano = note(`<
  ~ A B C D@2 B E@2 F B C B C B E@2 F B C B C B E@2 ~@10 G B H B G B G B G B I@3 ~@10 F B J B J B J B J B J B J B I@3
  ~@26
>`.pickRestart({
  A: "~ a4 [d5,f#5,a5]@6", B: "[f#3,a3,d4]@3 [g3,c4,e4]@5", C: "[f#3,a3,d4]@3 [f#3,a3,d4]@5",
  D: "[[f#3,a3,d4]@3 [g3,c4,e4]@4 [f#3,a3,d4]@4 [f#3,a3,d4]@5]/2", // D C D
  E: "[[c4,e4,g4] [a3,d4,f#4]@2 [e4,g4,c5]@2 [d4,g4,b4]@2 [d4,g4,b4]@3 [f4,a4,c5]@6]/2", F: "~ [d4,f#4,a4]@3",
  G: "~ [f#3,a3,d4]@3", H: "~@3 [f#3,a3,d4]@5",
  I: "[[e4,g4,b4] [d4,f#4,a4]@2 [c4,e4,g4]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [e4,a4,c5] [c4,f4,a4]@5 [d4,g4,b4]@2 [e4,a4,c5] [c4,f4,a4]@6]/3", // Em D C G Am F G Am …
  J: "[f#3,a3,d4]", // D
})).s("gm_piano").gain(0.4).pan(0.7)

// other · overdriven guitar · "Dist Guitar 1"
const overdriven_guitar = note(`<
  ~@25 A B C D A B C E@3 ~@13 A B C D A B C E@3 ~@17 A B C D A B C D A B C D A B C D A B C D A B C D F ~
>`.pickRestart({
  A: "[g4,c5,e5] c4!2 [g4,c5,e5] c4!4", B: "[a4,d5,f#5] c4!2 [a4,d5,f#5] c4!3 b3",
  C: "[b4,d5,f#5] b3!2 [b4,d5,f#5] b3!4", D: "c4@2 b3@2 ~@2 a3@4 g3@4 a3 b3",
  E: "[c4 b3 ~ a3@2 g3@2 f3@2 f3 f3@12 ~@2]/3", F: "[g4,c5,e5] ~@7",
})).s("gm_overdriven_guitar").gain(0.46).pan(0.4)

// other · guitar harmonics · "Guitar Harm"
const guitar_harmonics = note("<~ A ~ B ~ C ~@5 D ~ E ~@5 D ~ E ~@13 A ~ B ~ F ~ G@2 C ~@14 A ~@42>".pickRestart({
  A: "e3 a3 d4 ~@5", B: "~ g3 f#3 d3@2 a2@3", C: "~ a2 f#3 d3@4 ~", D: "~@2 f#3 d3@2 a2@3", E: "~ a2 g3 d3@2 a2@3",
  F: "~@2 f#3 d3@4 ~", G: "[~@5 b2@2 e3@4 ~@5]/2",
})).s("gm_guitar_harmonics").gain(0.32).pan(0.3)

// chords · string ensemble 1 · "Keyboard 3"
const string_ensemble_1 = note(`<
  A@2 ~@23 B C@2 D B C@2 E@3 ~@13 B C@2 D B C@2 E@3 ~@17 B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B ~
>`.pickRestart({
  A: "[f#4,b4,e5]", B: "~ f#5 g5 d6@4 ~, [e4,g4,c5]", C: "~ f#5 g5 d6@4 ~, [d4,f#4,a4]",
  D: "[e4,g4,b4] [d4,f#4,a4]@2 [c4,e4,g4]@2 [d4,g4,b4]@3", // Em D C G
  E: "[[e4,g4,b4] [d4,f#4,a4]@2 [c4,e4,g4]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [e4,a4,c5] ~@5 [b3,d4,g4]@3 [c4,d4,a4]@6, ~@5 [c4,f4,a4]@2 ~@5, ~@3 [c5,e5,g5]@2 ~]/3", // Em D C G Am G D7 F …
})).s("gm_string_ensemble_1").gain(0.36).pan(0.6)

// chords · distortion guitar · "Lead Guitar"
const distortion_guitar = note(`<
  ~@28 A B ~@2 C@3 D E F G H ~@11 A B ~@2 C@3 I@2 J K L@2 M@4 N O P Q R@3 ~@3 S T ~@2 S ~@3 S T ~@2 S ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "[e5,g5] [d5,f#5]@2 [c5,e5]@2 [g4,d5]@3", B: "[g4,c5]",
  C: "[[e5,g5] [d5,f#5]@2 [c5,e5]@2 [g4,d5]@2 [g4,d5]@2 [c5,e5] [c5,e5]@12 ~@2]/3", D: "[b4,g5]@10 [b4,g5]@3 [b4,g5]@3",
  E: "[a4,f#5]@10 [a4,f#5]@3 [b4,g5]@3", F: "[g4,e5]@10 [b4,e5]@3 [c5,f#5]@3", G: "[a4,d5] [f#4,b4]", H: "[d4,a4]",
  I: "[g4 g4@14 g4]/2", J: "f#4!4", K: "f#4@4 f#4@4 f#4 g4 f#4 d4@3 e3 [f#3,a3]",
  L: "[[b3,d4] f#4 g4 a4 b4@4 e5@4 e5@2 a4@8 d5@5 d5 d5@4]/2", // Bm
  M: "[d5!2 b4 d5 f#5!2 e5 d5 a4 g4 a4 e4 g4!2 e4@10 ~ b4 e5 b4 f#5 b4 g5 g5@14 f#5 g5@8 b4@2 e5 ~ b4 f#5 b4 g5 ~ b4]/4",
  N: "a5@10 a5@4 a5 g5", O: "a5@8 ~@2 d5!2 c6@4", P: "c6!2 b5!3 g5 d5!2 e5 f#5 f#5@3 f#5 e5!2",
  Q: "e4 e5 d4 a5 c6 b5 a5 g5!4 e5 [d5,e5] [c5,d5] [a4,b4] [g4,a4]", // Dsus2 Csus2 Asus2 Gsus2
  R: "[[b4,e5,g5] [d5,f#5]@2 [c5,e5]@2 [b4,f#5]@2 [b4,f#5]@2 [c5,g5] [c5,e5]@14]/3", // Em D C B5 C5 C
  S: "[e5,g5] [d5,f#5]@2 [c5,e5]@2 [b4,d5]@3", T: "[c5,e5]",
})).s("gm_distortion_guitar").gain(0.46)

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

// drums · snare
const snare = s("sd").struct("<~ A@7 ~ A@7 ~ A@7 ~ A@8 ~@2 A@3 B A@7 ~@2 A@8 ~@2 A@15 ~@2 A@24 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2",
})).gain(0.8)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@6 ~@2 A@6 ~@2 A@6 ~@2 A@3 ~ A@3 ~@3 A@10 ~@3 A@3 ~ A@3 ~@3 A@14 ~@3 A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ A@3 ~ B ~
>`.pickRestart({
  A: "x!8", B: "x",
})).gain(0.8)

// drums · low tom
const low_tom = s("lt").struct("<A ~@7 B ~@7 B ~@7 B ~@9 B ~@12 B ~@9 B ~@16 B ~@26>".pickRestart({
  A: "~@14 x!2", B: "~@3 x",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@5 B ~ A ~@5 B ~ A ~@5 B C A ~@2 B ~@3 B C ~ A ~@9 B D C A ~@2 B ~@3 B C ~ A ~@13 B D C A ~@2 B A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B A ~@2 B A ~
>`.pickRestart({
  A: "x", B: "x!2 ~ x ~ x ~ x", C: "~ x!2 ~@5", D: "~ x!2 ~@4 x",
})).gain(0.8)

stack(
  bass, piano, overdriven_guitar, guitar_harmonics, string_ensemble_1, distortion_guitar, kick, snare, hihat, low_tom,
  crash
)

More by Whitesnake