Strudelify
Keep On Loving You cover art

Hi Infidelity

Keep On Loving You

REO Speedwagon

KeyD minorTempo118 bpm
0:00/0:00
// Keep On Loving You — REO Speedwagon
// 118 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 8 "Voice - Strings" string ensemble 1 (copy of ch 2 "Organ - Voice Doubled" rock organ); ch 7 "Guitar - Doubled" acoustic guitar steel (copy of ch 5 "Over-Guitar" overdriven guitar)
// note: Full arrangement: all 51 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(118/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.

// chords · overdriven guitar · "Over-Guitar"
const overdriven_guitar = note(`<
  A B A C D E F@2 D E G H I J K@4 D L M H N O P@2 Q R S T@2 U V@2 W@2 X@3 Y Z@2 AA AB AC AD@2 AE AF AG ~
>`.pickRestart({
  A: "[f3,a3,c4]@3 ~ [f3,a3,c4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~", // F G
  B: "[a3,c4,e4] ~ [a3,d4,f4] ~ [a3,c4,e4] ~ [g3,b3,d4]@3 ~ [g3,c4,e4] ~ [g3,b3,d4] ~ [f3,a3,c4] ~", // Am Dm Am G C G F
  C: "[a3,c4,e4]@4 ~@2 [g3,b3,d4]@4 ~@2 [f3,a3,c4] ~ [f3,a3,c4]@2", // Am G F
  D: "~@2 f4 ~ [c4,f4,a4] c5@2 ~ [d4,g4,b4,d5]@3 ~ c5 ~ a4 ~", // F G
  E: "e5 ~ f5 ~ e5 ~ d5@3 ~ e5@3 d5 c5 ~, [e4,a4,c5]@4 ~@2 [d4,g4,b4]@7 ~@3", // Am G
  F: "[~@4 [c4,f4,a4] ~ c5 ~ [d4,g4,b4,d5]@3 ~ c5 ~ c5 ~ [a3,c4,e4]@4 ~@2 [g3,b3,d4]@5 ~ [f3,a3,c4] ~ [f3,a3,c4]@2, ~@15 a4@6 ~@11]/2", // F G Am G F
  G: "~@4 [c4,f4,a4] ~ c5 ~ [d4,g4,b4,d5]@3 ~ c5 ~ c5 a4", // F G
  H: "[a3,c4,e4]@4 ~@2 [g3,b3,d4]@3 ~ [g3,c4,e4] ~ [g3,b3,d4] ~ [f3,a3,c4] ~, a4 ~", // Am G C G F
  I: "[f3,a3,c4]@3 ~ [c4,f4,a4] c5@2 ~ [d4,g4,b4,d5]@8", J: "~@2 [a3,c4,f4,g4] g4 a4 c5@2 ~ [d4,g4,b4,d5]@4 ~@2 c5 ~",
  K: "[[e4,a4,c5,d5] ~ e5 ~ [e4,a4,c5,e5]@3 ~ [e4,a4,c5,e5] ~ d5 ~ c5 ~ [e4,a4,c5,e5]@5 ~ [e4,a4,c5,e5]@3 ~ [e4,a4,c5,e5] ~ f5 ~ e5 ~@11 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@4 ~@2 [f3,a3,c4]@2, ~@30 [d4,g4,b4,e5]@7 ~@27, ~@34 d5@17 ~@13]/4", // Am G F Em7
  L: "e5 ~ e5@3 ~ [b4,d5]@3 c5 b4@3 ~@3, [e4,a4,c5]@4 ~@2 [d4,g4]@7 ~@3", // Bm Am G5
  M: "~@4 [c4,f4,a4] c5!2 ~ [d4,g4,b4,d5]@3 ~ c5 ~ c5 a4", // F G
  N: "[f3,a3,c4] ~ f4 ~ [c4,f4,a4] c5@2 ~ [d4,g4,b4,d5]@3 ~ c5 ~ a4 ~", // F G
  O: "e5 ~ f5 ~ e5 ~ d5@3 c5 b4@4 ~@2, [e4,a4,c5]@4 ~@2 [d4,g4]@7 ~@3", // Am G5
  P: "[~@4 [c4,f4,a4] ~ c5 ~ [d4,g4,b4,d5]@3 ~ c5 ~ c5 ~ [a3,c4,e4]@4 ~@2 [g3,b3,d4]@3 ~ [g3,c4,e4] ~ [g3,b3,d4] ~ [f3,a3,c4] ~, ~@15 a4@9 ~@8]/2", // F G Am G C G F
  Q: "[f3,a3,c4]@3 ~ [c4,f4,a4] c5@2 ~ [d4,g4,b4,d5]@5 ~@3", // F G
  R: "~@2 [a3,c4,f4,g4] g4 a4 c5@2 ~ [d4,g4,b4,d5]@3 ~ c5 d5@2 ~", // F G
  S: "[d4,a4,c5,e5] ~ e5 ~ e5 ~ [d4,a4,c5,e5]@3 ~ d5 ~ c5 ~ [d4,a4,c5,e5]@2", // Am
  T: "[~@2 e5 ~ e5 ~ [d4,a4,c5,e5]@3 ~ f5 ~ e5 ~ e5@3 ~ d5@4 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~, ~@14 [d4,g4,b4]@7 ~@11]/2", // Am G
  U: "[g3,b3,d4]@3 ~ [g3,b3,d4] ~ d5 ~ [d4,g4,b4,d5] ~ e5 ~ f5 ~ [g4,c5,f5]@2", // G Csus4
  V: "[~@2 [g4,c5,e5] ~ d5 ~ [c4,f4,a4,c5]@3 ~ a4 ~ [d4,g4,b4,d5]@9 ~@3 [d4,g4,b4,d5] ~ e5 ~ f5 ~ [g4,c5,f5]@2]/2", // C F G Csus4
  W: "[~@2 [g4,c5,e5] ~ d5 ~ [c4,f4,a4,c5]@2 [c4,f4,a4,c5] ~ a4 ~ e5 ~ d5@3 ~ e5@8 ~@4 [e4,a4,c5,f5]@2, ~@7 [d4,g4,b4]@7 ~@2]/2", // C F Fmaj7 G
  X: "[~@2 [e4,a4,c5,e5] ~@3 c5 ~ [e4,a4,c5,e5]@4 ~@2 [e4,a4,c5,f5]@3 ~ [e4,a4,c5,e5] ~ d5 ~ c5 ~ [d4,a4,c5,e5] ~ f5 ~ e5 ~ e5@3 d5 d5@4 ~@2 [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~, ~@4 d5@16 ~@10 [d4,g4,b4]@7 ~@11]/3", // Am Fmaj7 Am G
  Y: "[g3,b3,d4]@3 ~ [g4,b4,d5,g5] ~ e5 ~ [g4,b4,d5,g5] ~ g5 ~ e5 ~ [g4,c5,e5,a5]@2", // G Am7
  Z: "[~@2 [g4,c5,e5,g5]@3 ~ [f4,a4,c5,e5] ~ [f4,a4,d5] ~ c5 ~ e5 ~ d5@3 ~ e5@4 ~@2 [d4,g4,b4,d5] ~ e5 ~ f5 ~ [g4,c5,f5]@2, ~@14 [d4,g4,b4]@7 ~@11]/2", // C Fmaj7 Dm G Csus4 G
  AA: "~@2 [g4,c5,e5] ~ d5 ~ [c4,f4,a4,c5] ~ [c4,f4,a4,c5] ~ a4 ~ e5 ~ [d4,g4,b4,d5]@2", // C F G
  AB: "~@2 [d4,b4] a4 [b3,g4]@8 ~@2 [e4,a4,c5,f5]@2", // G Em Fmaj7
  AC: "~@2 [e4,a4,c5,e5] ~ d5 ~ c5 ~ [e4,a4,c5,e5]@4 ~@2 [e4,a4,c5,f5]@2", // Am Fmaj7
  AD: "[~@2 [e4,a4,c5,e5] ~ d5 ~ c5 ~ [e4,a4,c5,e5] ~ f5 ~ e5 ~ e5@3 d5 d5@10 ~@2 e5 d5, ~@14 [d4,g4,b4]@13 ~@5]/2", // Am G
  AE: "e5 g5@2 ~ a5@3 ~ [g3,b3,d4]@5 ~@3, [g4,b4]@5 ~@11", AF: "d4 ~ c4 ~ g4 ~ f4 ~ d5 ~ c5 ~ g5 ~ f5 ~",
  AG: "d6 ~ e6@11 ~@3, g6@11 ~@5",
})).s("gm_overdriven_guitar").gain(0.4).pan(0.4)

