Strudelify

Hot Blooded

Foreigner

KeyG majorTempo120 bpm
0:00/0:00
// Hot Blooded — Foreigner
// 120 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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
const bass = note(`<
  ~ A@5 B A C A B A C A B D E F G H I F G H I F J H I F G H I K L K M K L K N A B A C A B D E F G H I F G H I F G H I F
  G H I K L K M K L K N A B A C A B D E A B A C A B D E O@2 ~
>`.pickRestart({
  A: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", B: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2@2",
  C: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", D: "d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~ d2 ~",
  E: "d2 ~ d2 ~ d2 ~ d2 ~ d2@2 a1@2 d2 ~ d2 ~", F: "g1@3 ~@13", G: "f1 ~ c2 ~", H: "g1 ~@3",
  I: "f1@4 ~@4 c2 ~ c2@3 ~ c2 ~", J: "f1 ~ c2 ~, f#8 ~@15", K: "c2@2 d2 ~ d2@2 c2@2 d2@3 ~@5",
  L: "~@2 f2 ~ f2@4 ~@2 c2@3 ~ c2 ~", M: "~@2 e1@2 e2@4 ~@2 c2 ~ c2@2 ~@2", N: "~@2 f1 ~ f1@4 ~@2 a#2 ~ a#2@2 g2 ~",
  O: "g1/2",
})).s("gm_electric_bass_finger").gain(0.33)

// chords · epiano2 · "Midi C3, T2"
const epiano2 = note(`<
  ~ A B@3 C D E F C D E F C D G H I J K L I J K L I J K L I J K L M N O P M N O Q C D E F C D G H I J K L I J K L I J K
  L I J K L M N O P M N O Q C D E F C D G H C D E F C D G H R@3
>`.pickRestart({
  A: "[g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3] ~ [g2,d3,g3] ~", // G5
  B: "[g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~ [g2,d3,g3] ~", // G5
  C: "[g2,d3]@2 [g2,g3,c4] ~ c4 b3 ~@2, ~@8 [g2,g3]@5 ~@3", // G5 C5 G
  D: "[c3,g3,c4,e4]@2 ~@2 [g3,c4,e4]@2 [c4,f4]@9 ~, ~@4 c3@11 ~", // C F5
  E: "[g2,d3]@4 [g2,g3,c4]@2 ~@2 c4@2 b3@3 ~@3, ~@8 [g2,g3]@5 ~@3", // G5 C5 G
  F: "[c3,c4,e4]@2 ~@2 e4@2 f4@7 ~@3, ~@4 [c3,c4]@9 ~@3", G: "[d3,a3]@2 [d4,g4] ~ [d4,g4] [d3,a3,d4,f#4]@2 ~",
  H: "[d3,a3,d4,g4] ~@3 [d4,g4] ~ [d4,f#4]@6 ~@4, ~@4 [d3,a3]@9 ~@3", I: "[g2,d3,g3] ~@3",
  J: "[f2,c3,f3] ~ [c3,g3,c4] ~", K: "[g2,d3,g3]@2 ~@5 g2, ~@14 d3 ~", L: "[f2,c3] f3 ~@2 [c3,g3,c4]@2 ~@2",
  M: "[c3,g3,c4]@2 [d3,a3,d4] ~ [d3,a3] ~ [c3,g3] ~ [d3,a3,d4]@4 ~@4, ~@2 d4 c4 ~@4", // C5 D5 C5 D5
  N: "~@2 [f3,a3,c4] ~ [f3,a3,c4]@4 ~@2 c4@4 ~@2, ~@2 f2@6 c3@5 ~@3", // F
  O: "[c3,c4]@2 [d3,d4] ~ [d3,d4]@2 [c3,c4]@2 [d3,d4]@3 ~@5", // C D C D
  P: "~@2 [e3,b3,e4] ~ [e3,b3,e4]@4 ~@2 [c3,g3,c4] ~ [c3,g3,c4]@2 ~@2", // E5 C5
  Q: "~@2 [f2,c3,f3] ~ [f2,c3,f3]@5 ~ [a#2,a#3] ~ a#3@2 [g2,g3] ~, ~@12 a#2 ~@3", // F5 A# G
  R: "[[d3,g4]@31 ~@17, g2@11 ~@5, [g3,d4]@7 ~@5]/3", // G5
})).s("gm_epiano2").gain(0.45)

