Strudelify

Head Games

Foreigner

KeyG♯ minorTempo120 bpm
0:00/0:00
// Head Games — Foreigner
// 120 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 2 "gui/piano" named as a piano, played on piano (its overdriven guitar patch is not one)
// note: Full arrangement: all 53 bars on a 16-step grid, each part at one level. 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.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano · "gui/piano"
const piano = note(`<
  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC
>`.pickRestart({
  A: "[a4,d5,f#5]@4 ~@2 [a4,c#5,e5]@8 [d5,g5,b5] ~", B: "~@2 [d5,f#5,a5]@11 ~@3",
  C: "[a4,d5,f#5]@2 ~ [a4,c#5,e5]@4 [c#5,e5], ~@14 a4 ~", D: "a#4 ~ f#5 e5 [g4,b4,d5]@8 ~@4",
  E: "[g#3,b3,d#4]@3 ~ g#3 ~ [e3,g#3]@8 ~@2", F: "[f#3,a#3,d#4] ~ c#4 ~ b3 ~ [d#3,g#3] ~ g#3 ~@3 d#4 c#4@2 ~",
  G: "[e3,g#3,b3,c#4]@8 ~@4 d#4 c#4@2 ~", H: "[f#3,a#3,c#4] ~ b3 ~ c#4 ~ [f#3,a#3,c#4]@3 ~ b3 ~@3 g#3!2",
  I: "[g#3,b3,d#4] ~ c#4 ~ b3 ~ [e3,g#3] ~ g#3@3 ~@3 g#3 ~", J: "f#3 ~ g#3 ~ b3 ~ [g#3,b3]@4 ~@2 d#4 c#4@2 ~",
  K: "[e3,g#3,b3,c#4]@8 ~@4 g#3 g#3@2 ~", L: "[f#3,a#3,d#4] ~ f#4 ~ f#4 ~ [a#3,c#4,f#4,g#4]@3 ~ [a#3,b3,f#4]@4 ~@2",
  M: "[b3,d#4,g#4] ~ f#4 ~ d#4 ~ [b3,e4,g#4]@8 ~@2", N: "[c#4,f#4,b4] ~ a#4 ~ g#4 ~ [b3,d#4,g#4]@5 ~@3 d#4 ~",
  O: "[b3,e4,b4] ~ b4 ~ [b3,e4,a#4] ~ a#4 ~ [b3,e4,g#4] ~ g#4 ~ [b3,e4,f#4]@3 ~", // E5 E Bsus4
  P: "[a#3,c#4,f#4,g#4] ~ g#4 ~ [a#3,c#4,f#4]@3 ~ [a#3,c#4,f#4]@3 ~@3 d#4 ~", // F#
  Q: "[d#4,g#4,b4] ~ a#4 ~ g#4 ~ [b3,e4,g#4]@4 ~@4 d#4 ~", R: "[a#3,c#4,f#4] ~ g#4 ~ b4 ~ [b3,d#4,g#4]@4 ~@4 d#4!2",
  S: "[b3,e4,b4]@2 ~ a#4@2 g#4@2 ~ [b3,e4,g#4]@3 ~@3 d#4 ~", // E5 E
  T: "[c#4,f#4,b4]@2 ~ a#4@2 g#4@2 ~ [a#3,c#4,f#4,g#4]@3 ~ [c#4,f#4,b4] ~@3", U: "[g#3,d#4,g#4]@11 ~@3 d#4 ~",
  V: "b4 a#4 ~ b4@2 ~ g#4@2 ~ g#4 ~@2 b4 ~@3", W: "[b3,d#4,f#4,g#4]@8 ~@3 d#4!2 d#4@2 ~",
  X: "f#4!4 g#4@5 ~@3 [c#4,f#4,b4] ~@3", Y: "[g#3,d#4,g#4]@8 ~@7 d#4", Z: "[f#4,b4] ~ a#4 ~ g#4 ~ g#4@3 ~ f#4 ~ b4 ~@3",
  AA: "[b3,d#4,f#4,g#4]@11 ~@5", AB: "[f3,b3] ~@3 [e3,b3] ~@3 [f3,b3] ~@5 g3 ~",
  AC: "[b3,d4,g4] ~ f4 ~ d4 ~ [b3,d4,g4]@8 ~@2", // G
})).s("gm_piano").gain(0.46)

// bass · slap bass 1 · "bass guitar"
const bass = note("<A@2 B C D@8 E@8 D@7 F D@8 E@8 D@7 F ~>".pickRestart({
  A: "a2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~", B: "a2@3 ~ a2@3 ~ a2@3 ~ a2 ~ f#2@2", C: "~@2 g2@11 ~@3",
  D: "g#1@3 ~ g#1@3 ~ g#1@3 ~ g#1@3 ~", E: "g#1 ~ g#1 ~ g#1 ~ g#1 ~ g#1 ~ g#1 ~ g#1 ~ g#1 ~",
  F: "~@2 g1 ~@3 g1 ~@3 g1 ~@3 g1 ~",
})).s("gm_slap_bass_1").gain(0.41)

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

// drums · snare
const snare = s("sd").struct(`<
  A B C D E A B F G H B@2 H I G A B@2 J K L H L@2 M A B H M N H O B L B H J B@2 L B@3 H B P B M B H L K Q
>`.pickRestart({
  A: "x!3 ~ x ~ x ~", B: "x ~ x!3 ~ x!2", C: "x ~ x!5 ~", D: "x!2 ~@2 x ~@3 x ~@3 x ~@3", E: "~ x!3",
  F: "x!2 ~@2 x ~ x ~ x ~@3 x ~@3", G: "x ~ x ~ x!3 ~", H: "x!4", I: "x ~@3 x ~@3 x ~@3 x!2 ~@2",
  J: "x ~@3 x ~ x ~@2 x ~@2 x ~ x ~", K: "~ x ~@2 x ~@3 x ~@3 x ~@3", L: "x ~ x!3 ~ x ~", M: "x ~ x ~ x ~ x!2",
  N: "x ~@3 x ~@6 x ~@2 x ~", O: "~ x ~@2 x ~ x ~ x ~@3 x ~@3", P: "~ x ~@3 x ~@2 x ~@3 x ~@3", Q: "x ~@8 x ~@6",
})).gain(0.46)

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

// drums · hihat
const hihat = s("hh").struct("<[x!3 ~ x ~ x!2] [x!5 ~ x!2] [x!6 ~ x] [x!7 ~] [x!2 ~ x!5]!2 [~ x!6 ~] [x!2 ~ x!5] ~@45>")
  .gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@3 x ~@4] ~@3 [~@3 x ~ x!2 ~@9] ~@45>").gain(0.46)

// drums · open hat
const open_hat = s("oh").struct("<[~@3 x ~ x ~@2] [~@5 x ~@2] [~@3 x] [~@7 x] [~ x ~@2]!2 [x ~@6 x] [~ x ~@2] ~@45>")
  .gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@4 x ~@3 x ~@44>").gain(0.31)

stack(piano, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, crash)

More by Foreigner