// bass · electric bass finger · "Bass"
const bass = note("<A@2 B@8 C@2 D@2 E@2 F G@2 H@7 D I J@3 K L M L N@4 K L M L O@4 P Q R ~>".pickRestart({
  A: "[f2@30 f2 ~, f1@7 ~]/2", B: "[[f1,f2]@24 ~@4 [f1,f2] ~ [f1,f2]@29 ~@5]/4", C: "[[f1,f2]@28 ~@2 [f1,f2] ~]/2",
  D: "[f1,f2]@4 ~@2 [f1,f2] ~ [g1,g2]@3 ~ g2 ~ g1 ~", // F G
  E: "[[a1,a2]@4 ~@2 [a1,a2] ~ [a1,a2]@4 ~@2 [a1,a2]@4 [a1,a2]@3 ~ [a1,a2] ~ [a1,a2]@4 ~@2 [g1,g2]@2]/2", // A G
  F: "~@2 g1 ~ g2 ~ g1 ~ g1@3 ~ g2 ~ g1 ~",
  G: "[g1 ~ b1 ~ d2 ~ e2 ~ g2@4 ~@2 [f1,f2]@6 ~@2 [f1,f2] ~ [f1,f2]@4 ~@2 [f1,f2] ~]/2", // F
  H: "[f1,f2]@4 ~@2 [f1,f2] ~ [f1,f2]@4 ~@2 [f1,f2] ~", I: "[f1,f2]@4 ~@2 [f1,f2] ~ [g1,g2]@4 ~@2 [g1,g2] ~",
  J: "[[a1,a2]@4 ~@2 [a1,a2] ~ [a1,a2]@4 ~@2 [a1,a2]@6 ~@2 [a1,a2] ~ [a1,a2]@4 ~@2 [g2,g3]@6 ~@2 [g2,g3] ~ [f2,f3]@4 ~@2 [f2,f3] ~]/3", // A G F
  K: "[e2,e3]@4 ~@2 [e2,e3] ~ [d2,d3]@4 ~@2 [c2,c3]@2", L: "~@2 [c2,c3]@3 ~ [f1,f2] ~ [f1,f2]@4 ~@2 [g1,g2]@2",
  M: "~@2 [g1,g2]@3 ~ [g1,g2] ~ [g1,g2]@4 ~@2 [c2,c3]@2", // G C
  N: "[~@2 [g1,g2]@3 ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [ab1,ab2] ~ [a1,a2]@6 ~@2 [a1,a2] ~ [a1,a2]@3 ~ [a1,a2] ~ [a1,a2]@6 ~@2 [a1,a2] ~ [a1,a2]@4 ~@2 [g2,g3]@5 ~@3 [g2,g3] ~ [f2,f3]@4 ~@2 [f2,f3] ~]/4", // G Ab A G F
  O: "[~@2 [g1,g2]@3 ~ [g1,g2] ~ [g1,g2] ~ [g1,g2] ~ [ab1,ab2] ~ a2@8 [a1,a2] ~ [a1,a2]@3 ~ [a1,a2] ~ a2@8 [a1,a2] ~ [a1,a2]@4 ~@2 [g2,g3]@6 ~@2 [g2,g3] ~ [f2,f3]@4 ~@2 [f2,f3] ~, ~@7 a1@3 ~@5 a1@3 ~@14]/4", // G Ab A G F
  P: "[e2,e3]@4 ~@2 [e2,e3] ~ [d2,d3]@3 ~ [d2,d3]@3 ~", Q: "[c2,c3]@5 ~@3 g2@5 ~@3", R: "c2@11 ~@5",
})).s("gm_electric_bass_finger").gain(0.57).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!48 [x!4] ~>").gain(0.62)

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

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A ~ B ~ A ~@3 A ~@3 A ~ B ~ A ~ C ~ A ~ C ~ A ~ C ~ A ~ B D E D C ~ A ~ C ~ A ~ B F A ~ B ~ A ~
>`.pickRestart({
  A: "~@12 x!3 ~", B: "~@8 x!3 ~@5", C: "~@9 x!2 ~@5", D: "~ x ~ x", E: "~@4 x ~@7 x!3 ~", F: "~@12 x!2 ~@2",
})).gain(0.62)

// drums · hihat
const hihat = s("hh").struct("<~@2 [x!4]!48 ~>").gain(0.62)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~ A ~ B ~ A ~@3 A ~@3 A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B C D E F ~ A ~ B ~ A ~ B G A ~ B ~ A ~
>`.pickRestart({
  A: "~@14 x!2", B: "~@10 x!2 ~@4", C: "x!2", D: "x ~@7 x ~@5 x!2", E: "~ x", F: "x ~@9 x!2 ~@4", G: "~@13 x ~@2",
})).gain(0.62)

// drums · open hat
const open_hat = s("oh").struct("<~@2 [~ x!2 ~]!48 ~>").gain(0.62)

// drums · ride
const ride = s("rd").struct("<[x!16] [x!12 ~@4] ~@49>").gain(0.62)

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

stack(overdriven_guitar, bass, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, ride, crash)

More by REO Speedwagon