// chords · overdriven guitar · "Midi C4, T3"
const overdriven_guitar = note(`<
  ~ A@4 B C D E B C D E B C F G H I J I H I J I H I J I H I J I K L M N K L M O B C D E B C F G P Q R S T U@2 V W X Y
  Z@2 AA AB AC K L M N K L M O B C D E B C F G B AD D E B C F G AE@3
>`.pickRestart({
  A: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~", B: "[g2,d3]@2 [g2,g3,c4] ~ c4 b3 ~@2, ~@8 [g2,g3]@5 ~@3",
  C: "[c3,g3,c4,e4]@2 ~@2 [g3,c4,e4]@2 [c4,f4]@9 ~, ~@4 c3@11 ~", // C F5
  D: "[g2,d3]@4 [g2,g3,c4]@2 ~@2 c4@2 b3@3 ~@3, ~@8 [g2,g3]@5 ~@3", // G5 C5 G
  E: "[c3,c4,e4]@2 ~@2 e4@2 f4@7 ~@3, ~@4 [c3,c4]@9 ~@3", // C
  F: "~@4 [d4,g4]@2 ~@2 [d4,g4]@2 [d4,f#4]@5 ~, [d3,a3]@3 ~ [d3,a3]@3 ~", // G5 D D5
  G: "[d3,d4,g4] ~ g4 [a3,d4,f#4]@3 ~@2, ~ d3@2 ~, ~@4 d4 ~@11", H: "[g2,d3,g3] ~@3", I: "[f2,c3,f3] ~ [c3,g3,c4] ~",
  J: "[g2,d3,g3]@2 ~@4 g3 ~, ~@5 [g2,d3]@2 ~", // G5
  K: "[c3,g3,c4]@2 [d3,a3,d4] ~@3 [c3,g3,c4]@2 [d3,a3,d4]@4 ~@4, ~ [d3,a3,d4] ~@2", // C5 D5 C5 D5
  L: "~@2 [f2,f3] ~ [f2,f3]@4 ~@2 [c3,g3] ~ [c3,g3]@3 ~", M: "d3 ~ [d3,d4] ~ [d3,d4]@2 [c3,c4]@2 [d3,d4]@3 ~@5",
  N: "~@2 [e2,e3,b3]@2 [e2,e3,b3]@4 ~@4 [g3,c4]@3 ~, ~@10 c3@5 ~", // E5 C5
  O: "~@2 [f2,c3,f3]@2 [f2,c3,f3]@3 ~@3 [a#2,f3,a#3] ~ [a#2,f3,a#3]@2 g3 ~", P: "c4", Q: "~@2 g4@3 g4@3 f4@3 g4@4 g4",
  R: "~@2 a#4 [d5,f5,g5] f5@4 d5@6 ~@2", S: "a5 g5 a5@2 g5 f5 g5 f5 d5 g5 f5 c5 e5 d5@3",
  T: "c5 a#4 a4 f4 a#4 a4 f4 a4 g4 d4@3 g4@4", U: "[f4@2 f4@2 ~ f4@2 ~ f4@4 d4@2 c4@14 ~@2 [c4,f4]!2]/2",
  V: "[c4,f4]@2 [d4,g4]@4 [f4,a#4]@4 a4@4 a#4 ~", W: "c5@4 c5@5 c5@2 d5 c5@2 e5 ~", X: "f5@4 g5@4 ~ g5@2 ~ a5 ~ g5 ~",
  Y: "a#5 ~ a5 ~ g5 a5 ~ a#5 ~ a5@3 g5@2 a5 ~",
  Z: "[c6@3 ~ c6@4 c6@2 a#5 a5 a#5@2 g5@6 a5 g5 a5 g5 ~ g5 a5@2 g5@2 f5@2, ~@12 a5 ~@3]/2",
  AA: "~ f5@3 d5 ~ f5 ~ f5 ~ d5 ~ f5 d5 ~@2", AB: "~@2 [f4,g4] g3@5 d4@2 g3 d4@2 ~@2 g3, ~@3 d4@2 ~@8 g3@2 ~, ~@7 d4",
  AC: "d4 g3 ~@7 g4@2 ~ g4@2 g3 ~, ~@2 d4@2 d4@11 ~, ~@3 g3@3 f4@9 ~, ~@7 g3@4 g3@3 ~@2",
  AD: "[c3,g3,c4,e4,f#9]@2 ~@2 [g3,c4,e4]@2 [c4,f4]@9 ~, ~@4 c3@11 ~", AE: "[g2@11 ~@5, d3@31 ~@17, g3@29 ~@19]/3",
})).s("gm_overdriven_guitar").gain(0.37)

