Strudelify

Caroline

Status Quo

KeyE majorTempo157 bpm
0:00/0:00
// Caroline — Status Quo
// 157 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 148 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(157/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(`<
  ~@12 A@4 B@2 A@2 C B A@5 D A@2 B@2 A E A F A@2 B@2 A E A F G H I J B@2 G K E B L E A@2 B@2 A E A F A@2 B@2 A E A F G H
  I J B@2 G K E B L E A@4 B@2 A@2 C B A M A@6 B@2 A E A F G H I J B@2 G K E B L N O@3 P Q@2 P@2 R Q P@2 A@4 B@2 A@2 C B
  A@2 S@3 ~
>`.pickRestart({
  A: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~", B: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  C: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2", D: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1@2 d1 ~ e1 ~",
  E: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~", F: "e1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~",
  G: "d2@2 e2 ~ e2 ~ e2@2 d2@2 e2 ~ e2 ~ e2@2", H: "d2@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2",
  I: "d2@2 e2 ~ e2 ~ e2 ~ d2@2 e2 ~ e2 ~ e2@2", J: "d2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2@2",
  K: "d2@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~", L: "d2 ~ e2 ~ e2 ~ e2@2 d2 ~ e2 ~ e2 ~ e2@2",
  M: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ b0 ~ d1 ~", N: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~", O: "e2!7 d2", P: "e2!8",
  Q: "a2!8", R: "b2!8", S: "[e1@2 ~@2 e1 ~ e1 ~ e1@38 ~@2]/3",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · distortion guitar
const distortion_guitar = note(`<
  A@16 B C A@2 D C A@8 B@2 A D A E A@2 B@2 A D A E A@4 B@2 A@2 D B A E A@2 B@2 A D A E A@2 B@2 A D A E A@4 B@2 A@2 D B A
  E A@4 F@2 A@2 E F A@2 G@4 A@2 B@2 A D A E A@4 B@2 A@2 D B H@2 I J K L M@2 L@2 N M L K A@4 B C A@2 D C A O@4 ~
