Strudelify
Here I Go Again cover art

1987 · Saints and Sinners

Here I Go Again

Whitesnake

KeyG majorTempo92 bpm
0:00/0:00
// Here I Go Again — Whitesnake
// 92 bpm, 4/4, key G major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(92/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// 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(`<
  ~@27 A B C B C B D E F G H I@4 J K L M G H B C B C B D E F G H N O N O N O N P I@4 J K L M G H B C B C B D E F G H B C
  B C B D E F G H B C B C B D E F G H Q
>`.pickRestart({
  A: "~@2 c2 d2", B: "g1!2 ~@2 c2!2 ~@2", C: "d2!2 ~@2 c2@2 d2@2", D: "d2!2 ~@2 c2@2 b1@2", E: "a1@8 a1@2 a1@4 b1 c2",
  F: "d2@2 d2!6", G: "a1@6 a1!2 a1@2 a1@4 b1 c2", H: "d2@2 c2 d2", I: "g1!8", J: "g1!4 f#1!4", K: "e1!4 c2@2 b1@2",
  L: "a1@6 a1!2 a1@2 a1@6", M: "d2@2 a1@2 d2@2 d2@2 d2@2 d2@2 d2@2 c2 b1", N: "e1@2 ~ e2@5", O: "a1@2 ~ a1@5",
  P: "a1@2 c2 d2", Q: "g2!2 ~@2 g2 ~@3",
})).s("gm_electric_bass_finger").gain(0.6)

// chords · string ensemble 1 · "Keyb 2"
const string_ensemble_1 = note(`<
  A B C D E F E G H I J K J L M N O P E F E G H I J K J Q R S R S R T ~@14 R S R S R T ~@4 U V U V U V W X Y@4 Z AA ~@4
  R S R S R T ~@4 R S R S R T ~@4 R S R S R T ~@4 AB
>`.pickRestart({
  A: "~ d3 g3 ~@2 a2 f#3@2, [g2,d4,g4,b4]@3 [d2,d4,f#4,a4]@5", B: "~ g2 ~ f#4@2 g4@2 a4, [c2,c4,e4], g4@3 ~@5, ~ c3@3",
  C: "~@2 d3@2 g3@2 ~@4 a2@2 ~@2 g4 f#4, [g2,d4,g4,b4]@3 [d2,d4,f#4]@5, ~@3 a4@4 ~, ~@3 d3", D: "[c2,c3,c4,e4,g4]",
  E: "[g2,d4,g4,b4]@3 [d2,d4,f#4,a4]@5", F: "g4@3 f#4@2 g4@2 a4, [c2,c4,e4]",
  G: "~ g2 c3 [f#3,f#4]@2 g4@2 a4, [c2,c4,e4], g4@3 ~@2 e3@3", H: "[g2,g3,d4,g4,b4]@3 [d2,d3,d4,f#4,a4]@5",
  I: "[e2,e3,c4,e4]@3 [d2,d3,b3,d4] [c2,c3,c4,e4]@2 [b1,b2,b3,d4]@2, g4", J: "[a1,a2,c4,e4,a4]",
  K: "[d2,d3]@14 [c2,c3] [b1,b2], [d4,f#4,a4]", L: "[d2,d3,d4,f#4,a4]!2",
  M: "e4 ~ e5 b4, [e2,e3], b4@3 ~, g4@3 g4@5, ~ e4@3", N: "[a1,a2,c4,e4,a4,a5]@3 [c2,c3,c4,e4,g4,g5]@5, c5",
  O: "[g2,g3,d4,g4]@3 [e2,e3,e4,g4,g5]@5, b4", P: "[a1,a2,c4,e4,a4,a5]@2 [c2,c3,c4,e4,g4,g5] [d2,d3,d4,f#4,a4,a5]",
  Q: "[d2,d3]@6 [c2,c3]!2 [c2,c3]@2 [d2,d3]!2 [d2,d3]@2 [d2,d3]!2, [f#4,a4,d5]", // D C D
  R: "[g1,g2,b3,d4,g4]!2 ~@2 [c2,c3,c4,e4,g4]!2 ~@2", // G C
  S: "[d2,d3,d4,f#4,a4]!2 ~@2 [c2,c3,c4,e4,g4]@2 [d2,d3,d4,f#4,a4]@2", T: "[d2,d3,d4,f#4,a4]!2 ~@6",
  U: "[b4,g5]@3 [b4,f#5]@5", V: "[c5,g5]@3 [c5,a5]@5", W: "[e5,b5]@3 [e5,b5]@5",
  X: "[e5,a5,d6]@2 [e5,a5,d6] [f#5,a5,d6]", Y: "g6", Z: "[d5,g5,b5] [d5,f#5,a5]",
  AA: "[c5,e5,g5]@2 [c5,e5,g5] [b4,d5,f#5]", AB: "[b3,d4,g4]!2 ~@2 [b3,d4,g4] ~@3",
})).s("gm_string_ensemble_1").gain(0.48)

// chords · piano · "El. piano"
const piano = note("<~@2 A B ~@34 C D C D E F ~@22 C D C D E F ~@35>".pickRestart({
  A: "~@14 g2 f#2", B: "[c2,c3,c4]", C: "[d4,g4,b4]@3 [d4,f#4,a4]@5",
  D: "[c4,e4,g4]@3 [c4,d4,f#4]@2 [c4,d4,g4]@2 [c4,d4,a4]", E: "[d4,g4,b4] [d4,f#4,a4]",
  F: "[c4,e4,g4]@2 [c4,e4,g4] [b3,d4,f#4]", // C Bm
})).s("gm_piano").gain(0.4)

// chords · overdriven guitar · "Guitar 1"
const overdriven_guitar = note(`<
  ~@27 A B C B C B D E F E G ~@5 H E I E J B C B C B D E F E K L M N O P Q L R S T U V W X Y I E J B C B C B D E F E J B
  C B C B D E F E G B C B C B D E F E G Z
