Strudelify
If Tomorrow Never Comes cover art

Have Guitar--Will Travel

If Tomorrow Never Comes

Brooks Garth

KeyG majorTempo70 bpm
0:00/0:00
// If Tomorrow Never Comes — Brooks Garth
// 70 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 78 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70/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 D E F G H I B J K E F L H F B M N O P Q R S T M U V W J D X B C Y I B C D E F G H I B J K E F L H F B M N O P
  Q R S T M U V W J D X B Z AA AB AC@3 ~
>`.pickRestart({
  A: "~@2 g1!2", B: "g1", C: "a1", D: "d2 d1", E: "g1@4 g1@3 d1", F: "g1!2", G: "f#2 a1", H: "d2 c2",
  I: "g1 d2 g2 d2 g1@4", J: "a1!2", K: "d2@2 d1 d2", L: "d2 a1", M: "c2@3 c2 g1@3 g1", N: "c1@2 c2 c1",
  O: "g1@3 g1 d1@3 d1", P: "g1@4 g1@2 b1 c2", Q: "d2@3 d2 a1@3 a1", R: "d1@3 d1 c2@2 c2@2", S: "g1@3 g1 d2@2 d1@2",
  T: "g1@3 g1 a1@2 b1@2", U: "c1@3 c1 c1@2 d1@2", V: "e1@3 e1 e1@2 b1@2", W: "e1", X: "g1@3 g1 g1@2 g1@2", Y: "~ d1",
  Z: "a1@5 ~ a1 ~ a1@7 ~", AA: "d2@5 ~ d2 ~ d2@7 ~", AB: "c2@5 ~ b1@6 a1@3 ~", AC: "[g1@11 ~]/3",
})).s("gm_electric_bass_finger").gain(0.7)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H@2 I J K E L M@2 N O P Q R S T@2 U V W X Y Z AA AB AC AD C A AE AF C D E F G H@2 I J K E L M@2 N O P
  Q R S T@2 U V W X Y Z AA AG AH AD AI AJ AK AL@3 ~
>`.pickRestart({
  A: "g2@2 d3@2 g3@2 d3 e3 [f#3,a3,d4]@4 [e3,g3,c4]@4, b3 ~", B: "[g3,b3] d4, d3", C: "c4@8 g3@2 c4@2 d4@2 e4 f#4",
  D: "f#3 d3 ~ e4 f#3 d3 ~ [a3,e4], a3@3 a3@4 ~, d4 d4@2 d4", // A5
  E: "~ a3 a4 [b3,e4,b4] ~@2 g4 [d4,a4], [g3,c4,e4]@2 ~ d4@4 ~, ~@3 g3@2 g3@3, ~ b3", F: "a3 c4 g4 a3 b3 g3 g4 [d4,a4]",
  G: "f#3 d3 ~ [a3,e4] a3 c4 ~ a3, a4 ~, d4!2 [e4,a4] [c4,g4]", // A5 C5
  H: "[f#3@2 d3@2 d4@2 [a3,e4]@2 ~@2 c3@2 [g3,c4,e4]@2 b3@2 ~@4 g4@2 [d4,a4]@2 c4@2 a3@2 a4@2 [e4,b4] [f#4,c5], g4@8 ~ [c4,e4,g4]@3 ~@2 d4@8 ~@10, a3@3 ~ e3 ~@2 g3@2 g3@3 ~@4, ~@2 b3 ~]/2", // A5 C D5 E5 F#dim C
  I: "[g3,b3] [d4,b4], d3", J: "~ e3 g3 c4 e4 g3 c4 [b3,g4]",
  K: "f#3 d3 ~ [a3,e4] [a3,g4] d4 a3 ~, [a3,f#4] [d4,f#4] ~@2", L: "a3@2 c4@2 g4@2 a3@2 b3@2 g3@2 g4@2 a4 b4",
  M: "[f#3@2 d3@2 ~@2 [a3,e4]@2 a3@2 c4@2 [c4,g4]@2 ~@2 f#3@2 ~ d4 d4@2 e4 ~ e3@2 ~ c4 c4@2 [g3,c4,d4,e4,g4]@2, [d4,a4]@4 [d4,a4]@4 [e4,a4]@4 ~@2 a3@2 ~@2 d3@2 ~@3 [g3,c4,e4]@3 c3@2 ~@4, ~@15 [d4,g4]@3 ~ [a3,f#4]@3 a3@2 ~@3 e4@3 ~@2]/2", // A5 C5 C D5 A5 C G5 D
  N: "a3@2 g3@2 g4@2 a4 [e4,b4] c4@2 [g3,a3]@2 [c4,a4]@2 [e4,b4] [f#4,c5], b3 ~, d4@3 d4 ~@3 g4", // E5 Gsus2 F E5 F#dim
  O: "[b3,d4,g4]@6 ~ [d4,g4,b4]@3 [g4,b4,d5]@4 c5!2, ~@7 [d4,g4]", // G G5
  P: "e3@2 c3@2 ~@2 [g3,d4]@2 e3@2 c3@2 c4@2 [g3,d4] e4, e4@2 ~ [e4,g4,c5], c4!2 [c4,e4,g4] ~", // G5 C
  Q: "e3 c3 c4 [g3,d4] e3 c3 ~ [g3,d4], [g4,c5,e5]@4 [e4,g4,c5]@2 c4 ~, ~@13 [g4,c5,d5]@3", // G5 C Gsus4
  R: "b3@2 g3@2 ~@2 [d4,a4]@2 ~@2 g3@2 ~@2 a4 b4, [b4,d5]@4 d4@3 d4, g4!2 b3@2, ~@2 g4!2", // D5 Bm
  S: "g3 ~ g4 [d4,a4] b3 g3 [d4,g4,a4] [d4,a4], [b3,d4]@7 ~ [d4,g4,c5]@4 b3@4, ~@2 g3@5 ~@9", // D5 Dsus4 D5 Bm Csus2
  T: "[f#3 d3 d4 [a3,e4] a3 c4 [c4,e4,g4,a4] ~ f#3 d3 ~ [a3,e4] e3 c3 [c4,e4,g4,c5] [g3,d4,g4,b4], [f#4,a4]@7 ~ [e4,g4,c5]@4 ~@3 [d4,f#4,a4]@5 [d4,f#4,a4]@4 [e4,g4,c5]@4 ~@4, d4@2 ~@5 a3 ~@8]/2", // A5 Am7 A5 C G F#m C D …
  U: "b3 ~ g3@2 g4@2 a4@2 b3@2 g3@2 ~@2 a4 b4, ~ [b3,d4,g4]@4 ~ [d4,b4]@8 d4@2, ~@3 g4@3 g4@2", // G
  V: "~@2 g3@2 g4 [d4,a4] [d4,a4]@2 a3@2 c4@2 ~@2 a3@2, [b3,d4,g4]@4 ~ g4@3 [d4,g4,b4]@4 [d4,g4,c5]@4", // D5 G Csus2
  W: "e3 c3 c4 [g3,d4] e3 c3 c4 [g3,d4], e4@2 [c4,e4,g4] [e4,g4,c5], g3@3 ~@5", // G5 C
  X: "e3 c3 c4 ~ e3 c3 c4 [g3,d4], [g4,c5,e5]@3 [g3,d4] ~@4, ~@7 [e4,g4,c5]@5 [f#4,a4,d5]@4", // G5 C G5 C D
  Y: "[e4,g4,b4,d5]@2 ~@2 d5@2 e4 ~ b3@2 d4@2 ~@2 b3@2, ~ [g4,b4]@5 ~@2, ~@2 d4@5 d4@3 ~@2 [d4,f#4,a4]@4", // Em7 G D
  Z: "[b3,e4,g4]", AA: "~@2 e3@2 g3@2 c4@2 [a3,e4,c5]@2 [c4,d4,b4] ~ g4@2 [a3,d4,a4]@2, ~@11 [c4,a4]@2 ~@3",
  AB: "f#3 d3 ~ [a3,e4] f#3 d3 ~ [a3,e4], a4 f#4, d4!4", // A5
  AC: "~@2 g3@2 g4@2 a4 b4 ~@2 b3@2 a4@2 b4 c5, b3@2 [a3,d4] [g3,c4], d4@3 d4 ~@3 e4", AD: "[d3,g3,b3]",
  AE: "b3@2 g3@2 g4@2 [d4,a4]@2 c4@2 a3@2 a4@2 [e4,b4] [f#4,c5]", AF: "[g3,b3] d4",
  AG: "~@2 g3@2 ~@2 [d4,a4]@2 ~@2 g3@2 ~@2 a4 b4, e4, b3!2, g4 g4@2 g4, ~@7 d4", // D5
  AH: "g3@2 e3@2 g3@2 c4@2 [a3,e4,c5]@2 [c4,d4,b4] ~ g4@2 [a3,d4,a4]@2, ~@11 [c4,a4]@2 ~@3", // Am G D5 F
  AI: "~ e3 g3 c4 a3 c4 g4 a3, ~@2 [e4,c5] [c4,a4]", AJ: "e3 c3 c4 [g3,d4] e3 c3 c4 [g3,d4], a4 f#4, d4@3 ~ d4@3 ~",
  AK: "e3@2 c3@2 ~@2 d4 e4 a3@2 c4@2 g4@2 a3@2, e4@3 g3 [g3,d4]@2 [g3,c4]@2, c4!2 ~@2", AL: "[g3,b3,g4]/3",
})).s("gm_piano").gain(0.49)

