Strudelify
Never Say Goodbye cover art

1998 · Slippery When Wet

Never Say Goodbye

Bon Jovi

KeyA majorTempo80 bpm
0:00/0:00
// Never Say Goodbye — Bon Jovi
// 80 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 79 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · pad halo · "Synth"
const pad_halo = note(`<
  ~ A@2 B@2 C ~@3 D ~@7 A@2 B@2 A@2 B@2 A@2 B@2 C ~@3 D ~@7 A@2 B@2 A@2 B@2 A@2 B E A@2 B E A@2 F@2 A@2 B@2 A@2 B@2 A@2
  B@2 A@2 B G@3
>`.pickRestart({
  A: "e4@2 b4 c#5", B: "d5 c#5 b4 a4", C: "e4@3 ~", D: "~@9 a4!2 a5!2 e5!2 a4", E: "[f4,a4,c5] [d4,g4,b4]",
  F: "[g4,b4,d5]@3 [f#4,a4,d5]@5", G: "[d5@4 c#5@5 b4@5 a4@6 a4@27 ~]/3",
})).s("gm_pad_halo").gain(0.52)

// chords · pad poly · "Poly synth."
const pad_poly = note(`<
  ~ A B C D ~@10 E@2 A B C D A B C D A B C D ~@10 E@2 A B C D A B C D A B C F A B C F A B G@2 A B C D A B C D A B C H A
  B C I@3
>`.pickRestart({
  A: "[a3,c#4,e4]", B: "[g#3,c#4,e4]", C: "[a3,d4,f#4]", D: "[a3,d4,f4]", E: "[d5,g5,b5]@3 [d5,f#5,a5]@5",
  F: "[c4,f4,a4] [b3,d4,g4]", G: "[b3,d4,g4]@3 [a3,d4,f#4]@5", H: "[a3,c4,f4] [b3,d4,g4]",
  I: "[[a3,c4,f4]@9 [b3,d4,g4]@11 [a3,c#4,e4]@27 ~]/3", // F G A
})).s("gm_pad_poly").gain(0.48)

// other · distortion guitar · "Guitar"
const distortion_guitar = note(`<
  ~ A B C@2 D@2 E F G H I J K L M@2 N@2 O P N@2 O P A B C@2 D@2 E F G H I J K L M@2 N@2 O P N@2 O@2 Q R S T U V W X Y Z
  AA AB A AC@2 AD A B C AE A B C@2 A B C AF@3
>`.pickRestart({
  A: "e4 b4", B: "e4@2 b4 c#5", C: "d5 c#5 b4 a4", D: "[e4@12 ~@2 b4 g#4]/2", E: "[g4,d5]@2 ~ [g4,d5]",
  F: "[a4,d5,f#5]@12 c#5 d5 a4@2", G: "a4", H: "[c#4,g#4,b4,e5]@8 ~ f#5@3 [c#4,g#4,b4,e5]@4", I: "[g4,d5]@3 [g4,d5]",
  J: "[a4,d5]@8 c#5@3 d5@3 e5@2", K: "[a3,e4,a4]@7 [a3,e4,a4] e4 f#4 a4@6", L: "~ [g#4,b4,e5]@2 ~, c#4",
  M: "g3 b3 d4 d4@2 a4 d4@2", N: "e5 b5", O: "d6 c#6 b5 a5", P: "d6@4 c#6@4 b5@4 a5@3 ~",
  Q: "c#4 e4 a4 b4 d5 c#5 b4 a4", R: "e5@15 ~", S: "d6 c#6 d6 c#6 a5@12", T: "c4@2 f4 g4 a4@4 d4@2 g4 a4 b4@4",
  U: "c#5@2 e5@2 a5@2 b5@2 d6@2 c#6@2 b5 [b5,c#6] a5@2", V: "e6@15 ~", W: "d7 c#7 d7 c#7 a6@12",
  X: "g6@2 d6 g6 a6@2 e6 a6", Y: "a6", Z: "[c#4,g#4]", AA: "[g3,d4]@3 [f#3,d4]@5", AB: "[g3,d4]@3 [d4,a4]@5",
  AC: "[e4@2 b4 c#5@3 b4 a4]/2", AD: "d5@2 c#5@2 b4@2 a4 ~", AE: "d5 c#5 b4@2",
  AF: "[d5@4 c#5@5 b4@5 a4@5 ~ [a3,e4]@27 ~]/3", // A5
})).s("gm_distortion_guitar").gain(0.4)

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D E F G H I J K L M N O P A B C Q A B R D A B C S E F G H I J K L M N O P A B C Q A B R D A B R T U V R W U F
  X Y A B Z AA A B C AB A B AC AD A B R AE@3