>`.pickRestart({
  A: "~@6 [c3,g3]!2 [c3,g3]@2 [d3,a3]!2 [d3,a3]@4", B: "[g2,d3]!2 ~@2 [c3,g3]!2 ~@2",
  C: "[d3,a3]!2 ~@2 [c3,g3]@2 [d3,a3]@2", D: "[d3,a3]@2 [d3,a3]@2 ~@4 [c3,g3]@4 b2 c3 b2@2",
  E: "a2!4 [g3,c4] [a3,d4] [g3,c4]@10", F: "[d3,a3]@4 e3 f#3 [a3,d4]@8 ~ a2, ~@7 b2", G: "[d3,a3]@2 [c3,g3] [d3,a3]",
  H: "~@2 c3 b2", I: "[d3,a3]@4 e3 f#3 [a3,d4]@8 c3 b2", J: "[d3,a3]@6 [d3,a3]!2 [c3,g3]@2 [c3,g3]!2 [d3,a3]@4",
  K: "~@2 e3 f#3 a3@2 e3 f#3 b3@8", L: "e4@6 [e3,b3,e4]@7 e2 g2 e2", M: "[a2,e3]@4 ~@2 a3@8 g2 f#2",
  N: "[e2,b2]@4 ~@2 [e2,e3,b3]@7 e2 g2 e2", O: "[a2,e3]@4 [a3,d4] [b3,e4] [b3,e4]@2 [a3,d4]@6 g2 f#2",
  P: "e4@6 [e3,b3,e4]@6 ~ e2 g2 e2", Q: "[a2,e3]@5 e3 g3 e3 b3 g3 a3!2 e3 g3 e3 d3", R: "[a2,e3]@2 [c3,g3] [d3,a3]",
  S: "~@4 b3 c4 ~ d4 a3@6 g4@2", T: "g4 f#4 ~ g4 c4@8 e4 f#4 ~ g4", U: "a4 a4@5 a4 g4 a4 d4 ~ a3!2 d4 ~ a4",
  V: "g4@5 g4 g4@10", W: "a5@4 a5@4 g5 ~ a5 d5@5",
  X: "e3 [f#3,g3] [e3,f#3] [g3,a3] g3 [f#3,g3] [e4,f#4] [g4,a4] [e4,f#4] [g4,a4] [b4,c5] [d5,e5] e5!2 ~ f#5", // Gmaj7 Esus2 Gsus2 Gmaj7 Esus2 Gsus2 Esus2 Gsus2 …
  Y: "a2!4 [g3,c4] [a3,d4] [g3,c4]@10, b5", Z: "[g2,d3]!2 ~@2 [g2,d3] ~@3",
})).s("gm_overdriven_guitar").gain(0.4)

// chords · drawbar organ · "Organ"
const drawbar_organ = note(`<
  ~@34 A B A C ~@6 A B A D ~@6 A B A C E F E F E F G H ~@6 A B A D ~@6 A B A C ~@6 A B A C ~@6 A B A C ~
