Strudelify
Footloose cover art

1997

Footloose

Kenny Loggins

KeyB♭ majorTempo174 bpm
0:00/0:00
// Footloose — Kenny Loggins
// 174 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 162 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): OVERDRIVE.
setcpm(174/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 · "FINGERDBAS"
const bass = note(`<
  ~@4 A B C D A B C E C D C F A G C H A G I J I K I J I L M N O@2 P Q R S T U V W X Y Z AA AB AC AD AE AB AC AD AF AG AC
  AH AI AJ AK AL A B C AM I AN I K I AN I L M N O@2 P Q T U V W X Y Z AA AB AC AD AE AB AC AD AF AG AC AH AI AJ AK AL AO
  ~@12 AP AQ AR@2 AS@3 ~@2 AT AC AD AU AB AC AH AV AJ AK AD AW AB AC AD AX@2 AY AZ AX@2 BA BB AX AE BC BD AJ BE ~ BF ~
  BF ~ BG ~ A BH
>`.pickRestart({
  A: "bb1@3 ~@3 bb1@3 ~ bb1 ~ bb1@4", B: "~@2 bb1 ~ bb1@2 ~@2 bb1@5 ~@3", C: "bb1@4 ~@2 bb1@3 ~ bb1 ~ bb1@4",
  D: "~@2 bb1 ~ bb1@3 ~ bb1@3 ~ ab2@2 bb2@2", E: "~@2 bb1 ~ bb1@3 ~ bb1@3 ~ bb2@4",
  F: "~@2 bb1 ~ bb1@3 ~ bb1@3 ~ [bb2,db3]@4", G: "~@2 bb1 ~ bb1@2 ~@2 bb1@4 [bb2,d3]@3 ~",
  H: "~@2 bb1 ~ [bb2,d3]@4 bb1@3 ~ [bb2,d3]@3 ~", I: "bb1@4 ~@2 bb1 ~ bb1@2 bb1@4 ~@2",
  J: "bb1@2 bb1 ~ bb1@2 ~@2 bb1@4 ~@4", K: "f1!2 ab1@2 bb1!2 db2@2", L: "bb1!2 bb1@2 bb1!2 db2@2",
  M: "eb2@4 ~@2 eb2@2 eb2@2 eb2@2 eb2@3 ~", N: "eb2!2 ~ eb2!3 eb2@2", O: "eb2@2 eb2@3 ~ eb2@2 eb2@2 eb2@2 eb2@4",
  P: "bb1@4 ~@2 bb1@3 ~ bb1@2 bb1@4", Q: "~@2 bb1 ~ bb1@2 ~@2 bb1@4 bb2@4", R: "bb1@4 ~@2 bb1@2 ~@2 bb1@2 bb1@3 ~",
  S: "~ bb1 bb1@2 bb1!2 db2@2", T: "eb2@4 ~@2 eb2@2 eb2@7 ~", U: "eb2@3 eb2 eb2@4", V: "e2@4 ~@2 e2@2 e2@7 ~",
  W: "e2@3 e2 c2!2 c2@2", X: "f1 ~ f1@3 ~ f1 ~ f1 ~ f1@2 f1 ~ f1 ~", Y: "g1 ~ g1@3 ~ g1@2 g1 ~ g1 ~ g1@2 g1@2",
  Z: "ab1 ~ ab1@3 ~ ab1 ~ ab1@2 ab1 ~ ab1 ~ ab1@2", AA: "a1 ~@5 a1@2",
  AB: "bb1 ~ bb1@2 g2@2 bb1@2 ab2@2 bb1@2 g2@2 ab2@2", AC: "bb1 ~ bb1@2 g2@2 bb1@2 ab2@2 bb1@2 a2@2 bb2@2",
  AD: "eb2!2 f2 g2 bb2!2 c3 bb2", AE: "bb1 ~ bb1@2 db2@2 d2@2 f2@2 f2@2 g2@2 f2@2", AF: "~ d3 c3 bb2 g2 f2 d2 c2",
  AG: "bb1!2 g2 bb1 ab2 bb1 g2 ab2", AH: "eb2!2 db2!2 c2!2 b1!2", AI: "bb1 ~ f1@2 g1@2 f1@2 ab1@2 f1@2 a1@2 f1@2",
  AJ: "bb1!2 db2 d2 f2!2 g2 f2", AK: "bb2 ~ bb2@2 ab2@2 g2@2 f2@2 f2@2 c2@2 d2@2", AL: "ab1@2 eb2!2",
  AM: "~@2 bb1 ~ bb1@3 ~ bb1@3 ~ [bb2,d3]@3 ~", AN: "~@2 bb1 ~ bb1@2 ~@2 bb1@4 ~@4", AO: "bb1@3 ~@13",
  AP: "~@8 eb3@2 c3@5 ~", AQ: "f1", AR: "f1!4", AS: "f1!8", AT: "bb1 ~@2 eb2",
  AU: "bb2 ~ bb2@2 g2@2 g2@2 f2@2 f2@2 c2@2 d2@2", AV: "bb1 ~ bb1@2 g1@2 g1@2 ab1@2 ab1@2 a1@2 a1@2",
  AW: "d3 f3 g3 f3 d3 bb2 g2 f2", AX: "bb1 ~ bb1@2 g1@2 g1@2 f1@2 f1@2 g1@2 g1@2",
  AY: "bb1 ~ bb1@2 c2@2 d2@2 eb2@2 eb2@2 e2@2 f2@2", AZ: "f2 ~ f1@2 g1@2 f1@2 ab1@2 f1@2 a1@2 f1@2",
  BA: "bb2 bb3 ab2 ab3 g2 g3 gb2 gb3", BB: "f3 f1 g1 f1 ab1 f1 a1 f1", BC: "bb2!2 g2!2 f2!2 g2 f2",
  BD: "bb2 d3 c3 bb2 g2 f2 d2 c2", BE: "bb2!2 g2 f2 bb2@2 bb2@2", BF: "~@2 ab2 g2", BG: "~@2 eb2 ~ eb2@3 ~@9",
  BH: "~@2 bb1 ~ bb1@2 ~@2 bb1@4 bb2@2 ~@2",
})).s("gm_electric_bass_finger").gain(0.47)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@17 A ~ A ~ B C D C D C D C ~@9 E@2 F@2 G H I J ~@2 K L M ~ K N M ~ K L M ~ O L ~@2 D C D C D C D C ~@7 E@2 F@2 G H I
  J ~@2 K L M ~ K N M ~ K L M ~ O L ~@14 P@6 ~@3 K L M ~ K N ~@2 K L M ~ K N ~ K L M ~ K N ~@2 K L M Q ~ R ~ R ~ S ~@2 T
>`.pickRestart({
  A: "~ [bb5,d6,g6] [ab5,c6,f6] ~", B: "~@4 [bb5,d6,g6]@4 [ab5,c6,f6]@3 ~ [g5,bb5,eb6]@4", C: "[f5,bb5,d6] ~@3",
  D: "~@3 [g5,bb5,eb6]", E: "[bb4,eb5,g5]/2", F: "[b4,e5,ab5]/2", G: "[f5,a5]", H: "[g5,bb5]", I: "[ab5,b5]",
  J: "[a5,c6] ~@3", K: "[bb4,eb5] ~ [bb4,eb5] ~@3 [bb4,eb5] ~ [bb4,eb5]@3 ~ [bb4,eb5]@3 ~", L: "[bb4,d5]@3 ~@13",
  M: "~@6 [bb4,d5]@5 ~@5", N: "[bb4,d5]@3 ~@5 [d6,bb6]@4 [bb5,g6]@3 ~", O: "[ab4,eb5] [bb4,eb5]", P: "a5/6",
  Q: "~@8 [bb5,f6,bb6]@3 ~ [bb5,f6,bb6]@3 ~", R: "~@2 [c6,eb6,ab6] [bb5,eb6,g6]",
  S: "~@2 [eb5,bb5,eb6] ~ [eb5,bb5,eb6]@4 ~@8", T: "~@2 [bb5,d6,g6]@2 [ab5,c6,f6]@2 [bb5,f6,bb6] ~",
})).s("gm_drawbar_organ").gain(0.38).pan(0.6)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@12 A@4 B@4 C@2 D ~@7 E@4 F G@2 H I@4 J K L M N O P N@2 O P N@2 O P N@2 O Q R ~@2 S D ~@7 E@4 F T U@4 J K L M N O P
  N@2 O P N@2 O P N@2 O Q R ~@6 V ~ W ~ V ~@4 X@5 ~@2 O P N@2 O P N@2 O P N@2 O P N@2 P N@2 O P N@2 O P N@2 Y ~@5 Z ~
  AA@2
>`.pickRestart({
  A: "[bb2@6 d3@6 [ab3,c4]@51 ~]/4", B: "[bb2@3 d3@3 [ab3,c4]@4 [g3,bb3]@2 [f3,ab3]@2 d3@2]/2",
  C: "[bb2@3 d3@3 [ab3,c4]@4 [g3,bb3]@2 [f3,ab3]@2 [eb3,g3]@2]/2", D: "[d3,f3] ~@3", E: "[g3,bb3,eb4]/4",
  F: "[bb2,f3,bb3] ~@2 [bb2,f3,bb3]@3 [bb2,f3,bb3]!2", // Bb5
  G: "[~@2 [bb2,f3,bb3]@3 ~ [bb2,f3]@2 [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 f3@2 [f3,bb3]@2 ~@4 [bb2,f3,bb3]@6 [bb2,f3,bb3]@2 [bb2,f3,bb3]@2, ~@14 bb2@5 ~@13]/2", // Bb5
  H: "~@2 [bb2,f3,bb3]@3 ~ [bb2,f3]@2 [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 [bb2,f3]@2", // Bb5
  I: "[eb3@32 e3@26 e4 bb2@5, bb3@29 ~@3]/4", J: "f2", K: "g2", L: "ab2", M: "a2@3 ~@13", N: "[bb2,f3]!2 ~ [bb2,f3]!5",
  O: "[bb2,f3]@2 [bb2,f3] ~@3 [bb2,f3] ~ [bb2,f3]@2 [bb2,f3]@2 [bb2,f3]@2 [bb2,f3]@2", P: "[eb3,bb3]!2 ~ [eb3,bb3]!5",
  Q: "[eb3,ab3]@2 [eb3,bb3]!2", R: "[bb2,f3] ~@7", S: "~@3 [eb3,g3]",
  T: "~@2 [bb2,f3,bb3]@3 ~ [bb2,f3]@2 [bb2,f3,bb3]@4 [bb2,f3,bb3]@2 f3@2", // Bb5
  U: "[[eb2,eb3,eb4]@32 e3@26 e4 bb2@5, bb3@29 ~@3]/4", V: "~@3 bb2", W: "~ bb2", X: "[~@31 g5@49, [g3,eb4]@17 ~@3]/5",
  Y: "[bb2,f3]@2 [bb2,f3] ~@3 [bb2,f3] ~ [bb2,f3,bb3]@4 [bb2,f3,bb3]@4", Z: "~@2 [eb3,bb3,eb4] ~ [eb3,bb3,eb4]@3 ~@9",
  AA: "[bb2@3 d3@3 [ab3,c4]@4 [g3,bb3]@2 [f3,ab3]@2 [bb3,f4,bb4] ~]/2", // Ab Gm Fm Bb5
})).s("gm_overdriven_guitar").gain(0.25).pan(0.1)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@12 A@4 B@4 C@2 D E F E F E F ~ G@2 H@3 ~@5 I@2 ~@22 J D E F E F E K L G@2 H@3 ~@3 I@2 ~@71 M ~ M ~@3 N@2
>`.pickRestart({
  A: "[bb2@6 d3@6 ab3@51 ~]/4", B: "[bb2@3 d3@3 ab3@4 g3@2 f3@2 d3@2]/2", C: "[bb2@3 d3@3 ab3@4 g3@2 f3@2 eb3@2]/2",
  D: "d3 ~@3", E: "~@3 [eb3,g3]", F: "[d3,f3] ~@3", G: "[g3,bb3,eb4]/2",
  H: "[~@14 bb3@3 ~@7, eb3@8 eb3@7 ~@9, ~@3 bb3@7 bb3@4 ~@10, ~@6 eb4@6 eb4@7 ~@5]/3",
  I: "[~@7 e4, e3, ~ g3@2 g3@5, ~@2 bb3@3 bb3@3, ~@2 e4 g4]/2", J: "~@3 eb3", K: "[d3,f3]@2 ~@4 [eb3,g3] [d3,f3]",
  L: "[d3,f3]!2 [eb3,g3] [d3,f3]!3 [bb2,d3]@2", M: "~@2 [c4,eb4,ab4] [bb3,eb4,g4]",
  N: "[bb2@3 d3@3 ab3@4 g3@2 f3@2 bb3 ~]/2",
})).s("gm_electric_guitar_clean").gain(0.21).pan(0.1)

// other · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean_2 = note(`<
  ~@8 A B C@2 A B C@2 A B C@2 A B D ~@19 E@4 ~@15 A B F@2 D ~@17 E@4 ~@75