>`.pickRestart({
  A: "[e3,b3]!2 [e3,c#4] [e3,b3] [e3,d4] [e3,b3] [e3,c#4] [e3,b3]", B: "a2!8, e3 f#3 e3 f#3",
  C: "a2!6 [a2,f#3] [a2,e3], e3 f#3 e3 ~", D: "[b2,f#3]!2 [b2,g#3]!2 [b2,f#3]!2 [b2,g#3]!2", E: "[b2,f#3,b3]!8",
  F: "[a2,e3,a3]!8", G: "[e2,b2,e3]!8", H: "[e2,b2,d3] [e2,b2,e3]!3 [e2,b2,d3] [e2,b2,e3]!3",
  I: "~@2 [b3,e4]@2 ~@4 [b3,e4]@3 ~@5", J: "~@2 [b3,e4]@2 ~@4 [b3,e4] ~@7", K: "~@2 [b3,e4] ~@5 [b3,e4]@2 ~@6",
  L: "~ [b3,e4] ~@2 [b3,e4] ~@3", M: "~ [a3,e4] ~@2 [a3,e4] ~@3", N: "~ [b3,f#4] ~@2 [b3,f#4] ~@3",
  O: "[[e3,b3]@2 [e3,b3]@2 [e3,c#4]@2 [e3,b3]@2 [e3,d4]@2 [e3,b3]@2 [e3,c#4]@2 [e2,b2,e3,b3,e4]@49 ~]/4", // E5 C#m E5 E7 E5 C#m E5
})).s("gm_distortion_guitar").gain(0.45).pan(0.9)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@3 A B@8 C@8 D E@6 F G@2 H@2 G I G J G@2 H@2 G I G J K L M@2 N O M L P N Q R G@2 H@2 G I G J G@2 H@2 G I G J K L M@2
  N O M L P N Q R S@8 D T@3 U@3 V G@2 H@2 G I G J K L M@2 N O M L P N ~ W@8 X Y Z@8 AA@3 D AB@6 ~
>`.pickRestart({
  A: "~@7 [e3,g#3]", // E
  B: "[[e3,g#3]@2 ~ e3 ~ e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3, ~ a3 g#3 ~@29]/8", // E
  C: "[~ e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3@2]/8",
  D: "b3 ~ a3 ~ g#3 ~ f#3@2 g#3@3 ~ g#3@3 ~",
  E: "[g3@2 g3 ~ g3@2 e3@5 ~ e3 ~ e3@6 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3 ~ g#3 ~ e3 ~ a3 ~ g#3@4 e3@2 a3@2 e3@2 g#3@2 e3 ~ a3 ~ g#3@4 e3@2 a3@2 e3 ~ g#3@2 e3@2 a3 ~ g#3@2]/6",
  F: "~@2 e3 ~ a3 ~ g#3@4 ~@6", G: "~ [b3,e4] ~@2 [b3,e4] ~@3", H: "~ [a3,e4] ~@2 [a3,e4] ~@3",
  I: "~ [f#3,b3] ~@2 [f#3,b3] ~@3", J: "~ [f#3,b3]!7", K: "[e3,b3] e3 [e3,c#4] e3 [e3,b3] e3 [e3,c#4] e3",
  L: "[e3,b3] e3 [e3,c#4] [e3,b3] e3 [e3,b3] [e3,c#4] [e3,b3]", M: "[e3,b3] e3 [e3,c#4] [e3,b3]!2 e3 [e3,c#4] e3",
  N: "[a2,e3] a2 [a2,f#3] [a2,e3]!2 a2 [a2,f#3] [a2,e3]", O: "[a2,e3] a2 [a2,f#3] a2 [a2,e3] a2 [a2,f#3] [a2,e3]",
  P: "[b2,f#3] b2 [b2,g#3] [b2,f#3]!2 b2 [b2,g#3] b2", Q: "[e3,b3] e3 [e3,c#4] [e3,b3]!2 e3 [e3,c#4] [e3,b3]",
  R: "e3 [e3,b3] [b2,b3]!6", // E5 B
  S: "[[b2,e3]@2 [b2,e3]@2 e3!2 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 g#3@2 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 g#3@2 e3 a3@2, ~@2 b2 ~@29]/8", // E5
  T: "[g3@2 g3 ~ g3@2 e3@5 ~ e3 ~ e3@6 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 [e2,b2,g#3]@2]/3", // E
  U: "~ [e2,b2] [e2,c#3] ~ [e2,b2] ~ [e2,c#3] [e2,b2]", V: "~ [e2,b2] [e2,c#3] ~ [e2,b2] ~ [e2,c#3] ~",
  W: "[~@7 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g3@2 e3 a3 e3 g3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3]/8",
  X: "~ e3 a3 e3 g#3 e3 a3@2", Y: "b3 ~ a3 ~ g#3 ~ f#3@2 g#3 [g#3,a3]@2 ~ g#3 a3 g#3@2",
  Z: "[g3@2 g3 ~ g3@2 e3@5 ~ e3 ~ e3@6 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g3@4 e3@2 a3@2 e3@2 g3@2 e3@2 a3@2 g3@2]/8",
  AA: "[~ e3 a3 e3 g3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3 g#3@2 e3 a3 e3 g#3 e3 a3@2]/3",
  AB: "[g3@2 g3 ~ g3@2 e3@5 ~ e3 ~ e3@6 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 a3@2 e3@2 g#3@2 e3@2 a3@2 g#3@4 e3@2 d3@4 e3@39 ~]/6",
})).s("gm_overdriven_guitar").gain(0.45).pan(0.1)

// drums · kick
const kick = s("bd").struct("<~@12 A@23 B A@7 C A@19 D A@56 C@11 A@13 E F ~ F>".pickRestart({
  A: "x!2", B: "x!7 ~", C: "x!4", D: "x!3 ~", E: "x ~@2 x ~@4", F: "x",
})).gain(0.45)

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

// drums · low tom
const low_tom = s("lt").struct("<~@144 [~@7 x] ~ [~@15 x] ~>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@12 A@11 ~ B ~@3 C@7 ~ C@7 ~@13 C@7 ~ C@7 ~@25 C@11 ~@12 D C@10 E ~ A@11 ~@5
>`.pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x", C: "x!8", D: "~@15 x", E: "x!6 ~@2",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@83 [~@14 x!2] ~@60 [~@12 x!2 ~@2] ~ [~@15 x] ~>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@12 A@11 B C D@3 ~@7 E ~@7 E ~@19 E ~@7 E ~@35 E ~@11 D ~@10 F ~ A@11 B ~@4
>`.pickRestart({
  A: "~ x ~ x", B: "x!4 ~@4", C: "~ x!3", D: "x!4", E: "x!3 ~ x!3 ~", F: "~@3 x",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@83 [~@12 x!2 ~@2] ~@60 [~@9 x!3 ~@4] ~ [~@7 x] ~>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@12 A ~@23 A ~@7 B@12 ~@8 A ~@7 B@12 ~@11 C ~@12 B@11 ~@13 A ~@12 A ~ A>".pickRestart({
  A: "x", B: "x!4", C: "~@3 x",
})).gain(0.25)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@84 [~@3 x]!11 ~@53>").gain(0.05)

// drums · ride
const ride = s("rd").struct("<~@84 [x ~ x!3 ~@3]!12 ~@52>").gain(0.3)

stack(
  bass, distortion_guitar, overdriven_guitar, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  crash_soft, ride
)

More by Status Quo