>`.pickRestart({
  A: "[a4,c5,e5]", B: "[a4,d5,f#5]", C: "[a4,d5,f#5]@2 [c5,e5,g5] [d5,f#5,a5]", D: "[a4,d5,f#5] ~",
  E: "[b3,e4,g4]@3 [b3,e4,f#4]@5", F: "[c4,e4,g4]@3 [c4,e4,a4]@5", G: "[e4,g4,b4]@3 [e4,g4,b4]@5",
  H: "[e4,a4,c5]@2 [e4,a4,c5] [d4,f#4,a4]", // Am D
})).s("gm_drawbar_organ").gain(0.19)

// other · electric guitar clean · "Guitar Clean" · Em
const electric_guitar_clean = note(`<
  ~@38
  [g3@3 g3@2 g3!3]
  [c3@2 g3 f#3@2 g3!3]
  [g3@3 d3@2 g3!3]
  [c3@2 g3 f#3@2 g3!3]
  [g3 d3]
  [[e3,g3]@4 g3!4]
  ~@63
>`).s("gm_electric_guitar_clean").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  ~@27 A B C B C B D E@3 F G@5 H G@3 F B C B C B D E@3 F I@7 F G@5 F G@3 F B C B C B D E@3 F B C B C B D E@3 F B C B C B
  D E@3 F ~
>`.pickRestart({
  A: "~@2 x!2", B: "~@2 x ~@2 x ~@4 x ~@2 x ~@2", C: "~@2 x ~@2 x ~@10", D: "~@2 x ~@2 x ~@2 x ~@3 x ~@3",
  E: "x ~@3 x!2 ~ x", F: "x ~ x!2", G: "x ~@3 x!2 ~@2", H: "x!2", I: "x ~@2 x ~@4",
})).gain(0.6)

// drums · snare
const snare = s("sd").struct(`<
  ~@27 A B@5 C D@3 E D@9 F B@5 C D@3 G D E ~@3 H I ~ D@5 E D@3 F B@5 C D@3 G B@5 C D@3 G B@5 C D@3 F J
>`.pickRestart({
  A: "~@6 x!2 ~@2 x!2 ~@2 x!2", B: "x!4", C: "x ~@3 x ~@7 x ~ x!2", D: "~ x ~ x", E: "~ x ~@2",
  F: "~@4 x ~ x!2 ~@2 x!2 ~@2 x!2", G: "~@4 x ~@5 x!2 ~@2 x!2", H: "~@9 x!7", I: "~@8 x!2 ~@6", J: "x!2 ~@2 x ~@3",
})).gain(0.6)

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

// drums · low tom
const low_tom = s("lt").struct("<~@58 [~@10 x!2 ~@4] [~@10 x ~@2 x ~@2] ~@46 [~@7 x ~@8]>").gain(0.6)

// drums · mid tom
const mid_tom = s("mt").struct("<~@59 A B C D ~ E ~@41 F>".pickRestart({
  A: "~@2 x!2", B: "~@10 x!3 ~ x ~", C: "~@8 x!2 ~ x!2 ~ x ~", D: "~@10 x!5 ~", E: "~@12 x!4", F: "~@4 x!3 ~@9",
})).gain(0.6)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@28 A B A B A C ~@9 D ~@4 A B A B A C ~@22 A B A B A C ~@4 A B A B A C ~@4 A B A B A C ~@5
>`.pickRestart({
  A: "~@3 x ~@3 x", B: "~@3 x ~ x ~ x", C: "~@3 x ~ x ~@2", D: "~@5 x ~ x",
})).gain(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@62 [~ x] ~ [~@10 x!2 ~@4] ~@42>").gain(0.6)

// drums · splash
const splash = s("cr").struct(`<
  ~@27 A ~ A ~ A ~ B C ~@2 A ~@5 A ~@3 A ~ A ~ A ~ B C ~@3 D@7 E C ~@4 A ~@3 A ~ A ~ A ~ B C ~@2 A C A ~ A ~ B C ~@2 A C
  A C A ~ B C ~@2 A F
>`.pickRestart({
  A: "~@2 x!2", B: "~ x", C: "x", D: "x ~@2 x ~@4", E: "x ~ x!2", F: "x!2 ~@2 x ~@3",
})).gain(0.6)

stack(
  bass, string_ensemble_1, piano, overdriven_guitar, drawbar_organ, electric_guitar_clean, kick, snare, hihat, low_tom,
  mid_tom, open_hat, high_tom, splash
)

More by Whitesnake