// chords · electric guitar clean · "Midi C5, T4"
const electric_guitar_clean = note(`<
  ~ A B@3 C D E F C D E F C D G@2 ~@19 H ~@4 C D E F C D G@2 ~@19 H ~@4 C D E F C D G@2 C D E F C D G@2 I@2 ~
>`.pickRestart({
  A: "g3 ~ g3 ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~", // G
  B: "[g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~", // G
  C: "[g3,d4,g4,b4]@2 [g4,b4] ~@3 [g4,b4]@2, ~@2 [g3,d4]@3 [g3,d4]@3, ~@2 [g4,b4] ~", // G G5 G
  D: "~@2 [g4,c5]@2 ~@2 [c4,g4]@3 ~ c4@2 g4@4, c4@4 ~@2 c5 ~@9", // C5
  E: "[g3,d4]@4 [g3,d4,g4,b4]@3 ~ [g4,b4]@2 ~@4 g4@2, ~@2 [g3,d4]!2, ~@5 b4@3, ~@5 g4@2 ~", // G5 G G5
  F: "~@2 [g4,c5] ~@3 [c4,g4,c5]@4 c4@2 [g4,c5]@2 c4 ~, c4 ~@3", // C5
  G: "[d4,a4] ~ [d4,a4] ~ [d4,a4] ~ [d4,a4] ~ [d4,a4] ~ [d4,a4] ~ [d4,a4] ~ [d4,a4] ~", // D5
  H: "~@2 [e3,b3,e4]@2 [e3,b3,e4]@4 ~@2 c4 ~ c4@2 ~@2", I: "[g3@19 ~@13, d4@13 ~@19, g4@5 ~@11]/2",
})).s("gm_electric_guitar_clean").gain(0.26)

// chords · rock organ · "Midi C6, T5"
const rock_organ = note("<~@41 A@2 B@2 C@2 D@2 ~@16 E@2 F ~ G@4 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@3>".pickRestart({
  A: "[g6@31 ~, d6 ~]/2", B: "[d6@13 ~@3 e6@6 ~@10, g6@31 ~]/2", C: "[d6@15 ~ e6@16, g6@31 ~]/2", D: "[d6@15 ~]/2",
  E: "[[d5,d6]@31 ~, a5 ~]/2", F: "[d5,d6], a5@3 ~@13", G: "[[d5,d6]@49 ~@15, a5 ~@3]/4",
})).s("gm_rock_organ").gain(0.4)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@4 A ~@27 B ~@2 C ~@3 C D ~@3 A ~@19 B ~@2 C ~@3 C D ~@3 A ~@7 A ~@2 C D ~@3
>`.pickRestart({
  A: "~@10 x!2 ~@4", B: "~@12 x!2 ~@2", C: "~@14 x!2", D: "~@13 x ~@2",
})).gain(0.11)

// drums · low tom
const low_tom = s("lt").struct("<~@40 [~@7 x ~@8] ~@31 [~@7 x ~@8] ~@15 [~@7 x ~@8] ~@3>").gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!16 [x!2 ~ x] [x!4]!31 [x!2 ~ x] [x!4]!31 [x!2 ~ x] [x!4]!8 ~@3>").gain(0.38)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A@3 B A@31 C A@3 C A@3 B A@23 C A@3 C A@3 B A@7 B A@3 C ~@3>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~@3 x ~ x ~ x",
})).gain(0.11)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 A ~@23 B ~@7 A ~@23 B ~@7 A ~@7 B ~@3>".pickRestart({
  A: "~@3 x", B: "~@3 x ~@4",
})).gain(0.38)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@11 B ~@19 C ~@3 C ~@3 A ~@3 B ~@19 C ~@3 C ~@3 A ~@3 B ~@3 A ~@3 C D ~@2
>`.pickRestart({
  A: "~@7 x", B: "~ x", C: "~ x ~@6", D: "x",
})).gain(0.38)

// drums · high tom
const high_tom = s("ht").struct("<~@16 A ~@23 B ~@7 A ~@23 B ~@7 A ~@7 B ~@3>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x ~@2 x ~@5",
})).gain(0.38)

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

// drums · ride
const ride = s("rd").struct("<~@33 A@3 B A@3 B ~@24 A@3 B A@3 B ~@14 A B@2 ~@2>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.38)

// drums · cowbell
const cowbell = s("cb").struct("<~@33 [x!4]!8 ~@24 [x!4]!8 ~@14 [x!4]!2 ~@3>").gain(0.38)

stack(
  bass, epiano2, overdriven_guitar, electric_guitar_clean, rock_organ, kick, snare, snare_soft, low_tom, hihat,
  hihat_soft, mid_tom, open_hat, high_tom, crash, ride, cowbell
)

More by Foreigner