>`.pickRestart({
  A: "a1@3 a1 a1@2 b1@2", B: "c#2@3 c#2 c#2@2 e2@2", C: "d2@3 d2 d2@3 a1", D: "d2 e2 f2 g2", E: "a1!2",
  F: "c#2@3 c#2 c#2@4", G: "g2@3 g2!2 g2@2 a1", H: "d2@8 d2 ~ d2@2 c#2@2 b1@2", I: "a1@4 a1 a1@3", J: "c#2@4 c#2 c#2@3",
  K: "g2@4 g2@2 f#2 e2", L: "d2@8 d2 d2@3 c#2@2 b1@2", M: "a1@4 a1@3 b1", N: "c#2@4 c#2 c#2@2 c#2", O: "g2@3 f#2@3 ~@2",
  P: "g2@2 b1@2 c#2@2 d2@4 a1@2 d2!2 a1@2", Q: "d2@3 d2 d2@2 e2@2", R: "d2@3 d2 d2@4", S: "d2@3 e2", T: "f1@3 f1 g1@4",
  U: "a1@3 a1 a1@2 b1 c2", V: "c#2@3 c#2 c#2@3 a1", W: "f1@2 f1!6 g1@2 g1!6", X: "g2@3 f#2@5",
  Y: "g2 b1 c#2 d2@2 a1 d2 a1", Z: "d2@3 d2 d2@3 a2", AA: "d3@3 d3 d3@4", AB: "d2!4 e2!4 f2!4 g2!4",
  AC: "d2@3 d2 d2@3 d2", AD: "f1@2 f1@2 g1@2 g1 b1", AE: "[d2@4 e2@5 f2@5 g2@6 a1@27 ~]/3",
})).s("gm_electric_bass_finger").gain(0.44)

// chords · rock organ · "Organ"
const rock_organ = note("<~@29 A B C D E F G H E I J K ~@38>".pickRestart({
  A: "[a4,c#5,e5]", B: "[g#4,c#5,e5]", C: "[g4,b4,d5]@6 g5 b5", D: "[d5,f#5,a5]", E: "[e5,a5]", F: "[c#5,e5,g#5]",
  G: "[b4,d5,g5]@6 g5 d6", H: "[a5,d6]", I: "~@12 g#4 ~ c#6 [e6,g#6], [c#5,e5,g#5]@13 [c#5,e5]@3, ~@7 g#5",
  J: "[b5,d6,g6]@3 [a5,d6,f#6]@3 ~@2, a6 ~@15", K: "[b5,d6,g6]@3 [a5,d6,f#6]@3 ~@2",
})).s("gm_rock_organ").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B C D A B E C F A B G H@2 I J B K B L B@3 D B@2 M A@2 B E C F A B G H@2 I J B K B L B@3 N B@3 O B P Q R K S T ~
  B@3 H B Q B U V B W X B Q B Y Z ~
>`.pickRestart({
  A: "x!2", B: "x ~@2 x!2 ~@3", C: "x ~@6 x!2 ~@7", D: "x", E: "x ~@3 x ~@2 x", F: "x ~@7 x ~@6 x", G: "x ~@7 x!2 ~@6",
  H: "x ~@3 x!2 ~@2", I: "x ~@2 x ~ x ~@2", J: "x!8", K: "x ~@5 x ~ x ~@6 x", L: "x ~@7 x ~ x!2 ~@4",
  M: "x ~@6 x!2 ~@5 x ~", N: "~@3 x ~@12", O: "x ~@6 x ~@8", P: "x ~@5 x ~ x ~@5 x!2", Q: "x ~@5 x ~ x ~@2 x ~@4",
  R: "~@3 x ~@3 x ~ x!3 ~ x!3", S: "x ~@6 x!2 ~@2 x ~@3 x", T: "x ~@5 x ~@4 x ~@4", U: "~ x!3 ~ x!3 ~ x!3 ~ x!3",
  V: "x ~@5 x ~ x ~ x ~@4 x", W: "x ~@2 x!3 ~@2", X: "x ~@3 x!2 ~@2 x ~@7", Y: "x ~@3 x ~@4 x ~@6", Z: "~ x ~@2",
})).gain(0.36)