// drums · kick
const kick = s("bd").struct("<~@11 A@7 B A@11 B A@3 B A@3 ~@9 A@7 B A@11 B A@3 B A@3 B ~@3>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x",
})).gain(0.71)

// drums · rim
const rim = s("rim").struct("<~@10 A B@7 C ~@15 A B@3 ~@8 A B@7 C ~@15 A B@3 ~@4>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x",
})).gain(0.71)

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

// drums · hihat
const hihat = s("hh").struct("<[x!4] [~ x ~ x]!10 ~@27 [~ x ~ x]!9 ~@31>").gain(0.64)

// drums · mid tom
const mid_tom = s("mt").struct("<~@18 [~@14 x!2] ~@35 [~@14 x!2] ~@23>").gain(0.71)

// drums · tambourine
const tambourine = s("tb").struct("<~@19 A B@6 C D B@2 E B@3 E ~@20 A B@6 C D B@2 E B@3 E ~@7>".pickRestart({
  A: "x ~@2 x", B: "~ x ~ x", C: "~@4 x ~@7 x ~@2 x", D: "x!2 ~ x", E: "x",
})).gain(0.71)

// drums · ride
const ride = s("rd").struct("<~@74 x ~@3>").gain(0.71)

stack(bass, piano, kick, rim, snare, hihat, mid_tom, tambourine, ride)

More by Brooks Garth