>`.pickRestart({
  A: "a2@2 bb2 a2@2 bb2 a2@2", B: "bb2 ab2 a2@2 bb2@2 a2@2", C: "[bb2 a2@2 bb2 a2@2 bb2 a2@2 bb2 a2@2 bb2@4]/2",
  D: "bb2 ~@3", E: "[~@48 a3@3 ~@13, f3 g3 ab3 ~, ~@3 f4@8 f4@8 f4@5 ~@8, ~@6 c4@8 c4@8 c4@3 ~@7]/4",
  F: "[bb2 a2@2 bb2 a2@2 bb2 a2@2 bb2 a2@2 bb2@2 a2@2]/2",
})).s("gm_electric_guitar_clean").gain(0.29).pan(0.7)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@34 A B C D ~@39 E F ~@31 G ~ G ~ G ~@4 H@5 I ~@37>".pickRestart({
  A: "~@4 f3 ~@7 g3@2 ~@2", B: "~@6 g3 ~", C: "~@12 g3 ~ c4@2", D: "db4!2 c4@2 ~ g3 c3 db3",
  E: "db5 [bb4,db5]!2 db5 [bb4,db5]!2 db5!2", F: "[bb4,db5] db5 [bb4,db5] db5 ~@4", G: "[bb2,f3,bb3]@3 ~@13",
  H: "[~@48 f5@15 ~@17, ab5@67 ~@13]/5", I: "[bb2,f3,bb3]@3 ~@9 [bb2,eb3,bb3]@4",
})).s("gm_overdriven_guitar").gain(0.21).pan(0.9)

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

// drums · clap
const clap = s("cp").struct("<~@22 A ~ A ~ A ~ A ~@36 A ~ A ~ A ~ A ~@30 A@21 ~@30 A@6 ~ A@2>".pickRestart({
  A: "~ x ~@2",
})).gain(0.31)

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

// drums · low tom
const low_tom = s("lt").struct("<~@102 A B C D A B C D A B C D A B A B A B A B A ~@30 A B C D A ~@2 A B>".pickRestart({
  A: "~@3 x!2 ~ x!2", B: "~@4 x!2 ~@2", C: "~@3 x!5", D: "~@2 x!4 ~@2",
})).gain(0.31)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@102 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~@30 A ~@3 A ~@2 A ~>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.18)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@30 [x!4]!15 x ~@27 [~ x!3] [x!4]!12 x ~@75>").gain(0.49)

// drums · mid tom
const mid_tom = s("mt").struct("<~@102 A B A C A B A C A B A C A B A B A B A B A ~@30 A B A C A D ~ A E>".pickRestart({
  A: "x!2 ~@6", B: "~ x!3 ~@4", C: "x", D: "~ x!2 ~@5", E: "~@2 x!2 ~@4",
})).gain(0.37)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct(`<
  ~@102 A ~ A B A ~ A B A ~ A B A ~ A ~ A ~ A ~ A ~@30 A ~ A B A ~@2 A ~
>`.pickRestart({
  A: "~ x ~@2", B: "~ x ~@6",
})).gain(0.18)

// drums · crash
const crash = s("cr").struct("<~@60 [x!2] x ~@39 [x!2] ~@60>").gain(0.24)

// drums · ride bell
const ride_bell = s("rd").struct("<~@46 [x!4]!14 ~@27 [x!4]!14 ~@24 [x!4]!28 ~@9>").gain(0.31)

stack(
  bass, drawbar_organ, overdriven_guitar, electric_guitar_clean, electric_guitar_clean_2, overdriven_guitar_2, kick,
  clap, snare, low_tom, low_tom_soft, pedal_hat, mid_tom, mid_tom_soft, crash, ride_bell
)

More by Kenny Loggins