// drums · rim
const rim = s("rim").struct("<~@75 [~@10 x ~ x!3 ~] [~@2 x ~@3 x ~@4 x ~@2 x ~] [~ x ~@14] ~>").gain(0.36)

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

// drums · low tom
const low_tom = s("lt").struct("<A ~@15 B ~@3 A ~@7 C ~@11 B ~@3 A ~@3 A ~@3 A ~@7 D ~@11 A ~@2 E F G ~>".pickRestart({
  A: "~@14 x!2", B: "~@15 x", C: "~@13 x!2 ~", D: "~@2 x ~ x ~ x ~ x ~ x ~ x!3 ~", E: "~@10 x ~ x!3 ~", F: "~@7 x",
  G: "~ x ~@14",
})).gain(0.36)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A ~@2 A B ~@11 C ~@7 A ~@2 A B ~@7 B ~@3 B ~@19 B ~@3 D ~@2>".pickRestart({
  A: "~@14 x!2", B: "~@12 x!2 ~@2", C: "~@5 x ~@2", D: "~@11 x ~@4",
})).gain(0.36)

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

// drums · crash
const crash = s("cr").struct(`<
  ~ A@5 ~@7 A ~ B A@2 C ~ C A@3 ~ A@3 B A ~@7 A ~ B A@2 C ~ C A@3 D A ~ A E A@3 F A ~ G A@6 H A F A C A I A@2 B J K L
>`.pickRestart({
  A: "x", B: "x!2", C: "~@3 x", D: "x ~ x!2 ~ x ~@2", E: "~@4 x!2 ~@2", F: "x!4", G: "x ~@2 x ~@4", H: "x ~@2 x",
  I: "x ~@3 x!2 ~@2", J: "x ~@3 x ~@4 x ~@6", K: "~@11 x!5", L: "x!11 ~@5",
})).gain(0.4)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@77 [~@4 x!7 ~@5] [~@11 x!5]>").gain(0.22)

// drums · ride
const ride = s("rd").struct(`<
  ~@4 A B ~@11 C D E F C@3 G B ~@15 C D E F C@3 H C E C I C@3 ~ C E ~@2 C@5 J C ~ C E C K C@2 L ~@3
>`.pickRestart({
  A: "~@12 x!4", B: "x", C: "~ x!7", D: "x!6 ~ x", E: "x!8", F: "x!6 ~@2", G: "~@11 x!5", H: "~@9 x ~@6", I: "x!4 ~@4",
  J: "~ x!5 ~ x", K: "~@2 x!2 ~@4", L: "~ x!4 ~@3",
})).gain(0.36)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@4 [~@8 x!4 ~@4] ~@19 [x!11 ~@5] ~@54>").gain(0.18)

stack(
  pad_halo, pad_poly, distortion_guitar, bass, rock_organ, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, crash,
  crash_soft, ride, ride_soft
)

More by Bon Jovi